master/fsm.c
changeset 456 dea14706efc2
parent 454 25cc4a3b9e0a
child 459 f0da52cf6b5b
equal deleted inserted replaced
455:204c435fddf9 456:dea14706efc2
    66 void ec_fsm_slavescan_base(ec_fsm_t *);
    66 void ec_fsm_slavescan_base(ec_fsm_t *);
    67 void ec_fsm_slavescan_datalink(ec_fsm_t *);
    67 void ec_fsm_slavescan_datalink(ec_fsm_t *);
    68 void ec_fsm_slavescan_eeprom_size(ec_fsm_t *);
    68 void ec_fsm_slavescan_eeprom_size(ec_fsm_t *);
    69 void ec_fsm_slavescan_eeprom_data(ec_fsm_t *);
    69 void ec_fsm_slavescan_eeprom_data(ec_fsm_t *);
    70 
    70 
       
    71 void ec_fsm_slaveconf_start(ec_fsm_t *);
    71 void ec_fsm_slaveconf_init(ec_fsm_t *);
    72 void ec_fsm_slaveconf_init(ec_fsm_t *);
    72 void ec_fsm_slaveconf_sync(ec_fsm_t *);
    73 void ec_fsm_slaveconf_sync(ec_fsm_t *);
    73 void ec_fsm_slaveconf_preop(ec_fsm_t *);
    74 void ec_fsm_slaveconf_preop(ec_fsm_t *);
    74 void ec_fsm_slaveconf_fmmu(ec_fsm_t *);
    75 void ec_fsm_slaveconf_fmmu(ec_fsm_t *);
    75 void ec_fsm_slaveconf_sdoconf(ec_fsm_t *);
    76 void ec_fsm_slaveconf_sdoconf(ec_fsm_t *);
   134 
   135 
   135 int ec_fsm_exec(ec_fsm_t *fsm /**< finite state machine */)
   136 int ec_fsm_exec(ec_fsm_t *fsm /**< finite state machine */)
   136 {
   137 {
   137     fsm->master_state(fsm);
   138     fsm->master_state(fsm);
   138 
   139 
       
   140     return ec_fsm_running(fsm);
       
   141 }
       
   142 
       
   143 /*****************************************************************************/
       
   144 
       
   145 /**
       
   146    \return false, if state machine has terminated
       
   147 */
       
   148 
       
   149 int ec_fsm_running(ec_fsm_t *fsm /**< finite state machine */)
       
   150 {
   139     return fsm->master_state != ec_fsm_master_end
   151     return fsm->master_state != ec_fsm_master_end
   140         && fsm->master_state != ec_fsm_master_error;
   152         && fsm->master_state != ec_fsm_master_error;
   141 }
   153 }
   142 
   154 
   143 /*****************************************************************************/
   155 /*****************************************************************************/
   301     list_for_each_entry(slave, &master->slaves, list) {
   313     list_for_each_entry(slave, &master->slaves, list) {
   302         if (slave->error_flag
   314         if (slave->error_flag
   303             || !slave->online
   315             || !slave->online
   304             || slave->requested_state == EC_SLAVE_STATE_UNKNOWN
   316             || slave->requested_state == EC_SLAVE_STATE_UNKNOWN
   305             || (slave->current_state == slave->requested_state
   317             || (slave->current_state == slave->requested_state
   306                 && (slave->configured
   318                 && slave->configured)) continue;
   307                     || slave->current_state == EC_SLAVE_STATE_INIT))) continue;
       
   308 
   319 
   309         if (master->debug_level) {
   320         if (master->debug_level) {
   310             ec_state_string(slave->current_state, old_state);
   321             ec_state_string(slave->current_state, old_state);
   311             if (!slave->configured
   322             if (slave->current_state != slave->requested_state) {
   312                 && slave->current_state != EC_SLAVE_STATE_INIT) {
   323                 ec_state_string(slave->requested_state, new_state);
   313                 EC_INFO("Reconfiguring slave %i (%s).\n",
   324                 EC_DBG("Changing state of slave %i (%s -> %s).\n",
   314                         slave->ring_position, old_state);
   325                        slave->ring_position, old_state, new_state);
   315             }
   326             }
   316             else if (slave->current_state != slave->requested_state) {
   327             else if (!slave->configured) {
   317                 ec_state_string(slave->requested_state, new_state);
   328                 EC_DBG("Reconfiguring slave %i (%s).\n",
   318                 EC_INFO("Changing state of slave %i (%s -> %s).\n",
   329                        slave->ring_position, old_state);
   319                         slave->ring_position, old_state, new_state);
       
   320             }
   330             }
   321         }
   331         }
   322 
   332 
       
   333         fsm->master_state = ec_fsm_master_configure_slave;
   323         fsm->slave = slave;
   334         fsm->slave = slave;
   324         fsm->slave_state = ec_fsm_slaveconf_init;
   335         fsm->slave_state = ec_fsm_slaveconf_start;
   325         ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
   336         fsm->slave_state(fsm); // execute immediately
   326         fsm->master_state = ec_fsm_master_configure_slave;
       
   327         fsm->master_state(fsm); // execute immediately
       
   328         return;
   337         return;
   329     }
   338     }
   330 
   339 
   331     // Check, if EoE processing has to be started
   340     // Check, if EoE processing has to be started
   332     ec_master_eoe_start(master);
   341     ec_master_eoe_start(master);
  1191 /******************************************************************************
  1200 /******************************************************************************
  1192  *  slave configuration state machine
  1201  *  slave configuration state machine
  1193  *****************************************************************************/
  1202  *****************************************************************************/
  1194 
  1203 
  1195 /**
  1204 /**
       
  1205    Slave configuration state: START.
       
  1206 */
       
  1207 
       
  1208 void ec_fsm_slaveconf_start(ec_fsm_t *fsm /**< finite state machine */)
       
  1209 {
       
  1210     if (fsm->master->debug_level) {
       
  1211         EC_DBG("Configuring slave %i...\n", fsm->slave->ring_position);
       
  1212     }
       
  1213 
       
  1214     ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
       
  1215     ec_fsm_change_exec(&fsm->fsm_change);
       
  1216     fsm->slave_state = ec_fsm_slaveconf_init;
       
  1217 }
       
  1218 
       
  1219 /*****************************************************************************/
       
  1220 
       
  1221 /**
  1196    Slave configuration state: INIT.
  1222    Slave configuration state: INIT.
  1197 */
  1223 */
  1198 
  1224 
  1199 void ec_fsm_slaveconf_init(ec_fsm_t *fsm /**< finite state machine */)
  1225 void ec_fsm_slaveconf_init(ec_fsm_t *fsm /**< finite state machine */)
  1200 {
  1226 {