diff --git a/openxc/generator/coder.py b/openxc/generator/coder.py index 0cf4aeed..628ff904 100644 --- a/openxc/generator/coder.py +++ b/openxc/generator/coder.py @@ -32,6 +32,7 @@ def build_source(self): lines.extend(self._build_messages()) lines.extend(self._build_signal_states()) lines.extend(self._build_signals()) + lines.extend(self._build_signal_managers()) lines.extend(self._build_initializers()) lines.extend(self._build_loop()) lines.extend(self._build_commands()) @@ -231,20 +232,45 @@ def _build_signals(self): lines = [] lines.append("const int MAX_SIGNAL_COUNT = %d;" % self._max_signal_count()) - lines.append("CanSignal SIGNALS[][MAX_SIGNAL_COUNT] = {") + lines.append("const CanSignal SIGNALS[][MAX_SIGNAL_COUNT] __attribute__ ((section(\".rodata._ZL7SIGNALS\"))) = {") def block(message_set): lines = [] - i = 1 - for signal in message_set.all_signals(): + for i, signal in enumerate(message_set.all_signals()): if not signal.enabled: LOG.warning("Skipping disabled signal '%s' (in 0x%x)" % ( signal.generic_name, signal.message.id)) continue - signal.array_index = i - 1 + if not hasattr(signal, "array_index") or signal.array_index is None: + signal.array_index = i lines.append(" " * 8 + "%s" % signal) LOG.info("Added signal '%s'" % signal.generic_name) - i += 1 + return lines + + lines.extend(self._message_set_lister(block)) + lines.append("};") + lines.append("") + + return lines + + def _build_signal_managers(self): + lines = [] + lines.append("SignalManager SIGNAL_MANAGERS[][MAX_SIGNAL_COUNT] = {") + + def block(message_set): + lines = [] + for i, signal in enumerate(message_set.all_signals()): + if not signal.enabled: + LOG.warning("Skipping manager for disabled signal '%s' (in 0x%x)" % ( + signal.generic_name, signal.message.id)) + continue + if not hasattr(signal, "array_index") or signal.array_index is None: + signal.array_index = i + + signal_arr_str = "SIGNALS[%d][%d]" % (signal.message_set.index, signal.array_index) + lines.append(" " * 8 + "{signal: &%s, frequencyClock: {%s.frequency}}," % (signal_arr_str, signal_arr_str)) + LOG.info("Added signal manager '%s'" % signal.generic_name) + return lines lines.extend(self._message_set_lister(block)) @@ -314,16 +340,18 @@ def block(message_set): lines.append(" " * 12 + "case 0x%x: // %s" % (message.id, message.name)) for handler in message.handlers: - lines.append(" " * 16 + "%s(message, SIGNALS[%d], " % ( - handler, message_set.index) + - "getSignalCount(), pipeline);") + lines.append(" " * 16 + "%s(SIGNALS[%d], SIGNALS[%d], " % ( + handler, message_set.index, message_set.index) + + "SIGNAL_MANAGERS[%d], SIGNAL_MANAGERS[%d], " % ( + message_set.index, message_set.index) + + "getSignalCount(), message, pipeline);") for signal in message.active_signals(): line = " " * 16 line += ("can::read::translateSignal(" "&SIGNALS[%d][%d], message, " % (message_set.index, signal.array_index)) - line += ("SIGNALS[%d], getSignalCount(), pipeline); // %s" % ( - message_set.index, signal.name)) + line += ("SIGNALS[%d], SIGNAL_MANAGERS[%d], getSignalCount(), pipeline); // %s" % ( + message_set.index, message_set.index, signal.name)) lines.append(line) lines.append(" " * 16 + "break;") lines.append(" " * 12 + "}") diff --git a/openxc/generator/signals.cpp.footer b/openxc/generator/signals.cpp.footer index f1431951..df4ec6f2 100644 --- a/openxc/generator/signals.cpp.footer +++ b/openxc/generator/signals.cpp.footer @@ -6,7 +6,7 @@ int openxc::signals::getCommandCount() { return getActiveMessageSet()->commandCount; } -CanMessageDefinition* openxc::signals::getMessages() { +const CanMessageDefinition* openxc::signals::getMessages() { return CAN_MESSAGES[getActiveMessageSet()->index]; } @@ -14,10 +14,14 @@ int openxc::signals::getMessageCount() { return getActiveMessageSet()->messageCount; } -CanSignal* openxc::signals::getSignals() { +const CanSignal* openxc::signals::getSignals() { return SIGNALS[getActiveMessageSet()->index]; } +SignalManager* openxc::signals::getSignalManagers() { + return SIGNAL_MANAGERS[getActiveMessageSet()->index]; +} + int openxc::signals::getSignalCount() { return getActiveMessageSet()->signalCount; } @@ -30,11 +34,11 @@ int openxc::signals::getCanBusCount() { return getActiveMessageSet()->busCount; } -CanMessageSet* openxc::signals::getActiveMessageSet() { +const CanMessageSet* openxc::signals::getActiveMessageSet() { return &MESSAGE_SETS[getConfiguration()->messageSetIndex]; } -CanMessageSet* openxc::signals::getMessageSets() { +const CanMessageSet* openxc::signals::getMessageSets() { return MESSAGE_SETS; } diff --git a/openxc/generator/signals.cpp.header b/openxc/generator/signals.cpp.header index b9e42c14..7b5df371 100644 --- a/openxc/generator/signals.cpp.header +++ b/openxc/generator/signals.cpp.header @@ -16,6 +16,7 @@ namespace can = openxc::can; using openxc::util::log::debug; +using openxc::util::time::FrequencyClock; using openxc::pipeline::Pipeline; using openxc::config::getConfiguration; using openxc::can::read::booleanDecoder; diff --git a/openxc/generator/structures.py b/openxc/generator/structures.py index c46cfd7d..5145ffbb 100644 --- a/openxc/generator/structures.py +++ b/openxc/generator/structures.py @@ -487,7 +487,7 @@ def _invert_bit_index(cls, bit_index, length): return inverted_index def __str__(self): - result = ("{message: &CAN_MESSAGES[%d][%d], genericName: \"%s\", bitPosition: %s, bitSize: %d, factor: %f, offset: %f, minValue: %f, maxValue: %f, frequencyClock: {%f}, sendSame: %s, forceSendChanged: %s, " % ( + result = ("{message: &CAN_MESSAGES[%d][%d], genericName: \"%s\", bitPosition: %s, bitSize: %d, factor: %f, offset: %f, minValue: %f, maxValue: %f, frequency: %f, sendSame: %s, forceSendChanged: %s, " % ( self.message_set.index, self.message_set.lookup_message_index(self.message), self.generic_name, self.bit_position, self.bit_size,