1
0
Fork 0
mirror of https://github.com/EdgeTX/edgetx.git synced 2025-07-23 08:15:13 +03:00

Merge with latest 2.3

This commit is contained in:
Bertrand Songis 2020-03-18 17:09:38 +01:00
commit 1d96af49c4
No known key found for this signature in database
GPG key ID: F189F79290FEC50F
52 changed files with 520 additions and 301 deletions

View file

@ -1704,3 +1704,5 @@ Roland Nittby
Frank Barbas
Scott McCoy
Fabrice Debonnet
James Laver
Kevin Bowens

View file

@ -36,6 +36,8 @@ local function create(zone, options)
counter = 0,
shadowed = 0,
telemResetCount = 0,
telemResetLowestMinRSSI = 101,
no_telem_blink = 0,
isDataAvailable = 0,
cellDataLive = {0,0,0,0,0,0},
@ -76,13 +78,46 @@ local function update(wgt, options)
end
-- A quick and dirty check for empty table
local function isEmpty(self)
for _, _ in pairs(self) do
return false
-- clear old telemetry data upon reset event
local function onTelemetryResetEvent(wgt)
wgt.telemResetCount = wgt.telemResetCount + 1
wgt.cellDataLive = {0,0,0,0,0,0}
wgt.cellDataHistoryLowest = {5,5,5,5,5,5}
wgt.cellDataHistoryCellLowest = 5
end
return true
-- workaround to detect telemetry-reset event, until a proper implementation on the lua interface will be created
-- this workaround assume that:
-- RSSI- is always going down
-- RSSI- is reset on the C++ side when a telemetry-reset is pressed by user
-- widget is calling this func on each refresh/background
-- on event detection, the function onTelemetryResetEvent() will be trigger
--
local function detectResetEvent(wgt)
local currMinRSSI = getValue('RSSI-')
if (currMinRSSI == nil) then return
end
if (currMinRSSI == wgt.telemResetLowestMinRSSI) then return end
if (currMinRSSI < wgt.telemResetLowestMinRSSI) then
-- rssi just got lower, record it
wgt.telemResetLowestMinRSSI = currMinRSSI
return
end
-- reset telemetry detected
wgt.telemResetLowestMinRSSI = 101
-- notify event
onTelemetryResetEvent(wgt)
end
--- This function return the percentage remaining in a single Lipo cel
local function getCellPercent(cellValue)
@ -293,13 +328,14 @@ local function refreshZoneMedium(wgt)
for i = 1, wgt.cellCount, 1 do
local cellY = wgt.zone.y + (i-1)* (cellH -1)
-- fill current value
-- fill current cell
lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataLive[i], wgt.cellMax, wgt.cellMax - 0.2))
--lcd.drawFilledRectangle(wgt.zone.x + cellX , cellY, 58, cellH, CUSTOM_COLOR)
local percentCurrent = getCellPercent(wgt.cellDataLive[i])
local percentMin = getCellPercent(wgt.cellDataHistoryLowest[i])
lcd.drawFilledRectangle(wgt.zone.x + cellX , cellY, cellW * percentCurrent / 100, cellH, CUSTOM_COLOR)
-- fill min
lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataHistoryLowest[i], wgt.cellMax, wgt.cellMax - 0.2))
lcd.drawFilledRectangle(wgt.zone.x + cellX + ((percentCurrent - percentMin) / 100) , cellY, cellW - (cellW * (percentCurrent - percentMin) / 100), cellH, CUSTOM_COLOR)
@ -413,6 +449,8 @@ end
local function background(wgt)
if (wgt == nil) then return end
detectResetEvent(wgt)
calculateBatteryData(wgt)
end
@ -430,6 +468,7 @@ local function refresh(wgt)
wgt.shadowed = 0
end
detectResetEvent(wgt)
calculateBatteryData(wgt)

View file

@ -169,6 +169,7 @@ enum MainViews {
VIEW_OUTPUTS_BARS,
VIEW_INPUTS,
VIEW_TIMER2,
VIEW_CHAN_MONITOR,
VIEW_COUNT
};
#endif

View file

