master/fsm_master.c
changeset 637 d5d04c868e0e
parent 612 aede068f9a74
child 642 3ed80c8ed616
--- a/master/fsm_master.c	Thu Mar 08 08:10:32 2007 +0000
+++ b/master/fsm_master.c	Thu Mar 08 13:02:42 2007 +0000
@@ -135,19 +135,8 @@
         && fsm->state != ec_fsm_master_state_error;
 }
 
-/*****************************************************************************/
-
-/**
-   \return true, if the master state machine terminated gracefully
-*/
-
-int ec_fsm_master_success(ec_fsm_master_t *fsm /**< master state machine */)
-{
-    return fsm->state == ec_fsm_master_state_end;
-}
-
 /******************************************************************************
- *  operation/idle state machine
+ *  master state machine
  *****************************************************************************/
 
 /**
@@ -158,7 +147,6 @@
 void ec_fsm_master_state_start(ec_fsm_master_t *fsm)
 {
     ec_datagram_brd(fsm->datagram, 0x0130, 2);
-    ec_master_queue_datagram(fsm->master, fsm->datagram);
     fsm->state = ec_fsm_master_state_broadcast;
 }
 
@@ -176,11 +164,8 @@
     ec_slave_t *slave;
     ec_master_t *master = fsm->master;
 
-    if (datagram->state == EC_DATAGRAM_TIMED_OUT) {
-        // always retry
-        ec_master_queue_datagram(fsm->master, fsm->datagram);
-        return;
-    }
+    if (datagram->state == EC_DATAGRAM_TIMED_OUT)
+        return; // always retry
 
     if (datagram->state != EC_DATAGRAM_RECEIVED) { // EC_DATAGRAM_ERROR
         // link is down
@@ -260,16 +245,15 @@
 
         // begin scanning of slaves
         fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
+        fsm->state = ec_fsm_master_state_scan_slaves;
         ec_fsm_slave_start_scan(&fsm->fsm_slave, fsm->slave);
         ec_fsm_slave_exec(&fsm->fsm_slave); // execute immediately
-        fsm->state = ec_fsm_master_state_scan_slaves;
         return;
     }
 
     // fetch state from each slave
     fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
     ec_datagram_nprd(fsm->datagram, fsm->slave->station_address, 0x0130, 2);
-    ec_master_queue_datagram(master, fsm->datagram);
     fsm->retries = EC_FSM_RETRIES;
     fsm->state = ec_fsm_master_state_read_states;
 }
@@ -365,9 +349,9 @@
         }
 
         fsm->slave = slave;
+        fsm->state = ec_fsm_master_state_configure_slave;
         ec_fsm_slave_start_conf(&fsm->fsm_slave, slave);
         ec_fsm_slave_exec(&fsm->fsm_slave); // execute immediately
-        fsm->state = ec_fsm_master_state_configure_slave;
         return;
     }
 
@@ -391,8 +375,8 @@
             else {
                 // start uploading SDO
                 fsm->slave = slave;
+                fsm->sdo_request = master->sdo_request;
                 fsm->state = ec_fsm_master_state_sdo_request;
-                fsm->sdo_request = master->sdo_request;
                 ec_fsm_coe_upload(&fsm->fsm_coe, slave, fsm->sdo_request);
                 ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
                 return;
@@ -446,10 +430,9 @@
     // is there another slave to query?
     if (slave->list.next != &master->slaves) {
         // process next slave
-        fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
+        fsm->slave = list_entry(slave->list.next, ec_slave_t, list);
         ec_datagram_nprd(fsm->datagram, fsm->slave->station_address,
                          0x0130, 2);
-        ec_master_queue_datagram(master, fsm->datagram);
         fsm->retries = EC_FSM_RETRIES;
         fsm->state = ec_fsm_master_state_read_states;
         return;
@@ -488,10 +471,8 @@
     ec_slave_t *slave = fsm->slave;
     ec_datagram_t *datagram = fsm->datagram;
 
-    if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) {
-        ec_master_queue_datagram(fsm->master, fsm->datagram);
-        return;
-    }
+    if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
+        return;
 
     if (datagram->state != EC_DATAGRAM_RECEIVED) {
         EC_ERR("Failed to receive AL state datagram for slave %i"
@@ -513,9 +494,9 @@
 
     // check, if new slave state has to be acknowledged
     if (slave->current_state & EC_SLAVE_STATE_ACK_ERR && !slave->error_flag) {
+        fsm->state = ec_fsm_master_state_acknowledge;
         ec_fsm_change_ack(&fsm->fsm_change, slave);
         ec_fsm_change_exec(&fsm->fsm_change);
-        fsm->state = ec_fsm_master_state_acknowledge;
         return;
     }
 
@@ -592,8 +573,7 @@
 
     while (fsm->slave->online_state == EC_SLAVE_ONLINE) {
         if (fsm->slave->list.next == &fsm->master->slaves) { // last slave?
-            fsm->state = ec_fsm_master_state_start;
-            fsm->state(fsm); // execute immediately
+            fsm->state = ec_fsm_master_state_end;
             return;
         }
         // check next slave
@@ -606,7 +586,6 @@
     // write station address
     ec_datagram_apwr(datagram, fsm->slave->ring_position, 0x0010, 2);
     EC_WRITE_U16(datagram->data, fsm->slave->station_address);
-    ec_master_queue_datagram(fsm->master, datagram);
     fsm->retries = EC_FSM_RETRIES;
     fsm->state = ec_fsm_master_state_rewrite_addresses;
 }
@@ -670,10 +649,8 @@
     ec_slave_t *slave = fsm->slave;
     ec_datagram_t *datagram = fsm->datagram;
 
-    if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) {
-        ec_master_queue_datagram(fsm->master, fsm->datagram);
-        return;
-    }
+    if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
+        return;
 
     if (datagram->state != EC_DATAGRAM_RECEIVED) {
         EC_ERR("Failed to receive address datagram for slave %i"
@@ -691,8 +668,7 @@
     }
 
     if (fsm->slave->list.next == &fsm->master->slaves) { // last slave?
-        fsm->state = ec_fsm_master_state_start;
-        fsm->state(fsm); // execute immediately
+        fsm->state = ec_fsm_master_state_end;
         return;
     }
 
@@ -712,14 +688,14 @@
 void ec_fsm_master_state_scan_slaves(ec_fsm_master_t *fsm /**< master state machine */)
 {
     ec_master_t *master = fsm->master;
-    ec_slave_t *slave;
+    ec_slave_t *slave = fsm->slave;
 
     if (ec_fsm_slave_exec(&fsm->fsm_slave)) // execute slave state machine
         return;
 
     // another slave to fetch?
-    if (fsm->slave->list.next != &master->slaves) {
-        fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
+    if (slave->list.next != &master->slaves) {
+        fsm->slave = list_entry(slave->list.next, ec_slave_t, list);
         ec_fsm_slave_start_scan(&fsm->fsm_slave, fsm->slave);
         ec_fsm_slave_exec(&fsm->fsm_slave); // execute immediately
         return;
@@ -803,9 +779,7 @@
     if (ec_fsm_master_action_process_eeprom(fsm))
         return; // processing another request
 
-    // restart master state machine.
-    fsm->state = ec_fsm_master_state_start;
-    fsm->state(fsm); // execute immediately
+    fsm->state = ec_fsm_master_state_end;
 }
 
 /*****************************************************************************/
@@ -835,9 +809,7 @@
                sdo_count, entry_count, slave->ring_position);
     }
 
-    // restart master state machine.
-    fsm->state = ec_fsm_master_state_start;
-    fsm->state(fsm); // execute immediately
+    fsm->state = ec_fsm_master_state_end;
 }
 
 /*****************************************************************************/
@@ -865,9 +837,7 @@
     request->return_code = 1;
     master->sdo_seq_master++;
 
-    // restart master state machine.
-    fsm->state = ec_fsm_master_state_start;
-    fsm->state(fsm); // execute immediately
+    fsm->state = ec_fsm_master_state_end;
 }
 
 /*****************************************************************************/