diff --git a/GAPP/apps/gapp-server/src/main.ts b/GAPP/apps/gapp-server/src/main.ts index 198a431..efa8965 100644 --- a/GAPP/apps/gapp-server/src/main.ts +++ b/GAPP/apps/gapp-server/src/main.ts @@ -3,15 +3,16 @@ import { app } from './app/app'; import { getConfig } from './config'; import { Uploader } from '@gapp/sondehub'; -const uploader = new Uploader('CSK-TST'); +const uploader = new Uploader({ uploaderCallsign: 'CESILKO-NODE', uploaderPosition: [50.01, 15.01, 200] }); uploader.addTelemetry({ - payload_callsign: 'CSK-TST-PAYLOAD', - timestamp: new Date().toISOString(), - lat: 1.0, - lon: 1.0, + payload_callsign: 'test_payload', + datetime: new Date().toISOString(), + lat: 50, + lon: 14.05, alt: 1000, }); + uploader.uploadTelemetry(); const config = getConfig(process.env); diff --git a/GAPP/libs/sondehub/src/lib/uploader.ts b/GAPP/libs/sondehub/src/lib/uploader.ts index 8f780cc..504e8dc 100644 --- a/GAPP/libs/sondehub/src/lib/uploader.ts +++ b/GAPP/libs/sondehub/src/lib/uploader.ts @@ -2,15 +2,11 @@ import axios from 'axios'; import { gzipSync } from 'node:zlib'; -export interface Position { - lat: number; - lon: number; - alt: number; -} +export type Position = [number, number, number]; export interface TelemetryPacket { payload_callsign: string; - timestamp: string; + datetime: string; lat: number; lon: number; alt: number; @@ -38,23 +34,43 @@ export interface TelemetryPacket { [key: string]: any; } +interface UploaderConfig { + uploaderCallsign: string; + uploaderPosition?: Position; + uploaderRadio?: string; + uploaderAntenna?: string; + softwareName: string; + softwareVersion: string; + uploadRate: number; + uploadTimeout: number; + uploadRetries: number; + developerMode: boolean; +} + +export type UploaderOptions = Partial> & Pick; + export class Uploader { + private uploaderConfig: UploaderConfig = { + uploaderCallsign: '', + softwareName: 'node-sondehub', + softwareVersion: '0.0.1', + uploadRate: 2, + uploadTimeout: 20_000, + uploadRetries: 5, + developerMode: false + } + private inputQueue: TelemetryPacket[] = []; + private static SONDEHUB_AMATEUR_URL = 'https://api.v2.sondehub.org/amateur/telemetry'; private static SONDEHUB_AMATEUR_STATION_POSITION_URL = 'https://api.v2.sondehub.org/amateur/listeners'; - constructor( - private uploaderCallsign: string, - private uploaderPosition?: Position, - private uploaderRadio?: string, - private uploaderAntenna?: string, - private softwareName = 'ts-sondehub', - private softwareVersion = '0.0.1', - private uploadRate = 2, - private uploadTimeout = 20, - private uploadRetries = 5, - private developerMode = false - ) {} + constructor(options: UploaderOptions) { + this.uploaderConfig = { + ...options, + ...this.uploaderConfig + } + } private logDebug(message: string): void { console.debug(`Sondehub Uploader: ${message}`); @@ -70,13 +86,17 @@ export class Uploader { public addTelemetry(packet: TelemetryPacket): void { const now = new Date(); - packet.software_name = this.softwareName; + packet.software_name = this.uploaderConfig.softwareName; packet.software_version = this.softwareVersion; if (!packet.uploader_callsign) { packet.uploader_callsign = this.uploaderCallsign; } + if(!packet.uploader_position) { + packet.uploader_position = this.uploaderPosition; + } + if (!packet.time_received) { packet.time_received = now.toISOString(); } @@ -95,7 +115,7 @@ export class Uploader { this.inputQueue = []; // Clear the queue try { - const compressedPayload = gzipSync(JSON.stringify(packets)); + const compressedPayload = gzipSync(JSON.stringify(packets)); const headers = { 'User-Agent': `${this.softwareName}-${this.softwareVersion}`, 'Content-Encoding': 'gzip', diff --git a/sondehub-test.py b/sondehub-test.py new file mode 100644 index 0000000..6c96d15 --- /dev/null +++ b/sondehub-test.py @@ -0,0 +1,12 @@ +from sondehub.amateur import Uploader +import datetime + +uploader_data = Uploader("CesilkoTest", uploader_position=[50.073, 14.418, 400]) + +uploader_data.add_telemetry( + "cesilko-test-probe", + datetime.datetime.now(datetime.UTC), + 50.005, + 14.07, + 250 +)