@ -813,7 +813,7 @@ PACK(struct RadioData {
NOBACKUP(uint8_t disableRssiPoweroffAlarm:1);
NOBACKUP(uint8_t USBMode:2);
NOBACKUP(uint8_t jackMode:2);
NOBACKUP(uint8_t spare3:1 SKIP);
NOBACKUP(uint8_t sportUpdatePower:1 SKIP);
NOBACKUP(char ttsLanguage[2]);
NOBACKUP(int8_t beepVolume:4);
NOBACKUP(int8_t wavVolume:4);

View file

@ -233,6 +233,9 @@ void pushMenuTextView(const char *filename);
void pushModelNotes();
void readModelNotes();
void menuChannelsView(event_t event);
void menuChannelsViewCommon(event_t event);
#define CURSOR_MOVED_LEFT(event) (IS_ROTARY_LEFT(event) || EVT_KEY_MASK(event) == KEY_LEFT)
#define CURSOR_MOVED_RIGHT(event) (IS_ROTARY_RIGHT(event) || EVT_KEY_MASK(event) == KEY_RIGHT)
@ -292,6 +295,7 @@ void drawProgressScreen(const char * title, const char * message, int num, int d
void drawSleepBitmap();
void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible);
void drawGauge(coord_t x, coord_t y, coord_t w, coord_t h, int32_t val, int32_t max);
void drawAlertBox(const char * title, const char * text, const char * action);
void showAlertBox(const char * title, const char * text, const char * action , uint8_t sound);
@ -301,7 +305,7 @@ void showAlertBox(const char * title, const char * text, const char * action , u
#define IS_MAIN_VIEW_DISPLAYED() menuHandlers[0] == menuMainView
#define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetry
#define IS_OTHER_VIEW_DISPLAYED() false
#define IS_OTHER_VIEW_DISPLAYED() menuHandlers[0] == menuChannelsView
void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlags flags);

View file

@ -109,8 +109,6 @@ void lcdDrawSizedText(coord_t x, coord_t y, const char * s, unsigned char len);
void lcdDrawTextAlignedLeft(coord_t y, const char * s);
void drawTimerWithMode(coord_t x, coord_t y, uint8_t index, LcdFlags att);
#define lcdDrawTextAlignedCenter(y, s) lcdDrawText((LCD_W-sizeof(s)*FW+FW+1)/2, y, s)
void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0);
void lcdDrawHexChar(coord_t x, coord_t y, uint8_t val, LcdFlags flags=0);

View file

@ -50,7 +50,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF
enum MenuRadioIndexes
{
#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE)
#if defined(RADIO_TOOLS)
MENU_RADIO_TOOLS,
#endif
CASE_SDCARD(MENU_RADIO_SD_MANAGER)
@ -76,7 +76,7 @@ void menuRadioPowerMeter(event_t event);
void menuRadioCalibration(event_t event);
static const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = {
#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE)
#if defined(RADIO_TOOLS)
menuRadioTools,
#endif
CASE_SDCARD(menuRadioSdManager)

View file

@ -161,6 +161,18 @@ void menuModelCurveOne(event_t event)
POPUP_MENU_START(onCurveOneMenu);
}
break;
#if defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_MENU):
pushMenu(menuChannelsView);
killEvents(event);
break;
#elif defined(NAVIGATION_XLITE)
case EVT_KEY_LONG(KEY_SHIFT):
pushMenu(menuChannelsView);
killEvents(event);
break;
#endif
}
drawCurve(0);

View file

@ -51,7 +51,7 @@ void menuModelFailsafe(event_t event)
SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx));
lcdDrawTextAlignedCenter(0, TR_FAILSAFESET);
lcdDrawText(LCD_W / 2, 0, STR_FAILSAFESET, CENTERED);
lcdInvertLine(0);
for (uint8_t i=0; i<NUM_BODY_LINES; i++) {

View file

@ -72,6 +72,17 @@ enum ExposFields {
void menuModelExpoOne(event_t event)
{
#if defined(NAVIGATION_X7)
if (event == EVT_KEY_LONG(KEY_MENU)) {
pushMenu(menuChannelsView);
killEvents(event);
}
#elif defined(NAVIGATION_XLITE)
if (event == EVT_KEY_LONG(KEY_SHIFT)) {
pushMenu(menuChannelsView);
killEvents(event);
}
#endif
ExpoData * ed = expoAddress(s_currIdx);
drawSource(PSIZE(TR_MENUINPUTS)*FW+FW, 0, MIXSRC_FIRST_INPUT+ed->chn, 0);

View file

@ -85,6 +85,17 @@ void drawOffsetBar(uint8_t x, uint8_t y, MixData * md)
void menuModelMixOne(event_t event)
{
#if defined(NAVIGATION_X7)
if (event == EVT_KEY_LONG(KEY_MENU)) {
pushMenu(menuChannelsView);
killEvents(event);
}
#elif defined(NAVIGATION_XLITE)
if (event == EVT_KEY_LONG(KEY_SHIFT)) {
pushMenu(menuChannelsView);
killEvents(event);
}
#endif
MixData * md2 = mixAddress(s_currIdx) ;
putsChn(PSIZE(TR_MIXES)*FW+FW, 0, md2->destCh+1,0);

View file

@ -104,7 +104,7 @@ void menuModelSensor(event_t event)
if (sensor->type == TELEM_TYPE_CUSTOM) {
lcdDrawTextAlignedLeft(y, STR_ID);
lcdDrawHexNumber(SENSOR_2ND_COLUMN, y, sensor->id, LEFT|(menuHorizontalPosition==0 ? attr : 0));
lcdDrawHexChar(SENSOR_3RD_COLUMN, y, (sensor->instance & 0x1F) + 1, LEFT|(menuHorizontalPosition==1 ? attr : 0));
lcdDrawNumber(SENSOR_3RD_COLUMN, y, (sensor->instance & 0x1F) + 1, LEFT|(menuHorizontalPosition==1 ? attr : 0));
if (attr && s_editMode > 0) {
switch (menuHorizontalPosition) {
case 0:

View file

@ -179,7 +179,7 @@ void menuFirstCalib(event_t event)
chainMenu(menuMainView);
}
else {
lcdDrawTextAlignedCenter(0*FH, TR_MENUCALIBRATION);
lcdDrawText(LCD_W / 2, 0, STR_MENUCALIBRATION, CENTERED);
lcdInvertLine(0);
menuCommonCalib(event);
}

View file

@ -20,7 +20,30 @@
#include "opentx.h"
void menuChannelsView(event_t event)
constexpr coord_t CHANNEL_NAME_OFFSET = 1;
constexpr coord_t CHANNEL_VALUE_OFFSET = CHANNEL_NAME_OFFSET + 42;
constexpr coord_t CHANNEL_GAUGE_OFFSET = CHANNEL_VALUE_OFFSET;
constexpr coord_t CHANNEL_BAR_WIDTH = 70;
constexpr coord_t CHANNEL_PROPERTIES_OFFSET = CHANNEL_GAUGE_OFFSET + CHANNEL_BAR_WIDTH + 2;
#if defined(NAVIGATION_X7)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
#define EVT_KEY_PREVIOUS_PAGE EVT_ROTARY_LEFT
#elif defined(NAVIGATION_XLITE)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_UP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_DOWN)
#define EVT_KEY_NEXT_PAGE EVT_KEY_BREAK(KEY_RIGHT)
#define EVT_KEY_PREVIOUS_PAGE EVT_KEY_BREAK(KEY_LEFT)
#else
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_UP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_DOWN)
#define EVT_KEY_NEXT_PAGE EVT_KEY_BREAK(KEY_RIGHT)
#define EVT_KEY_PREVIOUS_PAGE EVT_KEY_BREAK(KEY_LEFT)
#endif
void menuChannelsViewCommon(event_t event)
{
bool newLongNames = false;
@ -31,13 +54,79 @@ void menuChannelsView(event_t event)
memclear(&reusableBuffer.viewChannels, sizeof(reusableBuffer.viewChannels));
break;
case EVT_KEY_FIRST(KEY_ENTER):
reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView;
break;
}
ch = 8 * (g_eeGeneral.view / ALTERNATE_VIEW);
// Screen title
lcdDrawText(LCD_W / 2, 0, reusableBuffer.viewChannels.mixersView ? STR_MIXERS_MONITOR : STR_CHANNELS_MONITOR, CENTERED);
lcdInvertLine(0);
int16_t limits = 512 * 2;
// Channels
for (uint8_t line = 0; line < 8; line++) {
LimitData * ld = limitAddress(ch);
const uint8_t y = 9 + line * 7;
const int32_t val = reusableBuffer.viewChannels.mixersView ? ex_chans[ch] : channelOutputs[ch];
const uint8_t lenLabel = ZLEN(g_model.limitData[ch].name);
// Channel name if present, number if not
if (lenLabel > 0) {
if (lenLabel > 4)
reusableBuffer.viewChannels.longNames = true;
lcdDrawSizedText(CHANNEL_NAME_OFFSET, y, g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name), ZCHAR | SMLSIZE);
}
else {
putsChn(CHANNEL_NAME_OFFSET, y, ch + 1, SMLSIZE);
}
// Value
#if defined(PPM_UNIT_US)
lcdDrawNumber(CHANNEL_VALUE_OFFSET, y + 1, PPM_CH_CENTER(ch) + val / 2, TINSIZE | RIGHT);
#elif defined(PPM_UNIT_PERCENT_PREC1)
lcdDrawNumber(CHANNEL_VALUE_OFFSET, y + 1, calcRESXto1000(val), PREC1 | TINSIZE | RIGHT);
#else
lcdDrawNumber(CHANNEL_VALUE_OFFSET, y + 1, calcRESXto1000(val) / 10, TINSIZE | RIGHT);
#endif
// Gauge
drawGauge(CHANNEL_GAUGE_OFFSET, y, CHANNEL_BAR_WIDTH, 6, val, limits);
if (!reusableBuffer.viewChannels.mixersView) {
// Properties
#if defined(OVERRIDE_CHANNEL_FUNCTION)
if (safetyCh[ch] != OVERRIDE_CHANNEL_UNDEFINED)
lcdDrawText(CHANNEL_PROPERTIES_OFFSET, y, "OVR", TINSIZE);
else
#endif
if (ld && ld->revert) {
lcdDrawText(CHANNEL_PROPERTIES_OFFSET, y, "INV", TINSIZE);
}
}
++ch;
}
reusableBuffer.viewChannels.longNames = newLongNames;
}
void menuChannelsView(event_t event)
{
switch (event) {
case EVT_KEY_BREAK(KEY_EXIT):
popMenu();
break;
case EVT_KEY_FIRST(KEY_RIGHT):
case EVT_KEY_FIRST(KEY_LEFT):
reusableBuffer.viewChannels.secondPage = !reusableBuffer.viewChannels.secondPage;
case EVT_KEY_NEXT_PAGE:
g_eeGeneral.view = (g_eeGeneral.view + (4 * ALTERNATE_VIEW) + ALTERNATE_VIEW) % (4 * ALTERNATE_VIEW);
break;
case EVT_KEY_PREVIOUS_PAGE:
g_eeGeneral.view = (g_eeGeneral.view + (4 * ALTERNATE_VIEW) - ALTERNATE_VIEW) % (4 * ALTERNATE_VIEW);
break;
case EVT_KEY_FIRST(KEY_ENTER):
@ -45,67 +134,5 @@ void menuChannelsView(event_t event)
break;
}
if (reusableBuffer.viewChannels.secondPage)
ch = 16;
else
ch = 0;
if (reusableBuffer.viewChannels.mixersView) {
lcdDrawTextAlignedCenter(0, TR_MIXERS_MONITOR);
}
else {
lcdDrawTextAlignedCenter(0, TR_CHANNELS_MONITOR);
}
lcdInvertLine(0);
// Column separator
lcdDrawSolidVerticalLine(LCD_W/2, FH, LCD_H-FH);
for (uint8_t col=0; col<2; col++) {
uint8_t x = col*LCD_W/2+1;
// Channels
for (uint8_t line=0; line<8; line++) {
uint8_t y = 9+line*7;
int32_t val = (reusableBuffer.viewChannels.mixersView) ? ex_chans[ch] : channelOutputs[ch];
uint8_t ofs = (col ? 0 : 1);
// Channel name if present, number if not
uint8_t lenLabel = ZLEN(g_model.limitData[ch].name);
if (lenLabel > 4) {
newLongNames = reusableBuffer.viewChannels.longNames = true;
}
if (lenLabel > 0)
lcdDrawSizedText(x+1-ofs, y, g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name), ZCHAR | SMLSIZE);
else
putsChn(x+1-ofs, y, ch+1, SMLSIZE);
// Value
#if defined(PPM_UNIT_US)
uint8_t wbar = (reusableBuffer.viewChannels.longNames ? 54 : 64);
lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, PPM_CH_CENTER(ch)+val/2, TINSIZE|RIGHT);
#elif defined(PPM_UNIT_PERCENT_PREC1)
uint8_t wbar = (reusableBuffer.viewChannels.longNames ? 48 : 58);
lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, calcRESXto1000(val), PREC1|TINSIZE|RIGHT);
#else
uint8_t wbar = (reusableBuffer.viewChannels.longNames ? 54 : 64);
lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, calcRESXto1000(val)/10, TINSIZE|RIGHT);
#endif
// Gauge
// uint16_t lim = (g_model.extendedLimits ? (512 * (long)LIMIT_EXT_PERCENT / 100) : 512) * 2;
//#ifdef MIXERS_MONITOR
// if (mixersView)
// lim = 512 * 2 * 2;
//#endif
// TODO ? drawGauge(x+LCD_W/2-3-wbar-ofs, y, wbar, 6, val, lim);
ch++;
}
}
reusableBuffer.viewChannels.longNames = newLongNames;
menuChannelsViewCommon(event);
}

