author | Edouard Tisserant <edouard.tisserant@gmail.com> |
Mon, 22 Jan 2024 21:30:23 +0100 | |
changeset 3887 | 2df45e4bd500 |
parent 1428 | e14003eb4d42 |
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" |
776
c81397b665b6
Fixed generated CF code to match latest changes
Edouard Tisserant
parents:
721
diff
changeset
|
3 |
#include "dcf.h" |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
4 |
|
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
5 |
/* CanFestival nodes generated OD headers*/ |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
6 |
%(nodes_includes)s |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
7 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
8 |
#define BOARD_DECL(nodename, busname, baudrate)\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
9 |
s_BOARD nodename##Board = {busname, baudrate}; |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
10 |
|
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
11 |
/* CAN channels declaration */ |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
12 |
%(board_decls)s |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
13 |
|
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
14 |
/* Keep track of init level to cleanup correctly */ |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
15 |
static int init_level=0; |
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
16 |
/* Retrieve PLC cycle time */ |
1428
e14003eb4d42
Simplified use of runtime's global variable __common_ticktime accross extensions.
Edouard Tisserant
parents:
1397
diff
changeset
|
17 |
extern unsigned long long common_ticktime__; |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
18 |
|
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
19 |
/* Per master node slavebootup callbacks. Checks that |
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
20 |
* every node have booted before calling Master_post_SlaveBootup */ |
169
8e87b69286c0
SlaveBootup now set operational state for both local node and network nodes only when all nodes declared in network edit have been initialized.
etisserant
parents:
160
diff
changeset
|
21 |
%(slavebootups)s |
8e87b69286c0
SlaveBootup now set operational state for both local node and network nodes only when all nodes declared in network edit have been initialized.
etisserant
parents:
160
diff
changeset
|
22 |
|
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
23 |
/* One slave node post_sync callback. |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
24 |
* Used to align PLC tick-time on CANopen SYNC |
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
25 |
*/ |
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
26 |
%(post_sync)s |
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
27 |
|
778 | 28 |
/* Triggers DCF transission |
29 |
*/ |
|
30 |
%(pre_op)s |
|
31 |
||
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
32 |
#define NODE_FORCE_SYNC(nodename) \ |
57 | 33 |
/* Artificially force sync state to 1 so that it is not started */\ |
34 |
nodename##_Data.CurrentCommunicationState.csSYNC = -1;\ |
|
35 |
/* Force sync period to common_ticktime__ so that other node can read it*/\ |
|
36 |
*nodename##_Data.COB_ID_Sync = 0x40000080;\ |
|
1428
e14003eb4d42
Simplified use of runtime's global variable __common_ticktime accross extensions.
Edouard Tisserant
parents:
1397
diff
changeset
|
37 |
*nodename##_Data.Sync_Cycle_Period = common_ticktime__ / 1000; |
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
38 |
|
1397
21a2ea65cb30
Delayed CANopen initialization for better busoff recovery
Edouard Tisserant
parents:
778
diff
changeset
|
39 |
static void DeferedInitAlarm(CO_Data* d, UNS32 id){ |
21a2ea65cb30
Delayed CANopen initialization for better busoff recovery
Edouard Tisserant
parents:
778
diff
changeset
|
40 |
/* Node will start beeing active on the network after this */ |
21a2ea65cb30
Delayed CANopen initialization for better busoff recovery
Edouard Tisserant
parents:
778
diff
changeset
|
41 |
setState(d, Initialisation); |
21a2ea65cb30
Delayed CANopen initialization for better busoff recovery
Edouard Tisserant
parents:
778
diff
changeset
|
42 |
} |
21a2ea65cb30
Delayed CANopen initialization for better busoff recovery
Edouard Tisserant
parents:
778
diff
changeset
|
43 |
|
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
44 |
#define NODE_INIT(nodename, nodeid) \ |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
45 |
/* Defining the node Id */\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
46 |
setNodeId(&nodename##_Data, nodeid);\ |
1397
21a2ea65cb30
Delayed CANopen initialization for better busoff recovery
Edouard Tisserant
parents:
778
diff
changeset
|
47 |
SetAlarm(&nodename##_Data,0,&DeferedInitAlarm,MS_TO_TIMEVAL(100),0); |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
48 |
|
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
49 |
#define NODE_MASTER_INIT(nodename, nodeid) \ |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
50 |
NODE_FORCE_SYNC(nodename) \ |
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
51 |
NODE_INIT(nodename, nodeid) |
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
52 |
|
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
53 |
#define NODE_SLAVE_INIT(nodename, nodeid) \ |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
54 |
NODE_INIT(nodename, nodeid) |
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
55 |
|
1397
21a2ea65cb30
Delayed CANopen initialization for better busoff recovery
Edouard Tisserant
parents:
778
diff
changeset
|
56 |
static void InitNodes(CO_Data* d, UNS32 id) |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
57 |
{ |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
58 |
%(slavebootup_register)s |
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
59 |
%(post_sync_register)s |
778 | 60 |
%(pre_op_register)s |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
61 |
%(nodes_init)s |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
62 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
63 |
|
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
64 |
#define NODE_STOP(nodename) \ |
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
65 |
if(init_level-- > 0)\ |
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
66 |
{\ |
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
67 |
masterSendNMTstateChange(&nodename##_Data, 0, NMT_Reset_Node);\ |
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
68 |
setState(&nodename##_Data, Stopped);\ |
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
69 |
} |
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
70 |
|
1397
21a2ea65cb30
Delayed CANopen initialization for better busoff recovery
Edouard Tisserant
parents:
778
diff
changeset
|
71 |
static void Exit(CO_Data* d, UNS32 id) |
144
7818ec7b5c53
add Exit function and StopTimerLoop arg to match with recent changes in CanFestival
greg
parents:
137
diff
changeset
|
72 |
{ |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
73 |
%(nodes_stop)s |
144
7818ec7b5c53
add Exit function and StopTimerLoop arg to match with recent changes in CanFestival
greg
parents:
137
diff
changeset
|
74 |
} |
7818ec7b5c53
add Exit function and StopTimerLoop arg to match with recent changes in CanFestival
greg
parents:
137
diff
changeset
|
75 |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
76 |
#define NODE_CLOSE(nodename) \ |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
77 |
if(init_level_c-- > 0)\ |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
78 |
{\ |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
79 |
canClose(&nodename##_Data);\ |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
80 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
81 |
|
512
36aeab46f27d
Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents:
360
diff
changeset
|
82 |
void __cleanup_%(locstr)s(void) |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
83 |
{ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
84 |
// Stop timer thread |
203 | 85 |
if(init_level-- > 0){ |
360
32339ad7d9ae
update cf_runtime.c (now call TimerInit and TimerCleanup on win32 platform)
greg
parents:
336
diff
changeset
|
86 |
int init_level_c = init_level; |
144
7818ec7b5c53
add Exit function and StopTimerLoop arg to match with recent changes in CanFestival
greg
parents:
137
diff
changeset
|
87 |
StopTimerLoop(&Exit); |
203 | 88 |
%(nodes_close)s |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
89 |
} |
360
32339ad7d9ae
update cf_runtime.c (now call TimerInit and TimerCleanup on win32 platform)
greg
parents:
336
diff
changeset
|
90 |
|
32339ad7d9ae
update cf_runtime.c (now call TimerInit and TimerCleanup on win32 platform)
greg
parents:
336
diff
changeset
|
91 |
TimerCleanup(); |
52
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 |
|
512
36aeab46f27d
Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents:
360
diff
changeset
|
94 |
#ifndef stderr |
36aeab46f27d
Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents:
360
diff
changeset
|
95 |
#define fprintf(...) |
36aeab46f27d
Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents:
360
diff
changeset
|
96 |
#define fflush(...) |
36aeab46f27d
Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents:
360
diff
changeset
|
97 |
#endif |
36aeab46f27d
Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents:
360
diff
changeset
|
98 |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
99 |
#define NODE_OPEN(nodename)\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
100 |
if(!canOpen(&nodename##Board,&nodename##_Data)){\ |
235 | 101 |
fprintf(stderr,"Cannot open CAN intefrace %%s at speed %%s\n for CANopen node \"" #nodename "\"",nodename##Board.busname, nodename##Board.baudrate);\ |
102 |
fflush(stderr);\ |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
103 |
return -1;\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
104 |
}\ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
105 |
init_level++; |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
106 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
107 |
/*************************** INIT *****************************************/ |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
108 |
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
|
109 |
{ |
57 | 110 |
#ifndef NOT_USE_DYNAMIC_LOADING |
75 | 111 |
if( !LoadCanDriver("%(candriver)s") ){ |
57 | 112 |
fprintf(stderr, "Cannot load CAN interface library for CanFestival (%(candriver)s)\n");\ |
512
36aeab46f27d
Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents:
360
diff
changeset
|
113 |
fflush(stderr);\ |
36aeab46f27d
Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents:
360
diff
changeset
|
114 |
return -1;\ |
57 | 115 |
} |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
116 |
#endif |
360
32339ad7d9ae
update cf_runtime.c (now call TimerInit and TimerCleanup on win32 platform)
greg
parents:
336
diff
changeset
|
117 |
|
32339ad7d9ae
update cf_runtime.c (now call TimerInit and TimerCleanup on win32 platform)
greg
parents:
336
diff
changeset
|
118 |
TimerInit(); |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
119 |
|
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
120 |
%(nodes_open)s |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
121 |
|
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
122 |
// Start timer thread |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
123 |
StartTimerLoop(&InitNodes); |
57 | 124 |
init_level++; |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
125 |
return 0; |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
126 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
127 |
|
57 | 128 |
#define NODE_SEND_SYNC(nodename)\ |
776
c81397b665b6
Fixed generated CF code to match latest changes
Edouard Tisserant
parents:
721
diff
changeset
|
129 |
if(getState(&nodename##_Data)==Operational){\ |
c81397b665b6
Fixed generated CF code to match latest changes
Edouard Tisserant
parents:
721
diff
changeset
|
130 |
sendSYNCMessage(&nodename##_Data);\ |
c81397b665b6
Fixed generated CF code to match latest changes
Edouard Tisserant
parents:
721
diff
changeset
|
131 |
} |
57 | 132 |
|
512
36aeab46f27d
Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents:
360
diff
changeset
|
133 |
void __retrieve_%(locstr)s(void) |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
134 |
{ |
57 | 135 |
/* Locks the stack, so that no changes occurs while PLC access variables |
336
ae3488c79283
Fixed bug : Segmentation fault or locks when stop PLC if no CAN network.
greg
parents:
235
diff
changeset
|
136 |
* TODO : implement buffers to avoid such a big lock |
57 | 137 |
* */ |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
138 |
EnterMutex(); |
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
139 |
/* Send Sync */ |
57 | 140 |
%(nodes_send_sync)s |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
141 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
142 |
|
57 | 143 |
#define NODE_PROCEED_SYNC(nodename)\ |
144 |
proceedSYNC(&nodename##_Data); |
|
145 |
||
512
36aeab46f27d
Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents:
360
diff
changeset
|
146 |
void __publish_%(locstr)s(void) |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
147 |
{ |
178
2390b409eb93
Added PLC tick alignement on external synchronization source feature.
etisserant
parents:
174
diff
changeset
|
148 |
/* Process sync event */ |
57 | 149 |
%(nodes_proceed_sync)s |
52
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
150 |
LeaveMutex(); |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
151 |
} |
eaffcd0a2f03
Added CanFestival "main" runtime part, initialize, all nodes, and start CF timer loop
etisserant
parents:
diff
changeset
|
152 |