From 1f65025036a84baa82a2028a70f864081360354f Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Sun, 31 May 2020 23:54:13 +0200 Subject: [PATCH] HoTT: add LBT and telemetry improvment --- Multiprotocol/HOTT_cc2500.ino | 208 ++++++++++++++++++++++------------ Multiprotocol/Multiprotocol.h | 2 +- Protocols_Details.md | 19 +++- 3 files changed, 151 insertions(+), 78 deletions(-) diff --git a/Multiprotocol/HOTT_cc2500.ino b/Multiprotocol/HOTT_cc2500.ino index e76ebd0..85862f6 100644 --- a/Multiprotocol/HOTT_cc2500.ino +++ b/Multiprotocol/HOTT_cc2500.ino @@ -29,17 +29,19 @@ enum { HOTT_START = 0x00, HOTT_CAL = 0x01, HOTT_DATA1 = 0x02, - HOTT_RX1 = 0x03, - HOTT_RX2 = 0x04, + HOTT_DATA2 = 0x03, + HOTT_RX1 = 0x04, + HOTT_RX2 = 0x05, }; #ifdef HOTT_FW_TELEMETRY #define HOTT_SENSOR_TYPE 6 - #define HOTT_SENSOR_SEARCH_PERIOD 120 + #define HOTT_SENSOR_SEARCH_PERIOD 2000 uint8_t HOTT_sensor_cur=0; uint8_t HOTT_sensor_pages=0; uint8_t HOTT_sensor_valid=false; uint8_t HOTT_sensor_ok[HOTT_SENSOR_TYPE]; + uint8_t HOTT_sensor_seq=0; #endif #define HOTT_FREQ0_VAL 0x6E @@ -112,7 +114,7 @@ static void __attribute__((unused)) HOTT_tune_freq() CC2500_WriteReg(CC2500_0C_FSCTRL0, option); CC2500_WriteReg(CC2500_0F_FREQ0, HOTT_FREQ0_VAL + HOTT_COARSE); prev_option = option ; - phase = HOTT_START; // Restart the tune process if option is changed to get good tuned values + phase = HOTT_START; // Restart the tune process if option is changed to get good tuned values } } @@ -143,36 +145,37 @@ static void __attribute__((unused)) HOTT_init() for(uint8_t i=0; iconfig menu - packet[29] = 0x02; // unknown 0x02 when bind starts then when RX replies cycle in sequence 0x1A/22/2A/0A/12, 0x02 during normal packets, 0x01->config menu, 0x0A->no more RX telemetry memcpy(&packet[40],rx_tx_addr,5); - uint8_t addr=HOTT_EEPROM_OFFSET+RX_num*5; + debug("RXID: "); for(uint8_t i=0;i<5;i++) + { packet[45+i]=eeprom_read_byte((EE_ADDR)(addr+i)); + debug(" %02X",packet[45+i]); + } + debugln(""); } } -static void __attribute__((unused)) HOTT_data_packet() +static void __attribute__((unused)) HOTT_prep_data_packet() { + packet[2] = hopping_frequency_no; - packet[3] = 0x00; // used for failsafe but may also be used for additional channels + packet[3] = 0x00; // used for failsafe but may also be used for additional channels #ifdef FAILSAFE_ENABLE static uint8_t failsafe_count=0; if(IS_FAILSAFE_VALUES_on && IS_BIND_DONE) @@ -219,39 +222,42 @@ static void __attribute__((unused)) HOTT_data_packet() packet[i] = val; packet[i+1] = val>>8; } - #ifdef HOTT_FW_TELEMETRY - static uint8_t prev_SerialRX_val=0; - if(HoTT_SerialRX) - {//Text mode - uint8_t sensor=HoTT_SerialRX_val&0xF0; - if((sensor&0x80) && sensor!=0xF0 && (HoTT_SerialRX_val&0x0F) >= 0x07) - {//Valid Text query - if(sensor==0x80) HoTT_SerialRX_val&=0x0F; // RX only - if(prev_SerialRX_val!=HoTT_SerialRX_val) - { - prev_SerialRX_val=HoTT_SerialRX_val; - packet[28] = HoTT_SerialRX_val; // send the button being pressed only once + if(IS_BIND_DONE) + { + static uint8_t prev_SerialRX_val=0; + if(HoTT_SerialRX) + {//Text mode + uint8_t sensor=HoTT_SerialRX_val&0xF0; + if((sensor&0x80) && sensor!=0xF0 && (HoTT_SerialRX_val&0x0F) >= 0x07) + {//Valid Text query + if(sensor==0x80) HoTT_SerialRX_val&=0x0F; // RX only + if(prev_SerialRX_val!=HoTT_SerialRX_val) + { + prev_SerialRX_val=HoTT_SerialRX_val; + packet[28] = HoTT_SerialRX_val; // send the button being pressed only once + } + else + packet[28] = HoTT_SerialRX_val | 0x0F; // no button pressed + packet[29] = 0x01; // 0x01->Text config menu } - else - packet[28] = HoTT_SerialRX_val | 0x0F; // no button pressed - packet[29] = 0x01; // 0x01->Text config menu + } + else + { + packet[28] = 0x89+HOTT_sensor_cur; // 0x89/8A/8B/8C/8D/8E during normal packets + packet[29] = ((HOTT_sensor_seq+1)<<3) | 2; // Telemetry packet sequence + //debugln("28=%02X,29=%02X",packet[28],packet[29]); } } else - { - packet[28] = 0x89+HOTT_sensor_cur; // 0x89/8A/8B/8C/8D/8E during normal packets - packet[29] = 0x02; // unknown 0x02 when bind starts then when RX replies cycle in sequence 0x1A/22/2A/0A/12, 0x02 during normal packets, 0x01->text config menu, 0x0A->no more RX telemetry - } - #else - packet[28] = 0x80; // no sensor - packet[29] = 0x02; // unknown 0x02 when bind starts then when RX replies cycle in sequence 0x1A/22/2A/0A/12, 0x02 during normal packets, 0x01->text config menu, 0x0A->no more RX telemetry #endif + { + packet[28] = 0x80; // no sensor + packet[29] = 0x02; // unknown 0x02 when bind starts then when RX replies cycle in sequence 0x1A/22/2A/0A/12, 0x02 during normal packets, 0x01->text config menu, 0x0A->no more RX telemetry + } - CC2500_SetTxRxMode(TX_EN); - CC2500_SetPower(); - CC2500_WriteReg(CC2500_06_PKTLEN, 0x32); - CC2500_WriteData(packet, HOTT_TX_PACKET_LEN); + CC2500_WriteReg(CC2500_06_PKTLEN, HOTT_TX_PACKET_LEN); + CC2500_WriteRegisterMulti(CC2500_3F_TXFIFO, packet, HOTT_TX_PACKET_LEN); #if 0 debug("RF:%02X P:",rf_ch_num); for(uint8_t i=0;i=128:(a-256)/2-71dBm) // Page 0 [16] = RX_LQI in % // Page 0 [17] = RX_Voltage Min*10 in V - // Page 0 [18,19] = [19]*256+[18]=max lost packet time in ms, max value seems 2s=0x7D0 + // Page 0 [18,19] = [19]<<8+[18]=max lost packet time in ms, max value seems 2s=0x7D0 // Page 0 [20] = 0x00 ?? // // Config menu consists of the different telem pages put all together @@ -355,17 +409,30 @@ uint16_t ReadHOTT() packet_in[0]= packet_in[HOTT_RX_PACKET_LEN]; packet_in[1]= TX_LQI; bool send_telem=true; - if(packet[29]==2) // Requesting binary sensor - { + if(packet[29]==1) + { //Text mode + HOTT_sensor_pages = 0; + HOTT_sensor_valid = false; + packet_in[10] = 0x80; // Marking telem Text mode + packet_in[12] = 0; + for(uint8_t i=0; i>4)-9]=true; } else { @@ -381,15 +448,6 @@ uint16_t ReadHOTT() if(packet_in[11] && !HOTT_sensor_valid) send_telem=false; } - else - { //Text mode - HOTT_sensor_pages = 0; - HOTT_sensor_valid = false; - packet_in[10] = 0x80; // Marking telem Text mode - packet_in[12] = 0; - for(uint8_t i=0; i