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 { |