master/fsm_slave.c
changeset 813 bfc3f1ab52de
parent 802 b947d0b09f9a
child 814 a51f857b1b2d
equal deleted inserted replaced
812:80c3d9c8292f 813:bfc3f1ab52de
    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) {