From 0fdb85067af47e0885ed457977640d2129a771ca Mon Sep 17 00:00:00 2001 From: bsongis Date: Thu, 15 Mar 2012 18:37:18 +0000 Subject: [PATCH] Custom Telemetry View FAAST protocol (start pulses before the splash) Templates Confirmation Used channels cleaned before applying a template --- src/frsky.cpp | 262 ++++++++++++++++++++++++------------------ src/frsky.h | 5 + src/lcd.cpp | 84 ++------------ src/lcd.h | 10 +- src/model_menus.cpp | 100 ++++++++++------ src/myeeprom.h | 136 +++++++++++++--------- src/o9xstrings.cpp | 7 +- src/o9xstrings.h | 7 +- src/open9x.cpp | 64 +++++------ src/open9x.h | 12 +- src/templates.cpp | 128 +++++++++++---------- src/templates.h | 12 +- src/translations/en.h | 16 +-- src/translations/fr.h | 14 +-- src/translations/se.h | 16 +-- 15 files changed, 435 insertions(+), 438 deletions(-) diff --git a/src/frsky.cpp b/src/frsky.cpp index 1507cdc02..b7e75a9ed 100644 --- a/src/frsky.cpp +++ b/src/frsky.cpp @@ -78,6 +78,7 @@ enum BarThresholdIdx { THLD_T2, THLD_SPEED, THLD_CELL, + THLD_DIST, THLD_MAX, }; uint8_t barsThresholds[THLD_MAX]; @@ -228,6 +229,12 @@ void parseTelemHubByte(uint8_t byte) ((uint8_t*)&frskyHubData)[structPos] = lowByte; ((uint8_t*)&frskyHubData)[structPos+1] = byte; + // TODO switch here ... + + if ((uint8_t)structPos == offsetof(FrskyHubData, rpm)) { + frskyHubData.rpm /= (g_model.frsky.blades+2); + } + if ((uint8_t)structPos == offsetof(FrskyHubData, baroAltitude_bp)) { // First received altitude => Altitude offset if (!frskyHubData.baroAltitudeOffset) @@ -647,6 +654,7 @@ void resetTelemetry() frskyTelemetry[0].set(120); frskyRSSI[0].set(75); frskyHubData.fuelLevel = 75; + frskyHubData.rpm = 12000; frskyHubData.gpsFix = 1; frskyHubData.gpsLatitude_bp = 4401; @@ -669,20 +677,97 @@ void resetTelemetry() #endif } -enum FrskyViews { - e_frsky_bars, - e_frsky_a1a2, -#ifdef WS_HOW_HIGH - e_frsky_ws_how_high, -#endif -#ifdef FRSKY_HUB - e_frsky_hub = e_frsky_a1a2+1, - e_frsky_gps_inflight, - e_frsky_gps_position, -#endif +int16_t convertTelemValue(uint8_t channel, uint8_t value) +{ + // TODO enum + + int16_t result; + + switch (channel) { + case 2: + // Altitude + result = value * 4; + break; + case 3: + // RPMs + result = value * 50; + break; + case 7: + case 8: + // SPEED + result = value * 2; + break; + case 9: + // DIST + result = value * 8; + break; + default: + result = value; + break; + } + return result; +} + +void putsTelemetryValue(uint8_t x, uint8_t y, int16_t val, uint8_t unit, uint8_t att) +{ + 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_putsiAtt(lcd_lastPos+1, y, STR_VTELEMUNIT, unit, 0); +} + +const pm_uint8_t bchunit_ar[] = { + UNIT_VOLTS, // A1 + UNIT_VOLTS, // A2 + UNIT_METERS, // Alt + UNIT_RAW, // Rpm + UNIT_PERCENT, // Fuel + UNIT_DEGREES, // T1 + UNIT_DEGREES, // T2 + UNIT_KMH, // Speed + UNIT_VOLTS, // Cell + UNIT_METERS // Dist }; -static uint8_t s_frsky_view = e_frsky_bars; +void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, int16_t val, uint8_t att) +{ + 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 << g_model.frsky.channels[channel].multiplier) * 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; + + default: + putsTelemetryValue(x, y, val, pgm_read_byte(bchunit_ar+channel), att); + break; + } +} + +enum FrskyViews { + e_frsky_custom, + e_frsky_bars, + e_frsky_a1a2, + e_frsky_gps_position, // TODO rename + FRSKY_VIEW_MAX = e_frsky_gps_position +}; + +static uint8_t s_frsky_view = e_frsky_custom; void displayRssiLine() { @@ -702,29 +787,6 @@ void displayRssiLine() } } -#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) -void displayAltitudeLine(uint8_t y, uint8_t gps) -{ - lcd_putsLeft(y, STR_ALT); - uint16_t alt; - uint8_t att, x; - if (gps) { - alt = frskyHubData.gpsAltitude_bp; - att = DBLSIZE; - x = 10*FW+1; - } - else { - alt = frskyHubData.baroAltitude_bp; - att = LEFT|DBLSIZE; - x = 4*FW; - } - - putsTelemetryValue(x, y, alt, UNIT_METERS, att); - lcd_putc(14*FW, y, '>'); - putsTelemetryValue(15*FW, y, frskyHubData.maxAltitude, UNIT_METERS, LEFT); -} -#endif - #if defined(FRSKY_HUB) void displayGpsTime() { @@ -739,14 +801,12 @@ void displayGpsTime() } #endif -#if defined(FRSKY_HUB) && defined(WS_HOW_HIGH) -#define FRSKY_VIEW_MAX (g_model.frsky.usrProto == 0 ? 1 : ((g_model.frsky.usrProto == 1 && frskyHubData.gpsFix >= 0) ? 4 : 2)) -#elif defined(FRSKY_HUB) -#define FRSKY_VIEW_MAX (g_model.frsky.usrProto == 0 ? 1 : (frskyHubData.gpsFix >= 0 ? 4 : 2)) -#elif defined(WS_HOW_HIGH) -#define FRSKY_VIEW_MAX (g_model.frsky.usrProto == 0 ? 1 : 2) -#endif - +uint8_t getTelemCustomField(uint8_t line, uint8_t col) +{ + uint8_t result = (col==0 ? (g_model.frskyLines[line] & 0x0f) : ((g_model.frskyLines[line] & 0xf0) >> 4)) << 1; + result += ((g_model.frskyLinesXtra >> (2*line+col)) & 0x01); + return result; +} void menuProcFrsky(uint8_t event) { @@ -781,7 +841,42 @@ void menuProcFrsky(uint8_t event) lcd_filled_rect(0, 0, DISPLAY_W, 8); if (frskyStreaming >= 0) { - if (s_frsky_view == e_frsky_bars) { + if (s_frsky_view == e_frsky_custom) { + // The custom view + for (uint8_t i=0; i<4; i++) { + for (uint8_t j=0; j<2; j++) { + uint8_t field = getTelemCustomField(i, j); + if (i==3) { + lcd_vline(63, 8, 48); + if (frskyStreaming > 0) { + if (field == TELEM_ACC) { + lcd_putsLeft(7*FH+1, STR_ACCEL); + lcd_outdezNAtt(4*FW, 7*FH+1, (int32_t)frskyHubData.accelX/10, LEFT|PREC2); + lcd_outdezNAtt(10*FW, 7*FH+1, (int32_t)frskyHubData.accelY/10, LEFT|PREC2); + lcd_outdezNAtt(16*FW, 7*FH+1, (int32_t)frskyHubData.accelZ/10, LEFT|PREC2); + break; + } + else if (field == TELEM_GPS_TIME) { + displayGpsTime(); + return; + } + } + else { + displayRssiLine(); + return; + } + } + if (field) { + // TODO change name STR_VTELEMBARS + lcd_putsiAtt(j*65, 1+FH+2*FH*i, STR_VTELEMBARS, field, 0); + int16_t value = getValue(CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+field-1); + putsTelemetryChannel(j ? 128 : 63, i==3 ? 1+7*FH : 1+2*FH+2*FH*i, field-1, value, i==3 ? NO_UNIT : DBLSIZE|NO_UNIT); + } + } + } + lcd_filled_rect(0, 7*FH, DISPLAY_W, 8); // TODO optim function? + } + else if (s_frsky_view == e_frsky_bars) { // The bars uint8_t bars_height = 5; for (int8_t i=3; i>=0; i--) { @@ -789,17 +884,20 @@ void menuProcFrsky(uint8_t event) lcd_putsiAtt(0, bars_height+bars_height+1+i*(bars_height+6), STR_VTELEMBARS, g_model.frsky.bars[i].source, 0); lcd_rect(25, bars_height+6+i*(bars_height+6), 101, bars_height+2); int16_t value = getValue(CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+g_model.frsky.bars[i].source-1); - uint8_t threshold = 0, thresholdX = 0; + uint16_t threshold = 0; + uint8_t 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]; + threshold = convertTelemValue(g_model.frsky.bars[i].source-1, barsThresholds[g_model.frsky.bars[i].source-3]); + int16_t barMin = convertTelemValue(g_model.frsky.bars[i].source-1, (g_model.frsky.bars[i].barMin * 5)); + int16_t barMax = convertTelemValue(g_model.frsky.bars[i].source-1, ((51 - g_model.frsky.bars[i].barMax) * 5)); if (threshold) { - thresholdX = (uint8_t)(int16_t)((int16_t)100 * (threshold - g_model.frsky.bars[i].barMin * 4) / ((51 - g_model.frsky.bars[i].barMax) * 5 - g_model.frsky.bars[i].barMin * 4)); + thresholdX = (uint8_t)(int16_t)((int16_t)100 * (threshold - barMin) / (barMax - barMin)); 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 * 5) / ((51 - g_model.frsky.bars[i].barMax) * 4 - g_model.frsky.bars[i].barMin * 4)), (int16_t)100); + uint8_t width = (uint8_t)limit((int16_t)0, (int16_t)(((int16_t)100 * (value - barMin)) / (barMax - barMin)), (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>26+thresholdX) lcd_vline(j, bars_height+6+1+i*(bars_height+6), bars_height); @@ -814,7 +912,7 @@ void menuProcFrsky(uint8_t event) } if (bars_height == 13) { // No bars at all! - s_frsky_view = ((event == EVT_KEY_BREAK(KEY_UP)) ? FRSKY_VIEW_MAX : e_frsky_a1a2); + s_frsky_view = ((event == EVT_KEY_BREAK(KEY_UP)) ? e_frsky_custom : e_frsky_a1a2); } displayRssiLine(); } @@ -847,73 +945,7 @@ void menuProcFrsky(uint8_t event) displayRssiLine(); } - -#ifdef WS_HOW_HIGH - else if (g_model.frsky.usrProto == PROTO_WS_HOW_HIGH && s_frsky_view == e_frsky_ws_how_high) { - displayAltitudeLine(4*FH, 0/*baro*/); - displayRssiLine(); - } -#endif - #ifdef FRSKY_HUB - else if (s_frsky_view == e_frsky_hub) { - // Temperature 1 - lcd_putsLeft( 4*FH, STR_TEMP1nTEMP2); - putsTelemetryValue(4*FW, 4*FH, frskyHubData.temperature1, UNIT_DEGREES, DBLSIZE|LEFT); - - // Temperature 2 - putsTelemetryValue(15*FW, 4*FH, frskyHubData.temperature2, UNIT_DEGREES, DBLSIZE|LEFT); - - // RPM - lcd_putsLeft(2*FH, STR_RPMnFUEL); - lcd_outdezNAtt(4*FW, 1*FH, frskyHubData.rpm/(2+g_model.frsky.blades), DBLSIZE|LEFT); - - // Fuel - putsTelemetryValue(15*FW, 2*FH, frskyHubData.fuelLevel, UNIT_PERCENT, DBLSIZE|LEFT); - - // Altitude (barometric) - displayAltitudeLine(6*FH, 0/*baro*/); - - // Accelerometer -#define ACC_LINE (7*FH+1) - if (frskyStreaming > 0) { - lcd_putsLeft(ACC_LINE, STR_ACCEL); - // lcd_puts(4*FW, 7*FH, PSTR("x:")); - lcd_outdezNAtt(4*FW, ACC_LINE, (int32_t)frskyHubData.accelX/10, LEFT|PREC2); - // lcd_putc(lcd_lastPos, 7*FH, 'g'); - // lcd_puts(11*FW, 7*FH, PSTR("y:")); - lcd_outdezNAtt(10*FW, ACC_LINE, (int32_t)frskyHubData.accelY/10, LEFT|PREC2); - // lcd_putc(lcd_lastPos, 7*FH, 'g'); - // lcd_puts(18*FW, 7*FH, PSTR("z:")); - lcd_outdezNAtt(16*FW, ACC_LINE, (int32_t)frskyHubData.accelZ/10, LEFT|PREC2); - // lcd_putc(lcd_lastPos, 7*FH, 'g'); - lcd_filled_rect(0, ACC_LINE-1, DISPLAY_W, 8); // TODO optim function? - } - else { - displayRssiLine(); - } - } - else if (s_frsky_view == e_frsky_gps_inflight) { - // GPS speed -#define SPEED_LINE (2*FH) - lcd_putsLeft(SPEED_LINE, STR_SPD); - putsTelemetryValue(10*FW+1, SPEED_LINE, frskyHubData.gpsSpeed_bp, UNIT_KTS, DBLSIZE); - lcd_putc(14*FW, SPEED_LINE, '>'); - putsTelemetryValue(15*FW, SPEED_LINE, frskyHubData.maxGpsSpeed, UNIT_KTS, LEFT); - - // GPS altitude -#define ALTITUDE_LINE (4*FH) - displayAltitudeLine(ALTITUDE_LINE, 1/*gps*/); - - // GPS distance -#define DISTANCE_LINE (6*FH) - lcd_putsLeft(DISTANCE_LINE, STR_DST); - putsTelemetryValue(10*FW+1, DISTANCE_LINE, frskyHubData.gpsDistance, UNIT_METERS, DBLSIZE); - lcd_putc(14*FW, DISTANCE_LINE, '>'); - putsTelemetryValue(15*FW, DISTANCE_LINE, frskyHubData.maxGpsDistance, UNIT_METERS, LEFT); - - displayGpsTime(); - } else if (s_frsky_view == e_frsky_gps_position) { // Latitude #define LAT_LINE (2*FH-4) diff --git a/src/frsky.h b/src/frsky.h index bcc3ae2b8..4fb68001d 100644 --- a/src/frsky.h +++ b/src/frsky.h @@ -158,6 +158,11 @@ inline void FRSKY_setModelAlarms(void) bool FRSKY_alarmRaised(uint8_t idx); void resetTelemetry(); +uint8_t getTelemCustomField(uint8_t line, uint8_t col); +int16_t convertTelemValue(uint8_t channel, uint8_t value); + +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 diff --git a/src/lcd.cpp b/src/lcd.cpp index b1d2a095b..fed568fec 100644 --- a/src/lcd.cpp +++ b/src/lcd.cpp @@ -250,7 +250,6 @@ void lcd_outdezNAtt(uint8_t x, uint8_t y, int16_t val, uint8_t flags, uint8_t le uint8_t xn = 0; uint8_t ln = 2; - char c; if (mode != MODE(LEADING0)) { len = 1; @@ -283,9 +282,13 @@ void lcd_outdezNAtt(uint8_t x, uint8_t y, int16_t val, uint8_t flags, uint8_t le x -= fw + 1; for (uint8_t i=1; i<=len; i++) { - c = ((uint16_t)val % 10) + '0'; - if (c=='1' && flags&DBLSIZE && i==len) { x+=2; flags|=CONDENSED; } - lcd_putcAtt(x, y, c, flags); + char c = ((uint16_t)val % 10) + '0'; + uint8_t f = flags; + if (flags & DBLSIZE) { + if (c=='1' && i==len) { x+=2; f|=CONDENSED; } + if (val >= 1000) { x+=FWNUM; f&=~DBLSIZE; } + } + lcd_putcAtt(x, y, c, f); if (mode==i) { flags &= ~PREC2; // TODO not needed but removes 64bytes, could be improved for sure, check asm if (flags & DBLSIZE) { @@ -304,6 +307,7 @@ void lcd_outdezNAtt(uint8_t x, uint8_t y, int16_t val, uint8_t flags, uint8_t le lcd_vline(x+1, y, 8); } } + if ((flags & DBLSIZE) && val >= 1000 && val < 10000) x-=2; val = ((uint16_t)val) / 10; x-=fw; } @@ -560,76 +564,6 @@ void putsTmrMode(uint8_t x, uint8_t y, int8_t mode, uint8_t att) putsSwitches(x, y, mode-(TMR_VAROFS-1), att|SWONLY); } -#ifdef FRSKY -// TODO move this into frsky.cpp -void putsTelemetryChannel(uint8_t x, uint8_t y, uint8_t channel, int16_t val, uint8_t att) -{ - // 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 << g_model.frsky.channels[channel].multiplier) * 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; - } -} - -void putsTelemetryValue(uint8_t x, uint8_t y, int16_t val, uint8_t unit, uint8_t att) -{ - 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_putsiAtt(lcd_lastPos+1, y, STR_VTELEMUNIT, unit, 0); -} -#endif - void lcdSendCtl(uint8_t val) { PORTC_LCD_CTRL &= ~(1<0 ? BLINK|INVERS : INVERS):0)); - if (g_model.protocol == PROTO_PPM) { + if (g_model.protocol == PROTO_PPM || g_model.protocol == PROTO_FAAST) { lcd_putsiAtt(PARAM_OFS+4*FW, y, STR_NCHANNELS, g_model.ppmNCH+2, (sub==subN && m_posHorz==1) ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0); 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 : INVERS) : 0)); @@ -543,7 +543,7 @@ void menuProcModel(uint8_t event) else if (sub==subN) { m_posHorz = 0; } - if (sub==subN && (s_editMode>0 || p1valdiff || (g_model.protocol!=0/*TODO constant*/ && g_model.protocol!=PROTO_DSM2))) { // TODO avoid DSM2 when not defined + if (sub==subN && (s_editMode>0 || p1valdiff || (g_model.protocol!=PROTO_PPM && g_model.protocol!=PROTO_FAAST && g_model.protocol!=PROTO_DSM2))) { // TODO avoid DSM2 when not defined switch (m_posHorz) { case 0: CHECK_INCDEC_MODELVAR(event,g_model.protocol,0,PROTO_MAX-1); @@ -565,7 +565,7 @@ void menuProcModel(uint8_t event) }subN++; if(s_pgOfs0 ? BLINK|INVERS : INVERS) : 0) | PREC1|LEFT); @@ -1686,7 +1686,7 @@ void menuProcCustomSwitches(uint8_t event) #if defined(FRSKY) if (cs.v1 > NUM_XCHNCSW-NUM_TELEMETRY) { - putsTelemetryChannel(20*FW, y, cs.v1 - (NUM_XCHNCSW-NUM_TELEMETRY+1), 128+cs.v2, m_posHorz==2 ? attr : 0); + putsTelemetryChannel(20*FW, y, cs.v1 - (NUM_XCHNCSW-NUM_TELEMETRY+1), convertTelemValue(cs.v1 - (NUM_XCHNCSW-NUM_TELEMETRY+1), 128+cs.v2), m_posHorz==2 ? attr : 0); v2_min = -128; v2_max = 127; } else @@ -1842,9 +1842,9 @@ void menuProcFunctionSwitches(uint8_t event) void menuProcTelemetry(uint8_t event) { #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) - MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 22, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, (uint8_t)-1, 0, 0, (uint8_t)-1, 2, 2, 2, 2}); + MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 27, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, (uint8_t)-1, 0, 0, (uint8_t)-1, 1, 1, 1, 1, (uint8_t)-1, 2, 2, 2, 2}); #else - MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 19, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, (uint8_t)-1, 2, 2, 2, 2}); + MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 24, {0, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 0, 2, 2, (uint8_t)-1, 1, 1, (uint8_t)-1, 1, 1, 1, 1, (uint8_t)-1, 2, 2, 2, 2}); #endif int8_t sub = m_posVert; @@ -1991,6 +1991,36 @@ void menuProcTelemetry(uint8_t event) subN++; #endif + // Display + if(s_pgOfs0 || p1valdiff)) { + CHECK_INCDEC_MODELVAR(event, value, 0, (j==3 && k==0) ? STATUS_MAX : DISPLAY_MAX); + if (checkIncDec_Ret) { + uint8_t mask = 1 << (2*j+k); + if (value & 1) + g_model.frskyLinesXtra |= mask; + else + g_model.frskyLinesXtra &= ~mask; + value >>= 1; + g_model.frskyLines[j] = (k==0 ? ((g_model.frskyLines[j] & 0xf0) + value) : (g_model.frskyLines[j] & 0x0f) + (value << 4)); + } + } + } + } + subN++; + } + // Bars if(s_pgOfs0 || p1valdiff)) { switch (m_posHorz) { case 0: - CHECK_INCDEC_MODELVAR(event, g_model.frsky.bars[j].source, 0, BAR_MAX-1); + CHECK_INCDEC_MODELVAR(event, g_model.frsky.bars[j].source, 0, BAR_MAX); break; case 1: CHECK_INCDEC_MODELVAR(event, g_model.frsky.bars[j].barMin, 0, 50-g_model.frsky.bars[j].barMax); @@ -2029,43 +2059,43 @@ void menuProcTelemetry(uint8_t event) #endif #ifdef TEMPLATES -void menuProcTemplates(uint8_t event) +// TODO s_noHi needed? +void menuProcTemplates(uint8_t _event) { - SIMPLE_MENU(STR_MENUTEMPLATES, menuTabModel, e_Templates, 1+NUM_TEMPLATES+1); + uint8_t event = (s_warning ? 0 : _event); - uint8_t y = 0; - uint8_t k = 0; - int8_t sub = m_posVert - 1; + SIMPLE_MENU(STR_MENUTEMPLATES, menuTabModel, e_Templates, 1+TMPL_COUNT); + + uint8_t sub = m_posVert - 1; + + if (s_confirmation) { + if (sub=0 && sub<(int8_t)NUM_TEMPLATES) - applyTemplate(sub); - if (sub==NUM_TEMPLATES) - clearMixes(); - AUDIO_WARNING2(); + _event = 0; break; } - y=1*FH; - for(uint8_t i=0; i<7; i++){ + uint8_t y = 1*FH; + uint8_t k = 0; + for (uint8_t i=0; i<7 && k7*FH) return; - uint8_t attr = s_noHi ? 0 : ((sub==NUM_TEMPLATES) ? INVERS : 0); - lcd_putsAtt( 1*FW,y,STR_CLEARMIXMENU,attr); - y+=FH; + if (s_warning) { + displayConfirmation(_event); + } } #endif diff --git a/src/myeeprom.h b/src/myeeprom.h index a61a0c60e..3c286f00b 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -147,40 +147,41 @@ PACK(typedef struct t_LimitData { int16_t offset; }) LimitData; -// TODO enum -#define SRC_RUD 1 -#define SRC_ELE 2 -#define SRC_THR 3 -#define SRC_AIL 4 -#define MIX_P1 5 -#define MIX_P2 6 -#define MIX_P3 7 -#define MIX_MAX 8 -#define MIX_3POS 9 -#define MIX_THR 10 -#define MIX_RUD 11 -#define MIX_ELE 12 -#define MIX_ID0 13 -#define MIX_ID1 14 -#define MIX_ID2 15 -#define MIX_AIL 16 -#define MIX_GEA 17 -#define MIX_TRN 18 -#define MIX_SW1 19 -#define MIX_SW9 27 -#define MIX_SWA 28 -#define MIX_SWB 29 -#define MIX_SWC 30 -#define MIX_CYC1 31 -#define MIX_CYC2 32 -#define MIX_CYC3 33 -#define MIX_PPM1 34 -#define MIX_PPM8 41 -#define MIX_CH1 42 -#define MIX_CH9 50 -#define MIX_CH10 51 -#define MIX_CH11 52 -#define MIX_CH16 57 +enum MixSources { + MIXSRC_Rud = 1, + MIXSRC_Ele, + MIXSRC_Thr, + MIXSRC_Ail, + MIXSRC_P1, + MIXSRC_P2, + MIXSRC_P3, + MIXSRC_MAX , + MIXSRC_3POS, + MIXSRC_THR, + MIXSRC_RUD, + MIXSRC_ELE, + MIXSRC_ID0, + MIXSRC_ID1, + MIXSRC_ID2, + MIXSRC_AIL, + MIXSRC_GEA, + MIXSRC_TRN, + MIXSRC_SW1, + MIXSRC_SW9 = MIXSRC_SW1 + 8, + MIXSRC_SWA, + MIXSRC_SWB, + MIXSRC_SWC, + MIXSRC_CYC1, + MIXSRC_CYC2, + MIXSRC_CYC3, + MIXSRC_PPM1, + MIXSRC_PPM8 = MIXSRC_PPM1 + 7, + MIXSRC_CH1, + MIXSRC_CH9 = MIXSRC_CH1 + 8, + MIXSRC_CH10, + MIXSRC_CH11, + MIXSRC_CH16 = MIXSRC_CH11 + 5 +}; #define TRIM_ON 0 #define TRIM_OFF 1 @@ -266,20 +267,29 @@ PACK(typedef struct t_FrSkyChannelData { 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 +enum TelemetrySource { + TELEM_NONE, + TELEM_A1, + TELEM_A2, + TELEM_ALT, + TELEM_RPM, + TELEM_FUEL, + TELEM_T1, + TELEM_T2, + TELEM_SPEED, + TELEM_CELL, + TELEM_DIST, + TELEM_ACCx, + TELEM_ACCy, + TELEM_ACCz, + TELEM_TM1, + TELEM_TM2, + TELEM_ACC, + TELEM_GPS_TIME, + + BAR_MAX = TELEM_DIST, + DISPLAY_MAX = TELEM_TM2, + STATUS_MAX = TELEM_GPS_TIME }; PACK(typedef struct t_FrSkyBarData { @@ -288,9 +298,12 @@ PACK(typedef struct t_FrSkyBarData { 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 +enum FrskyUsrProtocols { + PROTO_NONE, + PROTO_FRSKY_HUB, + PROTO_WS_HOW_HIGH +}; + PACK(typedef struct t_FrSkyData { FrSkyChannelData channels[2]; uint8_t usrProto:3; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh @@ -346,11 +359,20 @@ PACK(typedef struct t_TimerData { uint16_t val; }) TimerData; -#ifdef DSM2 -#define LPXDSM2 0 -#define DSM2only 1 -#define DSM2_DSMX 2 -#endif +enum Protocols { + PROTO_PPM, + PROTO_PXX, + PROTO_DSM2, + PROTO_PPM16, + PROTO_FAAST, + PROTO_MAX +}; + +enum Dsm2Variants { + LPXDSM2, + DSM2only, + DSM2_DSMX +}; PACK(typedef struct t_ModelData { char name[10]; // 10 must be first for eeLoadModelName @@ -379,6 +401,8 @@ PACK(typedef struct t_ModelData { int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; uint8_t modelId; + uint8_t frskyLines[4]; + uint8_t frskyLinesXtra; }) ModelData; extern EEGeneral g_eeGeneral; diff --git a/src/o9xstrings.cpp b/src/o9xstrings.cpp index 33849b645..81329c439 100644 --- a/src/o9xstrings.cpp +++ b/src/o9xstrings.cpp @@ -149,7 +149,7 @@ const pm_char STR_ALARM[] PROGMEM = TR_ALARM; const pm_char STR_USRDATA[] PROGMEM = TR_USRDATA; const pm_char STR_BLADES[] PROGMEM = TR_BLADES; // TODO check that it is optimized away when no FRSKY const pm_char STR_BARS[] PROGMEM = TR_BARS; -const pm_char STR_CLEARMIXMENU[] PROGMEM = TR_CLEARMIXMENU; +const pm_char STR_DISPLAY[] PROGMEM = TR_DISPLAY; const pm_char STR_BEEPERMODE[] PROGMEM = TR_BEEPERMODE; const pm_char STR_BEEPERLEN[] PROGMEM = TR_BEEPERLEN; #if defined(AUDIO) @@ -191,11 +191,6 @@ const pm_char STR_SETMIDPOINT[] PROGMEM = TR_SETMIDPOINT; const pm_char STR_MOVESTICKSPOTS[] PROGMEM = TR_MOVESTICKSPOTS; const pm_char STR_RXBATT[] PROGMEM = TR_RXBATT; const pm_char STR_TX[] PROGMEM = TR_TXnRX; -const pm_char STR_SPD[] PROGMEM = TR_SPD; -const pm_char STR_ALT[] PROGMEM = TR_ALT; -const pm_char STR_DST[] PROGMEM = TR_DST; -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_NODATA[] PROGMEM = TR_NODATA; const pm_char STR_TM1TM2[] PROGMEM = TR_TM1TM2; diff --git a/src/o9xstrings.h b/src/o9xstrings.h index 9248ad5ba..e6220ac69 100644 --- a/src/o9xstrings.h +++ b/src/o9xstrings.h @@ -235,7 +235,7 @@ extern const pm_char STR_ALARM[]; extern const pm_char STR_USRDATA[]; extern const pm_char STR_BLADES[]; extern const pm_char STR_BARS[]; -extern const pm_char STR_CLEARMIXMENU[]; +extern const pm_char STR_DISPLAY[]; extern const pm_char STR_BEEPERMODE[]; extern const pm_char STR_BEEPERLEN[]; extern const pm_char STR_SPKRPITCH[]; @@ -272,11 +272,6 @@ extern const pm_char STR_MOVESTICKSPOTS[]; extern const pm_char STR_RXBATT[]; extern const pm_char STR_TX[]; #define STR_RX (STR_TX+OFS_RX) -extern const pm_char STR_SPD[]; -extern const pm_char STR_ALT[]; -extern const pm_char STR_DST[]; -extern const pm_char STR_TEMP1nTEMP2[]; -extern const pm_char STR_RPMnFUEL[]; extern const pm_char STR_ACCEL[]; extern const pm_char STR_NODATA[]; extern const pm_char STR_TM1TM2[]; diff --git a/src/open9x.cpp b/src/open9x.cpp index 6b7152bec..d70380afa 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -298,9 +298,9 @@ int16_t getValue(uint8_t i) /*srcRaw is shifted +1!*/ if(i CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+2) - barsThresholds[cs.v1-CSW_CHOUT_BASE-NUM_CHNOUT-MAX_TIMERS-3] = 128 + cs.v2; - // TODO CELL? - // FUEL, T1, T2, SPEED - if (cs.v1 > CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+4) - y = (128+cs.v2); - // RPMs - else if (cs.v1 > CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+3) - y = (128+cs.v2) * 25; - else -#endif -#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) - // ALT - if (cs.v1 > CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+2) - y = (128+cs.v2) * 4; - else -#endif - // Volts - if (cs.v1 > CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS) - y = 128+cs.v2; +#if defined(FRSKY) + // Telemetry + if (cs.v1 > CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS) { + y = convertTelemValue(cs.v1-(CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+1), 128+cs.v2); + if (cs.v1 > CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+2/*A1 and A2*/) { + // Fill the threshold array + barsThresholds[cs.v1-CSW_CHOUT_BASE-NUM_CHNOUT-MAX_TIMERS-3] = 128 + cs.v2; + } + } else #endif // Timers @@ -459,7 +446,7 @@ bool __getSwitch(int8_t swtch) bool getSwitch(int8_t swtch, bool nc) { - s_last_switch_used = (nc<<15); + s_last_switch_used = ((uint16_t)nc<<15); return __getSwitch(swtch); } @@ -616,6 +603,8 @@ void checkTHR() getADC_single(); // if thr is down - do not display warning at all #endif int16_t v = anaIn(thrchn); + if (g_eeGeneral.throttleReversed) v = - v; + if(v<=lowLim) return; // first - display warning @@ -631,6 +620,7 @@ void checkTHR() getADC_single(); #endif int16_t v = anaIn(thrchn); + if (g_eeGeneral.throttleReversed) v = - v; if(v<=lowLim || keyDown()) { clearKeyEvents(); @@ -828,7 +818,7 @@ void getADC_filt() while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; - t_ana[0][adc_input] = (t_ana[0][adc_input] + ADCW ) >> 1; + t_ana[0][adc_input] = (t_ana[0][adc_input] + ADCW) >> 1; } } @@ -1261,15 +1251,15 @@ void perOut(uint8_t phase) int16_t v = 0; if (k < NUM_STICKS) v = anas[k]; //Switch is on. MAX=FULL=512 or value. - else if (k>=MIX_CH1-1 && k<=MIX_CH16-1 && k-MIX_CH1+1destCh) // if we've already calculated the value - take it instead - v = chans[k-MIX_CH1+1] / 100; - else if (k>=MIX_THR-1 && k<=MIX_SWC-1) { - v = getSwitch(k-MIX_THR+1+1, 0) ? +1024 : -1024; + else if (k>=MIXSRC_CH1-1 && k<=MIXSRC_CH16-1 && k-MIXSRC_CH1+1destCh) // if we've already calculated the value - take it instead + v = chans[k-MIXSRC_CH1+1] / 100; + else if (k>=MIXSRC_THR-1 && k<=MIXSRC_SWC-1) { + v = getSwitch(k-MIXSRC_THR+1+1, 0) ? +1024 : -1024; if (v<0 && !md->swtch && (md->delayDown || md->delayUp)) sw = false; } else - v = getValue(k <= MIX_3POS ? k : k-MAX_SWITCH); + v = getValue(k <= MIXSRC_3POS ? k : k-MAX_SWITCH); //========== DELAYS =============== if (sw) { // switch on? (if no switch selected => on) @@ -2217,6 +2207,8 @@ int main(void) uint8_t cModel = g_eeGeneral.currModel; + if (g_model.protocol == PROTO_FAAST) startPulses(); + #if defined (PCBV4) if (MCUSR != (1 << PORF)) { #else @@ -2286,7 +2278,7 @@ int main(void) TCCR4B = (1 << WGM42) | (3<srcRaw=SRC_RUD; md->weight=100; - md=setDest(ICC(STK_ELE)); md->srcRaw=SRC_ELE; md->weight=100; - md=setDest(ICC(STK_THR)); md->srcRaw=SRC_THR; md->weight=100; - md=setDest(ICC(STK_AIL)); md->srcRaw=SRC_AIL; md->weight=100; + break; + + // Simple 4-Ch + case TMPL_SIMPLE_4CH: + clearMixes(); + md=setDest(ICC(STK_RUD)); md->srcRaw=MIXSRC_RUD; md->weight=100; + md=setDest(ICC(STK_ELE)); md->srcRaw=MIXSRC_ELE; md->weight=100; + md=setDest(ICC(STK_THR)); md->srcRaw=MIXSRC_THR; md->weight=100; + md=setDest(ICC(STK_AIL)); md->srcRaw=MIXSRC_AIL; md->weight=100; break; // T-Cut - case (1): - md=setDest(ICC(STK_THR)); md->srcRaw=MIX_MAX; md->weight=-100; md->swtch=DSW_THR; md->mltpx=MLTPX_REP; + case TMPL_THR_CUT: + md=setDest(ICC(STK_THR)); md->srcRaw=MIXSRC_MAX; md->weight=-100; md->swtch=DSW_THR; md->mltpx=MLTPX_REP; break; // V-Tail - case (2): - md=setDest(ICC(STK_RUD)); md->srcRaw=SRC_RUD; md->weight= 100; - md=setDest(ICC(STK_RUD)); md->srcRaw=SRC_ELE; md->weight=-100; - md=setDest(ICC(STK_ELE)); md->srcRaw=SRC_RUD; md->weight= 100; - md=setDest(ICC(STK_ELE)); md->srcRaw=SRC_ELE; md->weight= 100; + case TMPL_V_TAIL: + md=setDest(ICC(STK_RUD), true); md->srcRaw=MIXSRC_RUD; md->weight= 100; + md=setDest(ICC(STK_RUD)); md->srcRaw=MIXSRC_ELE; md->weight=-100; + md=setDest(ICC(STK_ELE), true); md->srcRaw=MIXSRC_RUD; md->weight= 100; + md=setDest(ICC(STK_ELE)); md->srcRaw=MIXSRC_ELE; md->weight= 100; break; // Elevon\\Delta - case (3): - md=setDest(ICC(STK_ELE)); md->srcRaw=SRC_ELE; md->weight= 100; - md=setDest(ICC(STK_ELE)); md->srcRaw=SRC_AIL; md->weight= 100; - md=setDest(ICC(STK_AIL)); md->srcRaw=SRC_ELE; md->weight= 100; - md=setDest(ICC(STK_AIL)); md->srcRaw=SRC_AIL; md->weight=-100; + case TMPL_ELEVON_DELTA: + md=setDest(ICC(STK_ELE), true); md->srcRaw=MIXSRC_ELE; md->weight= 100; + md=setDest(ICC(STK_ELE)); md->srcRaw=MIXSRC_AIL; md->weight= 100; + md=setDest(ICC(STK_AIL), true); md->srcRaw=MIXSRC_ELE; md->weight= 100; + md=setDest(ICC(STK_AIL)); md->srcRaw=MIXSRC_AIL; md->weight=-100; break; // eCCPM - case (4): - md=setDest(ICC(STK_ELE)); md->srcRaw=SRC_ELE; md->weight= 72; - md=setDest(ICC(STK_ELE)); md->srcRaw=SRC_THR; md->weight= 55; - md=setDest(ICC(STK_AIL)); md->srcRaw=SRC_ELE; md->weight=-36; - md=setDest(ICC(STK_AIL)); md->srcRaw=SRC_AIL; md->weight= 62; - md=setDest(ICC(STK_AIL)); md->srcRaw=SRC_THR; md->weight= 55; - md=setDest(5); md->srcRaw=SRC_ELE; md->weight=-36; - md=setDest(5); md->srcRaw=SRC_AIL; md->weight=-62; - md=setDest(5); md->srcRaw=SRC_THR; md->weight= 55; + case TMPL_ECCPM: + md=setDest(ICC(STK_ELE), true); md->srcRaw=MIXSRC_ELE; md->weight= 72; + md=setDest(ICC(STK_ELE)); md->srcRaw=MIXSRC_THR; md->weight= 55; + md=setDest(ICC(STK_AIL), true); md->srcRaw=MIXSRC_ELE; md->weight=-36; + md=setDest(ICC(STK_AIL)); md->srcRaw=MIXSRC_AIL; md->weight= 62; + md=setDest(ICC(STK_AIL)); md->srcRaw=MIXSRC_THR; md->weight= 55; + md=setDest(5, true); md->srcRaw=MIXSRC_ELE; md->weight=-36; + md=setDest(5); md->srcRaw=MIXSRC_AIL; md->weight=-62; + md=setDest(5); md->srcRaw=MIXSRC_THR; md->weight= 55; break; // Heli Setup - case (5): + case TMPL_HELI_SETUP: clearMixes(); //This time we want a clean slate clearCurves(); //Set up Mixes - md=setDest(ICC(STK_AIL)); md->srcRaw=MIX_CH9; md->weight= 50; - md=setDest(ICC(STK_AIL)); md->srcRaw=MIX_CH10; md->weight=-100; - md=setDest(ICC(STK_AIL)); md->srcRaw=MIX_CH11; md->weight= 100; md->carryTrim=TRIM_OFF; + md=setDest(ICC(STK_AIL)); md->srcRaw=MIXSRC_CH9; md->weight= 50; + md=setDest(ICC(STK_AIL)); md->srcRaw=MIXSRC_CH10; md->weight=-100; + md=setDest(ICC(STK_AIL)); md->srcRaw=MIXSRC_CH11; md->weight= 100; md->carryTrim=TRIM_OFF; - md=setDest(ICC(STK_ELE)); md->srcRaw=MIX_CH9; md->weight=-100; - md=setDest(ICC(STK_ELE)); md->srcRaw=MIX_CH11; md->weight= 100; md->carryTrim=TRIM_OFF; + md=setDest(ICC(STK_ELE)); md->srcRaw=MIXSRC_CH9; md->weight=-100; + md=setDest(ICC(STK_ELE)); md->srcRaw=MIXSRC_CH11; md->weight= 100; md->carryTrim=TRIM_OFF; - md=setDest(ICC(STK_THR)); md->srcRaw=SRC_THR; md->weight= 100; md->swtch=DSW_ID0; md->curve=CV(1); md->carryTrim=TRIM_OFF; - md=setDest(ICC(STK_THR)); md->srcRaw=SRC_THR; md->weight= 100; md->swtch=DSW_ID1; md->curve=CV(2); md->carryTrim=TRIM_OFF; - md=setDest(ICC(STK_THR)); md->srcRaw=SRC_THR; md->weight= 110; md->swtch=DSW_ID2; md->curve=CV(2); md->carryTrim=TRIM_OFF; - md=setDest(ICC(STK_THR)); md->srcRaw=MIX_MAX; md->weight=-125; md->swtch=DSW_THR; md->mltpx=MLTPX_REP; md->carryTrim=TRIM_OFF; + md=setDest(ICC(STK_THR)); md->srcRaw=MIXSRC_THR; md->weight= 100; md->swtch=DSW_ID0; md->curve=CV(1); md->carryTrim=TRIM_OFF; + md=setDest(ICC(STK_THR)); md->srcRaw=MIXSRC_THR; md->weight= 100; md->swtch=DSW_ID1; md->curve=CV(2); md->carryTrim=TRIM_OFF; + md=setDest(ICC(STK_THR)); md->srcRaw=MIXSRC_THR; md->weight= 110; md->swtch=DSW_ID2; md->curve=CV(2); md->carryTrim=TRIM_OFF; + md=setDest(ICC(STK_THR)); md->srcRaw=MIXSRC_MAX; md->weight=-125; md->swtch=DSW_THR; md->mltpx=MLTPX_REP; md->carryTrim=TRIM_OFF; - md=setDest(ICC(STK_RUD)); md->srcRaw=SRC_RUD; md->weight=100; + md=setDest(ICC(STK_RUD)); md->srcRaw=MIXSRC_RUD; md->weight=100; - md=setDest(4); md->srcRaw=MIX_MAX; md->weight= 50; md->swtch=-DSW_GEA; md->carryTrim=TRIM_OFF; - md=setDest(4); md->srcRaw=MIX_MAX; md->weight=-50; md->swtch= DSW_GEA; md->carryTrim=TRIM_OFF; + md=setDest(4); md->srcRaw=MIXSRC_MAX; md->weight= 50; md->swtch=-DSW_GEA; md->carryTrim=TRIM_OFF; + md=setDest(4); md->srcRaw=MIXSRC_MAX; md->weight=-50; md->swtch= DSW_GEA; md->carryTrim=TRIM_OFF; md=setDest(4); md->srcRaw=STK_P3; md->weight= 40; md->carryTrim=TRIM_OFF; - md=setDest(5); md->srcRaw=MIX_CH9; md->weight= -50; - md=setDest(5); md->srcRaw=MIX_CH10; md->weight=-100; - md=setDest(5); md->srcRaw=MIX_CH11; md->weight=-100; md->carryTrim=TRIM_OFF; + md=setDest(5); md->srcRaw=MIXSRC_CH9; md->weight= -50; + md=setDest(5); md->srcRaw=MIXSRC_CH10; md->weight=-100; + md=setDest(5); md->srcRaw=MIXSRC_CH11; md->weight=-100; md->carryTrim=TRIM_OFF; - md=setDest(8); md->srcRaw=SRC_ELE; md->weight= 60; - md=setDest(9); md->srcRaw=SRC_AIL; md->weight=-52; - md=setDest(10); md->srcRaw=SRC_THR; md->weight= 70; md->swtch=DSW_ID0; md->curve=CV(3); md->carryTrim=TRIM_OFF; - md=setDest(10); md->srcRaw=SRC_THR; md->weight= 70; md->swtch=DSW_ID1; md->curve=CV(4); md->carryTrim=TRIM_OFF; - md=setDest(10); md->srcRaw=SRC_THR; md->weight= 70; md->swtch=DSW_ID2; md->curve=CV(4); md->carryTrim=TRIM_OFF; - md=setDest(10); md->srcRaw=SRC_THR; md->weight=100; md->swtch=DSW_THR; md->curve=CV(5); md->carryTrim=TRIM_OFF; md->mltpx=MLTPX_REP; + md=setDest(8); md->srcRaw=MIXSRC_ELE; md->weight= 60; + md=setDest(9); md->srcRaw=MIXSRC_AIL; md->weight=-52; + md=setDest(10); md->srcRaw=MIXSRC_THR; md->weight= 70; md->swtch=DSW_ID0; md->curve=CV(3); md->carryTrim=TRIM_OFF; + md=setDest(10); md->srcRaw=MIXSRC_THR; md->weight= 70; md->swtch=DSW_ID1; md->curve=CV(4); md->carryTrim=TRIM_OFF; + md=setDest(10); md->srcRaw=MIXSRC_THR; md->weight= 70; md->swtch=DSW_ID2; md->curve=CV(4); md->carryTrim=TRIM_OFF; + md=setDest(10); md->srcRaw=MIXSRC_THR; md->weight=100; md->swtch=DSW_THR; md->curve=CV(5); md->carryTrim=TRIM_OFF; md->mltpx=MLTPX_REP; //Set up Curves setCurve(CURVE5(1), heli_ar1); @@ -197,18 +208,11 @@ void applyTemplate(uint8_t idx) break; // Servo Test - case (6): - md=setDest(14); md->srcRaw=MIX_CH16; md->weight= 100; md->speedUp = 8; md->speedDown = 8; - md=setDest(15); md->srcRaw=MIX_SW1; md->weight= 110; - md=setDest(15); md->srcRaw=MIX_MAX; md->weight=-110; md->swtch=DSW_SW2; md->mltpx=MLTPX_REP; - md=setDest(15); md->srcRaw=MIX_MAX; md->weight= 110; md->swtch=DSW_SW3; md->mltpx=MLTPX_REP; - - setSwitch(1, CS_LESS, CSW_CHOUT_BASE+15, CSW_CHOUT_BASE+16); - setSwitch(2, CS_VPOS, CSW_CHOUT_BASE+15, 105); - setSwitch(3, CS_VNEG, CSW_CHOUT_BASE+15, -105); + case TMPL_SERVO_TEST: + md=setDest(15, true); md->srcRaw=MIXSRC_SW1; md->weight=110; md->mltpx=MLTPX_REP; md->delayUp = 6; md->delayDown = 6; md->speedUp = 8; md->speedDown = 8; + setSwitch(1, CS_VNEG, CSW_CHOUT_BASE+16, 0); break; - default: break; diff --git a/src/templates.h b/src/templates.h index 420588b08..3efef2fd9 100644 --- a/src/templates.h +++ b/src/templates.h @@ -70,7 +70,17 @@ #define CURVE5(x) ((x)-1) #define CURVE9(x) (MAX_CURVE5+(x)-1) -#define NUM_TEMPLATES 7 +enum Templates { + TMPL_CLEAR_MIXES, + TMPL_SIMPLE_4CH, + TMPL_THR_CUT, + TMPL_V_TAIL, + TMPL_ELEVON_DELTA, + TMPL_ECCPM, + TMPL_HELI_SETUP, + TMPL_SERVO_TEST, + TMPL_COUNT +}; void clearMixes(); void clearCurves(); diff --git a/src/translations/en.h b/src/translations/en.h index 28514a951..234e832fb 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -36,7 +36,7 @@ #define TR_RETA123 "RETA123" #define LEN_VPROTOS "\005" -#define TR_VPROTOS "PPM ""PXX ""DSM2 ""PPM16" +#define TR_VPROTOS "PPM\0 ""PXX\0 ""DSM2\0""PPM16""FUT\0 " #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -92,7 +92,7 @@ #define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick ""Haptc1""Haptc2""Haptc3" #define LEN_VTELEMBARS "\004" -#define TR_VTELEMBARS "---\0""A1\0 ""A2\0 ""ALT\0""RPM\0""FUEL""T1\0 ""T2\0 ""SPD\0""CELL" +#define TR_VTELEMBARS "---\0""A1\0 ""A2\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Cell""Dist""ACCx""ACCy""ACCz""TMR1""TMR2""ACC\0""Time" #define LEN_VTELEMUNIT "\003" #define TR_VTELEMUNIT "v\0 ""A\0 ""-\0 ""kts""kmh""M/h""m\0 ""@\0 ""%\0" @@ -112,8 +112,9 @@ #define TR_VTELPROTO "NoneHub " #endif -#define LEN_VTEMPLATES "\014" -#define TR_VTEMPLATES "Simple 4-CH ""T-Cut ""V-Tail ""Elevon\\Delta""eCCPM ""Heli Setup ""Servo Test " +#define LEN2_VTEMPLATES 13 +#define LEN_VTEMPLATES "\015" +#define TR_VTEMPLATES "Clear Mixes\0\0""Simple 4-CH \0""T-Cut \0""V-Tail \0""Elevon\\Delta\0""eCCPM \0""Heli Setup \0""Servo Test \0" #define LEN_VSWASHTYPE "\004" #define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90 " @@ -212,7 +213,7 @@ #define TR_USRDATA "UsrData" #define TR_BLADES "Blades" #define TR_BARS "Bars" -#define TR_CLEARMIXMENU "CLEAR MIXES [MENU]" +#define TR_DISPLAY "Display" #ifdef AUDIO #define TR_BEEPERMODE "Speaker Mode" #define TR_BEEPERLEN "Speaker Length" @@ -254,11 +255,6 @@ #define TR_RXBATT "Rx Batt:" #define TR_TXnRX "Tx:\0Rx:" #define OFS_RX 4 -#define TR_SPD "Spd:" -#define TR_ALT "Alt:" -#define TR_DST "Dst:" -#define TR_TEMP1nTEMP2 "T@1:\007T@2:" -#define TR_RPMnFUEL "RPM:\006Fuel:" #define TR_ACCEL "Acc:" #define TR_NODATA "NO DATA" #define TR_TM1TM2 "TM1\015TM2" diff --git a/src/translations/fr.h b/src/translations/fr.h index d7965810a..b1e3e252a 100644 --- a/src/translations/fr.h +++ b/src/translations/fr.h @@ -36,7 +36,7 @@ #define TR_RETA123 "RETA123" #define LEN_VPROTOS "\005" -#define TR_VPROTOS "PPM ""PXX ""DSM2 ""PPM16" +#define TR_VPROTOS "PPM\0 ""PXX\0 ""DSM2\0""PPM16""FUT\0 " #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -92,7 +92,7 @@ #define TR_FUNCSOUNDS "Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick ""Haptc1""Haptc2""Haptc3" #define LEN_VTELEMBARS "\004" -#define TR_VTELEMBARS "---\0""A1\0 ""A2\0 ""ALT\0""RPM\0""FUEL""T1\0 ""T2\0 ""SPD\0""CELL" +#define TR_VTELEMBARS "---\0""A1\0 ""A2\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Cell""Dist""ACCx""ACCy""ACCz""TMR1""TMR2""ACC\0""Time" #define LEN_VTELEMUNIT "\003" #define TR_VTELEMUNIT "v\0 ""A\0 ""-\0 ""kts""kmh""M/h""m\0 ""@\0 ""%\0" @@ -112,8 +112,9 @@ #define TR_VTELPROTO "NoneHub " #endif +#define LEN2_VTEMPLATES 14 #define LEN_VTEMPLATES "\016" -#define TR_VTEMPLATES "4 Voies simple""Coupure Gaz ""Empennage V ""Elevon\\Delta ""eCCPM ""Conf.Helico ""Servo Test " +#define TR_VTEMPLATES "Suppr Mixages\0""4 Voies simple\0""Coupure Gaz \0""Empennage V \0""Elevon\\Delta \0""eCCPM \0""Conf. Helico \0""Servo Test \0" #define LEN_VSWASHTYPE "\004" #define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90 " @@ -211,7 +212,7 @@ #define TR_USRDATA "UsrData" #define TR_BLADES "Blades" #define TR_BARS "Gauges" -#define TR_CLEARMIXMENU "EFFACER MIXAGES[MENU]" +#define TR_DISPLAY "Display" #ifdef AUDIO #define TR_BEEPERMODE "Speaker Mode" #define TR_BEEPERLEN "Speaker Length" @@ -254,11 +255,6 @@ #define TR_RXBATT "Rx Batt:" #define TR_TXnRX "Tx:\0Rx:" #define OFS_RX 4 -#define TR_SPD "Spd:" -#define TR_ALT "Alt:" -#define TR_DST "Dst:" -#define TR_TEMP1nTEMP2 "T@1:\007T@2:" -#define TR_RPMnFUEL "RPM:\006Fuel:" #define TR_ACCEL "Acc:" #define TR_NODATA "NO DATA" #define TR_TM1TM2 "TM1\015TM2" diff --git a/src/translations/se.h b/src/translations/se.h index 71d699d82..42f6fbe1c 100644 --- a/src/translations/se.h +++ b/src/translations/se.h @@ -36,7 +36,7 @@ #define TR_RETA123 "RETA123" #define LEN_VPROTOS "\005" -#define TR_VPROTOS "PPM ""PXX ""DSM2 ""PPM16" +#define TR_VPROTOS "PPM\0 ""PXX\0 ""DSM2\0""PPM16""FUT\0 " #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -92,7 +92,7 @@ #define TR_FUNCSOUNDS "Varn1 ""Varn2 ""F\200r ""Ring ""SciFi ""Robot ""Pip ""Tada ""Syrsa ""Siren ""Alarm ""Ratata""Tick ""Vibr1 ""Vibr2 ""Vibr3 " #define LEN_VTELEMBARS "\004" -#define TR_VTELEMBARS "---\0""A1\0 ""A2\0 ""H\205JD""VARV""TANK""T1\0 ""T2\0 ""FART""BATT" +#define TR_VTELEMBARS "---\0""A1\0 ""A2\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Cell""Dist""ACCx""ACCy""ACCz""TMR1""TMR2""ACC\0""Time" #define LEN_VTELEMUNIT "\003" #define TR_VTELEMUNIT "v\0 ""A\0 ""-\0 ""kts""kmh""M/h""m\0 ""@\0 ""%\0" @@ -112,8 +112,9 @@ #define TR_VTELPROTO "--- Hub " #endif -#define LEN_VTEMPLATES "\014" -#define TR_VTEMPLATES "Enkel 4kanal""Gasklippning""V-Stj\201rt ""Deltavinge ""eCCPM ""Helikopter ""Servotest " +#define LEN2_VTEMPLATES 13 +#define LEN_VTEMPLATES "\015" +#define TR_VTEMPLATES "Nolla Mixar\0\0""Enkel 4kanal\0""Gasklippning\0""V-Stj\201rt \0""Deltavinge \0""eCCPM \0""Helikopter \0""Servotest \0" #define LEN_VSWASHTYPE "\004" #define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90 " @@ -212,7 +213,7 @@ #define TR_USRDATA "Anv\201ndardata" #define TR_BLADES "Blad" #define TR_BARS "Staplar som visas" -#define TR_CLEARMIXMENU "NOLLA MIXAR [MENU]" +#define TR_DISPLAY "Display" #ifdef AUDIO #define TR_BEEPERMODE "H\202gtalare l\201ge" #define TR_BEEPERLEN "H\202gtalare tid" @@ -254,11 +255,6 @@ #define TR_RXBATT "Rx Batt:" #define TR_TXnRX "Tx:\0Rx:" #define OFS_RX 4 -#define TR_SPD "Spd:" -#define TR_ALT "Alt:" -#define TR_DST "Dst:" -#define TR_TEMP1nTEMP2 "T@1:\007T@2:" -#define TR_RPMnFUEL "RMP:\006Tank:" #define TR_ACCEL "Acc:" #define TR_NODATA "NO DATA" #define TR_TM1TM2 "TM1\015TM2"