diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 2cac61add..0bd390b86 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -828,6 +828,8 @@ PACK(struct ModelData { SwashRingData swashR; FlightModeData flightModeData[MAX_FLIGHT_MODES]; + uint8_t xValue[2]; + AVR_FIELD(int8_t ppmFrameLength) // 0=22.5ms (10ms-30ms) 0.5ms increments NOBACKUP(uint8_t thrTraceSrc); diff --git a/radio/src/gui/128x64-ACAIR/model_controls.cpp b/radio/src/gui/128x64-ACAIR/model_controls.cpp index fc2846337..2e6032ecf 100644 --- a/radio/src/gui/128x64-ACAIR/model_controls.cpp +++ b/radio/src/gui/128x64-ACAIR/model_controls.cpp @@ -22,12 +22,28 @@ void menuModelControls(event_t event) { - MENU("CONTROL SOURCES", menuTabModel, MENU_MODEL_CONTROLS, 5, {1, 1, 1, 1, 1}); + MENU("CONTROL SOURCES", menuTabModel, MENU_MODEL_CONTROLS, 5, {0, 0, 1, 1, 1}); - for (uint8_t i=2; i<7; i++) { + coord_t y = MENU_HEADER_HEIGHT + 2; + lcdDrawText(0, y, "X1", 0); + LcdFlags attr = (menuVerticalPosition == 0 ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0); + lcdDrawNumber(40, y, g_model.xValue[0], attr); + if (attr) { + CHECK_INCDEC_MODELVAR(event, g_model.xValue[0], 0, g_model.xValue[1] - 1); + } + + y += (FH+2); + attr = (menuVerticalPosition == 1 ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0); + lcdDrawText(0, y, "X2", 0); + lcdDrawNumber(40, y, g_model.xValue[1], attr); + if (attr) { + CHECK_INCDEC_MODELVAR(event, g_model.xValue[1], g_model.xValue[0] + 1, 250); + } + + for (uint8_t i = 4; i < 7; i++) { MixData * md = mixAddress(2+i); - coord_t y = MENU_HEADER_HEIGHT + 2 + i*(FH+2) - 2*FH; - LcdFlags attr = (menuVerticalPosition==(i-2) ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0); + y += (FH+2); + attr = (menuVerticalPosition==(i-2) ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0); putsChn(0, y, i+1, 0); drawSource(40, y, md->srcRaw, STREXPANDED|(menuHorizontalPosition == 0 ? attr : 0)); drawSwitch(80, y, md->swtch, STREXPANDED|(menuHorizontalPosition == 1 ? attr : 0)); diff --git a/radio/src/gui/128x64-ACAIR/view_main.cpp b/radio/src/gui/128x64-ACAIR/view_main.cpp index 448646fd0..0b469d85a 100644 --- a/radio/src/gui/128x64-ACAIR/view_main.cpp +++ b/radio/src/gui/128x64-ACAIR/view_main.cpp @@ -28,13 +28,13 @@ #define LBOX_CENTERX (LCD_W/4 + 10) #define RBOX_CENTERX (3*LCD_W/4 - 10) #endif -#define MODELNAME_X (2*FW-2) -#define MODELNAME_Y (0) +#define MODELNAME_X (4) +#define MODELNAME_Y (3) #define PHASE_X (6*FW-1) #define PHASE_Y (2*FH) #define PHASE_FLAGS 0 -#define VBATT_X (6*FW) -#define VBATT_Y (2*FH) +#define VBATT_X (128) +#define VBATT_Y (0) #define VBATTUNIT_X (VBATT_X-1) #define VBATTUNIT_Y (3*FH) #define REBOOT_X (20*FW-3) @@ -68,7 +68,7 @@ void doMainScreenGraphics() #if defined(PCBACAIR) void displayTrims(uint8_t phase) { - for (uint8_t i=0; i<3*NUM_STICKS; i++) { + for (uint8_t i=0; i< 6; i++) { coord_t xm, ym; uint8_t stickIndex = CONVERT_MODE(i); @@ -91,9 +91,9 @@ void displayTrims(uint8_t phase) val /= 4; } - if (i >= 3) { - ym = 36; - xm = LCD_W - 20 + 8 * (i - 3); + // if (i >= 3) { + ym = 39; + xm = LCD_W / 2 + 2 + 8 * (i + 2); lcdDrawSolidVerticalLine(xm, ym-TRIM_LEN, TRIM_LEN*2); if (i!=2 || !g_model.thrTrim) { lcdDrawSolidVerticalLine(xm-1, ym-1, 3); @@ -116,34 +116,34 @@ void displayTrims(uint8_t phase) lcdDrawNumber(dir>0 ? 12 : 40, xm-2, -abs(dir/5), TINSIZE|VERTICAL); } } - } - else { - ym = 44 + (8 * (2-i)); - xm = TRIM_LEN + 4; - lcdDrawSolidHorizontalLine(xm-TRIM_LEN, ym, TRIM_LEN*2); - lcdDrawSolidHorizontalLine(xm-1, ym-1, 3); - lcdDrawSolidHorizontalLine(xm-1, ym+1, 3); - xm += val; -#if !defined(CPUM64) || !defined(TELEMETRY_FRSKY) - lcdDrawFilledRect(xm-3, ym-3, 7, 7, SOLID, att|ERASE); - if (dir >= 0) { - lcdDrawSolidVerticalLine(xm+1, ym-1, 3); - } - if (dir <= 0) { - lcdDrawSolidVerticalLine(xm-1, ym-1, 3); - } - if (exttrim) { - lcdDrawSolidVerticalLine(xm, ym-1, 3); - } -#endif -#if defined(CPUARM) - if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { - if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<0 ? TRIM_LH_POS : TRIM_LH_NEG) : (dir>0 ? TRIM_RH_POS : TRIM_RH_NEG)), ym-2, -abs(dir/5), TINSIZE); - } - } -#endif - } + // } +// else { +// ym = 26 + (8 * (2-i)); +// xm = TRIM_LEN + 4; +// lcdDrawSolidHorizontalLine(xm-TRIM_LEN, ym, TRIM_LEN*2); +// lcdDrawSolidHorizontalLine(xm-1, ym-1, 3); +// lcdDrawSolidHorizontalLine(xm-1, ym+1, 3); +// xm += val; +// #if !defined(CPUM64) || !defined(TELEMETRY_FRSKY) +// lcdDrawFilledRect(xm-3, ym-3, 7, 7, SOLID, att|ERASE); +// if (dir >= 0) { +// lcdDrawSolidVerticalLine(xm+1, ym-1, 3); +// } +// if (dir <= 0) { +// lcdDrawSolidVerticalLine(xm-1, ym-1, 3); +// } +// if (exttrim) { +// lcdDrawSolidVerticalLine(xm, ym-1, 3); +// } +// #endif +// #if defined(CPUARM) +// if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { +// if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<0 ? TRIM_LH_POS : TRIM_LH_NEG) : (dir>0 ? TRIM_RH_POS : TRIM_RH_NEG)), ym-2, -abs(dir/5), TINSIZE); +// } +// } +// #endif +// } lcdDrawSquare(xm-3, ym-3, 7, att); } } @@ -303,22 +303,22 @@ void displayVoltageOrAlarm() void displayRssiLine() { if (moduleFlag[INTERNAL_MODULE] & MODULE_BIND) { - lcdDrawText(40, 20, "BIND", INVERS); + lcdDrawText(64, 4, "BIND", INVERS); } else if (g_eeGeneral.inactivityTimer && inactivity.counter > g_eeGeneral.inactivityTimer*60) { - lcdDrawText(40, 20, "INACTIVITY", INVERS); + lcdDrawText(55, 4, "INACTIVE", INVERS); } else if (TELEMETRY_STREAMING()) { uint8_t rssi; rssi = min((uint8_t)99, TELEMETRY_RSSI()); - lcdDrawText(40, 16, "RSSI : ", SMLSIZE); - lcdDrawNumber(68, 16, rssi, LEADING0 | SMLSIZE, 2); - lcdDrawRect(40, 24, 38, 7); + lcdDrawText(57, 2, "RSSI : ", SMLSIZE); + lcdDrawNumber(85, 2, rssi, LEADING0 | SMLSIZE, 2); + lcdDrawRect(57, 8, 38, 7); uint8_t v = 4*rssi/11; - lcdDrawFilledRect(41, 25, v, 5, (rssi < getRssiAlarmValue(0)) ? DOTTED : SOLID); + lcdDrawFilledRect(58, 9, v, 5, (rssi < getRssiAlarmValue(0)) ? DOTTED : SOLID); } else { - lcdDrawText(40, 20, STR_NODATA, INVERS); + lcdDrawText(57, 4, STR_NODATA, INVERS); } } @@ -339,7 +339,7 @@ void menuMainView(event_t event) { // Model Name - putsModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE); + putsModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, MIDSIZE); // Main Voltage (or alarm if any) displayVoltageOrAlarm(); @@ -351,10 +351,10 @@ void menuMainView(event_t event) displayRssiLine(); } - for (uint8_t i=0; i<2; i++) { + for (uint8_t i=0; i<4; i++) { int16_t val = channelOutputs[i]; - uint8_t y = LCD_H/2+FH+2+i*(FH+2); - drawStringWithIndex(LCD_W/2-FW-3, y, "CH", i+1, SMLSIZE | INVERS); + uint8_t y = LCD_H/2 - (FH+2) + i * (FH+2); + drawStringWithIndex(5, y, "CH", i+1, SMLSIZE | INVERS); lcdDrawNumber(lcdLastRightPos + 1, y, PPM_CH_CENTER(i)+val/2); lcdDrawText(lcdLastRightPos, y, "us"); } diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index f59c08222..65af3cca9 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -1231,6 +1231,18 @@ void evalMixes(uint8_t tick10ms) #endif } +#if defined(PCBACAIR) + // A7 Custom mixing + // V1 = X1 / X2; (0 < V1 < 1) + uint16_t v1; + if (g_model.xValue[1] == 0) { + g_model.xValue[0] = 10; + g_model.xValue[1] = 50; + } + + v1 = g_model.xValue[0] * 100 / g_model.xValue[1]; +#endif + //========== LIMITS =============== for (uint8_t i=0; i 1024*256 @@ -1248,6 +1260,15 @@ void evalMixes(uint8_t tick10ms) int16_t value = applyLimits(i, q); // applyLimits will remove the 256 100% basis +#if defined(PCBACAIR) + // CH3 = V1 * CH1 + CH2 * (1 - V1) + if(i == 2) + value = (v1 * channelOutputs[0] + channelOutputs[1] * (100 - v1)) / 100; + // CH4 = V1 * CH2 + CH1 * (1 - V1) + else if (i == 3) + value = (v1 * channelOutputs[1] + channelOutputs[0] * (100 - v1)) / 100; +#endif + cli(); channelOutputs[i] = value; // copy consistent word to int-level sei(); diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 204784397..a260b83a6 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -593,6 +593,12 @@ void modelDefault(uint8_t id) g_model.switchWarningState |= (1 << (3*i)); } #endif + +#if defined(PCBACAIR) + g_model.xValue[0] = 10; + g_model.xValue[1] = 50; +#endif + } #if defined(VIRTUAL_INPUTS) diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index f8c91d999..e3e85d893 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -61,7 +61,7 @@ elseif(PCB STREQUAL X9D) set(SERIAL2_DRIVER ../common/arm/stm32/serial2_driver.cpp) set(GVAR_SCREEN model_gvars.cpp) elseif(PCB STREQUAL X7) - set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") + set(PWR_BUTTON "SWITCH" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)