Cleaned up the frame.ts by splitting payload parsing to subpackages

This commit is contained in:
2026-03-20 10:38:36 +01:00
parent 1aa8eb363f
commit 75e31c2008
26 changed files with 2695 additions and 2429 deletions

View File

@@ -1,7 +1,7 @@
import { Dissected, FieldType } from "@hamradio/packet";
import { describe, expect, it } from "vitest";
import { Address, Frame, Timestamp } from "../src/frame";
import { Address, Frame } from "../src/frame";
import {
DataType,
type ITimestamp,
@@ -12,6 +12,7 @@ import {
type PositionPayload,
type StatusPayload
} from "../src/frame.types";
import Timestamp from "../src/timestamp";
// Address parsing: split by method
describe("Address.parse", () => {

View File

@@ -4,6 +4,7 @@ import { describe, expect, it } from "vitest";
import { Frame } from "../src/frame";
import type { PositionPayload } from "../src/frame.types";
import { feetToMeters, milesToMeters } from "../src/parser";
import { decodeTelemetry } from "../src/payload.extras";
describe("APRS extras test vectors", () => {
it("parses altitude token in the beginning of a comment and emits structure", () => {
@@ -175,3 +176,49 @@ describe("APRS extras test vectors", () => {
expect(commentIndex).toBeGreaterThan(altitudeIndex); // Comment comes after altitude
});
});
describe("decodeTelemetry", () => {
it("decodes minimal telemetry (|!!!!|)", () => {
const result = decodeTelemetry("!!!!");
expect(result.sequence).toBe(0);
expect(result.analog).toEqual([0]);
expect(result.digital).toBeUndefined();
});
it("decodes sequence and one channel", () => {
const result = decodeTelemetry("ss11");
expect(result.sequence).toBe(7544);
expect(result.analog).toEqual([1472]);
expect(result.digital).toBeUndefined();
});
it("decodes sequence and two channels", () => {
const result = decodeTelemetry("ss1122");
expect(result.sequence).toBe(7544);
expect(result.analog).toEqual([1472, 1564]);
expect(result.digital).toBeUndefined();
});
it("decodes sequence and five channels", () => {
const result = decodeTelemetry("ss1122334455");
expect(result.sequence).toBe(7544);
expect(result.analog).toEqual([1472, 1564, 1656, 1748, 1840]);
expect(result.digital).toBeUndefined();
});
it("decodes sequence, five channels, and digital", () => {
const result = decodeTelemetry('ss1122334455!"');
expect(result.sequence).toBe(7544);
expect(result.analog).toEqual([1472, 1564, 1656, 1748, 1840]);
expect(result.digital).toBe(1);
});
it("throws on too short input", () => {
expect(() => decodeTelemetry("!")).toThrow();
expect(() => decodeTelemetry("")).toThrow();
});
it("throws on invalid base91", () => {
expect(() => decodeTelemetry("ss11~~")).toThrow();
});
});