master/fsm_master.c
changeset 831 ded9519c8d6e
parent 830 d83d92e1a919
child 834 0791aac03180
equal deleted inserted replaced
830:d83d92e1a919 831:ded9519c8d6e
    58 void ec_fsm_master_state_configure_slave(ec_fsm_master_t *);
    58 void ec_fsm_master_state_configure_slave(ec_fsm_master_t *);
    59 void ec_fsm_master_state_clear_addresses(ec_fsm_master_t *);
    59 void ec_fsm_master_state_clear_addresses(ec_fsm_master_t *);
    60 void ec_fsm_master_state_scan_slaves(ec_fsm_master_t *);
    60 void ec_fsm_master_state_scan_slaves(ec_fsm_master_t *);
    61 void ec_fsm_master_state_write_eeprom(ec_fsm_master_t *);
    61 void ec_fsm_master_state_write_eeprom(ec_fsm_master_t *);
    62 void ec_fsm_master_state_sdodict(ec_fsm_master_t *);
    62 void ec_fsm_master_state_sdodict(ec_fsm_master_t *);
    63 void ec_fsm_master_state_pdomap(ec_fsm_master_t *);
       
    64 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *);
    63 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *);
    65 void ec_fsm_master_state_end(ec_fsm_master_t *);
    64 void ec_fsm_master_state_end(ec_fsm_master_t *);
    66 void ec_fsm_master_state_error(ec_fsm_master_t *);
    65 void ec_fsm_master_state_error(ec_fsm_master_t *);
    67 
    66 
    68 /*****************************************************************************/
    67 /*****************************************************************************/
    86     fsm->validate = 0;
    85     fsm->validate = 0;
    87     fsm->tainted = 0;
    86     fsm->tainted = 0;
    88 
    87 
    89     // init sub-state-machines
    88     // init sub-state-machines
    90     ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram);
    89     ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram);
    91     ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram);
    90     ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram,
       
    91             &fsm->fsm_slave_config, &fsm->fsm_coe_map);
    92     ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram);
    92     ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram);
    93     ec_fsm_change_init(&fsm->fsm_change, fsm->datagram);
    93     ec_fsm_change_init(&fsm->fsm_change, fsm->datagram);
    94     ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram);
    94     ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram);
    95     ec_fsm_coe_map_init(&fsm->fsm_coe_map, &fsm->fsm_coe);
    95     ec_fsm_coe_map_init(&fsm->fsm_coe_map, &fsm->fsm_coe);
    96 }
    96 }
   385             list_entry(master->sdo_requests.next, ec_sdo_request_t, list);
   385             list_entry(master->sdo_requests.next, ec_sdo_request_t, list);
   386         list_del_init(&request->list); // dequeue
   386         list_del_init(&request->list); // dequeue
   387         request->state = EC_REQUEST_IN_PROGRESS;
   387         request->state = EC_REQUEST_IN_PROGRESS;
   388         up(&master->sdo_sem);
   388         up(&master->sdo_sem);
   389 
   389 
   390         slave = request->entry->sdo->slave;
   390         slave = request->slave;
   391         if (slave->current_state == EC_SLAVE_STATE_INIT ||
   391         if (slave->current_state == EC_SLAVE_STATE_INIT ||
   392                 slave->online_state == EC_SLAVE_OFFLINE ||
   392                 slave->online_state == EC_SLAVE_OFFLINE ||
   393                 slave->error_flag) {
   393                 slave->error_flag) {
   394             EC_ERR("Discarding Sdo request, slave %i not ready.\n",
   394             EC_ERR("Discarding Sdo request, slave %i not ready.\n",
   395                     slave->ring_position);
   395                     slave->ring_position);
   524             ec_fsm_coe_dictionary(&fsm->fsm_coe, slave);
   524             ec_fsm_coe_dictionary(&fsm->fsm_coe, slave);
   525             ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
   525             ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
   526             return;
   526             return;
   527         }
   527         }
   528 
   528 
   529         // check, if slaves have their Pdo mapping to be read.
       
   530         list_for_each_entry(slave, &master->slaves, list) {
       
   531             if (!(slave->sii_mailbox_protocols & EC_MBOX_COE)
       
   532                 || slave->pdo_mapping_fetched
       
   533                 || !slave->sdo_dictionary_fetched
       
   534                 || slave->current_state == EC_SLAVE_STATE_INIT
       
   535                 || slave->online_state == EC_SLAVE_OFFLINE) continue;
       
   536 
       
   537             if (master->debug_level) {
       
   538                 EC_DBG("Fetching Pdo mapping from slave %i via CoE.\n",
       
   539                        slave->ring_position);
       
   540             }
       
   541 
       
   542             slave->pdo_mapping_fetched = 1;
       
   543 
       
   544             // start fetching Pdo mapping
       
   545             fsm->idle = 0;
       
   546             fsm->state = ec_fsm_master_state_pdomap;
       
   547             ec_fsm_coe_map_start(&fsm->fsm_coe_map, slave);
       
   548             ec_fsm_coe_map_exec(&fsm->fsm_coe_map); // execute immediately
       
   549             return;
       
   550         }
       
   551 
       
   552         // check for pending EEPROM write operations.
   529         // check for pending EEPROM write operations.
   553         if (ec_fsm_master_action_process_eeprom(fsm))
   530         if (ec_fsm_master_action_process_eeprom(fsm))
   554             return; // EEPROM write request found
   531             return; // EEPROM write request found
   555     }
   532     }
   556 
   533 
  1037 }
  1014 }
  1038 
  1015 
  1039 /*****************************************************************************/
  1016 /*****************************************************************************/
  1040 
  1017 
  1041 /**
  1018 /**
  1042  * Scan the Pdo mapping of a slave.
  1019    Master state: SDO REQUEST.
  1043  */
       
  1044 
       
  1045 void ec_fsm_master_state_pdomap(
       
  1046         ec_fsm_master_t *fsm /**< master state machine */
       
  1047         )
       
  1048 {
       
  1049     if (ec_fsm_coe_map_exec(&fsm->fsm_coe_map)) return;
       
  1050 
       
  1051     if (!ec_fsm_coe_map_success(&fsm->fsm_coe_map)) {
       
  1052         fsm->state = ec_fsm_master_state_error;
       
  1053         return;
       
  1054     }
       
  1055 
       
  1056     // fetching of Pdo mapping finished
       
  1057     fsm->state = ec_fsm_master_state_end;
       
  1058 }
       
  1059 
       
  1060 /*****************************************************************************/
       
  1061 
       
  1062 /**
       
  1063    Master state: Sdo REQUEST.
       
  1064 */
  1020 */
  1065 
  1021 
  1066 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */)
  1022 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */)
  1067 {
  1023 {
  1068     ec_master_t *master = fsm->master;
  1024     ec_master_t *master = fsm->master;