Consistent KISS naming and tests

This commit is contained in:
2026-03-12 09:33:35 +01:00
parent 5ece69412e
commit 9d2fb57bb8
2 changed files with 120 additions and 7 deletions

View File

@@ -6,14 +6,14 @@ export const KISS_FESC = 0xdb;
export const KISS_TFEND = 0xdc;
export const KISS_TFESC = 0xdd;
export type KissFrame = {
export type KISSFrame = {
port: number; // 0-15
command: number; // 0 = data, 1 = TX delay, etc.
data: Uint8Array;
};
// Encode a KISS frame (data only, port 0 by default)
export function encodeKissFrame(data: Uint8Array, port = 0, command = 0): Uint8Array {
export function encodeKISSFrame(data: Uint8Array, port = 0, command = 0): Uint8Array {
const out: number[] = [KISS_FEND];
// Command byte: upper 4 bits = port, lower 4 bits = command
out.push(((port & 0x0f) << 4) | (command & 0x0f));
@@ -31,7 +31,7 @@ export function encodeKissFrame(data: Uint8Array, port = 0, command = 0): Uint8A
}
// Decode a KISS frame (returns null if not a valid frame)
export function decodeKissFrame(buf: Uint8Array): KissFrame | null {
export function decodeKISSFrame(buf: Uint8Array): KISSFrame | null {
if (buf.length < 3 || buf[0] !== KISS_FEND || buf[buf.length - 1] !== KISS_FEND) return null;
let i = 1;
const cmd = buf[i++];
@@ -53,14 +53,14 @@ export function decodeKissFrame(buf: Uint8Array): KissFrame | null {
}
// Async generator to extract KISS frames from a stream of bytes
export async function* kissFrameReader(source: AsyncIterable<Uint8Array>): AsyncGenerator<KissFrame> {
export async function* kissFrameReader(source: AsyncIterable<Uint8Array>): AsyncGenerator<KISSFrame> {
let buffer: number[] = [];
let inFrame = false;
for await (const chunk of source) {
for (const b of chunk) {
if (b === KISS_FEND) {
if (inFrame && buffer.length > 0) {
const frame = decodeKissFrame(Uint8Array.from([KISS_FEND, ...buffer, KISS_FEND]));
const frame = decodeKISSFrame(Uint8Array.from([KISS_FEND, ...buffer, KISS_FEND]));
if (frame) yield frame;
}
buffer = [];
@@ -73,7 +73,7 @@ export async function* kissFrameReader(source: AsyncIterable<Uint8Array>): Async
}
// Write a KISS frame to a sink (e.g., serial port)
export async function kissFrameWriter(sink: (data: Uint8Array) => Promise<void>, frame: KissFrame) {
const buf = encodeKissFrame(frame.data, frame.port, frame.command);
export async function kissFrameWriter(sink: (data: Uint8Array) => Promise<void>, frame: KISSFrame) {
const buf = encodeKISSFrame(frame.data, frame.port, frame.command);
await sink(buf);
}