@@ -28,6 +28,7 @@ import type {
2828 LogType ,
2929 MessageObject ,
3030 Messages ,
31+ ParamObject ,
3132 ParseResult ,
3233 RecentLog ,
3334} from "./types/flaTypes"
@@ -45,7 +46,7 @@ import {
4546} from "./utils/flaUtils"
4647
4748const UPDATE_THROTTLE_MS = 100 // Update every 100ms
48- const recentLogsManager = createRecentLogsManager ( )
49+ const recentLogsManager = createRecentLogsManager ( 20 )
4950let logData : Messages | null = null
5051let defaultMessageFilters : Record < string , unknown > = { }
5152
@@ -128,6 +129,7 @@ async function parseDataflashLogFile(
128129 // File data
129130 } else if ( messageName === "MSG" ) {
130131 // MSG data
132+ // TODO: Use "VER" message for this data
131133 const text = splitLineData [ 2 ] ?. trim ( )
132134
133135 if ( aircraftType === null && text ) {
@@ -138,43 +140,39 @@ async function parseDataflashLogFile(
138140 aircraftType = "copter"
139141 }
140142 }
141- } else {
142- // Message data
143- const formatMessage = formatMessages [ messageName ]
144- if ( formatMessage ) {
145- if ( ! messages [ messageName ] ) {
146- messages [ messageName ] = [ ]
147- }
143+ }
148144
149- const messageObj : MessageObject = {
150- name : messageName ,
151- }
145+ // Message data
146+ const formatMessage = formatMessages [ messageName ]
147+ if ( formatMessage ) {
148+ if ( ! messages [ messageName ] ) {
149+ messages [ messageName ] = [ ]
150+ }
152151
153- const fields = formatMessage . fields
154- const format = formatMessage . format
155- const fieldsLength = fields . length
156-
157- for (
158- let i = 0 ;
159- i < fieldsLength && i < splitLineData . length - 1 ;
160- i ++
161- ) {
162- const field = fields [ i ]
163- const formatType = format [ i ]
164- const value = splitLineData [ i + 1 ] ?. trim ( )
165-
166- if ( value !== undefined && value !== "" ) {
167- if ( stringTypes . has ( formatType ) ) {
168- messageObj [ field ] = value
169- } else {
170- const numValue = parseFloat ( value )
171- messageObj [ field ] = isNaN ( numValue ) ? 0 : numValue
172- }
152+ const messageObj : MessageObject = {
153+ name : messageName ,
154+ }
155+
156+ const fields = formatMessage . fields
157+ const format = formatMessage . format
158+ const fieldsLength = fields . length
159+
160+ for ( let i = 0 ; i < fieldsLength && i < splitLineData . length - 1 ; i ++ ) {
161+ const field = fields [ i ]
162+ const formatType = format [ i ]
163+ const value = splitLineData [ i + 1 ] ?. trim ( )
164+
165+ if ( value !== undefined && value !== "" ) {
166+ if ( stringTypes . has ( formatType ) ) {
167+ messageObj [ field ] = value
168+ } else {
169+ const numValue = parseFloat ( value )
170+ messageObj [ field ] = isNaN ( numValue ) ? 0 : numValue
173171 }
174172 }
175-
176- ; ( messages [ messageName ] as MessageObject [ ] ) . push ( messageObj )
177173 }
174+
175+ ; ( messages [ messageName ] as MessageObject [ ] ) . push ( messageObj )
178176 }
179177
180178 const now = Date . now ( )
@@ -375,6 +373,17 @@ function parseDataflashBinFile(
375373 aircraftType : getAircraftTypeFromMavType ( parser . getMavType ( ) ) ,
376374 ...transformedMessages ,
377375 }
376+
377+ if (
378+ Array . isArray ( parsedData ?. PARM ) &&
379+ parsedData . PARM . some (
380+ ( param : MessageObject ) =>
381+ param . Name === "Q_ENABLE" && param . Value === 1 ,
382+ )
383+ ) {
384+ parsedData . aircraftType = "quadplane"
385+ }
386+
378387 webContents . send ( "fla:log-parse-progress" , {
379388 percent : 100 ,
380389 } )
@@ -424,11 +433,6 @@ export function getRecentFiles(): RecentLog[] {
424433 return recentLogsManager . getRecentLogs ( )
425434}
426435
427- // New function to clear recent files
428- export function clearRecentFiles ( ) : void {
429- recentLogsManager . clearRecentLogs ( )
430- }
431-
432436async function getFirstLine ( pathToFile : string ) : Promise < string > {
433437 // https://stackoverflow.com/a/60193465/23139916
434438 const readable = fs . createReadStream ( pathToFile )
@@ -684,8 +688,12 @@ export async function getMessages(
684688
685689 for ( let j = 0 ; j < len ; j ++ ) {
686690 const point = series [ j ]
691+ // Use UtcTimeUS if available, otherwise fall back to TimeUS
692+ const timeValue =
693+ point . UtcTimeUS !== undefined ? point . UtcTimeUS : point . TimeUS
694+
687695 // making sure all the entries are numbers
688- x [ j ] = typeof point . TimeUS === "number" ? point . TimeUS : 0
696+ x [ j ] = typeof timeValue === "number" ? timeValue : 0
689697 y [ j ] = typeof point [ fieldName ] === "number" ? point [ fieldName ] : 0
690698 }
691699
@@ -699,3 +707,56 @@ export async function getMessages(
699707
700708 return datasets
701709}
710+
711+ export async function getMessageDataForTable (
712+ _event : unknown ,
713+ requestedMessage : string ,
714+ ) : Promise < MessageObject [ ] | { success : false ; error : string } > {
715+ if ( ! logData ) {
716+ console . error ( "getMessageDataForTable: logData is null or undefined." )
717+ return { success : false , error : "Log data not loaded." }
718+ }
719+
720+ if ( ! requestedMessage . trim ( ) ) {
721+ return { success : false , error : "Invalid message type." }
722+ }
723+
724+ const series = logData [ requestedMessage ] as MessageObject [ ]
725+ if ( ! Array . isArray ( series ) || series . length === 0 ) {
726+ return { success : false , error : "No data available for this message type." }
727+ }
728+
729+ return series
730+ }
731+
732+ export async function saveParamsToFile (
733+ _event : unknown ,
734+ filePath : string ,
735+ params : Array < ParamObject > ,
736+ ) : Promise < { success : boolean ; message : string } > {
737+ try {
738+ // Sort params alphabetically by name
739+ const sortedParams = [ ...params ] . sort ( ( a , b ) =>
740+ a . name . localeCompare ( b . name ) ,
741+ )
742+
743+ // Write params to file in the format: PARAM_NAME,value
744+ const content = sortedParams
745+ . map ( ( param ) => `${ param . name . toUpperCase ( ) } ,${ param . value } ` )
746+ . join ( "\n" )
747+
748+ await fs . promises . writeFile ( filePath , content + "\n" , "utf-8" )
749+
750+ console . log ( `Parameters saved to ${ filePath } ` )
751+ return {
752+ success : true ,
753+ message : `Parameters saved successfully to ${ filePath } ` ,
754+ }
755+ } catch ( error ) {
756+ console . error ( "Failed to save params to file:" , error )
757+ return {
758+ success : false ,
759+ message : `Failed to save parameters: ${ error instanceof Error ? error . message : String ( error ) } ` ,
760+ }
761+ }
762+ }
0 commit comments