master/fsm_change.c
changeset 2176 ad4f7514ba71
parent 1967 c41b4f4af645
child 2408 b31f1d261ab8
child 2409 adb7171e83b1
equal deleted inserted replaced
2174:cedacf485d81 2176:ad4f7514ba71
    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 /*****************************************************************************/