From 046a4d253dc3e79f5d05d7e1e4e7254854cb978b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 24 Jan 2014 16:49:33 +0100 Subject: [PATCH 01/10] [Taranis] Issue #554 Radio part done. We have now modes on trims. Let's say we are configuring the Rudder Trim on phase 1: - R:0 => Rudder trim = Rudder trim(phase 0) - R+0 => Rudder trim = Rudder trim(phase 0) + Rudder trim(phase 1) - R-- => Rudder trim is OFF Still needs to be done: - The result on screen is awful. I need ideas. Martin? - Companion conversions / UI for this feature - R+1 when configuring Rudder Trim on phase 1 should be impossible --- radio/src/gui/menu_model.cpp | 45 +++++++------------- radio/src/lcd.cpp | 25 ++++++++++- radio/src/myeeprom.h | 11 ++++- radio/src/opentx.cpp | 81 +++++++++++++++++++++++++++++++----- radio/src/opentx.h | 13 ++++-- 5 files changed, 128 insertions(+), 47 deletions(-) diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index 6f2309e1b..130f0cb72 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -1722,7 +1722,7 @@ FlightModesType editFlightModes(uint8_t x, uint8_t y, uint8_t event, FlightModes return value; } -#if LCD_W >= 212 +#if defined(PCBTARANIS) enum FlightModesItems { ITEM_PHASES_NAME, @@ -1739,7 +1739,7 @@ void editPhaseTrims(uint8_t x, uint8_t y, uint8_t phase, uint8_t event, uint8_t static uint8_t cursorPos = 0; for (uint8_t t=0; t 0) { if (p1valdiff || IS_ROTARY_RIGHT(event) || IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_DOWN) || event==EVT_KEY_REPT(KEY_UP)) { - int16_t v = getRawTrimValue(phase, cur); - if (v < TRIM_EXTENDED_MAX) v = TRIM_EXTENDED_MAX; - v = checkIncDec(event, v, TRIM_EXTENDED_MAX, TRIM_EXTENDED_MAX+MAX_PHASES-1, EE_MODEL); - if (checkIncDec_Ret) { - if (v == TRIM_EXTENDED_MAX) v = 0; - setTrimValue(phase, cur, v); - } + PhaseData *p = phaseAddress(phase); + trim_t & v = p->trim[cur]; + v.mode = checkIncDec(event, v.mode, -1, 2*MAX_PHASES-1, EE_MODEL); } switch (event) { -#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBTARANIS) - case EVT_ROTARY_BREAK: + case EVT_KEY_BREAK(KEY_ENTER): if (s_editMode == EDIT_MODIFY_FIELD) { s_editMode = EDIT_MODIFY_STRING; cur = 0; @@ -1768,23 +1763,11 @@ void editPhaseTrims(uint8_t x, uint8_t y, uint8_t phase, uint8_t event, uint8_t else s_editMode = 0; break; -#endif -#if !defined(PCBTARANIS) - case EVT_KEY_BREAK(KEY_LEFT): - if (cur>0) cur--; - break; - case EVT_KEY_BREAK(KEY_RIGHT): - if (curname, sizeof(p->name), event, attr); + editName(4*FW-1, y, p->name, sizeof(p->name), event, attr); break; case ITEM_PHASES_SWITCH: if (k == 0) { - lcd_puts((5+LEN_FP_NAME)*FW+FW/2, y, STR_DEFAULT); + lcd_puts((5+LEN_FP_NAME)*FW-FW/2, y, STR_DEFAULT); } else { - putsSwitches((5+LEN_FP_NAME)*FW+FW/2, y, p->swtch, attr); + putsSwitches((5+LEN_FP_NAME)*FW-FW/2, y, p->swtch, attr); if (active) CHECK_INCDEC_MODELSWITCH(event, p->swtch, -MAX_SWITCH, MAX_SWITCH); } break; case ITEM_PHASES_TRIMS: if (k != 0) { - editPhaseTrims((10+LEN_FP_NAME)*FW+FW/2, y, k, event, attr); + editPhaseTrims((10+LEN_FP_NAME)*FW-2*FW, y, k, event, attr); } break; case ITEM_PHASES_FADE_IN: - lcd_outdezAtt(29*FW, y, (10/DELAY_STEP)*p->fadeIn, attr|PREC1); + lcd_outdezAtt(32*FW-2, y, (10/DELAY_STEP)*p->fadeIn, attr|PREC1); if (active) p->fadeIn = checkIncDec(event, p->fadeIn, 0, DELAY_MAX, EE_MODEL|NO_INCDEC_MARKS); break; case ITEM_PHASES_FADE_OUT: - lcd_outdezAtt(34*FW, y, (10/DELAY_STEP)*p->fadeOut, attr|PREC1); + lcd_outdezAtt(35*FW, y, (10/DELAY_STEP)*p->fadeOut, attr|PREC1); if (active) p->fadeOut = checkIncDec(event, p->fadeOut, 0, DELAY_MAX, EE_MODEL|NO_INCDEC_MARKS); break; @@ -1865,7 +1848,7 @@ void menuModelFlightModesAll(uint8_t event) } } -#else // LCD_W >= 212 +#else // PCBTARANIS enum menuModelPhaseItems { ITEM_MODEL_PHASE_NAME, diff --git a/radio/src/lcd.cpp b/radio/src/lcd.cpp index 7b2cbe7f0..cdcf18323 100644 --- a/radio/src/lcd.cpp +++ b/radio/src/lcd.cpp @@ -1162,9 +1162,31 @@ void putsTmrMode(xcoord_t x, uint8_t y, int8_t mode, LcdFlags att) putsSwitches(x, y, mode-(TMR_VAROFS-1), att); } +#if defined(PCBTARANIS) void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags att) { - int16_t v = getRawTrimValue(phase, idx); + trim_t v = getRawTrimValue(phase, idx); + + putsChnLetter(x, y, idx+1, att); + + if (v.mode < 0) { + lcd_putsAtt(x+FWNUM, y, "--", att); + } + else { + uint8_t p = v.mode >> 1; + if (v.mode % 2 == 0) { + lcd_putcAtt(x+FWNUM, y, '+', att); + } + else { + lcd_putcAtt(x+FWNUM, y, ':', att); + } + lcd_putcAtt(x+2*FWNUM, y, '0'+p, att); + } +} +#else +void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags att) +{ + trim_t v = getRawTrimValue(phase, idx); if (v > TRIM_EXTENDED_MAX) { uint8_t p = v - TRIM_EXTENDED_MAX - 1; @@ -1175,6 +1197,7 @@ void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags at putsChnLetter(x, y, idx+1, att); } } +#endif #if ROTARY_ENCODERS > 0 void putsRotaryEncoderMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags att) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index d91b0d507..d0973c639 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -1070,8 +1070,17 @@ PACK(typedef struct t_SwashRingData { // Swash Ring data #if defined(PCBSTD) #define TRIMS_ARRAY int8_t trim[4]; int8_t trim_ext:8 #define TRIMS_ARRAY_SIZE 5 + #define trim_t int16_t #else - #define TRIMS_ARRAY int16_t trim[4] + #if defined(PCBTARANIS) + PACK(typedef struct { + int16_t value:11; + int16_t mode:5; + }) trim_t; + #else + #define trim_t int16_t + #endif + #define TRIMS_ARRAY trim_t trim[4] #define TRIMS_ARRAY_SIZE 8 #endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index cdefd2577..50609e63d 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1640,38 +1640,83 @@ uint8_t getFlightPhase() } #endif -int16_t getRawTrimValue(uint8_t phase, uint8_t idx) +trim_t getRawTrimValue(uint8_t phase, uint8_t idx) { PhaseData *p = phaseAddress(phase); #if defined(PCBSTD) - return (((int16_t)p->trim[idx]) << 2) + ((p->trim_ext >> (2*idx)) & 0x03); + return (((trim_t)p->trim[idx]) << 2) + ((p->trim_ext >> (2*idx)) & 0x03); #else return p->trim[idx]; #endif } -int16_t getTrimValue(uint8_t phase, uint8_t idx) +int getTrimValue(uint8_t phase, uint8_t idx) { +#if defined(PCBTARANIS) + int result = 0; + for (uint8_t i=0; i> 1; + if (p == phase || phase == 0) { + return result + v.value; + } + else { + phase = p; + if (v.mode % 2 == 0) + result += v.value; + else + result = 0; + } + } + } + return 0; +#else return getRawTrimValue(getTrimFlightPhase(phase, idx), idx); +#endif } -void setTrimValue(uint8_t phase, uint8_t idx, int16_t trim) +void setTrimValue(uint8_t phase, uint8_t idx, int trim) { +#if defined(PCBTARANIS) + for (uint8_t i=0; itrim[idx]; + if (v.mode < 0) + return; + unsigned int p = v.mode >> 1; + if (p == phase || phase == 0) { + v.value = trim; + break;; + } + else if (v.mode % 2 == 0) { + v.value = limit(-500, trim - getTrimValue(p, idx), 500); + break; + } + else { + phase = p; + } + } +#elif defined(PCBSTD) PhaseData *p = phaseAddress(phase); -#if defined(PCBSTD) p->trim[idx] = (int8_t)(trim >> 2); - p->trim_ext = (p->trim_ext & ~(0x03 << (2*idx))) + (((trim & 0x03) << (2*idx))); + idx <<= 1; + p->trim_ext = (p->trim_ext & ~(0x03 << idx)) + (((trim & 0x03) << idx)); #else + PhaseData *p = phaseAddress(phase); p->trim[idx] = trim; #endif eeDirty(EE_MODEL); } +#if !defined(PCBTARANIS) uint8_t getTrimFlightPhase(uint8_t phase, uint8_t idx) { for (uint8_t i=0; i= phase) result++; @@ -1679,6 +1724,7 @@ uint8_t getTrimFlightPhase(uint8_t phase, uint8_t idx) } return 0; } +#endif #if defined(ROTARY_ENCODERS) uint8_t getRotaryEncoderFlightPhase(uint8_t idx) @@ -2309,7 +2355,7 @@ uint8_t checkTrim(uint8_t event) // LH_DWN LH_UP LV_DWN LV_UP RV_DWN RV_UP RH_DWN RH_UP uint8_t idx = CONVERT_MODE((uint8_t)k/2); uint8_t phase; - int16_t before; + int before; bool thro; #if defined(GVARS) @@ -2325,13 +2371,21 @@ uint8_t checkTrim(uint8_t event) } else { phase = getTrimFlightPhase(s_perout_flight_phase, idx); +#if defined(PCBTARANIS) + before = getTrimValue(phase, idx); +#else before = getRawTrimValue(phase, idx); +#endif thro = (idx==THR_STICK && g_model.thrTrim); } #else #define TRIM_REUSED() 0 phase = getTrimFlightPhase(s_perout_flight_phase, idx); +#if defined(PCBTARANIS) + before = getTrimValue(phase, idx); +#else before = getRawTrimValue(phase, idx); +#endif thro = (idx==THR_STICK && g_model.thrTrim); #endif int8_t trimInc = g_model.trimInc + 1; @@ -4671,7 +4725,7 @@ void instantTrim() if (i!=THR_STICK) { // don't instant trim the throttle stick uint8_t trim_phase = getTrimFlightPhase(s_perout_flight_phase, i); - int16_t trim = limit((int16_t)TRIM_EXTENDED_MIN, (int16_t)((anas[i] + trims[i]) / 2), (int16_t)TRIM_EXTENDED_MAX); + int16_t trim = limit(TRIM_EXTENDED_MIN, (anas[i] + trims[i]) / 2, TRIM_EXTENDED_MAX); setTrimValue(trim_phase, i, trim); } } @@ -4729,9 +4783,16 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim if (i!=THR_STICK || !g_model.thrTrim) { int16_t original_trim = getTrimValue(s_perout_flight_phase, i); for (uint8_t phase=0; phase Date: Mon, 27 Jan 2014 09:26:02 +0100 Subject: [PATCH 02/10] [Taranis] Issue #554 - Default is now :0 (all trims linked to the default phase) --- radio/src/gui/menu_model.cpp | 69 ++++++++++-------------------------- radio/src/lcd.cpp | 16 ++++----- radio/src/opentx.cpp | 10 +++--- radio/src/translations/en.h | 2 +- 4 files changed, 30 insertions(+), 67 deletions(-) diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index 130f0cb72..9f7c2e8f4 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -1727,64 +1727,24 @@ FlightModesType editFlightModes(uint8_t x, uint8_t y, uint8_t event, FlightModes enum FlightModesItems { ITEM_PHASES_NAME, ITEM_PHASES_SWITCH, - ITEM_PHASES_TRIMS, + ITEM_PHASES_TRIM_RUD, + ITEM_PHASES_TRIM_ELE, + ITEM_PHASES_TRIM_THR, + ITEM_PHASES_TRIM_AIL, ITEM_PHASES_FADE_IN, ITEM_PHASES_FADE_OUT, ITEM_PHASES_COUNT, ITEM_PHASES_LAST = ITEM_PHASES_COUNT-1 }; -void editPhaseTrims(uint8_t x, uint8_t y, uint8_t phase, uint8_t event, uint8_t active) -{ - static uint8_t cursorPos = 0; - - for (uint8_t t=0; t 0) { - if (p1valdiff || IS_ROTARY_RIGHT(event) || IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_FIRST(KEY_UP) - || event==EVT_KEY_REPT(KEY_DOWN) || event==EVT_KEY_REPT(KEY_UP)) { - PhaseData *p = phaseAddress(phase); - trim_t & v = p->trim[cur]; - v.mode = checkIncDec(event, v.mode, -1, 2*MAX_PHASES-1, EE_MODEL); - } - - switch (event) { - case EVT_KEY_BREAK(KEY_ENTER): - if (s_editMode == EDIT_MODIFY_FIELD) { - s_editMode = EDIT_MODIFY_STRING; - cur = 0; - } - else if (cur 0) { posHorz += 2; } + if (sub==0 && posHorz > 0) { posHorz += 5; } if (sub=0) { displayColumnHeader(STR_PHASES_HEADERS, posHorz); @@ -1819,20 +1779,27 @@ void menuModelFlightModesAll(uint8_t event) case ITEM_PHASES_SWITCH: if (k == 0) { - lcd_puts((5+LEN_FP_NAME)*FW-FW/2, y, STR_DEFAULT); + lcd_puts((5+LEN_FP_NAME)*FW, y, STR_DEFAULT); } else { - putsSwitches((5+LEN_FP_NAME)*FW-FW/2, y, p->swtch, attr); + putsSwitches((5+LEN_FP_NAME)*FW, y, p->swtch, attr); if (active) CHECK_INCDEC_MODELSWITCH(event, p->swtch, -MAX_SWITCH, MAX_SWITCH); } break; - case ITEM_PHASES_TRIMS: + case ITEM_PHASES_TRIM_RUD: + case ITEM_PHASES_TRIM_ELE: + case ITEM_PHASES_TRIM_THR: + case ITEM_PHASES_TRIM_AIL: if (k != 0) { - editPhaseTrims((10+LEN_FP_NAME)*FW-2*FW, y, k, event, attr); + uint8_t t = j-ITEM_PHASES_TRIM_RUD; + putsTrimMode((4+LEN_FP_NAME)*FW+j*(5*FW/2), y, k, t, attr); + if (active) { + trim_t & v = p->trim[t]; + v.mode = checkIncDec(event, v.mode, -1, 2*MAX_PHASES-1, EE_MODEL); + } } break; - case ITEM_PHASES_FADE_IN: lcd_outdezAtt(32*FW-2, y, (10/DELAY_STEP)*p->fadeIn, attr|PREC1); if (active) p->fadeIn = checkIncDec(event, p->fadeIn, 0, DELAY_MAX, EE_MODEL|NO_INCDEC_MARKS); diff --git a/radio/src/lcd.cpp b/radio/src/lcd.cpp index cdcf18323..631715ec6 100644 --- a/radio/src/lcd.cpp +++ b/radio/src/lcd.cpp @@ -1167,20 +1167,16 @@ void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags at { trim_t v = getRawTrimValue(phase, idx); - putsChnLetter(x, y, idx+1, att); - if (v.mode < 0) { - lcd_putsAtt(x+FWNUM, y, "--", att); + lcd_putsAtt(x, y, "--", att); } else { uint8_t p = v.mode >> 1; - if (v.mode % 2 == 0) { - lcd_putcAtt(x+FWNUM, y, '+', att); - } - else { - lcd_putcAtt(x+FWNUM, y, ':', att); - } - lcd_putcAtt(x+2*FWNUM, y, '0'+p, att); + if (v.mode % 2 == 0) + lcd_putcAtt(x+2, y, ':', att); + else + lcd_putcAtt(x, y, '+', att); + lcd_putcAtt(x+FW, y, '0'+p, att); } } #else diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 50609e63d..5ada1d63e 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1667,9 +1667,9 @@ int getTrimValue(uint8_t phase, uint8_t idx) else { phase = p; if (v.mode % 2 == 0) - result += v.value; - else result = 0; + else + result += v.value; } } } @@ -1692,11 +1692,11 @@ void setTrimValue(uint8_t phase, uint8_t idx, int trim) break;; } else if (v.mode % 2 == 0) { - v.value = limit(-500, trim - getTrimValue(p, idx), 500); - break; + phase = p; } else { - phase = p; + v.value = limit(-500, trim - getTrimValue(p, idx), 500); + break; } } #elif defined(PCBSTD) diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 9339ce7df..35d8f2f65 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -707,7 +707,7 @@ #endif // Taranis column headers -#define TR_PHASES_HEADERS { " Name ", " Switch ", " Trims ", " Fade In ", " Fade Out " } +#define TR_PHASES_HEADERS { " Name ", " Switch ", " Rudder Trim ", " Elevator Trim ", " Throttle Trim ", " Aileron Trim ", " Fade In ", " Fade Out " } #define TR_LIMITS_HEADERS { " Name ", " Subtrim ", " Min ", " Max ", " Direction ", " Curve ", " PPM Center ", " Subtrim mode " } #define TR_CSW_HEADERS { " Function ", " V1 ", " V2 ", " AND Switch ", " Duration ", " Delay " } From cb47c03f4fa4af4a71f1ea29c8c0fb27735e15d6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 27 Jan 2014 12:25:13 +0100 Subject: [PATCH 03/10] [Taranis] Issue #554 - Bug fixes (radio part) --- radio/src/gui/menu_model.cpp | 9 +++++++-- radio/src/lcd.cpp | 7 ++++--- radio/src/myeeprom.h | 5 +++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index 9f7c2e8f4..2520b5f90 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -1737,6 +1737,11 @@ enum FlightModesItems { ITEM_PHASES_LAST = ITEM_PHASES_COUNT-1 }; +bool isTrimModeAvailable(int16_t mode) +{ + return (mode == TRIM_MODE_NONE || (mode%2) == 0 || (mode/2) != (m_posVert-1)); +} + void menuModelFlightModesAll(uint8_t event) { MENU(STR_MENUFLIGHTPHASES, menuTabModel, e_FlightModesAll, 1+MAX_PHASES+1, {0, NAVIGATION_LINE_BY_LINE|(ITEM_PHASES_LAST-5), NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, 0}); @@ -1796,7 +1801,7 @@ void menuModelFlightModesAll(uint8_t event) putsTrimMode((4+LEN_FP_NAME)*FW+j*(5*FW/2), y, k, t, attr); if (active) { trim_t & v = p->trim[t]; - v.mode = checkIncDec(event, v.mode, -1, 2*MAX_PHASES-1, EE_MODEL); + v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, 2*MAX_PHASES-1, EE_MODEL, isTrimModeAvailable); } } break; @@ -2858,7 +2863,7 @@ void menuModelExpoOne(uint8_t event) case EXPO_FIELD_SCALE: lcd_putsLeft(y, STR_SCALE); putsTelemetryChannel(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw - MIXSRC_FIRST_TELEM, convertTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1, ed->scale), LEFT|attr); - if (attr) ed->scale = checkIncDec(event, ed->scale, 0, maxTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1), EE_MODEL, NULL); + if (attr) ed->scale = checkIncDec(event, ed->scale, 0, maxTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1), EE_MODEL); break; #endif diff --git a/radio/src/lcd.cpp b/radio/src/lcd.cpp index 631715ec6..d8ac8aff0 100644 --- a/radio/src/lcd.cpp +++ b/radio/src/lcd.cpp @@ -1166,13 +1166,14 @@ void putsTmrMode(xcoord_t x, uint8_t y, int8_t mode, LcdFlags att) void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags att) { trim_t v = getRawTrimValue(phase, idx); + unsigned int mode = v.mode; + unsigned int p = mode >> 1; - if (v.mode < 0) { + if (mode == TRIM_MODE_NONE) { lcd_putsAtt(x, y, "--", att); } else { - uint8_t p = v.mode >> 1; - if (v.mode % 2 == 0) + if (mode % 2 == 0) lcd_putcAtt(x+2, y, ':', att); else lcd_putcAtt(x, y, '+', att); diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index d0973c639..ba18118fc 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -1074,9 +1074,10 @@ PACK(typedef struct t_SwashRingData { // Swash Ring data #else #if defined(PCBTARANIS) PACK(typedef struct { - int16_t value:11; - int16_t mode:5; + int16_t value:11; + uint16_t mode:5; }) trim_t; + #define TRIM_MODE_NONE 0b11111 #else #define trim_t int16_t #endif From 5c601a0bb7ce698da3b7848d26f6adf3800e1a70 Mon Sep 17 00:00:00 2001 From: mhotar Date: Mon, 27 Jan 2014 13:10:21 +0100 Subject: [PATCH 04/10] Font related alignments --- radio/src/lcd.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/lcd.cpp b/radio/src/lcd.cpp index d8ac8aff0..1354bde39 100644 --- a/radio/src/lcd.cpp +++ b/radio/src/lcd.cpp @@ -1174,10 +1174,10 @@ void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags at } else { if (mode % 2 == 0) - lcd_putcAtt(x+2, y, ':', att); + lcd_putcAtt(x, y, ':', att|FIXEDWIDTH); else - lcd_putcAtt(x, y, '+', att); - lcd_putcAtt(x+FW, y, '0'+p, att); + lcd_putcAtt(x, y, '+', att|FIXEDWIDTH); + lcd_putcAtt(lcdNextPos, y, '0'+p, att); } } #else From cde59a2b22799d087cd3e06c0904bcda1f43bc20 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 27 Jan 2014 14:32:19 +0100 Subject: [PATCH 05/10] [Taranis] Issue #554 - Automatic EEPROM conversions --- radio/src/eeprom_conversions.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/radio/src/eeprom_conversions.cpp b/radio/src/eeprom_conversions.cpp index 24d4bb3a5..66b2a73c8 100644 --- a/radio/src/eeprom_conversions.cpp +++ b/radio/src/eeprom_conversions.cpp @@ -122,7 +122,7 @@ PACK(typedef struct { }) TimerData_v215; PACK(typedef struct { - TRIMS_ARRAY; + int16_t trim[4]; int8_t swtch; // swtch of phase[0] is not used char name[LEN_FP_NAME]; uint8_t fadeIn; @@ -437,6 +437,22 @@ void ConvertModel_215_to_216(ModelData &model) for (uint8_t i=0; i<9; i++) { memcpy(&g_model.phaseData[i], &oldModel.phaseData[i], sizeof(oldModel.phaseData[i])); // the last 4 gvars will remain blank +#if defined(PCBTARANIS) + for (uint8_t t=0; t<4; t++) { + int trim = oldModel.phaseData[i].trim[t]; + if (trim > 500) { + trim -= 501; + if (trim >= i) + trim += 1; + g_model.phaseData[i].trim[t].mode = 2*trim; + g_model.phaseData[i].trim[t].value = 0; + } + else { + g_model.phaseData[i].trim[t].mode = 2*i; + g_model.phaseData[i].trim[t].value = trim; + } + } +#endif } g_model.thrTraceSrc = oldModel.thrTraceSrc; g_model.switchWarningStates = oldModel.switchWarningStates; From 80a6c4727d6afadf492482cb4cc5f8be7fe7d8c6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 27 Jan 2014 17:25:43 +0100 Subject: [PATCH 06/10] [Taranis] Issue #554 - Companion part done --- companion/src/eeprominterface.cpp | 52 ++++++++++-- companion/src/eeprominterface.h | 9 +- .../src/firmwares/er9x/er9xinterface.cpp | 1 - .../firmwares/ersky9x/ersky9xinterface.cpp | 1 - .../src/firmwares/opentx/opentxeeprom.cpp | 71 +++++++++++----- companion/src/helpers.cpp | 13 --- companion/src/helpers.h | 1 - companion/src/modeledit/flightmodes.cpp | 84 +++++++++---------- 8 files changed, 139 insertions(+), 93 deletions(-) diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp index ca6c86485..1b56e3ef5 100644 --- a/companion/src/eeprominterface.cpp +++ b/companion/src/eeprominterface.cpp @@ -624,17 +624,57 @@ void ModelData::setDefault(uint8_t id) sprintf(name, "MODEL%02d", id+1); } -unsigned int ModelData::getTrimFlightPhase(uint8_t idx, int8_t phase) +int ModelData::getTrimValue(int phaseIdx, int trimIdx) { - // if (phase == -1) phase = getFlightPhase(); - - for (uint8_t i=0; i 500) + trim = 500; + break; + } + } +} + void ModelData::removeGlobalVar(int & var) { if (var >= 126 && var <= 130) diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index 91da15e51..1e345bc60 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -655,7 +655,8 @@ class FuncSwData { // Function Switches data class PhaseData { public: PhaseData() { clear(); } - int trimRef[NUM_STICKS]; // + int trimMode[NUM_STICKS]; + int trimRef[NUM_STICKS]; int trim[NUM_STICKS]; RawSwitch swtch; char name[10+1]; @@ -663,7 +664,7 @@ class PhaseData { unsigned int fadeOut; int rotaryEncoders[2]; int gvars[C9X_MAX_GVARS]; - void clear() { memset(this, 0, sizeof(PhaseData)); for (int i=0; i(trimExt[i])); } + else if (board == BOARD_TARANIS && version >= 216) { + for (int i=0; i(phase.trim[i])); + internalField.Append(new UnsignedField<5>(trimMode[i])); + } + } else { for (int i=0; i(trimBase[i])); @@ -459,19 +465,27 @@ class PhaseField: public TransformedField { virtual void beforeExport() { for (int i=0; i= 0) { - trim = 501 + phase.trimRef[i] - (phase.trimRef[i] >= index ? 1 : 0); + if (board == BOARD_TARANIS && version >= 216) { + if (phase.trimMode[i] < 0) + trimMode[i] = 0b11111; + else + trimMode[i] = 2*phase.trimRef[i] + phase.trimMode[i]; } else { - trim = std::max(-500, std::min(500, phase.trim[i])); - } - if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) { - trimBase[i] = trim >> 2; - trimExt[i] = (trim & 0x03); - } - else { - trimBase[i] = trim; + int trim; + if (phase.trimMode[i] < 0) + trim = 0; + else if (phase.trimRef[i] != index) + trim = 501 + phase.trimRef[i] - (phase.trimRef[i] > index ? 1 : 0); + else + trim = std::max(-500, std::min(500, phase.trim[i])); + if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) { + trimBase[i] = trim >> 2; + trimExt[i] = (trim & 0x03); + } + else { + trimBase[i] = trim; + } } } } @@ -479,21 +493,31 @@ class PhaseField: public TransformedField { virtual void afterImport() { for (int i=0; i= 215)) - trim = ((trimBase[i]) << 2) + (trimExt[i] & 0x03); - else - trim = trimBase[i]; - if (trim > 500) { - phase.trimRef[i] = trim - 501; - if (phase.trimRef[i] >= index) - phase.trimRef[i] += 1; - phase.trim[i] = 0; + if (board == BOARD_TARANIS && version >= 216) { + if (trimMode[i] == 0b11111) { + phase.trimMode[i] = -1; + } + else { + phase.trimMode[i] = trimMode[i] % 2; + phase.trimRef[i] = trimMode[i] / 2; + } } else { - phase.trim[i] = trim; + int trim; + if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) + trim = ((trimBase[i]) << 2) + (trimExt[i] & 0x03); + else + trim = trimBase[i]; + if (trim > 500) { + phase.trimRef[i] = trim - 501; + if (phase.trimRef[i] >= index) + phase.trimRef[i] += 1; + phase.trim[i] = 0; + } + else { + phase.trim[i] = trim; + } } - } } @@ -506,6 +530,7 @@ class PhaseField: public TransformedField { int rotencCount; int trimBase[NUM_STICKS]; int trimExt[NUM_STICKS]; + unsigned int trimMode[NUM_STICKS]; }; diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index b150b0821..c997a3a03 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -682,19 +682,6 @@ void CurveGroup::valuesChanged() } } -void populateTrimUseCB(QComboBox *b, unsigned int phase) -{ - b->addItem(QObject::tr("Own trim")); - unsigned int num_phases = GetEepromInterface()->getCapability(FlightPhases); - if (num_phases>0) { - for (unsigned int i = 0; i < num_phases; i++) { - if (i != phase) { - b->addItem(QObject::tr("Flight mode %1 trim").arg(i)); - } - } - } -} - void populateGvarUseCB(QComboBox *b, unsigned int phase) { b->addItem(QObject::tr("Own value")); diff --git a/companion/src/helpers.h b/companion/src/helpers.h index d3141083d..b1c2e1726 100644 --- a/companion/src/helpers.h +++ b/companion/src/helpers.h @@ -89,7 +89,6 @@ QString FuncParam(uint function, int value, QString paramT="",unsigned int adjus void populateFuncParamCB(QComboBox *b, const ModelData & model, uint function, unsigned int value, unsigned int adjustmode=0); void populateFuncParamArmTCB(QComboBox *b, ModelData * g_model, char * value, QStringList & paramsList); void populatePhasesCB(QComboBox *b, int value); -void populateTrimUseCB(QComboBox *b, unsigned int phase); void populateGvarUseCB(QComboBox *b, unsigned int phase); void populateCustomScreenFieldCB(QComboBox *b, unsigned int value, bool last, int hubproto); void populateTimerSwitchCB(QComboBox *b, int value); diff --git a/companion/src/modeledit/flightmodes.cpp b/companion/src/modeledit/flightmodes.cpp index 4a4e5e651..a5cd400a0 100644 --- a/companion/src/modeledit/flightmodes.cpp +++ b/companion/src/modeledit/flightmodes.cpp @@ -17,9 +17,11 @@ FlightMode::FlightMode(QWidget * parent, ModelData & model, int phaseIdx, Genera { ui->setupUi(this); + int modesCount = GetEepromInterface()->getCapability(FlightPhases); + // Phase name QRegExp rx(CHAR_FOR_NAMES_REGEX); - if (GetEepromInterface()->getCapability(FlightPhases)) { + if (modesCount) { ui->name->setValidator(new QRegExpValidator(rx, this)); ui->name->setMaxLength(GetEepromInterface()->getCapability(FlightModesName)); connect(ui->name, SIGNAL(editingFinished()), this, SLOT(phaseName_editingFinished())); @@ -66,14 +68,19 @@ FlightMode::FlightMode(QWidget * parent, ModelData & model, int phaseIdx, Genera for (int i=0; i<4; i++) { trimsLabel[i]->setText(labels[CONVERT_MODE(i+1)-1]); - if (phaseIdx > 0) { - trimsUse[i]->setProperty("index", i); - populateTrimUseCB(trimsUse[i], phaseIdx); - connect(trimsUse[i], SIGNAL(currentIndexChanged(int)), this, SLOT(phaseTrimUse_currentIndexChanged(int))); - } - else { - trimsUse[i]->hide(); + QComboBox * cb = trimsUse[i]; + cb->setProperty("index", i); + cb->addItem(QObject::tr("Trim disabled"), -1); + for (int m=0; maddItem(QObject::tr("Own Trim"), m*2); + } + else if (phaseIdx > 0) { + cb->addItem(QObject::tr("Use Trim from Flight mode %1").arg(m), m*2); + cb->addItem(QObject::tr("Use Trim from Flight mode %1 + Own Trim as an offset").arg(m), m*2+1); + } } + connect(cb, SIGNAL(currentIndexChanged(int)), this, SLOT(phaseTrimUse_currentIndexChanged(int))); trimsValue[i]->setProperty("index", i); connect(trimsValue[i], SIGNAL(valueChanged(int)), this, SLOT(phaseTrim_valueChanged())); @@ -123,17 +130,6 @@ FlightMode::FlightMode(QWidget * parent, ModelData & model, int phaseIdx, Genera QLabel *label = new QLabel(ui->gvGB); label->setText(tr("GVAR%1").arg(i+1)); gvLayout->addWidget(label, i, col++, 1, 1); -#if 0 - // TODO remove this capability? - // GVar source (er9x/ersky9x) - if (GetEepromInterface()->getCapability(GvarsHaveSources)) { - QComboBox *source = new QComboBox(ui->gvGB); - source->setProperty("index", i); - populateGvSourceCB(source, model.gvsource[i]); - // connect(source, SIGNAL(currentIndexChanged(int)), this, SLOT(phaseGVSource_currentIndexChanged(int))); - gvLayout->addWidget(source, i, col++, 1, 1); - } -#endif // GVar name int nameLen = GetEepromInterface()->getCapability(GvarsName); if (nameLen > 0) { @@ -193,7 +189,6 @@ void FlightMode::update() int chn = CONVERT_MODE(i+1)-1; if (chn == 2/*TODO constant*/ && model.throttleReversed) trimsSlider[i]->setInvertedAppearance(true); - trimUpdate(i); } @@ -262,23 +257,22 @@ void FlightMode::phaseFadeOut_editingFinished() void FlightMode::trimUpdate(unsigned int trim) { - lock = true; - int chn = CONVERT_MODE(trim+1)-1; - int value = phase.trim[chn]; - if (phaseIdx > 0 && phase.trimRef[chn] >= 0) { - trimsUse[trim]->setCurrentIndex(1 + phase.trimRef[chn] - (phase.trimRef[chn] >= phaseIdx ? 1 : 0)); - value = model.phaseData[model.getTrimFlightPhase(chn, phaseIdx)].trim[chn]; - trimsValue[trim]->setEnabled(false); - trimsSlider[trim]->setEnabled(false); - } - else { - if (phaseIdx > 0) trimsUse[trim]->setCurrentIndex(0); - trimsValue[trim]->setEnabled(true); - trimsSlider[trim]->setEnabled(true); - } - trimsSlider[trim]->setValue(value); - trimsValue[trim]->setValue(value); - lock = false; + lock = true; + int chn = CONVERT_MODE(trim+1)-1; + int value = model.getTrimValue(phaseIdx, chn); + trimsSlider[trim]->setValue(value); + trimsValue[trim]->setValue(value); + if (phase.trimMode[chn] < 0) { + trimsUse[trim]->setCurrentIndex(0); + trimsValue[trim]->setEnabled(false); + trimsSlider[trim]->setEnabled(false); + } + else { + trimsUse[trim]->setCurrentIndex(1 + 2*phase.trimRef[chn] + phase.trimMode[chn] - (phase.trimRef[chn] > phaseIdx ? 1 : 0)); + trimsValue[trim]->setEnabled(true); + trimsSlider[trim]->setEnabled(true); + } + lock = false; } void FlightMode::phaseGVValue_editingFinished() @@ -380,15 +374,17 @@ void FlightMode::phaseTrimUse_currentIndexChanged(int index) QComboBox *comboBox = qobject_cast(sender()); int trim = comboBox->property("index").toInt(); int chn = CONVERT_MODE(trim+1)-1; - if (index == 0) { - phase.trim[chn] = model.phaseData[model.getTrimFlightPhase(chn, phaseIdx)].trim[chn]; - phase.trimRef[chn] = -1; + int data = comboBox->itemData(index).toInt(); + if (data < 0) { + phase.trimMode[chn] = -1; + phase.trimRef[chn] = 0; + phase.trim[chn] = 0; } else { + phase.trimMode[chn] = data % 2; + phase.trimRef[chn] = data / 2; phase.trim[chn] = 0; - phase.trimRef[chn] = index - 1 + (index > (int)phaseIdx ? 1 : 0); } - trimUpdate(trim); emit modified(); } @@ -401,7 +397,7 @@ void FlightMode::phaseTrim_valueChanged() int trim = spinBox->property("index").toInt(); int chn = CONVERT_MODE(trim+1)-1; int value = spinBox->value(); - phase.trim[chn] = value; + model.setTrimValue(phaseIdx, chn, value); lock = true; trimsSlider[trim]->setValue(value); lock = false; @@ -416,7 +412,7 @@ void FlightMode::phaseTrimSlider_valueChanged() int trim = slider->property("index").toInt(); int chn = CONVERT_MODE(trim+1)-1; int value = slider->value(); - phase.trim[chn] = value; + model.setTrimValue(phaseIdx, chn, value); lock = true; trimsValue[trim]->setValue(value); lock = false; From b44fa1432edd8321c249d04041bcbf35091e436d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 27 Jan 2014 17:30:50 +0100 Subject: [PATCH 07/10] [Taranis] Issue #554 - Constant used instead of hardcoded value --- radio/src/gui/menu_model.cpp | 3 +-- radio/src/opentx.cpp | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index 2520b5f90..0bce00e1c 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -1776,8 +1776,7 @@ void menuModelFlightModesAll(uint8_t event) for (uint8_t j=0; j0) ? BLINK|INVERS : INVERS) : 0); uint8_t active = (attr && (s_editMode>0 || p1valdiff)) ; - switch(j) - { + switch (j) { case ITEM_PHASES_NAME: editName(4*FW-1, y, p->name, sizeof(p->name), event, attr); break; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 5ada1d63e..2c63a88e4 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1695,7 +1695,7 @@ void setTrimValue(uint8_t phase, uint8_t idx, int trim) phase = p; } else { - v.value = limit(-500, trim - getTrimValue(p, idx), 500); + v.value = limit(TRIM_EXTENDED_MIN, trim - getTrimValue(p, idx), TRIM_EXTENDED_MAX); break; } } From 670bb0a0c5b6cec69dd6537c670231133d619568 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 1 Feb 2014 16:23:57 +0100 Subject: [PATCH 08/10] Avoid recursive calls to getTrimValue --- radio/src/opentx.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 921ab3384..f97e47537 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1666,10 +1666,9 @@ int getTrimValue(uint8_t phase, uint8_t idx) } else { phase = p; - if (v.mode % 2 == 0) - result = 0; - else + if (v.mode % 2 != 0) { result += v.value; + } } } } From 0b77d9921de8256cd4a8e4a5afacdb0d4a113a18 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Sat, 1 Feb 2014 10:47:21 +0100 Subject: [PATCH 09/10] VC doesn't like binary constants --- companion/src/firmwares/opentx/opentxeeprom.cpp | 4 ++-- companion/src/helpers.h | 2 ++ radio/src/myeeprom.h | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index b94134043..5658598a4 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -467,7 +467,7 @@ class PhaseField: public TransformedField { for (int i=0; i= 216) { if (phase.trimMode[i] < 0) - trimMode[i] = 0b11111; + trimMode[i] = TRIM_MODE_NONE; else trimMode[i] = 2*phase.trimRef[i] + phase.trimMode[i]; } @@ -494,7 +494,7 @@ class PhaseField: public TransformedField { { for (int i=0; i= 216) { - if (trimMode[i] == 0b11111) { + if (trimMode[i] == TRIM_MODE_NONE) { phase.trimMode[i] = -1; } else { diff --git a/companion/src/helpers.h b/companion/src/helpers.h index aa424e482..2d7f08ad6 100644 --- a/companion/src/helpers.h +++ b/companion/src/helpers.h @@ -23,6 +23,8 @@ #define TRIM_OFF 1 #define TRIM_OFFSET 2 +#define TRIM_MODE_NONE 0x1F // 0b11111 + void populateGvSourceCB(QComboBox *b, int value); void populateVoiceLangCB(QComboBox *b, QString language); void populateTTraceCB(QComboBox *b, int value); diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index ba18118fc..cf9cc61ec 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -1077,7 +1077,7 @@ PACK(typedef struct t_SwashRingData { // Swash Ring data int16_t value:11; uint16_t mode:5; }) trim_t; - #define TRIM_MODE_NONE 0b11111 + #define TRIM_MODE_NONE 0x1F // 0b11111 #else #define trim_t int16_t #endif From 2364752a985119519499c528732109e4f8ad2a88 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Fri, 7 Feb 2014 11:21:40 +0100 Subject: [PATCH 10/10] Trims included in simulator stick labels --- companion/src/simulatordialog.cpp | 10 ++++++---- companion/src/xsimulatordialog.cpp | 11 +++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/companion/src/simulatordialog.cpp b/companion/src/simulatordialog.cpp index 1bbddf4ef..85cc110d2 100644 --- a/companion/src/simulatordialog.cpp +++ b/companion/src/simulatordialog.cpp @@ -497,6 +497,8 @@ void simulatorDialog::setValues() { TxOutputs outputs; simulator->getValues(outputs); + Trims trims; + simulator->getTrims(trims); ui->chnout_1->setValue(chVal(outputs.chans[0])); ui->chnout_2->setValue(chVal(outputs.chans[1])); @@ -536,11 +538,11 @@ void simulatorDialog::setValues() ui->chnoutV_16->setText(QString("%1").arg((qreal)outputs.chans[15]*100/1024, 0, 'f', 1)); } - ui->leftXPerc->setText(QString("X %1%").arg((qreal)nodeLeft->getX()*100, 2, 'f', 0)); - ui->leftYPerc->setText(QString("Y %1%").arg((qreal)nodeLeft->getY()*-100, 2, 'f', 0)); + ui->leftXPerc->setText(QString("X %1%").arg((qreal)nodeLeft->getX()*100+trims.values[0]/5, 2, 'f', 0)); + ui->leftYPerc->setText(QString("Y %1%").arg((qreal)nodeLeft->getY()*-100+trims.values[1]/5, 2, 'f', 0)); - ui->rightXPerc->setText(QString("X %1%").arg((qreal)nodeRight->getX()*100, 2, 'f', 0)); - ui->rightYPerc->setText(QString("Y %1%").arg((qreal)nodeRight->getY()*-100, 2, 'f', 0)); + ui->rightXPerc->setText(QString("X %1%").arg((qreal)nodeRight->getX()*100+trims.values[2]/5, 2, 'f', 0)); + ui->rightYPerc->setText(QString("Y %1%").arg((qreal)nodeRight->getY()*-100+trims.values[3]/5, 2, 'f', 0)); #define CSWITCH_ON "QLabel { background-color: #4CC417 }" #define CSWITCH_OFF "QLabel { }" diff --git a/companion/src/xsimulatordialog.cpp b/companion/src/xsimulatordialog.cpp index 488439715..07524bb04 100644 --- a/companion/src/xsimulatordialog.cpp +++ b/companion/src/xsimulatordialog.cpp @@ -383,6 +383,9 @@ void xsimulatorDialog::setValues() { TxOutputs outputs; simulator->getValues(outputs); + + Trims trims; + simulator->getTrims(trims); ui->chnout_1->setValue(chVal(outputs.chans[0])); ui->chnout_2->setValue(chVal(outputs.chans[1])); @@ -422,11 +425,11 @@ void xsimulatorDialog::setValues() ui->chnoutV_16->setText(QString("%1").arg((qreal)outputs.chans[15]*100/1024, 0, 'f', 1)); } - ui->leftXPerc->setText(QString("X %1%").arg((qreal)nodeLeft->getX()*100, 2, 'f', 0)); - ui->leftYPerc->setText(QString("Y %1%").arg((qreal)nodeLeft->getY()*-100, 2, 'f', 0)); + ui->leftXPerc->setText(QString("X %1%").arg((qreal)nodeLeft->getX()*100+trims.values[0]/5, 2, 'f', 0)); + ui->leftYPerc->setText(QString("Y %1%").arg((qreal)nodeLeft->getY()*-100+trims.values[1]/5, 2, 'f', 0)); - ui->rightXPerc->setText(QString("X %1%").arg((qreal)nodeRight->getX()*100, 2, 'f', 0)); - ui->rightYPerc->setText(QString("Y %1%").arg((qreal)nodeRight->getY()*-100, 2, 'f', 0)); + ui->rightXPerc->setText(QString("X %1%").arg((qreal)nodeRight->getX()*100+trims.values[2]/5, 2, 'f', 0)); + ui->rightYPerc->setText(QString("Y %1%").arg((qreal)nodeRight->getY()*-100+trims.values[3]/5, 2, 'f', 0)); #define CSWITCH_ON "QLabel { background-color: #4CC417 }" #define CSWITCH_OFF "QLabel { }"