master/fsm.c
branchstable-1.1
changeset 1719 42ed27ae6785
parent 1717 cc1ee18207d3
child 1731 60b2aad9d40b
equal deleted inserted replaced
1718:048c7310279c 1719:42ed27ae6785
  1777 void ec_fsm_change_start(ec_fsm_t *fsm /**< finite state machine */)
  1777 void ec_fsm_change_start(ec_fsm_t *fsm /**< finite state machine */)
  1778 {
  1778 {
  1779     ec_datagram_t *datagram = &fsm->datagram;
  1779     ec_datagram_t *datagram = &fsm->datagram;
  1780     ec_slave_t *slave = fsm->slave;
  1780     ec_slave_t *slave = fsm->slave;
  1781 
  1781 
  1782     fsm->change_start = get_cycles();
  1782     fsm->change_jiffies = jiffies;
  1783 
  1783 
  1784     // write new state to slave
  1784     // write new state to slave
  1785     ec_datagram_npwr(datagram, slave->station_address, 0x0120, 2);
  1785     ec_datagram_npwr(datagram, slave->station_address, 0x0120, 2);
  1786     EC_WRITE_U16(datagram->data, fsm->change_new);
  1786     EC_WRITE_U16(datagram->data, fsm->change_new);
  1787     ec_master_queue_datagram(fsm->master, datagram);
  1787     ec_master_queue_datagram(fsm->master, datagram);
  1805                fsm->slave->ring_position);
  1805                fsm->slave->ring_position);
  1806         return;
  1806         return;
  1807     }
  1807     }
  1808 
  1808 
  1809     if (datagram->working_counter != 1) {
  1809     if (datagram->working_counter != 1) {
  1810         if (get_cycles() - fsm->change_start >= (cycles_t) 100 * cpu_khz) {
  1810         if (jiffies - fsm->change_jiffies >= 3 * HZ) {
  1811             fsm->change_state = ec_fsm_error;
  1811             fsm->change_state = ec_fsm_error;
  1812             EC_ERR("Failed to set state 0x%02X on slave %i: Slave did not"
  1812             EC_ERR("Failed to set state 0x%02X on slave %i: Slave did not"
  1813                    " respond.\n", fsm->change_new, fsm->slave->ring_position);
  1813                    " respond.\n", fsm->change_new, fsm->slave->ring_position);
  1814             return;
  1814             return;
  1815         }
  1815         }
  1819         EC_WRITE_U16(datagram->data, fsm->change_new);
  1819         EC_WRITE_U16(datagram->data, fsm->change_new);
  1820         ec_master_queue_datagram(fsm->master, datagram);
  1820         ec_master_queue_datagram(fsm->master, datagram);
  1821         return;
  1821         return;
  1822     }
  1822     }
  1823 
  1823 
  1824     fsm->change_start = get_cycles();
  1824     fsm->change_jiffies = jiffies;
  1825 
  1825 
  1826     // read AL status from slave
  1826     // read AL status from slave
  1827     ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2);
  1827     ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2);
  1828     ec_master_queue_datagram(fsm->master, datagram);
  1828     ec_master_queue_datagram(fsm->master, datagram);
  1829     fsm->change_state = ec_fsm_change_status;
  1829     fsm->change_state = ec_fsm_change_status;
  1867         ec_master_queue_datagram(fsm->master, datagram);
  1867         ec_master_queue_datagram(fsm->master, datagram);
  1868         fsm->change_state = ec_fsm_change_code;
  1868         fsm->change_state = ec_fsm_change_code;
  1869         return;
  1869         return;
  1870     }
  1870     }
  1871 
  1871 
  1872     if (get_cycles() - fsm->change_start >= (cycles_t) 10 * cpu_khz) {
  1872     if (jiffies - fsm->change_jiffies >= 100 * HZ / 1000) { // 100ms
  1873         // timeout while checking
  1873         // timeout while checking
  1874         fsm->change_state = ec_fsm_error;
  1874         fsm->change_state = ec_fsm_error;
  1875         EC_ERR("Timeout while setting state 0x%02X on slave %i.\n",
  1875         EC_ERR("Timeout while setting state 0x%02X on slave %i.\n",
  1876                fsm->change_new, slave->ring_position);
  1876                fsm->change_new, slave->ring_position);
  1877         return;
  1877         return;
  1976         fsm->change_state = ec_fsm_error;
  1976         fsm->change_state = ec_fsm_error;
  1977         EC_ERR("Reception of state ack datagram failed.\n");
  1977         EC_ERR("Reception of state ack datagram failed.\n");
  1978         return;
  1978         return;
  1979     }
  1979     }
  1980 
  1980 
  1981     fsm->change_start = get_cycles();
  1981     fsm->change_jiffies = jiffies;
  1982 
  1982 
  1983     // read new AL status
  1983     // read new AL status
  1984     ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2);
  1984     ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2);
  1985     ec_master_queue_datagram(fsm->master, datagram);
  1985     ec_master_queue_datagram(fsm->master, datagram);
  1986     fsm->change_state = ec_fsm_change_check_ack;
  1986     fsm->change_state = ec_fsm_change_check_ack;
  2012         EC_INFO("Acknowleged state 0x%02X on slave %i.\n",
  2012         EC_INFO("Acknowleged state 0x%02X on slave %i.\n",
  2013                 slave->current_state, slave->ring_position);
  2013                 slave->current_state, slave->ring_position);
  2014         return;
  2014         return;
  2015     }
  2015     }
  2016 
  2016 
  2017     if (get_cycles() - fsm->change_start >= (cycles_t) 100 * cpu_khz) {
  2017     if (jiffies - fsm->change_jiffies >= 100 * HZ / 1000) { // 100ms
  2018         // timeout while checking
  2018         // timeout while checking
  2019         slave->current_state = EC_SLAVE_STATE_UNKNOWN;
  2019         slave->current_state = EC_SLAVE_STATE_UNKNOWN;
  2020         fsm->change_state = ec_fsm_error;
  2020         fsm->change_state = ec_fsm_error;
  2021         EC_ERR("Timeout while acknowleging state 0x%02X on slave %i.\n",
  2021         EC_ERR("Timeout while acknowleging state 0x%02X on slave %i.\n",
  2022                fsm->change_new, slave->ring_position);
  2022                fsm->change_new, slave->ring_position);