]> rtime.felk.cvut.cz Git - CanFestival-3.git/blob - include/data.h
0cdd19db1a91bc45338854180bc49d6bcec44500
[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 "nmtMaster.h"
46 #include "emcy.h"
47
48 /* This structurs contains all necessary information for a CanOpen node */
49 struct struct_CO_Data {
50         /* Object dictionary */
51         UNS8 *bDeviceNodeId;
52         const indextable *objdict;
53         s_PDO_status *PDO_status;
54         quick_index *firstIndex;
55         quick_index *lastIndex;
56         UNS16 *ObjdictSize;
57         const UNS8 *iam_a_slave;
58         valueRangeTest_t valueRangeTest;
59         
60         /* SDO */
61         s_transfer transfers[SDO_MAX_SIMULTANEOUS_TRANSFERTS];
62         /* s_sdo_parameter *sdo_parameters; */
63
64         /* State machine */
65         e_nodeState nodeState;
66         s_state_communication CurrentCommunicationState;
67         initialisation_t initialisation;
68         preOperational_t preOperational;
69         operational_t operational;
70         stopped_t stopped;
71
72         /* NMT-heartbeat */
73         UNS8 *ConsumerHeartbeatCount;
74         UNS32 *ConsumerHeartbeatEntries;
75         TIMER_HANDLE *ConsumerHeartBeatTimers;
76         UNS16 *ProducerHeartBeatTime;
77         TIMER_HANDLE ProducerHeartBeatTimer;
78         heartbeatError_t heartbeatError;
79         e_nodeState NMTable[NMT_MAX_NODE_ID]; 
80
81         /* SYNC */
82         TIMER_HANDLE syncTimer;
83         UNS32 *COB_ID_Sync;
84         UNS32 *Sync_Cycle_Period;
85         /*UNS32 *Sync_window_length;;*/
86         post_sync_t post_sync;
87         post_TPDO_t post_TPDO;
88         
89         /* General */
90         UNS8 toggle;
91         CAN_HANDLE canHandle;   
92         scanIndexOD_t scanIndexOD;
93         storeODSubIndex_t storeODSubIndex; 
94         
95         /* DCF concise */
96         UNS8* dcf_cursor;
97         UNS32 dcf_count_targets;
98         
99         /* EMCY */
100         e_errorState error_state;
101         UNS8 error_history_size;
102         UNS8* error_number;
103         UNS32* error_first_element;
104         UNS8* error_register;
105         s_errors error_data[EMCY_MAX_ERRORS];
106         post_emcy_t post_emcy;
107         
108 };
109
110 #define NMTable_Initializer Unknown_state,
111
112 #define s_transfer_Initializer {\
113                 0,          /* nodeId */\
114                 0,          /* wohami */\
115                 SDO_RESET,  /* state */\
116                 0,          /* toggle */\
117                 0,          /* abortCode */\
118                 0,          /* index */\
119                 0,          /* subIndex */\
120                 0,          /* count */\
121                 0,          /* offset */\
122                 {0},        /* data (static use, so that all the table is initialize at 0)*/\
123                 0,          /* dataType */\
124                 -1,         /* timer */\
125                 NULL        /* Callback */\
126           },
127
128 #define ERROR_DATA_INITIALIZER \
129         {\
130         0, /* errCode */\
131         0, /* errRegMask */\
132         0 /* active */\
133         },
134
135 /* A macro to initialize the data in client app.*/
136 /* CO_Data structure */
137 #define CANOPEN_NODE_DATA_INITIALIZER(NODE_PREFIX) {\
138         /* Object dictionary*/\
139         & NODE_PREFIX ## _bDeviceNodeId,     /* bDeviceNodeId */\
140         NODE_PREFIX ## _objdict,             /* objdict  */\
141         NODE_PREFIX ## _PDO_status,          /* PDO_status */\
142         & NODE_PREFIX ## _firstIndex,        /* firstIndex */\
143         & NODE_PREFIX ## _lastIndex,         /* lastIndex */\
144         & NODE_PREFIX ## _ObjdictSize,       /* ObjdictSize */\
145         & NODE_PREFIX ## _iam_a_slave,       /* iam_a_slave */\
146         NODE_PREFIX ## _valueRangeTest,      /* valueRangeTest */\
147         \
148         /* SDO, structure s_transfer */\
149         {\
150           REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERTS_TIMES(s_transfer_Initializer)\
151         },\
152         \
153         /* State machine*/\
154         Unknown_state,      /* nodeState */\
155         /* structure s_state_communication */\
156         {\
157                 0,          /* csBoot_Up */\
158                 0,          /* csSDO */\
159                 0,          /* csEmergency */\
160                 0,          /* csSYNC */\
161                 0,          /* csHeartbeat */\
162                 0           /* csPDO */\
163         },\
164         _initialisation,     /* initialisation */\
165         _preOperational,     /* preOperational */\
166         _operational,        /* operational */\
167         _stopped,            /* stopped */\
168         \
169         /* NMT-heartbeat */\
170         & NODE_PREFIX ## _highestSubIndex_obj1016, /* ConsumerHeartbeatCount */\
171         NODE_PREFIX ## _obj1016,                   /* ConsumerHeartbeatEntries */\
172         NODE_PREFIX ## _heartBeatTimers,           /* ConsumerHeartBeatTimers  */\
173         & NODE_PREFIX ## _obj1017,                 /* ProducerHeartBeatTime */\
174         TIMER_NONE,                                /* ProducerHeartBeatTimer */\
175         _heartbeatError,           /* heartbeatError */\
176         \
177         {REPEAT_NMT_MAX_NODE_ID_TIMES(NMTable_Initializer)},\
178                                                    /* is  well initialized at "Unknown_state". Is it ok ? (FD)*/\
179         \
180         /* SYNC */\
181         TIMER_NONE,                                /* syncTimer */\
182         & NODE_PREFIX ## _obj1005,                 /* COB_ID_Sync */\
183         & NODE_PREFIX ## _obj1006,                 /* Sync_Cycle_Period */\
184         /*& NODE_PREFIX ## _obj1007, */            /* Sync_window_length */\
185         _post_sync,                 /* post_sync */\
186         _post_TPDO,                 /* post_TPDO */\
187         \
188         /* General */\
189         0,                                         /* toggle */\
190         NULL,                   /* canSend */\
191         NODE_PREFIX ## _scanIndexOD,                /* scanIndexOD */\
192         _storeODSubIndex,                /* storeODSubIndex */\
193         NULL,           /*dcf_cursor*/\
194         1,              /*dcf_count_targets*/\
195         \
196         /* EMCY */\
197         Error_free,                      /* error_state */\
198         sizeof(NODE_PREFIX ## _obj1003) / sizeof(NODE_PREFIX ## _obj1003[0]),      /* error_history_size */\
199         & NODE_PREFIX ## _highestSubIndex_obj1003,    /* error_number */\
200         & NODE_PREFIX ## _obj1003[0],    /* error_first_element */\
201         & NODE_PREFIX ## _obj1001,       /* error_register */\
202         /* error_data: structure s_errors */\
203         {\
204         REPEAT_EMCY_MAX_ERRORS_TIMES(ERROR_DATA_INITIALIZER)\
205         },\
206         _post_emcy              /* post_emcy */\
207 }
208
209 #ifdef __cplusplus
210 };
211 #endif
212
213 #endif /* __data_h__ */
214
215