View file

@ -328,17 +328,12 @@ void menuMainView(event_t event)
}
break;
*/
case EVT_KEY_NEXT_PAGE:
case EVT_KEY_PREVIOUS_PAGE:
if (view_base <= VIEW_INPUTS) {
if (view_base == VIEW_INPUTS)
g_eeGeneral.view ^= ALTERNATE_VIEW;
else
g_eeGeneral.view = (g_eeGeneral.view + (4*ALTERNATE_VIEW) + ((event==EVT_KEY_PREVIOUS_PAGE) ? -ALTERNATE_VIEW : ALTERNATE_VIEW)) % (4*ALTERNATE_VIEW);
storageDirty(EE_GENERAL);
AUDIO_KEY_PRESS();
}
break;
case EVT_KEY_CONTEXT_MENU:
@ -369,7 +364,7 @@ void menuMainView(event_t event)
break;
case EVT_KEY_GENERAL_MENU:
pushMenu(menuRadioTools);
pushMenu(menuTabGeneral[0]);
killEvents(event);
break;
#endif
@ -379,7 +374,8 @@ void menuMainView(event_t event)
case EVT_KEY_PREVIOUS_VIEW:
case EVT_KEY_NEXT_VIEW:
// TODO try to split those 2 cases on 9X
g_eeGeneral.view = (event == EVT_KEY_PREVIOUS_VIEW ? (view_base == VIEW_COUNT-1 ? 0 : view_base+1) : (view_base == 0 ? VIEW_COUNT-1 : view_base-1));
g_eeGeneral.view = (event == EVT_KEY_PREVIOUS_VIEW ? (view_base == VIEW_COUNT - 1 ? 0 : view_base + 1) : (view_base == 0 ? VIEW_COUNT - 1 : view_base -
1));
storageDirty(EE_GENERAL);
break;
#else
@ -410,40 +406,22 @@ void menuMainView(event_t event)
break;
}
{
// Flight Mode Name
uint8_t mode = mixerCurrentFlightMode;
lcdDrawSizedText(PHASE_X, PHASE_Y, g_model.flightModeData[mode].name, sizeof(g_model.flightModeData[mode].name), ZCHAR|PHASE_FLAGS);
switch (view_base) {
case VIEW_CHAN_MONITOR:
menuChannelsViewCommon(event);
break;
// Model Name
drawModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE);
// Main Voltage (or alarm if any)
displayVoltageOrAlarm();
// Timer 1
drawTimerWithMode(125, 2*FH, 0, RIGHT | DBLSIZE);
// Trims sliders
displayTrims(mode);
// RSSI gauge / external antenna
drawExternalAntennaAndRSSI();
}
if (view_base < VIEW_INPUTS) {
case VIEW_OUTPUTS_VALUES:
case VIEW_OUTPUTS_BARS:
// scroll bar
lcdDrawHorizontalLine(38, 34, 54, DOTTED);
lcdDrawSolidHorizontalLine(38 + (g_eeGeneral.view / ALTERNATE_VIEW) * 13, 34, 13, SOLID);
for (uint8_t i=0; i<8; i++) {
uint8_t x0, y0;
uint8_t chan = 8 * (g_eeGeneral.view / ALTERNATE_VIEW) + i;
int16_t val = channelOutputs[chan];
switch (view_base) {
case VIEW_OUTPUTS_VALUES:
if (view_base == VIEW_OUTPUTS_VALUES) {
x0 = (i % 4 * 9 + 3) * FW / 2;
y0 = i / 4 * FH + 40;
#if defined(PPM_UNIT_US)
@ -453,10 +431,9 @@ void menuMainView(event_t event)
#else
lcdDrawNumber(x0+4*FW , y0, calcRESXto1000(val)/10, RIGHT); // G: Don't like the decimal part*
#endif
break;
case VIEW_OUTPUTS_BARS:
#define WBAR2 (50/2)
}
else {
constexpr coord_t WBAR2 = (50/2);
x0 = i<4 ? LCD_W/4+2 : LCD_W*3/4-2;
y0 = 38+(i%4)*5;
@ -473,11 +450,15 @@ void menuMainView(event_t event)
x0 -= len;
lcdDrawSolidHorizontalLine(x0, y0+1, len);
lcdDrawSolidHorizontalLine(x0, y0-1, len);
}
}
break;
}
}
}
else if (view_base == VIEW_INPUTS) {
case VIEW_TIMER2:
drawTimerWithMode(87, 5 * FH, 1, RIGHT | DBLSIZE);
break;
case VIEW_INPUTS:
if (view == VIEW_INPUTS) {
// Sticks + Pots
doMainScreenGraphics();
@ -557,16 +538,34 @@ void menuMainView(event_t event)
y += 12;
}
}
break;
}
else {
// Timer2
drawTimerWithMode(87, 5*FH, 1, RIGHT | DBLSIZE);
}
if (view_base != VIEW_CHAN_MONITOR) {
// Flight Mode Name
uint8_t mode = mixerCurrentFlightMode;
lcdDrawSizedText(PHASE_X, PHASE_Y, g_model.flightModeData[mode].name, sizeof(g_model.flightModeData[mode].name), ZCHAR | PHASE_FLAGS);
// Model Name
putsModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE);
// Main Voltage (or alarm if any)
displayVoltageOrAlarm();
// Timer 1
drawTimerWithMode(125, 2 * FH, 0, RIGHT | DBLSIZE);
// Trims sliders
displayTrims(mode);
// RSSI gauge / external antenna
drawExternalAntennaAndRSSI();
// And ! in case of unexpected shutdown
if (isAsteriskDisplayed()) {
lcdDrawChar(REBOOT_X, 0 * FH, '!', INVERS);
}
}
#if defined(GVARS)
if (gvarDisplayTimer > 0) {
@ -575,7 +574,8 @@ void menuMainView(event_t event)
drawMessageBox(warningText);
lcdDrawSizedText(16, 5 * FH, g_model.gvars[gvarLastChanged].name, LEN_GVAR_NAME, ZCHAR);
lcdDrawText(16 + 6 * FW, 5 * FH, "[", BOLD);
drawGVarValue(lcdLastRightPos, 5*FH, gvarLastChanged, GVAR_VALUE(gvarLastChanged, getGVarFlightMode(mixerCurrentFlightMode, gvarLastChanged)), LEFT|BOLD);
drawGVarValue(lcdLastRightPos, 5 * FH, gvarLastChanged, GVAR_VALUE(gvarLastChanged, getGVarFlightMode(mixerCurrentFlightMode, gvarLastChanged)),
LEFT | BOLD);
if (g_model.gvars[gvarLastChanged].unit) {
lcdDrawText(lcdLastRightPos, 5 * FH, "%", BOLD);
}

View file

@ -65,6 +65,17 @@ void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uin
lcdDrawVerticalLine(x, y + yofs, yhgt, SOLID, FORCE);
}
void drawGauge(coord_t x, coord_t y, coord_t w, coord_t h, int32_t val, int32_t max)
{
lcdDrawRect(x, y, w+1, h);
lcdDrawFilledRect(x+1, y+1, w-1, 4, SOLID, ERASE);
coord_t len = limit((uint8_t)1, uint8_t((abs(val) * w/2 + max/2) / max), uint8_t(w/2));
coord_t x0 = (val>0) ? x+w/2 : x+1+w/2-len;
for (coord_t i=h-2; i>0; i--) {
lcdDrawSolidHorizontalLine(x0, y+i, len);
}
}
void title(const char * s)
{
lcdDrawText(0, 0, s, INVERS);

View file

@ -110,8 +110,6 @@ void lcdDrawText(coord_t x, coord_t y, const char * s);
void lcdDrawSizedText(coord_t x, coord_t y, const char * s, unsigned char len);
void lcdDrawTextAlignedLeft(coord_t y, const char * s);
#define lcdDrawTextAlignedCenter(y, s) lcdDrawText((LCD_W-sizeof(s)*FW+FW+1)/2, y, s)
void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0);
void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode, uint8_t len);
void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode=0);

