UNPKG

@betaflight/api

Version:

A high-level API to read data from betaflight flight controllers

191 lines 7.7 kB
"use strict"; 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