master/slave.c
changeset 612 aede068f9a74
parent 610 29489a43ecee
child 613 bf28ede88c70
equal deleted inserted replaced
611:16498ed938f4 612:aede068f9a74
   116     slave->current_state = EC_SLAVE_STATE_UNKNOWN;
   116     slave->current_state = EC_SLAVE_STATE_UNKNOWN;
   117     slave->self_configured = 0;
   117     slave->self_configured = 0;
   118     slave->error_flag = 0;
   118     slave->error_flag = 0;
   119     slave->online_state = EC_SLAVE_ONLINE;
   119     slave->online_state = EC_SLAVE_ONLINE;
   120     slave->fmmu_count = 0;
   120     slave->fmmu_count = 0;
       
   121     slave->pdos_registered = 0;
   121 
   122 
   122     slave->coupler_index = 0;
   123     slave->coupler_index = 0;
   123     slave->coupler_subindex = 0xFFFF;
   124     slave->coupler_subindex = 0xFFFF;
   124 
   125 
   125     slave->base_type = 0;
   126     slave->base_type = 0;
   310     ec_sdo_data_t *sdodata, *next_sdodata;
   311     ec_sdo_data_t *sdodata, *next_sdodata;
   311     ec_sii_sync_t *sync;
   312     ec_sii_sync_t *sync;
   312 
   313 
   313     // remove FMMU configurations
   314     // remove FMMU configurations
   314     slave->fmmu_count = 0;
   315     slave->fmmu_count = 0;
       
   316     slave->pdos_registered = 0;
   315 
   317 
   316     // free all SDO configurations
   318     // free all SDO configurations
   317     list_for_each_entry_safe(sdodata, next_sdodata, &slave->sdo_confs, list) {
   319     list_for_each_entry_safe(sdodata, next_sdodata, &slave->sdo_confs, list) {
   318         list_del(&sdodata->list);
   320         list_del(&sdodata->list);
   319         kfree(sdodata->data);
   321         kfree(sdodata->data);
   359         ec_slave_online_state_t new_state /**< new online state */
   361         ec_slave_online_state_t new_state /**< new online state */
   360         )
   362         )
   361 {
   363 {
   362     if (new_state == EC_SLAVE_OFFLINE &&
   364     if (new_state == EC_SLAVE_OFFLINE &&
   363             slave->online_state == EC_SLAVE_ONLINE) {
   365             slave->online_state == EC_SLAVE_ONLINE) {
       
   366         if (slave->pdos_registered)
       
   367             slave->master->pdo_slaves_offline++;
   364         if (slave->master->debug_level)
   368         if (slave->master->debug_level)
   365             EC_DBG("Slave %i: offline.\n", slave->ring_position);
   369             EC_DBG("Slave %i: offline.\n", slave->ring_position);
   366     }
   370     }
   367     else if (new_state == EC_SLAVE_ONLINE &&
   371     else if (new_state == EC_SLAVE_ONLINE &&
   368             slave->online_state == EC_SLAVE_OFFLINE) {
   372             slave->online_state == EC_SLAVE_OFFLINE) {
   369         slave->error_flag = 0; // clear error flag
   373         slave->error_flag = 0; // clear error flag
       
   374         if (slave->pdos_registered)
       
   375             slave->master->pdo_slaves_offline--;
   370         if (slave->master->debug_level) {
   376         if (slave->master->debug_level) {
   371             char cur_state[EC_STATE_STRING_SIZE];
   377             char cur_state[EC_STATE_STRING_SIZE];
   372             ec_state_string(slave->current_state, cur_state);
   378             ec_state_string(slave->current_state, cur_state);
   373             EC_DBG("Slave %i: online (%s).\n",
   379             EC_DBG("Slave %i: online (%s).\n",
   374                    slave->ring_position, cur_state);
   380                    slave->ring_position, cur_state);
   647     fmmu->domain = domain;
   653     fmmu->domain = domain;
   648     fmmu->sync = sync;
   654     fmmu->sync = sync;
   649     fmmu->logical_start_address = 0;
   655     fmmu->logical_start_address = 0;
   650 
   656 
   651     slave->fmmu_count++;
   657     slave->fmmu_count++;
       
   658     slave->pdos_registered = 1;
   652     
   659     
   653     ec_slave_request_state(slave, EC_SLAVE_STATE_OP);
   660     ec_slave_request_state(slave, EC_SLAVE_STATE_OP);
   654 
   661 
   655     return 0;
   662     return 0;
   656 }
   663 }