master/slave.c
changeset 260 5fe7df7f2433
parent 256 dc71aee17f8a
child 264 76cba93ba122
--- a/master/slave.c	Mon May 22 09:16:12 2006 +0000
+++ b/master/slave.c	Fri May 26 14:26:57 2006 +0000
@@ -151,6 +151,7 @@
     slave->requested_state = EC_SLAVE_STATE_UNKNOWN;
     slave->current_state = EC_SLAVE_STATE_UNKNOWN;
     slave->state_error = 0;
+    slave->online = 1;
 
     ec_command_init(&slave->mbox_command);
 
@@ -839,6 +840,7 @@
         if (ec_command_nprd(command, slave->station_address, 0x0130, 2))
             return;
         if (unlikely(ec_master_simple_io(slave->master, command))) {
+            slave->current_state = EC_SLAVE_STATE_UNKNOWN;
             EC_WARN("Acknowledge checking failed on slave %i!\n",
                     slave->ring_position);
             return;
@@ -847,12 +849,14 @@
         end = get_cycles();
 
         if (likely(EC_READ_U8(command->data) == state)) {
+            slave->current_state = state;
             EC_INFO("Acknowleged state 0x%02X on slave %i.\n", state,
                     slave->ring_position);
             return;
         }
 
         if (unlikely((end - start) >= timeout)) {
+            slave->current_state = EC_SLAVE_STATE_UNKNOWN;
             EC_WARN("Failed to acknowledge state 0x%02X on slave %i"
                     " - Timeout!\n", state, slave->ring_position);
             return;
@@ -912,6 +916,8 @@
 
     command = &slave->master->simple_command;
 
+    slave->requested_state = state;
+
     if (ec_command_npwr(command, slave->station_address, 0x0120, 2)) return -1;
     EC_WRITE_U16(command->data, state);
     if (unlikely(ec_master_simple_io(slave->master, command))) {
@@ -930,6 +936,7 @@
         if (ec_command_nprd(command, slave->station_address, 0x0130, 2))
             return -1;
         if (unlikely(ec_master_simple_io(slave->master, command))) {
+            slave->current_state = EC_SLAVE_STATE_UNKNOWN;
             EC_ERR("Failed to check state 0x%02X on slave %i!\n",
                    state, slave->ring_position);
             return -1;
@@ -941,16 +948,20 @@
             EC_ERR("Failed to set state 0x%02X - Slave %i refused state change"
                    " (code 0x%02X)!\n", state, slave->ring_position,
                    EC_READ_U8(command->data));
-            state = EC_READ_U8(command->data) & 0x0F;
+            slave->current_state = EC_READ_U8(command->data);
+            state = slave->current_state & 0x0F;
             ec_slave_read_al_status_code(slave);
             ec_slave_state_ack(slave, state);
             return -1;
         }
 
-        if (likely(EC_READ_U8(command->data) == (state & 0x0F)))
+        if (likely(EC_READ_U8(command->data) == (state & 0x0F))) {
+            slave->current_state = state;
             return 0; // state change successful
+        }
 
         if (unlikely((end - start) >= timeout)) {
+            slave->current_state = EC_SLAVE_STATE_UNKNOWN;
             EC_ERR("Failed to check state 0x%02X of slave %i - Timeout!\n",
                    state, slave->ring_position);
             return -1;
@@ -1300,18 +1311,22 @@
     if (attr == &attr_state) {
         if (!strcmp(buffer, "INIT\n")) {
             slave->requested_state = EC_SLAVE_STATE_INIT;
+            slave->state_error = 0;
             return size;
         }
         else if (!strcmp(buffer, "PREOP\n")) {
             slave->requested_state = EC_SLAVE_STATE_PREOP;
+            slave->state_error = 0;
             return size;
         }
         else if (!strcmp(buffer, "SAVEOP\n")) {
             slave->requested_state = EC_SLAVE_STATE_SAVEOP;
+            slave->state_error = 0;
             return size;
         }
         else if (!strcmp(buffer, "OP\n")) {
             slave->requested_state = EC_SLAVE_STATE_OP;
+            slave->state_error = 0;
             return size;
         }