@betaflight/api
Version:
A high-level API to read data from betaflight flight controllers
191 lines • 7.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.readVtxDeviceStatus = exports.writeVtxTableBandsRow = exports.readVtxTableBandsRow = exports.writeVtxTablePowerLevelsRow = exports.readVtxTablePowerLevelsRow = exports.writePartialVtxConfig = exports.clearVtxTable = exports.writeVtxConfig = exports.readVtxConfig = exports.VtxDeviceTypes = void 0;
const msp_1 = require("@betaflight/msp");
const semver_1 = __importDefault(require("semver"));
const codes_1 = __importDefault(require("../codes"));
const utils_1 = require("../utils");
const types_1 = require("./types");
Object.defineProperty(exports, "VtxDeviceTypes", { enumerable: true, get: function () { return types_1.VtxDeviceTypes; } });
const readVtxConfig = async (port) => {
const api = (0, msp_1.apiVersion)(port);
const data = await (0, msp_1.execute)(port, { code: codes_1.default.MSP_VTX_CONFIG });
return {
type: data.readU8(),
band: data.readU8(),
channel: data.readU8(),
power: data.readU8(),
pitMode: data.readU8() !== 0,
frequency: data.readU16(),
deviceReady: data.readU8() !== 0,
lowPowerDisarm: data.readU8(),
...(semver_1.default.gte(api, "1.42.0")
? {
pitModeFrequency: data.readU16(),
table: {
available: data.readU8() !== 0,
numBands: data.readU8(),
numBandChannels: data.readU8(),
numPowerLevels: data.readU8(),
},
}
: {
pitModeFrequency: 0,
table: {
available: false,
numBands: 0,
numBandChannels: 0,
numPowerLevels: 0,
},
}),
};
};
exports.readVtxConfig = readVtxConfig;
const writeVtxConfig = async (port, config, clearVtxTable = false) => {
const buffer = new msp_1.WriteBuffer();
const api = (0, msp_1.apiVersion)(port);
buffer
.push16(config.frequency)
.push8(config.power)
.push8(config.pitMode ? 1 : 0)
.push8(config.lowPowerDisarm);
if (semver_1.default.gte(api, "1.42.0")) {
buffer
.push16(config.pitModeFrequency)
.push8(config.band)
.push8(config.channel)
.push16(config.frequency)
.push8(config.table.numBands)
.push8(config.table.numBandChannels)
.push8(config.table.numPowerLevels)
.push8(clearVtxTable ? 1 : 0);
}
await (0, msp_1.execute)(port, { code: codes_1.default.MSP_SET_VTX_CONFIG, data: buffer });
};
exports.writeVtxConfig = writeVtxConfig;
const clearVtxTable = async (port) => {
const config = await (0, exports.readVtxConfig)(port);
await (0, exports.writeVtxConfig)(port, config, true);
};
exports.clearVtxTable = clearVtxTable;
exports.writePartialVtxConfig = (0, utils_1.partialWriteFunc)(exports.readVtxConfig, exports.writeVtxConfig);
/**
* Read the VTX table row, row number indexes from 1
*/
const readVtxTablePowerLevelsRow = async (port, rowNumber) => {
const buffer = new msp_1.WriteBuffer();
buffer.push8(rowNumber);
const data = await (0, msp_1.execute)(port, {
code: codes_1.default.MSP_VTXTABLE_POWERLEVEL,
data: buffer,
});
return {
rowNumber: data.readU8(),
value: data.readU16(),
label: String.fromCharCode(...(0, utils_1.times)(() => data.readU8(), data.readU8())),
};
};
exports.readVtxTablePowerLevelsRow = readVtxTablePowerLevelsRow;
const writeVtxTablePowerLevelsRow = async (port, row) => {
const buffer = new msp_1.WriteBuffer();
buffer.push8(row.rowNumber).push16(row.value);
buffer.push8(row.label.length);
buffer.push(...Buffer.from(row.label));
await (0, msp_1.execute)(port, {
code: codes_1.default.MSP_SET_VTXTABLE_POWERLEVEL,
data: buffer,
});
};
exports.writeVtxTablePowerLevelsRow = writeVtxTablePowerLevelsRow;
/**
* Read the VTX table row, row number indexes from 1
*/
const readVtxTableBandsRow = async (port, rowNumber) => {
const buffer = new msp_1.WriteBuffer();
buffer.push8(rowNumber);
const data = await (0, msp_1.execute)(port, {
code: codes_1.default.MSP_VTXTABLE_BAND,
data: buffer,
});
return {
rowNumber: data.readU8(),
name: String.fromCharCode(...(0, utils_1.times)(() => data.readU8(), data.readU8())),
letter: String.fromCharCode(data.readU8()),
isFactoryBand: data.readU8() !== 0,
frequencies: (0, utils_1.times)(() => data.readU16(), data.readU8()),
};
};
exports.readVtxTableBandsRow = readVtxTableBandsRow;
const writeVtxTableBandsRow = async (port, row) => {
const buffer = new msp_1.WriteBuffer();
buffer.push8(row.rowNumber);
buffer.push8(row.name.length);
buffer.push(...Buffer.from(row.name));
if (row.letter !== "") {
buffer.push8(row.letter.charCodeAt(0));
}
else {
buffer.push8(" ".charCodeAt(0));
}
buffer.push8(row.isFactoryBand ? 1 : 0);
buffer.push8(row.frequencies.length);
row.frequencies.forEach((frequency) => {
buffer.push16(frequency);
});
await (0, msp_1.execute)(port, { code: codes_1.default.MSP_SET_VTXTABLE_BAND, data: buffer });
};
exports.writeVtxTableBandsRow = writeVtxTableBandsRow;
const readVtxDeviceStatus = async (port) => {
const data = await (0, msp_1.execute)(port, { code: codes_1.default.MSP2_GET_VTX_DEVICE_STATUS });
if (data.byteLength < 1) {
return undefined;
}
const vtxType = data.readU8();
const deviceIsReady = Boolean(data.readU8());
const isBandAndChannelAvailable = Boolean(data.readU8());
const band = data.readU8();
const channel = data.readU8();
const powerIndexAvailable = Boolean(data.readU8());
const powerIndex = data.readU8();
const frequencyAvailable = Boolean(data.readU8());
const frequency = data.readU16();
const vtxStatusAvailable = Boolean(data.readU8());
const vtxStatus = data.readU32(); // pitmode and/or locked
const powerLevelCount = data.readU8();
const powersAndLevels = (0, utils_1.times)(() => [data.readU16(), data.readU16()], powerLevelCount);
const baseConfig = {
deviceIsReady,
band: isBandAndChannelAvailable ? band : undefined,
channel: isBandAndChannelAvailable ? channel : undefined,
powerIndex: powerIndexAvailable ? powerIndex : undefined,
frequency: frequencyAvailable ? frequency : undefined,
vtxStatus: vtxStatusAvailable ? vtxStatus : undefined,
levels: powersAndLevels.map((value) => value[0]),
powers: powersAndLevels.map((value) => value[1]),
};
data.readU8(); // custom device status size
switch (vtxType) {
case types_1.VtxDeviceTypes.VTXDEV_SMARTAUDIO:
return {
type: vtxType,
version: data.readU8(),
mode: data.readU8(),
orfreq: data.readU8(),
willBootIntoPitMode: Boolean(data.readU8()),
...baseConfig,
};
case types_1.VtxDeviceTypes.VTXDEV_RTC6705:
case types_1.VtxDeviceTypes.VTXDEV_TRAMP:
case types_1.VtxDeviceTypes.VTXDEV_UNKNOWN:
default:
return {
type: vtxType,
...baseConfig,
};
}
};
exports.readVtxDeviceStatus = readVtxDeviceStatus;
//# sourceMappingURL=index.js.map