diff --git a/radio/src/MultiProtoDefs.h b/radio/src/MultiProtoDefs.h new file mode 100644 index 00000000000..095f806af16 --- /dev/null +++ b/radio/src/MultiProtoDefs.h @@ -0,0 +1,241 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * 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. + */ + +// +// Data based on MPM firmware version 1.3.3.33 multi.txt +// + +#if defined(MULTIMODULE) or defined(SIMU) + +#pragma once + +// +// Common list of supported Multi protocols +// +enum ModuleSubtypeMulti { + MODULE_SUBTYPE_MULTI_FIRST = 0, + MODULE_SUBTYPE_MULTI_FLYSKY = MODULE_SUBTYPE_MULTI_FIRST, + MODULE_SUBTYPE_MULTI_HUBSAN, //1 + MODULE_SUBTYPE_MULTI_FRSKY, //2 + MODULE_SUBTYPE_MULTI_HISKY, //3 + MODULE_SUBTYPE_MULTI_V2X2, //4 + MODULE_SUBTYPE_MULTI_DSM2, //5 + MODULE_SUBTYPE_MULTI_DEVO, + MODULE_SUBTYPE_MULTI_YD717, + MODULE_SUBTYPE_MULTI_KN, + MODULE_SUBTYPE_MULTI_SYMAX, + MODULE_SUBTYPE_MULTI_SLT, //10 + MODULE_SUBTYPE_MULTI_CX10, + MODULE_SUBTYPE_MULTI_CG023, + MODULE_SUBTYPE_MULTI_BAYANG, + MODULE_SUBTYPE_MULTI_FRSKYX, + MODULE_SUBTYPE_MULTI_ESky, //15 + MODULE_SUBTYPE_MULTI_MT99XX, + MODULE_SUBTYPE_MULTI_MJXQ, + MODULE_SUBTYPE_MULTI_SHENQI, + MODULE_SUBTYPE_MULTI_FY326, + MODULE_SUBTYPE_MULTI_FUTABA, //20 + MODULE_SUBTYPE_MULTI_J6PRO, + MODULE_SUBTYPE_MULTI_FQ777, + MODULE_SUBTYPE_MULTI_ASSAN, + MODULE_SUBTYPE_MULTI_FRSKYV, + MODULE_SUBTYPE_MULTI_HONTAI, //25 + MODULE_SUBTYPE_MULTI_OLRS, + MODULE_SUBTYPE_MULTI_FS_AFHDS2A, + MODULE_SUBTYPE_MULTI_Q2X2, + MODULE_SUBTYPE_MULTI_WK_2X01, + MODULE_SUBTYPE_MULTI_Q303, //30 + MODULE_SUBTYPE_MULTI_GW008, + MODULE_SUBTYPE_MULTI_DM002, + MODULE_SUBTYPE_MULTI_CABELL, + MODULE_SUBTYPE_MULTI_ESKY150, + MODULE_SUBTYPE_MULTI_H83D, //35 + MODULE_SUBTYPE_MULTI_CORONA, + MODULE_SUBTYPE_MULTI_CFLIE, + MODULE_SUBTYPE_MULTI_HITEC, + MODULE_SUBTYPE_MULTI_WFLY, + MODULE_SUBTYPE_MULTI_BUGS, //40 + MODULE_SUBTYPE_MULTI_BUGS_MINI, + MODULE_SUBTYPE_MULTI_TRAXXAS, + MODULE_SUBTYPE_MULTI_NCC1701, + MODULE_SUBTYPE_MULTI_E01X, + MODULE_SUBTYPE_MULTI_V911S, //45 + MODULE_SUBTYPE_MULTI_GD00X, + MODULE_SUBTYPE_MULTI_V761, + MODULE_SUBTYPE_MULTI_KF606, + MODULE_SUBTYPE_MULTI_REDPINE, + MODULE_SUBTYPE_MULTI_POTENSIC, //50 + MODULE_SUBTYPE_MULTI_ZSX, + MODULE_SUBTYPE_MULTI_HEIGHT, + MODULE_SUBTYPE_MULTI_SCANNER, + MODULE_SUBTYPE_MULTI_FRSKYX_RX, + MODULE_SUBTYPE_MULTI_AFHDS2A_RX, //55 + MODULE_SUBTYPE_MULTI_HOTT, + MODULE_SUBTYPE_MULTI_FX, + MODULE_SUBTYPE_MULTI_BAYANG_RX, + MODULE_SUBTYPE_MULTI_PELIKAN, + MODULE_SUBTYPE_MULTI_TIGER, //60 + MODULE_SUBTYPE_MULTI_XK, + MODULE_SUBTYPE_MULTI_XN297DUMP, + MODULE_SUBTYPE_MULTI_FRSKYX2, + MODULE_SUBTYPE_MULTI_FRSKY_R9, + MODULE_SUBTYPE_MULTI_PROPEL, //65 + MODULE_SUBTYPE_MULTI_FRSKYL, + MODULE_SUBTYPE_MULTI_SKYARTEC, + MODULE_SUBTYPE_MULTI_ESKY150V2, + MODULE_SUBTYPE_MULTI_DSM_RX, + MODULE_SUBTYPE_MULTI_JJRC345, //70 + MODULE_SUBTYPE_MULTI_Q90C, + MODULE_SUBTYPE_MULTI_KYOSHO, + MODULE_SUBTYPE_MULTI_RLINK, + MODULE_SUBTYPE_MULTI_ELRS, + MODULE_SUBTYPE_MULTI_REALACC, //75 + MODULE_SUBTYPE_MULTI_OMP, + MODULE_SUBTYPE_MULTI_MLINK, + MODULE_SUBTYPE_MULTI_WFLY2, + MODULE_SUBTYPE_MULTI_E016HV2, + MODULE_SUBTYPE_MULTI_E010R5, //80 + MODULE_SUBTYPE_MULTI_LOLI, + MODULE_SUBTYPE_MULTI_E129, + MODULE_SUBTYPE_MULTI_JOYSWAY, + MODULE_SUBTYPE_MULTI_E016H, + MODULE_SUBTYPE_MULTI_CONFIG, //85 + MODULE_SUBTYPE_MULTI_IKEAANSLUTA, + MODULE_SUBTYPE_MULTI_WILLIFM, + MODULE_SUBTYPE_MULTI_LOSI, + MODULE_SUBTYPE_MULTI_MOULDKG, + MODULE_SUBTYPE_MULTI_XERALL, //90 + MODULE_SUBTYPE_MULTI_MT99XX2, + MODULE_SUBTYPE_MULTI_KYOSHO2, + MODULE_SUBTYPE_MULTI_SCORPIO, + // + // spare entries - don't touch, + // just add to known protocols + // + MODULE_SUBTYPE_MULTI_NN1, + MODULE_SUBTYPE_MULTI_NN2, + MODULE_SUBTYPE_MULTI_NN3, + MODULE_SUBTYPE_MULTI_NN4, + MODULE_SUBTYPE_MULTI_NN5, + MODULE_SUBTYPE_MULTI_NN6, + MODULE_SUBTYPE_MULTI_NN7, + MODULE_SUBTYPE_MULTI_NN8, + MODULE_SUBTYPE_MULTI_NN9, + MODULE_SUBTYPE_MULTI_NN10, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_NN10, + // + // Sentinel + // + MODULE_SUBTYPE_MULTI_SENTINEL = 0xfe, + // + // most likely no longer required + // + MM_RF_CUSTOM_SELECTED = 0xff +}; + +// +// Common list of Multi protocol names. Needs to match enum ModuleSubtypeMulti +// +#define KNOWN_PROTO_NAMES \ + "FlySky","Hubsan","FrSky D","Hisky","V2x2","DSM","Devo","YD717","KN","SymaX",\ + "SLT","CX10","CG023","Bayang","FrSky X","ESky","MT99XX","MJXq","Shenqi","FY326",\ + "Futaba","J6 Pro","FQ777","Assan","FrSky V","Hontai","OpenLrs","FlSky2A","Q2x2","Walkera", \ + "Q303","GW008","DM002","Cabell","Esky150","H8 3D","Corona","CFlie","Hitec","WFLY",\ + "Bugs","BugMini","Traxxas","NCC1701","E01X","V911S","GD00X","V761","KF606","Redpine",\ + "Potensi","ZSX","Height","Scanner","FrSkyRX","FS2A_RX","HoTT","FX","BayanRX","Pelikan",\ + "Tiger", "XK","XN297DU","FrSkyX2","FrSkyR9","Propel","FrSky L","Skyartc","ESkyV2","DSM_RX",\ + "JJRC345","Q90C","Kyosho","RadLink","ExpLRS","Realacc","OMP","M-Link","WFLY2","E016Hv2",\ + "E010r5","LOLI","E129","JOYSWAY","E016H","Config","IKEA","WILLIFM","Losi","MouldKg",\ + "Xerall","MT99XX2", "Kyosho2", "Scorpio" +#define SPARE_PROTO_NAMES \ + "NN 1","NN 2","NN 3","NN 4","NN 5","NN 6","NN 7","NN 8","NN 9","NN 10" +#define SPARE_SUBTYPE_NAMES \ + "SUB 1","SUB 2","SUB 3","SUB 4","SUB 5","SUB 6","SUB 7","SUB 8" +#define PROTO_NAMES KNOWN_PROTO_NAMES,SPARE_PROTO_NAMES + +// +// Common list of option names. Needs to match inline void getMultiOptionValues cases. +// +#define BAYANG_OPTION_TELEMETRY_NAMES "Off","On","Off+Aux","On+Aux" +#define DSM2_OPTION_SERVOFREQ_NAMES "22ms","11ms" +#define DSM_CLONE_NAMES "Normal","Cloned" + +// +// Common list of protocols the MPM doesn't allow to be selected (not sent by MPM protocol scan) +// +inline bool isMultiProtocolSelectable(int protocol) +{ + return (protocol != MODULE_SUBTYPE_MULTI_CONFIG && + protocol != MODULE_SUBTYPE_MULTI_SCANNER + ); +} + +// +// Common protocol specific option values +// +inline void getMultiOptionValues(int8_t multi_proto, int8_t &min, int8_t &max) { + switch (multi_proto) { + case MODULE_SUBTYPE_MULTI_DSM2: + min = 0; // STR_MULTI_SERVOFREQ: 22ms, 11ms + max = 1; + break; + case MODULE_SUBTYPE_MULTI_BAYANG: + min = 0; // STR_MULTI_TELEMETRY: Off, On, Off+AUX, On+Aux + max = 3; + break; + case MODULE_SUBTYPE_MULTI_OLRS: + min = -1; + max = 7; + break; + case MODULE_SUBTYPE_MULTI_FS_AFHDS2A: + min = 0; // STR_MULTI_SERVOFREQ: (50+optionvalue*5)ms + max = 70; + break; + case MODULE_SUBTYPE_MULTI_XN297DUMP: + min = -1; + max = 84; + break; + default: + min = -128; // all other option types, e.g STR_MULTI_RFTUNE + max = 127; + break; + } +} + +// +// Out of the ordinary max. numbers of model IDs +// +#define MODULE_SUBTYPE_MULTI_OLRS_RXNUM 4 +#define MODULE_SUBTYPE_MULTI_BUGS_RXNUM 15 +#define MODULE_SUBTYPE_MULTI_BUGS_MINI_RXNUM 15 + +// +// subtypes for Radiomaster T8 bind key and Radiomaster RTF use. +// see defines RTF, BIND_KEY and the protocol subtype list STRLIST() +// in MultiSubTypeDefs.h +// +#define MULTI_FRSKYD_SUBTYPE_D8 0 +#define MULTI_FRSKYX_SUBTYPE_D16_FCC 0 +#define MULTI_FRSKYX_SUBTYPE_D16_LBT 2 +#define MULTI_FRSKYX2_SUBTYPE_D16_FCC 0 +#define MULTI_FRSKYX2_SUBTYPE_D16_LBT 2 + +#endif // MULTIMODULE diff --git a/radio/src/MultiSubtypeDefs.h b/radio/src/MultiSubtypeDefs.h new file mode 100644 index 00000000000..2949f513ab3 --- /dev/null +++ b/radio/src/MultiSubtypeDefs.h @@ -0,0 +1,281 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * 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. + */ + +// +// Data based on MPM firmware version 1.3.3.33 multi.txt +// + +#if defined(MULTIMODULE) or defined(SIMU) + +#pragma once + +// +// Single source of Multi protocol defintions: +// - MultiProtoDefs.h contains the protocol list and names as per Multi.txt +// Widely used in Companion/Simulator and radio firmware code +// - MutliSubtypesDef.h contains subtype definitions and generates data structurse +// for Companion and Simulator/radio code in radio/src/gui/gui_common.cpp and +// companion/src/firmwares/multiprotocols.cpp +// + +// +// include list of Multi protocosl +// +#include "MultiProtoDefs.h" + +// +// This distinction circumvents the different ways of handling translations of menu texts +// and sets the defines STRLIST and PROTODEF such that the correct Companion/Simulator and radio code +// data structures are generated +// +#if defined(CPN) + #define STRLIST(x, ...) static const QStringList x __VA_ARGS__; + #define PROTODEF const Multiprotocols multiProtocols + + #define STR_MULTI_OPTION QT_TRANSLATE_NOOP("Multiprotocols", "Option value") + #define STR_MULTI_RFTUNE QT_TRANSLATE_NOOP("Multiprotocols", "CC2500 frequency fine tune") + #define STR_MULTI_VIDFREQ QT_TRANSLATE_NOOP("Multiprotocols", "Video TX frequency") + #define STR_MULTI_FIXEDID QT_TRANSLATE_NOOP("Multiprotocols", "Fixed ID value") + #define STR_MULTI_TELEMETRY QT_TRANSLATE_NOOP("Multiprotocols", "Telemetry") + #define STR_MULTI_SERVOFREQ QT_TRANSLATE_NOOP("Multiprotocols", "Servo update rate") + #define STR_MULTI_MAX_THROW QT_TRANSLATE_NOOP("Multiprotocols", "Enable max throw") + #define STR_MULTI_RFCHAN QT_TRANSLATE_NOOP("Multiprotocols", "Select RF channel") + #define STR_MULTI_RFPOWER QT_TRANSLATE_NOOP("Multiprotocols", "RF power") + + #define STR_MULTI_DEFAULT QT_TRANSLATE_NOOP("Multiprotocols", "DEFAULT") + STRLIST(NO_SUBTYPE, {STR_MULTI_DEFAULT}) +#elif defined(MULTIMODULE) + #define STRLIST(x, ...) const char* const x[] = __VA_ARGS__; + #define PROTODEF(...) const mm_protocol_definition multi_protocols[] = __VA_ARGS__ + + const char* const mm_options_strings::options[] = { + nullptr, + STR_MULTI_OPTION, + STR_MULTI_RFTUNE, + STR_MULTI_VIDFREQ, + STR_MULTI_FIXEDID, + STR_MULTI_TELEMETRY, + STR_MULTI_SERVOFREQ, + STR_MULTI_MAX_THROW, + STR_MULTI_RFCHAN, + STR_MULTI_RFPOWER, + STR_MULTI_WBUS // probably not used by MPM anymore + }; + + #define NO_SUBTYPE nullptr +#else + #define STRLIST(x, ...) + #define PROTODEF(...) +#endif + +// +// Common definitions of Multi protocol subtype options (only for protocols that do have subtypes) +// +STRLIST(STR_SUBTYPE_FLYSKY, {"Std","V9x9","V6x6","V912","CX20"}) +STRLIST(STR_SUBTYPE_HUBSAN, {"H107","H301","H501"}) +STRLIST(STR_SUBTYPE_FRSKYD, {"D8","Cloned"}) +STRLIST(STR_SUBTYPE_FRSKYX, {"D16","D16 8ch","LBT(EU)","LBT 8ch","Cloned", "Cloned 8ch"}) +STRLIST(STR_SUBTYPE_HISKY, {"Std","HK310"}) +STRLIST(STR_SUBTYPE_V2X2, {"Std","JXD506","MR101"}) +STRLIST(STR_SUBTYPE_DSM, {"2 1F","2 2F","X 1F","X 2F","Auto","R 1F"}) +STRLIST(STR_SUBTYPE_DEVO, {"8ch","10ch","12ch","6ch","7ch"}) +STRLIST(STR_SUBTYPE_YD717, {"Std","SkyWlkr","Syma X4","XINXUN","NIHUI"}) +STRLIST(STR_SUBTYPE_KN, {"WLtoys","FeiLun"}) +STRLIST(STR_SUBTYPE_SYMAX, {"Std","X5C"}) +STRLIST(STR_SUBTYPE_SLT, {"V1_6ch","V2_8ch","Q100","Q200","MR100"}) +STRLIST(STR_SUBTYPE_CX10, {"Green","Blue","DM007","-","JC3015a","JC3015b","MK33041"}) +STRLIST(STR_SUBTYPE_CG023, {"Std","YD829"}) +STRLIST(STR_SUBTYPE_BAYANG, {"Std","H8S3D","X16 AH","IRDrone","DHD D4","QX100"}) +STRLIST(STR_SUBTYPE_ESky, {"Std","ET4"}) +STRLIST(STR_SUBTYPE_MT99, {"MT99","H7","YZ","LS","FY805","A180","Dragon","F949G"}) +STRLIST(STR_SUBTYPE_MJXQ, {"WLH08","X600","X800","H26D","E010","H26WH","Phoenix"}) +STRLIST(STR_SUBTYPE_FY326, {"Std","FY319"}) +STRLIST(STR_SUBTYPE_FUTABA, {"SFHSS"}) +STRLIST(STR_SUBTYPE_HONTAI, {"Std","JJRC X1","X5C1","FQ_951"}) +STRLIST(STR_SUBTYPE_AFHDS2A, {"PWM,IBUS","PPM,IBUS","PWM,SBUS","PPM,SBUS","PWM,IB16","PPM,IB16","PWM,SB16","PPM,SB16"}) +STRLIST(STR_SUBTYPE_Q2X2, {"Q222","Q242","Q282"}) +STRLIST(STR_SUBTYPE_WK2x01, {"WK2801","WK2401","W6_5_1","W6_6_1","W6_HeL","W6_HeI"}) +STRLIST(STR_SUBTYPE_Q303, {"Std","CX35","CX10D","CX10WD"}) +STRLIST(STR_SUBTYPE_CABELL, {"V3","V3 Telm","-","-","-","-","F-Safe","Unbind"}) +STRLIST(STR_SUBTYPE_ESKY150, {"4ch","7ch"}) +STRLIST(STR_SUBTYPE_H83D, {"Std","H20H","H20Mini","H30Mini"}) +STRLIST(STR_SUBTYPE_CORONA, {"V1","V2","FD V3"}) +STRLIST(STR_SUBTYPE_HITEC, {"Optima","Opt Hub","Minima"}) +STRLIST(STR_SUBTYPE_WFLY, {"WFR0x"}) +STRLIST(STR_SUBTYPE_BUGS_MINI, {"Std","Bugs3H"}) +STRLIST(STR_SUBTYPE_TRAXXAS, {"6519"}) +STRLIST(STR_SUBTYPE_E01X, {"E012","E015"}) +STRLIST(STR_SUBTYPE_V911S, {"Std","E119"}) +STRLIST(STR_SUBTYPE_GD00X, {"GD_V1","GD_V2"}) +STRLIST(STR_SUBTYPE_V761, {"3ch","4ch","TOPRC"}) +STRLIST(STR_SUBTYPE_KF606, {"KF606","MIG320","ZCZ50"}) +STRLIST(STR_SUBTYPE_REDPINE, {"Fast","Slow"}) +STRLIST(STR_SUBTYPE_POTENSIC, {"A20"}) +STRLIST(STR_SUBTYPE_ZSX, {"280JJRC"}) +STRLIST(STR_SUBTYPE_HEIGHT, {"5ch","8ch"}) +STRLIST(STR_SUBTYPE_FRSKYX_RX, {"Multi","CloneTX","EraseTX","CPPM"}) +STRLIST(STR_SUBTYPE_HOTT, {"Sync","No_Sync"}) +STRLIST(STR_SUBTYPE_FX, {"816","620","9630"}) +STRLIST(STR_SUBTYPE_PELIKAN, {"Pro","Lite","SCX24"}) +STRLIST(STR_SUBTYPE_XK, {"X450","X420"}) +STRLIST(STR_SUBTYPE_XN297DUMP, {"250K","1M","2M","AUTO","NRF","CC2500"}) +STRLIST(STR_SUBTYPE_FRSKYR9, {"915MHz","868MHz","915 8ch","868 8ch","FCC","--","FCC 8ch","-- 8ch"}) +STRLIST(STR_SUBTYPE_PROPEL, {"74-Z"}) +STRLIST(STR_SUBTYPE_FRSKYL, {"LR12","LR12 6ch"}) +STRLIST(STR_SUBTYPE_ESKY150V2, {"150 V2"}) +STRLIST(STR_SUBTYPE_JJRC345, {"Std","SkyTmbr"}) +STRLIST(STR_SUBTYPE_KYOSHO, {"FHSS","Hype"}) +STRLIST(STR_SUBTYPE_KYOSHO2, {"KT-17"}) +STRLIST(STR_SUBTYPE_RLINK, {"Surface","Air","DumboRC"}) +STRLIST(STR_SUBTYPE_ELRS, {"N/A WIP"}) +STRLIST(STR_SUBTYPE_REALACC, {"R11"}) +STRLIST(STR_SUBTYPE_WFLY2, {"RF20x"}) +STRLIST(STR_SUBTYPE_MOULDKG, {"Analog","Digital"}) +STRLIST(STR_SUBTYPE_MT992, {"PA18"}) +STRLIST(STR_SUBTYPE_RX, {"Multi","CPPM"}) +STRLIST(STR_SUBTYPE_DSM_RX, {"Multi","CloneTX","EraseTX","CPPM"}) +STRLIST(STR_SUBTYPE_E129, {"STD","C186"}) + +// +// Generic subtypes for future use protocols - don't touch +// +STRLIST(STR_SUBTYPE_NN, { SPARE_SUBTYPE_NAMES }) + +// +// Common data structure defining Multi protocol capabilites, i.e. number of subtypes, +// failsafe support yes/no, channel map disabled yes/no, reference to the suptype options strings above +// and further protocol options, e.g. RF tune, video frequency. +// +PROTODEF ({ + {MODULE_SUBTYPE_MULTI_FLYSKY, 4, false, true, STR_SUBTYPE_FLYSKY, nullptr}, + {MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ}, + {MODULE_SUBTYPE_MULTI_FRSKY, 1, false, false, STR_SUBTYPE_FRSKYD, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_HISKY, 1, true, true, STR_SUBTYPE_HISKY, nullptr}, + {MODULE_SUBTYPE_MULTI_V2X2, 2, false, false, STR_SUBTYPE_V2X2, nullptr}, + {MODULE_SUBTYPE_MULTI_DSM2, 5, false, true, STR_SUBTYPE_DSM, STR_MULTI_MAX_THROW}, + {MODULE_SUBTYPE_MULTI_DEVO, 4, true, true, STR_SUBTYPE_DEVO, STR_MULTI_FIXEDID}, + {MODULE_SUBTYPE_MULTI_YD717, 4, false, false, STR_SUBTYPE_YD717, nullptr}, + {MODULE_SUBTYPE_MULTI_KN, 1, false, false, STR_SUBTYPE_KN, nullptr}, + {MODULE_SUBTYPE_MULTI_SYMAX, 1, false, false, STR_SUBTYPE_SYMAX, nullptr}, + {MODULE_SUBTYPE_MULTI_SLT, 4, false, true, STR_SUBTYPE_SLT, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_CX10, 6, false, false, STR_SUBTYPE_CX10, nullptr}, + {MODULE_SUBTYPE_MULTI_CG023, 1, false, false, STR_SUBTYPE_CG023, nullptr}, + {MODULE_SUBTYPE_MULTI_BAYANG, 5, false, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, + {MODULE_SUBTYPE_MULTI_FRSKYX, 5, true, false, STR_SUBTYPE_FRSKYX, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_ESky, 1, false, true, STR_SUBTYPE_ESky, nullptr}, + {MODULE_SUBTYPE_MULTI_MT99XX, 7, false, false, STR_SUBTYPE_MT99, nullptr}, + {MODULE_SUBTYPE_MULTI_MJXQ, 6, false, false, STR_SUBTYPE_MJXQ, nullptr}, + {MODULE_SUBTYPE_MULTI_SHENQI, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_FY326, 1, false, false, STR_SUBTYPE_FY326, nullptr}, + {MODULE_SUBTYPE_MULTI_FUTABA, 0, true, true, STR_SUBTYPE_FUTABA, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_J6PRO, 0, false, true, NO_SUBTYPE, nullptr}, + {MODULE_SUBTYPE_MULTI_FQ777, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_ASSAN, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_FRSKYV, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_HONTAI, 3, false, false, STR_SUBTYPE_HONTAI, nullptr}, + // MODULE_SUBTYPE_MULTI_OLRS non selectable and masked out for selection + {MODULE_SUBTYPE_MULTI_FS_AFHDS2A, 7, true, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ}, + {MODULE_SUBTYPE_MULTI_Q2X2, 2, false, false, STR_SUBTYPE_Q2X2, nullptr}, + {MODULE_SUBTYPE_MULTI_WK_2X01, 5, true, true, STR_SUBTYPE_WK2x01, nullptr}, + {MODULE_SUBTYPE_MULTI_Q303, 3, false, false, STR_SUBTYPE_Q303, nullptr}, + {MODULE_SUBTYPE_MULTI_GW008, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_DM002, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_CABELL, 7, false, false, STR_SUBTYPE_CABELL, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, false, STR_SUBTYPE_ESKY150, nullptr}, + {MODULE_SUBTYPE_MULTI_H83D, 3, false, false, STR_SUBTYPE_H83D, nullptr}, + {MODULE_SUBTYPE_MULTI_CORONA, 2, false, false, STR_SUBTYPE_CORONA, STR_MULTI_RFTUNE}, + // MODULE_SUBTYPE_MULTI_CFLIE non selectable and masked out for selection + {MODULE_SUBTYPE_MULTI_HITEC, 2, false, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_WFLY, 0, true, false, STR_SUBTYPE_WFLY, nullptr}, + {MODULE_SUBTYPE_MULTI_BUGS, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_BUGS_MINI, 1, false, false, STR_SUBTYPE_BUGS_MINI, nullptr}, + {MODULE_SUBTYPE_MULTI_TRAXXAS, 0, false, false, STR_SUBTYPE_TRAXXAS, nullptr}, + {MODULE_SUBTYPE_MULTI_NCC1701, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_E01X, 1, false, false, STR_SUBTYPE_E01X, nullptr}, + {MODULE_SUBTYPE_MULTI_V911S, 1, false, false, STR_SUBTYPE_V911S, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_GD00X, 1, false, false, STR_SUBTYPE_GD00X, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_V761, 2, false, false, STR_SUBTYPE_V761, nullptr}, + {MODULE_SUBTYPE_MULTI_KF606, 2, false, false, STR_SUBTYPE_KF606, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_REDPINE, 1, false, false, STR_SUBTYPE_REDPINE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_POTENSIC, 0, false, false, STR_SUBTYPE_POTENSIC, nullptr}, + {MODULE_SUBTYPE_MULTI_ZSX, 0, false, false, STR_SUBTYPE_ZSX, nullptr}, + {MODULE_SUBTYPE_MULTI_HEIGHT, 1, false, false, STR_SUBTYPE_HEIGHT, nullptr}, + // MODULE_SUBTYPE_MULTI_SCANNER non selectable and masked out for selection + {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 3, false, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_AFHDS2A_RX, 1, false, false, STR_SUBTYPE_RX, nullptr}, //new + {MODULE_SUBTYPE_MULTI_HOTT, 1, true, false, STR_SUBTYPE_HOTT, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FX, 2, false, false, STR_SUBTYPE_FX, nullptr}, + {MODULE_SUBTYPE_MULTI_BAYANG_RX, 1, false, false, STR_SUBTYPE_RX, nullptr}, //new + {MODULE_SUBTYPE_MULTI_PELIKAN, 2, false, true, STR_SUBTYPE_PELIKAN, nullptr}, + {MODULE_SUBTYPE_MULTI_TIGER, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_XK, 1, false, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_XN297DUMP, 5, false, false, STR_SUBTYPE_XN297DUMP, STR_MULTI_RFCHAN}, + {MODULE_SUBTYPE_MULTI_FRSKYX2, 5, true, false, STR_SUBTYPE_FRSKYX, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FRSKY_R9, 7, true, false, STR_SUBTYPE_FRSKYR9, nullptr}, + {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, STR_SUBTYPE_PROPEL, nullptr}, + {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_SKYARTEC, 0, false, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_ESKY150V2, 0, false, true, STR_SUBTYPE_ESKY150V2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_DSM_RX, 3, false, true, STR_SUBTYPE_DSM_RX, nullptr}, //new + {MODULE_SUBTYPE_MULTI_JJRC345, 1, false, false, STR_SUBTYPE_JJRC345, nullptr}, + {MODULE_SUBTYPE_MULTI_Q90C, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_KYOSHO, 1, false, true, STR_SUBTYPE_KYOSHO, nullptr}, + {MODULE_SUBTYPE_MULTI_RLINK, 2, false, false, STR_SUBTYPE_RLINK, STR_MULTI_RFTUNE}, + // MODULE_SUBTYPE_MULTI_ELRS non selectable and masked out for selection + {MODULE_SUBTYPE_MULTI_REALACC, 0, false, false, STR_SUBTYPE_REALACC, nullptr}, + {MODULE_SUBTYPE_MULTI_OMP, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_MLINK, 0, true, false, NO_SUBTYPE, nullptr}, + {MODULE_SUBTYPE_MULTI_WFLY2, 0, true, false, STR_SUBTYPE_WFLY2, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_E016HV2, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_E010R5, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_LOLI, 0, true, false, NO_SUBTYPE, nullptr}, + {MODULE_SUBTYPE_MULTI_E129, 1, false, false, STR_SUBTYPE_E129, nullptr}, //new + {MODULE_SUBTYPE_MULTI_JOYSWAY, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_E016H, 0, false, false, NO_SUBTYPE, nullptr}, //new + // MODULE_SUBTYPE_MULTI_CONFIG non selectable and masked out for selection + // MODULE_SUBTYPE_MULTI_IKEAANSLUTA non selectable and masked out for selection + // MODULE_SUBTYPE_MULTI_WILLIFM non selectable and masked out for selection + {MODULE_SUBTYPE_MULTI_LOSI, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_MOULDKG, 1, false, false, STR_SUBTYPE_MOULDKG, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_XERALL, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_MT99XX2, 0, false, false, STR_SUBTYPE_MT992, nullptr}, + {MODULE_SUBTYPE_MULTI_KYOSHO2, 0, false, false, STR_SUBTYPE_KYOSHO2, nullptr}, + {MODULE_SUBTYPE_MULTI_SCORPIO, 0, false, true, NO_SUBTYPE, nullptr}, + {MODULE_SUBTYPE_MULTI_NN1, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN2, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN3, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN4, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN5, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN6, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN7, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN8, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN9, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN10, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + // + // most likely no longer required + // + {MM_RF_CUSTOM_SELECTED, 0, true, false, NO_SUBTYPE, STR_MULTI_OPTION}, + + // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) + {MODULE_SUBTYPE_MULTI_SENTINEL, 0, false, false, NO_SUBTYPE, nullptr}, +}); + +#endif // MULTIMODULE diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 6c584485376..7cd9b889bbd 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -428,11 +428,13 @@ PACK(struct ModuleData { int8_t frameLength; } ppm; NOBACKUP(struct { - uint8_t rfProtocolExtra : 2; - uint8_t spare1 : 3; - uint8_t customProto : 1; - uint8_t autoBindMode : 1; - uint8_t lowPowerMode : 1; + uint8_t disableTelemetry:1; + uint8_t disableMapping:1; + uint8_t autoBindMode:1; + uint8_t lowPowerMode:1; + uint8_t receiverTelemetryOff:1; + uint8_t receiverHigherChannels:1; + uint8_t spare:2; int8_t optionValue; } multi); NOBACKUP(struct { @@ -450,18 +452,6 @@ PACK(struct ModuleData { int16_t spare1:5; } crsf); }; - - // Helper functions to set both of the rfProto protocol at the same time - NOBACKUP(inline uint8_t getMultiProtocol(bool returnCustom) { - if (returnCustom && multi.customProto) - return MM_RF_CUSTOM_SELECTED; - return ((uint8_t)(rfProtocol & 0x0f)) + (multi.rfProtocolExtra << 4); - }) - - NOBACKUP(inline void setMultiProtocol(uint8_t proto) { - rfProtocol = (uint8_t)(proto & 0x0f); - multi.rfProtocolExtra = (proto & 0x30) >> 4; - }) }); /* diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index d9369cedfe1..fb055188097 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -20,6 +20,8 @@ #include "opentx.h" +#include "MultiSubtypeDefs.h" + int circularIncDec(int current, int inc, int min, int max, IsValueAvailable isValueAvailable) { do { current += inc; @@ -612,212 +614,16 @@ int getFirstAvailable(int min, int max, IsValueAvailable isValueAvailable) { } return retval; } + #if defined(MULTIMODULE) -// Third row is number of subtypes -1 (max valid subtype) -#define NO_SUBTYPE nullptr - -// Table is designed to be shared with companion multi.cpp - -// The subtype and options strings are only referenced here, so -// define them here to avoid duplication in all language files -// Also since these strings are ARM only and likely stay ARM only -// we don't need the special eeprom/flash string handling, just define them as -// local strings - -const char STR_SUBTYPE_FLYSKY[] = - "\004" - "Std\0" - "V9x9" - "V6x6" - "V912" - "CX20"; -const char STR_SUBTYPE_HUBSAN[] = - "\005" - " H107" - " H301" - " H501"; -const char STR_SUBTYPE_FRSKY[] = - "\007" - "D16\0 " - "D8\0 " - "D16 8ch" - "V8\0 " - "LBT(EU)" - "LBT 8ch"; -const char STR_SUBTYPE_HISKY[] = - "\005" - "Std\0 " - "HK310"; -const char STR_SUBTYPE_V2X2[] = - "\006" - "Std\0 " - "JXD506"; -const char STR_SUBTYPE_DSM[] = - "\006" - "2 22ms" - "2 11ms" - "X 22ms" - "X 11ms"; -const char STR_SUBTYPE_YD717[] = - "\007" - "Std\0 " - "SkyWlkr" - "Syma X4" - "XINXUN\0" - "NIHUI\0 "; -const char STR_SUBTYPE_KN[] = - "\006" - "WLtoys" - "FeiLun"; -const char STR_SUBTYPE_SYMAX[] = - "\003" - "Std" - "X5C"; -const char STR_SUBTYPE_SLT[] = - "\006" - "V1_6ch" - "V2_8ch" - "Q100\0 " - "Q200\0 " - "MR100\0"; -const char STR_SUBTYPE_CX10[] = - "\007" - "Green\0 " - "Blue\0 " - "DM007\0 " - "-\0 " - "JC3015a" - "JC3015b" - "MK33041"; -const char STR_SUBTYPE_CG023[] = - "\005" - "Std\0 " - "YD829"; -const char STR_SUBTYPE_BAYANG[] = - "\007" - " Std\0 " - " H8S3D\0" - " X16 AH" - "IRDrone"; -const char STR_SUBTYPE_MT99[] = - "\006" - " MT99\0" - " H7\0 " - " YZ\0 " - " LS\0 " - " FY805"; -const char STR_SUBTYPE_MJXQ[] = - "\005" - "WLH08" - "X600\0" - "X800\0" - "H26D\0" - "E010\0" - "H26WH"; -const char STR_SUBTYPE_FY326[] = - "\005" - "Std\0 " - "FY319"; -const char STR_SUBTYPE_HONTAI[] = - "\007" - " Std\0 " - "JJRC X1" - " X5C1\0 " - " FQ_951"; -const char STR_SUBTYPE_AFHDS2A[] = - "\010" - "PWM,IBUS" - "PPM,IBUS" - "PWM,SBUS" - "PPM,SBUS"; -const char STR_SUBTYPE_Q2X2[] = - "\004" - "Q222" - "Q242" - "Q282"; -const char STR_SUBTYPE_WK2x01[] = - "\006" - "WK2801" - "WK2401" - "W6_5_1" - "W6_6_1" - "W6_HeL" - "W6_HeI"; -const char STR_SUBTYPE_Q303[] = - "\006" - "Std\0 " - "CX35\0 " - "CX10D\0" - "CX10WD"; -const char STR_SUBTYPE_CABELL[] = - "\007" - "V3\0 " - "V3 Telm" - "-\0 " - "-\0 " - "-\0 " - "-\0 " - "F-Safe\0" - "Unbind\0"; -const char STR_SUBTYPE_H83D[] = - "\007" - "Std\0 " - "H20H\0 " - "H20Mini" - "H30Mini"; -const char STR_SUBTYPE_CORONA[] = - "\006" - " V1\0 " - " V2\0 " - " FD V3"; -const char STR_SUBTYPE_HITEC[] = - "\007" - "Optima\0" - "Opt Hub" - "Minima\0"; -const char STR_SUBTYPE_E01X[] = - "\004" - "E012" - "E015"; - -const mm_protocol_definition multi_protocols[] = { - - {MM_RF_PROTO_FLYSKY, 4, false, STR_SUBTYPE_FLYSKY, nullptr}, - {MM_RF_PROTO_HUBSAN, 2, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ}, - {MM_RF_PROTO_FRSKY, 5, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE}, - {MM_RF_PROTO_HISKY, 1, false, STR_SUBTYPE_HISKY, nullptr}, - {MM_RF_PROTO_V2X2, 1, false, STR_SUBTYPE_V2X2, nullptr}, - {MM_RF_PROTO_DSM2, 3, false, STR_SUBTYPE_DSM, nullptr}, - {MM_RF_PROTO_YD717, 4, false, STR_SUBTYPE_YD717, nullptr}, - {MM_RF_PROTO_KN, 1, false, STR_SUBTYPE_KN, nullptr}, - {MM_RF_PROTO_SYMAX, 1, false, STR_SUBTYPE_SYMAX, nullptr}, - {MM_RF_PROTO_SLT, 4, false, STR_SUBTYPE_SLT, nullptr}, - {MM_RF_PROTO_CX10, 6, false, STR_SUBTYPE_CX10, nullptr}, - {MM_RF_PROTO_CG023, 1, false, STR_SUBTYPE_CG023, nullptr}, - {MM_RF_PROTO_BAYANG, 3, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, - {MM_RF_PROTO_MT99XX, 4, false, STR_SUBTYPE_MT99, nullptr}, - {MM_RF_PROTO_MJXQ, 5, false, STR_SUBTYPE_MJXQ, nullptr}, - {MM_RF_PROTO_FY326, 1, false, STR_SUBTYPE_FY326, nullptr}, - {MM_RF_PROTO_SFHSS, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MM_RF_PROTO_HONTAI, 3, false, STR_SUBTYPE_HONTAI, nullptr}, - {MM_RF_PROTO_OLRS, 0, false, NO_SUBTYPE, STR_MULTI_RFPOWER}, - {MM_RF_PROTO_FS_AFHDS2A, 3, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ}, - {MM_RF_PROTO_Q2X2, 2, false, STR_SUBTYPE_Q2X2, nullptr}, - {MM_RF_PROTO_WK_2X01, 5, false, STR_SUBTYPE_WK2x01, nullptr}, - {MM_RF_PROTO_Q303, 3, false, STR_SUBTYPE_Q303, nullptr}, - {MM_RF_PROTO_CABELL, 7, false, STR_SUBTYPE_CABELL, STR_MULTI_OPTION}, - {MM_RF_PROTO_H83D, 3, false, STR_SUBTYPE_H83D, nullptr}, - {MM_RF_PROTO_CORONA, 2, false, STR_SUBTYPE_CORONA, STR_MULTI_RFTUNE}, - {MM_RF_PROTO_HITEC, 2, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, - {MM_RF_PROTO_E01X, 1, false, STR_SUBTYPE_E01X, nullptr}, - {MM_RF_CUSTOM_SELECTED, 7, true, NO_SUBTYPE, STR_MULTI_OPTION}, - - // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) - {0xfe, 0, false, NO_SUBTYPE, nullptr}}; - -#undef NO_SUBTYPE - -const mm_protocol_definition *getMultiProtocolDefinition(uint8_t protocol) { + +const uint8_t getMaxMultiOptions() +{ + return DIM(mm_options_strings::options); +} + +const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol) +{ const mm_protocol_definition *pdef; for (pdef = multi_protocols; pdef->protocol != 0xfe; pdef++) { if (pdef->protocol == protocol) @@ -826,6 +632,27 @@ const mm_protocol_definition *getMultiProtocolDefinition(uint8_t protocol) { // Return the empty last protocol return pdef; } + +const char * getMultiOptionTitleStatic(uint8_t moduleIdx) +{ + const uint8_t multi_proto = g_model.moduleData[moduleIdx].rfProtocol; + const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto); + return pdef->optionsstr; +} + +const char * getMultiOptionTitle(uint8_t moduleIdx) +{ + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); + + if (status.isValid()) { + if (status.optionDisp >= getMaxMultiOptions()) { + status.optionDisp = 1; // Unknown options are defaulted to type 1 (basic option) + } + return mm_options_strings::options[status.optionDisp]; + } + + return getMultiOptionTitleStatic(moduleIdx); +} #endif void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags) {