master/fsm.c
changeset 456 dea14706efc2
parent 454 25cc4a3b9e0a
child 459 f0da52cf6b5b
--- a/master/fsm.c	Fri Oct 27 12:43:20 2006 +0000
+++ b/master/fsm.c	Fri Oct 27 12:45:22 2006 +0000
@@ -68,6 +68,7 @@
 void ec_fsm_slavescan_eeprom_size(ec_fsm_t *);
 void ec_fsm_slavescan_eeprom_data(ec_fsm_t *);
 
+void ec_fsm_slaveconf_start(ec_fsm_t *);
 void ec_fsm_slaveconf_init(ec_fsm_t *);
 void ec_fsm_slaveconf_sync(ec_fsm_t *);
 void ec_fsm_slaveconf_preop(ec_fsm_t *);
@@ -136,6 +137,17 @@
 {
     fsm->master_state(fsm);
 
+    return ec_fsm_running(fsm);
+}
+
+/*****************************************************************************/
+
+/**
+   \return false, if state machine has terminated
+*/
+
+int ec_fsm_running(ec_fsm_t *fsm /**< finite state machine */)
+{
     return fsm->master_state != ec_fsm_master_end
         && fsm->master_state != ec_fsm_master_error;
 }
@@ -303,28 +315,25 @@
             || !slave->online
             || slave->requested_state == EC_SLAVE_STATE_UNKNOWN
             || (slave->current_state == slave->requested_state
-                && (slave->configured
-                    || slave->current_state == EC_SLAVE_STATE_INIT))) continue;
+                && slave->configured)) continue;
 
         if (master->debug_level) {
             ec_state_string(slave->current_state, old_state);
-            if (!slave->configured
-                && slave->current_state != EC_SLAVE_STATE_INIT) {
-                EC_INFO("Reconfiguring slave %i (%s).\n",
-                        slave->ring_position, old_state);
+            if (slave->current_state != slave->requested_state) {
+                ec_state_string(slave->requested_state, new_state);
+                EC_DBG("Changing state of slave %i (%s -> %s).\n",
+                       slave->ring_position, old_state, new_state);
             }
-            else if (slave->current_state != slave->requested_state) {
-                ec_state_string(slave->requested_state, new_state);
-                EC_INFO("Changing state of slave %i (%s -> %s).\n",
-                        slave->ring_position, old_state, new_state);
+            else if (!slave->configured) {
+                EC_DBG("Reconfiguring slave %i (%s).\n",
+                       slave->ring_position, old_state);
             }
         }
 
+        fsm->master_state = ec_fsm_master_configure_slave;
         fsm->slave = slave;
-        fsm->slave_state = ec_fsm_slaveconf_init;
-        ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
-        fsm->master_state = ec_fsm_master_configure_slave;
-        fsm->master_state(fsm); // execute immediately
+        fsm->slave_state = ec_fsm_slaveconf_start;
+        fsm->slave_state(fsm); // execute immediately
         return;
     }
 
@@ -1193,6 +1202,23 @@
  *****************************************************************************/
 
 /**
+   Slave configuration state: START.
+*/
+
+void ec_fsm_slaveconf_start(ec_fsm_t *fsm /**< finite state machine */)
+{
+    if (fsm->master->debug_level) {
+        EC_DBG("Configuring slave %i...\n", fsm->slave->ring_position);
+    }
+
+    ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
+    ec_fsm_change_exec(&fsm->fsm_change);
+    fsm->slave_state = ec_fsm_slaveconf_init;
+}
+
+/*****************************************************************************/
+
+/**
    Slave configuration state: INIT.
 */