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