master/fsm_slave_config.c
changeset 1392 8fcc1d0987c1
parent 1374 1ca1178a3f93
child 1396 9d04cc08f40f
equal deleted inserted replaced
1391:9a547310f8d8 1392:8fcc1d0987c1
    50 void ec_fsm_slave_config_state_boot_preop(ec_fsm_slave_config_t *);
    50 void ec_fsm_slave_config_state_boot_preop(ec_fsm_slave_config_t *);
    51 void ec_fsm_slave_config_state_sdo_conf(ec_fsm_slave_config_t *);
    51 void ec_fsm_slave_config_state_sdo_conf(ec_fsm_slave_config_t *);
    52 void ec_fsm_slave_config_state_pdo_sync(ec_fsm_slave_config_t *);
    52 void ec_fsm_slave_config_state_pdo_sync(ec_fsm_slave_config_t *);
    53 void ec_fsm_slave_config_state_pdo_conf(ec_fsm_slave_config_t *);
    53 void ec_fsm_slave_config_state_pdo_conf(ec_fsm_slave_config_t *);
    54 void ec_fsm_slave_config_state_fmmu(ec_fsm_slave_config_t *);
    54 void ec_fsm_slave_config_state_fmmu(ec_fsm_slave_config_t *);
       
    55 void ec_fsm_slave_config_state_dc_cycle(ec_fsm_slave_config_t *);
       
    56 void ec_fsm_slave_config_state_dc_start(ec_fsm_slave_config_t *);
       
    57 void ec_fsm_slave_config_state_dc_assign(ec_fsm_slave_config_t *);
    55 void ec_fsm_slave_config_state_safeop(ec_fsm_slave_config_t *);
    58 void ec_fsm_slave_config_state_safeop(ec_fsm_slave_config_t *);
    56 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 *);
    57 
    60 
    58 void ec_fsm_slave_config_enter_init(ec_fsm_slave_config_t *);
    61 void ec_fsm_slave_config_enter_init(ec_fsm_slave_config_t *);
    59 void ec_fsm_slave_config_enter_clear_sync(ec_fsm_slave_config_t *);
    62 void ec_fsm_slave_config_enter_clear_sync(ec_fsm_slave_config_t *);
    61 void ec_fsm_slave_config_enter_boot_preop(ec_fsm_slave_config_t *);
    64 void ec_fsm_slave_config_enter_boot_preop(ec_fsm_slave_config_t *);
    62 void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *);
    65 void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *);
    63 void ec_fsm_slave_config_enter_pdo_conf(ec_fsm_slave_config_t *);
    66 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 *);
    67 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 *);
    68 void ec_fsm_slave_config_enter_fmmu(ec_fsm_slave_config_t *);
       
    69 void ec_fsm_slave_config_enter_dc_cycle(ec_fsm_slave_config_t *);
       
    70 void ec_fsm_slave_config_enter_dc_assign(ec_fsm_slave_config_t *);
    66 void ec_fsm_slave_config_enter_safeop(ec_fsm_slave_config_t *);
    71 void ec_fsm_slave_config_enter_safeop(ec_fsm_slave_config_t *);
    67 
    72 
    68 void ec_fsm_slave_config_state_end(ec_fsm_slave_config_t *);
    73 void ec_fsm_slave_config_state_end(ec_fsm_slave_config_t *);
    69 void ec_fsm_slave_config_state_error(ec_fsm_slave_config_t *);
    74 void ec_fsm_slave_config_state_error(ec_fsm_slave_config_t *);
    70 
    75 
   600         )
   605         )
   601 {
   606 {
   602     ec_slave_t *slave = fsm->slave;
   607     ec_slave_t *slave = fsm->slave;
   603 
   608 
   604     // No CoE configuration to be applied?
   609     // No CoE configuration to be applied?
       
   610 	// FIXME check for config
   605     if (list_empty(&slave->config->sdo_configs)) { // skip SDO configuration
   611     if (list_empty(&slave->config->sdo_configs)) { // skip SDO configuration
   606         ec_fsm_slave_config_enter_pdo_conf(fsm);
   612         ec_fsm_slave_config_enter_pdo_conf(fsm);
   607         return;
   613         return;
   608     }
   614     }
   609 
   615 
   803                 slave->config->used_fmmus);
   809                 slave->config->used_fmmus);
   804         return;
   810         return;
   805     }
   811     }
   806 
   812 
   807     if (!slave->base_fmmu_count) { // skip FMMU configuration
   813     if (!slave->base_fmmu_count) { // skip FMMU configuration
   808         ec_fsm_slave_config_enter_safeop(fsm);
   814         ec_fsm_slave_config_enter_dc_cycle(fsm);
   809         return;
   815         return;
   810     }
   816     }
   811 
   817 
   812     // configure FMMUs
   818     // configure FMMUs
   813     ec_datagram_fpwr(datagram, slave->station_address,
   819     ec_datagram_fpwr(datagram, slave->station_address,
   859                slave->ring_position);
   865                slave->ring_position);
   860         ec_datagram_print_wc_error(datagram);
   866         ec_datagram_print_wc_error(datagram);
   861         return;
   867         return;
   862     }
   868     }
   863 
   869 
       
   870 	ec_fsm_slave_config_enter_dc_cycle(fsm);
       
   871 }
       
   872 
       
   873 /*****************************************************************************/
       
   874 
       
   875 /** Check for DCs to be configured.
       
   876  */
       
   877 void ec_fsm_slave_config_enter_dc_cycle(
       
   878         ec_fsm_slave_config_t *fsm /**< slave state machine */
       
   879         )
       
   880 {
       
   881     ec_datagram_t *datagram = fsm->datagram;
       
   882     ec_slave_t *slave = fsm->slave;
       
   883     ec_slave_config_t *config = slave->config;
       
   884 
       
   885     if (config->dc_assign_activate) {
       
   886         if (!slave->base_dc_supported) {
       
   887             EC_WARN("Attempt to enable synchronized mode for slave %u,"
       
   888                     " that seems not to support distributed clocks!\n",
       
   889                     slave->ring_position);
       
   890         }
       
   891 
       
   892         // set DC cycle times
       
   893         ec_datagram_fpwr(datagram, slave->station_address, 0x09A0, 8);
       
   894         EC_WRITE_U32(datagram->data, config->dc_sync_cycle_times[0]);
       
   895         EC_WRITE_U32(datagram->data + 4, config->dc_sync_cycle_times[1]);
       
   896         fsm->retries = EC_FSM_RETRIES;
       
   897         fsm->state = ec_fsm_slave_config_state_dc_cycle;
       
   898     } else {
       
   899         ec_fsm_slave_config_enter_dc_assign(fsm);
       
   900     }
       
   901 }
       
   902 
       
   903 /*****************************************************************************/
       
   904 
       
   905 /** Slave configuration state: DC CYCLE.
       
   906  */
       
   907 void ec_fsm_slave_config_state_dc_cycle(
       
   908         ec_fsm_slave_config_t *fsm /**< slave state machine */
       
   909         )
       
   910 {
       
   911     ec_datagram_t *datagram = fsm->datagram;
       
   912     ec_slave_t *slave = fsm->slave;
       
   913 
       
   914     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
       
   915         return;
       
   916 
       
   917     if (datagram->state != EC_DATAGRAM_RECEIVED) {
       
   918         fsm->state = ec_fsm_slave_config_state_error;
       
   919         EC_ERR("Failed to receive DC cycle times datagram for slave %u"
       
   920                 " (datagram state %u).\n",
       
   921                 slave->ring_position, datagram->state);
       
   922         return;
       
   923     }
       
   924 
       
   925     if (datagram->working_counter != 1) {
       
   926         slave->error_flag = 1;
       
   927         fsm->state = ec_fsm_slave_config_state_error;
       
   928         EC_ERR("Failed to set DC cycle times of slave %u: ",
       
   929                 slave->ring_position);
       
   930         ec_datagram_print_wc_error(datagram);
       
   931         return;
       
   932     }
       
   933 
       
   934     // set DC start time
       
   935     ec_datagram_fpwr(datagram, slave->station_address, 0x0990, 8);
       
   936     EC_WRITE_U64(datagram->data, 0x37E11D600ULL); // 15 s, FIXME
       
   937     fsm->retries = EC_FSM_RETRIES;
       
   938     fsm->state = ec_fsm_slave_config_state_dc_start;
       
   939 }
       
   940 
       
   941 /*****************************************************************************/
       
   942 
       
   943 /** Slave configuration state: DC START.
       
   944  */
       
   945 void ec_fsm_slave_config_state_dc_start(
       
   946         ec_fsm_slave_config_t *fsm /**< slave state machine */
       
   947         )
       
   948 {
       
   949     ec_datagram_t *datagram = fsm->datagram;
       
   950     ec_slave_t *slave = fsm->slave;
       
   951 
       
   952     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
       
   953         return;
       
   954 
       
   955     if (datagram->state != EC_DATAGRAM_RECEIVED) {
       
   956         fsm->state = ec_fsm_slave_config_state_error;
       
   957         EC_ERR("Failed to receive DC start time datagram for slave %u"
       
   958                 " (datagram state %u).\n",
       
   959                 slave->ring_position, datagram->state);
       
   960         return;
       
   961     }
       
   962 
       
   963     if (datagram->working_counter != 1) {
       
   964         slave->error_flag = 1;
       
   965         fsm->state = ec_fsm_slave_config_state_error;
       
   966         EC_ERR("Failed to set DC start time of slave %u: ",
       
   967                 slave->ring_position);
       
   968         ec_datagram_print_wc_error(datagram);
       
   969         return;
       
   970     }
       
   971 
       
   972     ec_fsm_slave_config_enter_dc_assign(fsm);
       
   973 }
       
   974 
       
   975 /*****************************************************************************/
       
   976 
       
   977 /** Set the DC AssignActivate word.
       
   978  */
       
   979 void ec_fsm_slave_config_enter_dc_assign(
       
   980         ec_fsm_slave_config_t *fsm /**< slave state machine */
       
   981         )
       
   982 {
       
   983     ec_datagram_t *datagram = fsm->datagram;
       
   984     ec_slave_t *slave = fsm->slave;
       
   985     ec_slave_config_t *config = slave->config;
       
   986 
       
   987     // assign sync unit to EtherCAT or PDI
       
   988     ec_datagram_fpwr(datagram, slave->station_address, 0x0980, 2);
       
   989     EC_WRITE_U16(datagram->data, config->dc_assign_activate);
       
   990     fsm->retries = EC_FSM_RETRIES;
       
   991     fsm->state = ec_fsm_slave_config_state_dc_assign;
       
   992 }
       
   993 
       
   994 /*****************************************************************************/
       
   995 
       
   996 /** Slave configuration state: DC ASSIGN.
       
   997  */
       
   998 void ec_fsm_slave_config_state_dc_assign(
       
   999         ec_fsm_slave_config_t *fsm /**< slave state machine */
       
  1000         )
       
  1001 {
       
  1002     ec_datagram_t *datagram = fsm->datagram;
       
  1003     ec_slave_t *slave = fsm->slave;
       
  1004 
       
  1005     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
       
  1006         return;
       
  1007 
       
  1008     if (datagram->state != EC_DATAGRAM_RECEIVED) {
       
  1009         fsm->state = ec_fsm_slave_config_state_error;
       
  1010         EC_ERR("Failed to receive DC activation datagram for slave %u"
       
  1011                 " (datagram state %u).\n",
       
  1012                 slave->ring_position, datagram->state);
       
  1013         return;
       
  1014     }
       
  1015 
       
  1016     if (datagram->working_counter != 1) {
       
  1017         slave->error_flag = 1;
       
  1018         fsm->state = ec_fsm_slave_config_state_error;
       
  1019         EC_ERR("Failed to set DC cyclia operation state of slave %u: ",
       
  1020                 slave->ring_position);
       
  1021         ec_datagram_print_wc_error(datagram);
       
  1022         return;
       
  1023     }
       
  1024 
   864     ec_fsm_slave_config_enter_safeop(fsm);
  1025     ec_fsm_slave_config_enter_safeop(fsm);
   865 }
  1026 }
   866 
  1027 
   867 /*****************************************************************************/
  1028 /*****************************************************************************/
   868 
  1029