94 lines
2.4 KiB
TypeScript
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;
|
|
};
|