@@ -32,6 +32,7 @@ def build_source(self):
3232 lines .extend (self ._build_messages ())
3333 lines .extend (self ._build_signal_states ())
3434 lines .extend (self ._build_signals ())
35+ lines .extend (self ._build_signal_managers ())
3536 lines .extend (self ._build_initializers ())
3637 lines .extend (self ._build_loop ())
3738 lines .extend (self ._build_commands ())
@@ -231,20 +232,45 @@ def _build_signals(self):
231232 lines = []
232233 lines .append ("const int MAX_SIGNAL_COUNT = %d;" %
233234 self ._max_signal_count ())
234- lines .append ("CanSignal SIGNALS[][MAX_SIGNAL_COUNT] = {" )
235+ lines .append ("const CanSignal SIGNALS[][MAX_SIGNAL_COUNT] __attribute__ ((section( \" .rodata._ZL7SIGNALS \" ))) = {" )
235236
236237 def block (message_set ):
237238 lines = []
238- i = 1
239- for signal in message_set .all_signals ():
239+ for i , signal in enumerate (message_set .all_signals ()):
240240 if not signal .enabled :
241241 LOG .warning ("Skipping disabled signal '%s' (in 0x%x)" % (
242242 signal .generic_name , signal .message .id ))
243243 continue
244- signal .array_index = i - 1
244+ if not hasattr (signal , "array_index" ) or signal .array_index is None :
245+ signal .array_index = i
245246 lines .append (" " * 8 + "%s" % signal )
246247 LOG .info ("Added signal '%s'" % signal .generic_name )
247- i += 1
248+ return lines
249+
250+ lines .extend (self ._message_set_lister (block ))
251+ lines .append ("};" )
252+ lines .append ("" )
253+
254+ return lines
255+
256+ def _build_signal_managers (self ):
257+ lines = []
258+ lines .append ("SignalManager SIGNAL_MANAGERS[][MAX_SIGNAL_COUNT] = {" )
259+
260+ def block (message_set ):
261+ lines = []
262+ for i , signal in enumerate (message_set .all_signals ()):
263+ if not signal .enabled :
264+ LOG .warning ("Skipping manager for disabled signal '%s' (in 0x%x)" % (
265+ signal .generic_name , signal .message .id ))
266+ continue
267+ if not hasattr (signal , "array_index" ) or signal .array_index is None :
268+ signal .array_index = i
269+
270+ signal_arr_str = "SIGNALS[%d][%d]" % (signal .message_set .index , signal .array_index )
271+ lines .append (" " * 8 + "{signal: &%s, frequencyClock: {%s.frequency}}," % (signal_arr_str , signal_arr_str ))
272+ LOG .info ("Added signal manager '%s'" % signal .generic_name )
273+
248274 return lines
249275
250276 lines .extend (self ._message_set_lister (block ))
@@ -314,16 +340,18 @@ def block(message_set):
314340 lines .append (" " * 12 + "case 0x%x: // %s" % (message .id ,
315341 message .name ))
316342 for handler in message .handlers :
317- lines .append (" " * 16 + "%s(message, SIGNALS[%d], " % (
318- handler , message_set .index ) +
319- "getSignalCount(), pipeline);" )
343+ lines .append (" " * 16 + "%s(SIGNALS[%d], SIGNALS[%d], " % (
344+ handler , message_set .index , message_set .index ) +
345+ "SIGNAL_MANAGERS[%d], SIGNAL_MANAGERS[%d], " % (
346+ message_set .index , message_set .index ) +
347+ "getSignalCount(), message, pipeline);" )
320348 for signal in message .active_signals ():
321349 line = " " * 16
322350 line += ("can::read::translateSignal("
323351 "&SIGNALS[%d][%d], message, " %
324352 (message_set .index , signal .array_index ))
325- line += ("SIGNALS[%d], getSignalCount(), pipeline); // %s" % (
326- message_set .index , signal .name ))
353+ line += ("SIGNALS[%d], SIGNAL_MANAGERS[%d], getSignalCount(), pipeline); // %s" % (
354+ message_set .index , message_set . index , signal .name ))
327355 lines .append (line )
328356 lines .append (" " * 16 + "break;" )
329357 lines .append (" " * 12 + "}" )
0 commit comments