810 ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately |
810 ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately |
811 return; |
811 return; |
812 } |
812 } |
813 |
813 |
814 // All SDOs are now configured. |
814 // All SDOs are now configured. |
815 ec_fsm_slave_config_enter_soe_conf(fsm); |
815 ec_fsm_slave_config_enter_soe_conf(fsm); |
816 } |
816 } |
817 |
817 |
818 /*****************************************************************************/ |
818 /*****************************************************************************/ |
819 |
819 |
820 /** Check for SoE configurations to be applied. |
820 /** Check for SoE configurations to be applied. |
822 void ec_fsm_slave_config_enter_soe_conf( |
822 void ec_fsm_slave_config_enter_soe_conf( |
823 ec_fsm_slave_config_t *fsm /**< slave state machine */ |
823 ec_fsm_slave_config_t *fsm /**< slave state machine */ |
824 ) |
824 ) |
825 { |
825 { |
826 ec_slave_t *slave = fsm->slave; |
826 ec_slave_t *slave = fsm->slave; |
827 ec_fsm_soe_t *fsm_soe = &slave->fsm.fsm_soe; |
827 ec_fsm_soe_t *fsm_soe = &slave->fsm.fsm_soe; |
828 |
828 |
829 if (!slave->config) { |
829 if (!slave->config) { |
830 ec_fsm_slave_config_enter_pdo_sync(fsm); |
830 ec_fsm_slave_config_enter_pdo_sync(fsm); |
831 return; |
831 return; |
832 } |
832 } |
840 // start SoE configuration |
840 // start SoE configuration |
841 fsm->state = ec_fsm_slave_config_state_soe_conf; |
841 fsm->state = ec_fsm_slave_config_state_soe_conf; |
842 fsm->soe_request = list_entry(fsm->slave->config->soe_configs.next, |
842 fsm->soe_request = list_entry(fsm->slave->config->soe_configs.next, |
843 ec_soe_request_t, list); |
843 ec_soe_request_t, list); |
844 ec_soe_request_copy(&fsm->soe_request_copy, fsm->soe_request); |
844 ec_soe_request_copy(&fsm->soe_request_copy, fsm->soe_request); |
845 ec_soe_request_write(&fsm->soe_request_copy); |
845 ec_soe_request_write(&fsm->soe_request_copy); |
846 ec_fsm_soe_transfer(fsm_soe, fsm->slave, &fsm->soe_request_copy); |
846 ec_fsm_soe_transfer(fsm_soe, fsm->slave, &fsm->soe_request_copy); |
847 ec_fsm_soe_exec(fsm_soe); // execute immediately |
847 ec_fsm_soe_exec(fsm_soe); // execute immediately |
|
848 ec_master_queue_external_datagram(slave->master, fsm_soe->datagram); |
848 } |
849 } |
849 |
850 |
850 /*****************************************************************************/ |
851 /*****************************************************************************/ |
851 |
852 |
852 /** Slave configuration state: SOE_CONF. |
853 /** Slave configuration state: SOE_CONF. |
854 void ec_fsm_slave_config_state_soe_conf( |
855 void ec_fsm_slave_config_state_soe_conf( |
855 ec_fsm_slave_config_t *fsm /**< slave state machine */ |
856 ec_fsm_slave_config_t *fsm /**< slave state machine */ |
856 ) |
857 ) |
857 { |
858 { |
858 ec_slave_t *slave = fsm->slave; |
859 ec_slave_t *slave = fsm->slave; |
859 ec_fsm_soe_t *fsm_soe = &slave->fsm.fsm_soe; |
860 ec_fsm_soe_t *fsm_soe = &slave->fsm.fsm_soe; |
860 |
861 |
861 if (ec_fsm_soe_exec(fsm_soe)) { |
862 if (ec_fsm_soe_exec(fsm_soe)) { |
862 return; |
863 ec_master_queue_external_datagram(slave->master, fsm_soe->datagram); |
863 } |
864 return; |
|
865 } |
864 |
866 |
865 if (!ec_fsm_soe_success(fsm_soe)) { |
867 if (!ec_fsm_soe_success(fsm_soe)) { |
866 EC_ERR("SoE configuration failed for slave %u.\n", |
868 EC_ERR("SoE configuration failed for slave %u.\n", |
867 fsm->slave->ring_position); |
869 fsm->slave->ring_position); |
868 fsm->slave->error_flag = 1; |
870 fsm->slave->error_flag = 1; |
881 ec_soe_request_t, list); |
883 ec_soe_request_t, list); |
882 ec_soe_request_copy(&fsm->soe_request_copy, fsm->soe_request); |
884 ec_soe_request_copy(&fsm->soe_request_copy, fsm->soe_request); |
883 ec_soe_request_write(&fsm->soe_request_copy); |
885 ec_soe_request_write(&fsm->soe_request_copy); |
884 ec_fsm_soe_transfer(fsm_soe, fsm->slave, &fsm->soe_request_copy); |
886 ec_fsm_soe_transfer(fsm_soe, fsm->slave, &fsm->soe_request_copy); |
885 ec_fsm_soe_exec(fsm_soe); // execute immediately |
887 ec_fsm_soe_exec(fsm_soe); // execute immediately |
|
888 ec_master_queue_external_datagram(slave->master, fsm_soe->datagram); |
886 return; |
889 return; |
887 } |
890 } |
888 |
891 |
889 // All SDOs are now configured. |
892 // All SDOs are now configured. |
890 ec_fsm_slave_config_enter_pdo_conf(fsm); |
893 ec_fsm_slave_config_enter_pdo_conf(fsm); |