Merge pull request #75 from lrsdnlssn/master

Add/extend support for upload and download callbacks
pull/76/head
Hans-Erik Floryd 2020-06-22 15:18:16 +02:00 committed by GitHub
commit 3792b58fea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 130 additions and 20 deletions

View File

@ -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

View File

@ -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"

View File

@ -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;

View File

@ -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;

View File

@ -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
{ {

View File

@ -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