New 0 protocol: enable to list all protocols and sub protocols

This commit is contained in:
Pascal Langer 2021-09-07 14:08:24 +02:00
parent 016b282246
commit 5c00ce6b88
4 changed files with 163 additions and 76 deletions

View File

@ -138,7 +138,7 @@ const char STR_SUBTYPE_GD00X[] = "\x05""GD_V1""GD_V2";
const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow"; const char STR_SUBTYPE_REDPINE[] = "\x04""Fast""Slow";
const char STR_SUBTYPE_POTENSIC[] = "\x03""A20"; const char STR_SUBTYPE_POTENSIC[] = "\x03""A20";
const char STR_SUBTYPE_ZSX[] = "\x07""280JJRC"; const char STR_SUBTYPE_ZSX[] = "\x07""280JJRC";
const char STR_SUBTYPE_HEIGHT[] = "\x03""5ch""8ch"; const char STR_SUBTYPE_HEIGHT[] = "\x03""5ch""8ch";
const char STR_SUBTYPE_FX816[] = "\x03""P38"; const char STR_SUBTYPE_FX816[] = "\x03""P38";
const char STR_SUBTYPE_XN297DUMP[] = "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0 ""NRF\0 ""CC2500\0"; const char STR_SUBTYPE_XN297DUMP[] = "\x07""250Kbps""1Mbps\0 ""2Mbps\0 ""Auto\0 ""NRF\0 ""CC2500\0";
const char STR_SUBTYPE_ESKY150[] = "\x03""4ch""7ch"; const char STR_SUBTYPE_ESKY150[] = "\x03""4ch""7ch";
@ -470,3 +470,70 @@ const mm_protocol_definition multi_protocols[] = {
#endif #endif
{0xFF, nullptr, nullptr, 0, 0, 0, 0, 0, nullptr, nullptr } {0xFF, nullptr, nullptr, 0, 0, 0, 0, 0, nullptr, nullptr }
}; };
#ifdef TELEMETRY
uint16_t PROTOLIST_callback()
{
if(option != prev_option)
{//Only send once
/* Type 0x11 Protocol list export via telemetry. Used by the protocol PROTO_PROTOLIST=0, the list entry is given by the option field.
length: variable
data[0] = protocol number, 0xFF is an invalid list entry (Option value too large)
data[1..n] = protocol name null terminated
data[n+1] = flags
flags>>4 Option text number to be displayed (check multi status for description)
flags&0x01 failsafe supported
flags&0x02 Channel Map Disabled supported
data[n+2] = number of sub protocols
data[n+3] = sub protocols text length, only sent if nbr_sub != 0
data[n+4..] = sub protocol names, only sent if nbr_sub != 0
*/
prev_option = option;
if(option >= (sizeof(multi_protocols)/sizeof(mm_protocol_definition)) - 1)
{//option is above the end of the list
//Header
multi_send_header(MULTI_TELEMETRY_PROTO, 1);
//Error
Serial_write(0xFF);
}
else
{//valid option value
uint8_t proto_len = strlen(multi_protocols[option].ProtoString) + 1;
uint8_t nbr_sub = multi_protocols[option].nbrSubProto;
uint8_t sub_len = 0;
if(nbr_sub)
sub_len = multi_protocols[option].SubProtoString[0];
//Header
multi_send_header(MULTI_TELEMETRY_PROTO, 1 + proto_len + 1 + 1 + (nbr_sub?1:0) + (nbr_sub * sub_len));
//Protocol number
Serial_write(multi_protocols[option].protocol);
//Protocol name
for(uint8_t i=0;i<proto_len;i++)
Serial_write(multi_protocols[option].ProtoString[i]);
//Flags
uint8_t flags=0;
#ifdef FAILSAFE_ENABLE
if(multi_protocols[multi_protocols_index].failSafe)
flags |= 0x01; //Failsafe supported
#endif
if(multi_protocols[multi_protocols_index].chMap)
flags |= 0x02; //Disable_ch_mapping supported
Serial_write( flags | (multi_protocols[option].optionType<<4)); // flags && option type
//Number of sub protocols
Serial_write(nbr_sub);
if(nbr_sub !=0 )
{
//Sub protocols texts length
Serial_write(sub_len);
//Sub protocols texts
for(uint8_t i=1;i<nbr_sub*sub_len;i++)
Serial_write(multi_protocols[option].SubProtoString[i]);
}
}
}
return 1000;
}
#endif

View File

