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); |