master/fsm_coe_map.c
changeset 1055 2be8918682fa
parent 1053 0cb9604cbaa7
child 1058 1c5b19c1ae9d
equal deleted inserted replaced
1054:4c16fe64b403 1055:2be8918682fa
    53 void ec_fsm_coe_map_state_pdo_entry(ec_fsm_coe_map_t *);
    53 void ec_fsm_coe_map_state_pdo_entry(ec_fsm_coe_map_t *);
    54 
    54 
    55 void ec_fsm_coe_map_state_end(ec_fsm_coe_map_t *);
    55 void ec_fsm_coe_map_state_end(ec_fsm_coe_map_t *);
    56 void ec_fsm_coe_map_state_error(ec_fsm_coe_map_t *);
    56 void ec_fsm_coe_map_state_error(ec_fsm_coe_map_t *);
    57 
    57 
    58 void ec_fsm_coe_map_action_next_dir(ec_fsm_coe_map_t *);
    58 void ec_fsm_coe_map_action_next_sync(ec_fsm_coe_map_t *);
    59 void ec_fsm_coe_map_action_next_pdo(ec_fsm_coe_map_t *);
    59 void ec_fsm_coe_map_action_next_pdo(ec_fsm_coe_map_t *);
    60 void ec_fsm_coe_map_action_next_pdo_entry(ec_fsm_coe_map_t *);
    60 void ec_fsm_coe_map_action_next_pdo_entry(ec_fsm_coe_map_t *);
    61 
    61 
    62 /*****************************************************************************/
    62 /*****************************************************************************/
    63 
    63 
   132 
   132 
   133 /******************************************************************************
   133 /******************************************************************************
   134  *  state functions
   134  *  state functions
   135  *****************************************************************************/
   135  *****************************************************************************/
   136 
   136 
   137 /**
   137 /** Start reading Pdo assignment.
   138  * Start reading Pdo assignment.
   138  */
   139  */
       
   140 
       
   141 void ec_fsm_coe_map_state_start(
   139 void ec_fsm_coe_map_state_start(
   142         ec_fsm_coe_map_t *fsm /**< finite state machine */
   140         ec_fsm_coe_map_t *fsm /**< finite state machine */
   143         )
   141         )
   144 {
   142 {
   145     // read Pdo assignment for first direction
   143     // read Pdo assignment for first sync manager
   146     fsm->dir = (ec_direction_t) -1; // next is EC_DIR_OUTPUT
   144     fsm->sync_index = 0xff; // next is 0
   147     ec_fsm_coe_map_action_next_dir(fsm);
   145     ec_fsm_coe_map_action_next_sync(fsm);
   148 }
   146 }
   149 
   147 
   150 /*****************************************************************************/
   148 /*****************************************************************************/
   151 
   149 
   152 /**
   150 /** Read Pdo assignment of next sync manager.
   153  * Read Pdo assignment of next direction manager.
   151  */
   154  */
   152 void ec_fsm_coe_map_action_next_sync(
   155 
   153         ec_fsm_coe_map_t *fsm /**< Finite state machine */
   156 void ec_fsm_coe_map_action_next_dir(
       
   157         ec_fsm_coe_map_t *fsm /**< finite state machine */
       
   158         )
   154         )
   159 {
   155 {
   160     ec_slave_t *slave = fsm->slave;
   156     ec_slave_t *slave = fsm->slave;
   161 
   157 
   162     fsm->dir++;
   158     fsm->sync_index++;
   163 
   159 
   164     if (slave->master->debug_level)
   160     if (slave->master->debug_level)
   165         EC_DBG("Processing dir %u of slave %u.\n",
   161         EC_DBG("Processing SM%u of slave %u.\n",
   166                 fsm->dir, slave->ring_position);
   162                 fsm->sync_index, slave->ring_position);
   167 
   163 
   168     for (; fsm->dir <= EC_DIR_INPUT; fsm->dir++) {
   164     for (; fsm->sync_index < EC_MAX_SYNCS; fsm->sync_index++) {
   169 
   165         if (!(fsm->sync = ec_slave_get_sync(slave, fsm->sync_index))) {
   170         if (!(fsm->sync = ec_slave_get_pdo_sync(slave, fsm->dir))) {
       
   171             if (slave->master->debug_level)
   166             if (slave->master->debug_level)
   172                 EC_DBG("No sync manager for direction %u!\n", fsm->dir);
   167                 EC_DBG("Slave %u does not provide a configuration for "
       
   168                         "SM%u!\n", fsm->slave->ring_position, fsm->sync_index);
   173             continue;
   169             continue;
   174         }
   170         }
   175 
   171 
   176         fsm->sync_sdo_index = 0x1C10 + fsm->sync->index;
   172         fsm->sync_sdo_index = 0x1C10 + fsm->sync_index;
   177 
   173 
   178         if (slave->master->debug_level)
   174         if (slave->master->debug_level)
   179             EC_DBG("Reading Pdo assignment of sync manager %u of slave %u.\n",
   175             EC_DBG("Reading Pdo assignment of SM%u of slave %u.\n",
   180                     fsm->sync->index, slave->ring_position);
   176                     fsm->sync_index, slave->ring_position);
   181 
   177 
   182         ec_pdo_list_clear_pdos(&fsm->pdos);
   178         ec_pdo_list_clear_pdos(&fsm->pdos);
   183 
   179 
   184         ec_sdo_request_address(&fsm->request, fsm->sync_sdo_index, 0);
   180         ec_sdo_request_address(&fsm->request, fsm->sync_sdo_index, 0);
   185         ecrt_sdo_request_read(&fsm->request);
   181         ecrt_sdo_request_read(&fsm->request);
   224         return;
   220         return;
   225     }
   221     }
   226     fsm->sync_subindices = EC_READ_U8(fsm->request.data);
   222     fsm->sync_subindices = EC_READ_U8(fsm->request.data);
   227 
   223 
   228     if (fsm->slave->master->debug_level)
   224     if (fsm->slave->master->debug_level)
   229         EC_DBG("  %u Pdos assigned.\n", fsm->sync_subindices);
   225         EC_DBG("%u Pdos assigned.\n", fsm->sync_subindices);
   230 
   226 
   231     // read first Pdo
   227     // read first Pdo
   232     fsm->sync_subindex = 1;
   228     fsm->sync_subindex = 1;
   233     ec_fsm_coe_map_action_next_pdo(fsm);
   229     ec_fsm_coe_map_action_next_pdo(fsm);
   234 }
   230 }
   261     }
   257     }
   262 
   258 
   263     fsm->sync->assign_source = EC_ASSIGN_COE;
   259     fsm->sync->assign_source = EC_ASSIGN_COE;
   264     ec_pdo_list_clear_pdos(&fsm->pdos);
   260     ec_pdo_list_clear_pdos(&fsm->pdos);
   265 
   261 
   266     // next direction
   262     // next sync manager
   267     ec_fsm_coe_map_action_next_dir(fsm);
   263     ec_fsm_coe_map_action_next_sync(fsm);
   268 }
   264 }
   269 
   265 
   270 /*****************************************************************************/
   266 /*****************************************************************************/
   271 
   267 
   272 /**
   268 /**
   302         return;
   298         return;
   303     }
   299     }
   304 
   300 
   305     ec_pdo_init(fsm->pdo);
   301     ec_pdo_init(fsm->pdo);
   306     fsm->pdo->index = EC_READ_U16(fsm->request.data);
   302     fsm->pdo->index = EC_READ_U16(fsm->request.data);
   307     fsm->pdo->dir = ec_sync_direction(fsm->sync);
   303     fsm->pdo->sync_index = fsm->sync_index;
   308 
   304 
   309     if (fsm->slave->master->debug_level)
   305     if (fsm->slave->master->debug_level)
   310         EC_DBG("  Pdo 0x%04X.\n", fsm->pdo->index);
   306         EC_DBG("Pdo 0x%04X.\n", fsm->pdo->index);
   311 
   307 
   312     list_add_tail(&fsm->pdo->list, &fsm->pdos.list);
   308     list_add_tail(&fsm->pdo->list, &fsm->pdos.list);
   313 
   309 
   314     ec_sdo_request_address(&fsm->request, fsm->pdo->index, 0);
   310     ec_sdo_request_address(&fsm->request, fsm->pdo->index, 0);
   315     ecrt_sdo_request_read(&fsm->request);
   311     ecrt_sdo_request_read(&fsm->request);
   346         return;
   342         return;
   347     }
   343     }
   348     fsm->pdo_subindices = EC_READ_U8(fsm->request.data);
   344     fsm->pdo_subindices = EC_READ_U8(fsm->request.data);
   349 
   345 
   350     if (fsm->slave->master->debug_level)
   346     if (fsm->slave->master->debug_level)
   351         EC_DBG("    %u Pdo entries mapped.\n", fsm->pdo_subindices);
   347         EC_DBG("%u Pdo entries mapped.\n", fsm->pdo_subindices);
   352 
   348 
   353     // read first Pdo entry
   349     // read first Pdo entry
   354     fsm->pdo_subindex = 1;
   350     fsm->pdo_subindex = 1;
   355     ec_fsm_coe_map_action_next_pdo_entry(fsm);
   351     ec_fsm_coe_map_action_next_pdo_entry(fsm);
   356 }
   352 }
   430                 return;
   426                 return;
   431             }
   427             }
   432         }
   428         }
   433 
   429 
   434         if (fsm->slave->master->debug_level) {
   430         if (fsm->slave->master->debug_level) {
   435             EC_DBG("    Pdo entry 0x%04X:%02X, %u bit,  \"%s\".\n",
   431             EC_DBG("Pdo entry 0x%04X:%02X, %u bit, \"%s\".\n",
   436                     pdo_entry->index, pdo_entry->subindex,
   432                     pdo_entry->index, pdo_entry->subindex,
   437                     pdo_entry->bit_length,
   433                     pdo_entry->bit_length,
   438                     pdo_entry->name ? pdo_entry->name : "???");
   434                     pdo_entry->name ? pdo_entry->name : "???");
   439         }
   435         }
   440 
   436