diff --git a/README.md b/README.md index 16951883..48f866dd 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,13 @@ Here are more details about [how to setup](/docs/setup.md). | QMC5883 | Yes | Yes | Yes | | AK8963 | Yes | Yes | Yes | +## Supported VTX devices + +| Device | ESP8266 | ESP32 | RP2040 | +|------------------:|--------:|------:|-------:| +| [TBS SmartAudio](/docs/vtx_table_tbs_smartaudio.json) | Yes | Yes | Yes | +| [IRC Tramp](/docs/vtx_table_irc_tramp.json) | Yes | Yes | Yes | + ## Issues You can report issues using Github [tracker](https://github.com/rtlopez/esp-fc/issues) You can also join to our [Discord Channel](https://discord.gg/jhyPPM5UEH) diff --git a/docs/vtx_table_irc_tramp.json b/docs/vtx_table_irc_tramp.json new file mode 100644 index 00000000..c4248942 --- /dev/null +++ b/docs/vtx_table_irc_tramp.json @@ -0,0 +1,105 @@ +{ + "description": "ESPFC VTX Config file for IRC Tramp", + "version": "1.0", + "vtx_table": { + "bands_list": [ + { + "name": "BOSCAM_A", + "letter": "A", + "is_factory_band": false, + "frequencies": [ + 5865, + 5845, + 5825, + 5805, + 5785, + 5765, + 5745, + 0 + ] + }, + { + "name": "BOSCAM_B", + "letter": "B", + "is_factory_band": false, + "frequencies": [ + 5733, + 5752, + 5771, + 5790, + 5809, + 5828, + 5847, + 5866 + ] + }, + { + "name": "FATSHARK", + "letter": "F", + "is_factory_band": false, + "frequencies": [ + 5740, + 5760, + 5780, + 5800, + 5820, + 5840, + 5860, + 0 + ] + }, + { + "name": "RACEBAND", + "letter": "R", + "is_factory_band": false, + "frequencies": [ + 0, + 0, + 5732, + 5769, + 5806, + 5843, + 0, + 0 + ] + }, + { + "name": "IMD6", + "letter": "I", + "is_factory_band": false, + "frequencies": [ + 5732, + 5765, + 5828, + 5840, + 5866, + 5740, + 0, + 0 + ] + } + ], + "powerlevels_list": [ + { + "value": 25, + "label": "25 " + }, + { + "value": 100, + "label": "100 " + }, + { + "value": 200, + "label": "200 " + }, + { + "value": 400, + "label": "400 " + }, + { + "value": 600, + "label": "600 " + } + ] + } +} diff --git a/docs/vtx_table_tbs_smartaudio.json b/docs/vtx_table_tbs_smartaudio.json new file mode 100644 index 00000000..41858f72 --- /dev/null +++ b/docs/vtx_table_tbs_smartaudio.json @@ -0,0 +1,104 @@ +{ + "description": "ESPFC VTX Config file for SmartAudio 2.0", + "version": "1.0", + "vtx_table": { + "bands_list": [ + { + "name": "BOSCAM_A", + "letter": "A", + "is_factory_band": true, + "frequencies": [ + 5865, + 5845, + 5825, + 5805, + 5785, + 5765, + 5745, + 0 + ] + }, + { + "name": "BOSCAM_B", + "letter": "B", + "is_factory_band": true, + "frequencies": [ + 5733, + 5752, + 5771, + 5790, + 5809, + 5828, + 5847, + 5866 + ] + }, + { + "name": "UNKNOWN", + "letter": "U", + "is_factory_band": true, + "frequencies": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "name": "FATSHARK", + "letter": "F", + "is_factory_band": true, + "frequencies": [ + 5740, + 5760, + 5780, + 5800, + 5820, + 5840, + 5860, + 0 + ] + }, + { + "name": "RACEBAND", + "letter": "R", + "is_factory_band": true, + "frequencies": [ + 0, + 0, + 5732, + 5769, + 5806, + 5843, + 0, + 0 + ] + }, + { + "name": "IMD6", + "letter": "I", + "is_factory_band": false, + "frequencies": [ + 5732, + 5765, + 5828, + 5840, + 5866, + 5740, + 0, + 0 + ] + } + ], + "powerlevels_list": [ + { + "value": 0, + "label": "25 " + } + ] + } +} diff --git a/lib/Espfc/src/Connect/MspProcessor.cpp b/lib/Espfc/src/Connect/MspProcessor.cpp index f877b2fc..00cc7c92 100644 --- a/lib/Espfc/src/Connect/MspProcessor.cpp +++ b/lib/Espfc/src/Connect/MspProcessor.cpp @@ -1403,29 +1403,29 @@ void MspProcessor::processCommand(MspMessage& m, MspResponse& r, Device::SerialD r.writeU8(0); // ready r.writeU8(0); // low power disarm } else { - r.writeU8(3 /* SMARTAUDIO */); // vtx type unknown - r.writeU8(_model.config.vtx.band); // band - r.writeU8(_model.config.vtx.channel); // channel - r.writeU8(_model.config.vtx.power); // power - r.writeU8(0); // status (looks like 1 means pit mode :shrug:) + r.writeU8(_model.state.vtx.protocol); // vtx type + r.writeU8(_model.config.vtx.band); // band + r.writeU8(_model.config.vtx.channel); // channel + r.writeU8(_model.config.vtx.power); // power + r.writeU8(0); // status (1 indicates pit mode) r.writeU16(0); // freq r.writeU8(1); // ready - r.writeU8(_model.config.vtx.lowPowerDisarm); // low power disarm + r.writeU8(_model.config.vtx.lowPowerDisarm); // low power disarm } - // 1.42 + // API version 1.42 r.writeU16(0); // pit mode freq r.writeU8(0); // vtx table available (no) r.writeU8(0); // vtx table bands r.writeU8(0); // vtx table channels r.writeU8(0); // vtx power levels break; - + case MSP_SET_VTX_CONFIG: { uint16_t freq = m.readU16(); if (freq <= VTXCOMMON_MSP_BANDCHAN_CHKVAL) { // Value is band and channel - //const uint8_t newBand = (freq / 8) + 1; - //const uint8_t newChannel = (freq % 8) + 1; + // const uint8_t newBand = (freq / 8) + 1; + // const uint8_t newChannel = (freq % 8) + 1; } if (m.remain() >= 2) { @@ -1453,7 +1453,6 @@ void MspProcessor::processCommand(MspMessage& m, MspResponse& r, Device::SerialD } break; - case MSP_SET_ARMING_DISABLED: { const uint8_t cmd = m.readU8(); diff --git a/lib/Espfc/src/Connect/Vtx.cpp b/lib/Espfc/src/Connect/Vtx.cpp deleted file mode 100644 index c972f5ca..00000000 --- a/lib/Espfc/src/Connect/Vtx.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include "Vtx.hpp" - -static const uint8_t dummyByte[] = { 0x00 }; - -/* CRC8 implementation with polynom = x -7+ x -6+ x -4+ x -2+ x -0 (0xD5) */ -static unsigned char crc8tab[256] = -{ - 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54, 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D, - 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06, 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F, - 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0, 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9, - 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2, 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B, - 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9, 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0, - 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B, 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2, - 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D, 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44, - 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F, 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16, - 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB, 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92, - 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9, 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0, - 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F, 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36, - 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D, 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64, - 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26, 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F, - 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74, 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D, - 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82, 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB, - 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0, 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9 -}; -static uint8_t crc8(const uint8_t * ptr, uint8_t len) -{ - uint8_t crc = 0; - for (uint8_t i = 0; i < len; i++) { - crc = crc8tab[crc ^ *ptr++]; -} -return crc; -} - -namespace Espfc::Connect { - -int Vtx::begin(Device::SerialDevice * serial) -{ - _serial = serial; - _timer.setRate(300); - - _state = State::INIT; - return 1; -} - -int Vtx::update() -{ - if (!_timer.check()) return 1; - switch (_state) - { - case State::INIT: - _state = State::SET_CHANNEL; - _model.state.vtx.active = true; - break; - case State::SET_POWER: - setPower(); - _state = State::IDLE; - break; - case State::SET_CHANNEL: - setChannel(); - _state = State::SET_POWER; - break; - case State::IDLE: - if (_model.isModeActive(MODE_ARMED) != _armed) - { - _armed = !_armed; - _state = State::SET_POWER; - } - break; - case State::INACTIVE: - default: - break; - } - - return 1; -} - -int Vtx::setChannel() -{ - uint8_t vtxCommand[6] = { 0xAA, 0x55, 0x07, 0x01, (uint8_t)((_model.config.vtx.band -1)*8 + _model.config.vtx.channel - 1) }; - vtxCommand[5] = crc8(vtxCommand, 5); - _serial->write(dummyByte, 1); - _serial->write(vtxCommand, 6); - _serial->flush(); - - return 1; -} - -int Vtx::setPower() -{ - uint8_t vtxCommand[6] = { 0xAA, 0x55, 0x05, 0x01, (uint8_t)((!_model.config.vtx.lowPowerDisarm || _model.isModeActive(MODE_ARMED)) ? _model.config.vtx.power - 1 : 0) }; - vtxCommand[5] = crc8(vtxCommand, 5); - _serial->write(dummyByte, 1); - _serial->write(vtxCommand, 6); - _serial->flush(); - - return 1; -} - -} diff --git a/lib/Espfc/src/Connect/VtxSmartAudio.cpp b/lib/Espfc/src/Connect/VtxSmartAudio.cpp new file mode 100644 index 00000000..117bbbe4 --- /dev/null +++ b/lib/Espfc/src/Connect/VtxSmartAudio.cpp @@ -0,0 +1,69 @@ +#include "VtxSmartAudio.hpp" +#include "Utils/Crc.hpp" + +static const uint8_t dummyByte[] = { 0x00 }; + +namespace Espfc::Connect { + +int VtxSmartAudio::begin(Device::SerialDevice * serial) +{ + _serial = serial; + _timer.setInterval(300); + + _state = State::INIT; + return 1; +} + +int VtxSmartAudio::update() +{ + if (!_timer.check()) return 1; + switch (_state) + { + case State::INIT: + _state = State::SET_CHANNEL; + _model.state.vtx.active = true; + break; + case State::SET_POWER: + setPower(); + _state = State::IDLE; + break; + case State::SET_CHANNEL: + setChannel(); + _state = State::SET_POWER; + break; + case State::IDLE: + if (_model.isModeActive(MODE_ARMED) != _armed) + { + _armed = !_armed; + _state = State::SET_POWER; + } + break; + case State::INACTIVE: + default: + break; + } + + return 1; +} + +int VtxSmartAudio::setChannel() +{ + uint8_t vtxCommand[6] = { 0xAA, 0x55, 0x07, 0x01, (uint8_t)((_model.config.vtx.band -1)*8 + _model.config.vtx.channel - 1) }; + vtxCommand[5] = Utils::crc8_dvb_s2(vtxCommand[5], reinterpret_cast(&vtxCommand), 5); + _serial->write(dummyByte, 1); + _serial->write(vtxCommand, 6); + _serial->flush(); + return 1; +} + +int VtxSmartAudio::setPower() +{ + uint8_t vtxCommand[6] = { 0xAA, 0x55, 0x05, 0x01, (uint8_t)((!_model.config.vtx.lowPowerDisarm || _model.isModeActive(MODE_ARMED)) ? _model.config.vtx.power - 1 : 0) }; + vtxCommand[5] = Utils::crc8_dvb_s2(vtxCommand[5], reinterpret_cast(&vtxCommand), 5); + _serial->write(dummyByte, 1); + _serial->write(vtxCommand, 6); + _serial->flush(); + return 1; +} + +} diff --git a/lib/Espfc/src/Connect/Vtx.hpp b/lib/Espfc/src/Connect/VtxSmartAudio.hpp similarity index 50% rename from lib/Espfc/src/Connect/Vtx.hpp rename to lib/Espfc/src/Connect/VtxSmartAudio.hpp index a6ae2956..54d6f14a 100644 --- a/lib/Espfc/src/Connect/Vtx.hpp +++ b/lib/Espfc/src/Connect/VtxSmartAudio.hpp @@ -3,37 +3,20 @@ #include "Device/SerialDevice.h" #include "Utils/Timer.h" #include "Model.h" +#include "Vtx.h" namespace Espfc::Connect { -enum VtxDeviceType { - VTXDEV_UNSUPPORTED = 0, // reserved for MSP - VTXDEV_RTC6705 = 1, - // 2 reserved - VTXDEV_SMARTAUDIO = 3, - VTXDEV_TRAMP = 4, - VTXDEV_MSP = 5, - VTXDEV_UNKNOWN = 0xFF, -}; - -enum State { - INACTIVE, - INIT, - SET_POWER, - SET_CHANNEL, - IDLE, -}; - -class Vtx +class VtxSmartAudio { public: - Vtx(Model& model): _serial(NULL), _model(model) {} + VtxSmartAudio(Model& model): _serial(NULL), _model(model) {} int begin(Device::SerialDevice * serial); int update(); int setChannel(); int setPower(); - Connect::VtxDeviceType type; + Connect::VtxDeviceType type = Connect::VTXDEV_SMARTAUDIO; private: Device::SerialDevice* _serial; diff --git a/lib/Espfc/src/Connect/VtxTramp.cpp b/lib/Espfc/src/Connect/VtxTramp.cpp new file mode 100644 index 00000000..e11f7b25 --- /dev/null +++ b/lib/Espfc/src/Connect/VtxTramp.cpp @@ -0,0 +1,72 @@ +#include "VtxTramp.hpp" +#include "Utils/Crc.hpp" + +namespace Espfc::Connect { + +int VtxTramp::begin(Device::SerialDevice * serial) +{ + _serial = serial; + _timer.setInterval(300); + + _state = State::INIT; + return 1; +} + +int VtxTramp::update() +{ + if (!_timer.check()) return 1; + switch (_state) + { + case State::INIT: + _state = State::SET_CHANNEL; + _model.state.vtx.active = true; + break; + case State::SET_POWER: + setPower(); + _state = State::IDLE; + break; + case State::SET_CHANNEL: + setChannel(); + _state = State::SET_POWER; + break; + case State::IDLE: + if (_model.isModeActive(MODE_ARMED) != _armed) + { + _armed = !_armed; + _state = State::SET_POWER; + } + break; + case State::INACTIVE: + default: + break; + } + + return 1; +} + +int VtxTramp::trampSendCommand(uint8_t cmd, uint16_t param) +{ + uint8_t vtxCommand[15]; + vtxCommand[0] = 0x0F; + vtxCommand[1] = cmd; + vtxCommand[2] = param & 0xff; + vtxCommand[3] = (param >> 8) & 0xff; + vtxCommand[14] = Utils::crc8_dvb_s2(0, reinterpret_cast(&vtxCommand), 13); + _serial->write(vtxCommand, 16); + _serial->flush(); + return 1; +} + +int VtxTramp::setChannel() +{ + trampSendCommand('F', TrampFreqTable[_model.config.vtx.band -1][_model.config.vtx.channel -1]); + return 1; +} + +int VtxTramp::setPower() +{ + trampSendCommand('P', (!_model.config.vtx.lowPowerDisarm || _model.isModeActive(MODE_ARMED)) ? TrampPowerTable[_model.config.vtx.power -1] : 0); + return 1; +} + +} diff --git a/lib/Espfc/src/Connect/VtxTramp.hpp b/lib/Espfc/src/Connect/VtxTramp.hpp new file mode 100644 index 00000000..997628a4 --- /dev/null +++ b/lib/Espfc/src/Connect/VtxTramp.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include "Device/SerialDevice.h" +#include "Utils/Timer.h" +#include "Model.h" +#include "Vtx.h" + +namespace Espfc::Connect { + +class VtxTramp +{ + public: + VtxTramp(Model& model): _serial(NULL), _model(model) {} + + int begin(Device::SerialDevice * serial); + int initTramp(); + int update(); + int setChannel(); + int setPower(); + int trampSendCommand(uint8_t cmd, uint16_t param); + Connect::VtxDeviceType type = Connect::VTXDEV_TRAMP; + const uint16_t TrampFreqTable[8][8] { + {5865, 5845, 5825, 5805, 5785, 5765, 5745, 0}, + {5733, 5752, 5771, 5790, 5809, 5828, 5847, 5866}, + {5740, 5760, 5780, 5800, 5820, 5840, 5860, 0}, + {0, 0, 5732, 5769, 5806, 5843, 0, 0}, + {5732, 5765, 5828, 5840, 5866, 5740, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + }; + const uint16_t TrampPowerTable[5] { + 25, 100, 200, 400, 600 + }; + + + private: + Device::SerialDevice* _serial; + Model& _model; + State _state = State::INACTIVE; + bool _armed = false; + Utils::Timer _timer; +}; + +} diff --git a/lib/Espfc/src/Model.h b/lib/Espfc/src/Model.h index 5b2e4c7c..a6cd1b83 100644 --- a/lib/Espfc/src/Model.h +++ b/lib/Espfc/src/Model.h @@ -393,7 +393,7 @@ class Model // configure serial ports constexpr uint32_t serialFunctionAllowedMask = SERIAL_FUNCTION_MSP | SERIAL_FUNCTION_RX_SERIAL | SERIAL_FUNCTION_BLACKBOX | - SERIAL_FUNCTION_GPS | SERIAL_FUNCTION_TELEMETRY_FRSKY | SERIAL_FUNCTION_TELEMETRY_HOTT | SERIAL_FUNCTION_TELEMETRY_IBUS | SERIAL_FUNCTION_VTX_SMARTAUDIO; + SERIAL_FUNCTION_GPS | SERIAL_FUNCTION_TELEMETRY_FRSKY | SERIAL_FUNCTION_TELEMETRY_HOTT | SERIAL_FUNCTION_TELEMETRY_IBUS | SERIAL_FUNCTION_VTX_SMARTAUDIO | SERIAL_FUNCTION_VTX_TRAMP; uint32_t featureAllowMask = FEATURE_RX_PPM | FEATURE_RX_SERIAL | FEATURE_MOTOR_STOP | FEATURE_SOFTSERIAL | FEATURE_GPS | FEATURE_TELEMETRY | FEATURE_RX_SPI;// | FEATURE_AIRMODE; diff --git a/lib/Espfc/src/ModelState.h b/lib/Espfc/src/ModelState.h index ce25c2fe..fa356501 100644 --- a/lib/Espfc/src/ModelState.h +++ b/lib/Espfc/src/ModelState.h @@ -328,6 +328,7 @@ struct ModeState struct VtxState { uint8_t active = false; + uint8_t protocol = 0; }; enum GpsDeviceVersion diff --git a/lib/Espfc/src/SerialManager.cpp b/lib/Espfc/src/SerialManager.cpp index f4805d64..819544c5 100644 --- a/lib/Espfc/src/SerialManager.cpp +++ b/lib/Espfc/src/SerialManager.cpp @@ -21,8 +21,8 @@ namespace Espfc { -SerialManager::SerialManager(Model& model, TelemetryManager& telemetry): _model(model), _current(0), _msp(model), _cli(model), _vtx(model), - _telemetry(telemetry), _gps(model) +SerialManager::SerialManager(Model& model, TelemetryManager& telemetry): _model(model), _current(0), _msp(model), _cli(model), + _vtx_smartaudio(model), _vtx_tramp(model), _telemetry(telemetry), _gps(model) #ifdef ESPFC_SERIAL_SOFT_0_WIFI , _wireless(model) #endif @@ -104,6 +104,17 @@ int SerialManager::begin() sdc.parity = SDC_SERIAL_PARITY_NONE; sdc.stop_bits = SDC_SERIAL_STOP_BITS_2; sdc.data_bits = 8; + + _model.state.vtx.protocol = _vtx_smartaudio.type; + } + else if(spc.functionMask & SERIAL_FUNCTION_VTX_TRAMP) + { + sdc.baud = 9600; + sdc.parity = SDC_SERIAL_PARITY_NONE; + sdc.stop_bits = SDC_SERIAL_STOP_BITS_2; + sdc.data_bits = 8; + + _model.state.vtx.protocol = _vtx_tramp.type; } if(!sdc.baud) @@ -124,7 +135,11 @@ int SerialManager::begin() } if(spc.functionMask & SERIAL_FUNCTION_VTX_SMARTAUDIO) { - _vtx.begin(port); + _vtx_smartaudio.begin(port); + } + if(spc.functionMask & SERIAL_FUNCTION_VTX_TRAMP) + { + _vtx_tramp.begin(port); } if(spc.functionMask & SERIAL_FUNCTION_GPS) { @@ -163,7 +178,11 @@ int FAST_CODE_ATTR SerialManager::update() } if(sc.functionMask & SERIAL_FUNCTION_VTX_SMARTAUDIO) { - _vtx.update(); + _vtx_smartaudio.update(); + } + if(sc.functionMask & SERIAL_FUNCTION_VTX_TRAMP) + { + _vtx_tramp.update(); } if(sc.functionMask & SERIAL_FUNCTION_GPS) { diff --git a/lib/Espfc/src/SerialManager.h b/lib/Espfc/src/SerialManager.h index f839928a..db298d8f 100644 --- a/lib/Espfc/src/SerialManager.h +++ b/lib/Espfc/src/SerialManager.h @@ -3,7 +3,8 @@ #include "Model.h" #include "Device/SerialDevice.h" #include "Connect/MspProcessor.hpp" -#include "Connect/Vtx.hpp" +#include "Connect/VtxSmartAudio.hpp" +#include "Connect/VtxTramp.hpp" #include "Connect/Cli.hpp" #include "TelemetryManager.h" #include "Output/OutputIBUS.hpp" @@ -37,7 +38,8 @@ class SerialManager Connect::MspProcessor _msp; Connect::Cli _cli; - Connect::Vtx _vtx; + Connect::VtxSmartAudio _vtx_smartaudio; + Connect::VtxTramp _vtx_tramp; TelemetryManager& _telemetry; Output::OutputIBUS _ibus; Sensor::GpsSensor _gps; diff --git a/lib/Espfc/src/Vtx.h b/lib/Espfc/src/Vtx.h new file mode 100644 index 00000000..11ede483 --- /dev/null +++ b/lib/Espfc/src/Vtx.h @@ -0,0 +1,23 @@ +#pragma once + +namespace Espfc::Connect { + +enum VtxDeviceType { + VTXDEV_UNSUPPORTED = 0, // reserved for MSP + VTXDEV_RTC6705 = 1, + // 2 reserved + VTXDEV_SMARTAUDIO = 3, + VTXDEV_TRAMP = 4, + VTXDEV_MSP = 5, + VTXDEV_UNKNOWN = 0xFF, +}; + +enum State { + INACTIVE, + INIT, + SET_POWER, + SET_CHANNEL, + IDLE, +}; + +} \ No newline at end of file