Skip to content
Snippets Groups Projects
generate_digitalvariables.py 6.49 KiB
Newer Older
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)