int16_t gvarMenuItem(uint8_t x, uint8_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t event) #endif { uint16_t delta = GV_GET_GV1_VALUE(max); bool invers = (attr & INVERS); // TRACE("gvarMenuItem(val=%d min=%d max=%d)", value, min, max); if (invers && event == EVT_KEY_LONG(KEY_ENTER)) { s_editMode = !s_editMode; #if defined(CPUARM) if (attr & PREC1) value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode)*10 : delta); else value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode) : delta); #else value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode) : delta); #endif eeDirty(EE_MODEL); } if (GV_IS_GV_VALUE(value, min, max)) { if (attr & LEFT) attr -= LEFT; /* because of ZCHAR */ else x -= 2*FW+FWNUM; #if defined(CPUARM) attr &= ~PREC1; #endif int8_t idx = (int16_t) GV_INDEX_CALC_DELTA(value, delta); if (invers) { CHECK_INCDEC_MODELVAR(event, idx, -MAX_GVARS, MAX_GVARS-1); } if (idx < 0) { value = (int16_t) GV_CALC_VALUE_IDX_NEG(idx, delta); idx = -idx; lcd_putcAtt(x-6, y, '-', attr); } else { value = (int16_t) GV_CALC_VALUE_IDX_POS(idx, delta); idx++; } putsStrIdx(x, y, STR_GV, idx, attr); } else { lcd_outdezAtt(x, y, value, attr); #if defined(CPUARM) if (invers) value = checkIncDec(event, value, min, max, EE_MODEL | editflags); #else if (invers) value = checkIncDec(event, value, min, max, EE_MODEL); #endif } return value; }
int applyCurve(int x, CurveRef & curve) { switch (curve.type) { case CURVE_REF_DIFF: { int curveParam = calc100to256(GET_GVAR(curve.value, -100, 100, mixerCurrentFlightMode)); if (curveParam > 0 && x < 0) x = (x * (256 - curveParam)) >> 8; else if (curveParam < 0 && x > 0) x = (x * (256 + curveParam)) >> 8; return x; } case CURVE_REF_EXPO: return expo(x, GET_GVAR(curve.value, -100, 100, mixerCurrentFlightMode)); case CURVE_REF_FUNC: switch (curve.value) { case CURVE_X_GT0: if (x < 0) x = 0; //x|x>0 return x; case CURVE_X_LT0: if (x > 0) x = 0; //x|x<0 return x; case CURVE_ABS_X: // x|abs(x) return abs(x); case CURVE_F_GT0: //f|f>0 return x > 0 ? RESX : 0; case CURVE_F_LT0: //f|f<0 return x < 0 ? -RESX : 0; case CURVE_ABS_F: //f|abs(f) return x > 0 ? RESX : -RESX; } break; case CURVE_REF_CUSTOM: { int curveParam = curve.value; if (curveParam < 0) { x = -x; curveParam = -curveParam; } if (curveParam > 0 && curveParam <= MAX_CURVES) { return applyCustomCurve(x, curveParam - 1); } break; } }
int16_t gvarMenuItem(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t editflags, uint8_t event) { uint16_t delta = GV_GET_GV1_VALUE(max); bool invers = (attr & INVERS); // TRACE("gvarMenuItem(val=%d min=%d max=%d)", value, min, max); if (invers && event == EVT_KEY_LONG(KEY_ENTER)) { s_editMode = !s_editMode; if (attr & PREC1) value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode)*10 : delta); else value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode) : delta); eeDirty(EE_MODEL); } if (GV_IS_GV_VALUE(value, min, max)) { if (attr & LEFT) attr -= LEFT; /* because of ZCHAR */ else x -= 2*FW+FWNUM; attr &= ~PREC1; int8_t idx = (int16_t) GV_INDEX_CALC_DELTA(value, delta); if (idx >= 0) ++idx; // transform form idx=0=GV1 to idx=1=GV1 in order to handle double keys invert if (invers) { CHECK_INCDEC_MODELVAR_CHECK(event, idx, -MAX_GVARS, MAX_GVARS, noZero); if (idx == 0) idx = 1; // handle reset to zero, map to GV1 } if (idx < 0) { value = (int16_t) GV_CALC_VALUE_IDX_NEG(idx, delta); idx = -idx; lcd_putcAtt(x-6, y, '-', attr); } else { value = (int16_t) GV_CALC_VALUE_IDX_POS(idx-1, delta); } putsStrIdx(x, y, STR_GV, idx, attr); } else { lcd_outdezAtt(x, y, value, attr); if (invers) value = checkIncDec(event, value, min, max, EE_MODEL | editflags); } return value; }
void drawOffsetBar(uint8_t x, uint8_t y, MixData * md) { int offset = GET_GVAR(MD_OFFSET(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode); int weight = GET_GVAR(MD_WEIGHT(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode); int barMin = offset - weight; int barMax = offset + weight; if (y > 15) { lcd_outdezAtt(x-((barMin >= 0) ? 2 : 3), y-6, barMin, TINSIZE|LEFT); lcd_outdezAtt(x+GAUGE_WIDTH+1, y-6, barMax, TINSIZE); } if (weight < 0) { barMin = -barMin; barMax = -barMax; } if (barMin < -101) barMin = -101; if (barMax > 101) barMax = 101; lcd_hlineStip(x-2, y, GAUGE_WIDTH+2, DOTTED); lcd_hlineStip(x-2, y+GAUGE_HEIGHT, GAUGE_WIDTH+2, DOTTED); lcd_vline(x-2, y+1, GAUGE_HEIGHT-1); lcd_vline(x+GAUGE_WIDTH-1, y+1, GAUGE_HEIGHT-1); if (barMin <= barMax) { int8_t right = (barMax * GAUGE_WIDTH) / 200; int8_t left = ((barMin * GAUGE_WIDTH) / 200)-1; drawFilledRect(x+GAUGE_WIDTH/2+left, y+2, right-left, GAUGE_HEIGHT-3); } lcd_vline(x+GAUGE_WIDTH/2-1, y, GAUGE_HEIGHT+1); if (barMin == -101) { for (uint8_t i=0; i<3; ++i) { lcd_plot(x+i, y+4-i); lcd_plot(x+3+i, y+4-i); } } if (barMax == 101) { for (uint8_t i=0; i<3; ++i) { lcd_plot(x+GAUGE_WIDTH-8+i, y+4-i); lcd_plot(x+GAUGE_WIDTH-5+i, y+4-i); } } }
void applyExpos(int16_t *anas, uint8_t mode APPLY_EXPOS_EXTRA_PARAMS) { #if defined(PCBTARANIS) #if defined(HELI) int16_t heliAnasCopy[4]; memcpy(heliAnasCopy, heliAnas, sizeof(heliAnasCopy)); #endif #else int16_t anas2[NUM_INPUTS]; // values before expo, to ensure same expo base when multiple expo lines are used memcpy(anas2, anas, sizeof(anas2)); #endif int8_t cur_chn = -1; for (uint8_t i=0; i<MAX_EXPOS; i++) { #if defined(BOLD_FONT) if (mode==e_perout_mode_normal) swOn[i].activeExpo = false; #endif ExpoData * ed = expoAddress(i); if (!EXPO_VALID(ed)) break; // end of list if (ed->chn == cur_chn) continue; if (ed->flightModes & (1<<mixerCurrentFlightMode)) continue; if (getSwitch(ed->swtch)) { #if defined(PCBTARANIS) int v; if (ed->srcRaw == ovwrIdx) v = ovwrValue; #if defined(HELI) else if (ed->srcRaw == MIXSRC_Ele) v = heliAnasCopy[ELE_STICK]; else if (ed->srcRaw == MIXSRC_Ail) v = heliAnasCopy[AIL_STICK]; #endif else { v = getValue(ed->srcRaw); if (ed->srcRaw >= MIXSRC_FIRST_TELEM && ed->scale > 0) { v = (v * 1024) / convertTelemValue(ed->srcRaw-MIXSRC_FIRST_TELEM+1, ed->scale); } v = limit(-1024, v, 1024); } #else int16_t v = anas2[ed->chn]; #endif if (EXPO_MODE_ENABLE(ed, v)) { #if defined(BOLD_FONT) if (mode==e_perout_mode_normal) swOn[i].activeExpo = true; #endif cur_chn = ed->chn; //========== CURVE================= #if defined(PCBTARANIS) if (ed->curve.value) { v = applyCurve(v, ed->curve); } #else int8_t curveParam = ed->curveParam; if (curveParam) { if (ed->curveMode == MODE_CURVE) v = applyCurve(v, curveParam); else v = expo(v, GET_GVAR(curveParam, -100, 100, mixerCurrentFlightMode)); } #endif //========== WEIGHT =============== int16_t weight = GET_GVAR(ed->weight, MIN_EXPO_WEIGHT, 100, mixerCurrentFlightMode); weight = calc100to256(weight); v = ((int32_t)v * weight) >> 8; #if defined(PCBTARANIS) //========== OFFSET =============== int16_t offset = GET_GVAR(ed->offset, -100, 100, mixerCurrentFlightMode); if (offset) v += calc100toRESX(offset); //========== TRIMS ================ if (ed->carryTrim < TRIM_ON) virtualInputsTrims[cur_chn] = -ed->carryTrim - 1; else if (ed->carryTrim == TRIM_ON && ed->srcRaw >= MIXSRC_Rud && ed->srcRaw <= MIXSRC_Ail) virtualInputsTrims[cur_chn] = ed->srcRaw - MIXSRC_Rud; else virtualInputsTrims[cur_chn] = -1; #if defined(HELI) if (ed->srcRaw == MIXSRC_Ele) { heliAnas[ELE_STICK] = v; heliTrims[ELE_STICK] = virtualInputsTrims[cur_chn]; } else if (ed->srcRaw == MIXSRC_Ail) { heliAnas[AIL_STICK] = v; heliTrims[AIL_STICK] = virtualInputsTrims[cur_chn]; } #endif #endif anas[cur_chn] = v; } } }