@ -19,7 +19,7 @@
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 3 #define VERSION_MINOR 3
#define VERSION_REVISION 2 #define VERSION_REVISION 2
#define VERSION_PATCH_LEVEL 97 #define VERSION_PATCH_LEVEL 98
#define MODE_SERIAL 0 #define MODE_SERIAL 0
@ -28,6 +28,7 @@
//****************** //******************
enum PROTOCOLS enum PROTOCOLS
{ {
PROTO_PROTOLIST = 0, // NO RF
PROTO_FLYSKY = 1, // =>A7105 PROTO_FLYSKY = 1, // =>A7105
PROTO_HUBSAN = 2, // =>A7105 PROTO_HUBSAN = 2, // =>A7105
PROTO_FRSKYD = 3, // =>CC2500 PROTO_FRSKYD = 3, // =>CC2500
@ -517,6 +518,7 @@ enum MultiPacketTypes
MULTI_TELEMETRY_HOTT = 14, MULTI_TELEMETRY_HOTT = 14,
MULTI_TELEMETRY_MLINK = 15, MULTI_TELEMETRY_MLINK = 15,
MULTI_TELEMETRY_CONFIG = 16, MULTI_TELEMETRY_CONFIG = 16,
MULTI_TELEMETRY_PROTO = 17,
}; };
// Macros // Macros
@ -1289,4 +1291,17 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
Type 0x10 Config telemetry Type 0x10 Config telemetry
length: 22 length: 22
data[0..21] = Config data data[0..21] = Config data
Type 0x11 Protocol list export via telemetry. Used by the protocol PROTO_PROTOLIST=0, the list entry is given by the option field.
length: variable
data[0] = protocol number, 0xFF is an invalid list entry (Option value too large)
data[1..n] = protocol name null terminated
data[n+1] = flags
flags>>4 Option text number to be displayed (check multi status for description)
flags&0x01 failsafe supported
flags&0x02 Channel Map Disabled supported
data[n+2] = number of sub protocols
data[n+3] = sub protocols text length, only sent if nbr_sub != 0
data[n+4..] = sub protocol names, only sent if nbr_sub != 0
*/ */

View File

