Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-
#ifndef __data_h__
#define __data_h__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/* declaration of CO_Data type let us include all necessary headers
struct struct_CO_Data can then be defined later
*/
typedef struct struct_CO_Data CO_Data;
-#include <applicfg.h>
+#include "applicfg.h"
#include "def.h"
#include "can.h"
#include "objdictdef.h"
#include "states.h"
#include "lifegrd.h"
#include "sync.h"
+#include "nmtSlave.h"
#include "nmtMaster.h"
+#include "emcy.h"
+#ifdef CO_ENABLE_LSS
+#include "lss.h"
+#endif
/* This structurs contains all necessary information for a CanOpen node */
struct struct_CO_Data {
/* Object dictionary */
UNS8 *bDeviceNodeId;
const indextable *objdict;
- UNS8 *count_sync;
- quick_index *firstIndex;
- quick_index *lastIndex;
- UNS16 *ObjdictSize;
+ s_PDO_status *PDO_status;
+ const quick_index *firstIndex;
+ const quick_index *lastIndex;
+ const UNS16 *ObjdictSize;
const UNS8 *iam_a_slave;
valueRangeTest_t valueRangeTest;
/* SDO */
s_transfer transfers[SDO_MAX_SIMULTANEOUS_TRANSFERTS];
- SDOtimeoutError_t SDOtimeoutError;
/* s_sdo_parameter *sdo_parameters; */
/* State machine */
preOperational_t preOperational;
operational_t operational;
stopped_t stopped;
-
+ void (*NMT_Slave_Node_Reset_Callback)(CO_Data*);
+ void (*NMT_Slave_Communications_Reset_Callback)(CO_Data*);
+
/* NMT-heartbeat */
UNS8 *ConsumerHeartbeatCount;
UNS32 *ConsumerHeartbeatEntries;
/*UNS32 *Sync_window_length;;*/
post_sync_t post_sync;
post_TPDO_t post_TPDO;
-
- /* PDO */
- s_process_var process_var;
+ post_SlaveBootup_t post_SlaveBootup;
/* General */
UNS8 toggle;
- canSend_t canSend;
+ CAN_PORT canHandle;
scanIndexOD_t scanIndexOD;
+ storeODSubIndex_t storeODSubIndex;
+
+ /* DCF concise */
+ const indextable* dcf_odentry;
+ UNS8* dcf_cursor;
+ UNS32 dcf_entries_count;
+ UNS8 dcf_request;
+
+ /* EMCY */
+ e_errorState error_state;
+ UNS8 error_history_size;
+ UNS8* error_number;
+ UNS32* error_first_element;
+ UNS8* error_register;
+ UNS32* error_cobid;
+ s_errors error_data[EMCY_MAX_ERRORS];
+ post_emcy_t post_emcy;
+
+#ifdef CO_ENABLE_LSS
+ /* LSS */
+ lss_transfer_t lss_transfer;
+ lss_StoreConfiguration_t lss_StoreConfiguration;
+#endif
};
+#define NMTable_Initializer Unknown_state,
+
+#define s_transfer_Initializer {\
+ 0, /* nodeId */\
+ 0, /* wohami */\
+ SDO_RESET, /* state */\
+ 0, /* toggle */\
+ 0, /* abortCode */\
+ 0, /* index */\
+ 0, /* subIndex */\
+ 0, /* count */\
+ 0, /* offset */\
+ {0}, /* data (static use, so that all the table is initialize at 0)*/\
+ 0, /* dataType */\
+ -1, /* timer */\
+ NULL /* Callback */\
+ },
+
+#define ERROR_DATA_INITIALIZER \
+ {\
+ 0, /* errCode */\
+ 0, /* errRegMask */\
+ 0 /* active */\
+ },
+
+#ifdef CO_ENABLE_LSS
+
+#ifdef CO_ENABLE_LSS_FS
+#define lss_fs_Initializer \
+ ,0, /* IDNumber */\
+ 128, /* BitChecked */\
+ 0, /* LSSSub */\
+ 0, /* LSSNext */\
+ 0, /* LSSPos */\
+ LSS_FS_RESET, /* FastScan_SM */\
+ -1, /* timerFS */\
+ {{0,0,0,0},{0,0,0,0}} /* lss_fs_transfer */
+#else
+#define lss_fs_Initializer
+#endif
+
+#define lss_Initializer {\
+ LSS_RESET, /* state */\
+ 0, /* command */\
+ LSS_WAITING_MODE, /* mode */\
+ 0, /* dat1 */\
+ 0, /* dat2 */\
+ 0, /* NodeID */\
+ 0, /* addr_sel_match */\
+ 0, /* addr_ident_match */\
+ "none", /* BaudRate */\
+ 0, /* SwitchDelay */\
+ SDELAY_OFF, /* SwitchDelayState */\
+ NULL, /* canHandle_t */\
+ -1, /* TimerMSG */\
+ -1, /* TimerSDELAY */\
+ NULL, /* Callback */\
+ 0 /* LSSanswer */\
+ lss_fs_Initializer /*FastScan service initialization */\
+ },\
+ NULL /* _lss_StoreConfiguration*/
+#else
+#define lss_Initializer
+#endif
+
+
/* A macro to initialize the data in client app.*/
+/* CO_Data structure */
#define CANOPEN_NODE_DATA_INITIALIZER(NODE_PREFIX) {\
/* Object dictionary*/\
- bDeviceNodeId:& NODE_PREFIX ## _bDeviceNodeId,\
- objdict: NODE_PREFIX ## _objdict,\
- count_sync: NODE_PREFIX ## _count_sync,\
- firstIndex: & NODE_PREFIX ## _firstIndex,\
- lastIndex: & NODE_PREFIX ## _lastIndex,\
- ObjdictSize: & NODE_PREFIX ## _ObjdictSize,\
- iam_a_slave: & NODE_PREFIX ## _iam_a_slave,\
- valueRangeTest: NODE_PREFIX ## _valueRangeTest,\
+ & NODE_PREFIX ## _bDeviceNodeId, /* bDeviceNodeId */\
+ NODE_PREFIX ## _objdict, /* objdict */\
+ NODE_PREFIX ## _PDO_status, /* PDO_status */\
+ & NODE_PREFIX ## _firstIndex, /* firstIndex */\
+ & NODE_PREFIX ## _lastIndex, /* lastIndex */\
+ & NODE_PREFIX ## _ObjdictSize, /* ObjdictSize */\
+ & NODE_PREFIX ## _iam_a_slave, /* iam_a_slave */\
+ NODE_PREFIX ## _valueRangeTest, /* valueRangeTest */\
\
- /* SDO */\
- transfers:{{\
- nodeId: 0,\
- index: 0,\
- subIndex: 0,\
- state: SDO_RESET,\
- toggle: 0,\
- count: 0,\
- offset: 0,\
- data: {0,},\
- dataType: 0,\
- timer: -1,\
- Callback: NULL},},\
- SDOtimeoutError: &NODE_PREFIX ## _SDOtimeoutError,\
+ /* SDO, structure s_transfer */\
+ {\
+ REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERTS_TIMES(s_transfer_Initializer)\
+ },\
\
- /* State machine */\
- nodeState:Unknown_state,\
- CurrentCommunicationState:{\
- csBoot_Up: 0,\
- csSDO: 0,\
- csEmergency: 0,\
- csSYNC: 0,\
- csHeartbeat: 0,\
- csPDO: 0},\
- initialisation: &NODE_PREFIX ## _initialisation,\
- preOperational: &NODE_PREFIX ## _preOperational,\
- operational: &NODE_PREFIX ## _operational,\
- stopped: &NODE_PREFIX ## _stopped,\
+ /* State machine*/\
+ Unknown_state, /* nodeState */\
+ /* structure s_state_communication */\
+ {\
+ 0, /* csBoot_Up */\
+ 0, /* csSDO */\
+ 0, /* csEmergency */\
+ 0, /* csSYNC */\
+ 0, /* csHeartbeat */\
+ 0, /* csPDO */\
+ 0 /* csLSS */\
+ },\
+ _initialisation, /* initialisation */\
+ _preOperational, /* preOperational */\
+ _operational, /* operational */\
+ _stopped, /* stopped */\
+ NULL, /* NMT node reset callback */\
+ NULL, /* NMT communications reset callback */\
\
/* NMT-heartbeat */\
- ConsumerHeartbeatCount: & NODE_PREFIX ## _highestSubIndex_obj1016,\
- ConsumerHeartbeatEntries: NODE_PREFIX ## _obj1016,\
- ConsumerHeartBeatTimers: NODE_PREFIX ## _heartBeatTimers,\
- ProducerHeartBeatTime: & NODE_PREFIX ## _obj1017,\
- ProducerHeartBeatTimer: TIMER_NONE,\
- heartbeatError: NODE_PREFIX ## _heartbeatError,\
- NMTable:{Unknown_state,},\
+ & NODE_PREFIX ## _highestSubIndex_obj1016, /* ConsumerHeartbeatCount */\
+ NODE_PREFIX ## _obj1016, /* ConsumerHeartbeatEntries */\
+ NODE_PREFIX ## _heartBeatTimers, /* ConsumerHeartBeatTimers */\
+ & NODE_PREFIX ## _obj1017, /* ProducerHeartBeatTime */\
+ TIMER_NONE, /* ProducerHeartBeatTimer */\
+ _heartbeatError, /* heartbeatError */\
\
- /* SYNC */\
- syncTimer: TIMER_NONE,\
- COB_ID_Sync: & NODE_PREFIX ## _obj1005,\
- Sync_Cycle_Period: & NODE_PREFIX ## _obj1006,\
- /*Sync_window_length: & NODE_PREFIX ## _obj1007,*/\
- post_sync: NODE_PREFIX ## _post_sync,\
- post_TPDO: NODE_PREFIX ## _post_TPDO,\
+ {REPEAT_NMT_MAX_NODE_ID_TIMES(NMTable_Initializer)},\
+ /* is well initialized at "Unknown_state". Is it ok ? (FD)*/\
\
- /* PDO */\
- process_var: {\
- count: 0,\
- data: {0,}},\
+ /* SYNC */\
+ TIMER_NONE, /* syncTimer */\
+ & NODE_PREFIX ## _obj1005, /* COB_ID_Sync */\
+ & NODE_PREFIX ## _obj1006, /* Sync_Cycle_Period */\
+ /*& NODE_PREFIX ## _obj1007, */ /* Sync_window_length */\
+ _post_sync, /* post_sync */\
+ _post_TPDO, /* post_TPDO */\
+ _post_SlaveBootup, /* post_SlaveBootup */\
\
/* General */\
- toggle: 0,\
- canSend: NODE_PREFIX ## _canSend,\
- scanIndexOD: NODE_PREFIX ## _scanIndexOD\
+ 0, /* toggle */\
+ NULL, /* canSend */\
+ NODE_PREFIX ## _scanIndexOD, /* scanIndexOD */\
+ _storeODSubIndex, /* storeODSubIndex */\
+ /* DCF concise */\
+ NULL, /*dcf_odentry*/\
+ NULL, /*dcf_cursor*/\
+ 1, /*dcf_entries_count*/\
+ 0, /* dcf_request*/\
+ \
+ /* EMCY */\
+ Error_free, /* error_state */\
+ sizeof(NODE_PREFIX ## _obj1003) / sizeof(NODE_PREFIX ## _obj1003[0]), /* error_history_size */\
+ & NODE_PREFIX ## _highestSubIndex_obj1003, /* error_number */\
+ & NODE_PREFIX ## _obj1003[0], /* error_first_element */\
+ & NODE_PREFIX ## _obj1001, /* error_register */\
+ & NODE_PREFIX ## _obj1014, /* error_cobid */\
+ /* error_data: structure s_errors */\
+ {\
+ REPEAT_EMCY_MAX_ERRORS_TIMES(ERROR_DATA_INITIALIZER)\
+ },\
+ _post_emcy, /* post_emcy */\
+ /* LSS */\
+ lss_Initializer\
}
+#ifdef __cplusplus
+};
+#endif
+
#endif /* __data_h__ */