author | greg |
Thu, 13 Mar 2008 10:24:58 +0100 | |
changeset 134 | 517db40c30b7 |
parent 75 | 9ad18a387a96 |
child 137 | 187a4e2412e5 |
permissions | -rw-r--r-- |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
1 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
2 |
#include "canfestival.h" |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
3 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
4 |
%(nodes_includes)s |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
5 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
6 |
#define BOARD_DECL(nodename, busname, baudrate)\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
7 |
s_BOARD nodename##Board = {busname, baudrate}; |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
8 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
9 |
%(board_decls)s |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
10 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
11 |
static int init_level=0; |
57 | 12 |
extern int common_ticktime__; |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
13 |
|
59
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
14 |
|
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
15 |
static void ConfigureSlaveNode(CO_Data* d, UNS8 nodeId) |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
16 |
{ |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
17 |
/* Put the master in operational mode */ |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
18 |
setState(d, Operational); |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
19 |
|
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
20 |
/* Ask slave node to go in operational mode */ |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
21 |
masterSendNMTstateChange (d, 0, NMT_Start_Node); |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
22 |
} |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
23 |
|
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
24 |
#define NODE_DECLARE(nodename, nodeid)\ |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
25 |
void nodename##_preOperational()\ |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
26 |
{\ |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
27 |
ConfigureSlaveNode(&nodename##_Data, nodeid);\ |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
28 |
}\ |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
29 |
|
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
30 |
%(nodes_declare)s |
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
31 |
|
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
32 |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
33 |
#define NODE_INIT(nodename, nodeid) \ |
57 | 34 |
/* Artificially force sync state to 1 so that it is not started */\ |
35 |
nodename##_Data.CurrentCommunicationState.csSYNC = -1;\ |
|
36 |
/* Force sync period to common_ticktime__ so that other node can read it*/\ |
|
37 |
*nodename##_Data.COB_ID_Sync = 0x40000080;\ |
|
38 |
*nodename##_Data.Sync_Cycle_Period = common_ticktime__ * 1000;\ |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
39 |
/* Defining the node Id */\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
40 |
setNodeId(&nodename##_Data, nodeid);\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
41 |
/* init */\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
42 |
setState(&nodename##_Data, Initialisation); |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
43 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
44 |
void InitNodes(CO_Data* d, UNS32 id) |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
45 |
{ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
46 |
%(nodes_init)s |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
47 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
48 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
49 |
#define NODE_CLOSE(nodename) \ |
57 | 50 |
if(init_level-- > 0)\ |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
51 |
{\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
52 |
EnterMutex();\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
53 |
setState(&nodename##_Data, Stopped);\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
54 |
LeaveMutex();\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
55 |
canClose(&nodename##_Data);\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
56 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
57 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
58 |
void __cleanup_%(locstr)s() |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
59 |
{ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
60 |
%(nodes_close)s |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
61 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
62 |
// Stop timer thread |
57 | 63 |
if(init_level-- > 0) |
64 |
StopTimerLoop(); |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
65 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
66 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
67 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
68 |
#define NODE_OPEN(nodename)\ |
59
b6ff896ff58b
Enhancements in CanFestival plugin. Now PLC with CanFestival plugin compiles and run, exchanging CanOpen PDOs
etisserant
parents:
57
diff
changeset
|
69 |
nodename##_Data.preOperational = nodename##_preOperational;\ |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
70 |
if(!canOpen(&nodename##Board,&nodename##_Data)){\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
71 |
printf("Cannot open " #nodename " Board (%%s,%%s)\n",nodename##Board.busname, nodename##Board.baudrate);\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
72 |
return -1;\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
73 |
}\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
74 |
init_level++; |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
75 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
76 |
/*************************** INIT *****************************************/ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
77 |
int __init_%(locstr)s(int argc,char **argv) |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
78 |
{ |
57 | 79 |
#ifndef NOT_USE_DYNAMIC_LOADING |
75 | 80 |
if( !LoadCanDriver("%(candriver)s") ){ |
57 | 81 |
fprintf(stderr, "Cannot load CAN interface library for CanFestival (%(candriver)s)\n");\ |
82 |
return -1; |
|
83 |
} |
|
84 |
#endif |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
85 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
86 |
%(nodes_open)s |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
87 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
88 |
// Start timer thread |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
89 |
StartTimerLoop(&InitNodes); |
57 | 90 |
init_level++; |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
91 |
return 0; |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
92 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
93 |
|
57 | 94 |
#define NODE_SEND_SYNC(nodename)\ |
95 |
sendSYNCMessage(&nodename##_Data); |
|
96 |
||
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
97 |
void __retrive_%(locstr)s() |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
98 |
{ |
57 | 99 |
/* Locks the stack, so that no changes occurs while PLC access variables |
100 |
* TODO : implement buffers to avoid such a big lock |
|
101 |
* */ |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
102 |
EnterMutex(); |
57 | 103 |
/*Send Sync */ |
104 |
%(nodes_send_sync)s |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
105 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
106 |
|
57 | 107 |
#define NODE_PROCEED_SYNC(nodename)\ |
108 |
proceedSYNC(&nodename##_Data); |
|
109 |
||
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
110 |
void __publish_%(locstr)s() |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
111 |
{ |
57 | 112 |
/*Call SendPDOEvent */ |
113 |
%(nodes_proceed_sync)s |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
114 |
LeaveMutex(); |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
115 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
116 |