master/fsm_slave_config.c
changeset 1180 846907b8cc4b
parent 1174 235f34ca50e2
child 1225 4d5b739edcb5
child 1647 dd648d1786e9
equal deleted inserted replaced
1179:c0e6adec1aee 1180:846907b8cc4b
    59 void ec_fsm_slave_config_state_op(ec_fsm_slave_config_t *);
    59 void ec_fsm_slave_config_state_op(ec_fsm_slave_config_t *);
    60 
    60 
    61 void ec_fsm_slave_config_enter_mbox_sync(ec_fsm_slave_config_t *);
    61 void ec_fsm_slave_config_enter_mbox_sync(ec_fsm_slave_config_t *);
    62 void ec_fsm_slave_config_enter_preop(ec_fsm_slave_config_t *);
    62 void ec_fsm_slave_config_enter_preop(ec_fsm_slave_config_t *);
    63 void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *);
    63 void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *);
       
    64 void ec_fsm_slave_config_enter_pdo_conf(ec_fsm_slave_config_t *);
    64 void ec_fsm_slave_config_enter_pdo_sync(ec_fsm_slave_config_t *);
    65 void ec_fsm_slave_config_enter_pdo_sync(ec_fsm_slave_config_t *);
    65 void ec_fsm_slave_config_enter_fmmu(ec_fsm_slave_config_t *);
    66 void ec_fsm_slave_config_enter_fmmu(ec_fsm_slave_config_t *);
    66 void ec_fsm_slave_config_enter_safeop(ec_fsm_slave_config_t *);
    67 void ec_fsm_slave_config_enter_safeop(ec_fsm_slave_config_t *);
    67 
    68 
    68 void ec_fsm_slave_config_state_end(ec_fsm_slave_config_t *);
    69 void ec_fsm_slave_config_state_end(ec_fsm_slave_config_t *);
   438 {
   439 {
   439     ec_slave_t *slave = fsm->slave;
   440     ec_slave_t *slave = fsm->slave;
   440 
   441 
   441     // No CoE configuration to be applied?
   442     // No CoE configuration to be applied?
   442     if (list_empty(&slave->config->sdo_configs)) { // skip Sdo configuration
   443     if (list_empty(&slave->config->sdo_configs)) { // skip Sdo configuration
   443         ec_fsm_slave_config_enter_pdo_sync(fsm);
   444         ec_fsm_slave_config_enter_pdo_conf(fsm);
   444         return;
   445         return;
   445     }
   446     }
   446 
   447 
   447     // start Sdo configuration
   448     // start Sdo configuration
   448     fsm->state = ec_fsm_slave_config_state_sdo_conf;
   449     fsm->state = ec_fsm_slave_config_state_sdo_conf;
   480         ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   481         ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   481         return;
   482         return;
   482     }
   483     }
   483 
   484 
   484     // All Sdos are now configured.
   485     // All Sdos are now configured.
       
   486     ec_fsm_slave_config_enter_pdo_conf(fsm);
       
   487 }
       
   488 
       
   489 /*****************************************************************************/
       
   490 
       
   491 /** PDO_CONF entry function.
       
   492  */
       
   493 void ec_fsm_slave_config_enter_pdo_conf(
       
   494         ec_fsm_slave_config_t *fsm /**< slave state machine */
       
   495         )
       
   496 {
       
   497     // Start configuring Pdos
       
   498     ec_fsm_pdo_start_configuration(fsm->fsm_pdo, fsm->slave);
       
   499     fsm->state = ec_fsm_slave_config_state_pdo_conf;
       
   500     fsm->state(fsm); // execute immediately
       
   501 }
       
   502 
       
   503 /*****************************************************************************/
       
   504 
       
   505 /** Slave configuration state: PDO_CONF.
       
   506  */
       
   507 void ec_fsm_slave_config_state_pdo_conf(
       
   508         ec_fsm_slave_config_t *fsm /**< slave state machine */
       
   509         )
       
   510 {
       
   511     if (ec_fsm_pdo_exec(fsm->fsm_pdo))
       
   512         return;
       
   513 
       
   514     if (!ec_fsm_pdo_success(fsm->fsm_pdo)) {
       
   515         EC_WARN("Pdo configuration failed on slave %u.\n",
       
   516                 fsm->slave->ring_position);
       
   517     }
       
   518 
   485     ec_fsm_slave_config_enter_pdo_sync(fsm);
   519     ec_fsm_slave_config_enter_pdo_sync(fsm);
   486 }
   520 }
   487 
   521 
   488 /*****************************************************************************/
   522 /*****************************************************************************/
   489 
   523 
   507         offset = 0;
   541         offset = 0;
   508     }
   542     }
   509 
   543 
   510     if (slave->sii.sync_count <= offset) {
   544     if (slave->sii.sync_count <= offset) {
   511         // no Pdo sync managers to configure
   545         // no Pdo sync managers to configure
   512         ec_fsm_slave_config_enter_safeop(fsm);
   546         ec_fsm_slave_config_enter_fmmu(fsm);
   513         return;
   547         return;
   514     }
   548     }
   515 
   549 
   516     num_pdo_syncs = slave->sii.sync_count - offset;
   550     num_pdo_syncs = slave->sii.sync_count - offset;
   517 
   551 
   561         fsm->state = ec_fsm_slave_config_state_error;
   595         fsm->state = ec_fsm_slave_config_state_error;
   562         EC_ERR("Failed to set process data sync managers of slave %u: ",
   596         EC_ERR("Failed to set process data sync managers of slave %u: ",
   563                 slave->ring_position);
   597                 slave->ring_position);
   564         ec_datagram_print_wc_error(datagram);
   598         ec_datagram_print_wc_error(datagram);
   565         return;
   599         return;
   566     }
       
   567 
       
   568     // Start configuring Pdos
       
   569     ec_fsm_pdo_start_configuration(fsm->fsm_pdo, fsm->slave);
       
   570     fsm->state = ec_fsm_slave_config_state_pdo_conf;
       
   571     fsm->state(fsm); // execute immediately
       
   572 }
       
   573 
       
   574 /*****************************************************************************/
       
   575 
       
   576 /** Slave configuration state: PDO_CONF.
       
   577  */
       
   578 void ec_fsm_slave_config_state_pdo_conf(
       
   579         ec_fsm_slave_config_t *fsm /**< slave state machine */
       
   580         )
       
   581 {
       
   582     if (ec_fsm_pdo_exec(fsm->fsm_pdo))
       
   583         return;
       
   584 
       
   585     if (!ec_fsm_pdo_success(fsm->fsm_pdo)) {
       
   586         EC_WARN("Pdo configuration failed on slave %u.\n",
       
   587                 fsm->slave->ring_position);
       
   588     }
   600     }
   589 
   601 
   590     ec_fsm_slave_config_enter_fmmu(fsm);
   602     ec_fsm_slave_config_enter_fmmu(fsm);
   591 }
   603 }
   592 
   604