Skip to content
Snippets Groups Projects
Commit ef514219 authored by Florian Pose's avatar Florian Pose
Browse files

Fixed state change FSM again.

parent 7d6bdb63
No related branches found
No related tags found
No related merge requests found
...@@ -225,9 +225,11 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm ...@@ -225,9 +225,11 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm
if (datagram->state != EC_DATAGRAM_RECEIVED if (datagram->state != EC_DATAGRAM_RECEIVED
|| datagram->working_counter != 1) { || datagram->working_counter != 1) {
char req_state[EC_STATE_STRING_SIZE];
ec_state_string(fsm->requested_state, req_state);
fsm->state = ec_fsm_change_state_error; fsm->state = ec_fsm_change_state_error;
EC_ERR("Failed to check state 0x%02X on slave %i.\n", EC_ERR("Failed to check state %s on slave %i.\n",
fsm->requested_state, slave->ring_position); req_state, slave->ring_position);
return; return;
} }
...@@ -247,26 +249,29 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm ...@@ -247,26 +249,29 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm
if (slave->current_state != fsm->old_state) { // state changed if (slave->current_state != fsm->old_state) { // state changed
char req_state[EC_STATE_STRING_SIZE], cur_state[EC_STATE_STRING_SIZE]; char req_state[EC_STATE_STRING_SIZE], cur_state[EC_STATE_STRING_SIZE];
slave->error_flag = 1;
ec_state_string(fsm->requested_state, req_state);
ec_state_string(slave->current_state, cur_state); ec_state_string(slave->current_state, cur_state);
if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { if ((slave->current_state & 0x0F) != (fsm->old_state & 0x0F)) {
// state change error // Slave spontaneously changed its state just before the new state
EC_ERR("Failed to set %s state," // was written. Accept current state as old state and wait for
" slave %i refused state change (%s).\n", // state change
req_state, slave->ring_position, cur_state); fsm->old_state = slave->current_state;
// fetch AL status error code EC_WARN("Slave %i changed to %s in the meantime.\n",
ec_datagram_nprd(datagram, slave->station_address, 0x0134, 2); slave->ring_position, cur_state);
ec_master_queue_datagram(fsm->slave->master, datagram); goto again;
fsm->state = ec_fsm_change_state_code;
return;
} }
// state change to unrequested state // state change error
EC_ERR("Slave %i changed to unrequested state %s!\n",
slave->ring_position, cur_state); slave->error_flag = 1;
fsm->state = ec_fsm_change_state_error; ec_state_string(fsm->requested_state, req_state);
EC_ERR("Failed to set %s state, slave %i refused state change (%s).\n",
req_state, slave->ring_position, cur_state);
// fetch AL status error code
ec_datagram_nprd(datagram, slave->station_address, 0x0134, 2);
ec_master_queue_datagram(fsm->slave->master, datagram);
fsm->state = ec_fsm_change_state_code;
return; return;
} }
...@@ -282,7 +287,8 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm ...@@ -282,7 +287,8 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm
return; return;
} }
// check again again:
// no timeout yet. check again
ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2); ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2);
ec_master_queue_datagram(fsm->slave->master, datagram); ec_master_queue_datagram(fsm->slave->master, datagram);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment