master/fsm_coe.c
changeset 1533 bd150d066ea2
parent 1526 66edd310830c
child 1544 cfcaf46c5b3f
equal deleted inserted replaced
1528:dbc617badc33 1533:bd150d066ea2
  1819     ec_slave_t *slave = fsm->slave;
  1819     ec_slave_t *slave = fsm->slave;
  1820     ec_master_t *master = slave->master;
  1820     ec_master_t *master = slave->master;
  1821     uint8_t *data, mbox_prot;
  1821     uint8_t *data, mbox_prot;
  1822     size_t rec_size, data_size;
  1822     size_t rec_size, data_size;
  1823     ec_sdo_request_t *request = fsm->request;
  1823     ec_sdo_request_t *request = fsm->request;
  1824     uint32_t seg_size;
       
  1825     unsigned int last_segment;
  1824     unsigned int last_segment;
  1826 
  1825 
  1827     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
  1826     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
  1828         return; // FIXME: request again?
  1827         return; // FIXME: request again?
  1829 
  1828 
  1897         fsm->retries = EC_FSM_RETRIES;
  1896         fsm->retries = EC_FSM_RETRIES;
  1898         fsm->state = ec_fsm_coe_up_seg_check;
  1897         fsm->state = ec_fsm_coe_up_seg_check;
  1899         return;
  1898         return;
  1900     }
  1899     }
  1901 
  1900 
  1902     last_segment = EC_READ_U8(data + 2) & 0x01;
  1901     data_size = rec_size - 3; /* Header of segment upload is smaller than
  1903     seg_size = (EC_READ_U8(data + 2) & 0xE) >> 1;
  1902                                  normal upload */
  1904     if (rec_size > 10) {
  1903     if (rec_size == 10) {
  1905         data_size = rec_size - 3; /* Header of segment upload is smaller than
  1904         uint8_t seg_size = (EC_READ_U8(data + 2) & 0xE) >> 1;
  1906                                      normal upload */
  1905         data_size -= seg_size;
  1907     } else { // == 10
       
  1908         /* seg_size contains the number of trailing bytes to ignore. */
       
  1909         data_size = rec_size - seg_size;
       
  1910     }
  1906     }
  1911 
  1907 
  1912     if (request->data_size + data_size > fsm->complete_size) {
  1908     if (request->data_size + data_size > fsm->complete_size) {
  1913         EC_ERR("SDO upload 0x%04X:%02X failed on slave %u: Fragment"
  1909         EC_ERR("SDO upload 0x%04X:%02X failed on slave %u: Fragment"
  1914                 " exceeding complete size!\n",
  1910                 " exceeding complete size!\n",
  1918     }
  1914     }
  1919 
  1915 
  1920     memcpy(request->data + request->data_size, data + 3, data_size);
  1916     memcpy(request->data + request->data_size, data + 3, data_size);
  1921     request->data_size += data_size;
  1917     request->data_size += data_size;
  1922 
  1918 
       
  1919     last_segment = EC_READ_U8(data + 2) & 0x01;
  1923     if (!last_segment) {
  1920     if (!last_segment) {
  1924         fsm->toggle = !fsm->toggle;
  1921         fsm->toggle = !fsm->toggle;
  1925         ec_fsm_coe_up_prepare_segment_request(fsm);
  1922         ec_fsm_coe_up_prepare_segment_request(fsm);
  1926         fsm->retries = EC_FSM_RETRIES;
  1923         fsm->retries = EC_FSM_RETRIES;
  1927         fsm->state = ec_fsm_coe_up_seg_request;
  1924         fsm->state = ec_fsm_coe_up_seg_request;