7 s_BOARD nodename##Board = {busname, baudrate}; |
7 s_BOARD nodename##Board = {busname, baudrate}; |
8 |
8 |
9 %(board_decls)s |
9 %(board_decls)s |
10 |
10 |
11 static int init_level=0; |
11 static int init_level=0; |
|
12 extern int common_ticktime__; |
12 |
13 |
13 #define NODE_INIT(nodename, nodeid) \ |
14 #define NODE_INIT(nodename, nodeid) \ |
|
15 /* Artificially force sync state to 1 so that it is not started */\ |
|
16 nodename##_Data.CurrentCommunicationState.csSYNC = -1;\ |
|
17 /* Force sync period to common_ticktime__ so that other node can read it*/\ |
|
18 *nodename##_Data.COB_ID_Sync = 0x40000080;\ |
|
19 *nodename##_Data.Sync_Cycle_Period = common_ticktime__ * 1000;\ |
14 /* Defining the node Id */\ |
20 /* Defining the node Id */\ |
15 setNodeId(&nodename##_Data, nodeid);\ |
21 setNodeId(&nodename##_Data, nodeid);\ |
16 /* init */\ |
22 /* init */\ |
17 setState(&nodename##_Data, Initialisation); |
23 setState(&nodename##_Data, Initialisation); |
18 |
24 |
33 void __cleanup_%(locstr)s() |
39 void __cleanup_%(locstr)s() |
34 { |
40 { |
35 %(nodes_close)s |
41 %(nodes_close)s |
36 |
42 |
37 // Stop timer thread |
43 // Stop timer thread |
38 StopTimerLoop(); |
44 if(init_level-- > 0) |
|
45 StopTimerLoop(); |
39 |
46 |
40 } |
47 } |
41 |
48 |
42 #define NODE_OPEN(nodename)\ |
49 #define NODE_OPEN(nodename)\ |
43 if(!canOpen(&nodename##Board,&nodename##_Data)){\ |
50 if(!canOpen(&nodename##Board,&nodename##_Data)){\ |
44 printf("Cannot open " #nodename " Board (%%s,%%s)\n",nodename##Board.busname, nodename##Board.baudrate);\ |
51 printf("Cannot open " #nodename " Board (%%s,%%s)\n",nodename##Board.busname, nodename##Board.baudrate);\ |
45 __cleanup_%(locstr)s();\ |
|
46 return -1;\ |
52 return -1;\ |
47 }\ |
53 }\ |
48 init_level++; |
54 init_level++; |
49 |
55 |
50 /*************************** INIT *****************************************/ |
56 /*************************** INIT *****************************************/ |
51 int __init_%(locstr)s(int argc,char **argv) |
57 int __init_%(locstr)s(int argc,char **argv) |
52 { |
58 { |
|
59 #ifndef NOT_USE_DYNAMIC_LOADING |
|
60 if( !LoadCanDriver("libcanfestival_can_%(candriver)s.so") ){ |
|
61 fprintf(stderr, "Cannot load CAN interface library for CanFestival (%(candriver)s)\n");\ |
|
62 return -1; |
|
63 } |
|
64 #endif |
53 |
65 |
54 %(nodes_open)s |
66 %(nodes_open)s |
55 |
67 |
56 #ifndef NOT_USE_DYNAMIC_LOADING |
|
57 LoadCanDriver("libcanfestival_can_%(candriver)s.so"); |
|
58 #endif |
|
59 // Start timer thread |
68 // Start timer thread |
60 StartTimerLoop(&InitNodes); |
69 StartTimerLoop(&InitNodes); |
|
70 init_level++; |
61 return 0; |
71 return 0; |
62 } |
72 } |
63 |
73 |
|
74 #define NODE_SEND_SYNC(nodename)\ |
|
75 sendSYNCMessage(&nodename##_Data); |
|
76 |
64 void __retrive_%(locstr)s() |
77 void __retrive_%(locstr)s() |
65 { |
78 { |
66 /*TODO: Send Sync */ |
79 /* Locks the stack, so that no changes occurs while PLC access variables |
|
80 * TODO : implement buffers to avoid such a big lock |
|
81 * */ |
67 EnterMutex(); |
82 EnterMutex(); |
|
83 /*Send Sync */ |
|
84 %(nodes_send_sync)s |
68 } |
85 } |
|
86 |
|
87 #define NODE_PROCEED_SYNC(nodename)\ |
|
88 proceedSYNC(&nodename##_Data); |
69 |
89 |
70 void __publish_%(locstr)s() |
90 void __publish_%(locstr)s() |
71 { |
91 { |
72 /*TODO: Call SendPDOEvent */ |
92 /*Call SendPDOEvent */ |
|
93 %(nodes_proceed_sync)s |
73 LeaveMutex(); |
94 LeaveMutex(); |
74 } |
95 } |
75 |
96 |