author | Edouard Tisserant <edouard.tisserant@gmail.com> |
Thu, 20 Jul 2023 22:03:02 +0200 | |
changeset 1101 | f7a0e962650d |
parent 1096 | fad6e7a818e2 |
permissions | -rwxr-xr-x |
219 | 1 |
#ifndef __ACCESSOR_H |
2 |
#define __ACCESSOR_H |
|
3 |
||
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
252
diff
changeset
|
4 |
#define __INITIAL_VALUE(...) __VA_ARGS__ |
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
5 |
|
219 | 6 |
// variable declaration macros |
7 |
#define __DECLARE_VAR(type, name)\ |
|
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
8 |
__IEC_##type##_t name; |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
9 |
#define __DECLARE_GLOBAL(type, domain, name)\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
10 |
__IEC_##type##_t domain##__##name;\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
11 |
static __IEC_##type##_t *GLOBAL__##name = &(domain##__##name);\ |
242 | 12 |
void __INIT_GLOBAL_##name(type value) {\ |
13 |
(*GLOBAL__##name).value = value;\ |
|
14 |
}\ |
|
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
15 |
IEC_BYTE __IS_GLOBAL_##name##_FORCED(void) {\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
16 |
return (*GLOBAL__##name).flags & __IEC_FORCE_FLAG;\ |
242 | 17 |
}\ |
18 |
type* __GET_GLOBAL_##name(void) {\ |
|
19 |
return &((*GLOBAL__##name).value);\ |
|
231
b8527b0abe75
Adding support for forcing global without perturbation from setting external
laurent
parents:
227
diff
changeset
|
20 |
} |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
21 |
#define __DECLARE_GLOBAL_FB(type, domain, name)\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
22 |
type domain##__##name;\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
23 |
static type *GLOBAL__##name = &(domain##__##name);\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
24 |
type* __GET_GLOBAL_##name(void) {\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
25 |
return &(*GLOBAL__##name);\ |
708
6cc8255ecfe4
Fix in accessor undefined init methods for function block global instances
Laurent Bessard
parents:
706
diff
changeset
|
26 |
}\ |
6cc8255ecfe4
Fix in accessor undefined init methods for function block global instances
Laurent Bessard
parents:
706
diff
changeset
|
27 |
extern void type##_init__(type* data__, BOOL retain); |
219 | 28 |
#define __DECLARE_GLOBAL_LOCATION(type, location)\ |
29 |
extern type *location; |
|
30 |
#define __DECLARE_GLOBAL_LOCATED(type, resource, name)\ |
|
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
31 |
__IEC_##type##_p resource##__##name;\ |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
32 |
static __IEC_##type##_p *GLOBAL__##name = &(resource##__##name);\ |
242 | 33 |
void __INIT_GLOBAL_##name(type value) {\ |
34 |
*((*GLOBAL__##name).value) = value;\ |
|
35 |
}\ |
|
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
36 |
IEC_BYTE __IS_GLOBAL_##name##_FORCED(void) {\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
37 |
return (*GLOBAL__##name).flags & __IEC_FORCE_FLAG;\ |
242 | 38 |
}\ |
39 |
type* __GET_GLOBAL_##name(void) {\ |
|
40 |
return (*GLOBAL__##name).value;\ |
|
41 |
} |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
395
diff
changeset
|
42 |
#define __DECLARE_GLOBAL_PROTOTYPE(type, name)\ |
713
e3ca0f4d47b3
Fix warning message when declaring global variables in configuration
Laurent Bessard
parents:
708
diff
changeset
|
43 |
extern type* __GET_GLOBAL_##name(void); |
219 | 44 |
#define __DECLARE_EXTERNAL(type, name)\ |
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
45 |
__IEC_##type##_p name; |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
46 |
#define __DECLARE_EXTERNAL_FB(type, name)\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
47 |
type* name; |
219 | 48 |
#define __DECLARE_LOCATED(type, name)\ |
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
49 |
__IEC_##type##_p name; |
219 | 50 |
|
51 |
||
52 |
// variable initialization macros |
|
225 | 53 |
#define __INIT_RETAIN(name, retained)\ |
227 | 54 |
name.flags |= retained?__IEC_RETAIN_FLAG:0; |
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
55 |
#define __INIT_VAR(name, initial, retained)\ |
225 | 56 |
name.value = initial;\ |
57 |
__INIT_RETAIN(name, retained) |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
252
diff
changeset
|
58 |
#define __INIT_GLOBAL(type, name, initial, retained)\ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
252
diff
changeset
|
59 |
{\ |
1051
e483512edbeb
Fix bug: allow global variables of type DT (initial values for DT are not const!)
Paul Beltyukov <beltyukov.p.a@gmail.com>
parents:
1006
diff
changeset
|
60 |
type temp = initial;\ |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
252
diff
changeset
|
61 |
__INIT_GLOBAL_##name(temp);\ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
252
diff
changeset
|
62 |
__INIT_RETAIN((*GLOBAL__##name), retained)\ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
252
diff
changeset
|
63 |
} |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
64 |
#define __INIT_GLOBAL_FB(type, name, retained)\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
65 |
type##_init__(&(*GLOBAL__##name), retained); |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
66 |
#define __INIT_GLOBAL_LOCATED(domain, name, location, retained)\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
67 |
domain##__##name.value = location;\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
68 |
__INIT_RETAIN(domain##__##name, retained) |
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
69 |
#define __INIT_EXTERNAL(type, global, name, retained)\ |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
70 |
{\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
71 |
name.value = __GET_GLOBAL_##global();\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
72 |
__INIT_RETAIN(name, retained)\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
73 |
} |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
74 |
#define __INIT_EXTERNAL_FB(type, global, name, retained)\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
75 |
name = __GET_GLOBAL_##global(); |
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
76 |
#define __INIT_LOCATED(type, location, name, retained)\ |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
77 |
{\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
78 |
extern type *location;\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
79 |
name.value = location;\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
80 |
__INIT_RETAIN(name, retained)\ |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
377
diff
changeset
|
81 |
} |
219 | 82 |
#define __INIT_LOCATED_VALUE(name, initial)\ |
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
83 |
*(name.value) = initial; |
219 | 84 |
|
85 |
||
86 |
// variable getting macros |
|
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
87 |
#define __GET_VAR(name, ...)\ |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
219
diff
changeset
|
88 |
name.value __VA_ARGS__ |
225 | 89 |
#define __GET_EXTERNAL(name, ...)\ |
1096
fad6e7a818e2
Variable forcing now uses limited list and buffer instead of systematical instance tree traversal and in-tree "fvalue" to keep track of forced value for pointed variables (external, located). Pointer swapping is performed when forcing externals and located, with backup being restored when forcing is reset. Match Beremiz commit 93ad018fb602.
Edouard Tisserant
parents:
1095
diff
changeset
|
90 |
((*(name.value)) __VA_ARGS__) |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
91 |
#define __GET_EXTERNAL_FB(name, ...)\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
92 |
__GET_VAR(((*name) __VA_ARGS__)) |
225 | 93 |
#define __GET_LOCATED(name, ...)\ |
1096
fad6e7a818e2
Variable forcing now uses limited list and buffer instead of systematical instance tree traversal and in-tree "fvalue" to keep track of forced value for pointed variables (external, located). Pointer swapping is performed when forcing externals and located, with backup being restored when forcing is reset. Match Beremiz commit 93ad018fb602.
Edouard Tisserant
parents:
1095
diff
changeset
|
94 |
((*(name.value)) __VA_ARGS__) |
873
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
95 |
|
235 | 96 |
#define __GET_VAR_BY_REF(name, ...)\ |
1096
fad6e7a818e2
Variable forcing now uses limited list and buffer instead of systematical instance tree traversal and in-tree "fvalue" to keep track of forced value for pointed variables (external, located). Pointer swapping is performed when forcing externals and located, with backup being restored when forcing is reset. Match Beremiz commit 93ad018fb602.
Edouard Tisserant
parents:
1095
diff
changeset
|
97 |
(&(name.value __VA_ARGS__)) |
235 | 98 |
#define __GET_EXTERNAL_BY_REF(name, ...)\ |
1096
fad6e7a818e2
Variable forcing now uses limited list and buffer instead of systematical instance tree traversal and in-tree "fvalue" to keep track of forced value for pointed variables (external, located). Pointer swapping is performed when forcing externals and located, with backup being restored when forcing is reset. Match Beremiz commit 93ad018fb602.
Edouard Tisserant
parents:
1095
diff
changeset
|
99 |
(&((*(name.value)) __VA_ARGS__)) |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
100 |
#define __GET_EXTERNAL_FB_BY_REF(name, ...)\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
403
diff
changeset
|
101 |
__GET_EXTERNAL_BY_REF(((*name) __VA_ARGS__)) |
235 | 102 |
#define __GET_LOCATED_BY_REF(name, ...)\ |
1096
fad6e7a818e2
Variable forcing now uses limited list and buffer instead of systematical instance tree traversal and in-tree "fvalue" to keep track of forced value for pointed variables (external, located). Pointer swapping is performed when forcing externals and located, with backup being restored when forcing is reset. Match Beremiz commit 93ad018fb602.
Edouard Tisserant
parents:
1095
diff
changeset
|
103 |
(&((*(name.value)) __VA_ARGS__)) |
219 | 104 |
|
873
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
105 |
#define __GET_VAR_REF(name, ...)\ |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
106 |
(&(name.value __VA_ARGS__)) |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
107 |
#define __GET_EXTERNAL_REF(name, ...)\ |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
108 |
(&((*(name.value)) __VA_ARGS__)) |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
109 |
#define __GET_EXTERNAL_FB_REF(name, ...)\ |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
110 |
(&(__GET_VAR(((*name) __VA_ARGS__)))) |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
111 |
#define __GET_LOCATED_REF(name, ...)\ |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
112 |
(&((*(name.value)) __VA_ARGS__)) |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
113 |
|
933
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
904
diff
changeset
|
114 |
#define __GET_VAR_DREF(name, ...)\ |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
904
diff
changeset
|
115 |
(*(name.value __VA_ARGS__)) |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
904
diff
changeset
|
116 |
#define __GET_EXTERNAL_DREF(name, ...)\ |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
904
diff
changeset
|
117 |
(*((*(name.value)) __VA_ARGS__)) |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
904
diff
changeset
|
118 |
#define __GET_EXTERNAL_FB_DREF(name, ...)\ |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
904
diff
changeset
|
119 |
(*(__GET_VAR(((*name) __VA_ARGS__)))) |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
904
diff
changeset
|
120 |
#define __GET_LOCATED_DREF(name, ...)\ |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
904
diff
changeset
|
121 |
(*((*(name.value)) __VA_ARGS__)) |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
904
diff
changeset
|
122 |
|
873
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
819
diff
changeset
|
123 |
|
219 | 124 |
// variable setting macros |
885
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
873
diff
changeset
|
125 |
#define __SET_VAR(prefix, name, suffix, new_value)\ |
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
873
diff
changeset
|
126 |
if (!(prefix name.flags & __IEC_FORCE_FLAG)) prefix name.value suffix = new_value |
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
873
diff
changeset
|
127 |
#define __SET_EXTERNAL(prefix, name, suffix, new_value)\ |
1006
0668ba32de98
fix C compilation warning about function prototype in __SET_EXTERNAL
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
933
diff
changeset
|
128 |
{extern IEC_BYTE __IS_GLOBAL_##name##_FORCED(void);\ |
817 | 129 |
if (!(prefix name.flags & __IEC_FORCE_FLAG || __IS_GLOBAL_##name##_FORCED()))\ |
885
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
873
diff
changeset
|
130 |
(*(prefix name.value)) suffix = new_value;} |
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
873
diff
changeset
|
131 |
#define __SET_EXTERNAL_FB(prefix, name, suffix, new_value)\ |
1095
36bbd0b64816
Fixed __SET_EXTERNAL_FB declaration in accessor.h, invoked when accessing EXTERNAL_BLOCK.VARIABLE. Macro was invoking __SET_VAR with wrong parameter count. Fixed corresponding code generator for ST. Seems similar codegen for IL is also broken, but fix would affect other (unknown) behviours -> didn't touch it.
Edouard Tisserant
parents:
1051
diff
changeset
|
132 |
__SET_VAR(prefix, name, suffix, new_value) |
885
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
873
diff
changeset
|
133 |
#define __SET_LOCATED(prefix, name, suffix, new_value)\ |
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
873
diff
changeset
|
134 |
if (!(prefix name.flags & __IEC_FORCE_FLAG)) *(prefix name.value) suffix = new_value |
219 | 135 |
|
136 |
#endif //__ACCESSOR_H |