master/fsm.c
changeset 429 b21b000e88e3
parent 428 2731a2fcc18d
child 430 74754f45d5fa
equal deleted inserted replaced
428:2731a2fcc18d 429:b21b000e88e3
  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     }