master/fsm_slave_scan.c
changeset 1579 326d47aa986c
parent 1470 cb424feef942
child 1581 e51cf2af3ff9
--- a/master/fsm_slave_scan.c	Tue Jul 28 15:42:43 2009 +0000
+++ b/master/fsm_slave_scan.c	Thu Nov 19 14:39:10 2009 +0100
@@ -52,6 +52,7 @@
 void ec_fsm_slave_scan_state_datalink(ec_fsm_slave_scan_t *);
 void ec_fsm_slave_scan_state_sii_size(ec_fsm_slave_scan_t *);
 void ec_fsm_slave_scan_state_sii_data(ec_fsm_slave_scan_t *);
+void ec_fsm_slave_scan_state_regalias(ec_fsm_slave_scan_t *);
 void ec_fsm_slave_scan_state_preop(ec_fsm_slave_scan_t *);
 void ec_fsm_slave_scan_state_sync(ec_fsm_slave_scan_t *);
 void ec_fsm_slave_scan_state_pdos(ec_fsm_slave_scan_t *);
@@ -60,6 +61,7 @@
 void ec_fsm_slave_scan_state_error(ec_fsm_slave_scan_t *);
 
 void ec_fsm_slave_scan_enter_datalink(ec_fsm_slave_scan_t *);
+void ec_fsm_slave_scan_enter_regalias(ec_fsm_slave_scan_t *);
 void ec_fsm_slave_scan_enter_preop(ec_fsm_slave_scan_t *);
 void ec_fsm_slave_scan_enter_pdos(ec_fsm_slave_scan_t *);
 
@@ -313,7 +315,7 @@
     for (i = 0; i < EC_MAX_PORTS; i++) {
         slave->ports[i].desc = (octet >> (2 * i)) & 0x03;
     }
-    
+
     octet = EC_READ_U8(datagram->data + 8);
     slave->base_fmmu_bit_operation = octet & 0x01;
     slave->base_dc_supported = (octet >> 2) & 0x01;
@@ -600,7 +602,7 @@
     }
 
     // Evaluate SII contents
-    
+
     ec_slave_clear_sync_managers(slave);
 
     slave->sii.alias =
@@ -711,17 +713,81 @@
         }
     }
 
+    ec_fsm_slave_scan_enter_regalias(fsm);
+    return;
+
+end:
+    EC_ERR("Failed to analyze category data.\n");
+    fsm->slave->error_flag = 1;
+    fsm->state = ec_fsm_slave_scan_state_error;
+}
+
+
+/*****************************************************************************/
+
+/**
+   Slave scan entry function: REGALIAS.
+*/
+
+void ec_fsm_slave_scan_enter_regalias(
+        ec_fsm_slave_scan_t *fsm /**< slave state machine */
+        )
+{
+    ec_datagram_t *datagram = fsm->datagram;
+    ec_slave_t *slave = fsm->slave;
+
+    // read alias from register 0x0012
+    if (slave->master->debug_level)
+         EC_DBG("Reading alias from register 0x0012 of slave %u.\n",
+                 slave->ring_position);
+    ec_datagram_fprd(datagram, slave->station_address, 0x0012, 2);
+    ec_datagram_zero(datagram);
+    fsm->retries = EC_FSM_RETRIES;
+    fsm->state = ec_fsm_slave_scan_state_regalias;
+}
+
+/*****************************************************************************/
+
+/**
+   Slave scan state: REGALIAS.
+*/
+void ec_fsm_slave_scan_state_regalias(
+        ec_fsm_slave_scan_t *fsm /**< slave state machine */
+		)
+{
+    ec_datagram_t *datagram = fsm->datagram;
+    ec_slave_t *slave = fsm->slave;
+
+    if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
+        return;
+
+    if (datagram->state != EC_DATAGRAM_RECEIVED) {
+        fsm->state = ec_fsm_slave_scan_state_error;
+        EC_ERR("Failed to receive get reg alias datagram from slave %u"
+                " (datagram state %u).\n",
+               fsm->slave->ring_position, datagram->state);
+        return;
+    }
+
+    if (datagram->working_counter != 1) {
+        fsm->slave->error_flag = 1;
+        fsm->state = ec_fsm_slave_scan_state_error;
+        EC_ERR("Failed to read reg alias of slave %u: ",
+               fsm->slave->ring_position);
+        ec_datagram_print_wc_error(datagram);
+        return;
+    }
+
+    slave->sii.alias = EC_READ_U16(datagram->data);
+    if (slave->master->debug_level)
+         EC_DBG("Alias of slave %u is %u.\n",
+                 slave->ring_position,slave->sii.alias);
+
     if (slave->sii.mailbox_protocols & EC_MBOX_COE) {
         ec_fsm_slave_scan_enter_preop(fsm);
     } else {
         fsm->state = ec_fsm_slave_scan_state_end;
     }
-    return;
-
-end:
-    EC_ERR("Failed to analyze category data.\n");
-    fsm->slave->error_flag = 1;
-    fsm->state = ec_fsm_slave_scan_state_error;
 }
 
 /*****************************************************************************/