master/fsm.c
changeset 407 b73c9f7be5a1
parent 405 61d5d6457fa6
child 409 bc4c852e1b93
equal deleted inserted replaced
406:e4f531d0d62d 407:b73c9f7be5a1
  1041 
  1041 
  1042     slave->current_state = EC_READ_U8(datagram->data);
  1042     slave->current_state = EC_READ_U8(datagram->data);
  1043     if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) {
  1043     if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) {
  1044         EC_WARN("Slave %i has state error bit set (0x%02X)!\n",
  1044         EC_WARN("Slave %i has state error bit set (0x%02X)!\n",
  1045                 slave->ring_position, slave->current_state);
  1045                 slave->ring_position, slave->current_state);
  1046         slave->current_state &= 0x0F;
       
  1047     }
  1046     }
  1048 
  1047 
  1049     // read base data
  1048     // read base data
  1050     ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0000, 6);
  1049     ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0000, 6);
  1051     ec_master_queue_datagram(fsm->master, datagram);
  1050     ec_master_queue_datagram(fsm->master, datagram);
  1881         return;
  1880         return;
  1882     }
  1881     }
  1883 
  1882 
  1884     if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) {
  1883     if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) {
  1885         // state change error
  1884         // state change error
  1886         fsm->change_new = slave->current_state & 0x0F;
       
  1887         EC_ERR("Failed to set state 0x%02X - Slave %i refused state change"
  1885         EC_ERR("Failed to set state 0x%02X - Slave %i refused state change"
  1888                " (code 0x%02X)!\n", fsm->change_new, slave->ring_position,
  1886                " (code 0x%02X)!\n", fsm->change_new, slave->ring_position,
  1889                slave->current_state);
  1887                slave->current_state);
  1890         // fetch AL status error code
  1888         // fetch AL status error code
  1891         ec_datagram_nprd(datagram, slave->station_address, 0x0134, 2);
  1889         ec_datagram_nprd(datagram, slave->station_address, 0x0134, 2);
  1961     uint32_t code;
  1959     uint32_t code;
  1962     const ec_code_msg_t *al_msg;
  1960     const ec_code_msg_t *al_msg;
  1963 
  1961 
  1964     if (datagram->state != EC_DATAGRAM_RECEIVED
  1962     if (datagram->state != EC_DATAGRAM_RECEIVED
  1965         || datagram->working_counter != 1) {
  1963         || datagram->working_counter != 1) {
  1966         fsm->change_state = ec_fsm_error;
  1964         EC_WARN("Reception of AL status code datagram failed.\n");
  1967         EC_ERR("Reception of AL status code datagram failed.\n");
  1965     }
  1968         return;
  1966     else {
  1969     }
  1967         if ((code = EC_READ_U16(datagram->data))) {
  1970 
  1968             for (al_msg = al_status_messages; al_msg->code; al_msg++) {
  1971     if ((code = EC_READ_U16(datagram->data))) {
  1969                 if (al_msg->code != code) continue;
  1972         for (al_msg = al_status_messages; al_msg->code; al_msg++) {
  1970                 EC_ERR("AL status message 0x%04X: \"%s\".\n",
  1973             if (al_msg->code != code) continue;
  1971                        al_msg->code, al_msg->message);
  1974             EC_ERR("AL status message 0x%04X: \"%s\".\n",
  1972                 break;
  1975                    al_msg->code, al_msg->message);
  1973             }
  1976             break;
  1974             if (!al_msg->code)
  1977         }
  1975                 EC_ERR("Unknown AL status code 0x%04X.\n", code);
  1978         if (!al_msg->code)
  1976         }
  1979             EC_ERR("Unknown AL status code 0x%04X.\n", code);
       
  1980     }
  1977     }
  1981 
  1978 
  1982     // acknowledge "old" slave state
  1979     // acknowledge "old" slave state
  1983     ec_datagram_npwr(datagram, slave->station_address, 0x0120, 2);
  1980     ec_datagram_npwr(datagram, slave->station_address, 0x0120, 2);
  1984     EC_WRITE_U16(datagram->data, slave->current_state);
  1981     EC_WRITE_U16(datagram->data, slave->current_state);
  2020 
  2017 
  2021 void ec_fsm_change_check_ack(ec_fsm_t *fsm /**< finite state machine */)
  2018 void ec_fsm_change_check_ack(ec_fsm_t *fsm /**< finite state machine */)
  2022 {
  2019 {
  2023     ec_datagram_t *datagram = &fsm->datagram;
  2020     ec_datagram_t *datagram = &fsm->datagram;
  2024     ec_slave_t *slave = fsm->slave;
  2021     ec_slave_t *slave = fsm->slave;
  2025     ec_slave_state_t ack_state;
       
  2026 
  2022 
  2027     if (datagram->state != EC_DATAGRAM_RECEIVED
  2023     if (datagram->state != EC_DATAGRAM_RECEIVED
  2028         || datagram->working_counter != 1) {
  2024         || datagram->working_counter != 1) {
  2029         fsm->change_state = ec_fsm_error;
  2025         fsm->change_state = ec_fsm_error;
  2030         EC_ERR("Reception of state ack check datagram failed.\n");
  2026         EC_ERR("Reception of state ack check datagram failed.\n");
  2034     if (fsm->change_take_time) {
  2030     if (fsm->change_take_time) {
  2035         fsm->change_take_time = 0;
  2031         fsm->change_take_time = 0;
  2036         fsm->change_jiffies = datagram->jiffies_sent;
  2032         fsm->change_jiffies = datagram->jiffies_sent;
  2037     }
  2033     }
  2038 
  2034 
  2039     ack_state = EC_READ_U8(datagram->data);
  2035     slave->current_state = EC_READ_U8(datagram->data);
  2040 
  2036 
  2041     if (ack_state == slave->current_state) {
  2037     if (!(slave->current_state & EC_SLAVE_STATE_ACK_ERR)) {
  2042         fsm->change_state = ec_fsm_error;
  2038         fsm->change_state = ec_fsm_error;
  2043         EC_INFO("Acknowleged state 0x%02X on slave %i.\n",
  2039         EC_INFO("Acknowledged state 0x%02X on slave %i.\n",
  2044                 slave->current_state, slave->ring_position);
  2040                 slave->current_state, slave->ring_position);
  2045         return;
  2041         return;
  2046     }
  2042     }
  2047 
  2043 
  2048     if (datagram->jiffies_received
  2044     if (datagram->jiffies_received
  2049         - fsm->change_jiffies >= 100 * HZ / 1000) { // 100ms
  2045         - fsm->change_jiffies >= 100 * HZ / 1000) { // 100ms
  2050         // timeout while checking
  2046         // timeout while checking
  2051         slave->current_state = EC_SLAVE_STATE_UNKNOWN;
  2047         slave->current_state = EC_SLAVE_STATE_UNKNOWN;
  2052         fsm->change_state = ec_fsm_error;
  2048         fsm->change_state = ec_fsm_error;
  2053         EC_ERR("Timeout while acknowleging state 0x%02X on slave %i.\n",
  2049         EC_ERR("Timeout while acknowledging state 0x%02X on slave %i.\n",
  2054                fsm->change_new, slave->ring_position);
  2050                fsm->change_new, slave->ring_position);
  2055         return;
  2051         return;
  2056     }
  2052     }
  2057 
  2053 
  2058     // reread new AL status
  2054     // reread new AL status