[all] Custom functions reworked

[all] Expo function rewritten and many other flash savings (thanks Andreas)
[stock] LONG key press duration is longer
[stock] Rotary Encoder bugs fixed
[stock/gruvin9x] Play Both function added
!!! TRANSLATIONS ALL NEED TO BE UPDATED BEFORE NEXT RELEASE
This commit is contained in:
bsongis
2013-02-15 20:11:12 +00:00
parent 5cda44ac0b
commit d64a71f5ab
22 changed files with 456 additions and 388 deletions
+6 -1
View File
@@ -613,7 +613,8 @@ void AudioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlag
void AudioQueue::playFile(const char *filename, uint8_t flags, uint8_t id)
{
#if defined(SIMU)
printf("playFile(\"%s\")\n", filename); fflush(stdout);
printf("playFile(\"%s\", flags=%x, id=%d)\n", filename, flags, id);
fflush(stdout);
#else
if (!sdMounted())
@@ -654,6 +655,10 @@ void AudioQueue::playFile(const char *filename, uint8_t flags, uint8_t id)
void AudioQueue::stopPlay(uint8_t id)
{
#if defined(SIMU)
printf("stopPlay(id=%d)\n", id); fflush(stdout);
#endif
// For the moment it's only needed to stop the background music
if (backgroundContext.fragment.id == id) {
memset(&backgroundContext.fragment, 0, sizeof(AudioFragment));
+2 -1
View File
@@ -401,8 +401,9 @@ void eeLoadModel(uint8_t id)
resumePulses();
}
activeSwitches = 0;
activeFnSwitches = 0;
activeFunctions = 0;
activeFunctionSwitches = 0;
for (uint8_t i=0; i<MAX_TIMERS; i++) {
if (g_model.timers[i].remanent) {
+2 -1
View File
@@ -898,8 +898,9 @@ void eeLoadModel(uint8_t id)
resumePulses();
}
activeSwitches = 0;
activeFnSwitches = 0;
activeFunctions = 0;
activeFunctionSwitches = 0;
#if !defined(PCBSTD)
for (uint8_t i=0; i<MAX_TIMERS; i++) {
+1 -1
View File
@@ -68,7 +68,7 @@ PACK(typedef struct {
int8_t points[NUM_POINTS];
CustomSwData customSw[NUM_CSW];
FuncSwData funcSw[NUM_FSW];
CustomFnData funcSw[NUM_CFN];
SwashRingData swashR;
PhaseData phaseData[MAX_PHASES];
+17
View File
@@ -32,6 +32,7 @@
*
*/
#include <math.h>
#include <gtest/gtest.h>
#include "open9x.h"
@@ -219,6 +220,8 @@ TEST(EEPROM, rm)
EXPECT_EQ(sz, 0);
}
#if defined(FRSKY)
extern void processFrskyPacket(uint8_t *packet);
TEST(FrSky, gpsNfuel)
@@ -266,6 +269,8 @@ TEST(FrSky, dateNtime)
EXPECT_EQ(frskyData.hub.sec, 50);
}
#endif
TEST(getSwitch, undefCSW)
{
MODEL_RESET();
@@ -425,6 +430,18 @@ TEST(Mixer, RecursiveAddChannel)
EXPECT_EQ(chans[1], 0);
}
TEST(Expo, AllValues)
{
// TODO whole range
for (uint16_t x=0; x<100; x++) {
for (uint16_t k=0; k<100; k++) {
// TODO compare with the correct function instead of this one
uint16_t ref = ((unsigned long)x*x*x/0x10000*k/(RESXul*RESXul/0x10000) + (RESKul-k)*x+RESKul/2)/RESKul;
EXPECT_EQ(expou(x, k), ref);
}
}
}
int main(int argc, char **argv) {
StartEepromThread(NULL);
+6 -5
View File
@@ -64,11 +64,7 @@ uint8_t getEvent()
}
#endif
#if defined(CPUARM)
#define KEY_LONG_DELAY 32
#else
#define KEY_LONG_DELAY 24
#endif
Key keys[NUM_KEYS];
void Key::input(bool val, EnumKeys enuk)
@@ -161,11 +157,16 @@ void clearKeyEvents()
CoTickDelay(100); // 200ms
#endif
// loop until all keys are up
#if defined(SIMU)
while (keyDown() && main_thread_running) sleep(1/*ms*/);
#elif defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION) && !defined(TELEMETREZ)
while (keyDown()) { wdt_reset(); rotencPoll(); }
#else
while (keyDown()) wdt_reset(); // loop until all keys are up
while (keyDown()) wdt_reset();
#endif
memclear(keys, sizeof(keys));
putEvent(0);
}
+7 -2
View File
@@ -190,12 +190,17 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui
#if defined(CPUM64)
int8_t checkIncDecModel(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max)
{
return checkIncDec(event,i_val,i_min,i_max,EE_MODEL);
return checkIncDec(event, i_val, i_min, i_max, EE_MODEL);
}
int8_t checkIncDecModelZero(uint8_t event, int8_t i_val, int8_t i_max)
{
return checkIncDecModel(event, i_val, 0, i_max);
}
int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max)
{
return checkIncDec(event,i_val,i_min,i_max,EE_GENERAL);
return checkIncDec(event, i_val, i_min, i_max, EE_GENERAL);
}
#endif
+6 -1
View File
@@ -125,15 +125,20 @@ int16_t checkIncDec(uint8_t event, int16_t i_pval, int16_t i_min, int16_t i_max,
#if defined(CPUM64)
int8_t checkIncDecModel(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max);
int8_t checkIncDecModelZero(uint8_t event, int8_t i_val, int8_t i_max);
int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max);
#else
#define checkIncDecModel(event, i_val, i_min, i_max) checkIncDec(event, i_val, i_min, i_max, EE_MODEL)
#define checkIncDecModelZero(event, i_val, i_max) checkIncDec(event, i_val, 0, i_max, EE_MODEL)
#define checkIncDecGen(event, i_val, i_min, i_max) checkIncDec(event, i_val, i_min, i_max, EE_GENERAL)
#endif
#define CHECK_INCDEC_MODELVAR(event, var, min, max) \
var = checkIncDecModel(event,var,min,max)
#define CHECK_INCDEC_MODELVAR_ZERO(event, var, max) \
var = checkIncDecModelZero(event,var,max)
#if defined(AUTOSWITCH)
#define AUTOSWITCH_ENTER_LONG() (attr && event==EVT_KEY_LONG(KEY_ENTER))
#define CHECK_INCDEC_MODELSWITCH(event, var, min, max) \
@@ -272,7 +277,7 @@ void menuChannelsMonitor(uint8_t event);
#endif
#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D)
#define REPEAT_LAST_CURSOR_MOVE() putEvent(event)
#define REPEAT_LAST_CURSOR_MOVE() { if (EVT_KEY_MASK(event) >= 0x0e) putEvent(event); else m_posHorz = 0; }
#else
#define REPEAT_LAST_CURSOR_MOVE() m_posHorz = 0;
#endif
+106 -90
View File
@@ -242,20 +242,17 @@ void menuModelSelect(uint8_t event)
uint8_t _event_ = (IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event) ? 0 : event);
if (s_copyMode && (event & 0x1f) == KEY_EXIT)
if (s_copyMode && EVT_KEY_MASK(event) == KEY_EXIT)
_event_ -= KEY_EXIT;
int8_t oldSub = m_posVert;
if (!check_submenu_simple(_event_, MAX_MODELS-1)) return;
if (s_editMode > 0) s_editMode = 0;
#if !defined(CPUARM)
if (event
#if defined(ROTARY_ENCODER_NAVIGATION)
|| oldSub != m_posVert
#endif
) {
if (event) {
eeFlush(); // flush eeprom write
#if defined(SDCARD)
REFRESH(true);
@@ -404,15 +401,15 @@ void menuModelSelect(uint8_t event)
if (s_copySrcRow < 0 && s_copyMode==COPY_MODE) {
s_copySrcRow = oldSub;
// find a hole (in the first empty slot above / below)
m_posVert = eeFindEmptyModel(s_copySrcRow, event==EVT_KEY_FIRST(KEY_MOVE_DOWN));
if ((uint8_t)m_posVert == 0xff) {
sub = eeFindEmptyModel(s_copySrcRow, event==EVT_KEY_FIRST(KEY_MOVE_DOWN));
if (sub < 0) {
// no free room for duplicating the model
AUDIO_ERROR();
m_posVert = oldSub;
sub = oldSub;
s_copyMode = 0;
}
next_ofs = 0;
sub = m_posVert;
m_posVert = sub;
}
s_copyTgtOfs = next_ofs;
}
@@ -735,12 +732,10 @@ void menuModelSetup(uint8_t event)
{
TimerData *timer = &g_model.timers[k-ITEM_MODEL_TIMER1];
putsStrIdx(0*FW, y, STR_TIMER, k-ITEM_MODEL_TIMER1+1);
putsTmrMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, (attr && m_posHorz==0) ? blink : 0);
putsTime(MODEL_SETUP_2ND_COLUMN+5*FW-2, y, timer->start,
(attr && m_posHorz==1 ? blink:0),
(attr && m_posHorz==2 ? blink:0) );
putsTmrMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, m_posHorz==0 ? attr : 0);
putsTime(MODEL_SETUP_2ND_COLUMN+5*FW-2, y, timer->start, m_posHorz==1 ? attr : 0, m_posHorz==2 ? attr : 0);
#if defined(CPUARM) || defined(PCBGRUVIN9X)
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW-1, y, g_model.timers[k-ITEM_MODEL_TIMER1].remanent ? 'R' : '-', (attr && m_posHorz==3) ? blink : 0);
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW-1, y, g_model.timers[k-ITEM_MODEL_TIMER1].remanent ? 'R' : '-', m_posHorz==3 ? attr : 0);
#endif
if (attr && (editMode>0 || p1valdiff)) {
div_t qr = div(timer->start, 60);
@@ -749,7 +744,7 @@ void menuModelSetup(uint8_t event)
CHECK_INCDEC_MODELVAR(event, timer->mode, -2*(MAX_PSWITCH+NUM_CSW), TMR_VAROFS-1+2*(MAX_PSWITCH+NUM_CSW));
break;
case 1:
CHECK_INCDEC_MODELVAR(event, qr.quot, 0, 59);
CHECK_INCDEC_MODELVAR_ZERO(event, qr.quot, 59);
timer->start = qr.rem + qr.quot*60;
break;
case 2:
@@ -759,7 +754,7 @@ void menuModelSetup(uint8_t event)
break;
#if defined(CPUARM) || defined(PCBGRUVIN9X)
case 3:
CHECK_INCDEC_MODELVAR(event, g_model.timers[k-ITEM_MODEL_TIMER1].remanent, 0, 1);
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.timers[k-ITEM_MODEL_TIMER1].remanent, 1);
break;
#endif
}
@@ -782,7 +777,7 @@ void menuModelSetup(uint8_t event)
case ITEM_MODEL_THROTTLE_TRACE:
{
lcd_putsLeft(y, STR_TTRACE);
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.thrTraceSrc, 0, NUM_POTS+NUM_CHNOUT);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTraceSrc, NUM_POTS+NUM_CHNOUT);
uint8_t idx = g_model.thrTraceSrc + MIXSRC_Thr;
if (idx > MIXSRC_Thr)
idx += 1;
@@ -871,18 +866,18 @@ void menuModelSetup(uint8_t event)
lcd_putsLeft(y, NO_INDENT(STR_PROTO));
#endif
lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_VPROTOS, protocol, (attr && m_posHorz==0 ? (editMode>0 ? BLINK|INVERS : INVERS):0));
lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_VPROTOS, protocol, m_posHorz==0 ? attr : 0);
#if defined(PCBSKY9X)
lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+4*FW+3, y, STR_CH, (attr && m_posHorz==1) ? blink : 0);
lcd_outdezAtt(lcdLastPos, y, g_model.ppmSCH+1, LEFT | ((attr && m_posHorz==1) ? blink : 0));
lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+4*FW+3, y, STR_CH, m_posHorz==1 ? attr : 0);
lcd_outdezAtt(lcdLastPos, y, g_model.ppmSCH+1, LEFT | (m_posHorz==1 ? attr : 0));
lcd_putc(lcdLastPos, y, '-');
lcd_outdezAtt(lcdLastPos + FW+1, y, g_model.ppmSCH+NUM_PORT1_CHANNELS, LEFT | ((attr && m_posHorz==2) ? blink : 0));
lcd_outdezAtt(lcdLastPos + FW+1, y, g_model.ppmSCH+NUM_PORT1_CHANNELS, LEFT | (m_posHorz==2 ? attr : 0));
#else
if (IS_PPM_PROTOCOL(protocol)) {
lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN+7*FW, y, STR_NCHANNELS, g_model.ppmNCH+2, (attr && m_posHorz==1) ? blink : 0);
lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN+7*FW, y, STR_NCHANNELS, g_model.ppmNCH+2, m_posHorz==1 ? attr : 0);
}
else if (attr) {
else if (attr && m_posHorz != 0 /* TODO avoid it on stock with another macro*/) {
REPEAT_LAST_CURSOR_MOVE();
}
#endif
@@ -894,11 +889,11 @@ void menuModelSetup(uint8_t event)
)) {
switch (m_posHorz) {
case 0:
CHECK_INCDEC_MODELVAR(event, g_model.protocol, 0, PROTO_MAX-1);
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.protocol, PROTO_MAX-1);
break;
case 1:
#if defined(PCBSKY9X)
CHECK_INCDEC_MODELVAR(event, g_model.ppmSCH, 0, 32-8-(g_model.ppmNCH*2));
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.ppmSCH, 32-8-(g_model.ppmNCH*2));
#else
CHECK_INCDEC_MODELVAR(event, g_model.ppmNCH, -2, 4);
#endif
@@ -919,14 +914,14 @@ void menuModelSetup(uint8_t event)
case ITEM_MODEL_PPM2_PROTOCOL:
lcd_putsLeft(y, PSTR("Port2"));
lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_VPROTOS, 0, 0);
lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+4*FW+3, y, STR_CH, (attr && m_posHorz==0) ? blink : 0);
lcd_outdezAtt(lcdLastPos, y, g_model.ppm2SCH+1, LEFT | ((attr && m_posHorz==0) ? blink : 0));
lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+4*FW+3, y, STR_CH, m_posHorz==0 ? attr : 0);
lcd_outdezAtt(lcdLastPos, y, g_model.ppm2SCH+1, LEFT | (m_posHorz==0 ? attr : 0));
lcd_putc(lcdLastPos, y, '-');
lcd_outdezAtt(lcdLastPos + FW+1, y, g_model.ppm2SCH+8+(g_model.ppm2NCH*2), LEFT | ((attr && m_posHorz==1) ? blink : 0));
lcd_outdezAtt(lcdLastPos + FW+1, y, g_model.ppm2SCH+8+(g_model.ppm2NCH*2), LEFT | (m_posHorz==1 ? attr : 0));
if (attr && (editMode>0 || p1valdiff)) {
switch (m_posHorz) {
case 0:
CHECK_INCDEC_MODELVAR(event, g_model.ppm2SCH, 0, 32-8-(g_model.ppm2NCH*2));
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.ppm2SCH, 32-8-(g_model.ppm2NCH*2));
break;
case 1:
CHECK_INCDEC_MODELVAR(event, g_model.ppm2NCH, -2, min<int8_t>(4, (32-g_model.ppm2SCH)/2-4));
@@ -940,10 +935,10 @@ void menuModelSetup(uint8_t event)
if (IS_PPM_PROTOCOL(protocol)) {
lcd_putsLeft( y, STR_PPMFRAME);
lcd_puts(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS);
lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.ppmFrameLength*5 + 225, ((attr && m_posHorz==0) ? (editMode>0 ? BLINK|INVERS : INVERS) : 0) | PREC1|LEFT);
lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.ppmFrameLength*5 + 225, (m_posHorz==0 ? attr : 0) | PREC1|LEFT);
lcd_putc(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u');
lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.ppmDelay*50)+300, ((attr && m_posHorz==1) ? blink : 0));
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.pulsePol ? '+' : '-', (attr && m_posHorz==2) ? INVERS : 0);
lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.ppmDelay*50)+300, m_posHorz==1 ? attr : 0);
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.pulsePol ? '+' : '-', m_posHorz==2 ? attr : 0);
if(attr && (editMode>0 || p1valdiff)) {
switch (m_posHorz) {
@@ -954,7 +949,7 @@ void menuModelSetup(uint8_t event)
CHECK_INCDEC_MODELVAR(event, g_model.ppmDelay, -4, 10);
break;
case 2:
CHECK_INCDEC_MODELVAR(event, g_model.pulsePol, 0, 1);
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.pulsePol, 1);
break;
}
}
@@ -966,9 +961,9 @@ void menuModelSetup(uint8_t event)
}
lcd_putsLeft(y, STR_RXNUM);
lcd_outdezNAtt(MODEL_SETUP_2ND_COLUMN-3*FW, y, g_model.modelId, ((attr && m_posHorz==0) ? (editMode>0 ? BLINK|INVERS : INVERS) : 0) | LEADING0|LEFT, 2);
lcd_outdezNAtt(MODEL_SETUP_2ND_COLUMN-3*FW, y, g_model.modelId, (m_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
if (attr && (m_posHorz==0 && (editMode>0 || p1valdiff)))
CHECK_INCDEC_MODELVAR(event, g_model.modelId, 0, 99);
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.modelId, 99);
#if defined(PXX)
if (protocol == PROTO_PXX) {
@@ -1037,7 +1032,7 @@ uint8_t editDelay(const xcoord_t x, const uint8_t y, const uint8_t event, const
{
lcd_puts(x, y, str);
lcd_outdezAtt(x+MIXES_2ND_COLUMN, y, (10/DELAY_STEP)*delay, attr|PREC1|LEFT);
if (attr) CHECK_INCDEC_MODELVAR(event, delay, 0, DELAY_MAX);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, delay, DELAY_MAX);
return delay;
}
#define EDIT_DELAY(x, y, event, attr, str, delay) editDelay(x, y, event, attr, str, delay)
@@ -1046,7 +1041,7 @@ uint8_t editDelay(const uint8_t y, const uint8_t event, const uint8_t attr, cons
{
lcd_putsLeft(y, str);
lcd_outdezAtt(MIXES_2ND_COLUMN, y, (10/DELAY_STEP)*delay, attr|PREC1|LEFT);
if (attr) CHECK_INCDEC_MODELVAR(event, delay, 0, DELAY_MAX);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, delay, DELAY_MAX);
return delay;
}
#define EDIT_DELAY(x, y, event, attr, str, delay) editDelay(y, event, attr, str, delay)
@@ -1153,7 +1148,7 @@ void menuModelPhaseOne(uint8_t event)
case ITEM_MODEL_PHASE_TRIMS:
lcd_putsLeft(y, STR_TRIMS);
for (uint8_t t=0; t<NUM_STICKS; t++) {
putsTrimMode(MIXES_2ND_COLUMN+(t*FW), y, s_currIdx, t, (attr && m_posHorz==t) ? ((editMode>0) ? BLINK|INVERS : INVERS) : 0);
putsTrimMode(MIXES_2ND_COLUMN+(t*FW), y, s_currIdx, t, m_posHorz==t ? attr : 0);
if (attr && m_posHorz==t && ((editMode>0) || p1valdiff)) {
int16_t v = getRawTrimValue(s_currIdx, t);
if (v < TRIM_EXTENDED_MAX) v = TRIM_EXTENDED_MAX;
@@ -1170,7 +1165,7 @@ void menuModelPhaseOne(uint8_t event)
case ITEM_MODEL_PHASE_ROTARY_ENCODERS:
lcd_putsLeft(y, STR_ROTARY_ENCODER);
for (uint8_t t=0; t<NUM_ROTARY_ENCODERS; t++) {
putsRotaryEncoderMode(MIXES_2ND_COLUMN+(t*FW), y, s_currIdx, t, (attr && m_posHorz==t) ? ((editMode>0) ? BLINK|INVERS : INVERS) : 0);
putsRotaryEncoderMode(MIXES_2ND_COLUMN+(t*FW), y, s_currIdx, t, m_posHorz==t ? attr : 0);
if (attr && m_posHorz==t && ((editMode>0) || p1valdiff)) {
#if ROTARY_ENCODERS > 2
int16_t v;
@@ -1229,7 +1224,7 @@ void menuModelPhaseOne(uint8_t event)
else {
lcd_putsAtt(MIXES_2ND_COLUMN+2*FW, y, STR_OWN, m_posHorz==1 ? attr : 0);
}
if (attr && s_currIdx>0 && m_posHorz==1 && ((editMode>0) || p1valdiff)) {
if (attr && s_currIdx>0 && m_posHorz==1 && (editMode>0 || p1valdiff)) {
if (v < GVAR_MAX) v = GVAR_MAX;
v = checkIncDec(event, v, GVAR_MAX, GVAR_MAX+MAX_PHASES-1, EE_MODEL);
if (checkIncDec_Ret) {
@@ -1382,7 +1377,7 @@ void menuModelHeli(uint8_t event)
case ITEM_HELI_SWASHRING:
lcd_putsLeft(y, STR_SWASHRING);
lcd_outdezAtt(HELI_PARAM_OFS, y, g_model.swashR.value, LEFT|attr);
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.swashR.value, 0, 100);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.swashR.value, 100);
break;
case ITEM_HELI_ELEDIRECTION:
@@ -1843,7 +1838,7 @@ void menuModelExpoOne(uint8_t event)
if (ed->curveMode!=MODE_EXPO || ed->curveParam==0) {
putsCurve(EXPO_ONE_2ND_COLUMN, y, ed->curveParam, attr);
if (attr) {
CHECK_INCDEC_MODELVAR(event, ed->curveParam, 0, CURVE_BASE+MAX_CURVES-1);
CHECK_INCDEC_MODELVAR_ZERO(event, ed->curveParam, CURVE_BASE+MAX_CURVES-1);
if (ed->curveParam) ed->curveMode = MODE_CURVE;
if (ed->curveParam>=CURVE_BASE && event==EVT_KEY_FIRST(KEY_MENU)) {
s_curveChan = ed->curveParam - CURVE_BASE;
@@ -2082,7 +2077,7 @@ void menuModelMixOne(uint8_t event)
lcd_outdezAtt(COLUMN_X+MIXES_2ND_COLUMN, y, md2->mixWarn, attr|LEFT);
else
lcd_putsAtt(COLUMN_X+MIXES_2ND_COLUMN, y, STR_OFF, attr);
if (attr) CHECK_INCDEC_MODELVAR( event, md2->mixWarn, 0, 3);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, md2->mixWarn, 3);
break;
case MIX_FIELD_MLTPX:
md2->mltpx = selectMenuItem(COLUMN_X+MIXES_2ND_COLUMN, y, STR_MULTPX, STR_VMLTPX, md2->mltpx, 0, 2, attr, event);
@@ -2609,7 +2604,7 @@ void menuModelLimits(uint8_t event)
case ITEM_LIMITS_SYMETRICAL:
lcd_putcAtt(LCD_W-FW-MENUS_SCROLLBAR_WIDTH, y, ld->symetrical ? '=' : '^', attr);
if (active) {
CHECK_INCDEC_MODELVAR(event, ld->symetrical, 0, 1);
CHECK_INCDEC_MODELVAR_ZERO(event, ld->symetrical, 1);
}
break;
#endif
@@ -2764,7 +2759,7 @@ void menuModelCustomSwitchOne(uint8_t event)
lcd_putsLeft(y, STR_FUNC);
lcd_putsiAtt(CSW_2ND_COLUMN, y, STR_VCSWFUNC, cs->func, attr);
if (attr) {
CHECK_INCDEC_MODELVAR(event, cs->func, 0, CS_MAXF);
CHECK_INCDEC_MODELVAR_ZERO(event, cs->func, CS_MAXF);
if (cstate != CS_STATE(cs->func)) {
cs->v1 = 0;
cs->v2 = 0;
@@ -2835,7 +2830,7 @@ void menuModelCustomSwitchOne(uint8_t event)
lcd_outdezAtt(CSW_2ND_COLUMN, y, 5*cs->duration, attr|PREC1|LEFT);
else
lcd_putsiAtt(CSW_2ND_COLUMN, y, STR_MMMINV, 0, attr);
if (attr) CHECK_INCDEC_MODELVAR(event, cs->duration, 0, MAX_CSW_DURATION);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, cs->duration, MAX_CSW_DURATION);
break;
case CSW_FIELD_DELAY:
lcd_putsLeft(y, STR_DELAY);
@@ -2843,7 +2838,7 @@ void menuModelCustomSwitchOne(uint8_t event)
lcd_outdezAtt(CSW_2ND_COLUMN, y, 5*cs->delay, attr|PREC1|LEFT);
else
lcd_putsiAtt(CSW_2ND_COLUMN, y, STR_MMMINV, 0, attr);
if (attr) CHECK_INCDEC_MODELVAR(event, cs->delay, 0, MAX_CSW_DELAY);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, cs->delay, MAX_CSW_DELAY);
break;
}
}
@@ -2981,7 +2976,7 @@ void menuModelCustomSwitches(uint8_t event)
if ((s_editMode>0 || p1valdiff) && attr) {
switch (m_posHorz) {
case 0:
CHECK_INCDEC_MODELVAR(event, cs->func, 0, CS_MAXF);
CHECK_INCDEC_MODELVAR_ZERO(event, cs->func, CS_MAXF);
if (cstate != CS_STATE(cs->func)) {
cs->v1 = 0;
cs->v2 = 0;
@@ -3022,7 +3017,7 @@ void menuModelCustomFunctions(uint8_t event)
}
#endif
MENU(STR_MENUCUSTOMFUNC, menuTabModel, e_CustomFunctions, NUM_FSW+1, {0, 3/*repeated*/});
MENU(STR_MENUCUSTOMFUNC, menuTabModel, e_CustomFunctions, NUM_CFN+1, {0, 3/*repeated*/});
uint8_t y;
uint8_t k = 0;
@@ -3032,7 +3027,7 @@ void menuModelCustomFunctions(uint8_t event)
y = 1 + (i+1)*FH;
k = i+s_pgOfs;
if(k==NUM_CHNOUT) break;
FuncSwData *sd = &g_model.funcSw[k];
CustomFnData *sd = &g_model.funcSw[k];
for (uint8_t j=0; j<4; j++) {
uint8_t attr = ((sub==k && m_posHorz==j) ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0);
uint8_t active = (attr && (s_editMode>0 || p1valdiff));
@@ -3042,7 +3037,7 @@ void menuModelCustomFunctions(uint8_t event)
if (sd->swtch > MAX_SWITCH+1) sd->swtch -= (MAX_SWITCH+1);
if (sd->swtch < -MAX_SWITCH-1) sd->swtch += (MAX_SWITCH+1);
}
putsSwitches(3, y, sd->swtch, SWONOFF | attr | ((abs(sd->swtch) <= (MAX_SWITCH+1) && getSwitch(sd->swtch, 0) && (sd->func > FUNC_INSTANT_TRIM || sd->active)) ? BOLD : 0));
putsSwitches(3, y, sd->swtch, SWONOFF | attr | ((activeFnSwitches & ((MASK_FUNC_TYPE)1 << k)) ? BOLD : 0));
if (active || AUTOSWITCH_ENTER_LONG()) {
#if defined(PCBX9D)
CHECK_INCDEC_MODELSWITCH(event, sd->swtch, -127, +127);
@@ -3086,8 +3081,8 @@ void menuModelCustomFunctions(uint8_t event)
}
lcd_putsiAtt(MODEL_CUSTOM_FUNC_2ND_COLUMN, y, STR_VFSWFUNC, func_displayed, attr);
if (active) {
CHECK_INCDEC_MODELVAR(event, sd->func, 0, FUNC_MAX-1);
if (checkIncDec_Ret) FSW_RESET_PARAM(sd);
CHECK_INCDEC_MODELVAR_ZERO(event, sd->func, FUNC_MAX-1);
if (checkIncDec_Ret) CFN_RESET_PARAM(sd);
}
}
else if (attr) {
@@ -3097,7 +3092,7 @@ void menuModelCustomFunctions(uint8_t event)
case 2:
if (sd->swtch) {
int16_t val_displayed = FSW_PARAM(sd);
int16_t val_displayed = CFN_PARAM(sd);
int8_t val_min = 0;
uint8_t val_max = 255;
if (sd->func == FUNC_PLAY_SOUND) {
@@ -3116,10 +3111,11 @@ void menuModelCustomFunctions(uint8_t event)
#endif
#if defined(CPUARM) && defined(SDCARD)
else if (sd->func == FUNC_PLAY_TRACK || sd->func == FUNC_BACKGND_MUSIC) {
uint8_t x = (sd->func == FUNC_PLAY_TRACK ? MODEL_CUSTOM_FUNC_2ND_COLUMN + FW + FW*strlen(TR_PLAY_TRACK) : MODEL_CUSTOM_FUNC_3RD_COLUMN);
if (ZLEN(sd->param))
lcd_putsnAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, sd->param, sizeof(sd->param), attr);
lcd_putsnAtt(x, y, sd->param, sizeof(sd->param), attr);
else
lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_VCSWFUNC, 0, attr);
lcd_putsiAtt(x, y, STR_VCSWFUNC, 0, attr);
if (active && event==EVT_KEY_BREAK(KEY_ENTER)) {
s_editMode = 0;
_event = 0;
@@ -3132,7 +3128,7 @@ void menuModelCustomFunctions(uint8_t event)
}
else if (sd->func == FUNC_PLAY_VALUE) {
val_max = NUM_XCHNPLAY-1;
putsChnRaw(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
putsChnRaw(MODEL_CUSTOM_FUNC_3RD_COLUMN-FW-2, y, val_displayed+1, attr);
}
#endif
#if defined(CPUARM)
@@ -3144,14 +3140,14 @@ void menuModelCustomFunctions(uint8_t event)
else if (sd->func == FUNC_PLAY_TRACK) {
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+PROMPT_CUSTOM_BASE, attr|LEFT);
}
else if (sd->func == FUNC_PLAY_BOTH) {
lcd_putcAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN-1, y, '|', attr);
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN+1, y, val_displayed+PROMPT_CUSTOM_BASE, attr);
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN+3, y, val_displayed+PROMPT_CUSTOM_BASE+1, attr|LEFT);
}
else if (sd->func == FUNC_PLAY_VALUE) {
val_max = NUM_XCHNPLAY-1;
putsChnRaw(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
}
else if (sd->func == FUNC_PLAY_BOTH) {
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+PROMPT_CUSTOM_BASE, attr|LEFT);
lcd_putcAtt(lcdLastPos, y, '/', attr);
lcd_outdezAtt(lcdLastPos+FW, y, val_displayed+PROMPT_CUSTOM_BASE+1, attr|LEFT);
putsChnRaw(MODEL_CUSTOM_FUNC_3RD_COLUMN-2*FW-2, y, val_displayed+1, attr);
}
#endif
#if defined(SDCARD)
@@ -3167,10 +3163,10 @@ void menuModelCustomFunctions(uint8_t event)
#endif
else if (sd->func == FUNC_RESET) {
val_max = 3;
lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_VFSWRESET, FSW_PARAM(sd), attr);
lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_VFSWRESET, CFN_PARAM(sd), attr);
}
else if (sd->func <= FUNC_SAFETY_CH16) {
val_displayed = (int8_t)FSW_PARAM(sd);
val_displayed = (int8_t)CFN_PARAM(sd);
val_min = -125; val_max = 125;
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT);
}
@@ -3190,7 +3186,7 @@ void menuModelCustomFunctions(uint8_t event)
}
if (active) {
FSW_PARAM(sd) = checkIncDec(event, val_displayed, val_min, val_max, EE_MODEL);
CFN_PARAM(sd) = checkIncDec(event, val_displayed, val_min, val_max, EE_MODEL);
}
}
else if (attr) {
@@ -3201,8 +3197,25 @@ void menuModelCustomFunctions(uint8_t event)
case 3:
if (sd->swtch && sd->func <= FUNC_INSTANT_TRIM) {
menu_lcd_onoff(MODEL_CUSTOM_FUNC_4TH_COLUMN, y, sd->active, attr);
if (active) CHECK_INCDEC_MODELVAR(event, sd->active, 0, 1);
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 1);
}
#if defined(VOICE)
else if (sd->swtch && sd->func >= FUNC_PLAY_TRACK && sd->func <= FUNC_PLAY_VALUE) {
#if defined(CPUARM)
if (sd->active) {
lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2, y, sd->active*5, attr);
lcd_putcAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2, y, '\'', attr);
}
else {
lcd_putcAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN-1, y, '-', attr);
}
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 12);
#else
lcd_putsiAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN-2*FWNUM, y, PSTR("\003\002\001-15'30'60'"), sd->active, attr);
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 3);
#endif
}
#endif
else if (attr) {
REPEAT_LAST_CURSOR_MOVE();
}
@@ -3327,8 +3340,8 @@ void menuModelTelemetry(uint8_t event)
case ITEM_TELEMETRY_A1_RANGE:
case ITEM_TELEMETRY_A2_RANGE:
lcd_putsLeft(y, STR_RANGE);
putsTelemetryChannel(TELEM_COL2, y, dest, 255-channel.offset, ((attr && m_posHorz==0) ? blink : 0)|NO_UNIT|LEFT);
lcd_putsiAtt(lcdLastPos, y, STR_VTELEMUNIT, channel.type, (attr && m_posHorz==1 ? blink : 0));
putsTelemetryChannel(TELEM_COL2, y, dest, 255-channel.offset, (m_posHorz==0 ? attr : 0)|NO_UNIT|LEFT);
lcd_putsiAtt(lcdLastPos, y, STR_VTELEMUNIT, channel.type, m_posHorz==1 ? attr : 0);
if (attr && (s_editMode>0 || p1valdiff)) {
if (m_posHorz == 0) {
uint16_t ratio = checkIncDec(event, channel.ratio, 0, 256, EE_MODEL);
@@ -3345,7 +3358,7 @@ void menuModelTelemetry(uint8_t event)
}
}
else {
CHECK_INCDEC_MODELVAR(event, channel.type, 0, UNIT_A1A2_MAX);
CHECK_INCDEC_MODELVAR_ZERO(event, channel.type, UNIT_A1A2_MAX);
}
}
break;
@@ -3364,9 +3377,9 @@ void menuModelTelemetry(uint8_t event)
{
uint8_t j = ((k==ITEM_TELEMETRY_A1_ALARM1 || k==ITEM_TELEMETRY_A2_ALARM1) ? 0 : 1);
lcd_putsLeft(y, STR_ALARM);
lcd_putsiAtt(TELEM_COL2, y, STR_VALARM, ALARM_LEVEL(ch, j), (attr && m_posHorz==0) ? blink : 0);
lcd_putsiAtt(TELEM_COL2+4*FW, y, STR_VALARMFN, ALARM_GREATER(ch, j), (attr && m_posHorz==1) ? blink : 0);
putsTelemetryChannel(TELEM_COL2+6*FW, y, dest, channel.alarms_value[j], (attr && m_posHorz==2 ? blink : 0) | LEFT);
lcd_putsiAtt(TELEM_COL2, y, STR_VALARM, ALARM_LEVEL(ch, j), m_posHorz==0 ? attr : 0);
lcd_putsiAtt(TELEM_COL2+4*FW, y, STR_VALARMFN, ALARM_GREATER(ch, j), m_posHorz==1 ? attr : 0);
putsTelemetryChannel(TELEM_COL2+6*FW, y, dest, channel.alarms_value[j], (m_posHorz==2 ? attr : 0) | LEFT);
if (attr && (s_editMode>0 || p1valdiff)) {
uint8_t t;
@@ -3398,9 +3411,9 @@ void menuModelTelemetry(uint8_t event)
case ITEM_TELEMETRY_RSSI_ALARM2: {
uint8_t j = k-ITEM_TELEMETRY_RSSI_ALARM1;
lcd_putsLeft(y, STR_ALARM);
lcd_putsiAtt(TELEM_COL2, y, STR_VALARM, ((2+j+g_model.frsky.rssiAlarms[j].level)%4), (attr && m_posHorz==0) ? blink : 0);
lcd_putsiAtt(TELEM_COL2, y, STR_VALARM, ((2+j+g_model.frsky.rssiAlarms[j].level)%4), m_posHorz==0 ? attr : 0);
lcd_putc(TELEM_COL2+4*FW, y, '<');
lcd_outdezNAtt(TELEM_COL2+6*FW, y, getRssiAlarmValue(j), LEFT|((attr && m_posHorz==1) ? blink : 0), 3);
lcd_outdezNAtt(TELEM_COL2+6*FW, y, getRssiAlarmValue(j), LEFT|(m_posHorz==1 ? attr : 0), 3);
if (attr && (s_editMode>0 || p1valdiff)) {
switch (m_posHorz) {
@@ -3423,26 +3436,26 @@ void menuModelTelemetry(uint8_t event)
case ITEM_TELEMETRY_USR_PROTO:
lcd_putsLeft(y, STR_PROTO);
lcd_putsiAtt(TELEM_COL2, y, STR_VTELPROTO, g_model.frsky.usrProto, attr);
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.usrProto, 0, USR_PROTO_LAST);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.frsky.usrProto, USR_PROTO_LAST);
break;
case ITEM_TELEMETRY_USR_BLADES:
lcd_putsLeft(y, STR_BLADES);
lcd_outdezAtt(TELEM_COL2+FWNUM, y, 2+g_model.frsky.blades, attr);
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.blades, 0, 3);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.frsky.blades, 3);
break;
#endif
case ITEM_TELEMETRY_USR_VOLTAGE_SOURCE:
lcd_putsLeft(y, STR_VOLTAGE);
lcd_putsiAtt(TELEM_COL2, y, STR_VOLTSRC, g_model.frsky.voltsSource+1, attr);
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.voltsSource, 0, 3);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.frsky.voltsSource, 3);
break;
case ITEM_TELEMETRY_USR_CURRENT_SOURCE:
lcd_putsLeft(y, STR_CURRENT);
lcd_putsiAtt(TELEM_COL2, y, STR_VOLTSRC, g_model.frsky.currentSource, attr);
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.currentSource, 0, 3);
if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.frsky.currentSource, 3);
break;
#if defined(VARIO)
@@ -3458,17 +3471,20 @@ void menuModelTelemetry(uint8_t event)
case ITEM_TELEMETRY_VARIO_RANGE:
lcd_putsLeft(y, STR_LIMIT);
lcd_outdezAtt(TELEM_COL2, y, -10+g_model.frsky.varioMin, ((attr && m_posHorz==0) ? blink : 0)|LEFT);
lcd_outdezAtt(TELEM_COL2+7*FW-2, y, -5+g_model.frsky.varioCenterMin, ((attr && m_posHorz==1) ? blink : 0)|PREC1);
lcd_outdezAtt(TELEM_COL2+10*FW, y, 5+g_model.frsky.varioCenterMax, ((attr && m_posHorz==2) ? blink : 0)|PREC1);
lcd_outdezAtt(TELEM_COL2+13*FW+2, y, 10+g_model.frsky.varioMax, ((attr && m_posHorz==3) ? blink : 0));
lcd_outdezAtt(TELEM_COL2, y, -10+g_model.frsky.varioMin, (m_posHorz==0 ? attr : 0)|LEFT);
if (g_model.frsky.varioCenterMin == -16)
lcd_putsAtt(TELEM_COL2+4*FW-2, y, STR_OFF, m_posHorz==1 ? attr : 0);
else
lcd_outdezAtt(TELEM_COL2+7*FW-2, y, -5+g_model.frsky.varioCenterMin, (m_posHorz==1 ? attr : 0)|PREC1);
lcd_outdezAtt(TELEM_COL2+10*FW, y, 5+g_model.frsky.varioCenterMax, (m_posHorz==2 ? attr : 0)|PREC1);
lcd_outdezAtt(TELEM_COL2+13*FW+2, y, 10+g_model.frsky.varioMax, (m_posHorz==3 ? attr : 0));
if (attr && (s_editMode>0 || p1valdiff)) {
switch (m_posHorz) {
case 0:
CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioMin, -7, 7);
break;
case 1:
CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioCenterMin, -15, 5+min<int8_t>(10, g_model.frsky.varioCenterMax+5));
CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioCenterMin, -16, 5+min<int8_t>(10, g_model.frsky.varioCenterMax+5));
break;
case 2:
CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioCenterMax, -5+max<int8_t>(-10, g_model.frsky.varioCenterMin-5), +15);
@@ -3540,10 +3556,10 @@ void menuModelTelemetry(uint8_t event)
if (IS_BARS_SCREEN(screenIndex)) {
FrSkyBarData & bar = g_model.frsky.screens[screenIndex].bars[lineIndex];
uint8_t barSource = bar.source;
lcd_putsiAtt(INDENT_WIDTH, y, STR_VTELEMCHNS, barSource, (attr && m_posHorz==0) ? blink : 0);
lcd_putsiAtt(INDENT_WIDTH, y, STR_VTELEMCHNS, barSource, m_posHorz==0 ? attr : 0);
if (barSource) {
putsTelemetryChannel(56-3*FW, y, barSource-1, convertTelemValue(barSource, bar.barMin), (attr && m_posHorz==1 ? blink : 0) | LEFT);
putsTelemetryChannel(14*FW-3, y, barSource-1, convertTelemValue(barSource, 255-bar.barMax), (attr && m_posHorz==2 ? blink : 0) | LEFT);
putsTelemetryChannel(56-3*FW, y, barSource-1, convertTelemValue(barSource, bar.barMin), (m_posHorz==1 ? attr : 0) | LEFT);
putsTelemetryChannel(14*FW-3, y, barSource-1, convertTelemValue(barSource, 255-bar.barMax), (m_posHorz==2 ? attr : 0) | LEFT);
}
else {
if (attr) m_posHorz = 0;
@@ -3569,9 +3585,9 @@ void menuModelTelemetry(uint8_t event)
else {
for (uint8_t c=0; c<2; c++) {
uint8_t & value = g_model.frsky.screens[screenIndex].lines[lineIndex].sources[c];
lcd_putsiAtt(c==0?INDENT_WIDTH:TELEM_COL2, y, STR_VTELEMCHNS, value, (attr && m_posHorz==c) ? blink : 0);
lcd_putsiAtt(c==0?INDENT_WIDTH:TELEM_COL2, y, STR_VTELEMCHNS, value, m_posHorz==c ? attr : 0);
if (attr && m_posHorz==c && (s_editMode>0 || p1valdiff)) {
CHECK_INCDEC_MODELVAR(event, value, 0, g_model.frsky.usrProto ? ((lineIndex==3 && c==0) ? TELEM_STATUS_MAX : TELEM_DISPLAY_MAX) : TELEM_NOUSR_MAX);
CHECK_INCDEC_MODELVAR_ZERO(event, value, g_model.frsky.usrProto ? ((lineIndex==3 && c==0) ? TELEM_STATUS_MAX : TELEM_DISPLAY_MAX) : TELEM_NOUSR_MAX);
}
}
if (attr && m_posHorz == 2) {
+16 -16
View File
@@ -381,24 +381,24 @@ enum Functions {
};
#if defined(CPUARM)
PACK(typedef struct t_FuncSwData { // Function Switches data
PACK(typedef struct t_CustomFnData { // Function Switches data
int8_t swtch; //input
uint8_t func;
char param[6];
char param[6];
uint8_t active;
uint8_t spare;
}) FuncSwData;
#define FSW_PARAM(p) (*((uint32_t*)(p)->param))
#define FSW_RESET_PARAM(p) memset(p->param, 0, sizeof(p->param))
}) CustomFnData;
#define CFN_PARAM(p) (*((uint32_t*)(p)->param))
#define CFN_RESET_PARAM(p) memset(p->param, 0, sizeof(p->param))
#else
PACK(typedef struct t_FuncSwData { // Function Switches data
int8_t swtch; //input
uint8_t func:7;
uint8_t active:1;
PACK(typedef struct t_CustomFnData { // Function Switches data
int8_t swtch; // input
uint8_t func:6;
uint8_t active:2;
uint8_t param;
}) FuncSwData;
#define FSW_PARAM(p) ((p)->param)
#define FSW_RESET_PARAM(p) FSW_PARAM(p) = 0
}) CustomFnData;
#define CFN_PARAM(p) ((p)->param)
#define CFN_RESET_PARAM(p) CFN_PARAM(p) = 0
#endif
enum TelemetryUnit {
@@ -682,7 +682,7 @@ PACK(typedef struct t_PhaseData {
#define MAX_MIXERS 64
#define MAX_EXPOS 32
#define NUM_CSW 32 // number of custom switches
#define NUM_FSW 32 // number of functions assigned to switches
#define NUM_CFN 32 // number of functions assigned to switches
#elif defined(PCBGRUVIN9X) || defined(CPUM128)
#define MAX_MODELS 30
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
@@ -690,7 +690,7 @@ PACK(typedef struct t_PhaseData {
#define MAX_MIXERS 32
#define MAX_EXPOS 14
#define NUM_CSW 12 // number of custom switches
#define NUM_FSW 16 // number of functions assigned to switches
#define NUM_CFN 16 // number of functions assigned to switches
#else
#define MAX_MODELS 16
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
@@ -698,7 +698,7 @@ PACK(typedef struct t_PhaseData {
#define MAX_MIXERS 32
#define MAX_EXPOS 14
#define NUM_CSW 12 // number of custom switches
#define NUM_FSW 16 // number of functions assigned to switches
#define NUM_CFN 16 // number of functions assigned to switches
#endif
#define MAX_TIMERS 2
@@ -881,7 +881,7 @@ PACK(typedef struct t_ModelData {
int8_t points[NUM_POINTS];
CustomSwData customSw[NUM_CSW];
FuncSwData funcSw[NUM_FSW];
CustomFnData funcSw[NUM_CFN];
SwashRingData swashR;
PhaseData phaseData[MAX_PHASES];
+169 -151
View File
@@ -264,8 +264,8 @@ void per10ms()
#if defined(ROTARY_ENCODER_NAVIGATION)
if (IS_RE_NAVIGATION_ENABLE()) {
static int16_t rePreviousValue;
int16_t reNewValue = (g_rotenc[NAVIGATION_RE_IDX()] / ROTARY_ENCODER_GRANULARITY);
static rotenc_t rePreviousValue;
rotenc_t reNewValue = (g_rotenc[NAVIGATION_RE_IDX()] / ROTARY_ENCODER_GRANULARITY);
int8_t scrollRE = reNewValue - rePreviousValue;
if (scrollRE) {
rePreviousValue = reNewValue;
@@ -404,17 +404,17 @@ void modelDefault(uint8_t id)
applyDefaultTemplate();
}
int16_t intpol(int16_t x, uint8_t idx) // -100, -75, -50, -25, 0 ,25 ,50, 75, 100
int16_t intpol(int16_t x, uint8_t idx) // -100, -75, -50, -25, 0, 25 ,50, 75, 100
{
CurveInfo crv = curveinfo(idx);
int16_t erg = 0;
x+=RESXu;
if (x < 0) {
erg = (int16_t)crv.crv[0] * (RESX/4);
erg = (int16_t)crv.crv[0];
}
else if (x >= (RESX*2)) {
erg = (int16_t)crv.crv[crv.points-1] * (RESX/4);
erg = (int16_t)crv.crv[crv.points-1];
}
else {
uint16_t a=0, b=0;
@@ -422,7 +422,7 @@ int16_t intpol(int16_t x, uint8_t idx) // -100, -75, -50, -25, 0 ,25 ,50, 75, 10
if (crv.custom) {
for (i=0; i<crv.points-1; i++) {
a = b;
b = (i==crv.points-2 ? 2*RESX : (100 * (RESX/4) / 25 + crv.crv[crv.points+i] * (RESX/4) / 25));
b = (i==crv.points-2 ? 2*RESX : RESX + calc100toRESX(crv.crv[crv.points+i]));
if ((uint16_t)x<=b) break;
}
}
@@ -432,10 +432,10 @@ int16_t intpol(int16_t x, uint8_t idx) // -100, -75, -50, -25, 0 ,25 ,50, 75, 10
a = i * d;
b = a + d;
}
erg = (int16_t)crv.crv[i]*(RESX/4) + ((int32_t)(x-a) * (crv.crv[i+1]-crv.crv[i]) * (RESX/4)) / ((b-a));
erg = (int16_t)crv.crv[i] + ((int32_t)(x-a) * (crv.crv[i+1]-crv.crv[i])) / (b-a);
}
return erg / 25; // 100*D5/RESX;
return calc100toRESX(erg);
}
#if defined(CURVES)
@@ -480,8 +480,19 @@ int16_t applyCurve(int16_t x, int8_t idx)
uint16_t expou(uint16_t x, uint16_t k)
{
// previous function was this one:
// k*x*x*x + (1-k)*x
return ((unsigned long)x*x*x/0x10000*k/(RESXul*RESXul/0x10000) + (RESKul-k)*x+RESKul/2)/RESKul;
// return ((unsigned long)x*x*x/0x10000*k/(RESXul*RESXul/0x10000) + (RESKul-k)*x+RESKul/2)/RESKul;
uint32_t value = (uint32_t) x*x;
value *= (uint32_t)k;
value >>= 8;
value *= (uint32_t)x;
value >>= 12;
value += (uint32_t)(100-k)*x+50;
// return divu100(value);
return value/100;
}
int16_t expo(int16_t x, int16_t k)
@@ -1203,6 +1214,10 @@ void checkBacklight()
{
static uint8_t tmr10ms ;
#if defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION)
rotencPoll();
#endif
if (tmr10ms != g_blinkTmr10ms) {
tmr10ms = g_blinkTmr10ms;
uint16_t tsum = stickMoveValue();
@@ -1222,10 +1237,6 @@ void checkBacklight()
Voice.voice_process() ;
#endif
}
#if defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION)
rotencPoll();
#endif
}
void backlightOn()
@@ -1926,8 +1937,10 @@ void testFunc()
}
#endif
MASK_FUNC_TYPE activeFunctions = 0;
MASK_FSW_TYPE activeFunctionSwitches = 0;
MASK_FUNC_TYPE activeFunctions = 0;
MASK_CFN_TYPE activeSwitches = 0;
MASK_CFN_TYPE activeFnSwitches = 0;
tmr10ms_t lastFunctionTime[NUM_CFN] = { 0 };
#if defined(VOICE)
PLAY_FUNCTION(playValue, uint8_t idx)
@@ -2048,16 +2061,25 @@ PLAY_FUNCTION(playValue, uint8_t idx)
#if defined(CPUARM)
uint8_t currentSpeakerVolume = 255;
uint8_t requiredSpeakerVolume;
uint8_t fnSwitchDuration[NUM_FSW] = { 0 };
#define FSW_PRESSLONG_DURATION 100
#define COMPLEX_SWITCH (momentary || shrt || lng)
#else
#define COMPLEX_SWITCH (momentary)
uint8_t fnSwitchDuration[NUM_CFN] = { 0 };
#define CFN_PRESSLONG_DURATION 100
inline void playCustomFunctionFile(CustomFnData *sd, uint8_t id)
{
char lfn[] = SOUNDS_PATH "/xxxxxx.wav";
strncpy(lfn+sizeof(SOUNDS_PATH), sd->param, sizeof(sd->param));
lfn[sizeof(SOUNDS_PATH)+sizeof(sd->param)] = '\0';
strcat(lfn+sizeof(SOUNDS_PATH), SOUNDS_EXT);
PLAY_FILE(lfn, sd->func==FUNC_BACKGND_MUSIC ? PLAY_BACKGROUND : 0, id);
}
#endif
void evalFunctions()
{
MASK_FUNC_TYPE newActiveFunctions = 0;
MASK_FUNC_TYPE newActiveFunctions = 0;
MASK_CFN_TYPE newActiveSwitches = 0;
MASK_CFN_TYPE newActiveFnSwitches = 0;
#if defined(ROTARY_ENCODERS) && defined(GVARS)
static rotenc_t rePreviousValues[ROTARY_ENCODERS];
@@ -2071,25 +2093,39 @@ void evalFunctions()
trimGvar[i] = -1;
#endif
for (uint8_t i=0; i<NUM_FSW; i++) {
FuncSwData *sd = &g_model.funcSw[i];
for (uint8_t i=0; i<NUM_CFN; i++) {
CustomFnData *sd = &g_model.funcSw[i];
int8_t swtch = sd->swtch;
if (swtch) {
MASK_FUNC_TYPE function_mask = (sd->func >= FUNC_TRAINER ? ((MASK_FUNC_TYPE)1 << (sd->func-FUNC_TRAINER)) : 0);
MASK_FSW_TYPE switch_mask = ((MASK_FSW_TYPE)1 << i);
MASK_CFN_TYPE switch_mask = ((MASK_CFN_TYPE)1 << i);
uint8_t momentary = 0;
#if defined(CPUARM)
uint8_t shrt=0, lng=0;
#define MOMENTARY_START_TEST() ( (momentary && !(activeSwitches & switch_mask) && active) || \
(shortPress && !active && fnSwitchDuration[i]>0 && fnSwitchDuration[i]<CFN_PRESSLONG_DURATION) || \
(longPress && active && fnSwitchDuration[i]>=CFN_PRESSLONG_DURATION) )
uint8_t shortPress=0, longPress=0;
if (swtch > MAX_SWITCH+1+MAX_SWITCH+1+MAX_PSWITCH) {
lng = 1;
longPress = 1;
swtch -= MAX_SWITCH+1+MAX_SWITCH+1+MAX_PSWITCH;
}
else if (swtch > MAX_SWITCH+1+MAX_SWITCH+1) {
shrt = 1;
shortPress = 1;
swtch -= MAX_SWITCH+1+MAX_SWITCH+1;
}
else
#else
#define shortPress 0
#define longPress 0
#define MOMENTARY_START_TEST() (!(activeSwitches & switch_mask) && active)
#endif
if (swtch > MAX_SWITCH+1) {
momentary = 1;
swtch -= MAX_SWITCH+1;
@@ -2098,26 +2134,54 @@ void evalFunctions()
momentary = 1;
swtch += MAX_SWITCH+1;
}
bool active = getSwitch(swtch, 0);
if (active) newActiveSwitches |= switch_mask;
if (momentary || longPress || shortPress) {
#if defined(CPUARM)
bool sw;
if ((sw=getSwitch(swtch, 0)) || (shrt&&fnSwitchDuration[i]>0&&fnSwitchDuration[i]<FSW_PRESSLONG_DURATION) || (lng&&fnSwitchDuration[i]>=(uint8_t)FSW_PRESSLONG_DURATION)) {
if (shrt || lng) {
if (sw) {
bool swState = active;
#endif
if (MOMENTARY_START_TEST()) {
active = !(activeFnSwitches & switch_mask);
#if !defined(CPUARM)
if (sd->func == FUNC_PLAY_BOTH && !active) {
momentary = 1;
}
else
#endif
{
momentary = 0;
}
}
else {
active = (activeFnSwitches & switch_mask);
momentary = 0;
}
#if defined(CPUARM)
if (shortPress || longPress) {
if (swState) {
if (fnSwitchDuration[i] < 255)
fnSwitchDuration[i]++;
newActiveFunctions |= (activeFunctions & function_mask);
continue;
}
else {
fnSwitchDuration[i] = 0;
}
}
#else
if (getSwitch(swtch, 0)) {
#endif
}
#if !defined(CPUARM)
else if (sd->func == FUNC_PLAY_BOTH) {
momentary = 1;
}
#endif
if (active || momentary) {
if (sd->active) {
if (sd->func < FUNC_TRAINER) {
safetyCh[sd->func] = FSW_PARAM(sd);
safetyCh[sd->func] = CFN_PARAM(sd);
}
if (!(activeFunctions & function_mask)) {
@@ -2133,175 +2197,129 @@ void evalFunctions()
}
else if (sd->func <= FUNC_INSTANT_TRIM) {
function_mask = 0;
switch_mask = 0;
}
#if defined(SDCARD)
if (sd->func == FUNC_LOGS) {
logDelay = FSW_PARAM(sd);
logDelay = CFN_PARAM(sd);
}
#endif
if (!(activeFunctionSwitches & switch_mask)) {
if (sd->func == FUNC_RESET) {
switch (FSW_PARAM(sd)) {
case 0:
case 1:
resetTimer(FSW_PARAM(sd));
break;
case 2:
resetAll();
break;
if (sd->func == FUNC_RESET) {
switch (CFN_PARAM(sd)) {
case 0:
case 1:
resetTimer(CFN_PARAM(sd));
break;
case 2:
resetAll();
break;
#if defined(FRSKY)
case 3:
resetTelemetry();
break;
case 3:
resetTelemetry();
break;
#endif
}
}
}
#if defined(CPUARM) && defined(SDCARD)
if ((shrt || lng) && (activeFunctions & function_mask)) {
if (sd->func == FUNC_BACKGND_MUSIC) {
STOP_PLAY(i+1);
}
if (sd->func == FUNC_PLAY_SOUND) {
AUDIO_PLAY(AU_FRSKY_FIRST+CFN_PARAM(sd));
}
else
#endif
if (!COMPLEX_SWITCH || !(activeFunctionSwitches & switch_mask)) {
if (sd->func == FUNC_PLAY_SOUND) {
AUDIO_PLAY(AU_FRSKY_FIRST+FSW_PARAM(sd));
}
#if defined(HAPTIC)
if (sd->func == FUNC_HAPTIC) {
haptic.event(AU_FRSKY_LAST+FSW_PARAM(sd));
}
if (sd->func == FUNC_HAPTIC) {
haptic.event(AU_FRSKY_LAST+CFN_PARAM(sd));
}
#endif
#if defined(CPUARM) && defined(SDCARD)
else if (sd->func == FUNC_PLAY_TRACK || sd->func == FUNC_BACKGND_MUSIC) {
if (IS_PLAYING(i+1)) {
switch_mask = 0;
}
else {
char lfn[] = SOUNDS_PATH "/xxxxxx.wav";
strncpy(lfn+sizeof(SOUNDS_PATH), sd->param, sizeof(sd->param));
lfn[sizeof(SOUNDS_PATH)+sizeof(sd->param)] = '\0';
strcat(lfn+sizeof(SOUNDS_PATH), SOUNDS_EXT);
PLAY_FILE(lfn, sd->func==FUNC_BACKGND_MUSIC ? PLAY_BACKGROUND : 0, i+1);
else if (sd->func == FUNC_PLAY_TRACK || sd->func == FUNC_PLAY_VALUE) {
tmr10ms_t tmr10ms = get_tmr10ms();
uint8_t repeatParam = sd->active;
if (!lastFunctionTime[i] || (repeatParam && (signed)(tmr10ms-lastFunctionTime[i])>=500*repeatParam)) {
if (!IS_PLAYING(i+1)) {
lastFunctionTime[i] = tmr10ms;
if (sd->func == FUNC_PLAY_VALUE) {
PLAY_VALUE(CFN_PARAM(sd), i+1);
}
else {
playCustomFunctionFile(sd, i+1);
}
}
}
else if (sd->func == FUNC_PLAY_VALUE) {
if (IS_PLAYING(i+1)) {
switch_mask = 0;
}
else {
PLAY_VALUE(FSW_PARAM(sd), i+1);
}
}
else if (sd->func == FUNC_VOLUME) {
requiredSpeakerVolume = ((1024 + getValue(FSW_PARAM(sd))) * VOLUME_LEVEL_MAX) / 2048;
}
else if (sd->func == FUNC_BACKGND_MUSIC) {
if (!IS_PLAYING(i+1)) {
playCustomFunctionFile(sd, i+1);
}
}
else if (sd->func == FUNC_VOLUME) {
requiredSpeakerVolume = ((1024 + getValue(CFN_PARAM(sd))) * VOLUME_LEVEL_MAX) / 2048;
}
#elif defined(VOICE)
else if (sd->func == FUNC_PLAY_TRACK) {
if (IS_PLAYING(i+1)) {
switch_mask = 0;
else if (sd->func == FUNC_PLAY_TRACK || sd->func == FUNC_PLAY_BOTH || sd->func == FUNC_PLAY_VALUE) {
tmr10ms_t tmr10ms = get_tmr10ms();
uint8_t repeatParam = sd->active;
if (!lastFunctionTime[i] || (sd->func==FUNC_PLAY_BOTH && active!=(bool)(activeFnSwitches&switch_mask)) || (repeatParam && (signed)(tmr10ms-lastFunctionTime[i])>=(1500<<(repeatParam-1)))) {
lastFunctionTime[i] = tmr10ms;
if (sd->func == FUNC_PLAY_VALUE) {
PLAY_VALUE(CFN_PARAM(sd), i+1);
}
else {
PUSH_CUSTOM_PROMPT(sd->param, i+1);
}
}
else if (sd->func == FUNC_PLAY_VALUE) {
if (IS_PLAYING(i+1)) {
switch_mask = 0;
}
else {
PLAY_VALUE(FSW_PARAM(sd), i+1);
}
}
else if (sd->func == FUNC_PLAY_BOTH) {
if (IS_PLAYING(i+1)) {
switch_mask = 0;
}
else {
PUSH_CUSTOM_PROMPT(FSW_PARAM(sd) + 1, i+1);
PUSH_CUSTOM_PROMPT(active ? sd->param : sd->param+1, i+1);
}
}
}
#endif
#if defined(DEBUG)
else if (sd->func == FUNC_TEST) {
testFunc();
}
else if (sd->func == FUNC_TEST) {
testFunc();
}
#endif
#if defined(GVARS)
else if (sd->func >= FUNC_ADJUST_GV1) {
if (FSW_PARAM(sd) >= MIXSRC_TrimRud-1 && FSW_PARAM(sd) <= MIXSRC_TrimAil-1) {
trimGvar[FSW_PARAM(sd)-MIXSRC_TrimRud+1] = sd->func-FUNC_ADJUST_GV1;
}
else if (sd->func >= FUNC_ADJUST_GV1) {
if (CFN_PARAM(sd) >= MIXSRC_TrimRud-1 && CFN_PARAM(sd) <= MIXSRC_TrimAil-1) {
trimGvar[CFN_PARAM(sd)-MIXSRC_TrimRud+1] = sd->func-FUNC_ADJUST_GV1;
}
#if defined(ROTARY_ENCODERS)
else if (FSW_PARAM(sd) >= MIXSRC_REa-1 && FSW_PARAM(sd) < MIXSRC_TrimRud-1) {
int8_t scroll = rePreviousValues[FSW_PARAM(sd)-MIXSRC_REa+1] - (g_rotenc[FSW_PARAM(sd)-MIXSRC_REa+1] / ROTARY_ENCODER_GRANULARITY);
if (scroll) {
SET_GVAR(sd->func-FUNC_ADJUST_GV1, GVAR_VALUE(sd->func-FUNC_ADJUST_GV1, s_perout_flight_phase) + scroll, s_perout_flight_phase);
}
}
#endif
else {
SET_GVAR(sd->func-FUNC_ADJUST_GV1, limit((int16_t)-1250, getValue(FSW_PARAM(sd)), (int16_t)1250) / 10, s_perout_flight_phase);
else if (CFN_PARAM(sd) >= MIXSRC_REa-1 && CFN_PARAM(sd) < MIXSRC_TrimRud-1) {
int8_t scroll = rePreviousValues[CFN_PARAM(sd)-MIXSRC_REa+1] - (g_rotenc[CFN_PARAM(sd)-MIXSRC_REa+1] / ROTARY_ENCODER_GRANULARITY);
if (scroll) {
SET_GVAR(sd->func-FUNC_ADJUST_GV1, GVAR_VALUE(sd->func-FUNC_ADJUST_GV1, s_perout_flight_phase) + scroll, s_perout_flight_phase);
}
}
#endif
}
if (COMPLEX_SWITCH) {
if (!(activeFunctionSwitches & switch_mask)) {
if (!(activeFunctions & function_mask)) {
newActiveFunctions |= function_mask;
}
}
else {
newActiveFunctions |= (activeFunctions & function_mask);
SET_GVAR(sd->func-FUNC_ADJUST_GV1, limit((int16_t)-1250, getValue(CFN_PARAM(sd)), (int16_t)1250) / 10, s_perout_flight_phase);
}
}
else {
#endif
if (active) {
newActiveFnSwitches |= switch_mask;
newActiveFunctions |= function_mask;
}
activeFunctionSwitches |= switch_mask;
}
else {
lastFunctionTime[i] = 0;
#if defined(CPUARM)
fnSwitchDuration[i] = 0;
#endif
#if defined(CPUARM) && defined(SDCARD)
if (!COMPLEX_SWITCH && sd->func == FUNC_BACKGND_MUSIC) {
if (sd->func == FUNC_BACKGND_MUSIC && isFunctionActive(FUNC_BACKGND_MUSIC)) {
STOP_PLAY(i+1);
}
#elif defined(VOICE)
if (sd->func == FUNC_PLAY_BOTH && (!momentary || (activeFunctionSwitches & switch_mask))) {
if (IS_PLAYING(i+1)) {
switch_mask = 0;
}
else {
PUSH_CUSTOM_PROMPT(FSW_PARAM(sd), i+1);
}
}
#endif
activeFunctionSwitches &= (~switch_mask);
if (COMPLEX_SWITCH)
newActiveFunctions |= (activeFunctions & function_mask);
}
}
}
activeFunctions = newActiveFunctions;
activeSwitches = newActiveSwitches;
activeFnSwitches = newActiveFnSwitches;
activeFunctions = newActiveFunctions;
#if defined(ROTARY_ENCODERS) && defined(GVARS)
for (uint8_t i=0; i<ROTARY_ENCODERS; i++)
+11 -8
View File
@@ -534,6 +534,7 @@ enum BaseCurves {
enum CswFunctions {
CS_OFF,
// TODO add CS_VEQUAL,
CS_VPOS, // v>offset
CS_VNEG, // v<offset
CS_APOS, // |v|>offset
@@ -542,13 +543,14 @@ enum CswFunctions {
CS_OR,
CS_XOR,
CS_EQUAL,
CS_NEQUAL,
CS_NEQUAL, // TODO remove
CS_GREATER,
CS_LESS,
CS_EGREATER,
CS_ELESS,
CS_EGREATER, // TODO remove
CS_ELESS, // TODO remove
CS_DIFFEGREATER,
CS_ADIFFEGREATER,
// TODO add CS_TIMER,
CS_MAXF = CS_ADIFFEGREATER
};
@@ -1111,14 +1113,15 @@ inline bool isMixActive(uint8_t mix)
#endif
#if defined(CPUARM)
#define MASK_FSW_TYPE uint32_t // current max = 32 function switches
#define MASK_CFN_TYPE uint32_t // current max = 32 function switches
#define MASK_FUNC_TYPE uint32_t // current max = 32 functions
#else
#define MASK_FSW_TYPE uint16_t // current max = 16 function switches
#define MASK_CFN_TYPE uint16_t // current max = 16 function switches
#define MASK_FUNC_TYPE uint16_t // current max = 16 functions
#endif
extern MASK_FSW_TYPE activeFunctionSwitches;
extern MASK_CFN_TYPE activeSwitches;
extern MASK_CFN_TYPE activeFnSwitches;
extern MASK_FUNC_TYPE activeFunctions;
inline bool isFunctionActive(uint8_t func)
{
@@ -1126,9 +1129,9 @@ inline bool isFunctionActive(uint8_t func)
}
#if defined(CPUARM)
typedef uint32_t rotenc_t;
typedef int32_t rotenc_t;
#else
typedef uint8_t rotenc_t;
typedef int8_t rotenc_t;
#endif
#if defined(ROTARY_ENCODERS)
+4 -5
View File
@@ -112,13 +112,12 @@ void t_voice::voice_process(void)
PORTA_LCD_DAT = VoiceLatch; // Latch data set
PORTB |= (1 << OUT_B_LIGHT); // Drive high,pullup enabled
DDRB &= ~(1 << OUT_B_LIGHT); // Change to input
#if !defined(SIMU)
// delay to allow input to settle
asm(" rjmp 1f");
asm("1:");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop"); // 4th nop added for Thomas9x (compared to er9x)
#endif
asm(" rjmp 1f");
asm("1:");
busy = PINB & 0x80;
DDRB |= (1 << OUT_B_LIGHT); // Change to output
// The next bit guarantees the backlight output gets clocked out
+1 -1
View File
@@ -132,5 +132,5 @@ inline bool isPlaying()
#define PUSH_CUSTOM_PROMPT(p, ...) pushCustomPrompt((p))
#define PLAY_NUMBER(n, u, a) playNumber((n), (u), (a))
#define PLAY_DURATION(d) playDuration((d))
#define IS_PLAYING(id) isPlaying()
#define IS_PLAYING(id) (0) /* isPlaying() */
#define PLAY_VALUE(v, id) playValue((v))
+11 -11
View File
@@ -133,35 +133,35 @@
#else
#define TR_SDCLOGS "[Logov\200n\204 SD]"
#endif
#define TR_FSW_VOLUME "Hlasitost\0 "
#define TR_FSW_BG_MUSIC "BgHudba\0 ""BgHudba Pauza"
#define TR_CFN_VOLUME "Hlasitost\0 "
#define TR_CFN_BG_MUSIC "BgHudba\0 ""BgHudba Pauza"
#elif defined(PCBGRUVIN9X)
#if defined(SDCARD)
#define TR_SDCLOGS "Logování SD\0 "
#else
#define TR_SDCLOGS "[Logování SD]"
#endif
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#else
#define TR_SDCLOGS
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#endif
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Nastav \0 "
#define TR_CFN_ADJUST_GVAR "Nastav \0 "
#else
#define TR_FSW_ADJUST_GVAR
#define TR_CFN_ADJUST_GVAR
#endif
#ifdef DEBUG
#define TR_FSW_TEST "Test\0 "
#define TR_CFN_TEST "Test\0 "
#else
#define TR_FSW_TEST
#define TR_CFN_TEST
#endif
#define TR_VFSWFUNC "Bezpe\201\0 ""Tren\202r \0 ""Instant Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Podsv\203tlen\204\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define TR_VFSWFUNC "Bezpe\201\0 ""Tren\202r \0 ""Instant Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_CFN_VOLUME "Podsv\203tlen\204\0 " TR_CFN_BG_MUSIC TR_CFN_ADJUST_GVAR TR_CFN_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""V\207e ""Telem."
+11 -11
View File
@@ -125,33 +125,33 @@
#else
#define TR_SDCLOGS "[SD Aufz.]\0 "
#endif
#define TR_FSW_VOLUME "Lautst\201rke\0 "
#define TR_FSW_BG_MUSIC "Musik Start\0 ""Musik Pause\0 "
#define TR_CFN_VOLUME "Lautst\201rke\0 "
#define TR_CFN_BG_MUSIC "Musik Start\0 ""Musik Pause\0 "
#elif defined(PCBGRUVIN9X)
#if defined(SDCARD)
#define TR_SDCLOGS "SD Aufz.\0 "
#else
#define TR_SDCLOGS "[SD Aufz.]\0 "
#endif
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#else
#define TR_SDCLOGS
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#endif
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "\200ndere \0 "
#define TR_CFN_ADJUST_GVAR "\200ndere \0 "
#else
#define TR_FSW_ADJUST_GVAR
#define TR_CFN_ADJUST_GVAR
#endif
#ifdef DEBUG
#define TR_FSW_TEST "Test\0 "
#define TR_CFN_TEST "Test\0 "
#else
#define TR_FSW_TEST
#define TR_CFN_TEST
#endif
#define TR_VFSWFUNC "Sicher\0 ""Lehrsch.\0 ""Instant. Trim" TR_SOUND TR_HAPTIC "R\205cksetz.\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Beleuchtung\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define TR_VFSWFUNC "Sicher\0 ""Lehrsch.\0 ""Instant. Trim" TR_SOUND TR_HAPTIC "R\205cksetz.\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_CFN_VOLUME "Beleuchtung\0 " TR_CFN_BG_MUSIC TR_CFN_ADJUST_GVAR TR_CFN_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "S.Uhr1""S.Uhr2""Alle ""Telem."
+25 -28
View File
@@ -120,50 +120,47 @@
#endif
#if defined(VOICE)
#define TR_PLAY_TRACK "Play Track\0"
#define TR_PLAY_BOTH "Play Both\0 "
#define TR_PLAY_VALUE "Play Value\0"
#if defined(PCBSKY9X)
#define TR_PLAY_TRACK "Play\0 "
#else
#define TR_PLAY_TRACK "Play Track\0"
#endif
#define TR_PLAY_BOTH "Play Bth\0 "
#define TR_PLAY_VALUE "Play Val\0 "
#else
#define TR_PLAY_TRACK "[PlayTrack]"
#define TR_PLAY_BOTH "[Play Both]" // TODO could be avoided
#define TR_PLAY_BOTH "[Play Both]"
#define TR_PLAY_VALUE "[PlayValue]"
#endif
#if defined(CPUARM)
#if defined(SDCARD)
#define TR_SDCLOGS "SD Logs\0 "
#else
#define TR_SDCLOGS "[SD Logs]\0 "
#endif
#define TR_FSW_VOLUME "Volume\0 "
#define TR_FSW_BG_MUSIC "BgMusic\0 ""BgMusic ||\0"
#elif defined(PCBGRUVIN9X)
#if defined(SDCARD)
#define TR_SDCLOGS "SD Logs\0 "
#else
#define TR_SDCLOGS "[SD Logs]\0 "
#endif
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME "Volume\0 "
#define TR_CFN_BG_MUSIC "BgMusic\0 ""BgMusic ||\0"
#if defined(SDCARD)
#define TR_SDCLOGS "SD Logs\0 "
#else
#define TR_SDCLOGS
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_SDCLOGS "[SD Logs]\0 "
#endif
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Adjust \0 "
#define TR_CFN_ADJUST_GVAR "Adjust \0 "
#else
#define TR_FSW_ADJUST_GVAR
#define TR_CFN_ADJUST_GVAR
#endif
#ifdef DEBUG
#define TR_FSW_TEST "Test\0"
#define TR_CFN_TEST "Test\0"
#else
#define TR_FSW_TEST
#define TR_CFN_TEST
#endif
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Inst. Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Backlight\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#if defined(CPUARM)
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Inst. Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_CFN_VOLUME "Backlight\0 " TR_CFN_BG_MUSIC TR_CFN_ADJUST_GVAR TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Inst. Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_SDCLOGS "Backlight\0 " TR_CFN_ADJUST_GVAR TR_CFN_TEST
#else
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Inst. Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE "Backlight\0 " TR_CFN_ADJUST_GVAR TR_CFN_TEST
#endif
#define LEN_VFSWRESET TR("\006","\012")
#define TR_VFSWRESET "Timer 1 ""Timer 2 ""All ""Telemetry"
+11 -11
View File
@@ -134,35 +134,35 @@
#else
#define TR_SDCLOGS "[SD Logs]\0 "
#endif
#define TR_FSW_VOLUME "Volumen\0 "
#define TR_FSW_BG_MUSIC "BgMusica\0 ""BgMusica||\0"
#define TR_CFN_VOLUME "Volumen\0 "
#define TR_CFN_BG_MUSIC "BgMusica\0 ""BgMusica||\0"
#elif defined(PCBGRUVIN9X)
#if defined(SDCARD)
#define TR_SDCLOGS "SD Logs\0 "
#else
#define TR_SDCLOGS "[SD Logs]\0 "
#endif
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#else
#define TR_SDCLOGS
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#endif
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Ajuste \0 "
#define TR_CFN_ADJUST_GVAR "Ajuste \0 "
#else
#define TR_FSW_ADJUST_GVAR
#define TR_CFN_ADJUST_GVAR
#endif
#ifdef DEBUG
#define TR_FSW_TEST "Test\0"
#define TR_CFN_TEST "Test\0"
#else
#define TR_FSW_TEST
#define TR_CFN_TEST
#endif
#define TR_VFSWFUNC "Seguro\0 ""Aprendiz\0 ""Inst. Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Panel luz\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define TR_VFSWFUNC "Seguro\0 ""Aprendiz\0 ""Inst. Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_CFN_VOLUME "Panel luz\0 " TR_CFN_BG_MUSIC TR_CFN_ADJUST_GVAR TR_CFN_TEST
#define LEN_VFSWRESET TR("\006","\012")
#define TR_VFSWRESET "Reloj 1 ""Reloj 2 ""Todo ""Telemetr."
+11 -11
View File
@@ -125,33 +125,33 @@
#else
#define TR_SDCLOGS "[Logs SD]\0 "
#endif
#define TR_FSW_VOLUME "Volume\0 "
#define TR_FSW_BG_MUSIC "Musique\0 ""Pause Musique"
#define TR_CFN_VOLUME "Volume\0 "
#define TR_CFN_BG_MUSIC "Musique\0 ""Pause Musique"
#elif defined(PCBGRUVIN9X)
#if defined(SDCARD)
#define TR_SDCLOGS "Logs carte SD"
#else
#define TR_SDCLOGS "[Logs SD]\0 "
#endif
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#else
#define TR_SDCLOGS
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#endif
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Ajuster\0 "
#define TR_CFN_ADJUST_GVAR "Ajuster\0 "
#else
#define TR_FSW_ADJUST_GVAR
#define TR_CFN_ADJUST_GVAR
#endif
#ifdef DEBUG
#define TR_FSW_TEST "Test\0 "
#define TR_CFN_TEST "Test\0 "
#else
#define TR_FSW_TEST
#define TR_CFN_TEST
#endif
#define TR_VFSWFUNC "S\200cur.\0 ""Ecolage \0 ""Trim instant." TR_SOUND TR_HAPTIC "Remise \202 0\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "R\200tro\200cl.\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define TR_VFSWFUNC "S\200cur.\0 ""Ecolage \0 ""Trim instant." TR_SOUND TR_HAPTIC "Remise \202 0\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_CFN_VOLUME "R\200tro\200cl.\0 " TR_CFN_BG_MUSIC TR_CFN_ADJUST_GVAR TR_CFN_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""Timers""T\200l\200m."
+11 -11
View File
@@ -124,32 +124,32 @@
#else
#define TR_SDCLOGS "[SDCARD Logs]"
#endif
#define TR_FSW_VOLUME "Volume\0 "
#define TR_FSW_BG_MUSIC "BgMusic\0 ""BgMusic Pause"
#define TR_CFN_VOLUME "Volume\0 "
#define TR_CFN_BG_MUSIC "BgMusic\0 ""BgMusic Pause"
#elif defined(PCBGRUVIN9X)
#if defined(SDCARD)
#define TR_SDCLOGS "SDCARD Logs"
#else
#define TR_SDCLOGS "[SDCARD Logs]"
#endif
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#else
#define TR_SDCLOGS
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#endif
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Adjust \0 "
#define TR_CFN_ADJUST_GVAR "Adjust \0 "
#else
#define TR_FSW_ADJUST_GVAR
#define TR_CFN_ADJUST_GVAR
#endif
#ifdef DEBUG
#define TR_FSW_TEST "Test\0 "
#define TR_CFN_TEST "Test\0 "
#else
#define TR_FSW_TEST
#define TR_CFN_TEST
#endif
#define TR_VFSWFUNC "Blocco\0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Retroillum.\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define TR_VFSWFUNC "Blocco\0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_CFN_VOLUME "Retroillum.\0 " TR_CFN_BG_MUSIC TR_CFN_ADJUST_GVAR TR_CFN_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""Tutto ""Telem."
+11 -11
View File
@@ -125,33 +125,33 @@
#else
#define TR_SDCLOGS "[SDCARD Logs]"
#endif
#define TR_FSW_VOLUME "Volume\0 "
#define TR_FSW_BG_MUSIC "BgMusic\0 ""BgMusic ||\0 "
#define TR_CFN_VOLUME "Volume\0 "
#define TR_CFN_BG_MUSIC "BgMusic\0 ""BgMusic ||\0 "
#elif defined(PCBGRUVIN9X)
#if defined(SDCARD)
#define TR_SDCLOGS "SDCARD Logs\0 "
#else
#define TR_SDCLOGS "[SDCARD Logs]"
#endif
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#else
#define TR_SDCLOGS
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#endif
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Ajuste\0 "
#define TR_CFN_ADJUST_GVAR "Ajuste\0 "
#else
#define TR_FSW_ADJUST_GVAR
#define TR_CFN_ADJUST_GVAR
#endif
#ifdef DEBUG
#define TR_FSW_TEST "Teste\0 "
#define TR_CFN_TEST "Teste\0 "
#else
#define TR_FSW_TEST
#define TR_CFN_TEST
#endif
#define TR_VFSWFUNC "Seguro\0 ""Aprendiz\0 ""Ajuste Rapido" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Backlight\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define TR_VFSWFUNC "Seguro\0 ""Aprendiz\0 ""Ajuste Rapido" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_CFN_VOLUME "Backlight\0 " TR_CFN_BG_MUSIC TR_CFN_ADJUST_GVAR TR_CFN_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Tempo1""Tempo2""Todo ""Telem."
+11 -11
View File
@@ -133,35 +133,35 @@
#else
#define TR_SDCLOGS "[SDCARD Logg]"
#endif
#define TR_FSW_VOLUME "Volym\0 "
#define TR_FSW_BG_MUSIC "BgMusik\0 ""BgMusik ||\0"
#define TR_CFN_VOLUME "Volym\0 "
#define TR_CFN_BG_MUSIC "BgMusik\0 ""BgMusik ||\0"
#elif defined(PCBGRUVIN9X)
#if defined(SDCARD)
#define TR_SDCLOGS "SDCARD Loggar"
#else
#define TR_SDCLOGS "[SDCARD Logg]"
#endif
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#else
#define TR_SDCLOGS
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#define TR_CFN_VOLUME
#define TR_CFN_BG_MUSIC
#endif
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Justera\0 "
#define TR_CFN_ADJUST_GVAR "Justera\0 "
#else
#define TR_FSW_ADJUST_GVAR
#define TR_CFN_ADJUST_GVAR
#endif
#ifdef DEBUG
#define TR_FSW_TEST "Test\0"
#define TR_CFN_TEST "Test\0"
#else
#define TR_FSW_TEST
#define TR_CFN_TEST
#endif
#define TR_VFSWFUNC "S\201kra\0 ""Trainer \0 ""S\201tt Trim\0 " TR_SOUND TR_HAPTIC "Nollst\201ll\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Belysning\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define TR_VFSWFUNC "S\201kra\0 ""Trainer \0 ""S\201tt Trim\0 " TR_SOUND TR_HAPTIC "Nollst\201ll\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_CFN_VOLUME "Belysning\0 " TR_CFN_BG_MUSIC TR_CFN_ADJUST_GVAR TR_CFN_TEST
#define LEN_VFSWRESET TR("\006","\012")
#define TR_VFSWRESET "Timer1 ""Timer2 ""Allt ""Telemetri"