etisserant@0: /* etisserant@0: This file is part of CanFestival, a library implementing CanOpen Stack. etisserant@0: etisserant@0: Copyright (C): Edouard TISSERANT and Francis DUPIN etisserant@0: etisserant@0: See COPYING file for copyrights details. etisserant@0: etisserant@0: This library is free software; you can redistribute it and/or etisserant@0: modify it under the terms of the GNU Lesser General Public etisserant@0: License as published by the Free Software Foundation; either etisserant@0: version 2.1 of the License, or (at your option) any later version. etisserant@0: etisserant@0: This library is distributed in the hope that it will be useful, etisserant@0: but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU etisserant@0: Lesser General Public License for more details. etisserant@0: etisserant@0: You should have received a copy of the GNU Lesser General Public etisserant@0: License along with this library; if not, write to the Free Software etisserant@0: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@0: */ etisserant@0: etisserant@0: etisserant@0: #ifndef __data_h__ etisserant@0: #define __data_h__ etisserant@0: frdupin@71: /* declaration of CO_Data type let us include all necessary headers frdupin@71: struct struct_CO_Data can then be defined later frdupin@71: */ etisserant@0: typedef struct struct_CO_Data CO_Data; etisserant@0: etisserant@0: #include etisserant@0: #include "def.h" etisserant@0: #include "can.h" etisserant@0: #include "objdictdef.h" etisserant@0: #include "objacces.h" etisserant@0: #include "sdo.h" etisserant@0: #include "pdo.h" etisserant@0: #include "states.h" etisserant@0: #include "lifegrd.h" etisserant@0: #include "sync.h" etisserant@0: #include "nmtMaster.h" etisserant@0: frdupin@71: /* This structurs contains all necessary information for a CanOpen node */ etisserant@0: struct struct_CO_Data { frdupin@71: /* Object dictionary */ etisserant@0: UNS8 *bDeviceNodeId; etisserant@0: const indextable *objdict; etisserant@0: UNS8 *count_sync; etisserant@0: quick_index *firstIndex; etisserant@0: quick_index *lastIndex; etisserant@0: UNS16 *ObjdictSize; etisserant@0: const UNS8 *iam_a_slave; etisserant@0: valueRangeTest_t valueRangeTest; etisserant@0: frdupin@71: /* SDO */ etisserant@0: s_transfer transfers[SDO_MAX_SIMULTANEOUS_TRANSFERTS]; etisserant@0: SDOtimeoutError_t SDOtimeoutError; frdupin@71: /* s_sdo_parameter *sdo_parameters; */ etisserant@0: frdupin@71: /* State machine */ etisserant@0: e_nodeState nodeState; etisserant@0: s_state_communication CurrentCommunicationState; etisserant@0: initialisation_t initialisation; etisserant@0: preOperational_t preOperational; etisserant@0: operational_t operational; etisserant@0: stopped_t stopped; etisserant@0: frdupin@71: /* NMT-heartbeat */ etisserant@0: UNS8 *ConsumerHeartbeatCount; etisserant@0: UNS32 *ConsumerHeartbeatEntries; etisserant@0: TIMER_HANDLE *ConsumerHeartBeatTimers; etisserant@0: UNS16 *ProducerHeartBeatTime; etisserant@0: TIMER_HANDLE ProducerHeartBeatTimer; etisserant@0: heartbeatError_t heartbeatError; etisserant@0: e_nodeState NMTable[NMT_MAX_NODE_ID]; etisserant@0: frdupin@71: /* SYNC */ etisserant@0: TIMER_HANDLE syncTimer; etisserant@0: UNS32 *COB_ID_Sync; etisserant@0: UNS32 *Sync_Cycle_Period; frdupin@71: /*UNS32 *Sync_window_length;;*/ etisserant@0: post_sync_t post_sync; etisserant@0: post_TPDO_t post_TPDO; etisserant@0: frdupin@71: /* PDO */ etisserant@0: s_process_var process_var; etisserant@0: frdupin@71: /* General */ etisserant@0: UNS8 toggle; etisserant@0: canSend_t canSend; etisserant@0: scanIndexOD_t scanIndexOD; etisserant@0: }; etisserant@0: etisserant@91: #define NMTable_Initializer Unknown_state, etisserant@91: etisserant@91: #define s_transfer_Initializer {\ etisserant@91: 0, /* nodeId */\ etisserant@91: 0, /* wohami */\ etisserant@91: SDO_RESET, /* state */\ etisserant@91: 0, /* toggle */\ etisserant@91: 0, /* abortCode */\ etisserant@91: 0, /* index */\ etisserant@91: 0, /* subIndex */\ etisserant@91: 0, /* count */\ etisserant@91: 0, /* offset */\ etisserant@91: {0}, /* data (static use, so that all the table is initialize at 0)*/\ etisserant@91: 0, /* dataType */\ etisserant@91: -1, /* timer */\ etisserant@91: NULL /* Callback */\ etisserant@91: }, etisserant@91: frdupin@71: /* A macro to initialize the data in client app.*/ frdupin@78: /* CO_Data structure */ etisserant@0: #define CANOPEN_NODE_DATA_INITIALIZER(NODE_PREFIX) {\ etisserant@0: /* Object dictionary*/\ frdupin@78: & NODE_PREFIX ## _bDeviceNodeId, /* bDeviceNodeId */\ frdupin@78: NODE_PREFIX ## _objdict, /* objdict */\ frdupin@78: NODE_PREFIX ## _count_sync, /* count_sync */\ frdupin@78: & NODE_PREFIX ## _firstIndex, /* firstIndex */\ frdupin@78: & NODE_PREFIX ## _lastIndex, /* lastIndex */\ frdupin@78: & NODE_PREFIX ## _ObjdictSize, /* ObjdictSize */\ frdupin@78: & NODE_PREFIX ## _iam_a_slave, /* iam_a_slave */\ frdupin@78: NODE_PREFIX ## _valueRangeTest, /* valueRangeTest */\ etisserant@0: \ frdupin@78: /* SDO, structure s_transfer */\ etisserant@91: {\ etisserant@91: REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERTS_TIMES(s_transfer_Initializer)\ frdupin@78: },\ frdupin@78: &NODE_PREFIX ## _SDOtimeoutError, /* SDOtimeoutError */\ etisserant@0: \ frdupin@78: /* State machine*/\ frdupin@78: Unknown_state, /* nodeState */\ frdupin@78: /* structure s_state_communication */\ frdupin@78: {\ frdupin@78: 0, /* csBoot_Up */\ frdupin@78: 0, /* csSDO */\ frdupin@78: 0, /* csEmergency */\ frdupin@78: 0, /* csSYNC */\ frdupin@78: 0, /* csHeartbeat */\ frdupin@78: 0 /* csPDO */\ frdupin@78: },\ frdupin@78: &NODE_PREFIX ## _initialisation, /* initialisation */\ frdupin@78: &NODE_PREFIX ## _preOperational, /* preOperational */\ frdupin@78: &NODE_PREFIX ## _operational, /* operational */\ frdupin@78: &NODE_PREFIX ## _stopped, /* stopped */\ etisserant@0: \ etisserant@0: /* NMT-heartbeat */\ frdupin@78: & NODE_PREFIX ## _highestSubIndex_obj1016, /* ConsumerHeartbeatCount */\ frdupin@78: NODE_PREFIX ## _obj1016, /* ConsumerHeartbeatEntries */\ frdupin@78: NODE_PREFIX ## _heartBeatTimers, /* ConsumerHeartBeatTimers */\ frdupin@78: & NODE_PREFIX ## _obj1017, /* ProducerHeartBeatTime */\ frdupin@78: TIMER_NONE, /* ProducerHeartBeatTimer */\ frdupin@78: NODE_PREFIX ## _heartbeatError, /* heartbeatError */\ frdupin@78: \ etisserant@91: {REPEAT_NMT_MAX_NODE_ID_TIMES(NMTable_Initializer)},\ frdupin@78: /* is well initialized at "Unknown_state". Is it ok ? (FD)*/\ etisserant@0: \ etisserant@0: /* SYNC */\ frdupin@78: TIMER_NONE, /* syncTimer */\ frdupin@78: & NODE_PREFIX ## _obj1005, /* COB_ID_Sync */\ frdupin@78: & NODE_PREFIX ## _obj1006, /* Sync_Cycle_Period */\ frdupin@78: /*& NODE_PREFIX ## _obj1007, */ /* Sync_window_length */\ frdupin@78: NODE_PREFIX ## _post_sync, /* post_sync */\ frdupin@78: NODE_PREFIX ## _post_TPDO, /* post_TPDO */\ etisserant@0: \ frdupin@78: /* PDO, structure s_process_var */\ frdupin@78: {\ frdupin@78: 0, /* count */\ frdupin@78: {0} /* data (static use, so that all the table is initialize at 0)*/\ frdupin@78: },\ frdupin@78: \ etisserant@0: /* General */\ frdupin@78: 0, /* toggle */\ frdupin@78: NODE_PREFIX ## _canSend, /* canSend */\ frdupin@78: NODE_PREFIX ## _scanIndexOD /* scanIndexOD */\ etisserant@0: } etisserant@0: frdupin@71: #endif /* __data_h__ */ etisserant@0: etisserant@0: