author | Mario de Sousa <msousa@fe.up.pt> |
Wed, 30 Aug 2017 22:13:26 +0100 | |
changeset 1060 | 01c48180af05 |
parent 1051 | e483512edbeb |
child 1095 | 36bbd0b64816 |
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, ...)\ |
394
8a04e93f9ef2
Fixing bug in generated code for complex type external variable
laurent
parents:
392
diff
changeset
|
90 |
((name.flags & __IEC_FORCE_FLAG) ? name.fvalue __VA_ARGS__ : (*(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, ...)\ |
394
8a04e93f9ef2
Fixing bug in generated code for complex type external variable
laurent
parents:
392
diff
changeset
|
94 |
((name.flags & __IEC_FORCE_FLAG) ? name.fvalue __VA_ARGS__ : (*(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, ...)\ |
252
0bda13ec66b3
Bug with getter for pointed variables in accessors fixed
laurent
parents:
242
diff
changeset
|
97 |
((name.flags & __IEC_FORCE_FLAG) ? &(name.fvalue __VA_ARGS__) : &(name.value __VA_ARGS__)) |
235 | 98 |
#define __GET_EXTERNAL_BY_REF(name, ...)\ |
394
8a04e93f9ef2
Fixing bug in generated code for complex type external variable
laurent
parents:
392
diff
changeset
|
99 |
((name.flags & __IEC_FORCE_FLAG) ? &(name.fvalue __VA_ARGS__) : &((*(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, ...)\ |
394
8a04e93f9ef2
Fixing bug in generated code for complex type external variable
laurent
parents:
392
diff
changeset
|
103 |
((name.flags & __IEC_FORCE_FLAG) ? &(name.fvalue __VA_ARGS__) : &((*(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)\ |
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
873
diff
changeset
|
132 |
__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
|
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 |