master/fsm_change.c
changeset 986 a486591ba86b
parent 815 002fe9ec778f
child 1225 4d5b739edcb5
child 1685 399ef727bf62
equal deleted inserted replaced
985:90bcaf9ce3d5 986:a486591ba86b
   178     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   178     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   179         return;
   179         return;
   180 
   180 
   181     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   181     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   182         fsm->state = ec_fsm_change_state_error;
   182         fsm->state = ec_fsm_change_state_error;
   183         EC_ERR("Failed to receive state datagram from slave %i"
   183         EC_ERR("Failed to receive state datagram from slave %u"
   184                 " (datagram state %i)!\n",
   184                 " (datagram state %u)!\n",
   185                fsm->slave->ring_position, datagram->state);
   185                fsm->slave->ring_position, datagram->state);
   186         return;
   186         return;
   187     }
   187     }
   188 
   188 
   189     if (fsm->take_time) {
   189     if (fsm->take_time) {
   194     if (datagram->working_counter == 0) {
   194     if (datagram->working_counter == 0) {
   195         if (datagram->jiffies_received - fsm->jiffies_start >= 3 * HZ) {
   195         if (datagram->jiffies_received - fsm->jiffies_start >= 3 * HZ) {
   196             char state_str[EC_STATE_STRING_SIZE];
   196             char state_str[EC_STATE_STRING_SIZE];
   197             ec_state_string(fsm->requested_state, state_str);
   197             ec_state_string(fsm->requested_state, state_str);
   198             fsm->state = ec_fsm_change_state_error;
   198             fsm->state = ec_fsm_change_state_error;
   199             EC_ERR("Failed to set state %s on slave %i: ",
   199             EC_ERR("Failed to set state %s on slave %u: ",
   200                     state_str, fsm->slave->ring_position);
   200                     state_str, fsm->slave->ring_position);
   201             ec_datagram_print_wc_error(datagram);
   201             ec_datagram_print_wc_error(datagram);
   202             return;
   202             return;
   203         }
   203         }
   204 
   204 
   211 
   211 
   212     if (unlikely(datagram->working_counter > 1)) {
   212     if (unlikely(datagram->working_counter > 1)) {
   213         char state_str[EC_STATE_STRING_SIZE];
   213         char state_str[EC_STATE_STRING_SIZE];
   214         ec_state_string(fsm->requested_state, state_str);
   214         ec_state_string(fsm->requested_state, state_str);
   215         fsm->state = ec_fsm_change_state_error;
   215         fsm->state = ec_fsm_change_state_error;
   216         EC_ERR("Failed to set state %s on slave %i: ",
   216         EC_ERR("Failed to set state %s on slave %u: ",
   217                 state_str, fsm->slave->ring_position);
   217                 state_str, fsm->slave->ring_position);
   218         ec_datagram_print_wc_error(datagram);
   218         ec_datagram_print_wc_error(datagram);
   219         return;
   219         return;
   220     }
   220     }
   221 
   221 
   243     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   243     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   244         return;
   244         return;
   245 
   245 
   246     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   246     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   247         fsm->state = ec_fsm_change_state_error;
   247         fsm->state = ec_fsm_change_state_error;
   248         EC_ERR("Failed to receive state checking datagram from slave %i"
   248         EC_ERR("Failed to receive state checking datagram from slave %u"
   249                 " (datagram state %i).\n",
   249                 " (datagram state %u).\n",
   250                slave->ring_position, datagram->state);
   250                slave->ring_position, datagram->state);
   251         return;
   251         return;
   252     }
   252     }
   253 
   253 
   254     if (datagram->working_counter != 1) {
   254     if (datagram->working_counter != 1) {
   255         char req_state[EC_STATE_STRING_SIZE];
   255         char req_state[EC_STATE_STRING_SIZE];
   256         ec_state_string(fsm->requested_state, req_state);
   256         ec_state_string(fsm->requested_state, req_state);
   257         fsm->state = ec_fsm_change_state_error;
   257         fsm->state = ec_fsm_change_state_error;
   258         EC_ERR("Failed to check state %s on slave %i: ",
   258         EC_ERR("Failed to check state %s on slave %u: ",
   259                req_state, slave->ring_position);
   259                req_state, slave->ring_position);
   260         ec_datagram_print_wc_error(datagram);
   260         ec_datagram_print_wc_error(datagram);
   261         return;
   261         return;
   262     }
   262     }
   263 
   263 
   283             // Slave spontaneously changed its state just before the new state
   283             // Slave spontaneously changed its state just before the new state
   284             // was written. Accept current state as old state and wait for
   284             // was written. Accept current state as old state and wait for
   285             // state change
   285             // state change
   286             fsm->spontaneous_change = 1;
   286             fsm->spontaneous_change = 1;
   287             fsm->old_state = slave->current_state;
   287             fsm->old_state = slave->current_state;
   288             EC_WARN("Slave %i changed to %s in the meantime.\n",
   288             EC_WARN("Slave %u changed to %s in the meantime.\n",
   289                     slave->ring_position, cur_state);
   289                     slave->ring_position, cur_state);
   290             goto check_again;
   290             goto check_again;
   291         }
   291         }
   292 
   292 
   293         // state change error
   293         // state change error
   294 
   294 
   295         slave->error_flag = 1;
   295         slave->error_flag = 1;
   296         ec_state_string(fsm->requested_state, req_state);
   296         ec_state_string(fsm->requested_state, req_state);
   297 
   297 
   298         EC_ERR("Failed to set %s state, slave %i refused state change (%s).\n",
   298         EC_ERR("Failed to set %s state, slave %u refused state change (%s).\n",
   299                req_state, slave->ring_position, cur_state);
   299                req_state, slave->ring_position, cur_state);
   300         // fetch AL status error code
   300         // fetch AL status error code
   301         ec_datagram_fprd(datagram, slave->station_address, 0x0134, 2);
   301         ec_datagram_fprd(datagram, slave->station_address, 0x0134, 2);
   302         fsm->retries = EC_FSM_RETRIES;
   302         fsm->retries = EC_FSM_RETRIES;
   303         fsm->state = ec_fsm_change_state_code;
   303         fsm->state = ec_fsm_change_state_code;
   309     if (datagram->jiffies_received - fsm->jiffies_start >= HZ) { // 1s
   309     if (datagram->jiffies_received - fsm->jiffies_start >= HZ) { // 1s
   310         // timeout while checking
   310         // timeout while checking
   311         char state_str[EC_STATE_STRING_SIZE];
   311         char state_str[EC_STATE_STRING_SIZE];
   312         ec_state_string(fsm->requested_state, state_str);
   312         ec_state_string(fsm->requested_state, state_str);
   313         fsm->state = ec_fsm_change_state_error;
   313         fsm->state = ec_fsm_change_state_error;
   314         EC_ERR("Timeout while setting state %s on slave %i.\n",
   314         EC_ERR("Timeout while setting state %s on slave %u.\n",
   315                 state_str, slave->ring_position);
   315                 state_str, slave->ring_position);
   316         return;
   316         return;
   317     }
   317     }
   318 
   318 
   319  check_again:
   319  check_again:
   378     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   378     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   379         return;
   379         return;
   380 
   380 
   381     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   381     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   382         fsm->state = ec_fsm_change_state_error;
   382         fsm->state = ec_fsm_change_state_error;
   383         EC_ERR("Failed to receive AL status code datagram from slave %i"
   383         EC_ERR("Failed to receive AL status code datagram from slave %u"
   384                 " (datagram state %i).\n",
   384                 " (datagram state %u).\n",
   385                fsm->slave->ring_position, datagram->state);
   385                fsm->slave->ring_position, datagram->state);
   386         return;
   386         return;
   387     }
   387     }
   388 
   388 
   389     if (datagram->working_counter != 1) {
   389     if (datagram->working_counter != 1) {
   437     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   437     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   438         return;
   438         return;
   439 
   439 
   440     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   440     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   441         fsm->state = ec_fsm_change_state_error;
   441         fsm->state = ec_fsm_change_state_error;
   442         EC_ERR("Failed to receive state ack datagram for slave %i"
   442         EC_ERR("Failed to receive state ack datagram for slave %u"
   443                 " (datagram state %i).\n",
   443                 " (datagram state %u).\n",
   444                slave->ring_position, datagram->state);
   444                slave->ring_position, datagram->state);
   445         return;
   445         return;
   446     }
   446     }
   447 
   447 
   448     if (datagram->working_counter != 1) {
   448     if (datagram->working_counter != 1) {
   449         fsm->state = ec_fsm_change_state_error;
   449         fsm->state = ec_fsm_change_state_error;
   450         EC_ERR("Reception of state ack datagram failed on slave %i: ",
   450         EC_ERR("Reception of state ack datagram failed on slave %u: ",
   451                 slave->ring_position);
   451                 slave->ring_position);
   452         ec_datagram_print_wc_error(datagram);
   452         ec_datagram_print_wc_error(datagram);
   453         return;
   453         return;
   454     }
   454     }
   455 
   455 
   476     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   476     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   477         return;
   477         return;
   478 
   478 
   479     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   479     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   480         fsm->state = ec_fsm_change_state_error;
   480         fsm->state = ec_fsm_change_state_error;
   481         EC_ERR("Failed to receive state ack check datagram from slave %i"
   481         EC_ERR("Failed to receive state ack check datagram from slave %u"
   482                 " (datagram state %i).\n",
   482                 " (datagram state %u).\n",
   483                slave->ring_position, datagram->state);
   483                slave->ring_position, datagram->state);
   484         return;
   484         return;
   485     }
   485     }
   486 
   486 
   487     if (datagram->working_counter != 1) {
   487     if (datagram->working_counter != 1) {
   488         fsm->state = ec_fsm_change_state_error;
   488         fsm->state = ec_fsm_change_state_error;
   489         EC_ERR("Reception of state ack check datagram failed on slave %i: ",
   489         EC_ERR("Reception of state ack check datagram failed on slave %u: ",
   490                 slave->ring_position);
   490                 slave->ring_position);
   491         ec_datagram_print_wc_error(datagram);
   491         ec_datagram_print_wc_error(datagram);
   492         return;
   492         return;
   493     }
   493     }
   494 
   494 
   506             fsm->state = ec_fsm_change_state_error;
   506             fsm->state = ec_fsm_change_state_error;
   507         }
   507         }
   508         else { // EC_FSM_CHANGE_MODE_ACK_ONLY
   508         else { // EC_FSM_CHANGE_MODE_ACK_ONLY
   509             fsm->state = ec_fsm_change_state_end;
   509             fsm->state = ec_fsm_change_state_end;
   510         }
   510         }
   511         EC_INFO("Acknowledged state %s on slave %i.\n",
   511         EC_INFO("Acknowledged state %s on slave %u.\n",
   512                 state_str, slave->ring_position);
   512                 state_str, slave->ring_position);
   513         return;
   513         return;
   514     }
   514     }
   515 
   515 
   516     if (datagram->jiffies_received - fsm->jiffies_start >= HZ) { // 1s
   516     if (datagram->jiffies_received - fsm->jiffies_start >= HZ) { // 1s
   517         // timeout while checking
   517         // timeout while checking
   518         char state_str[EC_STATE_STRING_SIZE];
   518         char state_str[EC_STATE_STRING_SIZE];
   519         ec_state_string(slave->current_state, state_str);
   519         ec_state_string(slave->current_state, state_str);
   520         fsm->state = ec_fsm_change_state_error;
   520         fsm->state = ec_fsm_change_state_error;
   521         EC_ERR("Timeout while acknowledging state %s on slave %i.\n",
   521         EC_ERR("Timeout while acknowledging state %s on slave %u.\n",
   522                state_str, slave->ring_position);
   522                state_str, slave->ring_position);
   523         return;
   523         return;
   524     }
   524     }
   525 
   525 
   526     // reread new AL status
   526     // reread new AL status