diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 0eb0d6c..18fbcf6 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -51,4 +51,5 @@ 51,Potensic,A20 52,ZSX,280 53,Flyzone,FZ-410 +54,Scanner 63,XN_DUMP,250K,1M,2M diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index bc21ed1..bedfc6e 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 2 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 74 +#define VERSION_PATCH_LEVEL 75 //****************** // Protocols @@ -80,6 +80,7 @@ enum PROTOCOLS PROTO_POTENSIC = 51, // =>NRF24L01 PROTO_ZSX = 52, // =>NRF24L01 PROTO_FLYZONE = 53, // =>A7105 + PROTO_SCANNER = 54, // =>CC2500 PROTO_XN297DUMP = 63, // =>NRF24L01 }; @@ -318,6 +319,7 @@ enum MultiPacketTypes MULTI_TELEMETRY_SYNC = 8, MULTI_TELEMETRY_SPORT_POLLING = 9, MULTI_TELEMETRY_HITEC = 10, + MULTI_TELEMETRY_SCANNER = 11, }; // Macros @@ -636,6 +638,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- POTENSIC 51 ZSX 52 FLYZONE 53 + SCANNER 54 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No @@ -885,4 +888,8 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- data[3-7] telemetry data Full description at the bottom of Hitec_cc2500.ino + Type 0x0B Spectrum Scanner telemetry data + length: 6 + data[0] = start channel (2400 + x*0.333 Mhz) + data[1-5] power levels */ diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 58ee856..cacb9ba 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -114,7 +114,12 @@ uint8_t armed, arm_flags, arm_channel_previous; uint8_t num_ch; #ifdef CC2500_INSTALLED - uint8_t calData[50]; + #ifdef SCANNER_CC2500_INO + uint8_t calData[255]; + #define SCAN_CHANS_PER_PACKET 5 + #else + uint8_t calData[50]; + #endif #endif #ifdef CHECK_FOR_BOOTLOADER @@ -643,7 +648,7 @@ uint8_t Update_All() update_led_status(); #if defined(TELEMETRY) #if ( !( defined(MULTI_TELEMETRY) || defined(MULTI_STATUS) ) ) - if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC)) + if( (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC)) #endif TelemetryUpdate(); #endif @@ -1016,6 +1021,14 @@ static void protocol_init() remote_callback = ReadHITEC; break; #endif + #if defined(SCANNER_CC2500_INO) + case PROTO_SCANNER: + PE1_off; + PE2_on; //antenna RF2 + next_callback = initScanner(); + remote_callback = Scanner_callback; + break; + #endif #endif #ifdef CYRF6936_INSTALLED #if defined(DSM_CYRF6936_INO) diff --git a/Multiprotocol/Scanner_cc2500.ino b/Multiprotocol/Scanner_cc2500.ino new file mode 100644 index 0000000..e1666f2 --- /dev/null +++ b/Multiprotocol/Scanner_cc2500.ino @@ -0,0 +1,136 @@ +/* + This project is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Multiprotocol is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Multiprotocol. If not, see . + */ + +#if defined(SCANNER_CC2500_INO) + +#include "iface_cc2500.h" + +#define SCAN_MAX_RADIOCHANNEL 249 // 2483 MHz +#define SCAN_CHANNEL_LOCK_TIME 300 // with precalibration, channel requires only 90 usec for synthesizer to settle +#define SCAN_AVERAGE_INTVL 30 + +static uint8_t scan_tlm_index; + +enum ScanStates { + SCAN_CHANNEL_CHANGE = 0, + SCAN_GET_RSSI = 1, +}; + +static void __attribute__((unused)) Scanner_cc2500_init() +{ + /* Initialize CC2500 chip */ + CC2500_WriteReg(CC2500_08_PKTCTRL0, 0x12); // Packet Automation Control + CC2500_WriteReg(CC2500_0B_FSCTRL1, 0x0A); // Frequency Synthesizer Control + CC2500_WriteReg(CC2500_0C_FSCTRL0, 0x00); // Frequency Synthesizer Control + CC2500_WriteReg(CC2500_0D_FREQ2, 0x5C); // Frequency Control Word, High Byte + CC2500_WriteReg(CC2500_0E_FREQ1, 0x4E); // Frequency Control Word, Middle Byte + CC2500_WriteReg(CC2500_0F_FREQ0, 0xC3); // Frequency Control Word, Low Byte + CC2500_WriteReg(CC2500_10_MDMCFG4, 0x8D); // Modem Configuration + CC2500_WriteReg(CC2500_11_MDMCFG3, 0x3B); // Modem Configuration + CC2500_WriteReg(CC2500_12_MDMCFG2, 0x10); // Modem Configuration + CC2500_WriteReg(CC2500_13_MDMCFG1, 0x23); // Modem Configuration + CC2500_WriteReg(CC2500_14_MDMCFG0, 0xA4); // Modem Configuration + CC2500_WriteReg(CC2500_15_DEVIATN, 0x62); // Modem Deviation Setting + CC2500_WriteReg(CC2500_18_MCSM0, 0x08); // Main Radio Control State Machine Configuration + CC2500_WriteReg(CC2500_19_FOCCFG, 0x1D); // Frequency Offset Compensation Configuration + CC2500_WriteReg(CC2500_1A_BSCFG, 0x1C); // Bit Synchronization Configuration + CC2500_WriteReg(CC2500_1B_AGCCTRL2, 0xC7); // AGC Control + CC2500_WriteReg(CC2500_1C_AGCCTRL1, 0x00); // AGC Control + CC2500_WriteReg(CC2500_1D_AGCCTRL0, 0xB0); // AGC Control + CC2500_WriteReg(CC2500_21_FREND1, 0xB6); // Front End RX Configuration + + CC2500_SetTxRxMode(RX_EN); // Receive mode + CC2500_Strobe(CC2500_SIDLE); + CC2500_Strobe(CC2500_SRX); + + delayMicroseconds(1000); // wait for RX to activate +} + +static void __attribute__((unused)) Scanner_calibrate() +{ + for (uint8_t c = 0; c < SCAN_MAX_RADIOCHANNEL; c++) + { + CC2500_Strobe(CC2500_SIDLE); + CC2500_WriteReg(CC2500_0A_CHANNR, c); + CC2500_Strobe(CC2500_SCAL); + delayMicroseconds(900); + calData[c] = CC2500_ReadReg(CC2500_25_FSCAL1); + } + CC2500_Strobe(CC2500_SIDLE); +} + +static void __attribute__((unused)) Scanner_scan_next() +{ + CC2500_WriteReg(CC2500_0A_CHANNR, rf_ch_num); + CC2500_WriteReg(CC2500_25_FSCAL1, calData[rf_ch_num]); + CC2500_Strobe(CC2500_SFRX); + CC2500_Strobe(CC2500_SRX); +} + +static int __attribute__((unused)) Scanner_scan_rssi() +{ + uint8_t rssi; + rssi = CC2500_ReadReg(0x40 | CC2500_34_RSSI); // 0.5 db/count, RSSI value read from the RSSI status register is a 2's complement number + uint8_t rssi_rel; + if (rssi >= 128) { + rssi_rel = rssi - 128; // relative power levels 0-127 (equals -137 to -72 dBm) + } + else { + rssi_rel = rssi + 128; // relativ power levels 128-255 (equals -73 to -10 dBm) + } + return rssi_rel; +} + +uint16_t Scanner_callback() +{ + switch (phase) + { + case SCAN_CHANNEL_CHANGE: + rf_ch_num++; + if (rf_ch_num >= (SCAN_MAX_RADIOCHANNEL + 1)) + rf_ch_num = 0; + if (scan_tlm_index++ == 0) + pkt[0] = rf_ch_num; // start channel for telemetry packet + Scanner_scan_next(); + phase = SCAN_GET_RSSI; + return SCAN_CHANNEL_LOCK_TIME; + case SCAN_GET_RSSI: + phase = SCAN_CHANNEL_CHANGE; + pkt[scan_tlm_index] = Scanner_scan_rssi(); + if (scan_tlm_index == SCAN_CHANS_PER_PACKET) + { + // send data to TX + telemetry_link = 1; + scan_tlm_index = 0; + } + } + return SCAN_AVERAGE_INTVL; +} + +uint16_t initScanner(void) +{ + rf_ch_num = SCAN_MAX_RADIOCHANNEL; + scan_tlm_index = 0; + phase = SCAN_CHANNEL_CHANGE; + Scanner_cc2500_init(); + CC2500_Strobe(CC2500_SRX); + Scanner_calibrate(); + CC2500_Strobe(CC2500_SIDLE); + CC2500_SetTxRxMode(RX_EN); + CC2500_Strobe(CC2500_SRX); // Receive mode + return 1250; +} + +#endif diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index 3c281b5..420b225 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -170,6 +170,20 @@ static void multi_send_status() #endif #endif +#ifdef SCANNER_TELEMETRY + void spectrum_scanner_frame() + { + #if defined MULTI_TELEMETRY + multi_send_header(MULTI_TELEMETRY_SCANNER, SCAN_CHANS_PER_PACKET + 1); + #else + Serial_write(0xAA); // Telemetry packet + #endif + Serial_write(pkt[0]); // start channel + for(uint8_t ch = 0; ch < SCAN_CHANS_PER_PACKET; ch++) + Serial_write(pkt[ch+1]); // RSSI power levels + } +#endif + #ifdef AFHDS2A_FW_TELEMETRY void AFHDSA_short_frame() { @@ -996,6 +1010,15 @@ void TelemetryUpdate() } #endif + #if defined SCANNER_TELEMETRY + if (telemetry_link && protocol == PROTO_SCANNER) + { + spectrum_scanner_frame(); + telemetry_link = 0; + return; + } + #endif + if((telemetry_link & 1 )&& protocol != PROTO_FRSKYX) { // FrSkyD + Hubsan + AFHDS2A + Bayang + Cabell + Hitec + Bugs + BugsMini + NCC1701 frsky_link_frame(); diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index 8235714..bd8f26e 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -192,6 +192,7 @@ #undef REDPINE_CC2500_INO #undef HITEC_CC2500_INO #undef XN297L_CC2500_EMU + #undef SCANNER_CC2500_INO #endif #ifndef NRF24L01_INSTALLED #undef BAYANG_NRF24L01_INO @@ -248,6 +249,7 @@ #undef DSM_TELEMETRY #undef MULTI_STATUS #undef MULTI_TELEMETRY + #undef SCANNER_TELEMETRY #else #if defined MULTI_TELEMETRY && not defined INVERT_TELEMETRY #warning MULTI_TELEMETRY has been defined but not INVERT_TELEMETRY. They should be both enabled for OpenTX telemetry and status to work. @@ -291,7 +293,7 @@ #if not defined(DSM_CYRF6936_INO) #undef DSM_TELEMETRY #endif - #if 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(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) + #if 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(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) #undef TELEMETRY #undef INVERT_TELEMETRY #undef SPORT_POLLING diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 9b652f1..a69be57 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -165,7 +165,7 @@ #define DEVO_CYRF6936_INO #define DSM_CYRF6936_INO #define J6PRO_CYRF6936_INO -#define TRAXXAS_CYRF6936_INO +#define TRAXXAS_CYRF6936_INO #define WFLY_CYRF6936_INO #define WK2x01_CYRF6936_INO @@ -175,6 +175,7 @@ #define FRSKYV_CC2500_INO #define FRSKYX_CC2500_INO #define HITEC_CC2500_INO +#define SCANNER_CC2500_INO #define SFHSS_CC2500_INO #define REDPINE_CC2500_INO @@ -294,6 +295,7 @@ #define CABELL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define HITEC_HUB_TELEMETRY // Use FrSkyD Hub format to send basic telemetry to the radios which can decode it like er9x, ersky9x and OpenTX #define HITEC_FW_TELEMETRY // Under development: Forward received telemetry packets to be decoded by ersky9x and OpenTX +#define SCANNER_TELEMETRY // Forward spectrum scanner data to TX //SPORT_POLLING is an implementation of the same polling routine as XJT module for sport telemetry bidirectional communication. //This is useful for passing sport control frames from TX to RX(ex: changing Betaflight PID or VTX channels on the fly using LUA scripts with OpentX). @@ -611,6 +613,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { PROTO_REDPINE RED_FAST RED_SLOW + PROTO_SCANNER + NONE PROTO_SFHSS NONE PROTO_SHENQI diff --git a/Protocols_Details.md b/Protocols_Details.md index b786f25..9368516 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -108,6 +108,7 @@ CFlie|38|CFlie||||||||NRF24L01| [Q2X2](Protocols_Details.md#Q2X2---29)|29|Q222|Q242|Q282||||||NRF24L01| [Q303](Protocols_Details.md#Q303---31)|31|Q303|CX35|CX10D|CX10WD|||||NRF24L01|XN297 [Redpine](Protocols_Details.md#Redpine---50)|50|FAST|SLOW|||||||NRF24L01| +[Scanner](Protocols_Details.md#Scanner---54)|54|||||||||CC2500| [SFHSS](Protocols_Details.md#SFHSS---21)|21|SFHSS||||||||CC2500| [Shenqi](Protocols_Details.md#Shenqi---19)|19|Shenqi||||||||NRF24L01|LT8900 [SLT](Protocols_Details.md#SLT---11)|11|SLT_V1|SLT_V2|Q100|Q200|MR100||||NRF24L01| @@ -381,6 +382,9 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|CH5|CH6|CH7|CH8 +## Scanner - *54* +2.4GHz scanner accessible using the OpenTX 2.3 Spectrum Analyser tool. + *** # CYRF6936 RF Module