diff --git a/src/Makefile b/src/Makefile index 37c433b6f..97022800e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -103,15 +103,12 @@ LOGS = YES # PXX (FrSky PCM) protocol PXX = NO +# PPM16 +PPM16 = NO + # DSM2 (Spektrum) protocol DSM2 = NO -# Silver protocol -SILVER = NO - -# CTP-1009 protocol -CTP1009 = NO - # SOMO-14D module SOMO = NO @@ -342,28 +339,21 @@ ifeq ($(DISPLAY_USER_DATA), YES) endif ifeq ($(PXX), YES) - MODS:=${MODS}X CPPDEFS += -DPXX endif +ifeq ($(PPM16), YES) + CPPDEFS += -DPPM16 +endif + ifeq ($(DSM2), SERIAL) - MODS:=${MODS}D CPPDEFS += -DDSM2 -DDSM2_SERIAL endif ifeq ($(DSM2), PPM) - MODS:=${MODS}D CPPDEFS += -DDSM2 -DDSM2_PPM endif -ifeq ($(SILVER), YES) - CPPDEFS += -DSILVER -endif - -ifeq ($(CTP1009), YES) - CPPDEFS += -DCTP1009 -endif - #---------------- Compiler Options C ---------------- # -g*: generate debugging information # -O*: optimization level diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 5c8ef702a..e6499f09f 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -387,7 +387,7 @@ void EditName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, boo void menuProcModel(uint8_t event) { lcd_outdezNAtt(7*FW,0,g_eeGeneral.currModel+1,INVERS+LEADING0,2); - MENU(STR_MENUSETUP, menuTabModel, e_Model, (g_model.protocol==PROTO_PPM ? 12 : 11), {0,sizeof(g_model.name)-1,2,2,0,0,0,0,0,6,2,1}); + MENU(STR_MENUSETUP, menuTabModel, e_Model, (g_model.protocol==PROTO_PPM||g_model.protocol==PROTO_DSM2||g_model.protocol==PROTO_PXX ? 12 : 11), {0,sizeof(g_model.name)-1,2,2,0,0,0,0,0,6,2,1}); uint8_t sub = m_posVert; uint8_t y = 1*FH; @@ -491,7 +491,7 @@ void menuProcModel(uint8_t event) lcd_puts_P(0, y, STR_PROTO); lcd_putsnAtt(PARAM_OFS, y, STR_VPROTOS+LEN_VPROTOS*g_model.protocol, LEN_VPROTOS, (sub==subN && m_posHorz==0 ? (s_editMode>0 ? BLINK : INVERS):0)); - if (!g_model.protocol) { + if (g_model.protocol == PROTO_PPM) { lcd_putsnAtt(PARAM_OFS+4*FW, y, STR_NCHANNELS+LEN_NCHANNELS*(g_model.ppmNCH+2), LEN_NCHANNELS, ((sub==subN && m_posHorz==1) ? ((s_editMode>0) ? BLINK : INVERS) : 0)); lcd_puts_P(PARAM_OFS+11*FW, y, PSTR("u")); lcd_outdezAtt(PARAM_OFS+11*FW, y, (g_model.ppmDelay*50)+300, ((sub==subN && m_posHorz==2) ? ((s_editMode>0) ? BLINK : INVERS) : 0)); @@ -517,9 +517,11 @@ void menuProcModel(uint8_t event) CHECK_INCDEC_MODELVAR(event,g_model.protocol,0,PROT_MAX); break; case 1: - if (g_model.protocol == PROTO_DSM2) // TODO avoid DSM2 when not defined +#ifdef DSM2 + if (g_model.protocol == PROTO_DSM2) CHECK_INCDEC_MODELVAR(event, g_model.ppmNCH, 0, 2); else +#endif CHECK_INCDEC_MODELVAR(event, g_model.ppmNCH, -2, 4); break; case 2: @@ -547,9 +549,32 @@ void menuProcModel(uint8_t event) } } } - else { +#if defined(DSM2) || defined(PXX) + else if (g_model.protocol == PROTO_DSM2 || g_model.protocol == PROTO_PXX) { + lcd_puts_P(0, y, STR_RXNUM); + lcd_outdezNAtt(PARAM_OFS-3*FW, y, g_model.modelId, ((sub==subN && m_posHorz==0) ? (s_editMode>0 ? BLINK : INVERS) : 0) | LEADING0|LEFT, 2); + if (sub==subN && (s_editMode>0 || p1valdiff)) { + switch (m_posHorz) { + case 0: + CHECK_INCDEC_MODELVAR(event, g_model.modelId, 0, 99); + break; + } + } + + if (g_model.protocol == PROTO_PXX) { + lcd_putsAtt(PARAM_OFS, y, STR_SYNCMENU, ((sub==subN && m_posHorz==1) ? INVERS : 0)); + if (sub==subN && m_posHorz==1) { + s_editMode = false; + if (event==EVT_KEY_LONG(KEY_MENU)) { + // send reset code + pxxFlag = PXX_SEND_RXNUM; + // TODO audioDefevent(AUDIO_WARNING1); + } + } + } } +#endif } } diff --git a/src/myeeprom.h b/src/myeeprom.h index b3e8e01f8..570301690 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -171,9 +171,6 @@ enum Functions { FUNC_TRAINER_AIL, FUNC_INSTANT_TRIM, FUNC_TRIMS_2_OFS, -#if defined(DSM2) - FUNC_MODELMATCH, -#endif #ifdef LOGS FUNC_LOGS, #endif @@ -289,6 +286,7 @@ PACK(typedef struct t_ModelData { FrSkyData frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; + uint8_t modelId; }) ModelData; extern EEGeneral g_eeGeneral; diff --git a/src/o9xstrings.cpp b/src/o9xstrings.cpp index 6592f096a..b9e2a1f8d 100644 --- a/src/o9xstrings.cpp +++ b/src/o9xstrings.cpp @@ -187,9 +187,11 @@ const prog_char APM STR_EEPROMOVERFLOW[] = TR_EEPROMOVERFLOW; const prog_char APM STR_MENUSERROR[] = TR_MENUSERROR; const prog_char APM STR_MENURADIOSETUP[] = TR_MENURADIOSETUP; + #ifdef PCBV3 const prog_char APM STR_MENUDATEANDTIME[] = TR_MENUDATEANDTIME; #endif + const prog_char APM STR_MENUTRAINER[] = TR_MENUTRAINER; const prog_char APM STR_MENUVERSION[] = TR_MENUVERSION; const prog_char APM STR_MENUDIAG[] = TR_MENUDIAG; @@ -200,9 +202,11 @@ const prog_char APM STR_MENUMODELSEL[] = TR_MENUMODELSEL; const prog_char APM STR_MENUSETUP[] = TR_MENUSETUP; const prog_char APM STR_MENUFLIGHTPHASE[] = TR_MENUFLIGHTPHASE; const prog_char APM STR_MENUFLIGHTPHASES[] = TR_MENUFLIGHTPHASES; + #ifdef HELI const prog_char APM STR_MENUHELISETUP[] = TR_MENUHELISETUP; #endif + const prog_char APM STR_MENUDREXPO[] = TR_MENUDREXPO; const prog_char APM STR_MENULIMITS[] = TR_MENULIMITS; const prog_char APM STR_MENUCURVES[] = TR_MENUCURVES; @@ -210,17 +214,22 @@ const prog_char APM STR_MENUCURVE[] = TR_MENUCURVE; const prog_char APM STR_MENUCUSTOMSWITCHES[] = TR_MENUCUSTOMSWITCHES; const prog_char APM STR_MENUFUNCSWITCHES[] = TR_MENUFUNCSWITCHES; const prog_char APM STR_MENUSAFETYSWITCHES[] = TR_MENUSAFETYSWITCHES; + #ifdef FRSKY const prog_char APM STR_MENUTELEMETRY[] = TR_MENUTELEMETRY; #endif + #ifdef TEMPLATES const prog_char APM STR_MENUTEMPLATES[] = TR_MENUTEMPLATES; #endif + const prog_char APM STR_MENUSTAT[] = TR_MENUSTAT; const prog_char APM STR_MENUDEBUG[] = TR_MENUDEBUG; -#ifdef CTP1009 -const prog_char APM STR_PULSETABOVERFLOW[] = TR_PULSETABOVERFLOW; +#if defined(DSM2) || defined(PXX) +const prog_char APM STR_RXNUM[] = TR_RXNUM; #endif - +#if defined(PXX) +const prog_char APM STR_SYNCMENU[] = TR_SYNCMENU; +#endif diff --git a/src/o9xstrings.h b/src/o9xstrings.h index b668a522d..0067aeddf 100644 --- a/src/o9xstrings.h +++ b/src/o9xstrings.h @@ -285,10 +285,7 @@ extern const PROGMEM char STR_MENUTELEMETRY[]; extern const PROGMEM char STR_MENUTEMPLATES[]; extern const PROGMEM char STR_MENUSTAT[]; extern const PROGMEM char STR_MENUDEBUG[]; - - -#ifdef CTP1009 -extern const PROGMEM char STR_PULSETABOVERFLOW[]; -#endif +extern const PROGMEM char STR_RXNUM[]; +extern const PROGMEM char STR_SYNCMENU[]; #endif diff --git a/src/open9x.h b/src/open9x.h index d86802d49..2379e542f 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -413,24 +413,26 @@ enum EnumKeys { #define MAX_ALERT_TIME 60 +// TODO enum in myeeprom.h #define PROTO_PPM 0 #define PROTO_PXX 1 #define PROTO_DSM2 2 -#define PROTO_SILV_A 3 -#define PROTO_SILV_B 4 -#define PROTO_SILV_C 5 -#define PROTO_CTP1009 6 -#define PROT_MAX 6 +#define PROTO_PPM16 3 +#define PROT_MAX 3 extern uint8_t heartbeat; +#if defined(PXX) +extern uint8_t pxxFlag; +#endif + +#define PXX_SEND_RXNUM 0x01 +#define PXX_SEND_FAILSAFE 0x02 // TODO where is it used? + typedef void (*getADCp)(); #define ZCHAR_MAX 40 -#ifdef TRANSLATIONS -extern int8_t char2idx(char c); -#endif extern char idx2char(int8_t idx); /// stoppt alle events von dieser taste bis eine kurze Zeit abgelaufen ist diff --git a/src/pulses.cpp b/src/pulses.cpp index 1d88ee153..d965013a4 100644 --- a/src/pulses.cpp +++ b/src/pulses.cpp @@ -21,7 +21,7 @@ #include "open9x.h" -#ifdef DSM2 +#if defined(DSM2) #define DSM2_CHANS 6 #define BIND_BIT 0x80 #define RANGECHECK_BIT 0x20 @@ -30,9 +30,7 @@ #define BAD_DATA 0x47 #endif -#if defined(DSM2_PPM) || defined(PXX) uint8_t s_current_protocol = 255; -#endif #ifdef DSM2_SERIAL inline void DSM2_EnableTXD(void) @@ -42,6 +40,10 @@ inline void DSM2_EnableTXD(void) } #endif +void set_timer3_capture( void ) ; +void set_timer3_ppm( void ) ; +void setupPulsesPPM16( void ) ; + void startPulses() { #ifndef SIMU @@ -76,16 +78,13 @@ void startPulses() #endif // SIMU } -#if defined(DSM2) -uint8_t pulses2MHz[144] = {0}; // TODO check this length, pulled from er9x, perhaps too big -#elif defined(CTP1009) -uint8_t pulses2MHz[50*sizeof(uint16_t)] = {0}; -#else -uint8_t pulses2MHz[40*sizeof(uint16_t)] = {0}; -#endif - +#define PULSES_SIZE 144 +uint8_t pulses2MHz[PULSES_SIZE] = {0}; // TODO check this length, pulled from er9x, perhaps too big uint8_t *pulses2MHzRPtr = pulses2MHz; + +#if defined(DSM2) || defined(PXX) uint8_t *pulses2MHzWPtr = pulses2MHz; +#endif #define CTRL_END 0 #define CTRL_CNT 1 @@ -150,9 +149,9 @@ ISR(TIMER1_COMPA_vect) //2MHz pulse generation #endif pulses2MHzRPtr += sizeof(uint16_t); - if (pulses2MHzRPtr == pulses2MHzWPtr) { + if (*((uint16_t*)pulses2MHzRPtr) == 0) { - pulsePol = g_model.pulsePol; + pulsePol = g_model.pulsePol; // TODO do we need to change polarity? // TODO does it exist PCBV3? If no, replace PCBV3 by PCBV4 everywhere #if defined(PCBV3) @@ -173,14 +172,17 @@ ISR(TIMER1_COMPA_vect) //2MHz pulse generation TCCR1C=(1<>8)^pgm_read_word(&CRCTable[(PcmCrc^data) & 0xFF]); +} + + +void putPcmPart( uint8_t value ) +{ + PcmByte >>= 2 ; + PcmByte |= value ; + if ( ++PcmBitCount >= 4 ) + { + *pulses2MHzWPtr++ = PcmByte ; + PcmBitCount = PcmByte = 0 ; + } +} + + +void putPcmFlush() +{ + while ( PcmBitCount != 0 ) + { + putPcmPart( 0 ) ; // Empty + } + *pulses2MHzWPtr = 0 ; // Mark end +} + +void putPcmBit( uint8_t bit ) +{ + if ( bit ) + { + PcmOnesCount += 1 ; + putPcmPart( 0x80 ) ; + } + else + { + PcmOnesCount = 0 ; + putPcmPart( 0xC0 ) ; + } + if ( PcmOnesCount >= 5 ) + { + putPcmBit( 0 ) ; // Stuff a 0 bit in + } +} + +void putPcmByte( uint8_t byte ) +{ + uint8_t i ; + + crc( byte ) ; + + for ( i = 0 ; i < 8 ; i += 1 ) + { + putPcmBit( byte & 0x01 ) ; + byte >>= 1 ; + } +} + +void setupPulsesPXX() +{ + uint8_t i ; + uint16_t chan ; + uint16_t chan_1 ; + + pulses2MHzWPtr = pulses2MHz; + pulses2MHzRPtr = pulses2MHz; + + PcmCrc = 0 ; + PcmBitCount = PcmByte = 0 ; + PcmOnesCount = 0 ; + putPcmByte( 0x7E ) ; // sync byte + putPcmByte( g_model.modelId ) ; // putPcmByte( g_model.rxnum ) ; // + putPcmByte( pxxFlag ) ; // First byte of flags + putPcmByte( 0 ) ; // Second byte of flags + pxxFlag = 0; // reset flag after send + for ( i = 0 ; i < 8 ; i += 2 ) // First 8 channels only + { // Next 8 channels would have 2048 added + chan = g_chans512[i] * 3 / 4 + 1024 ; + chan_1 = g_chans512[i+1] * 3 / 4 + 1024 ; + if ( chan > 2047 ) + { + chan = 2047 ; + } + if ( chan_1 > 2047 ) + { + chan_1 = 2047 ; + } + 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 + } + chan = PcmCrc ; // get the crc + putPcmByte( chan ) ; // Checksum lo + putPcmByte( chan >> 8 ) ; // Checksum hi + putPcmByte( 0x7E ) ; // sync byte + putPcmFlush() ; + OCR1C += 40000 ; // 20mS on + PORTB |= (1<>1)+512, 1023); *ptr++ = (i<<2) | ((pulse>>8)&0x03); *ptr++ = pulse & 0xff; } + pulses2MHzWPtr = (uint8_t *)ptr; + pulses2MHzRPtr = pulses2MHz; } void DSM2_Done() @@ -299,7 +450,6 @@ void DSM2_Init(void) while (UCSR0A & (1 << RXC0)) UDR0; // flush receive buffer setupPulsesDsm2(); - pulses2MHzRPtr = pulses2MHz; // These should be running right from power up on a FrSky enabled '9X. DSM2_EnableTXD(); // enable FrSky-Telemetry reception @@ -338,6 +488,8 @@ void setupPulsesDsm2() static uint8_t dsmDat[2+6*2] = {0xFF,0x00, 0x00,0xAA, 0x05,0xFF, 0x09,0xFF, 0x0D,0xFF, 0x13,0x54, 0x14,0xAA}; uint8_t counter; + pulses2MHzWPtr = pulses2MHz; + // If more channels needed make sure the pulses union/array is large enough if (dsmDat[0] & BAD_DATA) // first time through, setup header { @@ -354,209 +506,53 @@ void setupPulsesDsm2() break; } } - if ((dsmDat[0] & BIND_BIT) && (!isFunctionActive(FUNC_MODELMATCH))) dsmDat[0] &= ~BIND_BIT; //clear bind bit if trainer not pulled - // TODO add a function key for that: if ((!(dsmDat[0] & BIND_BIT)) && isFunctionActive(FUNC_RANGECHECK)) dsmDat[0] |= RANGECHECK_BIT; //range check function - + if ((dsmDat[0] & BIND_BIT) && (!keyState(SW_Trainer))) dsmDat[0] &= ~BIND_BIT; // clear bind bit if trainer not pulled + // TODO find a way to do that, FUNC SWITCH: if ((!(dsmDat[0] & BIND_BIT)) && getSwitch(MAX_DRSWITCH-1, 0, 0)) dsmDat[0] |= RANGECHECK_BIT; // range check function else dsmDat[0] &= ~RANGECHECK_BIT; - dsmDat[1] = g_eeGeneral.currModel+1; //DSM2 Header second byte for model match + dsmDat[1] = g_model.modelId; // DSM2 Header second byte for model match for (uint8_t i=0; i>1)+512,1023); + uint16_t pulse = limit(0, (g_chans512[i]>>1)+512, 1023); dsmDat[2+2*i] = (i<<2) | ((pulse>>8)&0x03); dsmDat[3+2*i] = pulse & 0xff; } - for ( counter = 0; counter < 14; counter += 1 ) - { + for (counter=0; counter<14; counter++) sendByteDsm2(dsmDat[counter]); - } + pulses2MHzWPtr -= 1; //remove last stopbits and _send_1( 255 ); //prolong them _send_1(0); //end of pulse stream + + pulses2MHzRPtr = pulses2MHz; } #endif -#if defined(SILVER) || defined(CTP1009) -void _send_hilo(uint16_t hi,uint16_t lo) -{ - uint16_t *ptr = (uint16_t *)pulses2MHzWPtr; - *ptr++ = hi; - *ptr++ = lo; - pulses2MHzWPtr = (uint8_t *)ptr; -} -#endif - -#ifdef SILVER - -#define BITLEN (600u*2) -#define send_hilo_silv( hi, lo) _send_hilo( (hi)*BITLEN,(lo)*BITLEN ) - -void sendBitSilv(uint8_t val) -{ - send_hilo_silv((val)?2:1,(val)?2:1); -} -void send2BitsSilv(uint8_t val) -{ - sendBitSilv(val&2);sendBitSilv(val&1); -} -// _ oder - je 0.6ms (gemessen 0.7ms) -// -//____-----_-_-_--_--_ -_--__ -_-_-_-_ -_-_-_-_ --__--__-_______ -// trailer chan m1 m2 -// -//see /home/thus/txt/silverlit/thus.txt -//m1, m2 most significant bit first |m1-m2| <= 9 -//chan: 01=C 10=B -//chk = 0 - chan -m1>>2 -m1 -m2>>2 -m2 -//<= 500us Probleme -//>= 650us Probleme -//periode orig: 450ms -inline void __attribute__ ((always_inline)) setupPulsesSilver() -{ - int8_t chan=1; //chan 1=C 2=B 0=A? - - switch(g_model.protocol) - { - case PROTO_SILV_A: chan=0; break; - case PROTO_SILV_B: chan=2; break; - case PROTO_SILV_C: chan=1; break; - } - - int8_t m1 = (uint16_t)(g_chans512[0]+1024)*2 / 256; - int8_t m2 = (uint16_t)(g_chans512[1]+1024)*2 / 256; - if (m1 < 0) m1=0; - if (m2 < 0) m2=0; - if (m1 > 15) m1=15; - if (m2 > 15) m2=15; - if (m2 > m1+9) m1=m2-9; - if (m1 > m2+9) m2=m1-9; - //uint8_t i=0; - - send_hilo_silv(5,1); //idx 0 erzeugt pegel=0 am Ausgang, wird als high gesendet - send2BitsSilv(0); - send_hilo_silv(2,1); - send_hilo_silv(2,1); - - send2BitsSilv(chan); //chan 1=C 2=B 0=A? - uint8_t sum = 0 - chan; - - send2BitsSilv(m1>>2); //m1 - sum-=m1>>2; - send2BitsSilv(m1); - sum-=m1; - - send2BitsSilv(m2>>2); //m2 - sum-=m2>>2; - send2BitsSilv(m2); - sum-=m2; - - send2BitsSilv(sum); //chk - - sendBitSilv(0); - pulses2MHzWPtr -= sizeof(uint16_t); - send_hilo_silv(50,0); //low-impuls (pegel=1) ueberschreiben -} - -#endif - -#ifdef CTP1009 - -/* - TRACE CTP-1009 - - = send 45MHz - _ = send nix - start1 0 1 start2 - -------__ --_ -__ -----__ - 7ms 2 .8 .4 .4 .8 5 2 - - frame: - start1 24Bits_1 start2 24_Bits2 - - 24Bits_1: - 7 x Bits Throttle lsb first - 1 x 0 - - 6 x Bits rotate lsb first - 1 x Bit 1=rechts - 1 x 0 - - 4 x Bits chk5 = nib2 ^ nib4 - 4 x Bits chk6 = nib1 ^ nib3 - - 24Bits_2: - 7 x Bits Vorwaets lsb first 0x3f = mid - 1 x 1 - - 7 x Bits 0x0e lsb first - 1 x 1 - - 4 x Bits chk5 = nib2 ^ nib4 - 4 x Bits chk6 = nib1 ^ nib3 - - */ - -#define BIT_TRA (400u*2) -void sendBitTra(uint8_t val) -{ - if(val) _send_hilo( BIT_TRA*1 , BIT_TRA*2 ); - else _send_hilo( BIT_TRA*2 , BIT_TRA*1 ); -} -void sendByteTra(uint8_t val) -{ - for(uint8_t i=0; i<8; i++, val>>=1) sendBitTra(val&1); -} - -inline void __attribute__ ((always_inline)) setupPulsesTracerCtp1009() -{ - static bool phase; - if( (phase=!phase) ){ - uint8_t thr = min(127u,(uint16_t)(g_chans512[0]+1024+8) / 16u); - uint8_t rot; - if (g_chans512[1] >= 0) - { - rot = min(63u,(uint16_t)( g_chans512[1]+16) / 32u) | 0x40; - }else{ - rot = min(63u,(uint16_t)(-g_chans512[1]+16) / 32u); - } - sendByteTra(thr); - sendByteTra(rot); - uint8_t chk=thr^rot; - sendByteTra( (chk>>4) | (chk<<4) ); - _send_hilo( 5000*2, 2000*2 ); - }else{ - uint8_t fwd = min(127u,(uint16_t)(g_chans512[2]+1024) / 16u) | 0x80; - sendByteTra(fwd); - sendByteTra(0x8e); - uint8_t chk=fwd^0x8e; - sendByteTra( (chk>>4) | (chk<<4) ); - _send_hilo( 7000*2, 2000*2 ); - } - if((pulses2MHzWPtr-pulses2MHz) >= sizeof(pulses2MHz)) alert(STR_PULSETABOVERFLOW); -} - -#endif - void setupPulses() { -#if defined(DSM2_PPM) || defined(PXX) if (s_current_protocol != g_model.protocol) { + s_current_protocol = g_model.protocol; - // switch mode here + switch (g_model.protocol) { + #if defined(DSM2_PPM) case PROTO_DSM2: - TCCR1B = 0; // Stop counter - OCR1B = 200; // 100 uS - TCNT1 = 300; // Past the OCR1B value - ICR1 = 44000; // Next frame starts in 22 mS + set_timer3_capture() ; + TCCR1B = 0; // Stop counter + OCR1C = 200; // 100 uS + TCNT1 = 300; // Past the OCR1C value + ICR1 = 44000; // Next frame starts in 22 mS #if defined(PCBV3) - TIMSK1 &= ~0x3C; // All interrupts off + TIMSK1 &= ~0x3C; // All interrupts off TIFR1 = 0x2F; - TIMSK1 |= 0x28; // Enable CAPT and COMPB + TIMSK1 |= 0x28; // Enable CAPT and COMPB #else - TIMSK &= ~0x3C; // All interrupts off + TIMSK &= ~0x3C; // All interrupts off TIFR = 0x3C; - TIMSK |= 0x28; // Enable CAPT and COMPB + ETIFR = 0x3F ; + TIMSK |= 0x20; // Enable CAPT + ETIMSK |= (1<>= 1) == 0 ) + { + if ( *(++pulses2MHzRPtr) == 0 ) + { + OCR1B = OCR1C + 2000 ; // 1mS on from OCR1B + } + } + else + { + *pulses2MHzRPtr = x; + } + + heartbeat |= HEART_TIMER2Mhz; } #endif + +ISR(TIMER1_COMPC_vect) // DSM2 or PXX end of frame +{ +#if defined(DSM2_PPM) && defined(PXX) + if ( g_model.protocol == PROTO_DSM2 ) { +#endif + +#if defined(DSM2_PPM) + ICR1 = 41536 ; // next frame starts in 22ms 41536 = 2*(22000 - 14*11*8) + if (OCR1B < 255) { + OCR1B = 39000; // delay setup pulses by 19.5ms to reduce system latency + } + else { + OCR1B = 200; + // sei will be called inside setupPulses() + setupPulses(); + } +#endif + +#if defined(DSM2_PPM) && defined(PXX) + } + else { +#endif + +#if defined(PXX) + // must be PXX + setupPulses() ; +#endif + +#if defined(DSM2_PPM) && defined(PXX) + } +#endif +} +#endif + +#endif + +void set_timer3_capture() +{ +#ifndef SIMU + ETIMSK &= ~( (1<ofs ""vofs""|v|v2 ""v1=v2 ""v1<=v2 " #define LEN_VFSWFUNC 14 -#if defined(DSM2) -#define TR_MODELMATCH "ModelMatch " -#else -#define TR_MODELMATCH -#endif #ifdef LOGS #define TR_SDCLOGGS "SDCARD Logs " #else #define TR_SDCLOGGS #endif -#define TR_VFSWFUNC "---- ""Trainer ""Trainer RUD ""Trainer ELE ""Trainer THR ""Trainer AIL ""Instant Trim ""Trims2Offsets "TR_MODELMATCH TR_SDCLOGGS +#define TR_VFSWFUNC "---- ""Trainer ""Trainer RUD ""Trainer ELE ""Trainer THR ""Trainer AIL ""Instant Trim ""Trims2Offsets " TR_SDCLOGGS #define LEN_VTELEMUNIT 1 #define TR_VTELEMUNIT "v""-" @@ -279,4 +274,5 @@ #define TR_MENUTEMPLATES "TEMPLATES" #define TR_MENUSTAT "STAT" #define TR_MENUDEBUG "DEBUG" - +#define TR_RXNUM "RxNum" +#define TR_SYNCMENU "Sync [MENU]" diff --git a/src/translations/fr.h b/src/translations/fr.h index 292864aa8..7dbc49c03 100644 --- a/src/translations/fr.h +++ b/src/translations/fr.h @@ -32,8 +32,8 @@ #define LEN_RETA123 1 #define TR_RETA123 "RETA123" -#define LEN_VPROTOS 6 -#define TR_VPROTOS "PPM ""PXX ""DSM2 ""SILV_A""SILV_B""SILV_C""TRAC09" +#define LEN_VPROTOS 5 +#define TR_VPROTOS "PPM ""PXX ""DSM2 ""PPM16" #define LEN_POSNEG 3 #define TR_POSNEG "POS""NEG" @@ -57,17 +57,12 @@ #define TR_VCSWFUNC "---- ""v>ofs ""vofs""|v|v2 ""v1=v2 ""v1<=v2 " #define LEN_VFSWFUNC 14 -#if defined(DSM2) -#define TR_MODELMATCH "ModelMatch " -#else -#define TR_MODELMATCH -#endif #ifdef LOGS #define TR_SDCLOGGS "SDCARD Logs " #else #define TR_SDCLOGGS #endif -#define TR_VFSWFUNC "---- ""Ecolage ""Ecolage DER ""Ecolage PRF ""Ecolage GAZ ""Ecolage AIL ""Instant Trim ""Trims2Offsets "TR_MODELMATCH TR_SDCLOGGS +#define TR_VFSWFUNC "---- ""Ecolage ""Ecolage DER ""Ecolage PRF ""Ecolage GAZ ""Ecolage AIL ""Instant Trim ""Trims2Offsets " TR_SDCLOGGS #define LEN_VTELEMUNIT 1 #define TR_VTELEMUNIT "v""-" @@ -279,4 +274,5 @@ #define TR_MENUTEMPLATES "GABARITS" #define TR_MENUSTAT "STAT" #define TR_MENUDEBUG "DEBUG" - +#define TR_RXNUM "RxNum" +#define TR_SYNCMENU "Sync [MENU]"