Merge pull request #75 from lrsdnlssn/master
Add/extend support for upload and download callbackspull/76/head
commit
3792b58fea
|
@ -40,14 +40,12 @@ extern uint8_t * txpdo;
|
||||||
* @param[in] sub-index = sub-index of SDO download request to check
|
* @param[in] sub-index = sub-index of SDO download request to check
|
||||||
* @return SDO abort code, or 0 on success
|
* @return SDO abort code, or 0 on success
|
||||||
*/
|
*/
|
||||||
uint32_t ESC_pre_objecthandler (uint16_t index,
|
uint32_t ESC_download_pre_objecthandler (uint16_t index,
|
||||||
uint8_t subindex,
|
uint8_t subindex,
|
||||||
void * data,
|
void * data,
|
||||||
size_t size,
|
size_t size,
|
||||||
uint16_t flags)
|
uint16_t flags)
|
||||||
{
|
{
|
||||||
uint32_t abort = 0;
|
|
||||||
|
|
||||||
if (IS_RXPDO (index) ||
|
if (IS_RXPDO (index) ||
|
||||||
IS_TXPDO (index) ||
|
IS_TXPDO (index) ||
|
||||||
index == RX_PDO_OBJIDX ||
|
index == RX_PDO_OBJIDX ||
|
||||||
|
@ -55,20 +53,20 @@ uint32_t ESC_pre_objecthandler (uint16_t index,
|
||||||
{
|
{
|
||||||
if (subindex > 0 && COE_maxSub (index) != 0)
|
if (subindex > 0 && COE_maxSub (index) != 0)
|
||||||
{
|
{
|
||||||
abort = ABORT_SUBINDEX0_NOT_ZERO;
|
return ABORT_SUBINDEX0_NOT_ZERO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ESCvar.pre_object_download_hook)
|
if (ESCvar.pre_object_download_hook)
|
||||||
{
|
{
|
||||||
abort = (ESCvar.pre_object_download_hook) (index,
|
return (ESCvar.pre_object_download_hook) (index,
|
||||||
subindex,
|
subindex,
|
||||||
data,
|
data,
|
||||||
size,
|
size,
|
||||||
flags);
|
flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return abort;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Hook called from the slave stack SDO Download handler to act on
|
/** Hook called from the slave stack SDO Download handler to act on
|
||||||
|
@ -76,13 +74,57 @@ uint32_t ESC_pre_objecthandler (uint16_t index,
|
||||||
*
|
*
|
||||||
* @param[in] index = index of SDO download request to handle
|
* @param[in] index = index of SDO download request to handle
|
||||||
* @param[in] sub-index = sub-index of SDO download request to handle
|
* @param[in] sub-index = sub-index of SDO download request to handle
|
||||||
|
* @return SDO abort code, or 0 on success
|
||||||
*/
|
*/
|
||||||
void ESC_objecthandler (uint16_t index, uint8_t subindex, uint16_t flags)
|
uint32_t ESC_download_post_objecthandler (uint16_t index, uint8_t subindex, uint16_t flags)
|
||||||
{
|
{
|
||||||
if (ESCvar.post_object_download_hook != NULL)
|
if (ESCvar.post_object_download_hook != NULL)
|
||||||
{
|
{
|
||||||
(ESCvar.post_object_download_hook)(index, subindex, flags);
|
return (ESCvar.post_object_download_hook)(index, subindex, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Function to pre-qualify the incoming SDO upload.
|
||||||
|
*
|
||||||
|
* @param[in] index = index of SDO upload request to handle
|
||||||
|
* @param[in] sub-index = sub-index of SDO upload request to handle
|
||||||
|
* @return SDO abort code, or 0 on success
|
||||||
|
*/
|
||||||
|
uint32_t ESC_upload_pre_objecthandler (uint16_t index,
|
||||||
|
uint8_t subindex,
|
||||||
|
void * data,
|
||||||
|
size_t size,
|
||||||
|
uint16_t flags)
|
||||||
|
{
|
||||||
|
if (ESCvar.pre_object_upload_hook != NULL)
|
||||||
|
{
|
||||||
|
return (ESCvar.pre_object_upload_hook) (index,
|
||||||
|
subindex,
|
||||||
|
data,
|
||||||
|
size,
|
||||||
|
flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Hook called from the slave stack SDO Upload handler to act on
|
||||||
|
* user specified Index and Sub-index.
|
||||||
|
*
|
||||||
|
* @param[in] index = index of SDO upload request to handle
|
||||||
|
* @param[in] sub-index = sub-index of SDO upload request to handle
|
||||||
|
* @return SDO abort code, or 0 on success
|
||||||
|
*/
|
||||||
|
uint32_t ESC_upload_post_objecthandler (uint16_t index, uint8_t subindex, uint16_t flags)
|
||||||
|
{
|
||||||
|
if (ESCvar.post_object_upload_hook != NULL)
|
||||||
|
{
|
||||||
|
return (ESCvar.post_object_upload_hook)(index, subindex, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Hook called from the slave stack ESC_stopoutputs to act on state changes
|
/** Hook called from the slave stack ESC_stopoutputs to act on state changes
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
|
/*
|
||||||
|
* Licensed under the GNU General Public License version 2 with exceptions. See
|
||||||
|
* LICENSE file in the project root for full license information
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef __ECAT_SLV_H__
|
#ifndef __ECAT_SLV_H__
|
||||||
#define __ECAT_SLV_H__
|
#define __ECAT_SLV_H__
|
||||||
|
|
||||||
#include "ecat_slv.h"
|
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "esc.h"
|
#include "esc.h"
|
||||||
|
|
||||||
|
|
|
@ -1165,6 +1165,8 @@ void ESC_config (esc_cfg_t * cfg)
|
||||||
ESCvar.safeoutput_override = cfg->safeoutput_override;
|
ESCvar.safeoutput_override = cfg->safeoutput_override;
|
||||||
ESCvar.pre_object_download_hook = cfg->pre_object_download_hook;
|
ESCvar.pre_object_download_hook = cfg->pre_object_download_hook;
|
||||||
ESCvar.post_object_download_hook = cfg->post_object_download_hook;
|
ESCvar.post_object_download_hook = cfg->post_object_download_hook;
|
||||||
|
ESCvar.pre_object_upload_hook = cfg->pre_object_upload_hook;
|
||||||
|
ESCvar.post_object_upload_hook = cfg->post_object_upload_hook;
|
||||||
ESCvar.rxpdo_override = cfg->rxpdo_override;
|
ESCvar.rxpdo_override = cfg->rxpdo_override;
|
||||||
ESCvar.txpdo_override = cfg->txpdo_override;
|
ESCvar.txpdo_override = cfg->txpdo_override;
|
||||||
ESCvar.esc_hw_interrupt_enable = cfg->esc_hw_interrupt_enable;
|
ESCvar.esc_hw_interrupt_enable = cfg->esc_hw_interrupt_enable;
|
||||||
|
|
21
soes/esc.h
21
soes/esc.h
|
@ -287,7 +287,15 @@ typedef struct esc_cfg
|
||||||
void * data,
|
void * data,
|
||||||
size_t size,
|
size_t size,
|
||||||
uint16_t flags);
|
uint16_t flags);
|
||||||
void (*post_object_download_hook) (uint16_t index,
|
uint32_t (*post_object_download_hook) (uint16_t index,
|
||||||
|
uint8_t subindex,
|
||||||
|
uint16_t flags);
|
||||||
|
uint32_t (*pre_object_upload_hook) (uint16_t index,
|
||||||
|
uint8_t subindex,
|
||||||
|
void * data,
|
||||||
|
size_t size,
|
||||||
|
uint16_t flags);
|
||||||
|
uint32_t (*post_object_upload_hook) (uint16_t index,
|
||||||
uint8_t subindex,
|
uint8_t subindex,
|
||||||
uint16_t flags);
|
uint16_t flags);
|
||||||
void (*rxpdo_override) (void);
|
void (*rxpdo_override) (void);
|
||||||
|
@ -402,7 +410,15 @@ typedef struct
|
||||||
void * data,
|
void * data,
|
||||||
size_t size,
|
size_t size,
|
||||||
uint16_t flags);
|
uint16_t flags);
|
||||||
void (*post_object_download_hook) (uint16_t index,
|
uint32_t (*post_object_download_hook) (uint16_t index,
|
||||||
|
uint8_t subindex,
|
||||||
|
uint16_t flags);
|
||||||
|
uint32_t (*pre_object_upload_hook) (uint16_t index,
|
||||||
|
uint8_t subindex,
|
||||||
|
void * data,
|
||||||
|
size_t size,
|
||||||
|
uint16_t flags);
|
||||||
|
uint32_t (*post_object_upload_hook) (uint16_t index,
|
||||||
uint8_t subindex,
|
uint8_t subindex,
|
||||||
uint16_t flags);
|
uint16_t flags);
|
||||||
void (*rxpdo_override) (void);
|
void (*rxpdo_override) (void);
|
||||||
|
@ -436,6 +452,7 @@ typedef struct
|
||||||
uint16_t entries;
|
uint16_t entries;
|
||||||
uint16_t frags;
|
uint16_t frags;
|
||||||
uint16_t fragsleft;
|
uint16_t fragsleft;
|
||||||
|
uint16_t flags;
|
||||||
|
|
||||||
uint8_t toggle;
|
uint8_t toggle;
|
||||||
|
|
||||||
|
|
|
@ -245,6 +245,7 @@ void SDO_upload (void)
|
||||||
uint8_t MBXout;
|
uint8_t MBXout;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint8_t dss;
|
uint8_t dss;
|
||||||
|
uint32_t abort = 1;
|
||||||
const _objd *objd;
|
const _objd *objd;
|
||||||
coesdo = (_COEsdo *) &MBX[0];
|
coesdo = (_COEsdo *) &MBX[0];
|
||||||
index = etohs (coesdo->index);
|
index = etohs (coesdo->index);
|
||||||
|
@ -295,8 +296,17 @@ void SDO_upload (void)
|
||||||
{
|
{
|
||||||
/* convert bits to bytes */
|
/* convert bits to bytes */
|
||||||
size = (size + 7) >> 3;
|
size = (size + 7) >> 3;
|
||||||
/* use dynamic data */
|
abort = ESC_upload_pre_objecthandler (index, subindex,
|
||||||
copy2mbx ((objd + nsub)->data, &(coeres->size), size);
|
(objd + nsub)->data, size, (objd + nsub)->flags);
|
||||||
|
if (abort == 0)
|
||||||
|
{
|
||||||
|
/* use dynamic data */
|
||||||
|
copy2mbx ((objd + nsub)->data, &(coeres->size), size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SDO_abort (index, subindex, abort);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -319,14 +329,33 @@ void SDO_upload (void)
|
||||||
/* signal segmented transfer */
|
/* signal segmented transfer */
|
||||||
ESCvar.segmented = MBXSEU;
|
ESCvar.segmented = MBXSEU;
|
||||||
ESCvar.data = (objd + nsub)->data;
|
ESCvar.data = (objd + nsub)->data;
|
||||||
|
ESCvar.flags = (objd + nsub)->flags;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ESCvar.segmented = 0;
|
ESCvar.segmented = 0;
|
||||||
}
|
}
|
||||||
coeres->mbxheader.length = htoes (COE_HEADERSIZE + size);
|
coeres->mbxheader.length = htoes (COE_HEADERSIZE + size);
|
||||||
/* use dynamic data */
|
abort = ESC_upload_pre_objecthandler (index, subindex,
|
||||||
copy2mbx ((objd + nsub)->data, (&(coeres->size)) + 1, size);
|
(objd + nsub)->data, size, (objd + nsub)->flags);
|
||||||
|
if (abort == 0)
|
||||||
|
{
|
||||||
|
/* use dynamic data */
|
||||||
|
copy2mbx ((objd + nsub)->data, (&(coeres->size)) + 1, size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SDO_abort (index, subindex, abort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((abort == 0) && (ESCvar.segmented == 0))
|
||||||
|
{
|
||||||
|
abort = ESC_upload_post_objecthandler (index, subindex,
|
||||||
|
(objd + nsub)->flags);
|
||||||
|
if (abort != 0)
|
||||||
|
{
|
||||||
|
SDO_abort (index, subindex, abort);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
MBXcontrol[MBXout].state = MBXstate_outreq;
|
MBXcontrol[MBXout].state = MBXstate_outreq;
|
||||||
}
|
}
|
||||||
|
@ -352,7 +381,7 @@ void SDO_uploadsegment (void)
|
||||||
{
|
{
|
||||||
_COEsdo *coesdo, *coeres;
|
_COEsdo *coesdo, *coeres;
|
||||||
uint8_t MBXout;
|
uint8_t MBXout;
|
||||||
uint32_t size, offset;
|
uint32_t size, offset, abort;
|
||||||
coesdo = (_COEsdo *) &MBX[0];
|
coesdo = (_COEsdo *) &MBX[0];
|
||||||
MBXout = ESC_claimbuffer ();
|
MBXout = ESC_claimbuffer ();
|
||||||
if (MBXout)
|
if (MBXout)
|
||||||
|
@ -392,6 +421,12 @@ void SDO_uploadsegment (void)
|
||||||
}
|
}
|
||||||
copy2mbx ((uint8_t *) ESCvar.data + offset, (&(coeres->command)) + 1, size); //copy to mailbox
|
copy2mbx ((uint8_t *) ESCvar.data + offset, (&(coeres->command)) + 1, size); //copy to mailbox
|
||||||
|
|
||||||
|
abort = ESC_upload_post_objecthandler (etohs (coesdo->index),
|
||||||
|
coesdo->subindex, ESCvar.flags);
|
||||||
|
if (abort != 0)
|
||||||
|
{
|
||||||
|
SDO_abort (etohs (coesdo->index), coesdo->subindex, abort);
|
||||||
|
}
|
||||||
MBXcontrol[MBXout].state = MBXstate_outreq;
|
MBXcontrol[MBXout].state = MBXstate_outreq;
|
||||||
}
|
}
|
||||||
MBXcontrol[0].state = MBXstate_idle;
|
MBXcontrol[0].state = MBXstate_idle;
|
||||||
|
@ -444,7 +479,7 @@ void SDO_download (void)
|
||||||
actsize = ((objd + nsub)->bitlength + 7) >> 3;
|
actsize = ((objd + nsub)->bitlength + 7) >> 3;
|
||||||
if (actsize == size)
|
if (actsize == size)
|
||||||
{
|
{
|
||||||
abort = ESC_pre_objecthandler (
|
abort = ESC_download_pre_objecthandler (
|
||||||
index,
|
index,
|
||||||
subindex,
|
subindex,
|
||||||
mbxdata,
|
mbxdata,
|
||||||
|
@ -469,7 +504,11 @@ void SDO_download (void)
|
||||||
MBXcontrol[MBXout].state = MBXstate_outreq;
|
MBXcontrol[MBXout].state = MBXstate_outreq;
|
||||||
}
|
}
|
||||||
/* external object write handler */
|
/* external object write handler */
|
||||||
ESC_objecthandler (index, subindex, (objd + nsub)->flags);
|
abort = ESC_download_post_objecthandler (index, subindex, (objd + nsub)->flags);
|
||||||
|
if (abort != 0)
|
||||||
|
{
|
||||||
|
SDO_abort (index, subindex, abort);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,12 +106,18 @@ void COE_pdoPack (uint8_t * buffer, int nmappings, _SMmap * sm);
|
||||||
void COE_pdoUnpack (uint8_t * buffer, int nmappings, _SMmap * sm);
|
void COE_pdoUnpack (uint8_t * buffer, int nmappings, _SMmap * sm);
|
||||||
uint8_t COE_maxSub (uint16_t index);
|
uint8_t COE_maxSub (uint16_t index);
|
||||||
|
|
||||||
extern void ESC_objecthandler (uint16_t index, uint8_t subindex, uint16_t flags);
|
extern uint32_t ESC_download_post_objecthandler (uint16_t index, uint8_t subindex, uint16_t flags);
|
||||||
extern uint32_t ESC_pre_objecthandler (uint16_t index,
|
extern uint32_t ESC_download_pre_objecthandler (uint16_t index,
|
||||||
uint8_t subindex,
|
uint8_t subindex,
|
||||||
void * data,
|
void * data,
|
||||||
size_t size,
|
size_t size,
|
||||||
uint16_t flags);
|
uint16_t flags);
|
||||||
|
extern uint32_t ESC_upload_pre_objecthandler (uint16_t index,
|
||||||
|
uint8_t subindex,
|
||||||
|
void * data,
|
||||||
|
size_t size,
|
||||||
|
uint16_t flags);
|
||||||
|
extern uint32_t ESC_upload_post_objecthandler (uint16_t index, uint8_t subindex, uint16_t flags);
|
||||||
extern const _objectlist SDOobjects[];
|
extern const _objectlist SDOobjects[];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue