1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-25 01:05:10 +03:00

D16 bind option (#7218)

D16  bind option, and several fixes that give MULTI live data priority vs OpenTX stored multi definitions

Co-authored-by: pascallanger <pascal_langer@yahoo.fr>
This commit is contained in:
3djc 2019-12-27 09:42:13 +01:00 committed by GitHub
parent 2f793eba32
commit ea11335273
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 97 additions and 63 deletions

View file

@ -444,6 +444,9 @@ PACK(struct ModuleData {
uint8_t autoBindMode:1;
uint8_t lowPowerMode:1;
int8_t optionValue;
uint8_t receiverTelemetryOff:1;
uint8_t receiverHigherChannels:1;
uint8_t spare:6;
} multi);
NOBACKUP(struct {
uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W

View file

@ -1461,8 +1461,19 @@ void menuModelSetup(event_t event)
if (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx)) {
int optionValue = g_model.moduleData[moduleIdx].multi.optionValue;
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
const uint8_t multi_proto = g_model.moduleData[moduleIdx].getMultiProtocol();
if (multi_proto < MODULE_SUBTYPE_MULTI_LAST) {
if (status.isValid()) {
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
lcdDrawText(INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]);
if (attr && status.optionDisp == 2) {
lcdDrawText(MODEL_SETUP_2ND_COLUMN + 23, y, "RSSI(", LEFT);
lcdDrawNumber(lcdLastRightPos, y, TELEMETRY_RSSI(), LEFT);
lcdDrawText(lcdLastRightPos, y, ")", LEFT);
}
}
else {
const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto);
if (pdef->optionsstr) {
lcdDrawText(INDENT_WIDTH, y, pdef->optionsstr);
@ -1473,15 +1484,7 @@ void menuModelSetup(event_t event)
}
}
}
else {
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
lcdDrawText(INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]);
if (attr && status.optionDisp == 2) {
lcdDrawText(MODEL_SETUP_2ND_COLUMN + 23, y, "RSSI(", LEFT);
lcdDrawNumber(lcdLastRightPos, y, TELEMETRY_RSSI(), LEFT);
lcdDrawText(lcdLastRightPos, y, ")", LEFT);
}
}
if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
optionValue = 50 + 5 * optionValue;

View file

@ -1216,8 +1216,17 @@ void menuModelSetup(event_t event)
if (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx)) {
int optionValue = g_model.moduleData[moduleIdx].multi.optionValue;
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol();
if (multi_proto < MODULE_SUBTYPE_MULTI_LAST) {
if (status.isValid()) {
lcdDrawText(INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]);
if (attr && status.optionDisp == 2) {
lcdDrawText(MODEL_SETUP_3RD_COLUMN+22, y, "RSSI(", LEFT);
lcdDrawNumber(lcdLastRightPos, y, TELEMETRY_RSSI(), LEFT);
lcdDrawText(lcdLastRightPos, y, ")", LEFT);
}
}
else {
const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto);
if (pdef->optionsstr)
lcdDrawText(INDENT_WIDTH, y, pdef->optionsstr);
@ -1227,15 +1236,7 @@ void menuModelSetup(event_t event)
lcdDrawText(lcdLastRightPos, y, ")", LEFT);
}
}
else {
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
lcdDrawText(INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]);
if (attr && status.optionDisp == 2) {
lcdDrawText(MODEL_SETUP_3RD_COLUMN+22, y, "RSSI(", LEFT);
lcdDrawNumber(lcdLastRightPos, y, TELEMETRY_RSSI(), LEFT);
lcdDrawText(lcdLastRightPos, y, ")", LEFT);
}
}
if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
optionValue = 50 + 5 * optionValue;

View file

@ -1613,23 +1613,24 @@ bool menuModelSetup(event_t event)
if (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx)) {
int optionValue = g_model.moduleData[moduleIdx].multi.optionValue;
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
const uint8_t multi_proto = g_model.moduleData[moduleIdx].getMultiProtocol();
if (multi_proto < MODULE_SUBTYPE_MULTI_LAST) {
if (status.isValid()) {
lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]);
if (attr && status.optionDisp == 2) {
lcdDrawNumber(LCD_W - 10, y, TELEMETRY_RSSI(), RIGHT, 0, "RSSI(", ")");
}
}
else {
const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto);
if (pdef->optionsstr) {
lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, pdef->optionsstr);
if (attr && pdef->optionsstr == STR_MULTI_RFTUNE) {
if (attr && pdef->optionsstr == STR_MULTI_RFTUNE) {
lcdDrawNumber(LCD_W - 10, y, TELEMETRY_RSSI(), RIGHT, 0, "RSSI(", ")");
}
}
}
else {
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]);
if (attr && status.optionDisp == 2) {
lcdDrawNumber(LCD_W - 10, y, TELEMETRY_RSSI(), RIGHT, 0, "RSSI(", ")");
}
}
if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
optionValue = 50 + 5 * optionValue;