View file

@ -21,7 +21,7 @@
#include "opentx.h"
const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = {
#if defined(LUA) || defined(PXX2)
#if defined(RADIO_TOOLS)
menuRadioTools,
#endif
menuRadioSdManager,

View file

@ -80,7 +80,7 @@ void menuModelFailsafe(event_t event)
}
}
lcdDrawTextAlignedCenter(0, TR_FAILSAFESET);
lcdDrawText(LCD_W / 2, 0, STR_FAILSAFESET, CENTERED);
lcdInvertLine(0);
coord_t x = colW;

View file

@ -202,7 +202,7 @@ void menuFirstCalib(event_t event)
chainMenu(menuMainView);
}
else {
lcdDrawTextAlignedCenter(0*FH, TR_MENUCALIBRATION);
lcdDrawText(LCD_W / 2, 0, STR_MENUCALIBRATION, CENTERED);
lcdInvertLine(0);
menuCommonCalib(event);
}

View file

@ -61,11 +61,7 @@ void menuChannelsView(event_t event)
else if (g_model.extendedLimits)
limits *= LIMIT_EXT_PERCENT / 100;
if (reusableBuffer.viewChannels.mixersView)
lcdDrawTextAlignedCenter(0, TR_MIXERS_MONITOR);
else
lcdDrawTextAlignedCenter(0, TR_CHANNELS_MONITOR);
lcdDrawText(LCD_W / 2, 0, reusableBuffer.viewChannels.mixersView ? STR_MIXERS_MONITOR : STR_CHANNELS_MONITOR, CENTERED);
lcdInvertLine(0);
// Column separator

