bool isInputSourceAvailable(int source) { if (source>=MIXSRC_FIRST_POT && source<=MIXSRC_LAST_POT) { return IS_POT_AVAILABLE(POT1+source-MIXSRC_FIRST_POT); } if (source>=MIXSRC_Rud && source<=MIXSRC_MAX) return true; if (source>=MIXSRC_FIRST_TRIM && source<=MIXSRC_LAST_TRIM) return true; if (source>=MIXSRC_FIRST_SWITCH && source<=MIXSRC_LAST_SWITCH) return SWITCH_EXISTS(source-MIXSRC_FIRST_SWITCH); if (source>=MIXSRC_FIRST_CH && source<=MIXSRC_LAST_CH) return true; if (source>=MIXSRC_FIRST_LOGICAL_SWITCH && source<=MIXSRC_LAST_LOGICAL_SWITCH) { LogicalSwitchData * cs = lswAddress(source-MIXSRC_SW1); return (cs->func != LS_FUNC_NONE); } if (source>=MIXSRC_FIRST_TRAINER && source<=MIXSRC_LAST_TRAINER) return true; if (source>=MIXSRC_FIRST_TELEM && source<=MIXSRC_LAST_TELEM) { div_t qr = div(source-MIXSRC_FIRST_TELEM, 3); return isTelemetryFieldAvailable(qr.quot) && isTelemetryFieldComparisonAvailable(qr.quot); } return false; }
void onSensorMenu(const char *result) { uint8_t index = m_posVert - 1 - ITEM_TELEMETRY_SENSOR1; if (index < MAX_SENSORS) { if (result == STR_EDIT) { pushMenu(menuModelSensor); } else if (result == STR_DELETE) { delTelemetryIndex(index); index += 1; if (index<MAX_SENSORS && isTelemetryFieldAvailable(index)) m_posVert += 1; else m_posVert = 1+ITEM_TELEMETRY_NEWSENSOR; } else if (result == STR_COPY) { int newIndex = availableTelemetryIndex(); if (newIndex >= 0) { TelemetrySensor & sourceSensor = g_model.telemetrySensors[index]; TelemetrySensor & newSensor = g_model.telemetrySensors[newIndex]; newSensor = sourceSensor; TelemetryItem & sourceItem = telemetryItems[index]; TelemetryItem & newItem = telemetryItems[newIndex]; newItem = sourceItem; eeDirty(EE_MODEL); } else { POPUP_WARNING(STR_TELEMETRYFULL); } } } }
bool isSensorAvailable(int sensor) { if (sensor == 0) return true; else return isTelemetryFieldAvailable(abs(sensor) - 1); }
bool isInputSourceAvailable(int source) { if (source>=MIXSRC_FIRST_POT && source<=MIXSRC_LAST_POT) { return IS_POT_AVAILABLE(POT1+source-MIXSRC_FIRST_POT); } if (source>=MIXSRC_Rud && source<=MIXSRC_MAX) return true; if (source>=MIXSRC_FIRST_TRIM && source<=MIXSRC_LAST_TRIM) return true; if (source>=MIXSRC_FIRST_SWITCH && source<=MIXSRC_LAST_SWITCH) return SWITCH_EXISTS(source-MIXSRC_FIRST_SWITCH); if (source>=MIXSRC_FIRST_CH && source<=MIXSRC_LAST_CH) return true; if (source>=MIXSRC_FIRST_TRAINER && source<=MIXSRC_LAST_TRAINER) return true; if (source>=MIXSRC_FIRST_TELEM && source<=MIXSRC_LAST_TELEM) { div_t qr = div(source-MIXSRC_FIRST_TELEM, 3); return isTelemetryFieldAvailable(qr.quot) && isTelemetryFieldComparisonAvailable(qr.quot); } return false; }
void onSensorMenu(const char *result) { uint8_t index = m_posVert - 1 - ITEM_TELEMETRY_SENSOR1; if (index < MAX_SENSORS) { if (result == STR_EDIT) { pushMenu(menuModelSensor); } else if (result == STR_DELETE) { delTelemetryIndex(index); index += 1; if (index<MAX_SENSORS && isTelemetryFieldAvailable(index)) m_posVert += 1; else m_posVert = 1+ITEM_TELEMETRY_NEWSENSOR; } } }
bool isSourceAvailable(int source) { if (source>=MIXSRC_FIRST_INPUT && source<=MIXSRC_LAST_INPUT) { return isInputAvailable(source - MIXSRC_FIRST_INPUT); } #if defined(LUA_MODEL_SCRIPTS) if (source>=MIXSRC_FIRST_LUA && source<=MIXSRC_LAST_LUA) { div_t qr = div(source-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS); return (qr.rem<scriptInputsOutputs[qr.quot].outputsCount); } #else if (source>=MIXSRC_FIRST_LUA && source<=MIXSRC_LAST_LUA) return false; #endif if (source>=MIXSRC_FIRST_POT && source<=MIXSRC_LAST_POT) { return IS_POT_AVAILABLE(POT1+source-MIXSRC_FIRST_POT); } if (source>=MIXSRC_FIRST_SWITCH && source<=MIXSRC_LAST_SWITCH) { return SWITCH_EXISTS(source-MIXSRC_FIRST_SWITCH); } #if !defined(HELI) if (source>=MIXSRC_CYC1 && source<=MIXSRC_CYC3) return false; #endif if (source>=MIXSRC_CH1 && source<=MIXSRC_LAST_CH) { uint8_t destCh = source-MIXSRC_CH1; for (uint8_t i = 0; i < MAX_MIXERS; i++) { MixData *md = mixAddress(i); if (md->srcRaw == 0) return false; if (md->destCh==destCh) return true; } return false; } if (source>=MIXSRC_FIRST_LOGICAL_SWITCH && source<=MIXSRC_LAST_LOGICAL_SWITCH) { LogicalSwitchData * cs = lswAddress(source-MIXSRC_SW1); return (cs->func != LS_FUNC_NONE); } #if !defined(GVARS) if (source>=MIXSRC_GVAR1 && source<=MIXSRC_LAST_GVAR) return false; #endif if (source>=MIXSRC_RESERVE1 && source<=MIXSRC_RESERVE5) return false; if (source>=MIXSRC_FIRST_TELEM && source<=MIXSRC_LAST_TELEM) { div_t qr = div(source-MIXSRC_FIRST_TELEM, 3); if (qr.rem == 0) return isTelemetryFieldAvailable(qr.quot); else return isTelemetryFieldComparisonAvailable(qr.quot); } return true; }
/** Return field data for a given field name */ bool luaFindFieldByName(const char * name, LuaField & field, unsigned int flags=0) { // TODO better search method (binary lookup) for (unsigned int n=0; n<DIM(luaSingleFields); ++n) { if (!strcmp(name, luaSingleFields[n].name)) { field.id = luaSingleFields[n].id; if (flags & FIND_FIELD_DESC) { strncpy(field.desc, luaSingleFields[n].desc, sizeof(field.desc)-1); field.desc[sizeof(field.desc)-1] = '\0'; } else { field.desc[0] = '\0'; } return true; } } // search in multiples unsigned int len = strlen(name); for (unsigned int n=0; n<DIM(luaMultipleFields); ++n) { const char * fieldName = luaMultipleFields[n].name; unsigned int fieldLen = strlen(fieldName); if (!strncmp(name, fieldName, fieldLen)) { unsigned int index; if (len == fieldLen+1 && isdigit(name[fieldLen])) { index = name[fieldLen] - '1'; } else if (len == fieldLen+2 && isdigit(name[fieldLen]) && isdigit(name[fieldLen+1])) { index = 10 * (name[fieldLen] - '0') + (name[fieldLen+1] - '1'); } else { continue; } if (index < luaMultipleFields[n].count) { field.id = luaMultipleFields[n].id + index; if (flags & FIND_FIELD_DESC) { snprintf(field.desc, sizeof(field.desc)-1, luaMultipleFields[n].desc, index+1); field.desc[sizeof(field.desc)-1] = '\0'; } else { field.desc[0] = '\0'; } return true; } } } // search in telemetry field.desc[0] = '\0'; for (int i=0; i<MAX_SENSORS; i++) { if (isTelemetryFieldAvailable(i)) { char sensorName[TELEM_LABEL_LEN+1]; int len = zchar2str(sensorName, g_model.telemetrySensors[i].label, TELEM_LABEL_LEN); if (!strncmp(sensorName, name, len)) { if (name[len] == '\0') { field.id = MIXSRC_FIRST_TELEM + 3*i; field.desc[0] = '\0'; return true; } else if (name[len] == '-' && name[len+1] == '\0') { field.id = MIXSRC_FIRST_TELEM + 3*i + 1; field.desc[0] = '\0'; return true; } else if (name[len] == '+' && name[len+1] == '\0') { field.id = MIXSRC_FIRST_TELEM + 3*i + 2; field.desc[0] = '\0'; return true; } } } } return false; // not found }