View file

@ -22,27 +22,37 @@
void onBindMenu(const char * result)
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE);
uint8_t receiverTelemetryOff, receiverHigherChannels;
if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = false;
g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = false;
receiverTelemetryOff = false;
receiverHigherChannels = false;
}
else if (result == STR_BINDING_1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = true;
g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = false;
receiverTelemetryOff = true;
receiverHigherChannels = false;
}
else if (result == STR_BINDING_9_16_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = false;
g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = true;
receiverTelemetryOff = false;
receiverHigherChannels = true;
}
else if (result == STR_BINDING_9_16_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = true;
g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = true;
receiverTelemetryOff = true;
receiverHigherChannels = true;
}
else {
return;
}
if (isModuleMultimodule(moduleIdx)) {
g_model.moduleData[moduleIdx].multi.receiverTelemetryOff = receiverTelemetryOff;
g_model.moduleData[moduleIdx].multi.receiverHigherChannels = receiverHigherChannels;
}
else {
g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = receiverTelemetryOff;
g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = receiverHigherChannels;
}
moduleState[moduleIdx].mode = MODULE_MODE_BIND;
}

View file

@ -926,7 +926,7 @@ const mm_protocol_definition multi_protocols[] = {
{MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION},
// Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff)
{0xfe, 0, false, true, NO_SUBTYPE, nullptr}
{0xfe, 0, false, false, NO_SUBTYPE, nullptr}
};
#undef NO_SUBTYPE

View file

@ -166,6 +166,11 @@ inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx)
if (!isModuleMultimodule(moduleIdx))
return HIDDEN_ROW;
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
if (status.isValid()) {
return status.supportsDisableMapping() == true ? 0 : HIDDEN_ROW;
}
uint8_t protocol = g_model.moduleData[moduleIdx].getMultiProtocol();
if (protocol < MODULE_SUBTYPE_MULTI_LAST) {
const mm_protocol_definition * pdef = getMultiProtocolDefinition(protocol);
@ -173,11 +178,6 @@ inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx)
return 0;
}
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
if (status.supportsDisableMapping() && status.isValid()) {
return 0;
}
return HIDDEN_ROW;
}
@ -239,12 +239,15 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx)
return false;
uint8_t protocol = g_model.moduleData[moduleIdx].getMultiProtocol();
if (protocol < MODULE_SUBTYPE_MULTI_LAST) {
return getMultiProtocolDefinition(protocol)->optionsstr != nullptr;
}
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
return status.optionDisp;
if (status.isValid())
return status.optionDisp;
if (protocol < MODULE_SUBTYPE_MULTI_LAST)
return getMultiProtocolDefinition(protocol)->optionsstr != nullptr;
return false;
}
#define MULTIMODULE_MODULE_ROWS(moduleIdx) MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP

View file

@ -127,7 +127,7 @@ inline bool isModuleISRMD16(uint8_t idx)
inline bool isModuleD16(uint8_t idx)
{
return isModuleXJTD16(idx) || isModuleISRMD16(idx);
return isModuleXJTD16(idx) || isModuleISRMD16(idx) || IS_D16_MULTI(idx);
}
inline bool isModuleISRMAccess(uint8_t idx)
@ -469,7 +469,7 @@ inline bool isTelemAllowedOnBind(uint8_t moduleIndex)
{
#if defined(HARDWARE_INTERNAL_MODULE)
if (moduleIndex == INTERNAL_MODULE)
return isModuleISRM(moduleIndex) || isSportLineUsedByInternalModule();
return true;
if (isSportLineUsedByInternalModule())
return false;
@ -557,6 +557,8 @@ inline void resetMultiProtocolsOptions(uint8_t moduleIdx)
g_model.moduleData[moduleIdx].multi.disableTelemetry = 0;
g_model.moduleData[moduleIdx].multi.disableMapping = 0;
g_model.moduleData[moduleIdx].multi.lowPowerMode = 0;
g_model.moduleData[moduleIdx].failsafeMode = FAILSAFE_NOT_SET;
g_model.header.modelId[moduleIdx] = 0;
}
inline void getMultiOptionValues(int8_t multi_proto, int8_t & min, int8_t & max)

View file

