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 |