Skip to content

Commit 1d8c6ef

Browse files
authored
976 feature display a table of data in fla (#1048)
* Start adding FLA data table * Fix FLA data table styling and message display * Fix UTC time conversion * Add correct utc time conversion to data table * Address copilot review comments * Fix merge * Fix table and other messages for dataflash_log file
1 parent 9b7b9e9 commit 1d8c6ef

9 files changed

Lines changed: 435 additions & 71 deletions

File tree

gcs/electron/fla.ts

Lines changed: 55 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ async function parseDataflashLogFile(
129129
// File data
130130
} else if (messageName === "MSG") {
131131
// MSG data
132+
// TODO: Use "VER" message for this data
132133
const text = splitLineData[2]?.trim()
133134

134135
if (aircraftType === null && text) {
@@ -139,43 +140,39 @@ async function parseDataflashLogFile(
139140
aircraftType = "copter"
140141
}
141142
}
142-
} else {
143-
// Message data
144-
const formatMessage = formatMessages[messageName]
145-
if (formatMessage) {
146-
if (!messages[messageName]) {
147-
messages[messageName] = []
148-
}
143+
}
149144

150-
const messageObj: MessageObject = {
151-
name: messageName,
152-
}
145+
// Message data
146+
const formatMessage = formatMessages[messageName]
147+
if (formatMessage) {
148+
if (!messages[messageName]) {
149+
messages[messageName] = []
150+
}
151+
152+
const messageObj: MessageObject = {
153+
name: messageName,
154+
}
153155

154-
const fields = formatMessage.fields
155-
const format = formatMessage.format
156-
const fieldsLength = fields.length
157-
158-
for (
159-
let i = 0;
160-
i < fieldsLength && i < splitLineData.length - 1;
161-
i++
162-
) {
163-
const field = fields[i]
164-
const formatType = format[i]
165-
const value = splitLineData[i + 1]?.trim()
166-
167-
if (value !== undefined && value !== "") {
168-
if (stringTypes.has(formatType)) {
169-
messageObj[field] = value
170-
} else {
171-
const numValue = parseFloat(value)
172-
messageObj[field] = isNaN(numValue) ? 0 : numValue
173-
}
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
174171
}
175172
}
176-
177-
;(messages[messageName] as MessageObject[]).push(messageObj)
178173
}
174+
175+
;(messages[messageName] as MessageObject[]).push(messageObj)
179176
}
180177

181178
const now = Date.now()
@@ -696,8 +693,12 @@ export async function getMessages(
696693

697694
for (let j = 0; j < len; j++) {
698695
const point = series[j]
696+
// Use UtcTimeUS if available, otherwise fall back to TimeUS
697+
const timeValue =
698+
point.UtcTimeUS !== undefined ? point.UtcTimeUS : point.TimeUS
699+
699700
// making sure all the entries are numbers
700-
x[j] = typeof point.TimeUS === "number" ? point.TimeUS : 0
701+
x[j] = typeof timeValue === "number" ? timeValue : 0
701702
y[j] = typeof point[fieldName] === "number" ? point[fieldName] : 0
702703
}
703704

@@ -712,6 +713,27 @@ export async function getMessages(
712713
return datasets
713714
}
714715

716+
export async function getMessageDataForTable(
717+
_event: unknown,
718+
requestedMessage: string,
719+
): Promise<MessageObject[] | { success: false; error: string }> {
720+
if (!logData) {
721+
console.error("getMessageDataForTable: logData is null or undefined.")
722+
return { success: false, error: "Log data not loaded." }
723+
}
724+
725+
if (!requestedMessage.trim()) {
726+
return { success: false, error: "Invalid message type." }
727+
}
728+
729+
const series = logData[requestedMessage] as MessageObject[]
730+
if (!Array.isArray(series) || series.length === 0) {
731+
return { success: false, error: "No data available for this message type." }
732+
}
733+
734+
return series
735+
}
736+
715737
export async function saveParamsToFile(
716738
_event: unknown,
717739
filePath: string,

gcs/electron/main.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import packageInfo from "../package.json"
1818

1919
import openFile, {
2020
clearRecentFiles,
21+
getMessageDataForTable,
2122
getMessages,
2223
getRecentFiles,
2324
saveParamsToFile,
@@ -617,6 +618,9 @@ app.whenReady().then(() => {
617618
// Load Messages on demand
618619
ipcMain.handle("fla:get-messages", getMessages)
619620

621+
// Get message data for table
622+
ipcMain.handle("fla:get-message-data-for-table", getMessageDataForTable)
623+
620624
// Save FLA params to file
621625
ipcMain.handle("fla:save-params-to-file", saveParamsToFile)
622626

gcs/electron/preload.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const ALLOWED_INVOKE_CHANNELS = [
77
"fla:get-recent-logs",
88
"fla:clear-recent-logs",
99
"fla:get-messages",
10+
"fla:get-message-data-for-table",
1011
"fla:save-params-to-file",
1112
"app:get-save-file-path",
1213
"app:save-file",

gcs/electron/utils/flaUtils.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,13 @@ import type {
1010
} from "../types/flaTypes"
1111

1212
const ignoredMessages: string[] = [
13-
"ERR",
14-
"EV",
15-
"MSG",
16-
"VER",
1713
"TIMESYNC",
18-
"PARAM_VALUE",
1914
"TSYN",
2015
"UNIT",
2116
"FILE",
2217
"FMTU",
2318
"FMT",
2419
"MULT",
25-
"PARM",
2620
"units",
2721
"format",
2822
"aircraftType",
@@ -240,7 +234,7 @@ export function convertTimeUStoUTC(
240234
logMessages: LoadedLogMessages,
241235
gpsOffset: number,
242236
): LoadedLogMessages {
243-
// This still takes some time for some reason
237+
// Add UtcTimeUS alongside TimeUS instead of replacing it
244238
const convertedMessages: LoadedLogMessages = { ...logMessages }
245239

246240
Object.keys(convertedMessages)
@@ -250,7 +244,7 @@ export function convertTimeUStoUTC(
250244
if (Array.isArray(messages)) {
251245
convertedMessages[key] = messages.map((message: MessageObject) => ({
252246
...message,
253-
TimeUS: (message.TimeUS as number) / 1000 + gpsOffset,
247+
UtcTimeUS: (message.TimeUS as number) / 1000 + gpsOffset,
254248
}))
255249
}
256250
})

gcs/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
"@robloche/chartjs-plugin-streaming": "^3.1.0",
3939
"@tabler/icons-react": "^3.37.1",
4040
"@tailwindcss/container-queries": "^0.1.1",
41+
"@tanstack/react-virtual": "^3.13.19",
4142
"@tiptap/extension-link": "^2.11.6",
4243
"@tiptap/pm": "^2.11.6",
4344
"@tiptap/react": "^2.11.6",

0 commit comments

Comments
 (0)