@ -1134,18 +1134,18 @@ static void protocol_init()
if(IS_WAIT_BIND_off) if(IS_WAIT_BIND_off)
{ {
remote_callback = 0; // No protocol remote_callback = 0; // No protocol
LED_off; // Led off during protocol init
modules_reset(); // Reset all modules modules_reset(); // Reset all modules
LED_off; // Led off during protocol init
crc16_polynomial = 0x1021; // Default CRC crc16_polynomial crc16_polynomial = 0x1021; // Default CRC crc16_polynomial
crc8_polynomial = 0x31; // Default CRC crc8_polynomial crc8_polynomial = 0x31; // Default CRC crc8_polynomial
prev_option = option; prev_option = option;
multi_protocols_index = 0xFF;
// reset telemetry // reset telemetry
#ifdef TELEMETRY #ifdef TELEMETRY
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
inputRefreshRate = 0; // Don't do it unless the protocol asks for it inputRefreshRate = 0; // Don't do it unless the protocol asks for it
#endif #endif
multi_protocols_index = 0xFF;
tx_pause(); tx_pause();
init_frskyd_link_telemetry(); init_frskyd_link_telemetry();
pps_timer=millis(); pps_timer=millis();
@ -1167,7 +1167,7 @@ static void protocol_init()
TX_RX_PAUSE_off; TX_RX_PAUSE_off;
TX_MAIN_PAUSE_off; TX_MAIN_PAUSE_off;
tx_resume(); tx_resume();
#if defined(AFHDS2A_RX_A7105_INO) || defined(FRSKY_RX_CC2500_INO) || defined(BAYANG_RX_NRF24L01_INO) #if defined(AFHDS2A_RX_A7105_INO) || defined(FRSKY_RX_CC2500_INO) || defined(BAYANG_RX_NRF24L01_INO) || defined(DSM_RX_CYRF6936_INO)
for(uint8_t ch=0; ch<16; ch++) for(uint8_t ch=0; ch<16; ch++)
rx_rc_chan[ch] = 1024; rx_rc_chan[ch] = 1024;
#endif #endif
@ -1188,54 +1188,69 @@ static void protocol_init()
#endif #endif
DATA_BUFFER_LOW_off; DATA_BUFFER_LOW_off;
SUB_PROTO_VALID; SUB_PROTO_INVALID;
option_override = 0xFF; option_override = 0xFF;
blink=millis(); blink=millis();
debugln("Protocol selected: %d, sub proto %d, rxnum %d, option %d", protocol, sub_protocol, RX_num, option); debugln("Protocol selected: %d, sub proto %d, rxnum %d, option %d", protocol, sub_protocol, RX_num, option);
uint8_t index=0; if(protocol)
#if defined(FRSKYX_CC2500_INO) && defined(EU_MODULE)
if( ! ( (protocol == PROTO_FRSKYX || protocol == PROTO_FRSKYX2) && sub_protocol < 2 ) )
#endif
while(multi_protocols[index].protocol != 0xFF)
{ {
if(multi_protocols[index].protocol==protocol) uint8_t index=0;
#if defined(FRSKYX_CC2500_INO) && defined(EU_MODULE)
if( ! ( (protocol == PROTO_FRSKYX || protocol == PROTO_FRSKYX2) && sub_protocol < 2 ) )
#endif
while(multi_protocols[index].protocol != 0xFF)
{ {
//Save index if(multi_protocols[index].protocol==protocol)
multi_protocols_index = index; {
//Set the RF switch //Save index
rf_switch(multi_protocols[multi_protocols_index].rfSwitch); multi_protocols_index = index;
//Init protocol //Check sub protocol validity
multi_protocols[multi_protocols_index].Init(); if( ((sub_protocol&0x07) == 0) || (sub_protocol&0x07) < multi_protocols[index].nbrSubProto )
//Save call back function address SUB_PROTO_VALID;
remote_callback = multi_protocols[multi_protocols_index].CallBack; if(IS_SUB_PROTO_VALID)
//Send a telemetry status right now {//Start the protocol
#ifdef DEBUG_SERIAL //Set the RF switch
debug("Proto=%s",multi_protocols[multi_protocols_index].ProtoString); rf_switch(multi_protocols[index].rfSwitch);
uint8_t nbr=multi_protocols[multi_protocols_index].nbrSubProto; //Init protocol
debug(", nbr_sub=%d, Sub=",nbr); multi_protocols[index].Init(); // Init could invalidate the sub proto in case it is not suuported
if(nbr && (sub_protocol&0x07)<nbr) if(IS_SUB_PROTO_VALID)
{ remote_callback = multi_protocols[index].CallBack; //Save call back function address
uint8_t len=multi_protocols[multi_protocols_index].SubProtoString[0];
uint8_t offset=len*(sub_protocol&0x07)+1;
for(uint8_t j=0;j<len;j++)
debug("%c",multi_protocols[multi_protocols_index].SubProtoString[j+offset]);
} }
debug(", Opt=%d",multi_protocols[multi_protocols_index].optionType); #ifdef DEBUG_SERIAL
debug(", FS=%d",multi_protocols[multi_protocols_index].failSafe); debug("Proto=%s", multi_protocols[index].ProtoString);
debug(", CHMap=%d",multi_protocols[multi_protocols_index].chMap); debug(", nbr_sub=%d, Sub=", multi_protocols[index].nbrSubProto);
debugln(", rfSw=%d",multi_protocols[multi_protocols_index].rfSwitch); if(IS_SUB_PROTO_VALID)
#endif {
break; uint8_t len=multi_protocols[index].SubProtoString[0];
uint8_t offset=len*(sub_protocol&0x07)+1;
for(uint8_t j=0;j<len;j++)
debug("%c",multi_protocols[index].SubProtoString[j+offset]);
}
debug(", Opt=%d",multi_protocols[index].optionType);
debug(", FS=%d",multi_protocols[index].failSafe);
debug(", CHMap=%d",multi_protocols[index].chMap);
debugln(", rfSw=%d",multi_protocols[index].rfSwitch);
#endif
break;
}
index++;
} }
index++; //Send a telemetry status right now
SEND_MULTI_STATUS_on;
Update_Telem();
} }
//Send an update right away #ifdef TELEMETRY
SEND_MULTI_STATUS_on; else
Update_Telem(); {//protocol=PROTO_PROTOLIST=0
remote_callback = PROTOLIST_callback;
prev_option = option + 1;
}
#endif
} }
#if defined(WAIT_FOR_BIND) && defined(ENABLE_BIND_CH) #if defined(WAIT_FOR_BIND) && defined(ENABLE_BIND_CH)
if( IS_AUTOBIND_FLAG_on && IS_BIND_CH_PREV_off && (cur_protocol[1]&0x80)==0 && mode_select == MODE_SERIAL) if( IS_AUTOBIND_FLAG_on && IS_BIND_CH_PREV_off && (cur_protocol[1]&0x80)==0 && mode_select == MODE_SERIAL)
{ // Autobind is active but no bind requested by either BIND_CH or BIND. But do not wait if in PPM mode... { // Autobind is active but no bind requested by either BIND_CH or BIND. But do not wait if in PPM mode...
@ -1246,16 +1261,19 @@ static void protocol_init()
WAIT_BIND_off; WAIT_BIND_off;
CHANGE_PROTOCOL_FLAG_off; CHANGE_PROTOCOL_FLAG_off;
//Wait 5ms after protocol init if(protocol)
cli(); // disable global int {
OCR1A = TCNT1 + 5000*2; // set compare A for callback //Wait 5ms after protocol init
#ifndef STM32_BOARD cli(); // disable global int
TIFR1 = OCF1A_bm ; // clear compare A flag OCR1A = TCNT1 + 5000*2; // set compare A for callback
#else #ifndef STM32_BOARD
TIMER2_BASE->SR = 0x1E5F & ~TIMER_SR_CC1IF; // Clear Timer2/Comp1 interrupt flag TIFR1 = OCF1A_bm ; // clear compare A flag
#endif #else
sei(); // enable global int TIMER2_BASE->SR = 0x1E5F & ~TIMER_SR_CC1IF; // Clear Timer2/Comp1 interrupt flag
BIND_BUTTON_FLAG_off; // do not bind/reset id anymore even if protocol change #endif
sei(); // enable global int
BIND_BUTTON_FLAG_off; // do not bind/reset id anymore even if protocol change
}
} }
void update_serial_data() void update_serial_data()