View file

@ -455,7 +455,7 @@ void menuMainView(event_t event)
break;
case EVT_KEY_LONG(KEY_MENU):
pushMenu(menuRadioTools);
pushMenu(menuTabGeneral[0]);
killEvents(event);
break;
#endif

View file

@ -59,14 +59,6 @@ bool menuTextView(event_t event)
lcd->drawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT);
}
#if 0
char * title = s_text_file;
#if defined(SIMU)
if (!strncmp(title, "./", 2)) title += 2;
#endif
lcdDrawTextAlignedCenter(MENU_FOOTER_TOP, title, HEADER_COLOR);
#endif
drawVerticalScrollbar(LCD_W-5, 50, 195, menuVerticalOffset, lines_count, NUM_BODY_LINES);
return true;

View file

@ -184,6 +184,9 @@ enum {
ITEM_RADIO_HARDWARE_JITTER_FILTER,
ITEM_RADIO_HARDWARE_RAS,
#if defined(SPORT_UPDATE_PWR_GPIO)
ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER,
#endif
ITEM_RADIO_HARDWARE_DEBUG,
#if defined(EEPROM_RLC)
ITEM_RADIO_BACKUP_EEPROM,
@ -295,6 +298,12 @@ void onHardwareAntennaSwitchConfirm(const char * result)
#define HW_SETTINGS_COLUMN2 (HW_SETTINGS_COLUMN1 + 5*FW)
#endif
#if defined(SPORT_UPDATE_PWR_GPIO)
#define SPORT_POWER_ROWS 0,
#else
#define SPORT_POWER_ROWS
#endif
#if defined(EEPROM_RLC)
void onFactoryResetConfirm(const char * result)
{
@ -334,7 +343,7 @@ void menuRadioHardware(event_t event)
0 /* ADC filter */,
READONLY_ROW /* RAS */,
SPORT_POWER_ROWS
1 /* debugs */,
0,
@ -631,6 +640,14 @@ void menuRadioHardware(event_t event)
else
lcdDrawText(lcdNextPos, y, "---");
break;
#if defined(SPORT_UPDATE_PWR_GPIO)
case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER:
g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN2, y, STR_SPORT_UPDATE_POWER_MODE, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event);
if (attr && checkIncDec_Ret) {
SPORT_UPDATE_POWER_INIT();
}
break;
#endif
case ITEM_RADIO_HARDWARE_DEBUG:
lcdDrawTextAlignedLeft(y, STR_DEBUG);

View file

@ -488,6 +488,7 @@ const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename, Pro
uint8_t extPwr = IS_EXTERNAL_MODULE_ON();
EXTERNAL_MODULE_OFF();
uint8_t spuPwr = IS_SPORT_UPDATE_POWER_ON();
SPORT_UPDATE_POWER_OFF();
progressHandler(getBasename(filename), STR_DEVICE_RESET, 0, 0);
@ -532,6 +533,10 @@ const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename, Pro
setupPulsesExternalModule();
}
if (spuPwr) {
SPORT_UPDATE_POWER_ON();
}
state = SPORT_IDLE;
resumePulses();
@ -753,6 +758,7 @@ const char * FrskyChipFirmwareUpdate::flashFirmware(const char * filename, Progr
uint8_t extPwr = IS_EXTERNAL_MODULE_ON();
EXTERNAL_MODULE_OFF();
uint8_t spuPwr = IS_SPORT_UPDATE_POWER_ON();
SPORT_UPDATE_POWER_OFF();
if (wait) {
@ -792,6 +798,10 @@ const char * FrskyChipFirmwareUpdate::flashFirmware(const char * filename, Progr
setupPulsesExternalModule();
}
if (spuPwr) {
SPORT_UPDATE_POWER_ON();
}
resumePulses();
return result;

View file

@ -536,6 +536,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename)
uint8_t extPwr = IS_EXTERNAL_MODULE_ON();
EXTERNAL_MODULE_OFF();
uint8_t spuPwr = IS_SPORT_UPDATE_POWER_ON();
SPORT_UPDATE_POWER_OFF();
#if defined(COLORLCD)
@ -587,6 +588,10 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename)
setupPulsesExternalModule();
}
if (spuPwr) {
SPORT_UPDATE_POWER_ON();
}
resumePulses();
return result == nullptr;

