diff --git a/site_ansto/motor_dmc2280.c b/site_ansto/motor_dmc2280.c index a14ca04b..47790008 100644 --- a/site_ansto/motor_dmc2280.c +++ b/site_ansto/motor_dmc2280.c @@ -34,6 +34,8 @@ #define UNITSLEN 256 #define TEXTPARLEN 1024 #define CMDLEN 1024 +#define STATE_TRACE (100) + /** \brief Used to ensure that the getDMCSetting function is called * with valid values. * \see getDMCSetting @@ -195,6 +197,11 @@ struct __MoDriv { #endif double* positions; int variables; +#if defined(STATE_TRACE) && (STATE_TRACE > 0) + int state_trace_idx; + char state_trace_text[STATE_TRACE][CMDLEN]; + struct timeval state_trace_time[STATE_TRACE]; +#endif }; int DMC2280MotionControl = 1; /* defaults to enabled */ @@ -1359,6 +1366,26 @@ static int rspPoll(pDMC2280Driv self, const char* text) { return iReply; } +static void state_trace_prn(pDMC2280Driv self) { +#if defined(STATE_TRACE) && (STATE_TRACE > 0) + int idx = self->state_trace_idx; + SICSLogWrite("state_trace_prn trace listing start", eStatus); + do { + char* line; + struct timeval *tp; + tp = &self->state_trace_time[self->state_trace_idx]; + line = &self->state_trace_text[self->state_trace_idx++][0]; + if (self->state_trace_idx >= STATE_TRACE) + self->state_trace_idx = 0; + if (*line) + SICSLogWriteTime(line, eStatus, tp); + } while (idx != self->state_trace_idx); + SICSLogWrite("state_trace_prn trace listing end", eStatus); +#else + SICSLogWrite("state_trace_prn not implemented", eStatus); +#endif +} + /* State Functions */ static void DMCState_Unknown(pDMC2280Driv self, pEvtEvent event); @@ -1439,8 +1466,17 @@ static char* event_name(pEvtEvent event, char* text, int length) { } static void report_event(pDMC2280Driv self, pEvtEvent event) { +#if defined(STATE_TRACE) && (STATE_TRACE > 0) + if (true) { + char* line; + gettimeofday(&self->state_trace_time[self->state_trace_idx], NULL); + line = &self->state_trace_text[self->state_trace_idx++][0]; + if (self->state_trace_idx >= STATE_TRACE) + self->state_trace_idx = 0; +#else if (self->debug || self->trace) { char line[CMDLEN]; +#endif char text[CMDLEN]; snprintf(line, CMDLEN, "Motor=%s, State=%s(%d), event=%s", self->name, @@ -1455,8 +1491,17 @@ static void report_event(pDMC2280Driv self, pEvtEvent event) { } static void change_state(pDMC2280Driv self, StateFunc func) { +#if defined(STATE_TRACE) && (STATE_TRACE > 0) + if (true) { + char* line; + gettimeofday(&self->state_trace_time[self->state_trace_idx], NULL); + line = &self->state_trace_text[self->state_trace_idx++][0]; + if (self->state_trace_idx >= STATE_TRACE) + self->state_trace_idx = 0; +#else if (self->debug || self->trace) { char line[CMDLEN]; +#endif snprintf(line, CMDLEN, "Motor=%s, OldState=%s(%d), NewState=%s", self->name, state_name(self->myState), @@ -1476,7 +1521,15 @@ static void change_state(pDMC2280Driv self, StateFunc func) { } static void unhandled_event(pDMC2280Driv self, pEvtEvent event) { +#if defined(STATE_TRACE) && (STATE_TRACE > 0) + char* line; + gettimeofday(&self->state_trace_time[self->state_trace_idx], NULL); + line = &self->state_trace_text[self->state_trace_idx++][0]; + if (self->state_trace_idx >= STATE_TRACE) + self->state_trace_idx = 0; +#else char line[CMDLEN]; +#endif char text[CMDLEN]; snprintf(line, CMDLEN, "Motor=%s, State=%s(%d), unhandled event=%s", self->name, @@ -1488,7 +1541,10 @@ static void unhandled_event(pDMC2280Driv self, pEvtEvent event) { static void handle_event(pDMC2280Driv self, pEvtEvent event) { StateFunc oldState; +#if defined(STATE_TRACE) && (STATE_TRACE > 0) +#else if (self->debug || self->trace) +#endif report_event(self, event); oldState = self->myState; self->myState(self, event); @@ -1776,7 +1832,7 @@ static void DMCState_MotorStart(pDMC2280Driv self, pEvtEvent event) { change_state(self, DMCState_MotorStart); return; } - else if (self->run_flag > 0) { + else if (self->run_flag < 0) { self->run_flag = 0; change_state(self, DMCState_MotorHalt); return; @@ -1874,7 +1930,7 @@ static void DMCState_MotorOn(pDMC2280Driv self, pEvtEvent event) { change_state(self, DMCState_MotorStart); return; } - else if (self->run_flag > 0) { + else if (self->run_flag < 0) { self->run_flag = 0; change_state(self, DMCState_MotorHalt); return; @@ -2228,7 +2284,9 @@ static void DMCState_Moving(pDMC2280Driv self, pEvtEvent event) { case CMD_HALT: /* handle halt command, send message */ self->run_flag = -1; - change_state(self, DMCState_MotorHalt); + if (self->waitResponse == false) { + change_state(self, DMCState_MotorHalt); + } return; } break; @@ -2445,6 +2503,7 @@ static void DMCState_MotorStop(pDMC2280Driv self, pEvtEvent event) { static void DMCState_Error(pDMC2280Driv self, pEvtEvent event) { switch (event->event_type) { case eStateEvent: + state_trace_prn(self); return; case eTimerEvent: case eMessageEvent: @@ -2739,6 +2798,7 @@ static int DMC2280Halt(void *pData){ self = (pDMC2280Driv)pData; assert(self != NULL); + state_trace_prn(self); state_cmd_execute(self, CMD_HALT); return 1; }