View File

@ -123,45 +123,32 @@ static void telemetry_set_input_sync(uint16_t refreshRate)
static void multi_send_status() static void multi_send_status()
{ {
if(protocol == 0) return;
multi_send_header(MULTI_TELEMETRY_STATUS, 24); multi_send_header(MULTI_TELEMETRY_STATUS, 24);
// Build flags // Build flags
uint8_t flags=0; uint8_t flags=0;
if (IS_INPUT_SIGNAL_on) if(IS_INPUT_SIGNAL_on)
flags |= 0x01; flags |= 0x01;
if (mode_select==MODE_SERIAL) if(mode_select==MODE_SERIAL)
flags |= 0x02; flags |= 0x02;
if (remote_callback != 0) if(remote_callback != 0)
{ {
flags |= 0x04; if(multi_protocols_index != 0xFF && IS_SUB_PROTO_VALID)
if(multi_protocols_index == 0xFF) flags |= 0x04; //Invalid protocol / sub protocol, can't make the distinction since there is no more flags...
{ if(IS_WAIT_BIND_on)
if(protocol!=PROTO_SCANNER)
flags &= ~0x04; //Invalid protocol
}
else if(IS_SUB_PROTO_INVALID)
{
flags &= ~0x04; //Invalid sub protocol
}
else if(sub_protocol&0x07)
{
uint8_t nbr=multi_protocols[multi_protocols_index].nbrSubProto;
//if(protocol==PROTO_DSM) nbr++; //Auto sub_protocol
if((sub_protocol&0x07)>=nbr )
flags &= ~0x04; //Invalid sub protocol
}
if (IS_WAIT_BIND_on)
flags |= 0x10; flags |= 0x10;
else else
if (IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
flags |= 0x08; flags |= 0x08;
if(multi_protocols_index != 0xFF) if(multi_protocols_index != 0xFF)
{ {
if(multi_protocols[multi_protocols_index].chMap) if(multi_protocols[multi_protocols_index].chMap)
flags |= 0x40; //Disable_ch_mapping supported flags |= 0x40; //Disable_ch_mapping supported
#ifdef FAILSAFE_ENABLE #ifdef FAILSAFE_ENABLE
if(multi_protocols[multi_protocols_index].failSafe) if(multi_protocols[multi_protocols_index].failSafe)
flags |= 0x20; //Failsafe supported flags |= 0x20; //Failsafe supported
#endif #endif
} }
if(IS_DATA_BUFFER_LOW_on) if(IS_DATA_BUFFER_LOW_on)
@ -226,7 +213,7 @@ static void multi_send_status()
else else
Serial_write(nbr | (option_override<<4)); // number of sub protocols && option_override type Serial_write(nbr | (option_override<<4)); // number of sub protocols && option_override type
uint8_t j=0; uint8_t j=0;
if(nbr && (sub_protocol&0x07)<nbr) if(IS_SUB_PROTO_VALID)
{ {
uint8_t len=multi_protocols[multi_protocols_index].SubProtoString[0]; uint8_t len=multi_protocols[multi_protocols_index].SubProtoString[0];
uint8_t offset=len*(sub_protocol&0x07)+1; uint8_t offset=len*(sub_protocol&0x07)+1;