From 2e1d763d54a52d4b01934ed70d8e38dd210b66fa Mon Sep 17 00:00:00 2001 From: pascallanger Date: Tue, 26 Sep 2023 20:04:35 +0200 Subject: [PATCH] V761 telemetry A1 (4.4V -> 2.2V), RSSI equal to 100 means that all telem packets are received and TQLY indicates the number of lost telem packets. --- Multiprotocol/Multiprotocol.h | 2 +- Multiprotocol/V761_nrf24l01.ino | 123 ++++++++++++++++++++++++++++---- Multiprotocol/Validate.h | 6 +- Multiprotocol/XN297_EMU.ino | 7 +- Multiprotocol/_Config.h | 1 + Protocols_Details.md | 2 + 6 files changed, 120 insertions(+), 21 deletions(-) diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 3f17fc7..5714474 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 3 -#define VERSION_PATCH_LEVEL 31 +#define VERSION_PATCH_LEVEL 32 #define MODE_SERIAL 0 diff --git a/Multiprotocol/V761_nrf24l01.ino b/Multiprotocol/V761_nrf24l01.ino index ea168ef..9189796 100644 --- a/Multiprotocol/V761_nrf24l01.ino +++ b/Multiprotocol/V761_nrf24l01.ino @@ -22,17 +22,23 @@ Multiprotocol is distributed in the hope that it will be useful, #define V761_PACKET_PERIOD 7060 // Timeout for callback in uSec #define V761_INITIAL_WAIT 500 #define V761_PACKET_SIZE 8 +#define V761_RXPAYLOAD_SIZE 3 #define V761_BIND_COUNT 200 #define V761_BIND_FREQ 0x28 #define V761_RF_NUM_CHANNELS 3 #define TOPRC_BIND_FREQ 0x2A #define TOPRC_PACKET_PERIOD 14120 // Timeout for callback in uSec +#define V761_WRITE_TIME 450 +//#define V761_TELEM_DEBUG + enum { - V761_BIND1 = 0, - V761_BIND2, - V761_DATA + V761_BIND1 = 0, + V761_BIND2, + V761_RX_CHECK, + V761_DATA, + V761_RX }; static void __attribute__((unused)) V761_set_checksum() @@ -70,8 +76,8 @@ static void __attribute__((unused)) V761_send_packet() if(hopping_frequency_no >= V761_RF_NUM_CHANNELS) { hopping_frequency_no = 0; - packet_count++; - packet_count &= 0x03; + packet_sent++; + packet_sent &= 0x03; } packet[0] = convert_channel_8b(THROTTLE); // Throttle @@ -88,7 +94,7 @@ static void __attribute__((unused)) V761_send_packet() packet[3] = convert_channel_8b(AILERON)>>1; // Aileron } - packet[5] = packet_count<<6; // 0X, 4X, 8X, CX + packet[5] = packet_sent<<6; // 0X, 4X, 8X, CX packet[4] = 0x20; // Trims 00..20..40, 0X->20 4X->TrAil 8X->TrEle CX->TrRud if(CH5_SW) // Mode Expert Gyro off @@ -180,46 +186,125 @@ static void __attribute__((unused)) V761_initialize_txid() uint16_t V761_callback() { + static bool rx = false; + static uint8_t packet_telem = 0; + switch(phase) { case V761_BIND1: if(bind_counter) bind_counter--; - packet_count ++; + packet_sent ++; XN297_RFChannel(sub_protocol == V761_TOPRC ? TOPRC_BIND_FREQ : V761_BIND_FREQ); XN297_SetTXAddr(rx_id, 4); V761_send_packet(); - if(packet_count >= 20) + if(packet_sent >= 20) { - packet_count = 0; + packet_sent = 0; phase = V761_BIND2; } return 15730; case V761_BIND2: if(bind_counter) bind_counter--; - packet_count ++; + packet_sent ++; XN297_Hopping(0); XN297_SetTXAddr(rx_tx_addr, 4); V761_send_packet(); if(bind_counter == 0) { - packet_count = 0; + packet_sent = 0; BIND_DONE; phase = V761_DATA; + #ifdef V761_HUB_TELEMETRY + XN297_SetRXAddr(rx_tx_addr, V761_RXPAYLOAD_SIZE); + #endif } - else if(packet_count >= 20) + else if(packet_sent >= 20) { - packet_count = 0; + packet_sent = 0; phase = V761_BIND1; } return 15730; + #ifdef V761_HUB_TELEMETRY + case V761_RX_CHECK: + rx = XN297_IsRX(); // Needed for the NRF24L01 since otherwise the bit gets cleared + packet_count++; + if(packet_count > 6*21) // About 1 sec with no telemetry + telemetry_lost = 1; + if(packet_telem++ >= 100) + TX_LQI = packet_telem = 0; + if(!telemetry_lost && !rx && (packet_count%22) == 0) + {// Should have received a telem packet but... Send telem to the radio to keep it alive + TX_LQI++; + RX_RSSI = 100 - TX_LQI; + telemetry_link = 1; + #ifdef V761_TELEM_DEBUG + debugln("Miss"); + #endif + } + XN297_SetTxRxMode(TXRX_OFF); + phase++; + #endif case V761_DATA: #ifdef MULTI_SYNC telemetry_set_input_sync(packet_period); #endif V761_send_packet(); + #ifdef V761_HUB_TELEMETRY + if(hopping_frequency_no == 1) + { // Start RX on RF channel 0 + phase++; + return V761_WRITE_TIME; + } + if(rx) + { // Check if a packet has been received + #ifdef V761_TELEM_DEBUG + debug("RX "); + #endif + if(XN297_ReadPayload(packet_in, V761_RXPAYLOAD_SIZE)) + { // packet with good CRC and length + #ifdef V761_TELEM_DEBUG + debug("OK:"); + for(uint8_t i=0;i battery ok + // packet_in[] = 55 00 AA -> low battery + v_lipo1=packet_in[0] >> 1; + RX_RSSI = 100 - TX_LQI; + telemetry_link = 1; + telemetry_lost = 0; + packet_count = 0; + } + #ifdef V761_TELEM_DEBUG + else // Bad packet + debug("NOK"); + debugln(""); + #endif + rx = false; + } break; + case V761_RX: + { // Wait for packet to be sent before switching to receive mode + uint16_t start=(uint16_t)micros(); + while ((uint16_t)((uint16_t)micros()-(uint16_t)start) < 500) + { + if(XN297_IsPacketSent()) + break; + } + } + XN297_SetTxRxMode(RX_EN); + phase = V761_RX_CHECK; + if(!telemetry_lost && packet_count%20==0) + { // Telemetry packets are sent every 21 packets but with a huge jitter from 4ms to 10+ms + hopping_frequency_no++; //don't send next packet to ensure we have enough time to receive the telemetry + return 2 * packet_period - V761_WRITE_TIME; + } + return packet_period - V761_WRITE_TIME; + #else + break; + #endif } return packet_period; } @@ -227,6 +312,7 @@ uint16_t V761_callback() void V761_init(void) { V761_initialize_txid(); + V761_RF_init(); if(sub_protocol == V761_TOPRC) { memcpy(rx_id,(uint8_t*)"\x20\x21\x05\x0A",4); @@ -246,12 +332,19 @@ void V761_init(void) else { XN297_SetTXAddr(rx_tx_addr, 4); + #ifdef V761_HUB_TELEMETRY + XN297_SetRXAddr(rx_tx_addr, V761_RXPAYLOAD_SIZE); + #endif phase = V761_DATA; } - V761_RF_init(); hopping_frequency_no = 0; - packet_count = 0; + packet_sent = 0; + #ifdef V761_HUB_TELEMETRY + packet_count = 0; + telemetry_lost = 1; + #endif + } #endif \ No newline at end of file diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index 214c4f5..3a20e35 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -398,6 +398,7 @@ #undef DEVO_HUB_TELEMETRY #undef PROPEL_HUB_TELEMETRY #undef OMP_HUB_TELEMETRY + #undef V761_HUB_TELEMETRY #undef RLINK_HUB_TELEMETRY #undef DSM_RX_CYRF6936_INO #undef DSM_FWD_PGM @@ -433,6 +434,9 @@ #if not defined(OMP_CCNRF_INO) #undef OMP_HUB_TELEMETRY #endif + #if not defined(V761_NRF24L01_INO) + #undef V761_HUB_TELEMETRY + #endif #if not defined(PROPEL_NRF24L01_INO) #undef PROPEL_HUB_TELEMETRY #endif @@ -490,7 +494,7 @@ //protocols using FRSKYD user frames #undef HUB_TELEMETRY #endif - #if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(RLINK_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY) && not defined(OMP_HUB_TELEMETRY) && not defined(WFLY2_HUB_TELEMETRY) && not defined(LOLI_HUB_TELEMETRY) && not defined(MLINK_HUB_TELEMETRY) && not defined(MLINK_FW_TELEMETRY) && not defined(MT99XX_HUB_TELEMETRY) && not defined(MULTI_CONFIG_INO) + #if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(RLINK_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY) && not defined(OMP_HUB_TELEMETRY) && not defined(V761_HUB_TELEMETRY) && not defined(WFLY2_HUB_TELEMETRY) && not defined(LOLI_HUB_TELEMETRY) && not defined(MLINK_HUB_TELEMETRY) && not defined(MLINK_FW_TELEMETRY) && not defined(MT99XX_HUB_TELEMETRY) && not defined(MULTI_CONFIG_INO) #undef TELEMETRY #undef INVERT_TELEMETRY #undef MULTI_TELEMETRY diff --git a/Multiprotocol/XN297_EMU.ino b/Multiprotocol/XN297_EMU.ino index e5da37f..e1a1de9 100644 --- a/Multiprotocol/XN297_EMU.ino +++ b/Multiprotocol/XN297_EMU.ino @@ -133,10 +133,9 @@ static void __attribute__((unused)) XN297_SetRXAddr(const uint8_t* addr, uint8_t if(xn297_rf == XN297_NRF) { NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, xn297_rx_addr, xn297_addr_len); - if(rx_packet_len >= 32) - NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, 32); - else - NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, rx_packet_len); + if(rx_packet_len > 32) + rx_packet_len = 32; + NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, rx_packet_len); } #endif #ifdef CC2500_INSTALLED diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 4e1e5b5..4312cfa 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -337,6 +337,7 @@ #define HUBSAN_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define NCC1701_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define OMP_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX +#define V761_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define PROPEL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define CABELL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define RLINK_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX diff --git a/Protocols_Details.md b/Protocols_Details.md index 88eeace..fa7bdc3 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -1991,6 +1991,8 @@ Flip: momentary switch: hold flip(+100%), indicate flip direction with Ele or Ai RTN_ACT and RTN: -100% disable, +100% enable +If the model (newest versions) sends telemetry then the battery status ok/empty is in A1 (4.4V -> 2.2V), RSSI equal to 100 means that all telem packets are received and TQLY indicates the number of lost telem packets. + ### Sub_protocol 3CH - *0* Models: Volantex V761-1, V761-3 and may be others