diff --git a/CREDITS.txt b/CREDITS.txt index 673a08dc7..8cf42101f 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1486,3 +1486,23 @@ Lee Bennett Morgantech Marek Přikryl Peter Scott +Ernst Camenzind +Steve Robbins +Jean Noel Berlan +Walter Szempruch +Petr Kysela +Gerhard Zdzuj +Joseph S Robinson +Zdenek Trojanek +Fred Page +Burt Pickard-Richardson +Eric Destrebecq +Derek Quigley +Lionel Lunan +Paul Dittman +Justin Delaire +Damir Pooshs +Alvin Burke +Pete Rathbun +Christophe Molliex +Ulf Hedlund diff --git a/radio/sdcard/FrSky-utilities/FrSky SBEC.lua b/radio/sdcard/FrSky-utilities/FrSky SBEC.lua new file mode 100644 index 000000000..473b6569b --- /dev/null +++ b/radio/sdcard/FrSky-utilities/FrSky SBEC.lua @@ -0,0 +1,285 @@ + +---- ######################################################################### +---- # # +---- # Copyright (C) OpenTX # +-----# # +---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html # +---- # # +---- # This program is free software; you can redistribute it and/or modify # +---- # it under the terms of the GNU General Public License version 2 as # +---- # published by the Free Software Foundation. # +---- # # +---- # This program is distributed in the hope that it will be useful # +---- # but WITHOUT ANY WARRANTY; without even the implied warranty of # +---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +---- # GNU General Public License for more details. # +---- # # +---- ######################################################################### + +local version = "v1.2" + +local VALUE = 0 +local COMBO = 1 +local FLPOI = 2 + + +local edit = false +local page = 1 +local current = 1 --row +local refreshState = 0 +local refreshIndex = 0 +local refreshIndex3 = 0 +local pageOffset = 0 +local pages = {} +local fields = {} +local modifications = {} +local thistime = getTime() +local lastTime = thistime +local margin = 1 +local spacing = 8 +local configFields = {} +local counter = 0 + +local function drawScreenTitle(title,page, pages) + if math.fmod(math.floor(getTime()/100),10) == 0 then + title = version + end + if LCD_W == 480 then + lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) + lcd.drawText(1, 5, title, MENU_TITLE_COLOR) + lcd.drawText(LCD_W-40, 5, page.."/"..pages, MENU_TITLE_COLOR) + else + lcd.drawScreenTitle(title, page, pages) + end +end + +local settingsFields = { + {"SBEC OUTPUT (V)", VALUE, 0x80, nil, 50, 84 }, + --{"Physical ID", VALUE, 0x01, nil, 0, 26 }, + --{"Application IDgroup", VALUE, 0x0D, nil, 0, 15 }, + --{"Data rate(*100ms)", VALUE, 0x22, nil, 1, 255 }, +} + +-- Change display attribute to current field +local function addField(step) + local field = fields[current] + local min, max + if field[2] == VALUE then + min = field[5] + max = field[6] + elseif field[2] == COMBO then + min = 0 + max = #(field[5]) - 1 + end + if field[2] ~= FLPOT then --only read ? + if field[2] == VALUE and field[6] > 256 then + if field[4] > 1000 then + step = step * 50 + field[4] = math.floor(field[4]/50) + field[4] = field[4] *50 + elseif field[4] > 500 then + step = step * 20 + field[4] = math.floor(field[4]/20) + field[4] = field[4] *20 + elseif field[4] > 200 then + step = step * 10 + field[4] = math.floor(field[4]/10) + field[4] = field[4] *10 + else + step = step * 1 + field[4] = math.floor(field[4]/1) + field[4] = field[4] *1 + end + end + if (step < 0 and field[4] > min) or (step > 0 and field[4] < max) then + field[4] = field[4] + step + end + else + field[4] = field[4] + end +end + + +-- Select the next or previous editable field +local function selectField(step) + current = current + step + if current > #fields then + current = #fields + elseif current < 1 then + current = 1 + end + if current > 7 + pageOffset then + pageOffset = current - 7 + elseif current <= pageOffset then + pageOffset = current - 1 + end +end + +local function drawProgressBar() + if LCD_W == 480 then + local width = (300 * refreshIndex) / #fields + lcd.drawRectangle(100, 10, 300, 6) + lcd.drawFilledRectangle(102, 13, width, 2); + else + local width = (60 * refreshIndex) / #fields + lcd.drawRectangle(45, 1, 60, 6) + lcd.drawFilledRectangle(47, 3, width, 2); + end +end + +-- Redraw the current page +local function redrawFieldsPage() + lcd.clear() + drawScreenTitle("SBEC", page, #pages) + if refreshIndex < #fields then + drawProgressBar() + end + for index = 1, 7, 1 do + local field = fields[pageOffset+index] + if field == nil then + break + end + local attr = current == (pageOffset+index) and ((edit == true and BLINK or 0) + INVERS) or 0 + lcd.drawText(1, margin+ spacing * index, field[1]) + if field[4] == nil then + lcd.drawText(LCD_W, margin+ spacing * index, "---", attr + RIGHT) + else + if field[2] == VALUE then + if field[3] == 0x80 then + lcd.drawNumber(LCD_W, margin+ spacing * index, field[4] , attr + RIGHT + PREC1) + else + lcd.drawNumber(LCD_W, margin+ spacing * index, field[4] , attr + RIGHT) + end + end + end + end +end + +local function telemetryRead(fieldx) + return sportTelemetryPush(0x08, 0x30, 0x0e50, fieldx) +end + +local function telemetryIdle(field) + return sportTelemetryPush(0x08,0x21,0x0e50,field) +end + +local function telemetryUnIdle(field) + return sportTelemetryPush(0x08,0x20,0x0e50,field) +end + +local function telemetryWrite(fieldx, valuex) + return sportTelemetryPush(0x08, 0x31, 0x0e50, fieldx + valuex*256) +end + +local telemetryPopTimeout = 0 +local function refreshNext() + if refreshState == 0 then + if #modifications > 0 then + local modificationstmp = modifications[1][2] + telemetryWrite(modifications[1][1], modificationstmp) + refreshIndex = 0 + modifications[1] = nil + elseif refreshIndex < #fields then + local field = fields[refreshIndex + 1] + if telemetryRead(field[3]) == true then + refreshState = 1 + telemetryPopTimeout = getTime() + 80 + end + end + elseif refreshState == 1 then + local physicalId, primId, dataId, value = sportTelemetryPop() + if primId == 0x32 and dataId >= 0x0e50 and dataId <= 0x0e5f then + local fieldId = value % 256 + local field = fields[refreshIndex + 1] + if fieldId == field[3] then + local value = math.floor(value / 256) + if field[2] == VALUE then + value = value + end + + fields[refreshIndex + 1][4] = value + refreshIndex = refreshIndex + 1 + refreshState = 0 + end + elseif getTime() > telemetryPopTimeout then + refreshState = 0 + end + end +end + +local function updateField(field) + local value = field[4] + if field[2] == VALUE and #field == 6 then + value = value + end + modifications[#modifications+1] = {field[3], value} +end + +-- Main1 +local function runFieldsPage(event) + if event == EVT_EXIT_BREAK then + telemetryUnIdle(0x80) + return 2 + elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then + if fields[current][4] ~= nil then + edit = not edit + if edit == false then + updateField(fields[current]) + end + end + elseif edit then + if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT or event == EVT_RIGHT_FIRST then + addField(1) + elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT or event == EVT_LEFT_FIRST then + addField(-1) + end + else + if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_DOWN_FIRST then + selectField(1) + elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT or event == EVT_UP_FIRST then + selectField(-1) + end + end + redrawFieldsPage() + return 0 +end + + +local function runSettingsPage(event) + fields = settingsFields + return runFieldsPage(event) +end + +-- Init +local function init() + current, edit, refreshState, refreshIndex = 1, false, 0, 0 + if LCD_W == 480 then + margin = 10 + spacing = 20 + end + + pages = { + runSettingsPage, + } + + telemetryIdle(0x80) +end + +local function run(event) + if event == nil then + error("Cannot run as a model script!") + return 2 + elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST or event == EVT_SHIFT_BREAK then + --selectPage(1) + elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST or event == EVT_SHIFT_LONG then + --killEvents(event); + --selectPage(-1) + end + local result = pages[page](event) + + refreshNext() + + return result +end + +return { init=init, background=background, run=run } diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index adc4bb67d..c77a01188 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -86,13 +86,10 @@ enum MenuRadioIndexes MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_VERSION, - MENU_RADIO_SWITCHES_TEST, - MENU_RADIO_ANALOGS_TEST, MENU_RADIO_HARDWARE, #if defined(RADIO_SPECTRUM) MENU_RADIO_SPECTRUM, #endif - MENU_RADIO_CALIBRATION, MENU_RADIO_PAGES_COUNT }; @@ -113,13 +110,10 @@ static const MenuHandlerFunc menuTabGeneral[] = { menuRadioSpecialFunctions, menuRadioTrainer, menuRadioVersion, - menuRadioDiagKeys, - menuRadioDiagAnalogs, menuRadioHardware, #if defined(RADIO_SPECTRUM) menuRadioSpectrum, #endif - menuRadioCalibration }; enum MenuModelIndexes { diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp index 85686a27e..97383ba5e 100644 --- a/radio/src/gui/128x64/model_logical_switches.cpp +++ b/radio/src/gui/128x64/model_logical_switches.cpp @@ -268,7 +268,13 @@ void menuModelLogicalSwitches(event_t event) POPUP_MENU_ADD_ITEM(STR_PASTE); if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) POPUP_MENU_ADD_ITEM(STR_CLEAR); - POPUP_MENU_START(onLogicalSwitchesMenu); + if(popupMenuNoItems == 1) { + popupMenuNoItems = 0; + s_currIdx = sub; + pushMenu(menuModelLogicalSwitchOne); + } + else + POPUP_MENU_START(onLogicalSwitchesMenu); } for (uint8_t i=0; i 9 diff --git a/radio/src/gui/128x64/radio_diagkeys.cpp b/radio/src/gui/128x64/radio_diagkeys.cpp index 466a64b2a..214d14726 100644 --- a/radio/src/gui/128x64/radio_diagkeys.cpp +++ b/radio/src/gui/128x64/radio_diagkeys.cpp @@ -36,7 +36,7 @@ void displaySwitchState(uint8_t x, uint8_t y, uint8_t sw) void menuRadioDiagKeys(event_t event) { - SIMPLE_MENU(STR_MENU_RADIO_SWITCHES, menuTabGeneral, MENU_RADIO_SWITCHES_TEST, 1); + SIMPLE_SUBMENU(STR_MENU_RADIO_SWITCHES, 1); lcdDrawText(14*FW, MENU_HEADER_HEIGHT+2*FH, STR_VTRIM); diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index c438aebba..786dfbd6e 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -129,6 +129,7 @@ enum MenuRadioHardwareItems { #endif ITEM_RADIO_HARDWARE_JITTER_FILTER, ITEM_RADIO_OWNER_ID, + ITEM_RADIO_HARDWARE_DEBUG, ITEM_RADIO_HARDWARE_MAX }; @@ -181,11 +182,12 @@ void menuRadioHardware(event_t event) LABEL(Switches), SWITCHES_ROWS, #if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 - 0 /*max bauds*/, + 0 /* max bauds */, #endif BLUETOOTH_ROWS - 0 /*jitter filter*/, - 0 /*owner id*/ + 0 /* jitter filter */, + 0 /* owner id */, + 1 /* debugs */ }); uint8_t sub = menuVerticalPosition - HEADER_LINE; @@ -203,6 +205,10 @@ void menuRadioHardware(event_t event) switch(k) { case ITEM_RADIO_HARDWARE_LABEL_STICKS: lcdDrawTextAlignedLeft(y, STR_STICKS); + lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_CALIB_BTN, attr); + if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) { + pushMenu(menuRadioCalibration); + } break; case ITEM_RADIO_HARDWARE_STICK1: case ITEM_RADIO_HARDWARE_STICK2: @@ -325,6 +331,18 @@ void menuRadioHardware(event_t event) case ITEM_RADIO_OWNER_ID: editSingleName(HW_SETTINGS_COLUMN2, y, STR_OWNER_ID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr); break; + + case ITEM_RADIO_HARDWARE_DEBUG: + lcdDrawTextAlignedLeft(y, STR_DEBUG); + lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); + lcdDrawText(lcdLastRightPos + 2, y, STR_SWITCHES_BTN, menuHorizontalPosition == 1 ? attr : 0); + if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) { + if (menuHorizontalPosition == 0) + pushMenu(menuRadioDiagAnalogs); + else + pushMenu(menuRadioDiagKeys); + } + break; } } } diff --git a/radio/src/gui/212x64/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp index 819e4da8f..e0452d8ec 100644 --- a/radio/src/gui/212x64/menu_radio.cpp +++ b/radio/src/gui/212x64/menu_radio.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -26,10 +26,7 @@ const MenuHandlerFunc menuTabGeneral[] = { menuRadioSpecialFunctions, menuRadioTrainer, menuRadioVersion, - menuRadioDiagKeys, - menuRadioDiagAnalogs, - menuRadioHardware, - menuRadioCalibration + menuRadioHardware }; void menuRadioSpecialFunctions(event_t event) diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index a45483eb6..e47fcd04b 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -76,10 +76,7 @@ enum MenuRadioIndexes { MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_VERSION, - MENU_RADIO_SWITCHES_TEST, - MENU_RADIO_ANALOGS_TEST, MENU_RADIO_HARDWARE, - MENU_RADIO_CALIBRATION, MENU_RADIO_PAGES_COUNT }; diff --git a/radio/src/gui/212x64/radio_calibration.cpp b/radio/src/gui/212x64/radio_calibration.cpp index 339db6a02..e6b85c622 100644 --- a/radio/src/gui/212x64/radio_calibration.cpp +++ b/radio/src/gui/212x64/radio_calibration.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -195,7 +195,7 @@ void menuCommonCalib(event_t event) void menuRadioCalibration(event_t event) { - check_simple(STR_MENUCALIBRATION, event, MENU_RADIO_CALIBRATION, menuTabGeneral, DIM(menuTabGeneral), 0); + check_submenu_simple(STR_MENUCALIBRATION, event, 0); menuCommonCalib(READ_ONLY() ? 0 : event); if (menuEvent) { menuCalibrationState = CALIB_START; diff --git a/radio/src/gui/212x64/radio_diaganas.cpp b/radio/src/gui/212x64/radio_diaganas.cpp index 46e426c19..39f656b81 100644 --- a/radio/src/gui/212x64/radio_diaganas.cpp +++ b/radio/src/gui/212x64/radio_diaganas.cpp @@ -22,7 +22,7 @@ void menuRadioDiagAnalogs(event_t event) { - SIMPLE_MENU(STR_MENU_RADIO_ANALOGS, menuTabGeneral, MENU_RADIO_ANALOGS_TEST, 0); + SIMPLE_SUBMENU(STR_MENU_RADIO_ANALOGS, 0); for (uint8_t i=0; i