18 /* Called once all NetworkEdit declares slaves have booted*/ |
18 /* Called once all NetworkEdit declares slaves have booted*/ |
19 static void Master_post_SlaveBootup(CO_Data* d, UNS8 nodeId) |
19 static void Master_post_SlaveBootup(CO_Data* d, UNS8 nodeId) |
20 { |
20 { |
21 /* Put the master in operational mode */ |
21 /* Put the master in operational mode */ |
22 setState(d, Operational); |
22 setState(d, Operational); |
23 |
23 |
24 /* Ask slave node to go in operational mode */ |
24 /* Ask slave node to go in operational mode */ |
25 masterSendNMTstateChange (d, 0, NMT_Start_Node); |
25 masterSendNMTstateChange (d, 0, NMT_Start_Node); |
26 } |
26 } |
27 |
27 |
28 /* Per master node slavebootup callbacks. Checks that |
28 /* Per master node slavebootup callbacks. Checks that |
29 * every node have booted before calling Master_post_SlaveBootup */ |
29 * every node have booted before calling Master_post_SlaveBootup */ |
30 %(slavebootups)s |
30 %(slavebootups)s |
31 |
31 |
32 /* One slave node post_sync callback. |
32 /* One slave node post_sync callback. |
33 * Used to align PLC tick-time on CANopen SYNC |
33 * Used to align PLC tick-time on CANopen SYNC |
34 */ |
34 */ |
35 %(post_sync)s |
35 %(post_sync)s |
36 |
36 |
37 #define NODE_FORCE_SYNC(nodename) \ |
37 #define NODE_FORCE_SYNC(nodename) \ |
38 /* Artificially force sync state to 1 so that it is not started */\ |
38 /* Artificially force sync state to 1 so that it is not started */\ |
46 setNodeId(&nodename##_Data, nodeid);\ |
46 setNodeId(&nodename##_Data, nodeid);\ |
47 /* init */\ |
47 /* init */\ |
48 setState(&nodename##_Data, Initialisation); |
48 setState(&nodename##_Data, Initialisation); |
49 |
49 |
50 #define NODE_MASTER_INIT(nodename, nodeid) \ |
50 #define NODE_MASTER_INIT(nodename, nodeid) \ |
51 NODE_FORCE_SYNC(nodename) \ |
51 NODE_FORCE_SYNC(nodename) \ |
52 NODE_INIT(nodename, nodeid) |
52 NODE_INIT(nodename, nodeid) |
53 |
53 |
54 #define NODE_SLAVE_INIT(nodename, nodeid) \ |
54 #define NODE_SLAVE_INIT(nodename, nodeid) \ |
55 NODE_INIT(nodename, nodeid) |
55 NODE_INIT(nodename, nodeid) |
56 |
56 |
57 void InitNodes(CO_Data* d, UNS32 id) |
57 void InitNodes(CO_Data* d, UNS32 id) |
58 { |
58 { |
59 %(slavebootup_register)s |
59 %(slavebootup_register)s |
60 %(post_sync_register)s |
60 %(post_sync_register)s |
61 %(nodes_init)s |
61 %(nodes_init)s |
62 } |
62 } |
63 |
63 |
|
64 #define NODE_STOP(nodename) \ |
|
65 if(init_level-- > 0)\ |
|
66 {\ |
|
67 masterSendNMTstateChange(&nodename##_Data, 0, NMT_Reset_Node);\ |
|
68 setState(&nodename##_Data, Stopped);\ |
|
69 } |
|
70 |
64 void Exit(CO_Data* d, UNS32 id) |
71 void Exit(CO_Data* d, UNS32 id) |
65 { |
72 { |
|
73 %(nodes_stop)s |
66 } |
74 } |
67 |
75 |
68 #define NODE_CLOSE(nodename) \ |
76 #define NODE_CLOSE(nodename) \ |
69 if(init_level-- > 0)\ |
77 if(init_level_c-- > 0)\ |
70 {\ |
78 {\ |
71 EnterMutex();\ |
79 canClose(&nodename##_Data);\ |
72 masterSendNMTstateChange(&nodename##_Data, 0, NMT_Reset_Node);\ |
|
73 setState(&nodename##_Data, Stopped);\ |
|
74 LeaveMutex();\ |
|
75 canClose(&nodename##_Data);\ |
|
76 } |
80 } |
77 |
81 |
78 void __cleanup_%(locstr)s() |
82 void __cleanup_%(locstr)s() |
79 { |
83 { |
80 // Stop timer thread |
84 // Stop timer thread |
81 if(init_level-- > 0){ |
85 if(init_level-- > 0){ |
|
86 int init_level_c = init_level; |
82 StopTimerLoop(&Exit); |
87 StopTimerLoop(&Exit); |
83 %(nodes_close)s |
88 %(nodes_close)s |
84 } |
89 } |
85 #if !defined(WIN32) || defined(__CYGWIN__) |
90 #if !defined(WIN32) || defined(__CYGWIN__) |
86 TimerCleanup(); |
91 TimerCleanup(); |
87 #endif |
92 #endif |
88 } |
93 } |
89 |
94 |
90 #define NODE_OPEN(nodename)\ |
95 #define NODE_OPEN(nodename)\ |
91 if(!canOpen(&nodename##Board,&nodename##_Data)){\ |
96 if(!canOpen(&nodename##Board,&nodename##_Data)){\ |
102 if( !LoadCanDriver("%(candriver)s") ){ |
107 if( !LoadCanDriver("%(candriver)s") ){ |
103 fprintf(stderr, "Cannot load CAN interface library for CanFestival (%(candriver)s)\n");\ |
108 fprintf(stderr, "Cannot load CAN interface library for CanFestival (%(candriver)s)\n");\ |
104 fflush(stderr); |
109 fflush(stderr); |
105 return -1; |
110 return -1; |
106 } |
111 } |
107 #endif |
112 #endif |
108 #if !defined(WIN32) || defined(__CYGWIN__) |
113 #if !defined(WIN32) || defined(__CYGWIN__) |
109 TimerInit(); |
114 TimerInit(); |
110 #endif |
115 #endif |
111 |
116 |
112 %(nodes_open)s |
117 %(nodes_open)s |
113 |
118 |
114 // Start timer thread |
119 // Start timer thread |
115 StartTimerLoop(&InitNodes); |
120 StartTimerLoop(&InitNodes); |
116 init_level++; |
121 init_level++; |