1515
1616#include "decoder.h"
1717
18- #define PLACEHOLDER_CAN_ID 0xFFFu
18+ static int rx_allowed (const config_file_t * cf , const char * sig_name ) {
19+ if (!cf || !cf -> has_rx_signals || cf -> rx_signals [0 ] == '\0' ) return 1 ;
20+ return config_list_contains (cf -> rx_signals , sig_name );
21+ }
22+
23+ static const signal_def_t * find_signal_by_name (const signal_table_t * table , const char * name ) {
24+ if (!table || !name || !name [0 ]) return NULL ;
25+ for (size_t b = 0 ; b < SIG_TABLE_BUCKETS ; ++ b ) {
26+ for (const sig_node_t * n = table -> buckets [b ]; n ; n = n -> next ) {
27+ if (strcmp (n -> sig .name , name ) == 0 ) return & n -> sig ;
28+ }
29+ }
30+ return NULL ;
31+ }
32+
33+ static void inject_one_signal (writer_t * w ,
34+ influx_ctx_t * influx ,
35+ serial_radio_ctx_t * radio ,
36+ const config_file_t * cf ,
37+ const signal_def_t * sig ,
38+ double value ) {
39+ if (!sig || !rx_allowed (cf , sig -> name )) return ;
40+ decoded_value_t dv ;
41+ memset (& dv , 0 , sizeof dv );
42+ dv .value = value ;
43+ strcpy (dv .raw_hex , "gnss" );
44+ writer_append (w , sig , & dv );
45+ if (influx ) influx_accumulate (influx , sig , & dv );
46+ serial_radio_accumulate (radio , sig , & dv );
47+ }
48+
49+ static void maybe_inject_gnss (const signal_table_t * table ,
50+ writer_t * w ,
51+ influx_ctx_t * influx ,
52+ serial_radio_ctx_t * radio ,
53+ gnss_reader_t * gnss ,
54+ const config_file_t * cf ,
55+ const signal_def_t * lat_sig ,
56+ const signal_def_t * lon_sig ,
57+ const signal_def_t * elev_sig ) {
58+ (void )table ;
59+ if (!gnss || !gnss -> enabled ) return ;
60+ (void )gnss_reader_tick (gnss );
61+
62+ double lat = 0.0 , lon = 0.0 , elev = 0.0 ;
63+ if (!gnss_reader_get_fix (gnss , & lat , & lon , & elev )) return ;
64+
65+ inject_one_signal (w , influx , radio , cf , lat_sig , lat );
66+ inject_one_signal (w , influx , radio , cf , lon_sig , lon );
67+ inject_one_signal (w , influx , radio , cf , elev_sig , elev );
68+ }
1969
2070int can_reader_open (const char * ifname ) {
2171 if (!ifname ) return -1 ;
@@ -45,7 +95,6 @@ int can_reader_open(const char *ifname) {
4595 close (s );
4696 return -1 ;
4797 }
48-
4998 return s ;
5099}
51100
@@ -54,9 +103,21 @@ int can_reader_loop(int fd,
54103 writer_t * w ,
55104 influx_ctx_t * influx ,
56105 serial_radio_ctx_t * radio ,
106+ gnss_reader_t * gnss ,
107+ const config_file_t * cf ,
57108 volatile sig_atomic_t * running ) {
58109 if (fd < 0 || !table || !w || !running ) return -1 ;
59110
111+ const char * lat_name = (cf && cf -> has_gnss_lat_signal && cf -> gnss_lat_signal [0 ])
112+ ? cf -> gnss_lat_signal : "lat" ;
113+ const char * lon_name = (cf && cf -> has_gnss_lon_signal && cf -> gnss_lon_signal [0 ])
114+ ? cf -> gnss_lon_signal : "lon" ;
115+ const char * elev_name = (cf && cf -> has_gnss_elev_signal && cf -> gnss_elev_signal [0 ])
116+ ? cf -> gnss_elev_signal : "elev" ;
117+ const signal_def_t * lat_sig = find_signal_by_name (table , lat_name );
118+ const signal_def_t * lon_sig = find_signal_by_name (table , lon_name );
119+ const signal_def_t * elev_sig = find_signal_by_name (table , elev_name );
120+
60121 struct can_frame frame ;
61122 while (* running ) {
62123 int poll_ms = 200 ;
@@ -68,6 +129,7 @@ int can_reader_loop(int fd,
68129 return -1 ;
69130 }
70131 if (pr == 0 ) {
132+ maybe_inject_gnss (table , w , influx , radio , gnss , cf , lat_sig , lon_sig , elev_sig );
71133 writer_tick (w );
72134 if (influx ) influx_tick (influx );
73135 serial_radio_tick (radio );
@@ -96,6 +158,7 @@ int can_reader_loop(int fd,
96158 for (; node ; node = node -> next ) {
97159 if (node -> sig .can_id != id ) continue ;
98160 if (node -> sig .placeholder ) continue ;
161+ if (!rx_allowed (cf , node -> sig .name )) continue ;
99162
100163 decoded_value_t dv ;
101164 if (decoder_extract (& node -> sig , frame .data ,
@@ -106,10 +169,11 @@ int can_reader_loop(int fd,
106169 if (influx ) influx_accumulate (influx , & node -> sig , & dv );
107170 serial_radio_accumulate (radio , & node -> sig , & dv );
108171 }
172+
173+ maybe_inject_gnss (table , w , influx , radio , gnss , cf , lat_sig , lon_sig , elev_sig );
109174 writer_tick (w );
110175 if (influx ) influx_tick (influx );
111176 serial_radio_tick (radio );
112177 }
113-
114178 return 0 ;
115179}
0 commit comments