1 |
1 |
2 #include "canfestival.h" |
2 #include "canfestival.h" |
3 |
3 |
|
4 /* CanFestival nodes generated OD headers*/ |
4 %(nodes_includes)s |
5 %(nodes_includes)s |
5 |
6 |
6 #define BOARD_DECL(nodename, busname, baudrate)\ |
7 #define BOARD_DECL(nodename, busname, baudrate)\ |
7 s_BOARD nodename##Board = {busname, baudrate}; |
8 s_BOARD nodename##Board = {busname, baudrate}; |
8 |
9 |
|
10 /* CAN channels declaration */ |
9 %(board_decls)s |
11 %(board_decls)s |
10 |
12 |
|
13 /* Keep track of init level to cleanup correctly */ |
11 static int init_level=0; |
14 static int init_level=0; |
|
15 /* Retrieve PLC cycle time */ |
12 extern int common_ticktime__; |
16 extern int common_ticktime__; |
13 |
17 |
|
18 /* Called once all NetworkEdit declares slaves have booted*/ |
14 static void Master_post_SlaveBootup(CO_Data* d, UNS8 nodeId) |
19 static void Master_post_SlaveBootup(CO_Data* d, UNS8 nodeId) |
15 { |
20 { |
16 /* Put the master in operational mode */ |
21 /* Put the master in operational mode */ |
17 setState(d, Operational); |
22 setState(d, Operational); |
18 |
23 |
19 /* Ask slave node to go in operational mode */ |
24 /* Ask slave node to go in operational mode */ |
20 masterSendNMTstateChange (d, 0, NMT_Start_Node); |
25 masterSendNMTstateChange (d, 0, NMT_Start_Node); |
21 } |
26 } |
22 |
27 |
|
28 /* Per master node slavebootup callbacks. Checks that |
|
29 * every node have booted before calling Master_post_SlaveBootup */ |
23 %(slavebootups)s |
30 %(slavebootups)s |
24 |
31 |
25 #define NODE_INIT(nodename, nodeid) \ |
32 /* One slave node post_sync callback. |
|
33 * Used to align PLC tick-time on CANopen SYNC |
|
34 */ |
|
35 %(post_sync)s |
|
36 |
|
37 #define NODE_FORCE_SYNC(nodename) \ |
26 /* 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 */\ |
27 nodename##_Data.CurrentCommunicationState.csSYNC = -1;\ |
39 nodename##_Data.CurrentCommunicationState.csSYNC = -1;\ |
28 /* Force sync period to common_ticktime__ so that other node can read it*/\ |
40 /* Force sync period to common_ticktime__ so that other node can read it*/\ |
29 *nodename##_Data.COB_ID_Sync = 0x40000080;\ |
41 *nodename##_Data.COB_ID_Sync = 0x40000080;\ |
30 *nodename##_Data.Sync_Cycle_Period = common_ticktime__ * 1000;\ |
42 *nodename##_Data.Sync_Cycle_Period = common_ticktime__ * 1000; |
|
43 |
|
44 #define NODE_INIT(nodename, nodeid) \ |
31 /* Defining the node Id */\ |
45 /* Defining the node Id */\ |
32 setNodeId(&nodename##_Data, nodeid);\ |
46 setNodeId(&nodename##_Data, nodeid);\ |
33 /* init */\ |
47 /* init */\ |
34 setState(&nodename##_Data, Initialisation); |
48 setState(&nodename##_Data, Initialisation); |
35 |
49 |
|
50 #define NODE_MASTER_INIT(nodename, nodeid) \ |
|
51 NODE_FORCE_SYNC(nodename) \ |
|
52 NODE_INIT(nodename, nodeid) |
|
53 |
|
54 #define NODE_SLAVE_INIT(nodename, nodeid) \ |
|
55 NODE_INIT(nodename, nodeid) |
|
56 |
36 void InitNodes(CO_Data* d, UNS32 id) |
57 void InitNodes(CO_Data* d, UNS32 id) |
37 { |
58 { |
|
59 %(slavebootup_register)s |
|
60 %(post_sync_register)s |
38 %(nodes_init)s |
61 %(nodes_init)s |
39 %(slavebootup_register)s |
|
40 } |
62 } |
41 |
63 |
42 void Exit(CO_Data* d, UNS32 id) |
64 void Exit(CO_Data* d, UNS32 id) |
43 { |
65 { |
44 } |
66 } |