2021-04-27 21:46:53 +02:00
|
|
|
#include <stdio.h>
|
2021-04-30 23:14:35 +02:00
|
|
|
#include <string.h>
|
2021-05-04 21:03:16 +02:00
|
|
|
#include "ecat_options.h"
|
2021-04-27 21:46:53 +02:00
|
|
|
#include "ecat_slv.h"
|
2021-05-05 22:02:36 +02:00
|
|
|
#include "esc_hw.h"
|
2021-05-01 00:07:48 +02:00
|
|
|
#include "utypes.h"
|
2021-04-27 21:46:53 +02:00
|
|
|
|
|
|
|
/* Application variables */
|
|
|
|
_Objects Obj;
|
|
|
|
|
2021-05-04 21:03:16 +02:00
|
|
|
#if !(DYN_PDO_MAPPING)
|
2021-05-03 06:49:33 +02:00
|
|
|
uint8_t * txpdo = Obj.txpdo;
|
|
|
|
uint8_t * rxpdo = Obj.rxpdo;
|
|
|
|
#endif
|
|
|
|
|
2021-05-06 07:15:29 +02:00
|
|
|
|
|
|
|
void cb_state_change (uint8_t * as, uint8_t * an)
|
|
|
|
{
|
|
|
|
if (*as == SAFEOP_TO_OP)
|
|
|
|
{
|
2021-05-06 07:35:07 +02:00
|
|
|
/* Enable HW watchdog event */
|
2021-05-06 07:15:29 +02:00
|
|
|
ESC_ALeventmaskwrite (ESC_ALeventmaskread() | ESCREG_ALEVENT_WD);
|
2021-05-06 07:35:07 +02:00
|
|
|
/* Enable SM2 sync manager event */
|
2021-05-06 07:15:29 +02:00
|
|
|
ESC_ALeventmaskwrite (ESC_ALeventmaskread() | ESCREG_ALEVENT_SM2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void cb_application (void)
|
|
|
|
{
|
|
|
|
/* Check for watchdog expired event */
|
|
|
|
if (ESCvar.ALevent & ESCREG_ALEVENT_WD)
|
|
|
|
{
|
|
|
|
if ((ESC_WDstatus() & 0x01) &&
|
|
|
|
((CC_ATOMIC_GET(ESCvar.App.state) & APPSTATE_OUTPUT) > 0))
|
|
|
|
{
|
|
|
|
DPRINT("DIG_process watchdog expired\n");
|
|
|
|
ESC_ALstatusgotoerror((ESCsafeop | ESCerror), ALERR_WATCHDOG);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-27 21:46:53 +02:00
|
|
|
void cb_get_inputs (void)
|
|
|
|
{
|
2021-05-06 07:15:29 +02:00
|
|
|
/* Loop back outputs to inputs */
|
2021-05-04 21:03:16 +02:00
|
|
|
#if DYN_PDO_MAPPING
|
2021-05-03 06:49:33 +02:00
|
|
|
memcpy(Obj.txpdo,Obj.rxpdo,BYTE_NUM);
|
2021-05-04 21:03:16 +02:00
|
|
|
#else
|
|
|
|
memcpy(txpdo,rxpdo,BYTE_NUM);
|
|
|
|
#endif
|
2021-04-27 21:46:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void cb_set_outputs (void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2021-05-06 07:15:29 +02:00
|
|
|
void cb_safeoutput (void)
|
|
|
|
{
|
|
|
|
/* Set all outputs to zero */
|
|
|
|
#if DYN_PDO_MAPPING
|
|
|
|
memset(Obj.rxpdo,0,BYTE_NUM);
|
|
|
|
#else
|
|
|
|
memset(rxpdo,0,BYTE_NUM);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
int soes (void * arg)
|
2021-04-27 21:46:53 +02:00
|
|
|
{
|
|
|
|
static esc_cfg_t config =
|
|
|
|
{
|
2021-05-06 07:35:07 +02:00
|
|
|
.user_arg = "rpi3,cs0", /* Change rpi3 to rpi4 for raspberry pi 4 or later */
|
2021-04-27 21:46:53 +02:00
|
|
|
.use_interrupt = 0,
|
2021-05-07 22:42:12 +02:00
|
|
|
.watchdog_cnt = INT32_MAX, /* Use HW SM watchdog instead */
|
2021-04-27 21:46:53 +02:00
|
|
|
.set_defaults_hook = NULL,
|
|
|
|
.pre_state_change_hook = NULL,
|
2021-05-06 07:15:29 +02:00
|
|
|
.post_state_change_hook = cb_state_change,
|
|
|
|
.application_hook = cb_application,
|
|
|
|
.safeoutput_override = cb_safeoutput,
|
2021-04-27 21:46:53 +02:00
|
|
|
.pre_object_download_hook = NULL,
|
|
|
|
.post_object_download_hook = NULL,
|
|
|
|
.rxpdo_override = NULL,
|
|
|
|
.txpdo_override = NULL,
|
|
|
|
.esc_hw_interrupt_enable = NULL,
|
|
|
|
.esc_hw_interrupt_disable = NULL,
|
|
|
|
.esc_hw_eep_handler = NULL,
|
|
|
|
.esc_check_dc_handler = NULL,
|
|
|
|
};
|
|
|
|
|
2021-05-06 07:15:29 +02:00
|
|
|
DPRINT ("Start slave init\n");
|
2021-04-27 21:46:53 +02:00
|
|
|
ecat_slv_init (&config);
|
2021-05-06 07:15:29 +02:00
|
|
|
DPRINT ("Initialization finished\n");
|
|
|
|
|
2021-04-27 21:46:53 +02:00
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
ecat_slv();
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main (void)
|
|
|
|
{
|
2021-05-06 07:15:29 +02:00
|
|
|
DPRINT ("SOES (Simple Open EtherCAT Slave)\n");
|
|
|
|
soes (NULL);
|
2021-04-27 21:46:53 +02:00
|
|
|
return 0;
|
|
|
|
}
|