equal
deleted
inserted
replaced
47 /*****************************************************************************/ |
47 /*****************************************************************************/ |
48 |
48 |
49 void ec_fsm_change_state_start(ec_fsm_change_t *); |
49 void ec_fsm_change_state_start(ec_fsm_change_t *); |
50 void ec_fsm_change_state_check(ec_fsm_change_t *); |
50 void ec_fsm_change_state_check(ec_fsm_change_t *); |
51 void ec_fsm_change_state_status(ec_fsm_change_t *); |
51 void ec_fsm_change_state_status(ec_fsm_change_t *); |
|
52 void ec_fsm_change_state_start_code(ec_fsm_change_t *); |
52 void ec_fsm_change_state_code(ec_fsm_change_t *); |
53 void ec_fsm_change_state_code(ec_fsm_change_t *); |
53 void ec_fsm_change_state_start_ack(ec_fsm_change_t *); |
|
54 void ec_fsm_change_state_ack(ec_fsm_change_t *); |
54 void ec_fsm_change_state_ack(ec_fsm_change_t *); |
55 void ec_fsm_change_state_check_ack(ec_fsm_change_t *); |
55 void ec_fsm_change_state_check_ack(ec_fsm_change_t *); |
56 void ec_fsm_change_state_end(ec_fsm_change_t *); |
56 void ec_fsm_change_state_end(ec_fsm_change_t *); |
57 void ec_fsm_change_state_error(ec_fsm_change_t *); |
57 void ec_fsm_change_state_error(ec_fsm_change_t *); |
58 |
58 |
109 ) |
109 ) |
110 { |
110 { |
111 fsm->mode = EC_FSM_CHANGE_MODE_ACK_ONLY; |
111 fsm->mode = EC_FSM_CHANGE_MODE_ACK_ONLY; |
112 fsm->slave = slave; |
112 fsm->slave = slave; |
113 fsm->requested_state = EC_SLAVE_STATE_UNKNOWN; |
113 fsm->requested_state = EC_SLAVE_STATE_UNKNOWN; |
114 fsm->state = ec_fsm_change_state_start_ack; |
114 fsm->state = ec_fsm_change_state_start_code; |
115 } |
115 } |
116 |
116 |
117 /*****************************************************************************/ |
117 /*****************************************************************************/ |
118 |
118 |
119 /** |
119 /** |
293 slave->error_flag = 1; |
293 slave->error_flag = 1; |
294 ec_state_string(fsm->requested_state, req_state, 0); |
294 ec_state_string(fsm->requested_state, req_state, 0); |
295 |
295 |
296 EC_SLAVE_ERR(slave, "Failed to set %s state, slave refused state" |
296 EC_SLAVE_ERR(slave, "Failed to set %s state, slave refused state" |
297 " change (%s).\n", req_state, cur_state); |
297 " change (%s).\n", req_state, cur_state); |
298 // fetch AL status error code |
298 |
299 ec_datagram_fprd(datagram, slave->station_address, 0x0134, 2); |
299 ec_fsm_change_state_start_code(fsm); |
300 ec_datagram_zero(datagram); |
|
301 fsm->retries = EC_FSM_RETRIES; |
|
302 fsm->state = ec_fsm_change_state_code; |
|
303 return; |
300 return; |
304 } |
301 } |
305 |
302 |
306 // still old state |
303 // still old state |
307 |
304 |
318 check_again: |
315 check_again: |
319 // no timeout yet. check again |
316 // no timeout yet. check again |
320 ec_datagram_fprd(datagram, slave->station_address, 0x0130, 2); |
317 ec_datagram_fprd(datagram, slave->station_address, 0x0130, 2); |
321 ec_datagram_zero(datagram); |
318 ec_datagram_zero(datagram); |
322 fsm->retries = EC_FSM_RETRIES; |
319 fsm->retries = EC_FSM_RETRIES; |
|
320 } |
|
321 |
|
322 /*****************************************************************************/ |
|
323 |
|
324 /** Enter reading AL status code. |
|
325 */ |
|
326 void ec_fsm_change_state_start_code( |
|
327 ec_fsm_change_t *fsm /**< finite state machine */ |
|
328 ) |
|
329 { |
|
330 ec_slave_t *slave = fsm->slave; |
|
331 ec_datagram_t *datagram = fsm->datagram; |
|
332 |
|
333 // fetch AL status error code |
|
334 ec_datagram_fprd(datagram, slave->station_address, 0x0134, 2); |
|
335 ec_datagram_zero(datagram); |
|
336 fsm->retries = EC_FSM_RETRIES; |
|
337 fsm->state = ec_fsm_change_state_code; |
323 } |
338 } |
324 |
339 |
325 /*****************************************************************************/ |
340 /*****************************************************************************/ |
326 |
341 |
327 /** |
342 /** |
422 EC_SLAVE_ERR(fsm->slave, "Unknown AL status code 0x%04X.\n", |
437 EC_SLAVE_ERR(fsm->slave, "Unknown AL status code 0x%04X.\n", |
423 code); |
438 code); |
424 } |
439 } |
425 |
440 |
426 // acknowledge "old" slave state |
441 // acknowledge "old" slave state |
427 ec_fsm_change_state_start_ack(fsm); // execute immediately |
442 ec_datagram_fpwr(datagram, fsm->slave->station_address, 0x0120, 2); |
428 } |
443 EC_WRITE_U16(datagram->data, fsm->slave->current_state); |
429 |
|
430 /*****************************************************************************/ |
|
431 |
|
432 /** |
|
433 Change state: START ACK. |
|
434 */ |
|
435 |
|
436 void ec_fsm_change_state_start_ack(ec_fsm_change_t *fsm |
|
437 /**< finite state machine */) |
|
438 { |
|
439 ec_slave_t *slave = fsm->slave; |
|
440 ec_datagram_t *datagram = fsm->datagram; |
|
441 |
|
442 ec_datagram_fpwr(datagram, slave->station_address, 0x0120, 2); |
|
443 EC_WRITE_U16(datagram->data, slave->current_state); |
|
444 fsm->retries = EC_FSM_RETRIES; |
444 fsm->retries = EC_FSM_RETRIES; |
445 fsm->state = ec_fsm_change_state_ack; |
445 fsm->state = ec_fsm_change_state_ack; |
446 } |
446 } |
447 |
447 |
448 /*****************************************************************************/ |
448 /*****************************************************************************/ |