Can_open_masternode

Dependencies:   mbed

Committer:
sam_grove
Date:
Mon May 30 07:36:47 2011 +0000
Revision:
0:9dd7c6129683
Initial public release of master node example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:9dd7c6129683 1 /*
sam_grove 0:9dd7c6129683 2 This file is part of CanFestival, a library implementing CanOpen Stack.
sam_grove 0:9dd7c6129683 3
sam_grove 0:9dd7c6129683 4 Copyright (C): Edouard TISSERANT and Francis DUPIN
sam_grove 0:9dd7c6129683 5
sam_grove 0:9dd7c6129683 6 See COPYING file for copyrights details.
sam_grove 0:9dd7c6129683 7
sam_grove 0:9dd7c6129683 8 This library is free software; you can redistribute it and/or
sam_grove 0:9dd7c6129683 9 modify it under the terms of the GNU Lesser General Public
sam_grove 0:9dd7c6129683 10 License as published by the Free Software Foundation; either
sam_grove 0:9dd7c6129683 11 version 2.1 of the License, or (at your option) any later version.
sam_grove 0:9dd7c6129683 12
sam_grove 0:9dd7c6129683 13 This library is distributed in the hope that it will be useful,
sam_grove 0:9dd7c6129683 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
sam_grove 0:9dd7c6129683 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
sam_grove 0:9dd7c6129683 16 Lesser General Public License for more details.
sam_grove 0:9dd7c6129683 17
sam_grove 0:9dd7c6129683 18 You should have received a copy of the GNU Lesser General Public
sam_grove 0:9dd7c6129683 19 License along with this library; if not, write to the Free Software
sam_grove 0:9dd7c6129683 20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
sam_grove 0:9dd7c6129683 21 */
sam_grove 0:9dd7c6129683 22
sam_grove 0:9dd7c6129683 23 #ifndef __data_h__
sam_grove 0:9dd7c6129683 24 #define __data_h__
sam_grove 0:9dd7c6129683 25
sam_grove 0:9dd7c6129683 26 #ifdef __cplusplus
sam_grove 0:9dd7c6129683 27 extern "C" {
sam_grove 0:9dd7c6129683 28 #endif
sam_grove 0:9dd7c6129683 29
sam_grove 0:9dd7c6129683 30 /* declaration of CO_Data type let us include all necessary headers
sam_grove 0:9dd7c6129683 31 struct struct_CO_Data can then be defined later
sam_grove 0:9dd7c6129683 32 */
sam_grove 0:9dd7c6129683 33 typedef struct struct_CO_Data CO_Data;
sam_grove 0:9dd7c6129683 34
sam_grove 0:9dd7c6129683 35 #include "applicfg.h"
sam_grove 0:9dd7c6129683 36 #include "def.h"
sam_grove 0:9dd7c6129683 37 #include "canopen_can.h"
sam_grove 0:9dd7c6129683 38 #include "objdictdef.h"
sam_grove 0:9dd7c6129683 39 #include "objacces.h"
sam_grove 0:9dd7c6129683 40 #include "sdo.h"
sam_grove 0:9dd7c6129683 41 #include "pdo.h"
sam_grove 0:9dd7c6129683 42 #include "states.h"
sam_grove 0:9dd7c6129683 43 #include "lifegrd.h"
sam_grove 0:9dd7c6129683 44 #include "sync.h"
sam_grove 0:9dd7c6129683 45 #include "nmtSlave.h"
sam_grove 0:9dd7c6129683 46 #include "nmtMaster.h"
sam_grove 0:9dd7c6129683 47 #include "emcy.h"
sam_grove 0:9dd7c6129683 48 #ifdef CO_ENABLE_LSS
sam_grove 0:9dd7c6129683 49 #include "lss.h"
sam_grove 0:9dd7c6129683 50 #endif
sam_grove 0:9dd7c6129683 51
sam_grove 0:9dd7c6129683 52 /**
sam_grove 0:9dd7c6129683 53 * @ingroup od
sam_grove 0:9dd7c6129683 54 * @brief This structure contains all necessary informations to define a CANOpen node
sam_grove 0:9dd7c6129683 55 */
sam_grove 0:9dd7c6129683 56 struct struct_CO_Data {
sam_grove 0:9dd7c6129683 57 /* Object dictionary */
sam_grove 0:9dd7c6129683 58 UNS8 *bDeviceNodeId;
sam_grove 0:9dd7c6129683 59 const indextable *objdict;
sam_grove 0:9dd7c6129683 60 s_PDO_status *PDO_status;
sam_grove 0:9dd7c6129683 61 const quick_index *firstIndex;
sam_grove 0:9dd7c6129683 62 const quick_index *lastIndex;
sam_grove 0:9dd7c6129683 63 const UNS16 *ObjdictSize;
sam_grove 0:9dd7c6129683 64 const UNS8 *iam_a_slave;
sam_grove 0:9dd7c6129683 65 valueRangeTest_t valueRangeTest;
sam_grove 0:9dd7c6129683 66
sam_grove 0:9dd7c6129683 67 /* SDO */
sam_grove 0:9dd7c6129683 68 s_transfer transfers[SDO_MAX_SIMULTANEOUS_TRANSFERTS];
sam_grove 0:9dd7c6129683 69 /* s_sdo_parameter *sdo_parameters; */
sam_grove 0:9dd7c6129683 70
sam_grove 0:9dd7c6129683 71 /* State machine */
sam_grove 0:9dd7c6129683 72 e_nodeState nodeState;
sam_grove 0:9dd7c6129683 73 s_state_communication CurrentCommunicationState;
sam_grove 0:9dd7c6129683 74 initialisation_t initialisation;
sam_grove 0:9dd7c6129683 75 preOperational_t preOperational;
sam_grove 0:9dd7c6129683 76 operational_t operational;
sam_grove 0:9dd7c6129683 77 stopped_t stopped;
sam_grove 0:9dd7c6129683 78 void (*NMT_Slave_Node_Reset_Callback)(CO_Data*);
sam_grove 0:9dd7c6129683 79 void (*NMT_Slave_Communications_Reset_Callback)(CO_Data*);
sam_grove 0:9dd7c6129683 80
sam_grove 0:9dd7c6129683 81 /* NMT-heartbeat */
sam_grove 0:9dd7c6129683 82 UNS8 *ConsumerHeartbeatCount;
sam_grove 0:9dd7c6129683 83 UNS32 *ConsumerHeartbeatEntries;
sam_grove 0:9dd7c6129683 84 TIMER_HANDLE *ConsumerHeartBeatTimers;
sam_grove 0:9dd7c6129683 85 UNS16 *ProducerHeartBeatTime;
sam_grove 0:9dd7c6129683 86 TIMER_HANDLE ProducerHeartBeatTimer;
sam_grove 0:9dd7c6129683 87 heartbeatError_t heartbeatError;
sam_grove 0:9dd7c6129683 88 e_nodeState NMTable[NMT_MAX_NODE_ID];
sam_grove 0:9dd7c6129683 89
sam_grove 0:9dd7c6129683 90 /* SYNC */
sam_grove 0:9dd7c6129683 91 TIMER_HANDLE syncTimer;
sam_grove 0:9dd7c6129683 92 UNS32 *COB_ID_Sync;
sam_grove 0:9dd7c6129683 93 UNS32 *Sync_Cycle_Period;
sam_grove 0:9dd7c6129683 94 /*UNS32 *Sync_window_length;;*/
sam_grove 0:9dd7c6129683 95 post_sync_t post_sync;
sam_grove 0:9dd7c6129683 96 post_TPDO_t post_TPDO;
sam_grove 0:9dd7c6129683 97 post_SlaveBootup_t post_SlaveBootup;
sam_grove 0:9dd7c6129683 98 post_SlaveStateChange_t post_SlaveStateChange;
sam_grove 0:9dd7c6129683 99
sam_grove 0:9dd7c6129683 100 /* General */
sam_grove 0:9dd7c6129683 101 UNS8 toggle;
sam_grove 0:9dd7c6129683 102 CAN_PORT canHandle;
sam_grove 0:9dd7c6129683 103 scanIndexOD_t scanIndexOD;
sam_grove 0:9dd7c6129683 104 storeODSubIndex_t storeODSubIndex;
sam_grove 0:9dd7c6129683 105
sam_grove 0:9dd7c6129683 106 /* DCF concise */
sam_grove 0:9dd7c6129683 107 const indextable* dcf_odentry;
sam_grove 0:9dd7c6129683 108 UNS8* dcf_cursor;
sam_grove 0:9dd7c6129683 109 UNS32 dcf_entries_count;
sam_grove 0:9dd7c6129683 110 UNS8 dcf_request;
sam_grove 0:9dd7c6129683 111
sam_grove 0:9dd7c6129683 112 /* EMCY */
sam_grove 0:9dd7c6129683 113 e_errorState error_state;
sam_grove 0:9dd7c6129683 114 UNS8 error_history_size;
sam_grove 0:9dd7c6129683 115 UNS8* error_number;
sam_grove 0:9dd7c6129683 116 UNS32* error_first_element;
sam_grove 0:9dd7c6129683 117 UNS8* error_register;
sam_grove 0:9dd7c6129683 118 UNS32* error_cobid;
sam_grove 0:9dd7c6129683 119 s_errors error_data[EMCY_MAX_ERRORS];
sam_grove 0:9dd7c6129683 120 post_emcy_t post_emcy;
sam_grove 0:9dd7c6129683 121
sam_grove 0:9dd7c6129683 122 #ifdef CO_ENABLE_LSS
sam_grove 0:9dd7c6129683 123 /* LSS */
sam_grove 0:9dd7c6129683 124 lss_transfer_t lss_transfer;
sam_grove 0:9dd7c6129683 125 lss_StoreConfiguration_t lss_StoreConfiguration;
sam_grove 0:9dd7c6129683 126 #endif
sam_grove 0:9dd7c6129683 127 };
sam_grove 0:9dd7c6129683 128
sam_grove 0:9dd7c6129683 129 #define NMTable_Initializer Unknown_state,
sam_grove 0:9dd7c6129683 130
sam_grove 0:9dd7c6129683 131 #ifdef SDO_DYNAMIC_BUFFER_ALLOCATION
sam_grove 0:9dd7c6129683 132 #define s_transfer_Initializer {\
sam_grove 0:9dd7c6129683 133 0, /* nodeId */\
sam_grove 0:9dd7c6129683 134 0, /* wohami */\
sam_grove 0:9dd7c6129683 135 SDO_RESET, /* state */\
sam_grove 0:9dd7c6129683 136 0, /* toggle */\
sam_grove 0:9dd7c6129683 137 0, /* abortCode */\
sam_grove 0:9dd7c6129683 138 0, /* index */\
sam_grove 0:9dd7c6129683 139 0, /* subIndex */\
sam_grove 0:9dd7c6129683 140 0, /* count */\
sam_grove 0:9dd7c6129683 141 0, /* offset */\
sam_grove 0:9dd7c6129683 142 {0}, /* data (static use, so that all the table is initialize at 0)*/\
sam_grove 0:9dd7c6129683 143 NULL, /* dynamicData */ \
sam_grove 0:9dd7c6129683 144 0, /* dynamicDataSize */ \
sam_grove 0:9dd7c6129683 145 0, /* dataType */\
sam_grove 0:9dd7c6129683 146 -1, /* timer */\
sam_grove 0:9dd7c6129683 147 NULL /* Callback */\
sam_grove 0:9dd7c6129683 148 },
sam_grove 0:9dd7c6129683 149 #else
sam_grove 0:9dd7c6129683 150 #define s_transfer_Initializer {\
sam_grove 0:9dd7c6129683 151 0, /* nodeId */\
sam_grove 0:9dd7c6129683 152 0, /* wohami */\
sam_grove 0:9dd7c6129683 153 SDO_RESET, /* state */\
sam_grove 0:9dd7c6129683 154 0, /* toggle */\
sam_grove 0:9dd7c6129683 155 0, /* abortCode */\
sam_grove 0:9dd7c6129683 156 0, /* index */\
sam_grove 0:9dd7c6129683 157 0, /* subIndex */\
sam_grove 0:9dd7c6129683 158 0, /* count */\
sam_grove 0:9dd7c6129683 159 0, /* offset */\
sam_grove 0:9dd7c6129683 160 {0}, /* data (static use, so that all the table is initialize at 0)*/\
sam_grove 0:9dd7c6129683 161 0, /* dataType */\
sam_grove 0:9dd7c6129683 162 -1, /* timer */\
sam_grove 0:9dd7c6129683 163 NULL /* Callback */\
sam_grove 0:9dd7c6129683 164 },
sam_grove 0:9dd7c6129683 165 #endif //SDO_DYNAMIC_BUFFER_ALLOCATION
sam_grove 0:9dd7c6129683 166
sam_grove 0:9dd7c6129683 167 #define ERROR_DATA_INITIALIZER \
sam_grove 0:9dd7c6129683 168 {\
sam_grove 0:9dd7c6129683 169 0, /* errCode */\
sam_grove 0:9dd7c6129683 170 0, /* errRegMask */\
sam_grove 0:9dd7c6129683 171 0 /* active */\
sam_grove 0:9dd7c6129683 172 },
sam_grove 0:9dd7c6129683 173
sam_grove 0:9dd7c6129683 174 #ifdef CO_ENABLE_LSS
sam_grove 0:9dd7c6129683 175
sam_grove 0:9dd7c6129683 176 #ifdef CO_ENABLE_LSS_FS
sam_grove 0:9dd7c6129683 177 #define lss_fs_Initializer \
sam_grove 0:9dd7c6129683 178 ,0, /* IDNumber */\
sam_grove 0:9dd7c6129683 179 128, /* BitChecked */\
sam_grove 0:9dd7c6129683 180 0, /* LSSSub */\
sam_grove 0:9dd7c6129683 181 0, /* LSSNext */\
sam_grove 0:9dd7c6129683 182 0, /* LSSPos */\
sam_grove 0:9dd7c6129683 183 LSS_FS_RESET, /* FastScan_SM */\
sam_grove 0:9dd7c6129683 184 -1, /* timerFS */\
sam_grove 0:9dd7c6129683 185 {{0,0,0,0},{0,0,0,0}} /* lss_fs_transfer */
sam_grove 0:9dd7c6129683 186 #else
sam_grove 0:9dd7c6129683 187 #define lss_fs_Initializer
sam_grove 0:9dd7c6129683 188 #endif
sam_grove 0:9dd7c6129683 189
sam_grove 0:9dd7c6129683 190 #define lss_Initializer {\
sam_grove 0:9dd7c6129683 191 LSS_RESET, /* state */\
sam_grove 0:9dd7c6129683 192 0, /* command */\
sam_grove 0:9dd7c6129683 193 LSS_WAITING_MODE, /* mode */\
sam_grove 0:9dd7c6129683 194 0, /* dat1 */\
sam_grove 0:9dd7c6129683 195 0, /* dat2 */\
sam_grove 0:9dd7c6129683 196 0, /* NodeID */\
sam_grove 0:9dd7c6129683 197 0, /* addr_sel_match */\
sam_grove 0:9dd7c6129683 198 0, /* addr_ident_match */\
sam_grove 0:9dd7c6129683 199 "none", /* BaudRate */\
sam_grove 0:9dd7c6129683 200 0, /* SwitchDelay */\
sam_grove 0:9dd7c6129683 201 SDELAY_OFF, /* SwitchDelayState */\
sam_grove 0:9dd7c6129683 202 NULL, /* canHandle_t */\
sam_grove 0:9dd7c6129683 203 -1, /* TimerMSG */\
sam_grove 0:9dd7c6129683 204 -1, /* TimerSDELAY */\
sam_grove 0:9dd7c6129683 205 NULL, /* Callback */\
sam_grove 0:9dd7c6129683 206 0 /* LSSanswer */\
sam_grove 0:9dd7c6129683 207 lss_fs_Initializer /*FastScan service initialization */\
sam_grove 0:9dd7c6129683 208 },\
sam_grove 0:9dd7c6129683 209 NULL /* _lss_StoreConfiguration*/
sam_grove 0:9dd7c6129683 210 #else
sam_grove 0:9dd7c6129683 211 #define lss_Initializer
sam_grove 0:9dd7c6129683 212 #endif
sam_grove 0:9dd7c6129683 213
sam_grove 0:9dd7c6129683 214
sam_grove 0:9dd7c6129683 215 /* A macro to initialize the data in client app.*/
sam_grove 0:9dd7c6129683 216 /* CO_Data structure */
sam_grove 0:9dd7c6129683 217 #define CANOPEN_NODE_DATA_INITIALIZER(NODE_PREFIX) {\
sam_grove 0:9dd7c6129683 218 /* Object dictionary*/\
sam_grove 0:9dd7c6129683 219 & NODE_PREFIX ## _bDeviceNodeId, /* bDeviceNodeId */\
sam_grove 0:9dd7c6129683 220 NODE_PREFIX ## _objdict, /* objdict */\
sam_grove 0:9dd7c6129683 221 NODE_PREFIX ## _PDO_status, /* PDO_status */\
sam_grove 0:9dd7c6129683 222 & NODE_PREFIX ## _firstIndex, /* firstIndex */\
sam_grove 0:9dd7c6129683 223 & NODE_PREFIX ## _lastIndex, /* lastIndex */\
sam_grove 0:9dd7c6129683 224 & NODE_PREFIX ## _ObjdictSize, /* ObjdictSize */\
sam_grove 0:9dd7c6129683 225 & NODE_PREFIX ## _iam_a_slave, /* iam_a_slave */\
sam_grove 0:9dd7c6129683 226 NODE_PREFIX ## _valueRangeTest, /* valueRangeTest */\
sam_grove 0:9dd7c6129683 227 \
sam_grove 0:9dd7c6129683 228 /* SDO, structure s_transfer */\
sam_grove 0:9dd7c6129683 229 {\
sam_grove 0:9dd7c6129683 230 REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERTS_TIMES(s_transfer_Initializer)\
sam_grove 0:9dd7c6129683 231 },\
sam_grove 0:9dd7c6129683 232 \
sam_grove 0:9dd7c6129683 233 /* State machine*/\
sam_grove 0:9dd7c6129683 234 Unknown_state, /* nodeState */\
sam_grove 0:9dd7c6129683 235 /* structure s_state_communication */\
sam_grove 0:9dd7c6129683 236 {\
sam_grove 0:9dd7c6129683 237 0, /* csBoot_Up */\
sam_grove 0:9dd7c6129683 238 0, /* csSDO */\
sam_grove 0:9dd7c6129683 239 0, /* csEmergency */\
sam_grove 0:9dd7c6129683 240 0, /* csSYNC */\
sam_grove 0:9dd7c6129683 241 0, /* csHeartbeat */\
sam_grove 0:9dd7c6129683 242 0, /* csPDO */\
sam_grove 0:9dd7c6129683 243 0 /* csLSS */\
sam_grove 0:9dd7c6129683 244 },\
sam_grove 0:9dd7c6129683 245 _initialisation, /* initialisation */\
sam_grove 0:9dd7c6129683 246 _preOperational, /* preOperational */\
sam_grove 0:9dd7c6129683 247 _operational, /* operational */\
sam_grove 0:9dd7c6129683 248 _stopped, /* stopped */\
sam_grove 0:9dd7c6129683 249 NULL, /* NMT node reset callback */\
sam_grove 0:9dd7c6129683 250 NULL, /* NMT communications reset callback */\
sam_grove 0:9dd7c6129683 251 \
sam_grove 0:9dd7c6129683 252 /* NMT-heartbeat */\
sam_grove 0:9dd7c6129683 253 & NODE_PREFIX ## _highestSubIndex_obj1016, /* ConsumerHeartbeatCount */\
sam_grove 0:9dd7c6129683 254 NODE_PREFIX ## _obj1016, /* ConsumerHeartbeatEntries */\
sam_grove 0:9dd7c6129683 255 NODE_PREFIX ## _heartBeatTimers, /* ConsumerHeartBeatTimers */\
sam_grove 0:9dd7c6129683 256 & NODE_PREFIX ## _obj1017, /* ProducerHeartBeatTime */\
sam_grove 0:9dd7c6129683 257 TIMER_NONE, /* ProducerHeartBeatTimer */\
sam_grove 0:9dd7c6129683 258 _heartbeatError, /* heartbeatError */\
sam_grove 0:9dd7c6129683 259 \
sam_grove 0:9dd7c6129683 260 {REPEAT_NMT_MAX_NODE_ID_TIMES(NMTable_Initializer)},\
sam_grove 0:9dd7c6129683 261 /* is well initialized at "Unknown_state". Is it ok ? (FD)*/\
sam_grove 0:9dd7c6129683 262 \
sam_grove 0:9dd7c6129683 263 /* SYNC */\
sam_grove 0:9dd7c6129683 264 TIMER_NONE, /* syncTimer */\
sam_grove 0:9dd7c6129683 265 & NODE_PREFIX ## _obj1005, /* COB_ID_Sync */\
sam_grove 0:9dd7c6129683 266 & NODE_PREFIX ## _obj1006, /* Sync_Cycle_Period */\
sam_grove 0:9dd7c6129683 267 /*& NODE_PREFIX ## _obj1007, */ /* Sync_window_length */\
sam_grove 0:9dd7c6129683 268 _post_sync, /* post_sync */\
sam_grove 0:9dd7c6129683 269 _post_TPDO, /* post_TPDO */\
sam_grove 0:9dd7c6129683 270 _post_SlaveBootup, /* post_SlaveBootup */\
sam_grove 0:9dd7c6129683 271 _post_SlaveStateChange, /* post_SlaveStateChange */\
sam_grove 0:9dd7c6129683 272 \
sam_grove 0:9dd7c6129683 273 /* General */\
sam_grove 0:9dd7c6129683 274 0, /* toggle */\
sam_grove 0:9dd7c6129683 275 NULL, /* canSend */\
sam_grove 0:9dd7c6129683 276 NODE_PREFIX ## _scanIndexOD, /* scanIndexOD */\
sam_grove 0:9dd7c6129683 277 _storeODSubIndex, /* storeODSubIndex */\
sam_grove 0:9dd7c6129683 278 /* DCF concise */\
sam_grove 0:9dd7c6129683 279 NULL, /*dcf_odentry*/\
sam_grove 0:9dd7c6129683 280 NULL, /*dcf_cursor*/\
sam_grove 0:9dd7c6129683 281 1, /*dcf_entries_count*/\
sam_grove 0:9dd7c6129683 282 0, /* dcf_request*/\
sam_grove 0:9dd7c6129683 283 \
sam_grove 0:9dd7c6129683 284 /* EMCY */\
sam_grove 0:9dd7c6129683 285 Error_free, /* error_state */\
sam_grove 0:9dd7c6129683 286 sizeof(NODE_PREFIX ## _obj1003) / sizeof(NODE_PREFIX ## _obj1003[0]), /* error_history_size */\
sam_grove 0:9dd7c6129683 287 & NODE_PREFIX ## _highestSubIndex_obj1003, /* error_number */\
sam_grove 0:9dd7c6129683 288 & NODE_PREFIX ## _obj1003[0], /* error_first_element */\
sam_grove 0:9dd7c6129683 289 & NODE_PREFIX ## _obj1001, /* error_register */\
sam_grove 0:9dd7c6129683 290 & NODE_PREFIX ## _obj1014, /* error_cobid */\
sam_grove 0:9dd7c6129683 291 /* error_data: structure s_errors */\
sam_grove 0:9dd7c6129683 292 {\
sam_grove 0:9dd7c6129683 293 REPEAT_EMCY_MAX_ERRORS_TIMES(ERROR_DATA_INITIALIZER)\
sam_grove 0:9dd7c6129683 294 },\
sam_grove 0:9dd7c6129683 295 _post_emcy, /* post_emcy */\
sam_grove 0:9dd7c6129683 296 /* LSS */\
sam_grove 0:9dd7c6129683 297 lss_Initializer\
sam_grove 0:9dd7c6129683 298 }
sam_grove 0:9dd7c6129683 299
sam_grove 0:9dd7c6129683 300 #ifdef __cplusplus
sam_grove 0:9dd7c6129683 301 };
sam_grove 0:9dd7c6129683 302 #endif
sam_grove 0:9dd7c6129683 303
sam_grove 0:9dd7c6129683 304 #endif /* __data_h__ */
sam_grove 0:9dd7c6129683 305
sam_grove 0:9dd7c6129683 306