@betaflight/api
Version:
A high-level API to read data from betaflight flight controllers
124 lines • 5.18 kB
JavaScript
import { apiVersion, execute, WriteBuffer } from "@betaflight/msp";
import semver from "semver";
import codes from "../codes";
import { packValues, times, unpackValues } from "../utils";
import { legacySerialPortFunctionsMap, serialPortFunctionBits, } from "./constants";
import { SerialPortIdentifiers, SerialPortFunctions } from "./types";
export { SerialPortIdentifiers, SerialPortFunctions };
export const BAUD_RATES = [
-1, 9600, 19200, 38400, 57600, 115200, 230400, 250000, 400000, 460800, 500000,
921600, 1000000, 1500000, 2000000, 2470000,
];
const toBaudRate = (baudRateIdentifier) => { var _a; return (_a = BAUD_RATES[baudRateIdentifier]) !== null && _a !== void 0 ? _a : -1; };
export const readSerialConfig = async (port) => {
const api = apiVersion(port);
if (semver.gte(api, "1.43.0")) {
const data = await execute(port, {
code: codes.MSP2_COMMON_SERIAL_CONFIG,
});
const count = data.readU8();
const portConfigSize = data.remaining() / count;
return {
ports: times(() => {
const start = data.remaining();
const serialPort = {
id: data.readU8(),
functions: unpackValues(data.readU32(), serialPortFunctionBits()),
mspBaudRate: toBaudRate(data.readU8()),
gpsBaudRate: toBaudRate(data.readU8()),
telemetryBaudRate: toBaudRate(data.readU8()),
blackboxBaudRate: toBaudRate(data.readU8()),
};
while (start - data.remaining() < portConfigSize &&
data.remaining() > 0) {
data.readU8();
}
return serialPort;
}, count),
};
}
const data = await execute(port, {
code: codes.MSP_CF_SERIAL_CONFIG,
});
if (semver.lt(api, "1.6.0")) {
const serialPortCount = (data.byteLength - 16) / 2;
return {
ports: times(() => {
var _a;
return ({
id: data.readU8(),
functions: (_a = legacySerialPortFunctionsMap[data.readU8()]) !== null && _a !== void 0 ? _a : [],
mspBaudRate: -1,
gpsBaudRate: -1,
telemetryBaudRate: -1,
blackboxBaudRate: -1,
});
}, serialPortCount),
legacy: {
mspBaudRate: data.readU32(),
cliBaudRate: data.readU32(),
gpsBaudRate: data.readU32(),
gpsPassthroughBaudRate: data.readU32(),
},
};
}
const serialPortCount = Math.floor(data.byteLength / (1 + 2 + 1 * 4));
return {
ports: times(() => ({
id: data.readU8(),
functions: unpackValues(data.readU16(), serialPortFunctionBits()),
mspBaudRate: toBaudRate(data.readU8()),
gpsBaudRate: toBaudRate(data.readU8()),
telemetryBaudRate: toBaudRate(data.readU8()),
blackboxBaudRate: toBaudRate(data.readU8()),
}), serialPortCount),
};
};
export const writeSerialConfig = async (port, config) => {
const buffer = new WriteBuffer();
const api = apiVersion(port);
if (semver.gte(api, "1.43.0")) {
buffer.push8(config.ports.length);
config.ports.forEach((portSettings) => {
buffer.push8(portSettings.id);
buffer
.push32(packValues(portSettings.functions, serialPortFunctionBits()))
.push8(BAUD_RATES.indexOf(portSettings.mspBaudRate))
.push8(BAUD_RATES.indexOf(portSettings.gpsBaudRate))
.push8(BAUD_RATES.indexOf(portSettings.telemetryBaudRate))
.push8(BAUD_RATES.indexOf(portSettings.blackboxBaudRate));
});
await execute(port, {
code: codes.MSP2_COMMON_SET_SERIAL_CONFIG,
data: buffer,
});
}
else {
if (semver.lt(api, "1.6.0")) {
// for (let i = 0; i < SERIAL_CONFIG.ports.length; i++) {
// buffer.push8(SERIAL_CONFIG.ports[i].scenario);
// }
// buffer
// .push32(SERIAL_CONFIG.mspBaudRate)
// .push32(SERIAL_CONFIG.cliBaudRate)
// .push32(SERIAL_CONFIG.gpsBaudRate)
// .push32(SERIAL_CONFIG.gpsPassthroughBaudRate);
}
else {
config.ports.forEach((portSettings) => {
buffer.push8(portSettings.id);
buffer
.push16(packValues(portSettings.functions, serialPortFunctionBits()))
.push8(BAUD_RATES.indexOf(portSettings.mspBaudRate))
.push8(BAUD_RATES.indexOf(portSettings.gpsBaudRate))
.push8(BAUD_RATES.indexOf(portSettings.telemetryBaudRate))
.push8(BAUD_RATES.indexOf(portSettings.blackboxBaudRate));
});
}
await execute(port, {
code: codes.MSP_SET_CF_SERIAL_CONFIG,
data: buffer,
});
}
};
//# sourceMappingURL=index.js.map