diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index 207c2e282..a8ed61482 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -1048,7 +1048,7 @@ void menuModelSetup(uint8_t event) MENU_CHECK(menuTabModel, e_ModelSetup, MODEL_SETUP_MAX_LINES); -#if defined(DSM2) || defined(PXX) +#if defined(CPUARM) && (defined(DSM2) || defined(PXX)) if (menuEvent) { moduleFlag[0] = 0; #if NUM_MODULES > 1 @@ -1829,7 +1829,7 @@ void menuModelSetup(uint8_t event) uint8_t newFlag = 0; if (attr && m_posHorz>0 && editMode>0) { // send reset code - newFlag = PXX_SEND_RXNUM; + newFlag = MODULE_BIND; } moduleFlag[0] = newFlag; } @@ -1837,7 +1837,7 @@ void menuModelSetup(uint8_t event) #if defined(DSM2) if (IS_DSM2_PROTOCOL(protocol)) { lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+4*FW, y, STR_MODULE_RANGE, m_posHorz!=0 ? attr : 0); - dsm2Flag = (attr && m_posHorz>0 && editMode>0) ? DSM2_RANGECHECK_FLAG : 0; // [MENU] key toggles range check mode + moduleFlag[0] = (attr && m_posHorz>0 && editMode>0) ? MODULE_RANGECHECK : 0; // [MENU] key toggles range check mode } #endif } diff --git a/radio/src/gui/view_main.cpp b/radio/src/gui/view_main.cpp index 8295db029..97cb04021 100644 --- a/radio/src/gui/view_main.cpp +++ b/radio/src/gui/view_main.cpp @@ -577,7 +577,7 @@ void menuMainView(uint8_t event) #endif #if defined(DSM2) - if (dsm2BindEnable) { + if (moduleFlag[0] == MODULE_BIND) { // Issue 98 lcd_putsAtt(15*FW, 0, PSTR("BIND"), 0); } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index c54b2c74b..a88207f7d 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -640,7 +640,7 @@ enum SwitchConfig { #define LEN_ANA_NAME 3 #define ALTERNATE_VIEW 0x10 -PACK(typedef struct t_EEGeneral { +PACK(typedef struct { uint8_t version; uint16_t variant; CalibData calib[NUM_STICKS+NUM_POTS]; diff --git a/radio/src/pulses/dsm2_arm.cpp b/radio/src/pulses/dsm2_arm.cpp index 78a6a9e49..3111946f2 100644 --- a/radio/src/pulses/dsm2_arm.cpp +++ b/radio/src/pulses/dsm2_arm.cpp @@ -48,7 +48,6 @@ uint8_t dsm2Stream[64]; // Likely more than we need uint8_t *dsm2StreamPtr; uint8_t dsm2SerialByte ; uint8_t dsm2SerialBitCount; -uint8_t dsm2BindEnable = 0; uint8_t dsm2BindTimer = DSM2_BIND_TIMEOUT; #endif @@ -170,14 +169,19 @@ void setupPulsesDSM2(unsigned int port) else if (moduleFlag[port] == MODULE_RANGECHECK) dsmDat[0] |= DSM2_SEND_RANGECHECK; #else - dsm2BindEnable = 0; if (dsm2BindTimer > 0) { dsm2BindTimer--; if (switchState(SW_DSM2_BIND)) { - dsm2BindEnable = DSM2_SEND_BIND; + moduleFlag[port] = MODULE_BIND; dsmDat[0] |= DSM2_SEND_BIND; } } + else if (moduleFlag[port] == MODULE_RANGECHECK) { + dsmDat[0] |= DSM2_SEND_RANGECHECK; + } + else { + moduleFlag[port] = 0; + } #endif dsmDat[1] = g_model.header.modelId; // DSM2 Header second byte for model match diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 549249b81..301d60dbe 100755 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -58,7 +58,6 @@ enum ModuleFlag #if defined(DSM2) && !defined(PCBTARANIS) #define DSM2_BIND_TIMEOUT 255 // 255*11ms extern uint8_t dsm2BindTimer; - extern uint8_t dsm2BindEnable; // needed to display BIND on screen #endif #if defined(CPUARM) diff --git a/radio/src/pulses/pulses_avr.cpp b/radio/src/pulses/pulses_avr.cpp index 8616db33a..fe4ca1c1c 100644 --- a/radio/src/pulses/pulses_avr.cpp +++ b/radio/src/pulses/pulses_avr.cpp @@ -40,11 +40,24 @@ uint16_t nextMixerEndTime = 0; #define SCHEDULE_MIXER_END(delay) nextMixerEndTime = getTmr16KHz() + (delay) - 2*16/*2ms*/ #if defined(DSM2) -// DSM2 control bits -#define DSM2_CHANS 6 -#define FRANCE_BIT 0x10 -#define DSMX_BIT 0x08 -#define BAD_DATA 0x47 + // DSM2 control bits + #define DSM2_CHANS 6 + #define FRANCE_BIT 0x10 + #define DSMX_BIT 0x08 + #define BAD_DATA 0x47 + #define DSM2_SEND_BIND (1 << 7) + #define DSM2_SEND_RANGECHECK (1 << 5) + uint8_t dsm2BindTimer = DSM2_BIND_TIMEOUT; +#endif + +#if defined(PXX) + #define PXX_SEND_BIND 0x01 + #define PXX_SEND_FAILSAFE (1 << 4) + #define PXX_SEND_RANGECHECK (1 << 5) +#endif + +#if defined(DSM2) || defined(PXX) +uint8_t moduleFlag[NUM_MODULES] = { 0 }; #endif uint8_t s_current_protocol[1] = { 255 }; @@ -233,7 +246,6 @@ uint8_t PcmByte ; uint8_t PcmBitCount ; uint16_t PcmCrc ; uint8_t PcmOnesCount ; -uint8_t moduleFlag[NUM_MODULES] = { 0 }; void crc( uint8_t data ) { @@ -316,7 +328,6 @@ uint16_t scaleForPXX( uint8_t i ) void setupPulsesPXX() { - uint8_t i ; uint16_t chan ; uint16_t chan_1 ; @@ -328,16 +339,19 @@ void setupPulsesPXX() PcmOnesCount = 0 ; putPcmHead() ; putPcmByte( g_model.header.modelId ) ; // putPcmByte( g_model.rxnum ) ; // - putPcmByte( pxxFlag[0] ) ; // First byte of flags + uint8_t flag1 = 0; + if (moduleFlag[0] == MODULE_BIND) + flag1 |= (g_eeGeneral.countryCode << 1) | PXX_SEND_BIND; + else if (moduleFlag[0] == MODULE_RANGECHECK) + flag1 |= PXX_SEND_RANGECHECK; + putPcmByte(flag1) ; // First byte of flags putPcmByte( 0 ) ; // Second byte of flags - pxxFlag[0] = 0; // reset flag after send - for ( i = 0 ; i < 8 ; i += 2 ) // First 8 channels only - { - chan = scaleForPXX(i); - chan_1 = scaleForPXX(i+1); - putPcmByte( chan ) ; // Low byte of channel - putPcmByte( ( ( chan >> 8 ) & 0x0F ) | ( chan_1 << 4) ) ; // 4 bits each from 2 channels - putPcmByte( chan_1 >> 4 ) ; // High byte of channel + for (uint8_t i=0; i<8; i+=2) { // First 8 channels only + chan = scaleForPXX(i); + chan_1 = scaleForPXX(i+1); + putPcmByte( chan ) ; // Low byte of channel + putPcmByte( ( ( chan >> 8 ) & 0x0F ) | ( chan_1 << 4) ) ; // 4 bits each from 2 channels + putPcmByte( chan_1 >> 4 ) ; // High byte of channel } putPcmByte(0); chan = PcmCrc ; // get the crc @@ -398,13 +412,21 @@ FORCEINLINE void setupPulsesDSM2() break; } - if (s_bind_allowed) s_bind_allowed--; - if (s_bind_allowed && switchState(SW_DSM2_BIND)) - dsm2Flag = DSM2_BIND_FLAG; - else - dsm2Flag &= ~DSM2_BIND_FLAG; + if (dsm2BindTimer > 0) { + dsm2BindTimer--; + if (switchState(SW_DSM2_BIND)) { + moduleFlag[0] = MODULE_BIND; + *ptr |= DSM2_SEND_BIND; + } + } + else if (moduleFlag[0] == MODULE_RANGECHECK) { + *ptr |= DSM2_SEND_RANGECHECK; + } + else { + moduleFlag[0] = 0; + } - *ptr++ |= dsm2Flag; + ptr++; *ptr++ = g_model.header.modelId; for (uint8_t i=0; i 0) { + dsm2BindTimer--; + if (switchState(SW_DSM2_BIND)) { + moduleFlag[0] = MODULE_BIND; + dsmDat[0] |= DSM2_SEND_BIND; + } + } + else if (moduleFlag[0] == MODULE_RANGECHECK) { + dsmDat[0] |= DSM2_SEND_RANGECHECK; + } + else { + moduleFlag[0] = 0; + } - dsmDat[0] |= dsm2Flag; dsmDat[1] = g_model.header.modelId; // DSM2 Header second byte for model match for (uint8_t i=0; i