2504 CoE state: DICT DESC RESPONSE. |
2504 CoE state: DICT DESC RESPONSE. |
2505 */ |
2505 */ |
2506 |
2506 |
2507 void ec_fsm_coe_dict_desc_response(ec_fsm_t *fsm /**< finite state machine */) |
2507 void ec_fsm_coe_dict_desc_response(ec_fsm_t *fsm /**< finite state machine */) |
2508 { |
2508 { |
2509 ec_master_t *master = fsm->master; |
|
2510 ec_datagram_t *datagram = &fsm->datagram; |
2509 ec_datagram_t *datagram = &fsm->datagram; |
2511 ec_slave_t *slave = fsm->slave; |
2510 ec_slave_t *slave = fsm->slave; |
2512 ec_sdo_t *sdo = fsm->coe_sdo; |
2511 ec_sdo_t *sdo = fsm->coe_sdo; |
2513 uint8_t *data, mbox_prot; |
2512 uint8_t *data, mbox_prot; |
2514 size_t rec_size, name_size; |
2513 size_t rec_size, name_size; |
2580 EC_ERR("Fragment follows (not implemented)!\n"); |
2579 EC_ERR("Fragment follows (not implemented)!\n"); |
2581 fsm->coe_state = ec_fsm_error; |
2580 fsm->coe_state = ec_fsm_error; |
2582 return; |
2581 return; |
2583 } |
2582 } |
2584 |
2583 |
2585 if (!sdo->subindices) { // no entries |
2584 // start fetching entries |
2586 // another SDO description to fetch? |
2585 |
2587 if (fsm->coe_sdo->list.next != &slave->sdo_dictionary) { |
2586 fsm->coe_subindex = 0; |
2588 fsm->coe_sdo = list_entry(fsm->coe_sdo->list.next, ec_sdo_t, list); |
|
2589 |
|
2590 if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 8))) { |
|
2591 fsm->coe_state = ec_fsm_error; |
|
2592 return; |
|
2593 } |
|
2594 |
|
2595 EC_WRITE_U16(data, 0x8 << 12); // SDO information |
|
2596 EC_WRITE_U8 (data + 2, 0x03); // Get object description request |
|
2597 EC_WRITE_U8 (data + 3, 0x00); |
|
2598 EC_WRITE_U16(data + 4, 0x0000); |
|
2599 EC_WRITE_U16(data + 6, fsm->coe_sdo->index); // SDO index |
|
2600 |
|
2601 ec_master_queue_datagram(fsm->master, datagram); |
|
2602 fsm->coe_state = ec_fsm_coe_dict_desc_request; |
|
2603 return; |
|
2604 } |
|
2605 |
|
2606 if (master->debug_level) { |
|
2607 EC_DBG("Finished fetching SDO descriptions.\n"); |
|
2608 } |
|
2609 |
|
2610 fsm->coe_state = ec_fsm_end; |
|
2611 return; |
|
2612 } |
|
2613 |
|
2614 fsm->coe_subindex = 1; |
|
2615 |
2587 |
2616 if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10))) { |
2588 if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10))) { |
2617 fsm->coe_state = ec_fsm_error; |
2589 fsm->coe_state = ec_fsm_error; |
2618 return; |
2590 return; |
2619 } |
2591 } |