master/fsm_master.c
changeset 908 386b908033be
parent 907 570ae1c64465
child 910 9fd31755f576
equal deleted inserted replaced
907:570ae1c64465 908:386b908033be
   258                     master->scan_busy = 0;
   258                     master->scan_busy = 0;
   259                     wake_up_interruptible(&master->scan_queue);
   259                     wake_up_interruptible(&master->scan_queue);
   260                     fsm->state = ec_fsm_master_state_error;
   260                     fsm->state = ec_fsm_master_state_error;
   261                     return;
   261                     return;
   262                 }
   262                 }
       
   263 
       
   264                 // do not force reconfiguration in operation mode to avoid
       
   265                 // unnecesssary process data interruptions
       
   266                 if (master->mode != EC_MASTER_MODE_OPERATION)
       
   267                     slave->force_config = 1;
   263 
   268 
   264                 list_add_tail(&slave->list, &master->slaves);
   269                 list_add_tail(&slave->list, &master->slaves);
   265             }
   270             }
   266 
   271 
   267             // broadcast clear all station addresses
   272             // broadcast clear all station addresses
   512     ec_slave_t *slave = fsm->slave;
   517     ec_slave_t *slave = fsm->slave;
   513 
   518 
   514     // Does the slave have to be configured?
   519     // Does the slave have to be configured?
   515     if (!slave->error_flag
   520     if (!slave->error_flag
   516             && (slave->current_state != slave->requested_state
   521             && (slave->current_state != slave->requested_state
   517                 || !slave->self_configured)) {
   522                 || slave->force_config)) {
   518         // Start slave configuration, if it is allowed.
   523         // Start slave configuration, if it is allowed.
   519         down(&master->config_sem);
   524         down(&master->config_sem);
   520         if (!master->allow_config) {
   525         if (!master->allow_config) {
   521             up(&master->config_sem);
   526             up(&master->config_sem);
   522         } else {
   527         } else {
   523             master->config_busy = 1;
   528             master->config_busy = 1;
   524             up(&master->config_sem);
   529             up(&master->config_sem);
   525 
   530 
   526             if (master->debug_level) {
   531             if (master->debug_level) {
   527                 char old_state[EC_STATE_STRING_SIZE];
   532                 char old_state[EC_STATE_STRING_SIZE],
       
   533                      new_state[EC_STATE_STRING_SIZE];
   528                 ec_state_string(slave->current_state, old_state);
   534                 ec_state_string(slave->current_state, old_state);
   529                 if (slave->current_state != slave->requested_state) {
   535                 ec_state_string(slave->requested_state, new_state);
   530                     char new_state[EC_STATE_STRING_SIZE];
   536                 EC_DBG("Changing state of slave %u from %s to %s%s.\n",
   531                     ec_state_string(slave->requested_state, new_state);
   537                         slave->ring_position, old_state, new_state,
   532                     EC_DBG("Changing state of slave %u (%s -> %s).\n",
   538                         slave->force_config ? " (forced)" : "");
   533                             slave->ring_position, old_state, new_state);
       
   534                 } else if (!slave->self_configured) {
       
   535                     EC_DBG("Reconfiguring slave %u (%s).\n",
       
   536                             slave->ring_position, old_state);
       
   537                 }
       
   538             }
   539             }
       
   540 
       
   541             // configuration will be done immediately; therefore reset the
       
   542             // force flag
       
   543             slave->force_config = 0;
   539 
   544 
   540             fsm->idle = 0;
   545             fsm->idle = 0;
   541             fsm->state = ec_fsm_master_state_configure_slave;
   546             fsm->state = ec_fsm_master_state_configure_slave;
   542             ec_fsm_slave_config_start(&fsm->fsm_slave_config, slave);
   547             ec_fsm_slave_config_start(&fsm->fsm_slave_config, slave);
   543             fsm->state(fsm); // execute immediately
   548             fsm->state(fsm); // execute immediately