Fix errornous segmented download CompleteAccess
On the final segment the SDO shoud be written using the pre-allocated buffer used to store segments during transfer. When completed the pre-allocated buffer is written to the SDO. This fix change to correct complete_access_subindex_loop - buffer, ESCvar.mbxdata - to use the lookup indexes for ESCVar.index -> nidx and ESCvar.subindex -> nsub.fix/download_segmented_completeaccess
parent
311977e47a
commit
df0d169eef
|
@ -1027,32 +1027,42 @@ static void SDO_downloadsegment (void)
|
||||||
|
|
||||||
if (coesdo->command & COE_COMMAND_LASTSEGMENTBIT)
|
if (coesdo->command & COE_COMMAND_LASTSEGMENTBIT)
|
||||||
{
|
{
|
||||||
/* last segment */
|
|
||||||
ESCvar.segmented = 0;
|
|
||||||
|
|
||||||
if(ESCvar.flags == COMPLETE_ACCESS_FLAG)
|
if(ESCvar.flags == COMPLETE_ACCESS_FLAG)
|
||||||
{
|
{
|
||||||
int16_t nidx;
|
int16_t nidx, nsub;
|
||||||
|
|
||||||
|
if(ESCvar.frags > ESCvar.fragsleft + size)
|
||||||
|
{
|
||||||
|
set_state_idle (0, ESCvar.index, ESCvar.subindex, ABORT_TYPEMISMATCH);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
nidx = SDO_findobject(ESCvar.index);
|
nidx = SDO_findobject(ESCvar.index);
|
||||||
if (nidx < 0)
|
nsub = SDO_findsubindex (nidx, ESCvar.subindex);
|
||||||
|
|
||||||
|
if ((nidx < 0) || (nsub < 0))
|
||||||
{
|
{
|
||||||
set_state_idle (0, ESCvar.index, ESCvar.subindex, ABORT_NOOBJECT);
|
set_state_idle (0, ESCvar.index, ESCvar.subindex, ABORT_NOOBJECT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy download data to subindexes */
|
/* copy download data to subindexes */
|
||||||
const _objd *objd = SDOobjects[nidx].objdesc;
|
const _objd *objd = SDOobjects[nidx].objdesc;
|
||||||
complete_access_subindex_loop(objd,
|
complete_access_subindex_loop(objd,
|
||||||
ESCvar.index,
|
nidx,
|
||||||
ESCvar.subindex,
|
nsub,
|
||||||
(uint8_t *)ESCvar.data,
|
(uint8_t *)ESCvar.mbxdata,
|
||||||
DOWNLOAD,
|
DOWNLOAD,
|
||||||
ESCvar.frags);
|
ESCvar.frags);
|
||||||
|
|
||||||
}
|
}
|
||||||
/* external object write handler */
|
/* last segment */
|
||||||
uint32_t abort = ESC_download_post_objecthandler
|
ESCvar.segmented = 0;
|
||||||
(ESCvar.index, ESCvar.subindex, ESCvar.flags);
|
ESCvar.frags = 0;
|
||||||
|
ESCvar.fragsleft = 0;
|
||||||
|
/* external object write handler */
|
||||||
|
uint32_t abort = ESC_download_post_objecthandler
|
||||||
|
(ESCvar.index, ESCvar.subindex, ESCvar.flags);
|
||||||
if (abort != 0)
|
if (abort != 0)
|
||||||
{
|
{
|
||||||
set_state_idle (MBXout, ESCvar.index, ESCvar.subindex, abort);
|
set_state_idle (MBXout, ESCvar.index, ESCvar.subindex, abort);
|
||||||
|
@ -1063,6 +1073,8 @@ static void SDO_downloadsegment (void)
|
||||||
{
|
{
|
||||||
/* more segmented transfer needed: increase offset */
|
/* more segmented transfer needed: increase offset */
|
||||||
ESCvar.data += size;
|
ESCvar.data += size;
|
||||||
|
/* number of bytes done */
|
||||||
|
ESCvar.fragsleft += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
MBXcontrol[MBXout].state = MBXstate_outreq;
|
MBXcontrol[MBXout].state = MBXstate_outreq;
|
||||||
|
|
Loading…
Reference in New Issue