55# Copyright (C) 2018 Mark Jessop <[email protected] > 66# Released under GNU GPL v3 or later
77#
8+ import codecs
89import datetime
910import glob
1011import logging
@@ -50,7 +51,9 @@ class TelemetryLogger(object):
5051
5152 LOG_HEADER = "timestamp,serial,frame,lat,lon,alt,vel_v,vel_h,heading,temp,humidity,pressure,type,freq_mhz,snr,f_error_hz,sats,batt_v,burst_timer,aux_data\n "
5253
53- def __init__ (self , log_directory = "./log" ):
54+ def __init__ (self ,
55+ log_directory = "./log" ,
56+ save_cal_data = False ):
5457 """ Initialise and start a sonde logger.
5558
5659 Args:
@@ -59,6 +62,7 @@ def __init__(self, log_directory="./log"):
5962 """
6063
6164 self .log_directory = log_directory
65+ self .save_cal_data = save_cal_data
6266
6367 # Dictionary to contain file handles.
6468 # Each sonde id is added as a unique key. Under each key are the contents:
@@ -199,6 +203,9 @@ def write_telemetry(self, telemetry):
199203 _id = telemetry ["id" ]
200204 _type = telemetry ["type" ]
201205
206+ if 'aux' in telemetry :
207+ _type += "-XDATA"
208+
202209 # If there is no log open for the current ID check to see if there is an existing (closed) log file, and open it.
203210 if _id not in self .open_logs :
204211 _search_string = os .path .join (self .log_directory , "*%s_*_sonde.log" % (_id ))
@@ -211,6 +218,7 @@ def write_telemetry(self, telemetry):
211218 self .open_logs [_id ] = {
212219 "log" : open (_log_file_name , "a" ),
213220 "last_time" : time .time (),
221+ "subframe_saved" : False
214222 }
215223 else :
216224 # Create a new log file.
@@ -226,6 +234,7 @@ def write_telemetry(self, telemetry):
226234 self .open_logs [_id ] = {
227235 "log" : open (_log_file_name , "a" ),
228236 "last_time" : time .time (),
237+ "subframe_saved" : False
229238 }
230239
231240 # Write in a header line.
@@ -241,6 +250,15 @@ def write_telemetry(self, telemetry):
241250 self .open_logs [_id ]["last_time" ] = time .time ()
242251 self .log_debug ("Wrote line: %s" % _log_line .strip ())
243252
253+ # Save out RS41 subframe data once, if we have it.
254+ if ('rs41_subframe' in telemetry ) and self .save_cal_data :
255+ if self .open_logs [_id ]['subframe_saved' ] == False :
256+ self .open_logs [_id ]['subframe_saved' ] = self .write_rs41_subframe (telemetry )
257+
258+
259+
260+
261+
244262 def cleanup_logs (self ):
245263 """ Close any open logs that have not had telemetry added in X seconds. """
246264
@@ -259,6 +277,42 @@ def cleanup_logs(self):
259277 except Exception as e :
260278 self .log_error ("Error closing log for %s - %s" % (_id , str (e )))
261279
280+ def write_rs41_subframe (self , telemetry ):
281+ """ Write RS41 subframe data to disk """
282+
283+ _id = telemetry ["id" ]
284+ _type = telemetry ["type" ]
285+
286+ if 'aux' in telemetry :
287+ _type += "-XDATA"
288+
289+ _subframe_log_suffix = "%s_%s_%s_%d_subframe.bin" % (
290+ datetime .datetime .utcnow ().strftime ("%Y%m%d-%H%M%S" ),
291+ _id ,
292+ _type ,
293+ int (telemetry ["freq_float" ] * 1e3 ), # Convert frequency to kHz
294+ )
295+ _log_file_name = os .path .join (self .log_directory , _subframe_log_suffix )
296+
297+
298+ try :
299+ _subframe_data = codecs .decode (telemetry ['rs41_subframe' ], 'hex' )
300+ except Exception as e :
301+ self .log_error ("Error parsing RS41 subframe data" )
302+
303+ if _subframe_data :
304+ _subframe_file = open (_log_file_name , 'wb' )
305+ _subframe_file .write (_subframe_data )
306+ _subframe_file .close ()
307+
308+ self .log_info (f"Wrote subframe data for { telemetry ['id' ]} to { _subframe_log_suffix } " )
309+ return True
310+ else :
311+ return False
312+
313+
314+
315+
262316 def close (self ):
263317 """ Close input processing thread. """
264318 self .input_processing_running = False
0 commit comments