VTX control from RC using ERLS RX and VTX Admin tool

I’m trying to setup change channel, band and power via RC with ERLS RX. It works fine if i enable VTX_ENABLE and set those parameters in settings directly, but changing it with RC doesn’t work without any log messages. RC Tramp configuration is fine if it works with FC settings.

Is it supported with latest firmware and how i can setup this method if yes?

Any idea how the ELRS VTX admin tool works? With TBS this would be either/or - either control the VTX from the FC or control it from the TX. There is no specific support currently.

It looks like handler should be added for MSP_SET_VTX_CONFIG message. ERLS firmware in rx_main.cpp just forward this message to FC without any modification.

As reference you can check "case MSP_SET_VTX_CONFIG: " section in betaflight firmware file: src/main/msp/msp.c. It’s also good idea to check file devMSPVTX.cpp from ERLS repository, there is some reference to documentation

We support something similar for Spektrum, so its definitely possible, just we don’t support it right now.

In CRSF we have 2 types of header. Common header and extended one (+2 byes).
In betaflight MAX CRSF frame size is different from AP (enum { CRSF_FRAME_SIZE_MAX = 64 }; // 62 bytes frame plus 2 bytes frame header()
).
In AP we have define CRSF_HEADER_TYPE_LEN (CRSF_HEADER_LEN + 1) where CRSF_HEADER_LEN is 2, but it should have 2 option common and extended.
With ERLS MSP message they used extended header (you can check CRSF::SetExtendedHeaderAndCrc function).

In AP we have only common header support because of following definition:
struct Frame _frame;
uint8_t _frame_bytes = (uint8_t)&_frame;
where Frame is strict common format without extended header capability

Is it possible to add support both headers to work with MSP messages? Ping me in PM if you need more info or some assist with this

CRSF frame size is 64 bytes. I’m guessing you are talking about some ELRS extension, rather than CRSF as defined by TBS.

I received flowing frame: 0xC8 0xC 0x7C 0xC8 0xEA 0x30 0x4 0x59 0x15 0x0 0x1 0x1 0x48

address	 	0xC8 CRSF_ADDRESS_FLIGHT_CONTROLLER
package_size	0xC
package_type	0x7C CRSF_FRAMETYPE_MSP_WRITE
destination	0xC8 CRSF_ADDRESS_FLIGHT_CONTROLLER
origin		0xEA CRSF_ADDRESS_RADIO_TRANSMITTER
header_type	0x30 static identifier
payload_size	0x4
function	0x59 MSP_SET_VTX_CONFIG
payload		0x15 0x0 0x1 0x1
crc		0x48

Where in ERLS code payload:

    uint8_t vtxIdx = (config.GetVtxBand()-1) * 8 + config.GetVtxChannel();
    packet.addByte(vtxIdx);     // band/channel or frequency low byte
    packet.addByte(0);          // frequency high byte, if frequency mode
    if (config.GetVtxPower())
    {
        packet.addByte(config.GetVtxPower());
        packet.addByte(pitmodeAuxState);
    }

i hope this helps

I implemented code to parse such message but i have some issue when i try to update it. It changed for few seconds after receiving MSP over CRSF packet and switch it back to MissionPlanner configured settings. Could you please suggest correct way to change it permanently from code standpoint in runtime?

According to ERLS documentation it should send such message after RC connection established. So configured setting should not be applied at all or use as default settings till we receive VTX configuration from RC. After receiving such packet it should use as current VTX setting.

There is AP_VideoTX::set_provider_enabled() that you can use to stop other mechanisms updating the VTX. You would probably need to add an MSP type and set it in the right place.

But best to put up a branch/PR - easier to discuss that way

It would be great to see this branch?
I would like to get this feature in.