# HG changeset patch # User Florian Pose # Date 1190222265 0 # Node ID 880c6153101f32f4051f9742f204d6855a5503ab # Parent 5a770085161c2d484ca105b461d8ac53bd738445 Improved handling for spontaneous AL state changes. diff -r 5a770085161c -r 880c6153101f NEWS --- a/NEWS Wed Sep 19 11:52:58 2007 +0000 +++ b/NEWS Wed Sep 19 17:17:45 2007 +0000 @@ -6,6 +6,7 @@ Changes in version 1.3.2: +* Improved handling for spontaneous AL state changes. * Master takes mailbox sync manager configurations from EEPROM words 0x0018-0x001b, if no sync manager configurations are provided. * Calculate checksum when writing EEPROM or alias address. diff -r 5a770085161c -r 880c6153101f master/fsm_change.c --- a/master/fsm_change.c Wed Sep 19 11:52:58 2007 +0000 +++ b/master/fsm_change.c Wed Sep 19 17:17:45 2007 +0000 @@ -66,6 +66,7 @@ { fsm->state = NULL; fsm->datagram = datagram; + fsm->spontaneous_change = 0; } /*****************************************************************************/ @@ -223,6 +224,7 @@ // read AL status from slave ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2); fsm->retries = EC_FSM_RETRIES; + fsm->spontaneous_change = 0; fsm->state = ec_fsm_change_state_status; } @@ -281,10 +283,11 @@ // Slave spontaneously changed its state just before the new state // was written. Accept current state as old state and wait for // state change + fsm->spontaneous_change = 1; fsm->old_state = slave->current_state; EC_WARN("Slave %i changed to %s in the meantime.\n", slave->ring_position, cur_state); - goto again; + goto check_again; } // state change error @@ -309,11 +312,11 @@ ec_state_string(fsm->requested_state, state_str); fsm->state = ec_fsm_change_state_error; EC_ERR("Timeout while setting state %s on slave %i.\n", - state_str, slave->ring_position); - return; - } - - again: + state_str, slave->ring_position); + return; + } + + check_again: // no timeout yet. check again ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2); fsm->retries = EC_FSM_RETRIES; diff -r 5a770085161c -r 880c6153101f master/fsm_change.h --- a/master/fsm_change.h Wed Sep 19 11:52:58 2007 +0000 +++ b/master/fsm_change.h Wed Sep 19 17:17:45 2007 +0000 @@ -78,6 +78,7 @@ ec_slave_state_t old_state; /**< prior slave state */ unsigned long jiffies_start; /**< change timer */ uint8_t take_time; /**< take sending timestamp */ + uint8_t spontaneous_change; /**< spontaneous state change detected */ }; /*****************************************************************************/ diff -r 5a770085161c -r 880c6153101f master/fsm_slave.c --- a/master/fsm_slave.c Wed Sep 19 11:52:58 2007 +0000 +++ b/master/fsm_slave.c Wed Sep 19 17:17:45 2007 +0000 @@ -595,7 +595,8 @@ if (ec_fsm_change_exec(&fsm->fsm_change)) return; if (!ec_fsm_change_success(&fsm->fsm_change)) { - slave->error_flag = 1; + if (!fsm->fsm_change.spontaneous_change) + slave->error_flag = 1; fsm->state = ec_fsm_slave_state_error; return; } @@ -799,7 +800,8 @@ if (ec_fsm_change_exec(&fsm->fsm_change)) return; if (!ec_fsm_change_success(&fsm->fsm_change)) { - slave->error_flag = 1; + if (!fsm->fsm_change.spontaneous_change) + slave->error_flag = 1; fsm->state = ec_fsm_slave_state_error; return; } @@ -1077,7 +1079,8 @@ if (ec_fsm_change_exec(&fsm->fsm_change)) return; if (!ec_fsm_change_success(&fsm->fsm_change)) { - fsm->slave->error_flag = 1; + if (!fsm->fsm_change.spontaneous_change) + fsm->slave->error_flag = 1; fsm->state = ec_fsm_slave_state_error; return; } @@ -1117,7 +1120,8 @@ if (ec_fsm_change_exec(&fsm->fsm_change)) return; if (!ec_fsm_change_success(&fsm->fsm_change)) { - slave->error_flag = 1; + if (!fsm->fsm_change.spontaneous_change) + slave->error_flag = 1; fsm->state = ec_fsm_slave_state_error; return; }