lib/accessor.h
author Edouard Tisserant
Fri, 19 Oct 2012 12:10:32 +0200
changeset 634 736b36a83548
parent 403 b6568471de90
child 706 31553c22f318
permissions -rwxr-xr-x
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     1
#ifndef __ACCESSOR_H
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     2
#define __ACCESSOR_H
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     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
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     6
// variable declaration macros
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     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
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    12
	void __INIT_GLOBAL_##name(type value) {\
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    13
		(*GLOBAL__##name).value = value;\
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    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
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    17
	}\
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    18
	type* __GET_GLOBAL_##name(void) {\
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    19
		return &((*GLOBAL__##name).value);\
231
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 227
diff changeset
    20
	}
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    21
#define __DECLARE_GLOBAL_LOCATION(type, location)\
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    22
	extern type *location;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    23
#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
    24
	__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
    25
	static __IEC_##type##_p *GLOBAL__##name = &(resource##__##name);\
242
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    26
	void __INIT_GLOBAL_##name(type value) {\
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    27
		*((*GLOBAL__##name).value) = value;\
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    28
	}\
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    29
	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
    30
		return (*GLOBAL__##name).flags & __IEC_FORCE_FLAG;\
242
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    31
	}\
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    32
	type* __GET_GLOBAL_##name(void) {\
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    33
		return (*GLOBAL__##name).value;\
0036357a990f Bug with global located variables accessors fixed
laurent
parents: 235
diff changeset
    34
	}
396
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 395
diff changeset
    35
#define __DECLARE_GLOBAL_PROTOTYPE(type, name)\
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 395
diff changeset
    36
    extern type* __GET_GLOBAL_##name();
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    37
#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
    38
	__IEC_##type##_p name;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    39
#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
    40
	__IEC_##type##_p name;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    41
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    42
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    43
// variable initialization macros
225
36d05588f91b Fix accessor code
laurent
parents: 222
diff changeset
    44
#define __INIT_RETAIN(name, retained)\
227
560c1231ad1f Changes merged
laurent
parents: 225 224
diff changeset
    45
    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
    46
#define __INIT_VAR(name, initial, retained)\
225
36d05588f91b Fix accessor code
laurent
parents: 222
diff changeset
    47
	name.value = initial;\
36d05588f91b Fix accessor code
laurent
parents: 222
diff changeset
    48
	__INIT_RETAIN(name, retained)
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 252
diff changeset
    49
#define __INIT_GLOBAL(type, name, initial, retained)\
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 252
diff changeset
    50
    {\
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 252
diff changeset
    51
	    static const type temp = initial;\
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 252
diff changeset
    52
	    __INIT_GLOBAL_##name(temp);\
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 252
diff changeset
    53
	    __INIT_RETAIN((*GLOBAL__##name), retained)\
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 252
diff changeset
    54
    }
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    55
#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
    56
	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
    57
	__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
    58
#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
    59
    {\
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    60
		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
    61
		__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
    62
    }
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
    63
#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
    64
	{\
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    65
		extern type *location;\
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    66
		name.value = location;\
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    67
		__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
    68
    }
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    69
#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
    70
	*(name.value) = initial;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    71
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    72
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    73
// 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
    74
#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
    75
	name.value __VA_ARGS__
225
36d05588f91b Fix accessor code
laurent
parents: 222
diff changeset
    76
#define __GET_EXTERNAL(name, ...)\
394
8a04e93f9ef2 Fixing bug in generated code for complex type external variable
laurent
parents: 392
diff changeset
    77
	((name.flags & __IEC_FORCE_FLAG) ? name.fvalue __VA_ARGS__ : (*(name.value)) __VA_ARGS__)
225
36d05588f91b Fix accessor code
laurent
parents: 222
diff changeset
    78
#define __GET_LOCATED(name, ...)\
394
8a04e93f9ef2 Fixing bug in generated code for complex type external variable
laurent
parents: 392
diff changeset
    79
	((name.flags & __IEC_FORCE_FLAG) ? name.fvalue __VA_ARGS__ : (*(name.value)) __VA_ARGS__)
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 231
diff changeset
    80
#define __GET_VAR_BY_REF(name, ...)\
252
0bda13ec66b3 Bug with getter for pointed variables in accessors fixed
laurent
parents: 242
diff changeset
    81
	((name.flags & __IEC_FORCE_FLAG) ? &(name.fvalue __VA_ARGS__) : &(name.value __VA_ARGS__))
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 231
diff changeset
    82
#define __GET_EXTERNAL_BY_REF(name, ...)\
394
8a04e93f9ef2 Fixing bug in generated code for complex type external variable
laurent
parents: 392
diff changeset
    83
	((name.flags & __IEC_FORCE_FLAG) ? &(name.fvalue __VA_ARGS__) : &((*(name.value)) __VA_ARGS__))
235
ed66dc50f31a Bug on generate_c_inlinefcall fixed
laurent
parents: 231
diff changeset
    84
#define __GET_LOCATED_BY_REF(name, ...)\
394
8a04e93f9ef2 Fixing bug in generated code for complex type external variable
laurent
parents: 392
diff changeset
    85
	((name.flags & __IEC_FORCE_FLAG) ? &(name.fvalue __VA_ARGS__) : &((*(name.value)) __VA_ARGS__))
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    86
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    87
// variable setting macros
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    88
#define __SET_VAR(prefix, name, new_value, ...)\
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    89
	if (!(prefix name.flags & __IEC_FORCE_FLAG)) prefix name.value __VA_ARGS__ = new_value
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    90
#define __SET_EXTERNAL(prefix, name, new_value, ...)\
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    91
	if (!(prefix name.flags & __IEC_FORCE_FLAG || __IS_GLOBAL_##name##_FORCED()))\
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    92
		(*(prefix name.value)) __VA_ARGS__ = new_value
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    93
#define __SET_LOCATED(prefix, name, new_value, ...)\
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
    94
	if (!(prefix name.flags & __IEC_FORCE_FLAG)) *(prefix name.value) __VA_ARGS__ = new_value
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    95
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    96
#endif //__ACCESSOR_H