Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

frontend: Add fetch parameters metadata from board when available and using PX4 #2729

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified core/frontend/bun.lockb
Binary file not shown.
3 changes: 2 additions & 1 deletion core/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@
"vuex": "^3.4.0",
"vuex-module-decorators": "^1.0.1",
"webpack": "^5.74.0",
"wifi-qr-code-generator": "^1.1.1"
"wifi-qr-code-generator": "^1.1.1",
"xz-decompress": "^0.2.2"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.51.0",
Expand Down
5 changes: 3 additions & 2 deletions core/frontend/src/libs/filebrowser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,14 @@ class Filebrowser {
/* Fetch a folder from filebrowser. */
/**
* @param folder_path - String absolute path of folder to be fetched
* @param timeout - Timeout in milliseconds
* @returns FilebrowserFolder object
* */
async fetchFolder(folder_path: string): Promise<FilebrowserFolder> {
async fetchFolder(folder_path: string, timeout = 10000): Promise<FilebrowserFolder> {
return back_axios({
method: 'get',
url: `${filebrowser_url}/resources${folder_path}`,
timeout: 10000,
timeout,
headers: { 'X-Auth': await this.filebrowserToken() },
})
.then((response) => response.data)
Expand Down
21 changes: 19 additions & 2 deletions core/frontend/src/types/autopilot/px4/metadata-fetcher.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import filebrowser from '@/libs/filebrowser'
import { XzReadableStream } from 'xz-decompress'

interface PX4ParametersMetadataValuesItem {
description: string
value: number
Expand Down Expand Up @@ -32,15 +35,29 @@ interface PX4ParametersMetadata {
}

async function fetchPX4MetadataFromBoard(): Promise<PX4ParametersMetadata[]> {
// TODO - Add mav ftp fetch to get parameters.json from board
throw new Error('Not implemented')
const px4ExtrasFolder = await filebrowser.fetchFolder('ardupilot_logs/logs/mavftp/etc/extras', 30000)

const parameterFile = px4ExtrasFolder.items.find((file) => file.name === 'parameters.json.xz')
if (!parameterFile) {
throw new Error('PX4 parameters metadata file not found')
}

const response = await fetch(await filebrowser.singleFileRelativeURL(parameterFile))
if (!response || !response.ok || !response.body) {
throw new Error(`Failed to fetch PX4 parameters metadata: ${response.statusText}`)
}

const decompressedStream = new Response(new XzReadableStream(response.body))

return (await decompressedStream.json()).parameters as PX4ParametersMetadata[]
}

async function fetchPX4Metadata(): Promise<PX4ParametersMetadata[]> {
let metadata
try {
metadata = await fetchPX4MetadataFromBoard()
} catch (e) {
console.error('Falling back to default PX4 Metadata Repository parameters, unable to fetch from board.', e)
metadata = (await import('@/PX4-parameters/master/parameters.json')).parameters
}

Expand Down