master/fsm_pdo.c
branchstable-1.5
changeset 2421 bc2d4bf9cbe5
parent 1964 9327c261056f
child 2434 fa52128477f6
equal deleted inserted replaced
2420:69056c46aa4d 2421:bc2d4bf9cbe5
   282         ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   282         ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   283         return;
   283         return;
   284     }
   284     }
   285 
   285 
   286     // finished reading PDO configuration
   286     // finished reading PDO configuration
   287     
   287 
   288     ec_pdo_list_copy(&fsm->sync->pdos, &fsm->pdos);
   288     ec_pdo_list_copy(&fsm->sync->pdos, &fsm->pdos);
   289     ec_pdo_list_clear_pdos(&fsm->pdos);
   289     ec_pdo_list_clear_pdos(&fsm->pdos);
   290 
   290 
   291     // next sync manager
   291     // next sync manager
   292     ec_fsm_pdo_read_action_next_sync(fsm);
   292     ec_fsm_pdo_read_action_next_sync(fsm);
   387 ec_pdo_t *ec_fsm_pdo_conf_action_next_pdo(
   387 ec_pdo_t *ec_fsm_pdo_conf_action_next_pdo(
   388         const ec_fsm_pdo_t *fsm, /**< PDO configuration state machine. */
   388         const ec_fsm_pdo_t *fsm, /**< PDO configuration state machine. */
   389         const struct list_head *list /**< current PDO list item */
   389         const struct list_head *list /**< current PDO list item */
   390         )
   390         )
   391 {
   391 {
   392     list = list->next; 
   392     list = list->next;
   393     if (list == &fsm->pdos.list)
   393     if (list == &fsm->pdos.list)
   394         return NULL; // no next PDO
   394         return NULL; // no next PDO
   395     return list_entry(list, ec_pdo_t, list);
   395     return list_entry(list, ec_pdo_t, list);
   396 }
   396 }
   397 
   397 
   404         )
   404         )
   405 {
   405 {
   406     fsm->sync_index++;
   406     fsm->sync_index++;
   407 
   407 
   408     for (; fsm->sync_index < EC_MAX_SYNC_MANAGERS; fsm->sync_index++) {
   408     for (; fsm->sync_index < EC_MAX_SYNC_MANAGERS; fsm->sync_index++) {
   409         if (!fsm->slave->config) { 
   409         if (!fsm->slave->config) {
   410             // slave configuration removed in the meantime
   410             // slave configuration removed in the meantime
   411             fsm->state = ec_fsm_pdo_state_error;
   411             fsm->state = ec_fsm_pdo_state_error;
   412             return;
   412             return;
   413         }
   413         }
   414 
   414 
   416                     &fsm->slave->config->sync_configs[fsm->sync_index].pdos))
   416                     &fsm->slave->config->sync_configs[fsm->sync_index].pdos))
   417         {
   417         {
   418             fsm->state = ec_fsm_pdo_state_error;
   418             fsm->state = ec_fsm_pdo_state_error;
   419             return;
   419             return;
   420         }
   420         }
   421         
   421 
   422         if (!(fsm->sync = ec_slave_get_sync(fsm->slave, fsm->sync_index))) {
   422         if (!(fsm->sync = ec_slave_get_sync(fsm->slave, fsm->sync_index))) {
   423             if (!list_empty(&fsm->pdos.list))
   423             if (!list_empty(&fsm->pdos.list))
   424                 EC_SLAVE_WARN(fsm->slave, "PDOs configured for SM%u,"
   424                 EC_SLAVE_WARN(fsm->slave, "PDOs configured for SM%u,"
   425                         " but slave does not provide the"
   425                         " but slave does not provide the"
   426                         " sync manager information!\n",
   426                         " sync manager information!\n",
   462     }
   462     }
   463 
   463 
   464     if (list_empty(&fsm->slave_pdo.entries)) {
   464     if (list_empty(&fsm->slave_pdo.entries)) {
   465         EC_SLAVE_DBG(fsm->slave, 1, "Reading mapping of PDO 0x%04X.\n",
   465         EC_SLAVE_DBG(fsm->slave, 1, "Reading mapping of PDO 0x%04X.\n",
   466                 fsm->pdo->index);
   466                 fsm->pdo->index);
   467             
   467 
   468         // pdo mapping is unknown; start loading it
   468         // pdo mapping is unknown; start loading it
   469         ec_fsm_pdo_entry_start_reading(&fsm->fsm_pdo_entry, fsm->slave,
   469         ec_fsm_pdo_entry_start_reading(&fsm->fsm_pdo_entry, fsm->slave,
   470                 &fsm->slave_pdo);
   470                 &fsm->slave_pdo);
   471         fsm->state = ec_fsm_pdo_conf_state_read_mapping;
   471         fsm->state = ec_fsm_pdo_conf_state_read_mapping;
   472         fsm->state(fsm); // execute immediately
   472         fsm->state(fsm); // execute immediately
   637 
   637 
   638     // the sync manager's assigned PDOs have been cleared
   638     // the sync manager's assigned PDOs have been cleared
   639     ec_pdo_list_clear_pdos(&fsm->sync->pdos);
   639     ec_pdo_list_clear_pdos(&fsm->sync->pdos);
   640 
   640 
   641     // assign all PDOs belonging to the current sync manager
   641     // assign all PDOs belonging to the current sync manager
   642     
   642 
   643     // find first PDO
   643     // find first PDO
   644     if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) {
   644     if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) {
   645 
   645 
   646         // check for mapping to be altered
   646         // check for mapping to be altered
   647         ec_fsm_pdo_conf_action_next_sync(fsm);
   647         ec_fsm_pdo_conf_action_next_sync(fsm);
   667             0x1C10 + fsm->sync_index, fsm->pdo_pos);
   667             0x1C10 + fsm->sync_index, fsm->pdo_pos);
   668     ecrt_sdo_request_write(&fsm->request);
   668     ecrt_sdo_request_write(&fsm->request);
   669 
   669 
   670     EC_SLAVE_DBG(fsm->slave, 1, "Assigning PDO 0x%04X at position %u.\n",
   670     EC_SLAVE_DBG(fsm->slave, 1, "Assigning PDO 0x%04X at position %u.\n",
   671             fsm->pdo->index, fsm->pdo_pos);
   671             fsm->pdo->index, fsm->pdo_pos);
   672     
   672 
   673     fsm->state = ec_fsm_pdo_conf_state_assign_pdo;
   673     fsm->state = ec_fsm_pdo_conf_state_assign_pdo;
   674     ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   674     ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   675     ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   675     ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   676 }
   676 }
   677 
   677 
   704         ecrt_sdo_request_write(&fsm->request);
   704         ecrt_sdo_request_write(&fsm->request);
   705 
   705 
   706         EC_SLAVE_DBG(fsm->slave, 1,
   706         EC_SLAVE_DBG(fsm->slave, 1,
   707                 "Setting number of assigned PDOs to %u.\n",
   707                 "Setting number of assigned PDOs to %u.\n",
   708                 fsm->pdo_pos);
   708                 fsm->pdo_pos);
   709         
   709 
   710         fsm->state = ec_fsm_pdo_conf_state_set_pdo_count;
   710         fsm->state = ec_fsm_pdo_conf_state_set_pdo_count;
   711         ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   711         ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   712         ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   712         ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   713         return;
   713         return;
   714     }
   714     }
   715 
   715 
   716     // add next PDO to assignment
   716     // add next PDO to assignment
   717     fsm->pdo_pos++;
   717     fsm->pdo_pos++;
   718     ec_fsm_pdo_conf_action_assign_pdo(fsm);
   718     ec_fsm_pdo_conf_action_assign_pdo(fsm);
   719 }
   719 }
   720     
   720 
   721 /*****************************************************************************/
   721 /*****************************************************************************/
   722 
   722 
   723 /** Set the number of assigned PDOs.
   723 /** Set the number of assigned PDOs.
   724  */
   724  */
   725 void ec_fsm_pdo_conf_state_set_pdo_count(
   725 void ec_fsm_pdo_conf_state_set_pdo_count(