diff --git a/radio/src/bitfield.h b/radio/src/bitfield.h new file mode 100644 index 000000000..84b3632b5 --- /dev/null +++ b/radio/src/bitfield.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * This file is based on work published at http://www.coranac.com/documents/working-with-bits-and-bitfields + * + * 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. + */ + +#ifndef BITFIELD_H +#define BITFIELD_H + +// A set of bitfield handling macros +#define BF_BIT(n) ( 1<<(n) ) +#define BF_BIT_GET(y, mask) ( y & (mask) ) +#define BF_BIT_SET(y, mask) ( y |= (mask) ) +#define BF_BIT_CLEAR(y, mask) ( y &= ~(mask) ) +#define BF_BIT_FLIP(y, mask) ( y ^= (mask) ) +#define BF_SINGLE_BIT_GET(y, i) BF_BIT_GET(y, BF_BIT(i)) +#define BF_SINGLE_BIT_SET(y, i) BF_BIT_SET(y, BF_BIT(i)) + +//! Create a bitmask of length 'len'. +#define BF_BITMASK(len) ( BF_BIT(len)-1 ) + +//! Create a bitfield mask of length 'len' starting at bit 'start'. +#define BF_MASK(start, len) ( BF_BITMASK(len)<<(start) ) + +//! Prepare a bitmask for insertion or combining. +#define BF_PREP(x, start, len) ( ((x)&BF_BITMASK(len)) << (start) ) + +//! Extract a bitfield of length 'len' starting at bit 'start' from 'y'. +#define BF_GET(y, start, len) ( ((y)>>(start)) & BF_BITMASK(len) ) + +//! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'. +#define BF_SET(y, x, start, len) \ + ( y= ((y) &~ BF_MASK(start, len)) | BF_PREP(x, start, len) ) + +#endif //BITFIELD_H \ No newline at end of file diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index b57681d5c..d54886ab4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -20,8 +20,9 @@ #include -uint8_t g_moduleIdx; +uint8_t g_moduleIdx, g_receiverIdx; void menuModelFailsafe(event_t event); +void menuModelPinmap(event_t event); #if defined(PCBTARANIS) uint8_t getSwitchWarningsCount() @@ -83,11 +84,11 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NUMBER, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_RANGE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NUMBER, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_RANGE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER, @@ -1117,24 +1118,19 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_RANGE: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_RANGE: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP: { - // TODO have a proper channel assignement screen, section bellow is just for tests - uint8_t useUpperChannels; uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - if (memcmp(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)) == 0) - useUpperChannels = 0; - else - useUpperChannels = 1; - - useUpperChannels = editCheckBox(useUpperChannels, MODEL_SETUP_2ND_COLUMN, y, INDENT INDENT "Use CH9-16", attr, event); - - if (useUpperChannels) - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].channelMapping, CH9TO16_CHANNEL_MAPPING, sizeof(uint64_t)); - else - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); + lcdDrawTextAlignedLeft(y, INDENT INDENT "PinMap"); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[set]", attr); + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + g_receiverIdx = receiverIdx; + g_moduleIdx = moduleIdx; + pushMenu(menuModelPinmap); + } } break; @@ -1744,3 +1740,39 @@ void menuModelFailsafe(event_t event) lcdDrawText(CENTER_OFS, LCD_H - (FH + 1), STR_OUTPUTS2FAILSAFE, INVERS); } } + +void menuModelPinmap(event_t event) +{ + SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + 1); + + lcdDrawTextAlignedCenter(0, PINMAPSET); + lcdInvertLine(0); + + //const coord_t x = 1; + coord_t y = FH + 1; + uint8_t line = (menuVerticalPosition >= sentModuleChannels(g_moduleIdx) ? 2 : 0); + uint8_t pin = (menuVerticalPosition >= 8 ? 8 : 0) + line; + + for (; line < 8; line++) { + //Pin + lcdDrawTextAlignedLeft(y, "Pin"); + lcdDrawNumber(lcdLastRightPos+5, y, pin); + lcdDrawText(lcdLastRightPos+5, y, " -> "); + + + //Channel + LcdFlags flags = SMLSIZE; + if (menuVerticalPosition == pin) { + flags |= INVERS; + if (s_editMode) { + flags |= BLINK; + } + } + lcdDrawNumber(lcdLastRightPos+5, y, getPinOuput(g_receiverIdx, g_moduleIdx, pin), flags); + + y += FH; + + if (++pin >= sentModuleChannels(g_moduleIdx)) + break; + } +} \ No newline at end of file diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 4bda954de..c2429c512 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -200,6 +200,11 @@ static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; constexpr int8_t MAX_EXTRA_MODULE_CHANNELS_M8 = 8; // only 16ch PPM +inline uint8_t getPinOuput(uint8_t receiverIdx, uint8_t moduleIdx, uint8_t pin) +{ + return ((g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping >> (pin + ((pin & 0x01) ? -1 : 1 )) * 4) & 0x0F); +} + inline int8_t maxModuleChannels_M8(uint8_t idx) { if (isExtraModule(idx)) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 37aaade7f..08829094b 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -368,6 +368,7 @@ const char STR_USBMODE[] = TR_USBMODE; const char STR_JACKMODE[] = TR_JACKMODE; const char STR_FAILSAFE[] = TR_FAILSAFE; const char STR_FAILSAFESET[] = TR_FAILSAFESET; +const char STR_PINMAPSET[] = TR_PINMAPSET; const char STR_HOLD[] = TR_HOLD; const char STR_NONE[] = TR_NONE; const char STR_MENUSENSOR[] = TR_MENUSENSOR; diff --git a/radio/src/translations.h b/radio/src/translations.h index d7a6231f9..5e1ba7019 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -581,6 +581,7 @@ extern const char STR_MODULE_TELEMETRY[]; extern const char STR_MODULE_TELEM_ON[]; extern const char STR_FAILSAFE[]; extern const char STR_FAILSAFESET[]; +extern const char STR_PINMAPSET[]; extern const char STR_HOLD[]; extern const char STR_NONE[]; extern const char STR_MENUSENSOR[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 156f99783..e4e193e73 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -921,6 +921,7 @@ #define TR_EXTERNALRF "Externí RF modul" #define TR_FAILSAFE TR("Failsafe", "Mód Failsafe") #define TR_FAILSAFESET "NASTAVENÍ FAILSAFE" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENZOR" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 1b51b422b..4ca0b4b87 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -926,6 +926,7 @@ #define TR_EXTERNALRF "Externes HF-Modul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode") #define TR_FAILSAFESET "Failsafe setzen" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 9909e51fe..11271bdc4 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -925,6 +925,7 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe mode") #define TR_FAILSAFESET "FAILSAFE SETTINGS" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index b8c89d222..c23960ff0 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -932,6 +932,7 @@ #define TR_EXTERNALRF "Externa RF" #define TR_FAILSAFE INDENT"Modo sgdad." #define TR_FAILSAFESET "AJUSTES SGDAD." +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index fe20cef75..23299f60d 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -924,6 +924,7 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE INDENT "Failsafe mode" #define TR_FAILSAFESET "FAILSAFE SETTINGS" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index cb58975f1..c0db44d14 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -936,6 +936,7 @@ #define TR_EXTERNALRF "HF externe" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Type failsafe") #define TR_FAILSAFESET "REGLAGES FAILSAFE" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "CAPTEUR" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index f793d6ba3..0519c3c62 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -926,6 +926,7 @@ #define TR_EXTERNALRF "Modulo esterno" #define TR_FAILSAFE "Modo failsafe" #define TR_FAILSAFESET TR("FAILSAFE","IMPOSTAZIONI FAILSAFE") +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 9b53b1cb6..a7f76b6af 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -927,6 +927,7 @@ #define TR_EXTERNALRF "Externe RF" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Modus") #define TR_FAILSAFESET "Failsafe instellen" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index bceef23f4..a2b77ddb1 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -927,6 +927,7 @@ #define TR_EXTERNALRF "Zewn.Moduł RF" #define TR_FAILSAFE TR(INDENT"Failsafe",INDENT"Tryb Failsafe") #define TR_FAILSAFESET "USTAWIENIE FAILSAFE" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "CZUJNIK" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 74295f38b..fc86c00c1 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -931,6 +931,7 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE "Failsafe mode" #define TR_FAILSAFESET "FAILSAFE SETTINGS" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 299800b1f..e92877c95 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -940,6 +940,7 @@ #define TR_EXTERNALRF "Extern Radiomodul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafeläge") #define TR_FAILSAFESET "FailsafeInställning" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR"