From caa2aec727908d6bb3e30f76a609f5a93d1e0380 Mon Sep 17 00:00:00 2001 From: bsongis Date: Wed, 8 Feb 2012 20:56:36 +0000 Subject: [PATCH] New telemetry screens (bars) New telemetry units for A1 / A2 Update to pgmtypes according to Michal patch (suggested by gcc developers!) EEPROM v204 --- src/ardupilot.cpp | 32 ++--- src/audio.cpp | 7 +- src/audio.h | 2 - src/drivers.cpp | 2 + src/file.cpp | 6 +- src/frsky.cpp | 55 +++++--- src/frsky.h | 24 +++- src/general_menus.cpp | 75 +++++------ src/lcd.cpp | 143 ++++++++++++++------ src/lcd.h | 15 ++- src/main_views.cpp | 276 +++++++++++++++++++-------------------- src/model_menus.cpp | 220 ++++++++++++++++--------------- src/myeeprom.h | 39 ++++-- src/nmea.cpp | 28 ++-- src/o9xstrings.cpp | 17 +-- src/o9xstrings.h | 21 ++- src/open9x.cpp | 33 +++-- src/open9x.h | 53 ++------ src/pgmtypes.h | 26 ++++ src/statistics_views.cpp | 23 ++-- src/translations/en.h | 68 +++++----- src/translations/fr.h | 63 +++++---- 22 files changed, 670 insertions(+), 558 deletions(-) diff --git a/src/ardupilot.cpp b/src/ardupilot.cpp index 5a382eb51..1103c9abc 100644 --- a/src/ardupilot.cpp +++ b/src/ardupilot.cpp @@ -494,10 +494,10 @@ void menuProcArduPilot1(uint8_t event) initval (1, PACK_POS, LON); // title of the screen title ('1'); - lcd_puts_P (5*FW, 1*FH, PSTR(" Latitude")); // line 1 column 5 + lcd_puts (5*FW, 1*FH, PSTR(" Latitude")); // line 1 column 5 // first buffer into line 2 column 2 lcd_putsAtt (2*FW, 2*FH, VALSTR(0), APSIZE); - lcd_puts_P (5*FW, 4*FH, PSTR(" Longitude")); // line 4 column 5 + lcd_puts (5*FW, 4*FH, PSTR(" Longitude")); // line 4 column 5 // second buffer into line 5 column 2 lcd_putsAtt (1*FW, 5*FH, VALSTR(1), APSIZE); } @@ -520,9 +520,9 @@ void menuProcArduPilot2(uint8_t event) initval (0, PACK_POS, SPD); initval (1, PACK_POS, CRT); title ('2'); - lcd_puts_P (1*FW, 1*FH, PSTR(" Ground speed")); + lcd_puts (1*FW, 1*FH, PSTR(" Ground speed")); lcd_putsAtt (2*FW, 2*FH, VALSTR(0), APSIZE); - lcd_puts_P (1*FW, 4*FH, PSTR(" Climb rate") ); + lcd_puts (1*FW, 4*FH, PSTR(" Climb rate") ); lcd_putsAtt (2*FW, 5*FH, VALSTR(1), APSIZE); } @@ -544,9 +544,9 @@ void menuProcArduPilot3(uint8_t event) initval (0, PACK_POS, ALT); initval (1, PACK_POS, ALH); title ('3'); - lcd_puts_P (1*FW, 1*FH, PSTR(" Altitude")); + lcd_puts (1*FW, 1*FH, PSTR(" Altitude")); lcd_putsAtt (2*FW, 2*FH, VALSTR(0), APSIZE); - lcd_puts_P (1*FW, 4*FH, PSTR(" Altitude Hold") ); + lcd_puts (1*FW, 4*FH, PSTR(" Altitude Hold") ); lcd_putsAtt (2*FW, 5*FH, VALSTR(1), APSIZE); } @@ -568,9 +568,9 @@ void menuProcArduPilot4(uint8_t event) initval (0, PACK_POS, CRS); initval (1, PACK_POS, BER); title ('4'); - lcd_puts_P (1*FW, 1*FH, PSTR(" Course")); + lcd_puts (1*FW, 1*FH, PSTR(" Course")); lcd_putsAtt (2*FW, 2*FH, VALSTR(0), APSIZE); - lcd_puts_P (1*FW, 4*FH, PSTR(" Bearing")); + lcd_puts (1*FW, 4*FH, PSTR(" Bearing")); lcd_putsAtt (2*FW, 5*FH, VALSTR(1), APSIZE); } @@ -594,9 +594,9 @@ void menuProcArduPilot5(uint8_t event) initval (0, PACK_POS, WPN); initval (1, PACK_POS, DST); title ('5'); - lcd_puts_P (1*FW, 1*FH, PSTR(" Way Point # ")); + lcd_puts (1*FW, 1*FH, PSTR(" Way Point # ")); lcd_putsAtt (2*FW, 2*FH, VALSTR(0), APSIZE); - lcd_puts_P (1*FW, 4*FH, PSTR(" Distance ")); + lcd_puts (1*FW, 4*FH, PSTR(" Distance ")); lcd_putsAtt (2*FW, 5*FH, VALSTR(1), APSIZE); } @@ -620,9 +620,9 @@ void menuProcArduPilot6(uint8_t event) initval (0, PACK_ATT, ASP); initval (1, PACK_ATT, THH); title ('6'); - lcd_puts_P (1*FW, 1*FH, PSTR(" Air Speed ")); + lcd_puts (1*FW, 1*FH, PSTR(" Air Speed ")); lcd_putsAtt (2*FW, 2*FH, VALSTR(0), APSIZE); - lcd_puts_P (1*FW, 4*FH, PSTR(" Climb Rate ")); + lcd_puts (1*FW, 4*FH, PSTR(" Climb Rate ")); lcd_putsAtt (2*FW, 5*FH, VALSTR(1), APSIZE); } @@ -646,9 +646,9 @@ void menuProcArduPilot7(uint8_t event) initval (0, PACK_ATT, RLL); initval (1, PACK_ATT, PCH); title ('7'); - lcd_puts_P (1*FW, 1*FH, PSTR(" Roll Angle")); + lcd_puts (1*FW, 1*FH, PSTR(" Roll Angle")); lcd_putsAtt (2*FW, 2*FH, VALSTR(0), APSIZE); - lcd_puts_P (1*FW, 4*FH, PSTR(" Pitch Angle")); + lcd_puts (1*FW, 4*FH, PSTR(" Pitch Angle")); lcd_putsAtt (2*FW, 5*FH, VALSTR(1), APSIZE); } @@ -672,9 +672,9 @@ void menuProcArduPilot8(uint8_t event) initval (0, PACK_MOD, MOD); initval (1, PACK_WPC, WPC); title ('8'); - lcd_puts_P (1*FW, 1*FH, PSTR(" ArduPilot Mode")); + lcd_puts (1*FW, 1*FH, PSTR(" ArduPilot Mode")); lcd_putsAtt (2*FW, 2*FH, VALSTR(0), APSIZE); - lcd_puts_P (1*FW, 4*FH, PSTR(" RTL Distance")); + lcd_puts (1*FW, 4*FH, PSTR(" RTL Distance")); lcd_putsAtt (2*FW, 5*FH, VALSTR(1), APSIZE); } diff --git a/src/audio.cpp b/src/audio.cpp index 0b0ef57e0..6e2e0d791 100644 --- a/src/audio.cpp +++ b/src/audio.cpp @@ -15,11 +15,6 @@ #include "open9x.h" audioQueue::audioQueue() -{ - aqinit(); -} - -void audioQueue::aqinit() { toneTimeLeft = 0; tonePause = 0; @@ -236,7 +231,7 @@ void audioQueue::event(uint8_t e, uint8_t f) break; // inactivity timer alert case AU_INACTIVITY: - playNow(70, 10, 2,2); + playNow(70, 10, 2, 2); break; // low battery in tx case AU_TX_BATTERY_LOW: diff --git a/src/audio.h b/src/audio.h index 866459ab3..5ecceff3f 100644 --- a/src/audio.h +++ b/src/audio.h @@ -143,11 +143,9 @@ class audioQueue } protected: - void aqinit(); // To stop constructor being compiled twice inline uint8_t getToneLength(uint8_t tLen); private: - uint8_t t_queueRidx; uint8_t t_queueWidx; diff --git a/src/drivers.cpp b/src/drivers.cpp index 9e3f9730b..a9efcbb10 100644 --- a/src/drivers.cpp +++ b/src/drivers.cpp @@ -442,6 +442,8 @@ void per10ms() #if defined (FRSKY) + // TODO it would be better in frsky.h / .cpp! + // Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability) static uint8_t FrskyDelay = 5; if (FrskyAlarmSendState && (--FrskyDelay == 0)) diff --git a/src/file.cpp b/src/file.cpp index 5e620f964..7f2d95837 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -580,10 +580,10 @@ void RlcFile::DisplayProgressBar(uint8_t x) if (s_eeDirtyMsk || isWriting() || eeprom_buffer_size) { #if defined (PROGRESS_BAR) uint8_t len = (s_eeDirtyMsk ? 123 : min((uint8_t)123, (uint8_t)((m_rlc_len) / 5 + eeprom_buffer_size))); - lcd_filled_rect(2, 1, 125, 5, WHITE); + lcd_filled_rect(2, 1, 125, 5, SOLID, WHITE); lcd_filled_rect(3, 2, 123-len, 3); #elif defined (PROGRESS_CIRCLE) - lcd_filled_rect(x-1, 0, 7, 7, WHITE); + lcd_filled_rect(x-1, 0, 7, 7, SOLID, WHITE); uint8_t len = s_eeDirtyMsk ? 1 : limit(1, 12 - (uint8_t)(m_rlc_len/m_ratio), 12); lcd_hline(x+1, 1, min((uint8_t)3, len)); if (len >= 3) { @@ -597,7 +597,7 @@ void RlcFile::DisplayProgressBar(uint8_t x) } #elif defined (PROGRESS_VERTICAL_BAR) uint8_t len = s_eeDirtyMsk ? 1 : limit((uint8_t)1, (uint8_t)(7 - (m_rlc_len/m_ratio)), (uint8_t)7); - lcd_filled_rect(x+1, 0, 5, FH, WHITE); + lcd_filled_rect(x+1, 0, 5, FH, SOLID, WHITE); lcd_filled_rect(x+2, 7-len, 3, len); #elif defined (PROGRESS_FIXED_CIRCLE) lcd_square(x, 1, 5); diff --git a/src/frsky.cpp b/src/frsky.cpp index 9f31f0241..5fbfd05cd 100644 --- a/src/frsky.cpp +++ b/src/frsky.cpp @@ -43,7 +43,7 @@ uint8_t frskyStreaming = 0; uint8_t frskyUsrStreaming = 0; FrskyData frskyTelemetry[2]; -FrskyData frskyRSSI[2]; +FrskyRSSI frskyRSSI[2]; struct FrskyAlarm { uint8_t level; // The alarm's 'urgency' level. 0=disabled, 1=yellow, 2=orange, 3=red @@ -54,9 +54,8 @@ struct FrskyAlarm { struct FrskyAlarm frskyAlarms[4]; #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) -FrskyHubData frskyHubData; -int16_t baroAltitudeOffset = 0; -uint8_t maxGpsSpeed = 0; +FrskyHubData frskyHubData; // TODO initialization? +uint8_t barsThresholds[BAR_MAX-3]; #endif void frskyPushValue(uint8_t *&ptr, uint8_t value) @@ -99,14 +98,8 @@ int8_t parseTelemHubIndex(uint8_t index) index = 0; // invalid index if (index > 0x39) index -= 17; - if (index > 0x27) - index -= 1; if (index > 0x21) index -= 5; - if (index > 0x0f) - index -= 6; - if (index > 0x08) - index -= 2; return 2*(index-1); } @@ -151,8 +144,22 @@ void parseTelemHubByte(uint8_t byte) return; } ((uint8_t*)&frskyHubData)[structPos+1] = byte; - if (structPos == offsetof(FrskyHubData, gpsSpeed_ap)/2 && maxGpsSpeed < frskyHubData.gpsSpeed_ap) - maxGpsSpeed = frskyHubData.gpsSpeed_ap; + if ((uint8_t)structPos == offsetof(FrskyHubData, gpsSpeed_ap)) { + // Speed => Max speed + if (frskyHubData.maxGpsSpeed < frskyHubData.gpsSpeed_ap) + frskyHubData.maxGpsSpeed = frskyHubData.gpsSpeed_ap; + } + if ((uint8_t)structPos == offsetof(FrskyHubData, volts)) { + // Voltage => Cell number + Cell voltage + uint8_t battnumber = (frskyHubData.volts & 0x00F0) >> 4; + if (frskyHubData.cellsCount < battnumber+1) { + frskyHubData.cellsCount = battnumber+1; + } + uint8_t cellVolts = 2*(((frskyHubData.volts & 0xFF00) >> 8) + ((frskyHubData.volts & 0x000F) << 8)); + frskyHubData.cellVolts[battnumber] = cellVolts; + if (!frskyHubData.minCellVolts || cellVolts < frskyHubData.minCellVolts) + frskyHubData.minCellVolts = cellVolts; + } state = TS_IDLE; } @@ -485,21 +492,35 @@ void frskyAlarmsRefresh() } #endif -void FrskyData::set(uint8_t value) +void FrskyRSSI::set(uint8_t value) { - this->value = value; - if (!max || max < value) - max = value; + this->value = (((uint16_t)this->value * 7) + value) / 8; if (!min || min > value) min = value; } +void FrskyData::set(uint8_t value) +{ + if (!max || max < value) + max = value; + FrskyRSSI::set(value); +} + void resetTelemetry() { memset(frskyTelemetry, 0, sizeof(frskyTelemetry)); memset(frskyRSSI, 0, sizeof(frskyRSSI)); #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) - baroAltitudeOffset = -frskyHubData.baroAltitude; + frskyHubData.baroAltitudeOffset = -frskyHubData.baroAltitude; + frskyHubData.maxGpsSpeed = 0; + frskyHubData.cellsCount = 0; + frskyHubData.minCellVolts = 0; +#endif + +#ifdef SIMU + frskyTelemetry[0].set(120); + frskyRSSI[0].set(75); + frskyHubData.fuelLevel = 75; #endif } diff --git a/src/frsky.h b/src/frsky.h index 084adbb48..fe981178c 100644 --- a/src/frsky.h +++ b/src/frsky.h @@ -39,13 +39,21 @@ enum AlarmLevel { #define ALARM_GREATER(channel, alarm) ((g_model.frsky.channels[channel].alarms_greater >> alarm) & 1) #define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3) -struct FrskyData { +// TODO change names +class FrskyRSSI { + public: uint8_t value; uint8_t min; + void set(uint8_t value); +}; + +class FrskyData: public FrskyRSSI { + public: uint8_t max; void set(uint8_t value); }; + #if defined(FRSKY_HUB) struct FrskyHubData { // 1 spare @@ -55,9 +63,10 @@ struct FrskyHubData { uint16_t fuelLevel; // 0, 25, 50, 75, 100 percent int16_t temperature2; // -20 .. 250 deg. celcius uint16_t volts; // 1/500V increments (0..4.2V) - // 2 spares + int16_t baroAltitudeOffset; // spare reused + uint16_t maxGpsSpeed; // spare reused int16_t gpsAltitude_ap; // after punct - // 6 spares + uint8_t cellVolts[12]; // 6 spares reused uint16_t baroAltitude; // 0..9,999 meters uint16_t gpsSpeed_bp; // before punct uint16_t gpsLongitude_bp; // before punct @@ -79,7 +88,8 @@ struct FrskyHubData { int16_t accelX; // 1/256th gram (-8g ~ +8g) int16_t accelY; // 1/256th gram (-8g ~ +8g) int16_t accelZ; // 1/256th gram (-8g ~ +8g) - // 1 spare + uint8_t cellsCount; // 1/2 spare reused + uint8_t minCellVolts; // 1/2 spare reused uint16_t current; // 17 spares uint16_t volts_bp; @@ -90,14 +100,14 @@ struct FrskyHubData { struct FrskyHubData { uint16_t baroAltitude; // 0..9,999 meters + int16_t baroAltitudeOffset; }; #endif #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) extern FrskyHubData frskyHubData; -extern int16_t baroAltitudeOffset; -extern uint8_t maxGpsSpeed; +extern uint8_t barsThresholds[BAR_MAX-3]; #endif // Global Fr-Sky telemetry data variables @@ -109,7 +119,7 @@ extern uint8_t frskyUsrStreaming; extern uint8_t FrskyAlarmSendState; extern FrskyData frskyTelemetry[2]; -extern FrskyData frskyRSSI[2]; +extern FrskyRSSI frskyRSSI[2]; extern uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; extern uint8_t frskyTxBufferCount; diff --git a/src/general_menus.cpp b/src/general_menus.cpp index e4345142c..4adbcd15a 100644 --- a/src/general_menus.cpp +++ b/src/general_menus.cpp @@ -90,7 +90,7 @@ void menuProcSetup(uint8_t event) uint8_t subN = 1; if(s_pgOfs7*FH) return; @@ -98,7 +98,7 @@ void menuProcSetup(uint8_t event) #ifdef AUDIO if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; @@ -233,7 +233,7 @@ void menuProcSetup(uint8_t event) if(s_pgOfsAETR + lcd_putsLeft( y,STR_RXCHANNELORD);// RAET->AETR for (uint8_t i=1; i<=4; i++) putsChnLetter((16+i)*FW, y, channel_order(i), attr); if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.templateSetup, 0, 23); @@ -277,7 +277,7 @@ void menuProcSetup(uint8_t event) }subN++; if(s_pgOfs7*FH) return; @@ -397,11 +397,11 @@ void menuProcTrainer(uint8_t event) uint8_t blink ; if (SLAVE_MODE) { // i am the slave - lcd_puts_P(7*FW, 3*FH, STR_SLAVE); + lcd_puts(7*FW, 3*FH, STR_SLAVE); return; } - lcd_puts_P(3*FW, 1*FH, STR_MODESRC); + lcd_puts(3*FW, 1*FH, STR_MODESRC); sub--; y = 2*FH; @@ -434,7 +434,7 @@ void menuProcTrainer(uint8_t event) y += FH; } - lcd_puts_P(0*FW, y, STR_MULTIPLIER); + lcd_puts(0*FW, y, STR_MULTIPLIER); lcd_outdezAtt(13*FW, y, g_eeGeneral.PPM_Multiplier+10, (sub==4 ? INVERS : 0)|PREC1); if(sub==4) CHECK_INCDEC_GENVAR(event, g_eeGeneral.PPM_Multiplier, -10, 40); y += FH; @@ -463,11 +463,11 @@ void menuProcDiagVers(uint8_t event) { SIMPLE_MENU(STR_MENUVERSION, menuTabDiag, e_Vers, 1); - lcd_puts_P(0, 2*FH,stamp1 ); - lcd_puts_P(0, 3*FH,stamp2 ); - lcd_puts_P(0, 4*FH,stamp3 ); - lcd_puts_P(0, 5*FH,stamp4 ); - lcd_puts_P(0, 7*FH,STR_EEPROMV); + lcd_putsLeft( 2*FH,stamp1 ); + lcd_putsLeft( 3*FH,stamp2 ); + lcd_putsLeft( 4*FH,stamp3 ); + lcd_putsLeft( 5*FH,stamp4 ); + lcd_putsLeft( 7*FH,STR_EEPROMV); lcd_outdezAtt(8*FW, 7*FH, g_eeGeneral.myVers, LEFT); } @@ -500,7 +500,7 @@ void menuProcDiagKeys(uint8_t event) } #endif - lcd_puts_P(14*FW, 3*FH, STR_VTRIM); + lcd_puts(14*FW, 3*FH, STR_VTRIM); for(uint8_t i=0; i<4; i++) { uint8_t y=i*FH+FH*4; @@ -531,7 +531,7 @@ void menuProcDiagAna(uint8_t event) // lcd_outdezAtt( 21*FW, 3*FH, g_eeGeneral.vBatCalib, 0) ; // lcd_outdezAtt( 21*FW, 4*FH, abRunningAvg, 0) ; // Display raw BandGap result (debug) - lcd_puts_P( 19*FW, 5*FH, STR_BG) ; + lcd_puts( 19*FW, 5*FH, STR_BG) ; lcd_outdezAtt(21*FW, 6*FH, BandGap, 0); lcd_outdezAtt(21*FW, 7*FH, anaIn(7)*35/512, PREC1); @@ -576,15 +576,13 @@ void menuProcDiagCalib(uint8_t event) switch (idxState) { case 0: // START CALIBRATION - // [MENU] - lcd_puts_P(2*FW, 3*FH, STR_MENUTOSTART); + lcd_puts(3*FW, 3*FH, STR_MENUTOSTART); break; case 1: // SET MIDPOINT - // [MENU] - lcd_putsAtt(2*FW, 2*FH, STR_SETMIDPOINT, s_noScroll ? INVERS : 0); - lcd_puts_P(2*FW, 3*FH, STR_MENUWHENDONE); + lcd_putsAtt(5*FW, 2*FH, STR_SETMIDPOINT, s_noScroll ? INVERS : 0); + lcd_puts(3*FW, 3*FH, STR_MENUWHENDONE); for (uint8_t i=0; i<7; i++) { loVals[i] = 15000; @@ -595,9 +593,8 @@ void menuProcDiagCalib(uint8_t event) case 2: // MOVE STICKS/POTS - // [MENU] - lcd_putsAtt(2*FW, 2*FH, STR_MOVESTICKSPOTS, s_noScroll ? INVERS : 0); - lcd_puts_P(2*FW, 3*FH, STR_MENUWHENDONE); + lcd_putsAtt(3*FW, 2*FH, STR_MOVESTICKSPOTS, s_noScroll ? INVERS : 0); + lcd_puts(3*FW, 3*FH, STR_MENUWHENDONE); for (uint8_t i=0; i<7; i++) { if (abs(loVals[i]-hiVals[i])>50) { diff --git a/src/lcd.cpp b/src/lcd.cpp index 0b28ea077..7a8177dbd 100644 --- a/src/lcd.cpp +++ b/src/lcd.cpp @@ -68,7 +68,7 @@ void lcd_putcAtt(uint8_t x, uint8_t y, const char c, uint8_t mode) uint8_t *p = &displayBuf[ y / 8 * DISPLAY_W + x ]; const pm_uchar *q = &font_5x8_x20_x7f[ + (c-0x20)*5]; - bool inv = (mode & INVERS) ? true : (mode & BLINK ? BLINK_ON_PHASE : false); + bool inv = (mode & INVERS) ? true : (mode & BLINK ? BLINK_ON_PHASE : false); if(mode & DBLSIZE) { /* each letter consists of ten top bytes followed by @@ -76,23 +76,20 @@ void lcd_putcAtt(uint8_t x, uint8_t y, const char c, uint8_t mode) q = &font_10x16_x20_x7f[(c-0x20)*10 + ((c-0x20)/16)*160]; for(char i=5; i>=0; i--) { if (mode & CONDENSED && i==0) break; - /*top byte*/ - uint8_t b1 = i>0 ? pgm_read_byte(q) : 0; - /*bottom byte*/ - uint8_t b3 = i>0 ? pgm_read_byte(160+q) : 0; - /*top byte*/ - uint8_t b2 = i>0 ? pgm_read_byte(++q) : 0; - /*bottom byte*/ - uint8_t b4 = i>0 ? pgm_read_byte(160+q) : 0; - + uint8_t b1=0, b2=0, b3=0, b4=0; + if (i>0) { + b1 = pgm_read_byte(q); /*top byte*/ + b3 = pgm_read_byte(160+q); /*bottom byte*/ + b2 = pgm_read_byte(++q); /*top byte*/ + b4 = pgm_read_byte(160+q); /*bottom byte*/ + } if(inv) { b1=~b1; b2=~b2; b3=~b3; b4=~b4; } - - if(&p[DISPLAY_W+1] < DISPLAY_END){ + if(&p[DISPLAY_W+1] < DISPLAY_END) { p[0]=b1; p[1]=b2; p[DISPLAY_W] = b3; @@ -110,15 +107,21 @@ void lcd_putcAtt(uint8_t x, uint8_t y, const char c, uint8_t mode) condense=1; } - for (char i=5; i!=0; i--) { - uint8_t b = pgm_read_byte(q++); + uint8_t ym8 = (y % 8); + for (char i=5; i>=0; i--) { + uint8_t b = (i>0 ? pgm_read_byte(q++) : 0); + if (inv) b = ~b; + if (condense && i==4) { /*condense the letter by skipping column 4 */ continue; } - if(p> (8-ym8)))) + (b >> (8-ym8)); } + p++; + } } - if(pDISPLAY_W-6) break; + if (c >= 0x20) { + lcd_putcAtt(x,y,c,mode); + x += FW; + if (mode&DBLSIZE) x += FW-1; + } + else { + x += (c*FW); + } s++; len--; } @@ -162,11 +170,16 @@ void lcd_putsAtt(uint8_t x,uint8_t y,const pm_char * s,uint8_t mode) lcd_putsnAtt(x, y, s, 255, mode); } -void lcd_puts_P(uint8_t x,uint8_t y,const pm_char * s) +void lcd_puts(uint8_t x,uint8_t y,const pm_char * s) { lcd_putsAtt( x, y, s, 0); } +void lcd_putsLeft(uint8_t y, const pm_char * s) +{ + lcd_putsAtt(0, y, s, 0); +} + void lcd_outhex4(uint8_t x,uint8_t y,uint16_t val) { x+=FWNUM*4; @@ -331,6 +344,9 @@ void lcd_vlineStip(uint8_t x, int8_t y, int8_t h, uint8_t pat) if (y<0) { h+=y; y=0; } if (y+h > DISPLAY_H) { h = DISPLAY_H - y; } + if (pat==DOTTED && !(y%2)) + pat = ~pat; + uint8_t *p = &displayBuf[ y / 8 * DISPLAY_W + x ]; y = y % 8; if (y) { @@ -362,16 +378,18 @@ void lcd_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t pat, uint8_t a { if (!((att & BLINK) && BLINK_ON_PHASE)) { lcd_vlineStip(x, y, h, pat); - lcd_hlineStip(x, y+h-1, w, pat); lcd_vlineStip(x+w-1, y, h, pat); + if (~att & ROUND) { x+=1; w-=2; } + lcd_hlineStip(x, y+h-1, w, pat); lcd_hlineStip(x, y, w, pat); } } -void lcd_filled_rect(uint8_t x, int8_t y, uint8_t w, uint8_t h, uint8_t att) +void lcd_filled_rect(uint8_t x, int8_t y, uint8_t w, uint8_t h, uint8_t pat, uint8_t att) { for (int8_t i=y; i=0 && i<64) lcd_hline(x, i, w, att); + if (i>=0 && i<64) lcd_hlineStip(x, i, w, pat, att); + if (pat != 0xff) pat = ~pat; } } @@ -387,6 +405,7 @@ void putsTime(uint8_t x,uint8_t y,int16_t tme,uint8_t att,uint8_t att2) lcd_outdezNAtt(lcd_lastPos+FW, y, tme%60, att2|LEADING0|LEFT, 2); } +// TODO to be optimized with putsTelemetryValue void putsVolts(uint8_t x, uint8_t y, uint16_t volts, uint8_t att) { lcd_outdezAtt(x, y, (int16_t)volts, att | ((att&PREC2)==PREC2 ? 0 : PREC1)); @@ -493,29 +512,71 @@ void putsTmrMode(uint8_t x, uint8_t y, int8_t mode, uint8_t att) #ifdef FRSKY // TODO move this into frsky.cpp -void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, uint8_t val, uint8_t att) +void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, int16_t val, uint8_t att) { - // TODO optimize this, avoid int32_t - int16_t converted_value = ((int32_t)val+g_model.frsky.channels[channel].offset) * g_model.frsky.channels[channel].ratio * 2 / 51; - if (g_model.frsky.channels[channel].type == UNIT_VOLTS && converted_value < 1000) { - att |= PREC2; + // TODO enum + + switch (channel) { + case 0: + case 1: + // A1 and A2 + { + // TODO optimize this, avoid int32_t + int16_t converted_value = ((int32_t)val+g_model.frsky.channels[channel].offset) * g_model.frsky.channels[channel].ratio * 2 / 51; + if (g_model.frsky.channels[channel].type >= UNIT_RAW) { + converted_value /= 10; + } + else { + if (converted_value < 1000) { + att |= PREC2; + } + else { + converted_value /= 10; + att |= PREC1; + } + } + putsTelemetryValue(x, y, converted_value, g_model.frsky.channels[channel].type, att); + } + break; + + case 2: + // Altitude + putsTelemetryValue(x, y, val * 4, UNIT_METERS, att); + break; + + case 3: + // RPMs + lcd_outdezAtt(x, y, (int16_t)val * 50, att); + break; + + case 4: + // FUEL + putsTelemetryValue(x, y, val, UNIT_PERCENT, att); + break; + + case 5: + case 6: + // TEMPERATURE + putsTelemetryValue(x, y, val, UNIT_DEGREES, att); + break; + + case 7: + // SPEED + putsTelemetryValue(x, y, val*2, UNIT_KMH, att); + break; + + case 8: + // CELL + putsVolts(x, y, val*2, att); + break; } - else { - converted_value /= 10; - } - putsTelemetryValue(x, y, converted_value, g_model.frsky.channels[channel].type, att); } void putsTelemetryValue(uint8_t x, uint8_t y, int16_t val, uint8_t unit, uint8_t att) { - if (unit == UNIT_VOLTS) { - putsVolts(x, y, val, att); - } - else { - lcd_outdezAtt(x, (att & DBLSIZE ? y - FH : y), val, att); // TODO we could add this test inside lcd_outdezAtt! - if (~att & NO_UNIT && unit != UNIT_RAW) - lcd_putsnAtt(lcd_lastPos+1, y, STR_VTELEMUNIT+LEN_VTELEMUNIT*unit, LEN_VTELEMUNIT, 0); - } + lcd_outdezAtt(x, (att & DBLSIZE ? y - FH : y), val, att); // TODO we could add this test inside lcd_outdezAtt! + if (~att & NO_UNIT && unit != UNIT_RAW) + lcd_putsnAtt(lcd_lastPos+1, y, STR_VTELEMUNIT+LEN_VTELEMUNIT*unit, LEN_VTELEMUNIT, 0); } #endif diff --git a/src/lcd.h b/src/lcd.h index 66e5332f3..5dc328971 100644 --- a/src/lcd.h +++ b/src/lcd.h @@ -59,6 +59,7 @@ /* line, rect, square flags */ #define BLACK 0x02 #define WHITE 0x04 +#define ROUND 0x08 /* other flags */ #define NO_UNIT UNSIGN @@ -72,7 +73,8 @@ extern void lcd_putcAtt(unsigned char x,unsigned char y,const char c,uint8_t mod extern void lcd_putsAtt(unsigned char x,unsigned char y,const pm_char * s,uint8_t mode); extern void lcd_putsnAtt(unsigned char x,unsigned char y,const pm_char * s,unsigned char len,uint8_t mode); -extern void lcd_puts_P(unsigned char x,unsigned char y,const pm_char * s); +extern void lcd_puts(unsigned char x,unsigned char y,const pm_char * s); +extern void lcd_putsLeft(unsigned char y, const pm_char * s); extern void lcd_putsn_P(unsigned char x,unsigned char y,const pm_char * s,unsigned char len); extern void lcd_outhex4(unsigned char x,unsigned char y,uint16_t val); @@ -99,19 +101,22 @@ extern void putsTime(uint8_t x,uint8_t y, int16_t tme, uint8_t att, uint8_t att2 #ifdef FRSKY // TODO move this into frsky.h -void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, uint8_t val, uint8_t att); +void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, int16_t val, uint8_t att); void putsTelemetryValue(uint8_t x, uint8_t y, int16_t val, uint8_t unit, uint8_t att); #endif +#define SOLID 0xff +#define DOTTED 0x55 + extern void lcd_plot(unsigned char x, unsigned char y, uint8_t att=0); extern void lcd_hline(unsigned char x, unsigned char y, uint8_t w, uint8_t att=0); extern void lcd_hlineStip(int8_t x, uint8_t y, uint8_t w, uint8_t pat, uint8_t att=0); extern void lcd_vline(uint8_t x, int8_t y, int8_t h); extern void lcd_vlineStip(uint8_t x, int8_t y, int8_t h, uint8_t pat); -extern void lcd_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t pat=0xff, uint8_t att=0); -extern void lcd_filled_rect(uint8_t x, int8_t y, uint8_t w, uint8_t h, uint8_t att=0); -inline void lcd_square(uint8_t x, uint8_t y, uint8_t w, uint8_t att=0) { lcd_rect(x, y, w, w, 0xff, att); } +extern void lcd_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t pat=SOLID, uint8_t att=0); +extern void lcd_filled_rect(uint8_t x, int8_t y, uint8_t w, uint8_t h, uint8_t pat=SOLID, uint8_t att=0); +inline void lcd_square(uint8_t x, uint8_t y, uint8_t w, uint8_t att=0) { lcd_rect(x, y, w, w, SOLID, att); } #define DO_CROSS(xx,yy,ww) \ lcd_vline(xx,yy-ww/2,ww); \ diff --git a/src/main_views.cpp b/src/main_views.cpp index 1b37c2f3e..e7da9ce40 100644 --- a/src/main_views.cpp +++ b/src/main_views.cpp @@ -40,11 +40,11 @@ uint8_t tabViews[] = { 2, /*e_inputs*/ 1, /*e_timer2*/ #if defined(FRSKY_HUB) - 4, /*e_telemetry*/ + 5, /*e_telemetry*/ #elif defined(WS_HOW_HIGH) - 3, /*e_telemetry*/ + 4, /*e_telemetry*/ #elif defined(FRSKY) - 2, /*e_telemetry*/ + 3, /*e_telemetry*/ #endif }; @@ -67,8 +67,8 @@ void doMainScreenGrphics() DO_CROSS(LBOX_CENTERX,LBOX_CENTERY,3) DO_CROSS(RBOX_CENTERX,RBOX_CENTERY,3) - lcd_square(LBOX_CENTERX+(calibratedStick[CONVERT_MODE(0+1)-1]*BOX_LIMIT/(2*RESX))-MARKER_WIDTH/2, LBOX_CENTERY-(calibratedStick[CONVERT_MODE(1+1)-1]*BOX_LIMIT/(2*RESX))-MARKER_WIDTH/2, MARKER_WIDTH); - lcd_square(RBOX_CENTERX+(calibratedStick[CONVERT_MODE(3+1)-1]*BOX_LIMIT/(2*RESX))-MARKER_WIDTH/2, RBOX_CENTERY-(calibratedStick[CONVERT_MODE(2+1)-1]*BOX_LIMIT/(2*RESX))-MARKER_WIDTH/2, MARKER_WIDTH); + lcd_square(LBOX_CENTERX+(calibratedStick[CONVERT_MODE(0+1)-1]*BOX_LIMIT/(2*RESX))-MARKER_WIDTH/2, LBOX_CENTERY-(calibratedStick[CONVERT_MODE(1+1)-1]*BOX_LIMIT/(2*RESX))-MARKER_WIDTH/2, MARKER_WIDTH, ROUND); + lcd_square(RBOX_CENTERX+(calibratedStick[CONVERT_MODE(3+1)-1]*BOX_LIMIT/(2*RESX))-MARKER_WIDTH/2, RBOX_CENTERY-(calibratedStick[CONVERT_MODE(2+1)-1]*BOX_LIMIT/(2*RESX))-MARKER_WIDTH/2, MARKER_WIDTH, ROUND); // Optimization by Mike Blandford { @@ -81,11 +81,31 @@ void doMainScreenGrphics() } } +#if defined(FRSKY) +void displayA1A2(uint8_t x, uint8_t y, uint8_t idx) +{ + lcd_puts(x, y, PSTR("A :")); + lcd_putc(x+FW, y, '1'+idx); +} + +void displayRssiLine() +{ + lcd_hline(0, 54, 128, 0); // separator + lcd_putsLeft(7*FH+1, STR_TX); lcd_outdezNAtt(4*FW, 7*FH+1, frskyRSSI[1].value, LEADING0, 2); + lcd_rect(25, 57, 38, 7); + lcd_filled_rect(26, 58, 9*frskyRSSI[1].value/25, 5); + lcd_puts(105, 7*FH+1, STR_RX); lcd_outdezNAtt(105+4*FW-1, 7*FH+1, frskyRSSI[0].value, LEADING0, 2); + lcd_rect(65, 57, 38, 7); + uint8_t v = 9*frskyRSSI[0].value/25; + lcd_filled_rect(66+36-v, 58, v, 5); +} +#endif + #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) void displayAltitudeLine(uint8_t x, uint8_t y, uint8_t flags) { - lcd_puts_P(x, y, STR_ALT); - int16_t value = frskyHubData.baroAltitude + baroAltitudeOffset; + lcd_puts(x, y, STR_ALT); + int16_t value = frskyHubData.baroAltitude + frskyHubData.baroAltitudeOffset; putsTelemetryValue(lcd_lastPos, y, value, UNIT_METERS, flags|LEFT); } #endif @@ -248,11 +268,11 @@ void menuMainView(uint8_t event) uint8_t xm, ym; xm = x[CONVERT_MODE(i+1)-1]; - uint8_t att = 0; + uint8_t att = ROUND; int16_t val = getTrimValue(getTrimFlightPhase(i, phase), i); if (val < -125 || val > 125) - att = BLINK; + att = BLINK|ROUND; if (val < -(TL+1)*4) val = -(TL+1); @@ -265,7 +285,6 @@ void menuMainView(uint8_t event) ym = 31; lcd_vline(xm, ym-TL, TL*2); if (i!=2 || !g_model.thrTrim) { - // TODO square? lcd_vline(xm-1, ym-1, 3); lcd_vline(xm+1, ym-1, 3); } @@ -288,7 +307,7 @@ void menuMainView(uint8_t event) uint8_t x0,y0; int16_t val = g_chans512[i]; //val += g_model.limitData[i].revert ? g_model.limitData[i].offset : -g_model.limitData[i].offset; - switch(view_base) // TODO optim with if (view_base == e_e_outputValues) ... else ... + switch(view_base) { case e_outputValues: x0 = (i%4*9+3)*FW/2; @@ -305,19 +324,18 @@ void menuMainView(uint8_t event) #define WBAR2 (50/2) x0 = i<4 ? 128/4+2 : 128*3/4-2; y0 = 38+(i%4)*5; - int8_t l = (abs(val) * WBAR2 + 512) / 1024; - if(l>WBAR2) l = WBAR2; // prevent bars from going over the end - comment for debugging - lcd_hlineStip(x0-WBAR2,y0,WBAR2*2+1,0x55); + int8_t len = (abs(val) * WBAR2 + 512) / 1024; + if(len>WBAR2) len = WBAR2; // prevent bars from going over the end - comment for debugging + lcd_hlineStip(x0-WBAR2, y0, WBAR2*2+1, DOTTED); lcd_vline(x0,y0-2,5); - // TODO optim - if(val>0){ + if (val>0){ x0+=1; }else{ - x0-=l; + x0-=len; } - lcd_hline(x0,y0+1,l); - lcd_hline(x0,y0-1,l); + lcd_hline(x0,y0+1,len); + lcd_hline(x0,y0-1,len); break; } } @@ -340,103 +358,98 @@ void menuMainView(uint8_t event) V_BAR(SCREEN_WIDTH/2-5*4+2+i*5, SCREEN_HEIGHT-8, len) } for (uint8_t i=0; i<12; i++) { - if ((i%6) < 3) lcd_puts_P(i<6 ? 2*FW-2 : 16*FW-2, (i%3)*FH+4*FH, STR_SW); + if ((i%6) < 3) lcd_puts(i<6 ? 2*FW-2 : 16*FW-2, (i%3)*FH+4*FH, STR_SW); lcd_putcAtt((i<6 ? 2*FW-2 : 16*FW-2) + 2 * FW + ((i%6) < 3 ? 0 : FW), (i%3)*FH+4*FH, i<9 ? '1'+i : 'A'+i-9, getSwitch(10+i, 0) ? INVERS : 0); } } } #if defined(FRSKY) else if (view_base == e_telemetry) { - static uint8_t displayCount = 0; - static uint8_t staticTelemetry[2]; - static uint8_t staticRSSI[2]; - static bool alarmRaised[2]; - if (frskyStreaming) { uint8_t y0, x0, blink; - if (!displayCount) { - for (int i=0; i<2; i++) { - staticTelemetry[i] = frskyTelemetry[i].value; - staticRSSI[i] = frskyRSSI[i].value; - alarmRaised[i] = FRSKY_alarmRaised(i); - } - } - displayCount = (displayCount+1) % 50; + if (view == e_telemetry+ALTERNATE_VIEW) { + // The bars + uint8_t bars_height = 5; + for (int8_t i=3; i>=0; i--) { + if (g_model.frsky.bars[i].source && (63-g_model.frsky.bars[i].barMax) > g_model.frsky.bars[i].barMin) { + lcd_putsnAtt(0, bars_height+bars_height+1+i*(bars_height+6), STR_VTELEMBARS+LEN_VTELEMBARS*g_model.frsky.bars[i].source, LEN_VTELEMBARS, 0); + lcd_rect(25, bars_height+6+i*(bars_height+6), 101, bars_height+2); + int16_t value = getValue(CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+g_model.frsky.bars[i].source-1); + uint8_t threshold = 0, thresholdX = 0; + if (g_model.frsky.bars[i].source <= 2) + threshold = g_model.frsky.channels[g_model.frsky.bars[i].source-1].alarms_value[0]; + else + threshold = barsThresholds[g_model.frsky.bars[i].source-3]; + if (threshold) { + thresholdX = (uint8_t)(int16_t)((int16_t)100 * (threshold - g_model.frsky.bars[i].barMin * 4) / ((63 - g_model.frsky.bars[i].barMax) * 4 - g_model.frsky.bars[i].barMin * 4)); + if (thresholdX > 100) + thresholdX = 0; + } + uint8_t width = (uint8_t)limit((int16_t)0, (int16_t)((int16_t)100 * (value - g_model.frsky.bars[i].barMin * 4) / ((63 - g_model.frsky.bars[i].barMax) * 4 - g_model.frsky.bars[i].barMin * 4)), (int16_t)100); + lcd_filled_rect(26, bars_height+6+1+i*(bars_height+6), width, bars_height, (threshold > value) ? DOTTED : SOLID); + for (uint8_t j=50; j<125; j+=25) + if (j>thresholdX) lcd_vline(j, bars_height+6+1+i*(bars_height+6), bars_height); + if (thresholdX) { + lcd_vlineStip(26+thresholdX, bars_height+4+i*(bars_height+6), bars_height+3, DOTTED); + lcd_hline(25+thresholdX, bars_height+4+i*(bars_height+6), 3); + } + } + else { + bars_height += 2; + } + } + + displayRssiLine(); + } + else if (view == e_telemetry+2*ALTERNATE_VIEW) { + // Big A1 / A2 with min and max if (g_model.frsky.channels[0].ratio || g_model.frsky.channels[1].ratio) { x0 = 0; - for (int i=0; i<2; i++) { + for (uint8_t i=0; i<2; i++) { if (g_model.frsky.channels[i].ratio) { - blink = (alarmRaised[i] ? INVERS : 0); - lcd_puts_P(x0, 3*FH, PSTR("A :")); - lcd_putc(x0+FW, 3*FH, '1'+i); + blink = (FRSKY_alarmRaised(i) ? INVERS : 0); + displayA1A2(x0, 2*FH, i); x0 += 3*FW; - putsTelemetryChannel(x0, 2*FH, i, staticTelemetry[i], blink|DBLSIZE|LEFT); - putsTelemetryChannel(x0+FW, 4*FH, i, frskyTelemetry[i].min, 0); - putsTelemetryChannel(x0+3*FW, 4*FH, i, frskyTelemetry[i].max, LEFT); + putsTelemetryChannel(x0, 2*FH, i, frskyTelemetry[i].value, blink|DBLSIZE|LEFT); + putsTelemetryChannel(x0+FW, 3*FH, i, frskyTelemetry[i].min, 0); + putsTelemetryChannel(x0+3*FW, 3*FH, i, frskyTelemetry[i].max, LEFT); x0 = 11*FW-2; } } } -#if 0 - // Display RX Batt Volts only if a valid channel (A1/A2) has been selected - if (g_eeFrsky.rxVoltsChannel >0) + // Cells voltage + lcd_putsLeft( 5*FH-3, PSTR("V1=\004V2=\004V3=")) ; + lcd_putsLeft( 6*FH-3, PSTR("V4=\004V5=\004V6=")); { - y+=FH; lcd_puts_P(2*FW, y, STR_RXBATT); - // Rx batt voltage bar frame - - // Minimum voltage - lcd_vline(3, 58, 6); // marker - - y = 6*FH; - putsVolts(1, y, g_eeFrsky.rxVoltsBarMin, LEFT); - uint8_t middleVolts = g_eeFrsky.rxVoltsBarMin+(g_eeFrsky.rxVoltsBarMax - g_eeFrsky.rxVoltsBarMin)/2; - putsVolts(64-FW, y, middleVolts, LEFT); - lcd_vline(64, 58, 6); // marker - putsVolts(128-FW, y, g_eeFrsky.rxVoltsBarMax, 0); - lcd_vline(125, 58, 6); // marker - - // Rx Batt: volts (255 == g_eefrsky.rxVoltsMax) - uint16_t centaVolts = (voltsVal > 0) ? (10 * (uint16_t)g_eeFrsky.rxVoltsMax * (uint32_t)(voltsVal) / 255) + g_eeFrsky.rxVoltsOfs : 0; - lcd_outdezAtt(13*FW, 4*FH, centaVolts, 0|PREC2); - lcd_putc(13*FW, 4*FH, 'v'); - - // draw the actual voltage bar - uint16_t centaVoltsMin = 10 * g_eeFrsky.rxVoltsBarMin; - if (centaVolts >= centaVoltsMin) - { - uint8_t vbarLen = (centaVolts - (10 * (uint16_t)g_eeFrsky.rxVoltsBarMin)) * 12 - / (g_eeFrsky.rxVoltsBarMax - g_eeFrsky.rxVoltsBarMin); - for (uint8_t i = 59; i < 63; i++) // Bar 4 pixels thick (high) - lcd_hline(4, i, (vbarLen > 120) ? 120 : vbarLen); + uint8_t x, y; + x = 6*FW; + y = 6*FH-3; + for (uint8_t k=0; k7*FH) return; }subN++; @@ -433,28 +433,28 @@ void menuProcModel(uint8_t event) } if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs NUM_POTS) idx = NUM_STICKS+2+3+NUM_PPM+g_model.thrTraceSrc; else if (g_model.thrTraceSrc > 0) idx = NUM_STICKS+g_model.thrTraceSrc; @@ -464,14 +464,14 @@ void menuProcModel(uint8_t event) }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs0 ? BLINK : INVERS):0)); 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_puts(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)); } #ifdef DSM2 @@ -511,7 +511,7 @@ void menuProcModel(uint8_t event) if (sub==subN && (s_editMode>0 || p1valdiff || (g_model.protocol!=0 && g_model.protocol!=PROTO_DSM2))) { // TODO avoid DSM2 when not defined switch (m_posHorz) { case 0: - CHECK_INCDEC_MODELVAR(event,g_model.protocol,0,PROT_MAX); + CHECK_INCDEC_MODELVAR(event,g_model.protocol,0,PROTO_MAX-1); break; case 1: #ifdef DSM2 @@ -531,8 +531,8 @@ void menuProcModel(uint8_t event) if(s_pgOfs0 ? BLINK : INVERS) : 0) | PREC1|LEFT); lcd_putsnAtt(PARAM_OFS+6*FW, y, STR_POSNEG+LEN_POSNEG*g_model.pulsePol, LEN_POSNEG, (sub==subN && m_posHorz==1) ? INVERS : 0); if(sub==subN && (s_editMode>0 || p1valdiff)) { @@ -549,7 +549,7 @@ void menuProcModel(uint8_t event) // TODO port PPM16 ppmDelay from er9x #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_putsLeft( 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)) { @@ -594,16 +594,16 @@ void menuProcPhaseOne(uint8_t event) uint8_t attr = sub==k ? INVERS : 0; switch(i) { case 0: - lcd_puts_P(0, y, STR_NAME); + lcd_putsLeft( y, STR_NAME); EditName(10*FW, y, phase->name, sizeof(phase->name), event, attr, m_posHorz); break; case 1: - lcd_puts_P(0, y, STR_SWITCH); + lcd_putsLeft( y, STR_SWITCH); putsSwitches(10*FW, y, phase->swtch, attr); if(attr) CHECK_INCDEC_MODELVAR(event, phase->swtch, -MAX_DRSWITCH, MAX_DRSWITCH); break; case 2: - lcd_puts_P(0, y, STR_TRIMS); + lcd_putsLeft( y, STR_TRIMS); for (uint8_t t=0; t TRIM_EXTENDED_MAX) { @@ -625,12 +625,12 @@ void menuProcPhaseOne(uint8_t event) } break; case 3: - lcd_puts_P(0, y, STR_FADEIN); // TODO lcd_puts_left + lcd_putsLeft( y, STR_FADEIN); lcd_outdezAtt(10*FW, y, phase->fadeIn, attr|LEFT); if(attr) CHECK_INCDEC_MODELVAR(event, phase->fadeIn, 0, 15); break; case 4: - lcd_puts_P(0, y, STR_FADEOUT); + lcd_putsLeft( y, STR_FADEOUT); lcd_outdezAtt(10*FW, y, phase->fadeOut, attr|LEFT); if(attr) CHECK_INCDEC_MODELVAR(event, phase->fadeOut, 0, 15); break; @@ -666,7 +666,7 @@ void menuProcPhasesAll(uint8_t event) putsFlightPhase(0, y, i+1, att); lcd_putsnAtt(4*FW, y, p->name, 6, ZCHAR); if (i == 0) { - lcd_puts_P(11*FW+FW/2, y, STR_DEFAULT); + lcd_puts(11*FW+FW/2, y, STR_DEFAULT); } else { putsSwitches(11*FW+FW/2, y, p->swtch, 0); @@ -709,42 +709,42 @@ void menuProcHeli(uint8_t event) uint8_t subN = 1; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; }subN++; if(s_pgOfs7*FH) return; @@ -862,7 +862,7 @@ void menuProcCurveOne(uint8_t event) lcd_outdezAtt(x, y, crv[i], attr); } - lcd_puts_P(0*FW, 7*FH, STR_MODE); + lcd_puts(0*FW, 7*FH, STR_MODE); lcd_putsnAtt(5*FW-2, 7*FH, STR_CURVMODES+LEN_CURVMODES*(s_editMode<=0)*m_posHorz, LEN_CURVMODES, s_editMode>0 || autoThrStep ? 0 : INVERS); if (s_editMode>0 || autoThrStep) { @@ -1146,29 +1146,29 @@ void menuProcMixOne(uint8_t event) uint8_t attr = sub==i ? INVERS : 0; switch(i) { case 0: - lcd_puts_P( 2*FW,y,STR_SOURCE); + lcd_puts( 2*FW,y,STR_SOURCE); putsChnRaw( FW*10,y,md2->srcRaw,attr); if(attr) CHECK_INCDEC_MODELVAR( event, md2->srcRaw, 1,NUM_XCHNRAW); break; case 1: - lcd_puts_P( 2*FW,y,STR_WEIGHT); + lcd_puts( 2*FW,y,STR_WEIGHT); lcd_outdezAtt(FW*10,y,md2->weight,attr|LEFT); if(attr) CHECK_INCDEC_MODELVAR( event, md2->weight, -125,125); break; case 2: - lcd_puts_P( 2*FW,y,STR_OFFSET); + lcd_puts( 2*FW,y,STR_OFFSET); lcd_outdezAtt(FW*10,y,md2->sOffset,attr|LEFT); if(attr) CHECK_INCDEC_MODELVAR( event, md2->sOffset, -125,125); break; case 3: // TODO hidden when src is not a STICK as it has no sense - lcd_puts_P(2*FW, y, STR_TRIM); + lcd_puts(2*FW, y, STR_TRIM); // lcd_putsnAtt(FW*10, y, STR_OFFON+LEN_OFFON*(1-md2->carryTrim), LEN_OFFON, attr); lcd_putsnAtt(FW*10, y, STR_VMIXTRIMS+LEN_VMIXTRIMS*md2->carryTrim, LEN_VMIXTRIMS, attr); // TODO perhaps could be optimized by reusing STR_OFFON if (attr) CHECK_INCDEC_MODELVAR( event, md2->carryTrim, 0, 2); break; case 4: - lcd_puts_P(2*FW, y, STR_CURVES); + lcd_puts(2*FW, y, STR_CURVES); putsCurve(FW*10, y, md2->curve, attr); if(attr) CHECK_INCDEC_MODELVAR( event, md2->curve, 0,MAX_CURVE5+MAX_CURVE9+7-1); if(attr && md2->curve>=CURVE_BASE && event==EVT_KEY_FIRST(KEY_MENU)){ @@ -1177,17 +1177,17 @@ void menuProcMixOne(uint8_t event) } break; case 5: - lcd_puts_P( 2*FW,y,STR_SWITCH); + lcd_puts( 2*FW,y,STR_SWITCH); putsSwitches(10*FW, y,md2->swtch,attr); if(attr) CHECK_INCDEC_MODELVAR( event, md2->swtch, -MAX_SWITCH, MAX_SWITCH); break; case 6: - lcd_puts_P( 2*FW,y,STR_FPHASE); + lcd_puts( 2*FW,y,STR_FPHASE); putsFlightPhase(10*FW, y, md2->phase, attr); if(attr) CHECK_INCDEC_MODELVAR( event, md2->phase, -MAX_PHASES, MAX_PHASES); break; case 7: - lcd_puts_P( 2*FW,y,STR_WARNING); + lcd_puts( 2*FW,y,STR_WARNING); if(md2->mixWarn) lcd_outdezAtt(FW*10,y,md2->mixWarn,attr|LEFT); else @@ -1195,27 +1195,27 @@ void menuProcMixOne(uint8_t event) if(attr) CHECK_INCDEC_MODELVAR( event, md2->mixWarn, 0,3); break; case 8: - lcd_puts_P( 2*FW,y,STR_MULTPX); + lcd_puts( 2*FW,y,STR_MULTPX); lcd_putsnAtt(10*FW, y, STR_VMLTPX+LEN_VMLTPX*md2->mltpx, LEN_VMLTPX, attr); if(attr) CHECK_INCDEC_MODELVAR( event, md2->mltpx, 0, 2); break; case 9: - lcd_puts_P( 2*FW,y,STR_DELAYDOWN); + lcd_puts( 2*FW,y,STR_DELAYDOWN); lcd_outdezAtt(FW*16,y,md2->delayDown,attr); if(attr) CHECK_INCDEC_MODELVAR( event, md2->delayDown, 0,15); break; case 10: - lcd_puts_P( 2*FW,y,STR_DELAYUP); + lcd_puts( 2*FW,y,STR_DELAYUP); lcd_outdezAtt(FW*16,y,md2->delayUp,attr); if(attr) CHECK_INCDEC_MODELVAR( event, md2->delayUp, 0,15); break; case 11: - lcd_puts_P( 2*FW,y,STR_SLOWDOWN); + lcd_puts( 2*FW,y,STR_SLOWDOWN); lcd_outdezAtt(FW*16,y,md2->speedDown,attr); if(attr) CHECK_INCDEC_MODELVAR( event, md2->speedDown, 0,15); break; case 12: - lcd_puts_P( 2*FW,y,STR_SLOWUP); + lcd_puts( 2*FW,y,STR_SLOWUP); lcd_outdezAtt(FW*16,y,md2->speedUp,attr); if(attr) CHECK_INCDEC_MODELVAR( event, md2->speedUp, 0,15); break; @@ -1254,7 +1254,7 @@ inline void displayMixerLine(uint8_t row, uint8_t mix, uint8_t ch, uint8_t idx, if (s_copyMode) { if ((s_copyMode==COPY_MODE || s_copyTgtOfs == 0) && s_copySrcCh == ch && mix == (s_copySrcIdx + (s_copyTgtOfs<0))) { /* draw a border around the raw on selection mode (copy/move) */ - lcd_rect(22, y-1, DISPLAY_W-1-21, 9, s_copyMode == COPY_MODE ? 0xff : 0x55); + lcd_rect(22, y-1, DISPLAY_W-1-21, 9, s_copyMode == COPY_MODE ? SOLID : DOTTED); } if (row == cur) { @@ -1282,7 +1282,7 @@ inline void displayExpoLine(uint8_t row, uint8_t expo, uint8_t ch, uint8_t idx, if (s_copyMode) { if ((s_copyMode==COPY_MODE || s_copyTgtOfs == 0) && s_copySrcCh == ch && expo == (s_copySrcIdx + (s_copyTgtOfs<0))) { /* draw a border around the raw on selection mode (copy/move) */ - lcd_rect(18, y-1, DISPLAY_W-18, 9, s_copyMode == COPY_MODE ? 0xff : 0x55); + lcd_rect(18, y-1, DISPLAY_W-18, 9, s_copyMode == COPY_MODE ? SOLID : DOTTED); } if (row == cur) { /* invert the raw when it's the current one */ @@ -1304,7 +1304,7 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_) TITLEP(expo ? STR_DREXPO : STR_MIXER); lcd_outdezAtt(lcd_lastPos+2*FW+FW/2, 0, getExpoMixCount(expo)); - lcd_puts_P(lcd_lastPos, 0, expo ? PSTR("/14") : PSTR("/32")); + lcd_puts(lcd_lastPos, 0, expo ? PSTR("/14") : PSTR("/32")); SIMPLE_MENU_NOTITLE(menuTabModel, expo ? e_ExposAll : e_MixAll, s_maxLines); uint8_t sub = m_posVert; @@ -1428,7 +1428,7 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_) if (s_copyMode) { if (s_copyMode == MOVE_MODE && s_pgOfs < cur && cur-s_pgOfs < 8 && s_copySrcCh == ch && s_copyTgtOfs != 0 && i == (s_copySrcIdx + (s_copyTgtOfs<0))) { uint8_t y = (cur-s_pgOfs)*FH; - lcd_rect(22, y-1, DISPLAY_W-1-21, 9, 0x55); + lcd_rect(22, y-1, DISPLAY_W-1-21, 9, DOTTED); cur++; } if (s_currIdx == i) { @@ -1449,7 +1449,7 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_) } while (expo ? (ichn+1 == ch && ed->mode) : (idestCh == ch)); if (s_copyMode == MOVE_MODE && s_pgOfs < cur && cur-s_pgOfs < 8 && s_copySrcCh == ch && i == (s_copySrcIdx + (s_copyTgtOfs<0))) { uint8_t y = (cur-s_pgOfs)*FH; - lcd_rect(22, y-1, DISPLAY_W-1-21, 9, 0x55); + lcd_rect(22, y-1, DISPLAY_W-1-21, 9, DOTTED); cur++; } } @@ -1469,7 +1469,7 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_) putsChn(0, (cur-s_pgOfs)*FH, ch, attr); // show CHx if (s_copyMode == MOVE_MODE && s_copySrcCh == ch) { uint8_t y = (cur-s_pgOfs)*FH; - lcd_rect(22, y-1, DISPLAY_W-1-21, 9, 0x55); + lcd_rect(22, y-1, DISPLAY_W-1-21, 9, DOTTED); } } cur++; @@ -1622,7 +1622,7 @@ void menuProcCustomSwitches(uint8_t event) uint8_t k = 0; int8_t sub = m_posVert - 1; - for(uint8_t i=0; i<7; i++){ + for(uint8_t i=0; i<7; i++) { y=(i+1)*FH; k=i+s_pgOfs; if(k==NUM_CSW) break; @@ -1630,34 +1630,20 @@ void menuProcCustomSwitches(uint8_t event) CustomSwData &cs = g_model.customSw[k]; //write SW names here - lcd_puts_P(0*FW, y, STR_SW); + lcd_puts(0*FW, y, STR_SW); lcd_putc(2*FW, y, k + (k>8 ? 'A'-9: '1')); lcd_putsnAtt(4*FW - 1, y, STR_VCSWFUNC+LEN_VCSWFUNC*cs.func, LEN_VCSWFUNC, m_posHorz==0 ? attr : 0); uint8_t cstate = CS_STATE(cs.func); int8_t v1_min=0, v1_max=NUM_XCHNCSW, v2_min=0, v2_max=NUM_XCHNCSW; - if(cstate == CS_VOFS) + if (cstate == CS_VOFS) { - putsChnRaw(12*FW, y, cs.v1, m_posHorz==1 ? attr : 0); + putsChnRaw(12*FW-2, y, cs.v1, m_posHorz==1 ? attr : 0); #if defined(FRSKY) -#if defined(FRSKY_HUB) - if (cs.v1 > NUM_XCHNCSW-NUM_TELEMETRY+3) { - lcd_outdezAtt(20*FW, y, (128+cs.v2) * 50, m_posHorz==2 ? attr : 0); - v2_min = -128; v2_max = 127; - } - else -#endif -#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) - if (cs.v1 > NUM_XCHNCSW-NUM_TELEMETRY+2) { - lcd_outdezAtt(20*FW, y, (128+cs.v2) * 4, m_posHorz==2 ? attr : 0); - v2_min = -128; v2_max = 127; - } - else -#endif - if (cs.v1 > NUM_XCHNCSW-NUM_TELEMETRY) { - putsTelemetryChannel(20*FW, y, cs.v1+NUM_TELEMETRY-NUM_XCHNCSW-1, 128+cs.v2, m_posHorz==2 ? attr : 0); + if (cs.v1 > NUM_XCHNCSW-NUM_TELEMETRY-MAX_TIMERS+2) { + putsTelemetryChannel(20*FW, y, cs.v1 - (NUM_XCHNCSW-NUM_TELEMETRY-MAX_TIMERS+3), 128+cs.v2, m_posHorz==2 ? attr : 0); v2_min = -128; v2_max = 127; } else @@ -1671,16 +1657,16 @@ void menuProcCustomSwitches(uint8_t event) v2_min = -125; v2_max = 125; } } - else if(cstate == CS_VBOOL) + else if (cstate == CS_VBOOL) { - putsSwitches(13*FW, y, cs.v1, m_posHorz==1 ? attr : 0); + putsSwitches(12*FW-2, y, cs.v1, m_posHorz==1 ? attr : 0); putsSwitches(17*FW, y, cs.v2, m_posHorz==2 ? attr : 0); v1_min = -MAX_SWITCH; v1_max = MAX_SWITCH; v2_min = -MAX_SWITCH; v2_max = MAX_SWITCH; } else // cstate == CS_COMP { - putsChnRaw(12*FW, y, cs.v1, m_posHorz==1 ? attr : 0); + putsChnRaw(12*FW-2, y, cs.v1, m_posHorz==1 ? attr : 0); putsChnRaw(17*FW, y, cs.v2, m_posHorz==2 ? attr : 0); } @@ -1697,14 +1683,16 @@ void menuProcCustomSwitches(uint8_t event) { int8_t v1 = cs.v1; CHECK_INCDEC_MODELVAR(event, cs.v1, v1_min, v1_max); - if (cs.v1 == CHOUT_BASE+NUM_CHNOUT+1 && v1 < cs.v1) cs.v2 = -98; + if (cstate == CS_VOFS) { + if (cs.v1 == CHOUT_BASE+NUM_CHNOUT+1 && v1 < cs.v1) cs.v2 = -98; #ifdef FRSKY - if (cs.v1 == CHOUT_BASE+NUM_CHNOUT+3 && v1 < cs.v1) cs.v2 = -128; + if (cs.v1 == CHOUT_BASE+NUM_CHNOUT+3 && v1 < cs.v1) cs.v2 = -128; #endif - if (cs.v1 == CHOUT_BASE+NUM_CHNOUT && v1 > cs.v1) cs.v2 = 0; + if (cs.v1 == CHOUT_BASE+NUM_CHNOUT && v1 > cs.v1) cs.v2 = 0; #ifdef FRSKY - if (cs.v1 == CHOUT_BASE+NUM_CHNOUT+2 && v1 > cs.v1) cs.v2 = -98; + if (cs.v1 == CHOUT_BASE+NUM_CHNOUT+2 && v1 > cs.v1) cs.v2 = -98; #endif + } break; } case 2: @@ -1838,12 +1826,13 @@ void menuProcSafetySwitches(uint8_t event) #endif #ifdef FRSKY +#define TELEM_COL2 (9*FW+2) void menuProcTelemetry(uint8_t event) { -#if defined FRSKY_HUB || defined WS_HOW_HIGH - MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 12, {0, -1, 1, 0, 2, 2, -1, 1, 0, 2, 2, 0}); +#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) + MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 16, {0, -1, 1, 0, 2, 2, -1, 1, 0, 2, 2, 0, 2, 2, 2, 2}); #else - MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 11, {0, -1, 1, 0, 2, 2, -1, 1, 0, 2, 2}); + MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 15, {0, -1, 1, 0, 2, 2, -1, 1, 0, 2, 2, 2, 2, 2, 2}); #endif int8_t sub = m_posVert; @@ -1866,16 +1855,16 @@ void menuProcTelemetry(uint8_t event) for (int i=0; i<2; i++) { if(s_pgOfs0 || p1valdiff)) { if (m_posHorz == 0) g_model.frsky.channels[i].ratio = checkIncDec(event, g_model.frsky.channels[i].ratio, 0, 255, EE_MODEL); @@ -1887,31 +1876,19 @@ void menuProcTelemetry(uint8_t event) if(s_pgOfs0 || p1valdiff)) g_model.frsky.channels[i].barMin = checkIncDec(event, g_model.frsky.channels[i].barMin, 0, 255, EE_MODEL); - if(sub==subN && m_posHorz==1 && (s_editMode>0 || p1valdiff)) g_model.frsky.channels[i].barMax = checkIncDec(event, g_model.frsky.channels[i].barMax, 0, 255, EE_MODEL); - } - subN++; -#endif - for (int j=0; j<2; j++) { if(s_pgOfs0 || p1valdiff)) { switch (m_posHorz) { @@ -1938,17 +1915,48 @@ void menuProcTelemetry(uint8_t event) #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) if(s_pgOfs0 || p1valdiff)) { + switch (m_posHorz) { + case 0: + CHECK_INCDEC_MODELVAR(event, g_model.frsky.bars[j].source, 0, 9); // TODO enum + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.frsky.bars[j].barMin, 0, 63-g_model.frsky.bars[j].barMax); + break; + case 2: + g_model.frsky.bars[j].barMax = 63 - checkIncDec(event, 63 - g_model.frsky.bars[j].barMax, g_model.frsky.bars[j].barMin, 63, EE_MODEL); + break; + } + } + } + subN++; + } } #endif diff --git a/src/myeeprom.h b/src/myeeprom.h index 4dd56532c..4e90dd178 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -36,7 +36,7 @@ #define WARN_MEM (!(g_eeGeneral.warnOpts & WARN_MEM_BIT)) #define BEEP_VAL ( (g_eeGeneral.warnOpts & WARN_BVAL_BIT) >>3 ) -#define EEPROM_VER 203 +#define EEPROM_VER 204 #ifndef PACK #define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__)) @@ -179,12 +179,14 @@ PACK(typedef struct t_FuncSwData { // Function Switches data enum TelemetryUnit { UNIT_VOLTS, + UNIT_AMPS, UNIT_RAW, UNIT_KTS, UNIT_KMH, UNIT_MPH, UNIT_METERS, UNIT_DEGREES, + UNIT_PERCENT, UNIT_MAX }; @@ -195,16 +197,40 @@ PACK(typedef struct t_FrSkyChannelData { uint8_t alarms_level:4; uint8_t alarms_greater:2; // 0=LT(<), 1=GT(>) uint8_t multiplier:2; // 0=no multiplier, 1=*2 multiplier - uint8_t barMin:4; // minimum for bar display - uint8_t barMax:4; // ditto for max display (would usually = ratio) int8_t offset; }) FrSkyChannelData; +enum BarSource { + BAR_NONE, + BAR_A1, + BAR_A2, + BAR_ALT, +#if defined(FRSKY_HUB) + BAR_RPM, + BAR_FUEL, + BAR_T1, + BAR_T2, + BAR_SPEED, + BAR_CELL, +#endif + BAR_MAX +}; + +PACK(typedef struct t_FrSkyBarData { + uint16_t source:4; + uint16_t barMin:6; // minimum for bar display + uint16_t barMax:6; // ditto for max display (would usually = ratio) +}) FrSkyBarData; + +#define PROTO_NONE 0 #define PROTO_FRSKY_HUB 1 #define PROTO_WS_HOW_HIGH 2 PACK(typedef struct t_FrSkyData { FrSkyChannelData channels[2]; - uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh + uint16_t usrProto:3; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh + uint16_t imperial:1; + uint16_t spare:4; + FrSkyBarData bars[4]; }) FrSkyData; PACK(typedef struct t_SwashRingData { // Swash Ring data @@ -214,11 +240,6 @@ PACK(typedef struct t_SwashRingData { // Swash Ring data uint8_t type:5; uint8_t collectiveSource; uint8_t value; - -/* TODO BSS everything is in comments in menus.cpp, how should it be used? - uint8_t lim; // 0 mean off 100 full deflection - uint8_t chX; // 2 channels to limit - uint8_t chY; // 2 channels to limit */ }) SwashRingData; #define TRIM_EXTENDED_MAX 500 diff --git a/src/nmea.cpp b/src/nmea.cpp index b1da15e6b..7ab30e42f 100644 --- a/src/nmea.cpp +++ b/src/nmea.cpp @@ -442,7 +442,7 @@ void menuProcNMEA1(uint8_t event) title ('1'); - lcd_puts_P ( 2*FW, 1*FH, PSTR("UTC-Time Sat")); + lcd_puts ( 2*FW, 1*FH, PSTR("UTC-Time Sat")); if (rbuf[0][0]) { // show always if data have been received lcd_putcAtt ( 19*FW, 1*FH, sbuf[2], 0); // satellites in view @@ -457,12 +457,12 @@ void menuProcNMEA1(uint8_t event) if ((show_timer == 1) && rbuf[0][0]) { // show the Timer when data have been received - lcd_puts_P ( 2*FW, 4*FH, PSTR("Timer")); // display "Timer" + lcd_puts ( 2*FW, 4*FH, PSTR("Timer")); // display "Timer" putsTime ( 5*FW, 5*FH, (gpstime-gpstimer), DBLSIZE, DBLSIZE); // display difference as mm:ss } else { - lcd_puts_P ( 2*FW, 4*FH, PSTR("Date")); // show the UTC Date + lcd_puts ( 2*FW, 4*FH, PSTR("Date")); // show the UTC Date if (rbuf[1][0]) { lcd_putsnAtt( 2*FW, 5*FH, &rbuf[1][0], 2, APSIZE); // year @@ -561,18 +561,18 @@ void menuProcNMEA2(uint8_t event) } title ('2'); - lcd_puts_P ( 1*FW, 1*FH, PSTR("Altitude Sat Max")); + lcd_puts ( 1*FW, 1*FH, PSTR("Altitude Sat Max")); - lcd_puts_P ( 16*FW, 3*FH, PSTR("Home")); - lcd_puts_P ( 2*FW, 4*FH, PSTR("Lift") ); + lcd_puts ( 16*FW, 3*FH, PSTR("Home")); + lcd_puts ( 2*FW, 4*FH, PSTR("Lift") ); - lcd_puts_P ( 16*FW, 5*FH, PSTR("Beep") ); + lcd_puts ( 16*FW, 5*FH, PSTR("Beep") ); if (beep_on==1) - lcd_puts_P ( 18*FW, 6*FH, PSTR("ON") ); + lcd_puts ( 18*FW, 6*FH, PSTR("ON") ); else - lcd_puts_P ( 17*FW, 6*FH, PSTR("OFF") ); + lcd_puts ( 17*FW, 6*FH, PSTR("OFF") ); lcd_outdezNAtt( 20*FW, 4*FH, home_alt, PREC1, 6); // display home_alt, small characters @@ -629,7 +629,7 @@ void menuProcNMEA2(uint8_t event) lcd_outdezNAtt( 10*FW, 5*FH, lift_alt, DBLSIZE|PREC1, 6); // lift lcd_putcAtt ( 11*FW, 6*FH, sbuf[0], 0); // dimension [m/S] - lcd_puts_P ( 12*FW, 6*FH, PSTR("/S") ); + lcd_puts ( 12*FW, 6*FH, PSTR("/S") ); } } else { @@ -663,7 +663,7 @@ void menuProcNMEA3(uint8_t event) initval (LONG_BUF(1), PACK_RMC, COG); initval (SHORT_BUF(2), PACK_GGA, SAT); // -> sbuf[2] title ('3'); - lcd_puts_P ( 0*FW, 1*FH, PSTR("GrndSpeed[knt] Sat")); + lcd_puts ( 0*FW, 1*FH, PSTR("GrndSpeed[knt] Sat")); if (rbuf[0][0]) // if first position is 00, buffer is empty, taken as false { // any other value is true uint8_t i = 0; @@ -683,7 +683,7 @@ void menuProcNMEA3(uint8_t event) lcd_putcAtt ( 19*FW, 1*FH, sbuf[2], 0); // satellites in view - lcd_puts_P ( 1*FW, 4*FH, PSTR("Course over ground") ); + lcd_puts ( 1*FW, 4*FH, PSTR("Course over ground") ); lcd_putsAtt ( 2*FW, 5*FH, VALSTR(1), APSIZE); // course over ground } @@ -717,7 +717,7 @@ void menuProcNMEA4(uint8_t event) initval (SHORT_BUF(2), PACK_GGA, SAT); // -> sbuf[2] // title of the screen title ('4'); - lcd_puts_P ( 3*FW, 1*FH, PSTR("Latitude Sat")); // line 1 column 3 + lcd_puts ( 3*FW, 1*FH, PSTR("Latitude Sat")); // line 1 column 3 // first buffer into line 2 column 2 if (rbuf[0][0]) { @@ -729,7 +729,7 @@ void menuProcNMEA4(uint8_t event) } else lcd_putsAtt ( 2*FW, 2*FH, val_unknown, APSIZE); - lcd_puts_P ( 3*FW, 4*FH, PSTR("Longitude")); // line 4 column 5 + lcd_puts ( 3*FW, 4*FH, PSTR("Longitude")); // line 4 column 5 // second buffer into line 5 column 2 if (rbuf[0][0]) { diff --git a/src/o9xstrings.cpp b/src/o9xstrings.cpp index 090c11a87..80fadd28d 100644 --- a/src/o9xstrings.cpp +++ b/src/o9xstrings.cpp @@ -24,6 +24,7 @@ const pm_char STR_OPEN9X[] PROGMEM = TR_VFSWFUNC TR_FUNCSOUNDS #ifdef FRSKY + TR_VTELEMBARS TR_VTELEMUNIT TR_VALARM TR_VALARMFN @@ -144,19 +145,13 @@ const pm_char STR_ALT[] PROGMEM = TR_ALT; const pm_char STR_RXBATT[] PROGMEM = TR_RXBATT; const pm_char STR_RX[] PROGMEM = TR_RX; const pm_char STR_TX[] PROGMEM = TR_TX; -const pm_char STR_SPD[] PROGMEM = TR_SPD; -const pm_char STR_TEMP1[] PROGMEM = TR_TEMP1; -const pm_char STR_TEMP2[] PROGMEM = TR_TEMP2; -const pm_char STR_RPM[] PROGMEM = TR_RPM; -const pm_char STR_FUEL[] PROGMEM = TR_FUEL; +const pm_char STR_SPDnMAX[] PROGMEM = TR_SPDnMAX; +const pm_char STR_TEMP1nTEMP2[] PROGMEM = TR_TEMP1nTEMP2; +const pm_char STR_RPMnFUEL[] PROGMEM = TR_RPMnFUEL; const pm_char STR_ACCEL[] PROGMEM = TR_ACCEL; -const pm_char STR_TELE[] PROGMEM = TR_TELE; -const pm_char STR_RSSI[] PROGMEM = TR_RSSI; const pm_char STR_NODATA[] PROGMEM = TR_NODATA; -const pm_char STR_TM1[] PROGMEM = TR_TM1; -const pm_char STR_TM2[] PROGMEM = TR_TM2; -const pm_char STR_THR[] PROGMEM = TR_THR; -const pm_char STR_TH[] PROGMEM = TR_TH; +const pm_char STR_TM1TM2[] PROGMEM = TR_TM1TM2; +const pm_char STR_THRTHP[] PROGMEM = TR_THRTHP; const pm_char STR_TOT[] PROGMEM = TR_TOT; const pm_char STR_TMR1LATMAXUS[] PROGMEM = TR_TMR1LATMAXUS; const pm_char STR_TMR1LATMINUS[] PROGMEM = TR_TMR1LATMINUS; diff --git a/src/o9xstrings.h b/src/o9xstrings.h index ba1af6035..11c544380 100644 --- a/src/o9xstrings.h +++ b/src/o9xstrings.h @@ -37,7 +37,8 @@ extern const pm_char STR_OPEN9X[]; #define OFS_VFSWFUNC (OFS_VCSWFUNC + PSIZE(TR_VCSWFUNC)) #define OFS_FUNCSOUNDS (OFS_VFSWFUNC + PSIZE(TR_VFSWFUNC)) #ifdef FRSKY -#define OFS_VTELEMUNIT (OFS_FUNCSOUNDS + PSIZE(TR_FUNCSOUNDS)) +#define OFS_VTELEMBARS (OFS_FUNCSOUNDS + PSIZE(TR_FUNCSOUNDS)) +#define OFS_VTELEMUNIT (OFS_VTELEMBARS + PSIZE(TR_VTELEMBARS)) #define OFS_VALARM (OFS_VTELEMUNIT + PSIZE(TR_VTELEMUNIT)) #define OFS_VALARMFN (OFS_VALARM + PSIZE(TR_VALARM)) #define OFS_VTELPROTO (OFS_VALARMFN + PSIZE(TR_VALARMFN)) @@ -99,6 +100,7 @@ extern const pm_char STR_OPEN9X[]; #define STR_FUNCSOUNDS (STR_OPEN9X + OFS_FUNCSOUNDS) #ifdef FRSKY +#define STR_VTELEMBARS (STR_OPEN9X + OFS_VTELEMBARS) #define STR_VTELEMUNIT (STR_OPEN9X + OFS_VTELEMUNIT) #define STR_VALARM (STR_OPEN9X + OFS_VALARM) #define STR_VALARMFN (STR_OPEN9X + OFS_VALARMFN) @@ -131,6 +133,7 @@ extern const pm_char STR_OPEN9X[]; // The 0-terminated-strings extern const pm_char STR_POPUPS[]; +#define STR_EXIT (STR_POPUPS + OFS_EXIT) extern const pm_char STR_MENUWHENDONE[]; extern const pm_char STR_FREE[]; #define LEN_FREE PSIZE(TR_FREE) @@ -223,19 +226,13 @@ extern const pm_char STR_ALT[]; extern const pm_char STR_RXBATT[]; extern const pm_char STR_RX[]; extern const pm_char STR_TX[]; -extern const pm_char STR_SPD[]; -extern const pm_char STR_TEMP1[]; -extern const pm_char STR_TEMP2[]; -extern const pm_char STR_RPM[]; -extern const pm_char STR_FUEL[]; +extern const pm_char STR_SPDnMAX[]; +extern const pm_char STR_TEMP1nTEMP2[]; +extern const pm_char STR_RPMnFUEL[]; extern const pm_char STR_ACCEL[]; -extern const pm_char STR_TELE[]; -extern const pm_char STR_RSSI[]; extern const pm_char STR_NODATA[]; -extern const pm_char STR_TM1[]; -extern const pm_char STR_TM2[]; -extern const pm_char STR_THR[]; -extern const pm_char STR_TH[]; +extern const pm_char STR_TM1TM2[]; +extern const pm_char STR_THRTHP[]; extern const pm_char STR_TOT[]; extern const pm_char STR_TMR1LATMAXUS[]; extern const pm_char STR_TMR1LATMINUS[]; diff --git a/src/open9x.cpp b/src/open9x.cpp index b94c3cd15..556919227 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -277,8 +277,9 @@ void applyExpos(int16_t *anas, uint8_t phase) } } +/*TODO evaluate impact FORCEINLINE */ bool s_noStickInputs = false; -FORCEINLINE int16_t getValue(uint8_t i) +int16_t getValue(uint8_t i) { if(i CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+2) + barsThresholds[cs.v1-CHOUT_BASE-NUM_CHNOUT-MAX_TIMERS-3] = 128 + cs.v2; + // TODO CELL? + // FUEL, T1, T2, SPEED + if (cs.v1 > CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+4) + y = (128+cs.v2); // RPMs - if (cs.v1 > CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+3) + else if (cs.v1 > CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+3) y = (128+cs.v2) * 25; else #endif @@ -559,9 +572,9 @@ void alertMessages( const pm_char * s, const pm_char * t ) { lcd_clear(); lcd_putsAtt(64-5*FW,0*FH,STR_ALERT,DBLSIZE); - lcd_puts_P(0,4*FH,s); - lcd_puts_P(0,5*FH,t); - lcd_puts_P(0,6*FH, STR_PRESSANYKEYTOSKIP ) ; + lcd_putsLeft(4*FH,s); + lcd_putsLeft(5*FH,t); + lcd_putsLeft(6*FH, STR_PRESSANYKEYTOSKIP ) ; refreshDisplay(); lcdSetRefVolt(g_eeGeneral.contrast); @@ -650,7 +663,7 @@ void message(const pm_char * s) { lcd_clear(); lcd_putsAtt(64-5*FW, 0*FH, STR_MESSAGE, DBLSIZE); - lcd_puts_P(0,4*FW,s); + lcd_putsLeft(4*FW,s); refreshDisplay(); lcdSetRefVolt(g_eeGeneral.contrast); } @@ -659,8 +672,8 @@ void alert(const pm_char * s, bool defaults) { lcd_clear(); lcd_putsAtt(64-5*FW, 0*FH, STR_ALERT, DBLSIZE); - lcd_puts_P(0,4*FH,s); - lcd_puts_P(64-LEN_PRESSANYKEY*FW/2, 7*FH, STR_PRESSANYKEY); + lcd_putsLeft(4*FH,s); + lcd_puts(64-LEN_PRESSANYKEY*FW/2, 7*FH, STR_PRESSANYKEY); refreshDisplay(); lcdSetRefVolt(defaults ? 25 : g_eeGeneral.contrast); AUDIO_ERROR(); diff --git a/src/open9x.h b/src/open9x.h index 6cfb1046a..c308d376c 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -40,26 +40,9 @@ #include #include #define assert(x) -//disable whole pgmspace functionality for all avr-gcc because -//avr-gcc > 4.2.1 does not work anyway -//http://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg239240.html -//http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734 -// -//Workarounds: -// -//PSTR is fixed below -//all prog_xx definitions must use APM explicitely -//#define __ATTR_PROGMEM__ #include -#undef PROGMEM -#define PROGMEM __attribute__(( section(".progmem.data") )) #include "pgmtypes.h" -#ifdef __cplusplus -#define APM __attribute__(( section(".progmem.data") )) -#undef PSTR -#define PSTR(s) (__extension__({static const pm_char __c[] PROGMEM = (s);&__c[0];})) -#endif #include #include @@ -347,7 +330,7 @@ enum EnumKeys { #define CHOUT_BASE (PPM_BASE+NUM_PPM) #if defined(FRSKY_HUB) -#define NUM_TELEMETRY 4 +#define NUM_TELEMETRY 9 #elif defined(WS_HOW_HIGH) #define NUM_TELEMETRY 3 #elif defined(FRSKY) @@ -397,12 +380,13 @@ 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_PPM16 3 -#define PROT_MAX 3 +enum Protocols { + PROTO_PPM, + PROTO_PXX, + PROTO_DSM2, + PROTO_PPM16, + PROTO_MAX +}; extern uint8_t heartbeat; extern uint32_t inacCounter; @@ -444,26 +428,9 @@ void perMain(); /// Bearbeitet alle zeitkritischen Jobs. /// wie z.B. einlesen aller Eingaenge, Entprellung, Key-Repeat.. void per10ms(); -/// Erzeugt periodisch alle Outputs ausser Bildschirmausgaben. -void zeroVariables(); -/// Liefert den Zustand des Switches 'swtch'. Die Numerierung erfolgt ab 1 -/// (1=SW_ON, 2=SW_ThrCt, 10=SW_Trainer). 0 Bedeutet not conected. -/// Negative Werte erzeugen invertierte Ergebnisse. -/// Die Funktion putsSwitches(..) erzeugt den passenden Ausdruck. -/// -/// \param swtch -/// 0 : not connected. Liefert den Wert 'nc' -/// 1.. MAX_SWITCH : SW_ON .. SW_Trainer -/// -1..-MAX_SWITCH : negierte Werte -/// \param nc Wert, der bei swtch==0 geliefert wird. +int16_t getValue(uint8_t i); bool getSwitch(int8_t swtch, bool nc); -/// Zeigt den Namen des Switches 'swtch' im display an -/// \param x x-koordinate 0..127 -/// \param y y-koordinate 0..63 (nur durch 8 teilbar) -/// \param swtch -MAX_SWITCH .. MAX_SWITCH -/// \param att NO_INV,INVERS,BLINK -/// uint8_t getFlightPhase(); uint8_t getTrimFlightPhase(uint8_t idx, uint8_t phase); @@ -650,7 +617,7 @@ extern volatile uint16_t g_tmr10ms; extern volatile uint8_t g_blinkTmr10ms; extern uint8_t g_beepCnt; extern uint8_t g_beepVal[5]; -// TODO needed? + extern const PROGMEM char modi12x3[]; #include "o9xstrings.h" diff --git a/src/pgmtypes.h b/src/pgmtypes.h index 00b5ed763..6e7d03f95 100644 --- a/src/pgmtypes.h +++ b/src/pgmtypes.h @@ -1,6 +1,32 @@ #ifndef __PGMTYPES__ #define __PGMTYPES__ +/* this is workaround for g++ bug: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734 */ +#if (((__GNUC__ * 1000) + __GNUC_MINOR__) * 1000 + __GNUC_PATCHLEVEL__) < 4006002 +# ifdef __cplusplus +# undef PROGMEM +# define PROGMEM __attribute__(( section(".progmem.data") )) +# undef PSTR +# endif +#endif + +/* old (pre 1.8.0) avr-libc does not have progmem macros compatible with new gcc + * note: even for old gcc, definition was wrong. Old gcc was just more tolerant. */ +#if (((__AVR_LIBC_MAJOR__ * 1000) + __AVR_LIBC_MINOR__) * 1000 + __AVR_LIBC_REVISION__) < 1008000 +# ifndef __PGMSPACE_H_ +# warning "This file should be included after " +# endif +# undef PSTR +# undef PGM_P +# undef PGM_VOID_P +# define PGM_P const char * +# define PGM_VOID_P const void * +#endif + +#ifndef PSTR +# define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s);&__c[0];})) +#endif + typedef void pm_void; typedef char pm_char; typedef unsigned char pm_uchar; diff --git a/src/statistics_views.cpp b/src/statistics_views.cpp index 962c9a824..2b68d1df0 100644 --- a/src/statistics_views.cpp +++ b/src/statistics_views.cpp @@ -35,17 +35,15 @@ void menuProcStatistic(uint8_t event) break; } - lcd_puts_P( 1*FW, FH*1, STR_TM1); + lcd_puts( 1*FW, FH*1, STR_TM1TM2); putsTime( 5*FW, FH*1, s_timerVal[0], 0, 0); - lcd_puts_P( 17*FW, FH*1, STR_TM2); putsTime( 12*FW, FH*1, s_timerVal[1], 0, 0); - lcd_puts_P( 1*FW, FH*2, STR_THR); + lcd_puts( 1*FW, FH*2, STR_THRTHP); putsTime( 5*FW, FH*2, s_timeCumThr, 0, 0); - lcd_puts_P( 17*FW, FH*2, STR_TH); putsTime( 12*FW, FH*2, s_timeCum16ThrP/16, 0, 0); - lcd_puts_P( 17*FW, FH*0, STR_TOT); + lcd_puts( 17*FW, FH*0, STR_TOT); putsTime( 12*FW, FH*0, s_timeCumTot, 0, 0); uint16_t traceRd = s_traceCnt>MAXTRACE ? s_traceWr : 0; @@ -67,7 +65,6 @@ void menuProcStatistic(uint8_t event) } } -// TODO ifdef DEBUG void menuProcDebug(uint8_t event) { TITLE(STR_MENUDEBUG); @@ -87,21 +84,21 @@ void menuProcDebug(uint8_t event) chainMenu(menuMainView); break; } - lcd_puts_P( 0*FW, 1*FH, STR_TMR1LATMAXUS); + lcd_puts( 0*FW, 1*FH, STR_TMR1LATMAXUS); lcd_outdez8(15*FW , 1*FH, g_tmr1Latency_max/2 ); - lcd_puts_P( 0*FW, 2*FH, STR_TMR1LATMINUS); + lcd_puts( 0*FW, 2*FH, STR_TMR1LATMINUS); lcd_outdez8(15*FW , 2*FH, g_tmr1Latency_min/2 ); - lcd_puts_P( 0*FW, 3*FH, STR_TMR1JITTERUS); + lcd_puts( 0*FW, 3*FH, STR_TMR1JITTERUS); lcd_outdez8(15*FW , 3*FH, (g_tmr1Latency_max - g_tmr1Latency_min) /2 ); - lcd_puts_P( 0*FW, 4*FH, STR_TMAINMAXMS); + lcd_puts( 0*FW, 4*FH, STR_TMAINMAXMS); lcd_outdezAtt(15*FW, 4*FH, (g_timeMain*100)/16, PREC2); #ifdef DEBUG - lcd_puts_P( 0*FW, 5*FH, STR_T10MSUS); + lcd_puts( 0*FW, 5*FH, STR_T10MSUS); lcd_outdez8(15*FW , 5*FH, g_time_per10/2 ); #endif #ifndef SIMU - lcd_puts_P( 0*FW, 6*FH, STR_FREESTACKMINB); + lcd_puts( 0*FW, 6*FH, STR_FREESTACKMINB); lcd_outdezAtt(18*FW-1, 6*FH, stack_free(), UNSIGN) ; #endif - lcd_puts_P( 3*FW, 7*FH, STR_MENUTORESET); + lcd_puts( 3*FW, 7*FH, STR_MENUTORESET); } diff --git a/src/translations/en.h b/src/translations/en.h index 394adec3c..50a5685e2 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -8,8 +8,8 @@ #define LEN_NCHANNELS 4 #define TR_NCHANNELS "4CH 6CH 8CH 10CH12CH14CH16CH" -#define LEN_VBEEPER 6 -#define TR_VBEEPER "Quiet ""NoKey ""xShort""Short ""Norm ""Long ""xLong " +#define LEN_VBEEPER 6 +#define TR_VBEEPER "Quiet ""NoKey ""xShort""Short ""Norm ""Long ""xLong " #define LEN_ADCFILTER 4 #define TR_ADCFILTER "SING""OSMP""FILT" @@ -57,7 +57,7 @@ #define TR_VMIXTRIMS "ON ""OFF ""Offset" #define LEN_VCSWFUNC 7 -#define TR_VCSWFUNC "---- ""v>ofs ""vofs""|v|v2 ""v1=v2 ""v1<=v2 " +#define TR_VCSWFUNC "----\0 ""v>ofs ""vofs""|v|v2 ""v1=v2 ""v1<=v2 " #define LEN_VFSWFUNC 13 #ifdef LOGS @@ -70,8 +70,11 @@ #define LEN_FUNCSOUNDS 6 #define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick ""Haptc1""Haptc2""Haptc3" -#define LEN_VTELEMUNIT 4 -#define TR_VTELEMUNIT "v\0 ""-\0 ""kts\0""km/h""M/h\0""m\0 ""@C\0 " +#define LEN_VTELEMBARS 4 +#define TR_VTELEMBARS "---\0""A1\0 ""A2\0 ""ALT\0""RPM\0""FUEL""T1\0 ""T2\0 ""SPD\0""CELL" + +#define LEN_VTELEMUNIT 3 +#define TR_VTELEMUNIT "v\0 ""A\0 ""-\0 ""kts""kmh""M/h""m\0 ""@\0 ""%\0" #define LEN_VALARM 3 #define TR_VALARM "---""Yel""Org""Red" @@ -89,8 +92,8 @@ #define LEN_VTEMPLATES 12 #define TR_VTEMPLATES "Simple 4-CH ""T-Cut ""V-Tail ""Elevon\\Delta""eCCPM ""Heli Setup ""Servo Test " -#define LEN_VSWASHTYPE 6 -#define TR_VSWASHTYPE "--- ""120 ""120X ""140 ""90 " +#define LEN_VSWASHTYPE 4 +#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90 " #define LEN_VKEYS 5 #define TR_VKEYS " Menu"" Exit"" Down"" Up""Right"" Left" @@ -107,12 +110,14 @@ #define LEN_VTMRMODES 3 #define TR_VTMRMODES "OFF""ABS""THs""TH%""THt" -#define LEN_TELEMCHNS 3 #if defined(FRSKY_HUB) -#define TR_TELEMCHNS "AD1AD2ALTRPM" +#define LEN_TELEMCHNS 4 +#define TR_TELEMCHNS "AD1 AD2 ALT RPM FUELT@1 T@2 SPD\0CELL" #elif defined(WS_HOW_HIGH) +#define LEN_TELEMCHNS 3 #define TR_TELEMCHNS "AD1AD2ALT" #elif defined(FRSKY) +#define LEN_TELEMCHNS 3 #define TR_TELEMCHNS "AD1AD2" #endif @@ -120,8 +125,9 @@ #define TR_DSM2MODE "LP4/LP5DSMonlyDSMX " // ZERO TERMINATED STRINGS -#define TR_POPUPS "[MENU] [EXIT]" -#define TR_MENUWHENDONE " [MENU] WHEN DONE" +#define TR_POPUPS "[MENU]\004[EXIT]" +#define OFS_EXIT 7 +#define TR_MENUWHENDONE "[MENU] WHEN DONE" #define TR_FREE "free" #define TR_DELETEMODEL "DELETE MODEL" #define TR_COPYINGMODEL "Copying model..." @@ -143,7 +149,7 @@ #define TR_FADEIN "Fade In" #define TR_FADEOUT "Fade Out" #define TR_DEFAULT "(default)" -#define TR_CHECKTRIMS "Check Trims" +#define TR_CHECKTRIMS "Check\005Trims" #define TR_SWASHTYPE "Swash Type" #define TR_COLLECTIVE "Collective" #define TR_SWASHRING "Swash Ring" @@ -173,7 +179,7 @@ #define TR_COPYTRIMMENU "COPY TRIM [MENU]" #define TR_CV "CV" #define TR_SW "SW" -#define TR_ACHANNEL "A channel" +#define TR_ACHANNEL "A\002channel" #define TR_RANGE "Range" #define TR_BAR "Bar" #define TR_ALARM "Alarm" @@ -199,39 +205,33 @@ #define TR_RXCHANNELORD "Rx Channel Ord" #define TR_MODE2 "Mode" #define TR_SLAVE "Slave" -#define TR_MODESRC "mode % src" +#define TR_MODESRC "mode\003% src" #define TR_MULTIPLIER "Multiplier" #define TR_CAL "Cal" #define TR_EEPROMV "EEPROM v" #define TR_VTRIM "Trim- +" #define TR_BG "BG" -#define TR_MENUTOSTART " [MENU] TO START " -#define TR_SETMIDPOINT " SET MIDPOINT " -#define TR_MOVESTICKSPOTS " MOVE STICKS/POTS " +#define TR_MENUTOSTART "[MENU] TO START" +#define TR_SETMIDPOINT "SET MIDPOINT" +#define TR_MOVESTICKSPOTS "MOVE STICKS/POTS" #define TR_ALT "Alt:" #define TR_RXBATT "Rx Batt:" #define TR_RX "Rx:" #define TR_TX "Tx:" -#define TR_SPD "Spd:" -#define TR_TEMP1 "T@1:" -#define TR_TEMP2 "T@2:" -#define TR_RPM "RPM:" -#define TR_FUEL "Fuel:" +#define TR_SPDnMAX "Spd:\008Max:" +#define TR_TEMP1nTEMP2 "T@1:\007T@2:" +#define TR_RPMnFUEL "RPM:\006Fuel:" #define TR_ACCEL "Acc:" -#define TR_TELE "Tele:" -#define TR_RSSI "RSSI:" #define TR_NODATA "NO DATA" -#define TR_TM1 "TM1" -#define TR_TM2 "TM2" -#define TR_THR "THR" -#define TR_TH "TH%" +#define TR_TM1TM2 "TM1\015TM2" +#define TR_THRTHP "THR\015TH%" #define TR_TOT "TOT" -#define TR_TMR1LATMAXUS "tmr1Lat max us" -#define TR_TMR1LATMINUS "tmr1Lat min us" -#define TR_TMR1JITTERUS "tmr1 Jitter us" -#define TR_TMAINMAXMS "tmain max ms" -#define TR_T10MSUS "t10ms us" -#define TR_FREESTACKMINB "Free Stack min b" +#define TR_TMR1LATMAXUS "tmr1Lat max\004us" +#define TR_TMR1LATMINUS "tmr1Lat min\004us" +#define TR_TMR1JITTERUS "tmr1 Jitter\004us" +#define TR_TMAINMAXMS "tmain max\010ms" +#define TR_T10MSUS "t10ms\010us" +#define TR_FREESTACKMINB "Free Stack min\004b" #define TR_MENUTORESET "[MENU] to reset" #define TR_PPM "PPM" #define TR_CH "CH" diff --git a/src/translations/fr.h b/src/translations/fr.h index c2fdefd61..62b7b9ef2 100644 --- a/src/translations/fr.h +++ b/src/translations/fr.h @@ -57,7 +57,7 @@ #define TR_VMIXTRIMS "ON ""OFF ""Offset" #define LEN_VCSWFUNC 7 -#define TR_VCSWFUNC "---- ""v>ofs ""vofs""|v|v2 ""v1=v2 ""v1<=v2 " +#define TR_VCSWFUNC "----\0 ""v>ofs ""vofs""|v|v2 ""v1=v2 ""v1<=v2 " #define LEN_VFSWFUNC 13 #ifdef LOGS @@ -70,8 +70,11 @@ #define LEN_FUNCSOUNDS 6 #define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick ""Haptc1""Haptc2""Haptc3" -#define LEN_VTELEMUNIT 4 -#define TR_VTELEMUNIT "v\0 ""-\0 ""kts\0""km/h""M/h\0""m\0 ""@C\0 " +#define LEN_VTELEMBARS 4 +#define TR_VTELEMBARS "---\0""A1\0 ""A2\0 ""ALT\0""RPM\0""FUEL""T1\0 ""T2\0 ""SPD\0""CELL" + +#define LEN_VTELEMUNIT 3 +#define TR_VTELEMUNIT "v\0 ""A\0 ""-\0 ""kts""kmh""M/h""m\0 ""@\0 ""%\0" #define LEN_VALARM 3 #define TR_VALARM "---""Yel""Org""Red" @@ -89,8 +92,8 @@ #define LEN_VTEMPLATES 14 #define TR_VTEMPLATES "4 Voies simple""Coupure Gaz ""Empennage V ""Elevon\\Delta ""eCCPM ""Conf.Helico ""Servo Test " -#define LEN_VSWASHTYPE 6 -#define TR_VSWASHTYPE "--- ""120 ""120X ""140 ""90 " +#define LEN_VSWASHTYPE 4 +#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90 " #define LEN_VKEYS 5 #define TR_VKEYS " Menu"" Exit"" Bas"" Haut""Droit""Gauch" @@ -107,12 +110,14 @@ #define LEN_VTMRMODES 3 #define TR_VTMRMODES "OFF""ABS""GZs""GZ%""GZt" -#define LEN_TELEMCHNS 3 #if defined(FRSKY_HUB) -#define TR_TELEMCHNS "AD1AD2ALTRPM" +#define LEN_TELEMCHNS 4 +#define TR_TELEMCHNS "AD1 AD2 ALT RPM FUELT@1 T@2 SPD\0CELL" #elif defined(WS_HOW_HIGH) +#define LEN_TELEMCHNS 3 #define TR_TELEMCHNS "AD1AD2ALT" #elif defined(FRSKY) +#define LEN_TELEMCHNS 3 #define TR_TELEMCHNS "AD1AD2" #endif @@ -120,8 +125,9 @@ #define TR_DSM2MODE "LP4/LP5DSMonlyDSMX " // ZERO TERMINATED STRINGS -#define TR_POPUPS "[MENU] [EXIT]" -#define TR_MENUWHENDONE " [MENU]Quand PRET" +#define TR_POPUPS "[MENU]\004[EXIT]" +#define OFS_EXIT 7 +#define TR_MENUWHENDONE "[MENU]Quand PRET" #define TR_FREE "libre" #define TR_DELETEMODEL "SUPPRIMER MODELE" #define TR_COPYINGMODEL "Copie..." @@ -143,7 +149,7 @@ #define TR_FADEIN "Fade In" #define TR_FADEOUT "Fade Out" #define TR_DEFAULT "(defaut)" -#define TR_CHECKTRIMS "Verif Trims" +#define TR_CHECKTRIMS "Verif\005Trims" #define TR_SWASHTYPE "Type de Plateau" #define TR_COLLECTIVE "Collectif" #define TR_SWASHRING "Swash Ring" @@ -173,7 +179,7 @@ #define TR_COPYTRIMMENU "COPIER TRIM [MENU]" #define TR_CV "CV" #define TR_SW "SW" -#define TR_ACHANNEL "A voie" +#define TR_ACHANNEL "A\002voie" #define TR_RANGE "Range" #define TR_BAR "Bar" #define TR_ALARM "Alarme" @@ -199,40 +205,33 @@ #define TR_RXCHANNELORD "Ordre Voies Rx" #define TR_MODE2 "Mode" #define TR_SLAVE "Esclave" -#define TR_MODESRC "mode % src" +#define TR_MODESRC "mode\003% src" #define TR_MULTIPLIER "Multiplieur" #define TR_CAL "Cal" #define TR_EEPROMV "EEPROM v" #define TR_VTRIM "Trim- +" #define TR_BG "BG" #define TR_MENUTOSTART "[MENU]POUR DEBUT" -#define TR_SETMIDPOINT " SET NEUTRE " -#define TR_MOVESTICKSPOTS " BOUGER MANCHES/POTS " +#define TR_SETMIDPOINT "SET NEUTRE" +#define TR_MOVESTICKSPOTS "BOUGER MANCHES/POTS " #define TR_ALT "Alt:" #define TR_RXBATT "Rx Batt:" #define TR_RX "Rx:" #define TR_TX "Tx:" -#define TR_SPD "Spd:" -#define TR_TEMP1 "T@1:" -#define TR_TEMP2 "T@2:" -#define TR_RPM "RPM:" -#define TR_FUEL "Fuel:" -#define TR_VOLTS "Vlts:" +#define TR_SPDnMAX "Spd:\006Max:" +#define TR_TEMP1nTEMP2 "T@1:\007T@2:" +#define TR_RPMnFUEL "RPM:\006Fuel:" #define TR_ACCEL "Acc:" -#define TR_TELE "Tele:" -#define TR_RSSI "RSSI:" #define TR_NODATA "NO DATA" -#define TR_TM1 "TM1" -#define TR_TM2 "TM2" -#define TR_THR "GAZ" -#define TR_TH "TH%" +#define TR_TM1TM2 "TM1\015TM2" +#define TR_THRTHP "THR\015TH%" #define TR_TOT "TOT" -#define TR_TMR1LATMAXUS "tmr1Lat max us" -#define TR_TMR1LATMINUS "tmr1Lat min us" -#define TR_TMR1JITTERUS "tmr1 Jitter us" -#define TR_TMAINMAXMS "tmain max ms" -#define TR_T10MSUS "t10ms us" -#define TR_FREESTACKMINB "Free Stack min b" +#define TR_TMR1LATMAXUS "tmr1Lat max\004us" +#define TR_TMR1LATMINUS "tmr1Lat min\004us" +#define TR_TMR1JITTERUS "tmr1 Jitter\004us" +#define TR_TMAINMAXMS "tmain max\010ms" +#define TR_T10MSUS "t10ms\010us" +#define TR_FREESTACKMINB "Free Stack min\004b" #define TR_MENUTORESET "[MENU]pour reset" #define TR_PPM "PPM" #define TR_CH "CH"