@ -38,6 +38,7 @@
static void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe);
void sendChannels(uint8_t moduleIdx);
static void sendD16BindOption(uint8_t moduleIdx);
#if defined(LUA)
static void sendSport(uint8_t moduleIdx);
static void sendHott(uint8_t moduleIdx);
@ -174,10 +175,13 @@ void setupPulsesMulti(uint8_t moduleIdx)
| g_model.moduleData[moduleIdx].multi.disableMapping));
// Multi V1.3.X.X -> Send protocol additional data: max 9 bytes
#if defined(LUA)
if (getMultiModuleStatus(moduleIdx).isValid()) {
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
if (status.minor >= 3 && !(status.flags & 0x80)) { //Version 1.3.x.x or more and Buffer not full
if (IS_D16_MULTI(moduleIdx) && moduleState[moduleIdx].mode == MODULE_MODE_BIND) {
sendD16BindOption(moduleIdx);//1 byte of additional data
}
#if defined(LUA)
// SPort send
if (IS_D16_MULTI(moduleIdx) && outputTelemetryBuffer.destination == TELEMETRY_ENDPOINT_SPORT && outputTelemetryBuffer.size) {
sendSport(moduleIdx); //8 bytes of additional data
@ -185,9 +189,9 @@ void setupPulsesMulti(uint8_t moduleIdx)
else if (IS_HOTT_MULTI(moduleIdx)) {
sendHott(moduleIdx); //1 byte of additional data
}
#endif
}
}
#endif
}
void setupPulsesMultiExternalModule()
@ -345,6 +349,13 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe)
sendMulti(moduleIdx, (uint8_t) optionValue);
}
void sendD16BindOption(uint8_t moduleIdx)
{
uint8_t bind_opt = g_model.moduleData[moduleIdx].multi.receiverTelemetryOff ? 1 : 0;
bind_opt |= g_model.moduleData[moduleIdx].multi.receiverHigherChannels ? 2 : 0;
sendMulti(moduleIdx, bind_opt);
}
#if defined(LUA)
void sendSport(uint8_t moduleIdx)
{

View file

@ -548,7 +548,7 @@ void MultiModuleStatus::getStatusString(char * statusText) const
return;
}
if (major == 1 && minor < 3 && SLOW_BLINK_ON_PHASE) {
if (major <= 1 && minor <= 3 && revision <= 0 && patch <= 47 && SLOW_BLINK_ON_PHASE) {
strcpy(statusText, STR_MODULE_UPGRADE);
}
else {

View file

@ -644,7 +644,7 @@
#define TR_MODULE_WAITFORBIND "Párovat při zavedení protokolu"
#define TR_MODULE_BINDING TR("Bind...","Párování")
#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required")
#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended")
#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
#define TR_REBIND "Nutno přepárovat"
#define TR_REG_OK "Registrace ok"
#define TR_BIND_OK "Úspěšné párovaní"

View file

@ -646,7 +646,7 @@
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required")
#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended")
#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
#define TR_REBIND "Rebinding required"
#define TR_REG_OK "Registration ok"
#define TR_BIND_OK "Bind successful"

View file

@ -645,7 +645,7 @@
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING TR("Bind...","Binding")
#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required")
#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended")
#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
#define TR_REBIND "Rebinding required"
#define TR_REG_OK "Registration ok"
#define TR_BIND_OK "Bind successful"

View file

@ -669,7 +669,7 @@
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required")
#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended")
#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
#define TR_REBIND "Rebinding required"
#define TR_REG_OK "Registration ok"
#define TR_BIND_OK "Bind successful"

View file

@ -663,7 +663,7 @@
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required")
#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended")
#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
#define TR_REBIND "Rebinding required"
#define TR_REG_OK "Registration ok"
#define TR_BIND_OK "Bind successful"

View file

@ -666,7 +666,7 @@
#define TR_MODULE_WAITFORBIND "Binder d'abord"
#define TR_MODULE_BINDING "Bind..."
#define TR_MODULE_UPGRADE_ALERT "Mise à jour requise"
#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended")
#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
#define TR_REBIND "Rebind requis"
#define TR_REG_OK "Enregistr. ok"
#define TR_BIND_OK "Bind ok"

View file

@ -651,7 +651,7 @@
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required")
#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended")
#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
#define TR_REBIND "Rebinding required"
#define TR_REG_OK "Registration ok"
#define TR_BIND_OK "Bind successful"

View file

@ -664,7 +664,7 @@
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required")
#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended")
#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
#define TR_REBIND "Rebinding required"
#define TR_REG_OK "Registration ok"
#define TR_BIND_OK "Bind successful"

View file

@ -655,7 +655,7 @@
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required")
#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended")
#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
#define TR_REBIND "Rebinding required"
#define TR_REG_OK "Registration ok"
#define TR_BIND_OK "Bind successful"

View file

@ -664,7 +664,7 @@
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required")
#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended")
#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
#define TR_REBIND "Rebinding required"
#define TR_REG_OK "Registration ok"
#define TR_BIND_OK "Bind successful"