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
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
utils_tpl = """
// some utility functions
digital_variable_t* digital_variable_get_pointer_by_enum(enum_variable_number_t _variable_index);
digitalalarm_info_t* alarm_get_digital_alarm_ptr_by_enum(enum_alarm_number_t _alarm_index);
"""
header_contents = includes + typedef + countdef + varindex_contents + utils_tpl + 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 = {
.implement = [alarm_implement],
.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());
}
"""
ioread_tpl_active_low = """
// IO read function for variable [name] (active low)
digital_value_t [readfunc](void) {
return (digital_value_t)(0 == [ioname]_GetValue());
}
"""
source_list = list()
ioread_list = list()
for digitalvariable in _digialvariables.entries():
if digitalvariable.alarm:
alarm_timeout = digitalvariable.get_alarm_timeout_ticks()
alarm_timeout_ms = digitalvariable.get_alarm_timeout_actual_ms()
callback = digitalvariable.get_alarm_callback_name()
if digitalvariable.alarm.enable_default is None:
alarm_enabled_value = 'DEFAULT_' + digitalvariable.name + '_ALARM_ENABLED'
elif digitalvariable.alarm.enable_default == True:
alarm_enabled_value = 'true'
elif digitalvariable.alarm.enable_default == False:
alarm_enabled_value = 'false'
else:
assert False
else:
alarm_enabled_value = 'false'
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())
entry_source = entry_source.replace('[alarm_enabled]',alarm_enabled_value)
if digitalvariable.alarm:
entry_source = entry_source.replace('[alarm_implement]', 'true')
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)
else:
entry_source = entry_source.replace('[alarm_implement]', 'false')
entry_source = entry_source.replace('[alarm_timeout]', '0')
entry_source = entry_source.replace('[alarm_timeout_comment]', 'alarm not present')
entry_source = entry_source.replace('[callback]', 'dummy_alarm_callback')
source_list.append(entry_source)
if digitalvariable.active_low:
ioread_source = ioread_tpl_active_low
else:
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)
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
source_contents += '};\n\n'
# generate digital_variable_get_pointer_by_enum
source_contents += 'digital_variable_t* digital_variable_get_pointer_by_enum(enum_variable_number_t _variable_index) {\n'
source_contents += ' switch(_variable_index) {\n'
for digitalvariable in _digialvariables.entries():
source_contents += ' case VARIABLE_NUMBER_{}:\n'.format(digitalvariable.name)
source_contents += ' return &(digital_variables[DIGITAL_VARIABLE_INDEX_{}]);\n'.format(digitalvariable.name)
source_contents += ' default:\n'
source_contents += ' error_die_forever();\n'
source_contents += ' // should never be reached, just to avoid one warning\n'
source_contents += ' return &(digital_variables[0]);\n'
source_contents += ' }\n'
source_contents += '}\n\n'
# generate alarm_get_digital_alarm_ptr_by_enum
source_contents += 'digitalalarm_info_t* alarm_get_digital_alarm_ptr_by_enum(enum_alarm_number_t _alarm_index) {'
source_contents += ' switch(_alarm_index) {\n'
for digitalvariable in _digialvariables.entries():
if digitalvariable.alarm:
source_contents += ' case ALARM_NUMBER_ALARM_{}:\n'.format(digitalvariable.name)
source_contents += ' return &(digital_variables[DIGITAL_VARIABLE_INDEX_{}].alarm);\n'.format(digitalvariable.name)
source_contents += ' default:\n'
source_contents += ' error_die_forever();\n'
source_contents += ' // should never be reached, just to avoid one warning\n'
source_contents += ' return &(digital_variables[0].alarm);\n'
source_contents += ' }\n'
source_contents += '}\n\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():
if digitalvariable.alarm:
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():
if digitalvariable.alarm:
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)