Files
aprs.ts/src/parser.ts
2026-03-15 20:21:26 +01:00

94 lines
2.4 KiB
TypeScript

/**
* Decode a Base91 encoded string to a number.
* Base91 uses ASCII characters 33-123 (! to {) for encoding.
* Each character represents a digit in base 91.
*
* @param str Base91 encoded string (typically 4 characters for 32-bit values in APRS)
* @returns Decoded number value
*/
export const base91ToNumber = (str: string): number => {
let value = 0;
const base = 91;
for (let i = 0; i < str.length; i++) {
const charCode = str.charCodeAt(i);
const digit = charCode - 33; // Base91 uses chars 33-123 (! to {)
if (digit < 0 || digit >= base) {
throw new Error(
`Invalid Base91 character: '${str[i]}' (code ${charCode})`,
);
}
value = value * base + digit;
}
return value;
};
/* Conversions from Freedom Units to whatever the rest of the world uses and understands. */
const KNOTS_TO_KMH = 1.852;
const FEET_TO_METERS = 0.3048;
const FAHRENHEIT_TO_CELSIUS_OFFSET = 32;
/**
* Convert speed from knots to kilometers per hour.
*
* @param knots number of knots
* @returns equivalent speed in kilometers per hour
*/
export const knotsToKmh = (knots: number): number => {
return knots * KNOTS_TO_KMH;
};
/**
* Convert speed from kilometers per hour to knots.
*
* @param kmh speed in kilometers per hour
* @returns equivalent speed in knots
*/
export const kmhToKnots = (kmh: number): number => {
return kmh / KNOTS_TO_KMH;
};
/**
* Convert altitude from feet to meters.
*
* @param feet altitude in feet
* @returns equivalent altitude in meters
*/
export const feetToMeters = (feet: number): number => {
return feet * FEET_TO_METERS;
};
/**
* Convert altitude from meters to feet.
*
* @param meters altitude in meters
* @returns equivalent altitude in feet
*/
export const metersToFeet = (meters: number): number => {
return meters / FEET_TO_METERS;
};
/**
* Convert temperature from Celsius to Fahrenheit.
*
* @param celsius temperature in Celsius
* @returns equivalent temperature in Fahrenheit
*/
export const celsiusToFahrenheit = (celsius: number): number => {
return (celsius * 9) / 5 + FAHRENHEIT_TO_CELSIUS_OFFSET;
};
/**
* Convert temperature from Fahrenheit to Celsius.
*
* @param fahrenheit temperature in Fahrenheit
* @returns equivalent temperature in Celsius
*/
export const fahrenheitToCelsius = (fahrenheit: number): number => {
return ((fahrenheit - FAHRENHEIT_TO_CELSIUS_OFFSET) * 5) / 9;
};