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

Read AL status code before acknowledging spontaneous state change.

--HG--
branch : stable-1.5
parent 96044ddb
No related branches found
No related tags found
No related merge requests found
...@@ -49,8 +49,8 @@ ...@@ -49,8 +49,8 @@
void ec_fsm_change_state_start(ec_fsm_change_t *); void ec_fsm_change_state_start(ec_fsm_change_t *);
void ec_fsm_change_state_check(ec_fsm_change_t *); void ec_fsm_change_state_check(ec_fsm_change_t *);
void ec_fsm_change_state_status(ec_fsm_change_t *); void ec_fsm_change_state_status(ec_fsm_change_t *);
void ec_fsm_change_state_start_code(ec_fsm_change_t *);
void ec_fsm_change_state_code(ec_fsm_change_t *); void ec_fsm_change_state_code(ec_fsm_change_t *);
void ec_fsm_change_state_start_ack(ec_fsm_change_t *);
void ec_fsm_change_state_ack(ec_fsm_change_t *); void ec_fsm_change_state_ack(ec_fsm_change_t *);
void ec_fsm_change_state_check_ack(ec_fsm_change_t *); void ec_fsm_change_state_check_ack(ec_fsm_change_t *);
void ec_fsm_change_state_end(ec_fsm_change_t *); void ec_fsm_change_state_end(ec_fsm_change_t *);
...@@ -111,7 +111,7 @@ void ec_fsm_change_ack(ec_fsm_change_t *fsm, /**< finite state machine */ ...@@ -111,7 +111,7 @@ void ec_fsm_change_ack(ec_fsm_change_t *fsm, /**< finite state machine */
fsm->mode = EC_FSM_CHANGE_MODE_ACK_ONLY; fsm->mode = EC_FSM_CHANGE_MODE_ACK_ONLY;
fsm->slave = slave; fsm->slave = slave;
fsm->requested_state = EC_SLAVE_STATE_UNKNOWN; fsm->requested_state = EC_SLAVE_STATE_UNKNOWN;
fsm->state = ec_fsm_change_state_start_ack; fsm->state = ec_fsm_change_state_start_code;
} }
/*****************************************************************************/ /*****************************************************************************/
...@@ -295,11 +295,8 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm ...@@ -295,11 +295,8 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm
EC_SLAVE_ERR(slave, "Failed to set %s state, slave refused state" EC_SLAVE_ERR(slave, "Failed to set %s state, slave refused state"
" change (%s).\n", req_state, cur_state); " change (%s).\n", req_state, cur_state);
// fetch AL status error code
ec_datagram_fprd(datagram, slave->station_address, 0x0134, 2); ec_fsm_change_state_start_code(fsm);
ec_datagram_zero(datagram);
fsm->retries = EC_FSM_RETRIES;
fsm->state = ec_fsm_change_state_code;
return; return;
} }
...@@ -324,6 +321,24 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm ...@@ -324,6 +321,24 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm
/*****************************************************************************/ /*****************************************************************************/
/** Enter reading AL status code.
*/
void ec_fsm_change_state_start_code(
ec_fsm_change_t *fsm /**< finite state machine */
)
{
ec_slave_t *slave = fsm->slave;
ec_datagram_t *datagram = fsm->datagram;
// fetch AL status error code
ec_datagram_fprd(datagram, slave->station_address, 0x0134, 2);
ec_datagram_zero(datagram);
fsm->retries = EC_FSM_RETRIES;
fsm->state = ec_fsm_change_state_code;
}
/*****************************************************************************/
/** /**
Application layer status messages. Application layer status messages.
*/ */
...@@ -424,23 +439,8 @@ void ec_fsm_change_state_code(ec_fsm_change_t *fsm ...@@ -424,23 +439,8 @@ void ec_fsm_change_state_code(ec_fsm_change_t *fsm
} }
// acknowledge "old" slave state // acknowledge "old" slave state
ec_fsm_change_state_start_ack(fsm); // execute immediately ec_datagram_fpwr(datagram, fsm->slave->station_address, 0x0120, 2);
} EC_WRITE_U16(datagram->data, fsm->slave->current_state);
/*****************************************************************************/
/**
Change state: START ACK.
*/
void ec_fsm_change_state_start_ack(ec_fsm_change_t *fsm
/**< finite state machine */)
{
ec_slave_t *slave = fsm->slave;
ec_datagram_t *datagram = fsm->datagram;
ec_datagram_fpwr(datagram, slave->station_address, 0x0120, 2);
EC_WRITE_U16(datagram->data, slave->current_state);
fsm->retries = EC_FSM_RETRIES; fsm->retries = EC_FSM_RETRIES;
fsm->state = ec_fsm_change_state_ack; fsm->state = ec_fsm_change_state_ack;
} }
......
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