master/fsm_change.c
changeset 713 ae41cadd25b6
parent 637 d5d04c868e0e
child 738 880c6153101f
equal deleted inserted replaced
712:14f899ac51f0 713:ae41cadd25b6
   188     if (fsm->take_time) {
   188     if (fsm->take_time) {
   189         fsm->take_time = 0;
   189         fsm->take_time = 0;
   190         fsm->jiffies_start = datagram->jiffies_sent;
   190         fsm->jiffies_start = datagram->jiffies_sent;
   191     }
   191     }
   192 
   192 
   193     if (datagram->working_counter != 1) {
   193     if (datagram->working_counter == 0) {
   194         if (datagram->jiffies_received - fsm->jiffies_start >= 3 * HZ) {
   194         if (datagram->jiffies_received - fsm->jiffies_start >= 3 * HZ) {
   195             char state_str[EC_STATE_STRING_SIZE];
   195             char state_str[EC_STATE_STRING_SIZE];
   196             ec_state_string(fsm->requested_state, state_str);
   196             ec_state_string(fsm->requested_state, state_str);
   197             fsm->state = ec_fsm_change_state_error;
   197             fsm->state = ec_fsm_change_state_error;
   198             EC_ERR("Failed to set state %s on slave %i: Slave did not"
   198             EC_ERR("Failed to set state %s on slave %i: ",
   199                    " respond.\n", state_str, fsm->slave->ring_position);
   199                     state_str, fsm->slave->ring_position);
       
   200             ec_datagram_print_wc_error(datagram);
   200             return;
   201             return;
   201         }
   202         }
   202 
   203 
   203         // repeat writing new state to slave
   204         // repeat writing new state to slave
   204         ec_datagram_npwr(datagram, slave->station_address, 0x0120, 2);
   205         ec_datagram_npwr(datagram, slave->station_address, 0x0120, 2);
   205         EC_WRITE_U16(datagram->data, fsm->requested_state);
   206         EC_WRITE_U16(datagram->data, fsm->requested_state);
   206         fsm->retries = EC_FSM_RETRIES;
   207         fsm->retries = EC_FSM_RETRIES;
   207         return;
   208         return;
   208     }
   209     }
   209 
   210 
       
   211     if (unlikely(datagram->working_counter > 1)) {
       
   212         char state_str[EC_STATE_STRING_SIZE];
       
   213         ec_state_string(fsm->requested_state, state_str);
       
   214         fsm->state = ec_fsm_change_state_error;
       
   215         EC_ERR("Failed to set state %s on slave %i: ",
       
   216                 state_str, fsm->slave->ring_position);
       
   217         ec_datagram_print_wc_error(datagram);
       
   218         return;
       
   219     }
       
   220 
   210     fsm->take_time = 1;
   221     fsm->take_time = 1;
   211 
   222 
   212     // read AL status from slave
   223     // read AL status from slave
   213     ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2);
   224     ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2);
   214     fsm->retries = EC_FSM_RETRIES;
   225     fsm->retries = EC_FSM_RETRIES;
   240 
   251 
   241     if (datagram->working_counter != 1) {
   252     if (datagram->working_counter != 1) {
   242         char req_state[EC_STATE_STRING_SIZE];
   253         char req_state[EC_STATE_STRING_SIZE];
   243         ec_state_string(fsm->requested_state, req_state);
   254         ec_state_string(fsm->requested_state, req_state);
   244         fsm->state = ec_fsm_change_state_error;
   255         fsm->state = ec_fsm_change_state_error;
   245         EC_ERR("Failed to check state %s on slave %i.\n",
   256         EC_ERR("Failed to check state %s on slave %i: ",
   246                req_state, slave->ring_position);
   257                req_state, slave->ring_position);
       
   258         ec_datagram_print_wc_error(datagram);
   247         return;
   259         return;
   248     }
   260     }
   249 
   261 
   250     if (fsm->take_time) {
   262     if (fsm->take_time) {
   251         fsm->take_time = 0;
   263         fsm->take_time = 0;
   370                fsm->slave->ring_position, datagram->state);
   382                fsm->slave->ring_position, datagram->state);
   371         return;
   383         return;
   372     }
   384     }
   373 
   385 
   374     if (datagram->working_counter != 1) {
   386     if (datagram->working_counter != 1) {
   375         EC_WARN("Reception of AL status code datagram failed.\n");
   387         EC_WARN("Reception of AL status code datagram failed: ");
       
   388         ec_datagram_print_wc_error(datagram);
   376     }
   389     }
   377     else {
   390     else {
   378         if ((code = EC_READ_U16(datagram->data))) {
   391         if ((code = EC_READ_U16(datagram->data))) {
   379             for (al_msg = al_status_messages; al_msg->code; al_msg++) {
   392             for (al_msg = al_status_messages; al_msg->code; al_msg++) {
   380                 if (al_msg->code != code) continue;
   393                 if (al_msg->code != code) continue;
   431         return;
   444         return;
   432     }
   445     }
   433 
   446 
   434     if (datagram->working_counter != 1) {
   447     if (datagram->working_counter != 1) {
   435         fsm->state = ec_fsm_change_state_error;
   448         fsm->state = ec_fsm_change_state_error;
   436         EC_ERR("Reception of state ack datagram failed - slave %i did not"
   449         EC_ERR("Reception of state ack datagram failed on slave %i: ",
   437                " respond.\n", slave->ring_position);
   450                 slave->ring_position);
       
   451         ec_datagram_print_wc_error(datagram);
   438         return;
   452         return;
   439     }
   453     }
   440 
   454 
   441     fsm->take_time = 1;
   455     fsm->take_time = 1;
   442 
   456 
   469         return;
   483         return;
   470     }
   484     }
   471 
   485 
   472     if (datagram->working_counter != 1) {
   486     if (datagram->working_counter != 1) {
   473         fsm->state = ec_fsm_change_state_error;
   487         fsm->state = ec_fsm_change_state_error;
   474         EC_ERR("Reception of state ack check datagram failed - slave %i did"
   488         EC_ERR("Reception of state ack check datagram failed on slave %i: ",
   475                " not respond.\n", slave->ring_position);
   489                 slave->ring_position);
       
   490         ec_datagram_print_wc_error(datagram);
   476         return;
   491         return;
   477     }
   492     }
   478 
   493 
   479     if (fsm->take_time) {
   494     if (fsm->take_time) {
   480         fsm->take_time = 0;
   495         fsm->take_time = 0;