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: etisserant@0: // declaration of CO_Data type let us include all necessary headers etisserant@0: // struct struct_CO_Data can then be defined later 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: etisserant@0: // This structurs contains all necessary information for a CanOpen node etisserant@0: struct struct_CO_Data { etisserant@0: // 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: etisserant@0: // SDO etisserant@0: s_transfer transfers[SDO_MAX_SIMULTANEOUS_TRANSFERTS]; etisserant@0: SDOtimeoutError_t SDOtimeoutError; etisserant@0: //s_sdo_parameter *sdo_parameters; etisserant@0: etisserant@0: // 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: etisserant@0: // 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: etisserant@0: // SYNC etisserant@0: TIMER_HANDLE syncTimer; etisserant@0: UNS32 *COB_ID_Sync; etisserant@0: UNS32 *Sync_Cycle_Period; etisserant@0: /*UNS32 *Sync_window_length*/; etisserant@0: post_sync_t post_sync; etisserant@0: post_TPDO_t post_TPDO; etisserant@0: etisserant@0: // PDO etisserant@0: s_process_var process_var; etisserant@0: etisserant@0: // General etisserant@0: UNS8 toggle; etisserant@0: canSend_t canSend; etisserant@0: scanIndexOD_t scanIndexOD; etisserant@0: }; etisserant@0: etisserant@0: // A macro to initialize the data in client app. etisserant@0: #define CANOPEN_NODE_DATA_INITIALIZER(NODE_PREFIX) {\ etisserant@0: /* Object dictionary*/\ etisserant@0: bDeviceNodeId:& NODE_PREFIX ## _bDeviceNodeId,\ etisserant@0: objdict: NODE_PREFIX ## _objdict,\ etisserant@0: count_sync: NODE_PREFIX ## _count_sync,\ etisserant@0: firstIndex: & NODE_PREFIX ## _firstIndex,\ etisserant@0: lastIndex: & NODE_PREFIX ## _lastIndex,\ etisserant@0: ObjdictSize: & NODE_PREFIX ## _ObjdictSize,\ etisserant@0: iam_a_slave: & NODE_PREFIX ## _iam_a_slave,\ etisserant@0: valueRangeTest: NODE_PREFIX ## _valueRangeTest,\ etisserant@0: \ etisserant@0: /* SDO */\ etisserant@0: transfers:{{\ etisserant@0: nodeId: 0,\ etisserant@0: index: 0,\ etisserant@0: subIndex: 0,\ etisserant@0: state: SDO_RESET,\ etisserant@0: toggle: 0,\ etisserant@0: count: 0,\ etisserant@0: offset: 0,\ etisserant@0: data: {0,},\ etisserant@0: dataType: 0,\ etisserant@32: timer: -1,\ etisserant@32: Callback: NULL},},\ etisserant@0: SDOtimeoutError: &NODE_PREFIX ## _SDOtimeoutError,\ etisserant@0: \ etisserant@0: /* State machine */\ etisserant@0: nodeState:Unknown_state,\ etisserant@0: CurrentCommunicationState:{\ etisserant@0: csBoot_Up: 0,\ etisserant@0: csSDO: 0,\ etisserant@0: csEmergency: 0,\ etisserant@0: csSYNC: 0,\ etisserant@0: csHeartbeat: 0,\ etisserant@0: csPDO: 0},\ etisserant@0: initialisation: &NODE_PREFIX ## _initialisation,\ etisserant@0: preOperational: &NODE_PREFIX ## _preOperational,\ etisserant@0: operational: &NODE_PREFIX ## _operational,\ etisserant@0: stopped: &NODE_PREFIX ## _stopped,\ etisserant@0: \ etisserant@0: /* NMT-heartbeat */\ etisserant@0: ConsumerHeartbeatCount: & NODE_PREFIX ## _highestSubIndex_obj1016,\ etisserant@0: ConsumerHeartbeatEntries: NODE_PREFIX ## _obj1016,\ etisserant@0: ConsumerHeartBeatTimers: NODE_PREFIX ## _heartBeatTimers,\ etisserant@0: ProducerHeartBeatTime: & NODE_PREFIX ## _obj1017,\ etisserant@0: ProducerHeartBeatTimer: TIMER_NONE,\ etisserant@0: heartbeatError: NODE_PREFIX ## _heartbeatError,\ etisserant@0: NMTable:{Unknown_state,},\ etisserant@0: \ etisserant@0: /* SYNC */\ etisserant@0: syncTimer: TIMER_NONE,\ etisserant@0: COB_ID_Sync: & NODE_PREFIX ## _obj1005,\ etisserant@0: Sync_Cycle_Period: & NODE_PREFIX ## _obj1006,\ etisserant@0: /*Sync_window_length: & NODE_PREFIX ## _obj1007,*/\ etisserant@0: post_sync: NODE_PREFIX ## _post_sync,\ etisserant@0: post_TPDO: NODE_PREFIX ## _post_TPDO,\ etisserant@0: \ etisserant@0: /* PDO */\ etisserant@0: process_var: {\ etisserant@0: count: 0,\ etisserant@0: data: {0,}},\ etisserant@0: \ etisserant@0: /* General */\ etisserant@0: toggle: 0,\ etisserant@0: canSend: NODE_PREFIX ## _canSend,\ etisserant@0: scanIndexOD: NODE_PREFIX ## _scanIndexOD\ etisserant@0: } etisserant@0: etisserant@0: #endif // __data_h__ etisserant@0: etisserant@0: