Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
from digitalvariables import DigitalVariableList
def generate_digitalvariables_header(_digialvariables):
# already included from analog variables
# includes = """
# #include "../../alarms.h"
# """
includes = ''
typedef = """
// digital reading info structure
typedef struct {
digital_value_readfunc_t readfunc; // function to read the value (must be defined by user)
digital_value_t value; // last acquired value
digital_value_t value_max; // max value acquired (...)
digitalalarm_info_t alarm; // structure maintaining all the info related to the alarm
} digital_variable_t;
"""
countdef = """
// number of defined analog variables
#define DIGITAL_VARIABLES_COUNT {}
""".format(_digialvariables.count())
extern = """
// make digital variable list available to anyone including this file
extern digital_variable_t digital_variables[DIGITAL_VARIABLES_COUNT];
"""
ioread_tpl = """// IO read function for variable [name]
digital_value_t [readfunc](void);
"""
varindex_tpl = """
#define DIGITAL_VARIABLE_INDEX_[varname] [index] // index of the analog variable [varname] inside analog_variables array"""
varindex_contents = ''
index = 0
for variable in _digialvariables.entries():
varindex_define = varindex_tpl
varindex_define = varindex_define.replace('[varname]', variable.name)
varindex_define = varindex_define.replace('[index]', str(index))
index += 1
varindex_contents += varindex_define
header_contents = includes + typedef + countdef + varindex_contents + extern
# generate the prototypes for io read
ioread_list = list()
for digitalvariable in _digialvariables.entries():
ioread_source = ioread_tpl
ioread_source = ioread_source.replace('[name]', digitalvariable.name)
ioread_source = ioread_source.replace('[readfunc]', digitalvariable.get_read_function_name())
ioread_list.append(ioread_source)
header_contents += '\n'
header_contents += '\n'.join(ioread_list)
return header_contents
def generate_digitalvariables_source(_digialvariables):
entry_tpl = """// Variable: [name] ([description])
{
.readfunc = [readfunc],
.value = 0,
.value_max = 0,
.alarm = {
.enabled = [alarm_enabled],
.timeout = [alarm_timeout], // [alarm_timeout_comment]
.timeout_counter = 0,
.timeout_counter_max = 0,
.firecount = 0,
.callback = [callback]
}
}"""
ioread_tpl = """
// IO read function for variable [name]
digital_value_t [readfunc](void) {
return (digital_value_t)(0 != [ioname]_GetValue());
}
"""
source_list = list()
ioread_list = list()
for digitalvariable in _digialvariables.entries():
alarm_timeout = digitalvariable.get_alarm_timeout_ticks()
alarm_timeout_ms = digitalvariable.get_alarm_timeout_actual_ms()
callback = digitalvariable.get_alarm_callback_name()
entry_source = entry_tpl
entry_source = entry_source.replace('[name]', digitalvariable.name)
entry_source = entry_source.replace('[description]', digitalvariable.description)
entry_source = entry_source.replace('[readfunc]', digitalvariable.get_read_function_name())
if digitalvariable.alarm.enable_default is None:
alarm_enabled_value = 'DEFAULT_' + digitalvariable.name + '_ENABLED'
elif digitalvariable.alarm.enable_default == True:
alarm_enabled_value = 'true'
elif digitalvariable.alarm.enable_default == False:
alarm_enabled_value = 'false'
else:
assert False
entry_source = entry_source.replace('[alarm_enabled]',alarm_enabled_value)
entry_source = entry_source.replace('[alarm_timeout]', str(int(alarm_timeout)))
entry_source = entry_source.replace('[alarm_timeout_comment]', '{} ms ({} ms real)'.format(digitalvariable.alarm.timeout_default_ms, alarm_timeout_ms))
entry_source = entry_source.replace('[callback]', callback)
source_list.append(entry_source)
ioread_source = ioread_tpl
ioread_source = ioread_source.replace('[name]', digitalvariable.name)
ioread_source = ioread_source.replace('[readfunc]', digitalvariable.get_read_function_name())
ioread_source = ioread_source.replace('[ioname]', digitalvariable.ioname)
ioread_list.append(ioread_source)
source_contents = ''
# source_contents = '#include "variables.h"\n\n' # already included from analog variables...
source_contents = '\n#include "../../mcc_generated_files/mcc.h"\n\n'
source_contents += 'digital_variable_t digital_variables[DIGITAL_VARIABLES_COUNT] = {\n'
source_contents += ','.join(source_list)
source_contents += '};\n'
source_contents += '\n'.join(ioread_list)
return source_contents
def generate_digitalalarm_callbacks_header(_digialvariables):
alarm_callback_header_tpl = """
// Callback function for alarm on digital variable [name] ([description])
void [callback]();
"""
source_list = list()
for digitalvariable in _digialvariables.entries():
source_list.append(
alarm_callback_header_tpl
.replace('[name]', digitalvariable.name)
.replace('[description]', digitalvariable.description)
.replace('[callback]', digitalvariable.get_alarm_callback_name())
)
return ''.join(source_list)
def generate_digitalalarm_callbacks_source_template(_digialvariables):
alarm_callback_source_tpl = """
// Callback function for alarm on analog variable [name] ([description])
void [callback]() {
// TODO implement auto-generated callback function [callback]
}
"""
source_list = list()
for digitalvariable in _digialvariables.entries():
source_list.append(
alarm_callback_source_tpl
.replace('[name]', digitalvariable.name)
.replace('[description]', digitalvariable.description)
.replace('[callback]', digitalvariable.get_alarm_callback_name())
)
contents = '' # '#include "generated/sources/variables.h"\n' already included
contents += ''.join(source_list)
return contents
if __name__ == '__main__':
digialvariables = DigitalVariableList()
print generate_digitalvariables_header(digialvariables)
print generate_digitalvariables_source(digialvariables)
print generate_digitalalarm_callbacks_header(digialvariables)
print generate_digitalalarm_callbacks_source_template(digialvariables)