View file

@ -1265,7 +1265,7 @@ static int luaModelSetOutput(lua_State *L)
}
/*luadoc
@function model.getGlobalVariable(index [, flight_mode])
@function model.getGlobalVariable(index, flight_mode)
Return current global variable value

View file

@ -2025,6 +2025,10 @@ void opentxInit()
btInit();
#endif
#if defined(SPORT_UPDATE_PWR_GPIO)
SPORT_UPDATE_POWER_INIT();
#endif
#if defined(COLORLCD)
loadTheme();
#endif

View file

@ -225,6 +225,10 @@
#define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE)
#endif
#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE)
#define RADIO_TOOLS
#endif
// RESX range is used for internal calculation; The menu says -100.0 to 100.0; internally it is -1024 to 1024 to allow some optimizations
#define RESX_SHIFT 10
#define RESX 1024

View file

@ -59,6 +59,9 @@ static const char * options[] = {
#if defined(INTERNAL_MODULE_MULTI)
"internalmulti",
#endif
#if defined(INTERNAL_MODULE_PXX2)
"internalaccess",
#endif
#if defined(MULTIMODULE)
"multimodule",
#endif

View file

@ -74,6 +74,14 @@ void sportUpdatePowerOff()
{
GPIO_ResetBits(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN);
}
void sportUpdatePowerInit()
{
if (g_eeGeneral.sportUpdatePower == 1)
sportUpdatePowerOn();
else
sportUpdatePowerOff();
}
#endif
void boardInit()

View file

@ -592,11 +592,16 @@ void telemetryPortInvertedInit(uint32_t baudrate);
#if HAS_SPORT_UPDATE_CONNECTOR()
void sportUpdatePowerOn();
void sportUpdatePowerOff();
void sportUpdatePowerInit();
#define SPORT_UPDATE_POWER_ON() sportUpdatePowerOn()
#define SPORT_UPDATE_POWER_OFF() sportUpdatePowerOff()
#define SPORT_UPDATE_POWER_INIT() sportUpdatePowerInit()
#define IS_SPORT_UPDATE_POWER_ON() (GPIO_ReadInputDataBit(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN) == Bit_SET)
#else
#define SPORT_UPDATE_POWER_ON()
#define SPORT_UPDATE_POWER_OFF()
#define SPORT_UPDATE_POWER_INIT()
#define IS_SPORT_UPDATE_POWER_ON() (false)
#endif
// Second serial port driver

View file

@ -326,7 +326,7 @@ uint8_t OpenTxSimulator::getSensorInstance(uint16_t id, uint8_t defaultValue)
if (isTelemetryFieldAvailable(i)) {
TelemetrySensor * sensor = &g_model.telemetrySensors[i];
if (sensor->id == id) {
return sensor->instance;
return sensor->frskyInstance.physID + 1;
}
}
}

View file

@ -466,6 +466,10 @@ void sportUpdatePowerOff()
{
}
void sportUpdatePowerInit()
{
}
void boardInit()
{
}

View file

@ -74,6 +74,7 @@ set(GUI_SRC
radio_diaganas.cpp
view_telemetry.cpp
view_about.cpp
view_channels.cpp
)
if(GVARS)

View file

@ -62,6 +62,14 @@ void sportUpdatePowerOff()
{
GPIO_SPORT_UPDATE_PWR_GPIO_OFF(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN);
}
void sportUpdatePowerInit()
{
if (g_eeGeneral.sportUpdatePower == 1)
sportUpdatePowerOn();
else
sportUpdatePowerOff();
}
#endif
void boardInit()

View file

@ -719,12 +719,17 @@ void telemetryPortInvertedInit(uint32_t baudrate);
void sportUpdateInit();
void sportUpdatePowerOn();
void sportUpdatePowerOff();
void sportUpdatePowerInit();
#define SPORT_UPDATE_POWER_ON() sportUpdatePowerOn()
#define SPORT_UPDATE_POWER_OFF() sportUpdatePowerOff()
#define SPORT_UPDATE_POWER_INIT() sportUpdatePowerInit()
#define IS_SPORT_UPDATE_POWER_ON() (GPIO_ReadInputDataBit(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN) == Bit_SET)
#else
#define sportUpdateInit()
#define SPORT_UPDATE_POWER_ON()
#define SPORT_UPDATE_POWER_OFF()
#define SPORT_UPDATE_POWER_INIT()
#define IS_SPORT_UPDATE_POWER_ON() (false)
#endif
// Audio driver

View file

@ -168,7 +168,13 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe
if (primId == DATA_FRAME) {
uint8_t originMask;
if (origin == TELEMETRY_ENDPOINT_SPORT) {
#if defined(SIMU) && defined(INTERNAL_MODULE_PXX2)
// When running simu on ACCESS radio, we set the origin as internal module
origin = 0;
originMask = 0x01;
#else
originMask = 0x04;
#endif
}
else {
uint8_t moduleIndex = (origin >> 2);

View file

@ -153,7 +153,7 @@ inline uint8_t modelTelemetryProtocol()
return PROTOCOL_TELEMETRY_MULTIMODULE;
}
#if defined(INTERNAL_MODULE_MULTI)
if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) {
if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE) {
return PROTOCOL_TELEMETRY_MULTIMODULE;
}
#endif

View file

@ -80,6 +80,7 @@ ISTR(SWTYPES);
ISTR(POTTYPES);
ISTR(SLIDERTYPES);
ISTR(ANTENNA_MODES);
ISTR(SPORT_UPDATE_POWER_MODES);
ISTR(CRSF_BAUDRATE);
ISTR(PPM_POL);
@ -693,6 +694,7 @@ const char STR_RTC_CHECK[] = TR_RTC_CHECK;
const char STR_EXIT[] = TR_EXIT;
const char STR_MODULE_RANGE[] = TR_MODULE_RANGE;
const char STR_RECEIVER_OPTIONS[] = TR_RECEIVER_OPTIONS;
const char STR_SPORT_UPDATE_POWER_MODE[] = TR_SPORT_UPDATE_POWER_MODE;
#if defined(PCBHORUS)
const char STR_ASSIGN_SPLASH[] = TR_ASSIGN_SPLASH;

View file

@ -987,6 +987,8 @@ extern const char STR_MENU_OTHER[];
extern const char STR_MENU_INVERT[];
extern const char STR_JITTER_FILTER[];
extern const char STR_RTC_CHECK[];
extern const char STR_SPORT_UPDATE_POWER_MODE[];
extern const char STR_SPORT_UPDATE_POWER_MODES[];
#if MENUS_LOCK == 1
extern const char STR_UNLOCKED[];

View file

@ -990,6 +990,9 @@
#define STR_FACTORYRESET "Tovární reset"
#define TR_CONFIRMRESET TR("Smazat vše ?", "Smazat modely a nastavení?")
#define TR_TOO_MANY_LUA_SCRIPTS "Příliš mnoho skriptů!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis column headers
#define TR_PHASES_HEADERS_NAME "Název"

View file

@ -1003,6 +1003,9 @@
#define STR_FACTORYRESET TR("Werksreset", "Auf Werkseinstellungen")
#define TR_CONFIRMRESET TR("Alles löschen? ","ALLE Modelle+Einst. löschen?")
#define TR_TOO_MANY_LUA_SCRIPTS "Zu viele Skripte!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis specific column headers
#define TR_PHASES_HEADERS_NAME "Name "

View file

@ -1002,6 +1002,9 @@
#define STR_FACTORYRESET "Factory reset"
#define TR_CONFIRMRESET TR("Erase ALL", "Erase ALL models and settings?")
#define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis column headers
#define TR_PHASES_HEADERS_NAME "Name"

View file

@ -1025,6 +1025,9 @@
#define STR_FACTORYRESET "Factory reset"
#define TR_CONFIRMRESET "Erase ALL models and settings?"
#define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis column headers

View file

@ -1019,6 +1019,9 @@
#define STR_FACTORYRESET "Factory reset"
#define TR_CONFIRMRESET "Erase ALL models and settings?"
#define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis column headers

View file

@ -1027,6 +1027,9 @@
#endif
#define TR_CONFIRMRESET TR("Effacer TOUT?","Effacer TOUS modèles/réglages?")
#define TR_TOO_MANY_LUA_SCRIPTS "Trop de scripts lua!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis column headers
#define TR_PHASES_HEADERS_NAME "Nom"

View file

@ -1024,6 +1024,9 @@
#define STR_FACTORYRESET "Inizializza dati"
#define TR_CONFIRMRESET "Resettare TUTTI i dati?"
#define TR_TOO_MANY_LUA_SCRIPTS "Troppi Scripts Lua!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis column headers

View file

@ -1011,6 +1011,9 @@
#endif
#define TR_CONFIRMRESET TR("Wis Alles?", "Wis ALLE modellen en instellingen?")
#define TR_TOO_MANY_LUA_SCRIPTS "Te veel Lua scripts!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis column headers

View file

@ -1020,6 +1020,9 @@
#define STR_FACTORYRESET "Ustaw.Fabrycz"
#define TR_CONFIRMRESET "WYkasować wszytkie modele? "
#define TR_TOO_MANY_LUA_SCRIPTS "Za dużo skryptów Lua!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis column headers

View file

@ -1010,6 +1010,9 @@
#define STR_FACTORYRESET "Factory reset"
#define TR_CONFIRMRESET "Erase ALL models and settings?"
#define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis column headers

View file

@ -1023,6 +1023,9 @@
#define STR_FACTORYRESET "Factory reset"
#define TR_CONFIRMRESET "Erase ALL models and settings?"
#define TR_TOO_MANY_LUA_SCRIPTS "För många Lua-scripts!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
// Horus and Taranis column headers