master/fsm_master.c
changeset 858 69122084d066
parent 853 726326d0aef4
child 859 233e32f428e1
--- a/master/fsm_master.c	Tue Mar 04 09:20:14 2008 +0000
+++ b/master/fsm_master.c	Tue Mar 04 09:57:36 2008 +0000
@@ -41,6 +41,7 @@
 #include "globals.h"
 #include "master.h"
 #include "mailbox.h"
+#include "slave_config.h"
 #ifdef EC_EOE
 #include "ethernet.h"
 #endif
@@ -376,9 +377,39 @@
 {
     ec_master_t *master = fsm->master;
     ec_master_sdo_request_t *request;
+    ec_sdo_request_t *req;
     ec_slave_t *slave;
 
-    // search the first request to be processed
+    // search for internal requests to be processed
+    list_for_each_entry(slave, &master->slaves, list) {
+        if (!slave->config)
+            continue;
+        list_for_each_entry(req, &slave->config->sdo_requests, list) {
+            if (req->state == EC_REQUEST_QUEUED) {
+                req->state = EC_REQUEST_IN_PROGRESS;
+
+                if (slave->current_state == EC_SLAVE_STATE_INIT ||
+                        slave->error_flag) {
+                    req->state = EC_REQUEST_FAILURE;
+                    continue;
+                }
+
+                if (master->debug_level)
+                    EC_DBG("Processing Sdo request for slave %u...\n",
+                            slave->ring_position);
+
+                fsm->idle = 0;
+                fsm->sdo_request = req;
+                fsm->slave = slave;
+                fsm->state = ec_fsm_master_state_sdo_request;
+                ec_fsm_coe_upload(&fsm->fsm_coe, slave, req);
+                ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
+                return 1;
+            }
+        }
+    }
+    
+    // search the first external request to be processed
     while (1) {
         down(&master->sdo_sem);
         if (list_empty(&master->slave_sdo_requests)) {
@@ -410,7 +441,8 @@
 
         // Start uploading Sdo
         fsm->idle = 0;
-        fsm->sdo_request = request;
+        fsm->sdo_request = &request->req;
+        fsm->slave = slave;
         fsm->state = ec_fsm_master_state_sdo_request;
         ec_fsm_coe_upload(&fsm->fsm_coe, slave, &request->req);
         ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
@@ -499,7 +531,7 @@
             return;
     }
 
-    // Check for a pending Sdo request
+    // Check for pending Sdo requests
     if (ec_fsm_master_action_process_sdo(fsm))
         return;
 
@@ -1026,25 +1058,25 @@
 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */)
 {
     ec_master_t *master = fsm->master;
-    ec_master_sdo_request_t *request = fsm->sdo_request;
+    ec_sdo_request_t *request = fsm->sdo_request;
 
     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
 
     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
-        EC_DBG("Failed to process Sdo request for slave %i.\n",
+        EC_DBG("Failed to process Sdo request for slave %u.\n",
                 fsm->slave->ring_position);
-        request->req.state = EC_REQUEST_FAILURE;
+        request->state = EC_REQUEST_FAILURE;
         wake_up(&master->sdo_queue);
         fsm->state = ec_fsm_master_state_error;
         return;
     }
 
     // Sdo request finished 
-    request->req.state = EC_REQUEST_COMPLETE;
+    request->state = EC_REQUEST_COMPLETE;
     wake_up(&master->sdo_queue);
 
     if (master->debug_level)
-        EC_DBG("Finished Sdo request for slave %i.\n",
+        EC_DBG("Finished Sdo request for slave %u.\n",
                 fsm->slave->ring_position);
 
     // check for another Sdo request