master/fsm_slave.c
changeset 623 4d64368f3a1e
parent 620 4f76acbf54a0
child 628 e94a16bc52ce
equal deleted inserted replaced
622:63bcbb274b2f 623:4d64368f3a1e
    54 void ec_fsm_slave_scan_state_eeprom_data(ec_fsm_slave_t *);
    54 void ec_fsm_slave_scan_state_eeprom_data(ec_fsm_slave_t *);
    55 
    55 
    56 void ec_fsm_slave_conf_state_start(ec_fsm_slave_t *);
    56 void ec_fsm_slave_conf_state_start(ec_fsm_slave_t *);
    57 void ec_fsm_slave_conf_state_init(ec_fsm_slave_t *);
    57 void ec_fsm_slave_conf_state_init(ec_fsm_slave_t *);
    58 void ec_fsm_slave_conf_state_clear_fmmus(ec_fsm_slave_t *);
    58 void ec_fsm_slave_conf_state_clear_fmmus(ec_fsm_slave_t *);
    59 void ec_fsm_slave_conf_state_sync(ec_fsm_slave_t *);
    59 void ec_fsm_slave_conf_state_mbox_sync(ec_fsm_slave_t *);
    60 void ec_fsm_slave_conf_state_preop(ec_fsm_slave_t *);
    60 void ec_fsm_slave_conf_state_preop(ec_fsm_slave_t *);
    61 void ec_fsm_slave_conf_state_sync2(ec_fsm_slave_t *);
    61 void ec_fsm_slave_conf_state_pdo_sync(ec_fsm_slave_t *);
    62 void ec_fsm_slave_conf_state_fmmu(ec_fsm_slave_t *);
    62 void ec_fsm_slave_conf_state_fmmu(ec_fsm_slave_t *);
    63 void ec_fsm_slave_conf_state_sdoconf(ec_fsm_slave_t *);
    63 void ec_fsm_slave_conf_state_sdoconf(ec_fsm_slave_t *);
    64 void ec_fsm_slave_conf_state_saveop(ec_fsm_slave_t *);
    64 void ec_fsm_slave_conf_state_saveop(ec_fsm_slave_t *);
    65 void ec_fsm_slave_conf_state_op(ec_fsm_slave_t *);
    65 void ec_fsm_slave_conf_state_op(ec_fsm_slave_t *);
    66 
    66 
    67 void ec_fsm_slave_conf_enter_sync(ec_fsm_slave_t *);
    67 void ec_fsm_slave_conf_enter_mbox_sync(ec_fsm_slave_t *);
    68 void ec_fsm_slave_conf_enter_preop(ec_fsm_slave_t *);
    68 void ec_fsm_slave_conf_enter_preop(ec_fsm_slave_t *);
    69 void ec_fsm_slave_conf_enter_sync2(ec_fsm_slave_t *);
    69 void ec_fsm_slave_conf_enter_pdo_sync(ec_fsm_slave_t *);
    70 void ec_fsm_slave_conf_enter_fmmu(ec_fsm_slave_t *);
    70 void ec_fsm_slave_conf_enter_fmmu(ec_fsm_slave_t *);
    71 void ec_fsm_slave_conf_enter_sdoconf(ec_fsm_slave_t *);
    71 void ec_fsm_slave_conf_enter_sdoconf(ec_fsm_slave_t *);
    72 void ec_fsm_slave_conf_enter_saveop(ec_fsm_slave_t *);
    72 void ec_fsm_slave_conf_enter_saveop(ec_fsm_slave_t *);
    73 
    73 
    74 void ec_fsm_slave_state_end(ec_fsm_slave_t *);
    74 void ec_fsm_slave_state_end(ec_fsm_slave_t *);
   601     // check and reset CRC fault counters
   601     // check and reset CRC fault counters
   602     //ec_slave_check_crc(slave);
   602     //ec_slave_check_crc(slave);
   603     // TODO: Implement state machine for CRC checking.
   603     // TODO: Implement state machine for CRC checking.
   604 
   604 
   605     if (!slave->base_fmmu_count) { // skip FMMU configuration
   605     if (!slave->base_fmmu_count) { // skip FMMU configuration
   606         ec_fsm_slave_conf_enter_sync(fsm);
   606         ec_fsm_slave_conf_enter_mbox_sync(fsm);
   607         return;
   607         return;
   608     }
   608     }
   609 
   609 
   610     if (master->debug_level)
   610     if (master->debug_level)
   611         EC_DBG("Clearing FMMU configurations of slave %i...\n",
   611         EC_DBG("Clearing FMMU configurations of slave %i...\n",
   649         EC_ERR("Failed to clear FMMUs - slave %i did not respond.\n",
   649         EC_ERR("Failed to clear FMMUs - slave %i did not respond.\n",
   650                fsm->slave->ring_position);
   650                fsm->slave->ring_position);
   651         return;
   651         return;
   652     }
   652     }
   653 
   653 
   654     ec_fsm_slave_conf_enter_sync(fsm);
   654     ec_fsm_slave_conf_enter_mbox_sync(fsm);
   655 }
   655 }
   656 
   656 
   657 /*****************************************************************************/
   657 /*****************************************************************************/
   658 
   658 
   659 /**
   659 /**
   660 */
   660 */
   661 
   661 
   662 void ec_fsm_slave_conf_enter_sync(ec_fsm_slave_t *fsm /**< slave state machine */)
   662 void ec_fsm_slave_conf_enter_mbox_sync(ec_fsm_slave_t *fsm /**< slave state machine */)
   663 {
   663 {
   664     ec_master_t *master = fsm->slave->master;
   664     ec_master_t *master = fsm->slave->master;
   665     ec_slave_t *slave = fsm->slave;
   665     ec_slave_t *slave = fsm->slave;
   666     ec_datagram_t *datagram = fsm->datagram;
   666     ec_datagram_t *datagram = fsm->datagram;
   667     unsigned int i;
   667     unsigned int i;
   697                 datagram->data + EC_SYNC_SIZE * i);
   697                 datagram->data + EC_SYNC_SIZE * i);
   698     }
   698     }
   699 
   699 
   700     ec_master_queue_datagram(fsm->slave->master, datagram);
   700     ec_master_queue_datagram(fsm->slave->master, datagram);
   701     fsm->retries = EC_FSM_RETRIES;
   701     fsm->retries = EC_FSM_RETRIES;
   702     fsm->state = ec_fsm_slave_conf_state_sync;
   702     fsm->state = ec_fsm_slave_conf_state_mbox_sync;
   703 }
   703 }
   704 
   704 
   705 /*****************************************************************************/
   705 /*****************************************************************************/
   706 
   706 
   707 /**
   707 /**
   708    Slave configuration state: SYNC.
   708    Slave configuration state: SYNC.
   709 */
   709 */
   710 
   710 
   711 void ec_fsm_slave_conf_state_sync(ec_fsm_slave_t *fsm /**< slave state machine */)
   711 void ec_fsm_slave_conf_state_mbox_sync(ec_fsm_slave_t *fsm /**< slave state machine */)
   712 {
   712 {
   713     ec_datagram_t *datagram = fsm->datagram;
   713     ec_datagram_t *datagram = fsm->datagram;
   714     ec_slave_t *slave = fsm->slave;
   714     ec_slave_t *slave = fsm->slave;
   715 
   715 
   716     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) {
   716     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) {
   782                    slave->ring_position);
   782                    slave->ring_position);
   783         }
   783         }
   784         return;
   784         return;
   785     }
   785     }
   786 
   786 
   787     ec_fsm_slave_conf_enter_sync2(fsm);
   787     ec_fsm_slave_conf_enter_pdo_sync(fsm);
   788 }
   788 }
   789 
   789 
   790 /*****************************************************************************/
   790 /*****************************************************************************/
   791 
   791 
   792 /**
   792 /**
   793 */
   793 */
   794 
   794 
   795 void ec_fsm_slave_conf_enter_sync2(ec_fsm_slave_t *fsm /**< slave state machine */)
   795 void ec_fsm_slave_conf_enter_pdo_sync(ec_fsm_slave_t *fsm /**< slave state machine */)
   796 {
   796 {
   797     ec_slave_t *slave = fsm->slave;
   797     ec_slave_t *slave = fsm->slave;
   798     ec_datagram_t *datagram = fsm->datagram;
   798     ec_datagram_t *datagram = fsm->datagram;
   799     unsigned int i;
   799     unsigned int i;
   800 
   800 
   813                 datagram->data + EC_SYNC_SIZE * i);
   813                 datagram->data + EC_SYNC_SIZE * i);
   814     }
   814     }
   815 
   815 
   816     ec_master_queue_datagram(fsm->slave->master, datagram);
   816     ec_master_queue_datagram(fsm->slave->master, datagram);
   817     fsm->retries = EC_FSM_RETRIES;
   817     fsm->retries = EC_FSM_RETRIES;
   818     fsm->state = ec_fsm_slave_conf_state_sync2;
   818     fsm->state = ec_fsm_slave_conf_state_pdo_sync;
   819 }
   819 }
   820 
   820 
   821 /*****************************************************************************/
   821 /*****************************************************************************/
   822 
   822 
   823 /**
   823 /**
   824    Slave configuration state: SYNC2.
   824    Slave configuration state: SYNC2.
   825 */
   825 */
   826 
   826 
   827 void ec_fsm_slave_conf_state_sync2(ec_fsm_slave_t *fsm /**< slave state machine */)
   827 void ec_fsm_slave_conf_state_pdo_sync(ec_fsm_slave_t *fsm /**< slave state machine */)
   828 {
   828 {
   829     ec_datagram_t *datagram = fsm->datagram;
   829     ec_datagram_t *datagram = fsm->datagram;
   830     ec_slave_t *slave = fsm->slave;
   830     ec_slave_t *slave = fsm->slave;
   831 
   831 
   832     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) {
   832     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) {