62 void ec_fsm_slave_conf_state_sdo_conf(ec_fsm_slave_t *); |
62 void ec_fsm_slave_conf_state_sdo_conf(ec_fsm_slave_t *); |
63 void ec_fsm_slave_conf_state_mapping(ec_fsm_slave_t *); |
63 void ec_fsm_slave_conf_state_mapping(ec_fsm_slave_t *); |
64 void ec_fsm_slave_conf_state_pdo_conf(ec_fsm_slave_t *); |
64 void ec_fsm_slave_conf_state_pdo_conf(ec_fsm_slave_t *); |
65 void ec_fsm_slave_conf_state_pdo_sync(ec_fsm_slave_t *); |
65 void ec_fsm_slave_conf_state_pdo_sync(ec_fsm_slave_t *); |
66 void ec_fsm_slave_conf_state_fmmu(ec_fsm_slave_t *); |
66 void ec_fsm_slave_conf_state_fmmu(ec_fsm_slave_t *); |
67 void ec_fsm_slave_conf_state_saveop(ec_fsm_slave_t *); |
67 void ec_fsm_slave_conf_state_safeop(ec_fsm_slave_t *); |
68 void ec_fsm_slave_conf_state_op(ec_fsm_slave_t *); |
68 void ec_fsm_slave_conf_state_op(ec_fsm_slave_t *); |
69 |
69 |
70 void ec_fsm_slave_conf_enter_mbox_sync(ec_fsm_slave_t *); |
70 void ec_fsm_slave_conf_enter_mbox_sync(ec_fsm_slave_t *); |
71 void ec_fsm_slave_conf_enter_preop(ec_fsm_slave_t *); |
71 void ec_fsm_slave_conf_enter_preop(ec_fsm_slave_t *); |
72 void ec_fsm_slave_conf_enter_sdo_conf(ec_fsm_slave_t *); |
72 void ec_fsm_slave_conf_enter_sdo_conf(ec_fsm_slave_t *); |
73 void ec_fsm_slave_conf_enter_mapping(ec_fsm_slave_t *); |
73 void ec_fsm_slave_conf_enter_mapping(ec_fsm_slave_t *); |
74 void ec_fsm_slave_conf_enter_pdo_sync(ec_fsm_slave_t *); |
74 void ec_fsm_slave_conf_enter_pdo_sync(ec_fsm_slave_t *); |
75 void ec_fsm_slave_conf_enter_fmmu(ec_fsm_slave_t *); |
75 void ec_fsm_slave_conf_enter_fmmu(ec_fsm_slave_t *); |
76 void ec_fsm_slave_conf_enter_saveop(ec_fsm_slave_t *); |
76 void ec_fsm_slave_conf_enter_safeop(ec_fsm_slave_t *); |
77 |
77 |
78 void ec_fsm_slave_state_end(ec_fsm_slave_t *); |
78 void ec_fsm_slave_state_end(ec_fsm_slave_t *); |
79 void ec_fsm_slave_state_error(ec_fsm_slave_t *); |
79 void ec_fsm_slave_state_error(ec_fsm_slave_t *); |
80 |
80 |
81 /*****************************************************************************/ |
81 /*****************************************************************************/ |
876 { |
876 { |
877 ec_slave_t *slave = fsm->slave; |
877 ec_slave_t *slave = fsm->slave; |
878 |
878 |
879 if (!slave->config) { |
879 if (!slave->config) { |
880 EC_DBG("Slave %u is not configured.\n", slave->ring_position); |
880 EC_DBG("Slave %u is not configured.\n", slave->ring_position); |
881 ec_fsm_slave_conf_enter_saveop(fsm); |
881 ec_fsm_slave_conf_enter_safeop(fsm); |
882 return; |
882 return; |
883 } |
883 } |
884 |
884 |
885 // No CoE configuration to be applied? |
885 // No CoE configuration to be applied? |
886 if (list_empty(&slave->config->sdo_configs)) { // skip SDO configuration |
886 if (list_empty(&slave->config->sdo_configs)) { // skip SDO configuration |
1087 unsigned int i; |
1087 unsigned int i; |
1088 const ec_fmmu_config_t *fmmu; |
1088 const ec_fmmu_config_t *fmmu; |
1089 const ec_sync_t *sync; |
1089 const ec_sync_t *sync; |
1090 |
1090 |
1091 if (!slave->base_fmmu_count) { // skip FMMU configuration |
1091 if (!slave->base_fmmu_count) { // skip FMMU configuration |
1092 ec_fsm_slave_conf_enter_saveop(fsm); |
1092 ec_fsm_slave_conf_enter_safeop(fsm); |
1093 return; |
1093 return; |
1094 } |
1094 } |
1095 |
1095 |
1096 // configure FMMUs |
1096 // configure FMMUs |
1097 ec_datagram_npwr(datagram, slave->station_address, |
1097 ec_datagram_npwr(datagram, slave->station_address, |
1142 slave->ring_position); |
1142 slave->ring_position); |
1143 ec_datagram_print_wc_error(datagram); |
1143 ec_datagram_print_wc_error(datagram); |
1144 return; |
1144 return; |
1145 } |
1145 } |
1146 |
1146 |
1147 ec_fsm_slave_conf_enter_saveop(fsm); |
1147 ec_fsm_slave_conf_enter_safeop(fsm); |
1148 } |
1148 } |
1149 |
1149 |
1150 /*****************************************************************************/ |
1150 /*****************************************************************************/ |
1151 |
1151 |
1152 /** |
1152 /** |
1153 * Request SAVEOP state. |
1153 * Request SAFEOP state. |
1154 */ |
1154 */ |
1155 |
1155 |
1156 void ec_fsm_slave_conf_enter_saveop(ec_fsm_slave_t *fsm /**< slave state machine */) |
1156 void ec_fsm_slave_conf_enter_safeop(ec_fsm_slave_t *fsm /**< slave state machine */) |
1157 { |
1157 { |
1158 fsm->state = ec_fsm_slave_conf_state_saveop; |
1158 fsm->state = ec_fsm_slave_conf_state_safeop; |
1159 ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_SAVEOP); |
1159 ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_SAFEOP); |
1160 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1160 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1161 } |
1161 } |
1162 |
1162 |
1163 /*****************************************************************************/ |
1163 /*****************************************************************************/ |
1164 |
1164 |
1165 /** |
1165 /** |
1166 Slave configuration state: SAVEOP. |
1166 Slave configuration state: SAFEOP. |
1167 */ |
1167 */ |
1168 |
1168 |
1169 void ec_fsm_slave_conf_state_saveop(ec_fsm_slave_t *fsm /**< slave state machine */) |
1169 void ec_fsm_slave_conf_state_safeop(ec_fsm_slave_t *fsm /**< slave state machine */) |
1170 { |
1170 { |
1171 ec_master_t *master = fsm->slave->master; |
1171 ec_master_t *master = fsm->slave->master; |
1172 ec_slave_t *slave = fsm->slave; |
1172 ec_slave_t *slave = fsm->slave; |
1173 |
1173 |
1174 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
1174 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
1178 fsm->slave->error_flag = 1; |
1178 fsm->slave->error_flag = 1; |
1179 fsm->state = ec_fsm_slave_state_error; |
1179 fsm->state = ec_fsm_slave_state_error; |
1180 return; |
1180 return; |
1181 } |
1181 } |
1182 |
1182 |
1183 // slave is now in SAVEOP |
1183 // slave is now in SAFEOP |
1184 |
1184 |
1185 if (master->debug_level) { |
1185 if (master->debug_level) { |
1186 EC_DBG("Slave %i is now in SAVEOP.\n", slave->ring_position); |
1186 EC_DBG("Slave %i is now in SAFEOP.\n", slave->ring_position); |
1187 } |
1187 } |
1188 |
1188 |
1189 if (fsm->slave->current_state == fsm->slave->requested_state) { |
1189 if (fsm->slave->current_state == fsm->slave->requested_state) { |
1190 fsm->state = ec_fsm_slave_state_end; // successful |
1190 fsm->state = ec_fsm_slave_state_end; // successful |
1191 if (master->debug_level) { |
1191 if (master->debug_level) { |