Merge branch 'next' of https://github.com/opentx/opentx into bsongis/vario_improvements

Conflicts:
	radio/src/audio_arm.cpp
This commit is contained in:
Andre Bernet
2014-02-25 19:02:36 +01:00
241 changed files with 6655 additions and 7360 deletions
+250 -114
View File
@@ -51,6 +51,9 @@ int24_t act [MAX_MIXERS] = {0};
SwOn swOn [MAX_MIXERS]; // TODO better name later...
uint8_t mixWarning;
#if defined(MODULE_ALWAYS_SEND_PULSES)
uint8_t startupWarningState;
#endif
#if defined(CPUARM)
#define MENUS_STACK_SIZE 2000
@@ -1247,9 +1250,11 @@ getvalue_t getValue(uint8_t i)
else if (i==MIXSRC_SH) return (switchState(SW_SH0) ? -1024 : 1024);
else if (i<=MIXSRC_LAST_CSW) return getSwitch(SWSRC_FIRST_CSW+i-MIXSRC_FIRST_CSW) ? 1024 : -1024;
#else
else if (i==MIXSRC_3POS) return (switchState(SW_ID0) ? -1024 : (switchState(SW_ID1) ? 0 : 1024));
else if (i==MIXSRC_3POS) return (getSwitch(SW_ID0-SW_BASE+1) ? -1024 : (getSwitch(SW_ID1-SW_BASE+1) ? 0 : 1024));
// don't use switchState directly to give getSwitch possibility to hack values if needed for switch warning
#if defined(EXTRA_3POS)
else if (i==MIXSRC_3POS2) return (switchState(SW_ID3) ? -1024 : (switchState(SW_ID4) ? 0 : 1024));
else if (i==MIXSRC_3POS2) return (getSwitch(SW_ID3-SW_BASE+1) ? -1024 : (getSwitch(SW_ID4-SW_BASE+1) ? 0 : 1024));
// don't use switchState directly to give getSwitch possibility to hack values if needed for switch warning
#endif
else if (i<=MIXSRC_LAST_CSW) return getSwitch(SWSRC_THR+i-MIXSRC_THR) ? 1024 : -1024;
#endif
@@ -1309,7 +1314,6 @@ getvalue_t getValue(uint8_t i)
volatile GETSWITCH_RECURSIVE_TYPE s_last_switch_used = 0;
volatile GETSWITCH_RECURSIVE_TYPE s_last_switch_value = 0;
/* recursive function. stack as of today (16/03/2012) grows by 8bytes at each call, which is ok! */
#if defined(CPUARM)
uint32_t cswDelays[NUM_CSW];
@@ -1322,27 +1326,66 @@ tmr10ms_t switchesMidposStart[6] = { 0 };
uint32_t switchesPos = 0;
tmr10ms_t potsLastposStart[NUM_XPOTS];
uint8_t potsPos[NUM_XPOTS];
uint32_t check2PosSwitchPosition(EnumKeys sw)
{
uint32_t result;
uint32_t index;
if (switchState(sw))
index = sw - SW_SA0;
else
index = sw - SW_SA0 + 1;
result = (1 << index);
if (!(switchesPos & result)) {
PLAY_SWITCH_MOVED(index);
}
return result;
}
#define DELAY_SWITCH_3POS 10/*100ms*/
#define CHECK_2POS(sw) newPos |= (switchState(sw ## 0) ? (1 << (sw ## 0 - SW_SA0)) : (1 << (sw ## 0 - SW_SA0 + 1)))
#define CHECK_3POS(idx, sw) if (switchState(sw ## 0)) { \
newPos |= (1 << (sw ## 0 - SW_SA0)); \
switchesMidposStart[idx] = 0; \
} \
else if (switchState(sw ## 2)) { \
newPos |= (1 << (sw ## 0 - SW_SA0 + 2)); \
switchesMidposStart[idx] = 0; \
} \
else if ((switchesPos & (1 << (sw ## 0 - SW_SA0 + 1))) || (switchesMidposStart[idx] && (tmr10ms_t)(get_tmr10ms() - switchesMidposStart[idx]) > DELAY_SWITCH_3POS)) { \
newPos |= (1 << (sw ## 0 - SW_SA0 + 1)); \
switchesMidposStart[idx] = 0; \
} \
else { \
if (!switchesMidposStart[idx]) { \
switchesMidposStart[idx] = get_tmr10ms(); \
} \
newPos |= (switchesPos & (0x7 << (sw ## 0 - SW_SA0))); \
}
void getSwitchesPosition()
uint32_t check3PosSwitchPosition(uint8_t idx, EnumKeys sw, bool startup)
{
uint32_t result;
uint32_t index;
if (switchState(sw)) {
index = sw - SW_SA0;
result = (1 << index);
switchesMidposStart[idx] = 0;
}
else if (switchState(EnumKeys(sw+2))) {
index = sw - SW_SA0 + 2;
result = (1 << index);
switchesMidposStart[idx] = 0;
}
else if (startup || (switchesPos & (1 << (sw - SW_SA0 + 1))) || (switchesMidposStart[idx] && (tmr10ms_t)(get_tmr10ms() - switchesMidposStart[idx]) > DELAY_SWITCH_3POS)) {
index = sw - SW_SA0 + 1;
result = (1 << index);
switchesMidposStart[idx] = 0;
}
else {
index = sw - SW_SA0 + 1;
if (!switchesMidposStart[idx]) {
switchesMidposStart[idx] = get_tmr10ms();
}
result = (switchesPos & (0x7 << (sw - SW_SA0)));
}
if (!(switchesPos & result)) {
PLAY_SWITCH_MOVED(index);
}
return result;
}
#define CHECK_2POS(sw) newPos |= check2PosSwitchPosition(sw ## 0)
#define CHECK_3POS(idx, sw) newPos |= check3PosSwitchPosition(idx, sw ## 0, startup)
void getSwitchesPosition(bool startup)
{
uint32_t newPos = 0;
CHECK_3POS(0, SW_SA);
@@ -1361,13 +1404,17 @@ void getSwitchesPosition()
if (calib->count>0 && calib->count<POTS_POS_COUNT) {
uint8_t pos = anaIn(POT1+i) / (2*RESX/calib->count);
uint8_t previousPos = potsPos[i] >> 4;
uint8_t previousStoredPos = potsPos[i] & 0x0F;
if (pos != previousPos) {
potsLastposStart[i] = get_tmr10ms();
potsPos[i] = (pos << 4) | (potsPos[i] & 0x0f);
potsPos[i] = (pos << 4) | previousStoredPos;
}
else if ((tmr10ms_t)(get_tmr10ms() - potsLastposStart[i]) > DELAY_SWITCH_3POS) {
else if (startup || (tmr10ms_t)(get_tmr10ms() - potsLastposStart[i]) > DELAY_SWITCH_3POS) {
potsLastposStart[i] = 0;
potsPos[i] = (pos << 4) | (pos);
potsPos[i] = (pos << 4) | pos;
if (previousStoredPos != pos) {
PLAY_SWITCH_MOVED(SWSRC_LAST_SWITCH+i*POTS_POS_COUNT+pos);
}
}
}
}
@@ -1376,12 +1423,14 @@ void getSwitchesPosition()
#define SWITCH_POSITION(sw) (switchesPos & (1<<(sw)))
#define POT_POSITION(sw) ((potsPos[(sw)/POTS_POS_COUNT] & 0x0f) == ((sw) % POTS_POS_COUNT))
#else
#define getSwitchesPosition()
#define getSwitchesPosition(...)
#define SWITCH_POSITION(idx) switchState((EnumKeys)(SW_BASE+(idx)))
#endif
int16_t csLastValue[NUM_CSW];
#define CS_LAST_VALUE_INIT -32768
/* recursive function. stack as of today (16/03/2012) grows by 8bytes at each call, which is ok! */
bool getSwitch(int8_t swtch)
{
bool result;
@@ -1396,6 +1445,20 @@ bool getSwitch(int8_t swtch)
}
else if (cs_idx <= SWSRC_LAST_SWITCH) {
result = SWITCH_POSITION(cs_idx-SWSRC_FIRST_SWITCH);
#if defined(MODULE_ALWAYS_SEND_PULSES)
if (startupWarningState < STARTUP_WARNING_DONE) {
// if throttle or switch warning is currently active, ignore actual stick position and use wanted values
if (cs_idx <= 3) {
if (!(g_model.nSwToWarn&1)) { // ID1 to ID3 is just one bit in nSwToWarn
result = (cs_idx)==((g_model.switchWarningStates&3)+1); // overwrite result with desired value
}
}
else if (!(g_model.nSwToWarn & (1<<(cs_idx-3)))) {
// current switch should not be ignored for warning
result = g_model.switchWarningStates & (1<<(cs_idx-2)); // overwrite result with desired value
}
}
#endif
}
#if defined(PCBTARANIS)
else if (cs_idx <= SWSRC_P26) {
@@ -1587,10 +1650,14 @@ bool getSwitch(int8_t swtch)
}
#endif
if (result)
if (result) {
if (!(s_last_switch_value&mask)) PLAY_LOGICAL_SWITCH_ON(cs_idx);
s_last_switch_value |= mask;
else
}
else {
if (s_last_switch_value&mask) PLAY_LOGICAL_SWITCH_OFF(cs_idx);
s_last_switch_value &= ~mask;
}
}
}
@@ -1621,26 +1688,23 @@ int8_t getMovedSwitch()
}
}
#else
for (uint8_t i=NUM_PSWITCH; i>0; i--) {
// return delivers 1 to 3 for ID1 to ID3
// 4..8 for all other switches if changed to true
// -4..-8 for all other switches if changed to false
// 9 for Trainer switch if changed to true; Change to false is ignored
swstate_t mask = 0x80;
for (uint8_t i=NUM_PSWITCH; i>1; i--) {
bool prev;
swstate_t mask = 0;
if (i <= 3) {
prev = ((switches_states & 0x03) == (i-1));
}
else {
mask = (1<<(i-2));
prev = (switches_states & mask);
}
bool next = getSwitch(i);
prev = (switches_states & mask);
// don't use getSwitch here to always get the proper value, even getSwitch manipulates
bool next = switchState((EnumKeys)(SW_BASE+i-1));
if (prev != next) {
if (i!=NUM_PSWITCH || next==true)
if (((i<NUM_PSWITCH) && (i>3)) || next==true)
result = next ? i : -i;
if (mask)
switches_states ^= mask;
else {
switches_states = (switches_states & 0xFC) | (i-1);
}
if (i<=3 && result==0) result = 1;
switches_states ^= mask;
}
mask >>= 1;
}
#endif
@@ -2237,8 +2301,12 @@ void checkAll()
checkLowEEPROM();
#endif
#if defined(MODULE_ALWAYS_SEND_PULSES)
startupWarningState = STARTUP_WARNING_THROTTLE;
#else
checkTHR();
checkSwitches();
#endif
#if defined(PCBTARANIS)
if (modelHasNotes() && g_model.displayText) {
@@ -2250,8 +2318,22 @@ void checkAll()
#endif
clearKeyEvents();
SKIP_AUTOMATIC_PROMPTS();
}
#if defined(MODULE_ALWAYS_SEND_PULSES)
void checkStartupWarnings()
{
if (startupWarningState < STARTUP_WARNING_DONE) {
if (startupWarningState == STARTUP_WARNING_THROTTLE)
checkTHR();
else
checkSwitches();
}
}
#endif
#if !defined(PCBSKY9X)
void checkLowEEPROM()
{
@@ -2264,105 +2346,136 @@ void checkLowEEPROM()
void checkTHR()
{
if (g_model.disableThrottleWarning) return;
uint8_t thrchn = ((g_model.thrTraceSrc==0) || (g_model.thrTraceSrc>NUM_POTS)) ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1;
// throttle channel is either the stick according stick mode (already handled in evalInputs)
// or P1 to P3;
// in case an output channel is choosen as throttle source (thrTraceSrc>NUM_POTS) we assume the throttle stick is the input
// no other information available at the moment, and good enough to my option (otherwise too much exceptions...)
uint8_t thrchn = (2-(stickMode&1)); //stickMode=0123 -> thr=2121
#ifdef SIMU
int16_t lowLim = THRCHK_DEADBAND - 1024 ;
#else
getADC(); // if thr is down - do not display warning at all
CalibData * calib = &g_eeGeneral.calib[thrchn];
int16_t lowLim = calib->mid;
lowLim = (g_model.throttleReversed ? - lowLim - calib->spanPos : lowLim - calib->spanNeg);
lowLim += THRCHK_DEADBAND;
#endif
int16_t v = thrAnaIn(thrchn);
if (v<=lowLim) return;
// first - display warning
MESSAGE(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_THROTTLE_ALERT);
while (1)
{
SIMU_SLEEP(1);
getADC();
int16_t v = thrAnaIn(thrchn);
if (pwrCheck()==e_power_off || keyDown() || v<=lowLim)
break;
checkBacklight();
wdt_reset();
#if defined(MODULE_ALWAYS_SEND_PULSES)
int16_t v = calibratedStick[thrchn];
if (v<=THRCHK_DEADBAND-1024 || g_model.disableThrottleWarning || pwrCheck()==e_power_off || keyDown()) {
startupWarningState = STARTUP_WARNING_THROTTLE+1;
}
else {
calibratedStick[thrchn] = -1024;
#if !defined(PCBTARANIS)
rawAnas[thrchn] = anas[thrchn] = calibratedStick[thrchn];
#endif
MESSAGE(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_THROTTLE_ALERT);
}
#else
if (g_model.disableThrottleWarning) return;
getADC();
evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job
int16_t v = calibratedStick[thrchn];
if (v<=(THRCHK_DEADBAND-1024)) return; // prevent warning if throttle input OK
// first - display warning; also deletes inputs if any have been before
MESSAGE(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_THROTTLE_ALERT);
while (1) {
SIMU_SLEEP(1);
getADC();
evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job
v = calibratedStick[thrchn];
if (pwrCheck()==e_power_off || keyDown() || v<=(THRCHK_DEADBAND-1024))
break;
checkBacklight();
wdt_reset();
}
#endif
}
void checkAlarm() // added by Gohst
{
if (g_eeGeneral.disableAlarmWarning) return;
if (IS_SOUND_OFF()) ALERT(STR_ALARMSWARN, STR_ALARMSDISABLED, AU_ERROR);
if (g_eeGeneral.disableAlarmWarning)
return;
if (IS_SOUND_OFF())
ALERT(STR_ALARMSWARN, STR_ALARMSDISABLED, AU_ERROR);
}
void checkSwitches()
{
#if defined(MODULE_ALWAYS_SEND_PULSES)
static swstate_t last_bad_switches = 0xff;
#else
swstate_t last_bad_switches = 0xff;
#endif
swstate_t states = g_model.switchWarningStates;
#if defined(PCBTARANIS)
uint8_t bad_pots = 0, last_bad_pots = 0xff;
#endif
#if !defined(MODULE_ALWAYS_SEND_PULSES)
while (1) {
#if defined(TELEMETRY_MOD_14051) || defined(PCBTARANIS)
getADC();
#endif
#endif // !defined(MODULE_ALWAYS_SEND_PULSES)
getMovedSwitch();
uint8_t warn = false;
bool warn = false;
#if defined(PCBTARANIS)
for (uint8_t i=0; i<NUM_SWITCHES-1; i++) {
if (!(g_model.nSwToWarn & (1<<i))) {
swstate_t mask = (0x03 << (i*2));
if(!((states & mask) == (switches_states & mask)))
if (!((states & mask) == (switches_states & mask))) {
warn = true;
}
}
}
uint8_t potMode = g_model.nPotsToWarn >> 6;
if(potMode) {
if (potMode) {
perOut(e_perout_mode_normal, 0);
bad_pots = 0;
for (uint8_t i=0; i<NUM_POTS; i++)
if(!(g_model.nPotsToWarn & (1 << i)) && (abs(g_model.potPosition[i] - (getValue(MIXSRC_FIRST_POT+i) >> 3)) > 2)) {
warn = true;
bad_pots |= (1<<i);
}
for (uint8_t i=0; i<NUM_POTS; i++) {
if (!(g_model.nPotsToWarn & (1 << i)) && (abs(g_model.potPosition[i] - (getValue(MIXSRC_FIRST_POT+i) >> 3)) > 2)) {
warn = true;
bad_pots |= (1<<i);
}
}
}
#else
for (uint8_t i=0; i<NUM_SWITCHES-1; i++) {
if (!(g_model.nSwToWarn & (1<<i))) {
if (i == 0) {
if((states & 0x03) != (switches_states & 0x03))
warn = true;
}
else if((states & (1<<(i+1))) != (switches_states & (1<<(i+1))))
warn = true;
if ((states & 0x03) != (switches_states & 0x03)) {
warn = true;
}
}
else if ((states & (1<<(i+1))) != (switches_states & (1<<(i+1)))) {
warn = true;
}
}
}
#endif
if(!warn) return;
if (!warn) {
#if defined(MODULE_ALWAYS_SEND_PULSES)
startupWarningState = STARTUP_WARNING_SWITCHES+1;
last_bad_switches = 0xff;
#endif
return;
}
// first - display warning
#if defined(PCBTARANIS)
if ((last_bad_switches != switches_states) || (last_bad_pots != bad_pots)) {
MESSAGE(STR_SWITCHWARN, NULL, STR_PRESSANYKEYTOSKIP, ((last_bad_switches == 0xff) || (last_bad_pots == 0xff)) ? AU_SWITCH_ALERT : AU_NONE);
for (uint8_t i=0; i<NUM_SWITCHES-1; i++) {
if(!(g_model.nSwToWarn & (1<<i))) {
if (!(g_model.nSwToWarn & (1<<i))) {
swstate_t mask = (0x03 << (i*2));
uint8_t attr = ((states & mask) == (switches_states & mask)) ? 0 : INVERS;
char c = "\300-\301"[(states & mask) >> (i*2)];
@@ -2370,7 +2483,7 @@ void checkSwitches()
lcd_putcAtt(60+i*(2*FW+FW/2)+FW, 4*FH+3, c, attr);
}
}
if(potMode) {
if (potMode) {
for (uint8_t i=0; i<NUM_POTS; i++) {
if (!(g_model.nPotsToWarn & (1 << i))) {
uint8_t flags = 0;
@@ -2380,8 +2493,8 @@ void checkSwitches()
case 1:
lcd_putc(60+i*(5*FW)+2*FW+2, 6*FH-2, g_model.potPosition[i] > (getValue(MIXSRC_FIRST_POT+i) >> 3) ? 126 : 127);
break;
case 2:
case 3:
case 2:
case 3:
lcd_putc(60+i*(5*FW)+2*FW+2, 6*FH-2, g_model.potPosition[i] > (getValue(MIXSRC_FIRST_POT+i) >> 3) ? '\300' : '\301');
break;
}
@@ -2399,11 +2512,11 @@ void checkSwitches()
for (uint8_t i=0; i<NUM_SWITCHES-1; i++) {
uint8_t attr;
if (i == 0)
attr = ((states & 0x03) != (switches_states & 0x03)) ? INVERS : 0;
attr = ((states & 0x03) != (switches_states & 0x03)) ? INVERS : 0;
else
attr = (states & (1 << (i+1))) == (switches_states & (1 << (i+1))) ? 0 : INVERS;
if(!(g_model.nSwToWarn & (1<<i)))
putsSwitches(x, 5*FH, (i>0?(i+3):(states&0x3)+1), attr);
attr = (states & (1 << (i+1))) == (switches_states & (1 << (i+1))) ? 0 : INVERS;
if (!(g_model.nSwToWarn & (1<<i)))
putsSwitches(x, 5*FH, (i>0?(i+3):(states&0x3)+1), attr);
x += 3*FW+FW/2;
}
#endif
@@ -2411,7 +2524,13 @@ void checkSwitches()
last_bad_switches = switches_states;
}
if (pwrCheck()==e_power_off || keyDown()) return; // Usb on or power off
#if defined(MODULE_ALWAYS_SEND_PULSES)
if (pwrCheck()==e_power_off || keyDown()) {
startupWarningState = STARTUP_WARNING_SWITCHES+1;
last_bad_switches = 0xff;
}
#else
if (pwrCheck()==e_power_off || keyDown()) return;
checkBacklight();
@@ -2419,6 +2538,7 @@ void checkSwitches()
SIMU_SLEEP(1);
}
#endif
}
void alert(const pm_char * t, const pm_char *s MESSAGE_SOUND_ARG)
@@ -2640,12 +2760,6 @@ uint16_t BandGap = 2040 ;
uint16_t BandGap ;
#endif
int16_t thrAnaIn(uint8_t chan)
{
int16_t v = anaIn(chan);
return (g_model.throttleReversed) ? -v : v;
}
#if !defined(SIMU)
uint16_t anaIn(uint8_t chan)
{
@@ -2861,11 +2975,14 @@ void resetAll()
#if defined(FRSKY)
resetTelemetry();
#endif
for (uint8_t i=0; i<NUM_CSW; i++)
for (uint8_t i=0; i<NUM_CSW; i++) {
csLastValue[i] = CS_LAST_VALUE_INIT;
}
s_last_switch_value = 0;
SKIP_AUTOMATIC_PROMPTS();
RESET_THR_TRACE();
}
@@ -3503,6 +3620,10 @@ void perOut(uint8_t mode, uint8_t tick10ms)
{
evalInputs(mode);
#if defined(MODULE_ALWAYS_SEND_PULSES)
checkStartupWarnings();
#endif
#if defined(HELI)
if (g_model.swashR.value) {
uint32_t v = ((int32_t)anas[ELE_STICK]*anas[ELE_STICK] + (int32_t)anas[AIL_STICK]*anas[AIL_STICK]);
@@ -3859,17 +3980,25 @@ void doMixerCalculations()
PORTH |= 0x40; // PORTH:6 LOW->HIGH signals start of mixer interrupt
#endif
static tmr10ms_t lastTMR;
static tmr10ms_t lastTMR = 0;
tmr10ms_t tmr10ms = get_tmr10ms();
uint8_t tick10ms = (tmr10ms >= lastTMR ? tmr10ms - lastTMR : 1); // handle tick10ms overrun
//@@@ open.20.fsguruh: correct overflow handling costs a lot of code; happens only each 11 min;
uint8_t tick10ms = (tmr10ms >= lastTMR ? tmr10ms - lastTMR : 1);
// handle tick10ms overrun
// correct overflow handling costs a lot of code; happens only each 11 min;
// therefore forget the exact calculation and use only 1 instead; good compromise
#if !defined(CPUARM)
lastTMR = tmr10ms;
#endif
getADC();
getSwitchesPosition();
getSwitchesPosition(lastTMR == 0);
#if defined(CPUARM)
lastTMR = tmr10ms;
#endif
#if defined(PCBSKY9X) && !defined(REVA) && !defined(SIMU)
Current_analogue = (Current_analogue*31 + s_anaFilt[8] ) >> 5 ;
@@ -4483,6 +4612,13 @@ void perMain()
}
#endif
#if defined(MODULE_ALWAYS_SEND_PULSES)
if (startupWarningState < STARTUP_WARNING_DONE) {
// don't do menu's until throttle and switch warnings are handled
return;
}
#endif
if (!usbPlugged()) {
// TODO merge these 2 branches
#if defined(PCBSKY9X)