master/fsm.c
changeset 391 7d67195702dd
parent 390 685c267d80d8
child 395 8b1194e51cf2
equal deleted inserted replaced
390:685c267d80d8 391:7d67195702dd
  2140 
  2140 
  2141 void ec_fsm_coe_down_response(ec_fsm_t *fsm /**< finite state machine */)
  2141 void ec_fsm_coe_down_response(ec_fsm_t *fsm /**< finite state machine */)
  2142 {
  2142 {
  2143     ec_datagram_t *datagram = &fsm->datagram;
  2143     ec_datagram_t *datagram = &fsm->datagram;
  2144     ec_slave_t *slave = fsm->slave;
  2144     ec_slave_t *slave = fsm->slave;
  2145     uint8_t *data, mbox_type;
  2145     uint8_t *data, mbox_prot;
  2146     size_t rec_size;
  2146     size_t rec_size;
  2147     ec_sdo_data_t *sdodata = fsm->sdodata;
  2147     ec_sdo_data_t *sdodata = fsm->sdodata;
  2148 
  2148 
  2149     if (datagram->state != EC_DATAGRAM_RECEIVED
  2149     if (datagram->state != EC_DATAGRAM_RECEIVED
  2150         || datagram->working_counter != 1) {
  2150         || datagram->working_counter != 1) {
  2152         EC_ERR("Reception of CoE download response failed.\n");
  2152         EC_ERR("Reception of CoE download response failed.\n");
  2153         return;
  2153         return;
  2154     }
  2154     }
  2155 
  2155 
  2156     if (!(data = ec_slave_mbox_fetch(slave, datagram,
  2156     if (!(data = ec_slave_mbox_fetch(slave, datagram,
  2157 				     &mbox_type, &rec_size))) {
  2157 				     &mbox_prot, &rec_size))) {
  2158         fsm->coe_state = ec_fsm_error;
  2158         fsm->coe_state = ec_fsm_error;
  2159         return;
  2159         return;
  2160     }
  2160     }
  2161 
  2161 
  2162     if (mbox_type != 0x03) {
  2162     if (mbox_prot != 0x03) { // CoE
  2163         EC_WARN("Received mailbox protocol 0x%02X as a response."
  2163         EC_WARN("Received mailbox protocol 0x%02X as response.\n", mbox_prot);
  2164 	      " Trying again.\n", mbox_type);
  2164         fsm->coe_state = ec_fsm_error;
  2165         fsm->coe_start = get_cycles();
       
  2166         ec_slave_mbox_prepare_check(slave, datagram); // can not fail.
       
  2167 	ec_master_queue_datagram(fsm->master, datagram);
       
  2168 	fsm->coe_state = ec_fsm_coe_down_check;
       
  2169 	return;
  2165 	return;
  2170     }
  2166     }
  2171 
  2167 
  2172     if (rec_size < 6) {
  2168     if (rec_size < 6) {
  2173         fsm->coe_state = ec_fsm_error;
  2169         fsm->coe_state = ec_fsm_error;