From f9d3e11956031b2722b69af8dfaf2f70b99a147a Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 20 Jan 2012 18:15:29 +0000 Subject: [PATCH] Some 1400bytes flash saved! --- src/open9x.cpp | 366 +++++++++++++++++++++++++------------------------ 1 file changed, 184 insertions(+), 182 deletions(-) diff --git a/src/open9x.cpp b/src/open9x.cpp index ee78d4be9..72189dcd0 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -926,163 +926,15 @@ void resetTimer(uint8_t idx) s_timerVal_10ms[idx] = 0 ; } -FORCEINLINE void incTimers(int16_t val) -{ - static uint8_t lastSwPos[2] = {0, 0}; - static uint16_t s_cnt[2] = {0, 0}; - static uint16_t s_sum[2] = {0, 0}; - static uint8_t sw_toggled[2] = {false, false}; - static uint16_t s_time_cum_16[2] = {0, 0}; - - TimerData *timer = &g_model.timer1; - - for (uint8_t i=0; i<2; i++, timer=&g_model.timer2) { - int8_t tm = timer->mode; - - if (!tm) - continue; - - if (s_timerState[i] == TMR_OFF) { - s_timerState[i] = TMR_RUNNING; - s_cnt[i] = 0; - s_sum[i] = 0; - s_time_cum_16[i] = 0; - } - - uint8_t atm = (tm >= 0 ? tm : TMR_VAROFS-tm-1); - - // value for time described in timer->mode - // OFFABSTHsTH%THt - if (atm == TMRMODE_THR_REL) { - s_cnt[i]++; - s_sum[i]+=val; - } - - if (atm>=(TMR_VAROFS+MAX_SWITCH-1)){ // toggeled switch - if(!(sw_toggled[i] | s_sum[i] | s_cnt[i] | lastSwPos[i])) lastSwPos[i] = tm < 0; // if initializing then init the lastSwPos - uint8_t swPos = getSwitch(tm>0 ? tm-(TMR_VAROFS+MAX_SWITCH-1-1) : tm+(TMR_VAROFS+MAX_SWITCH-1-1), 0); - if (swPos && !lastSwPos[i]) sw_toggled[i] = !sw_toggled[i]; // if switch is flipped first time -> change counter state - lastSwPos[i] = swPos; - } - - if ( (s_timerVal_10ms[i] += 1 ) >= 100 ) { - s_timerVal_10ms[i] -= 100 ; - - if (timer->val) s_timerVal[i] = timer->val - s_timerVal[i]; - - if (atm==TMRMODE_ABS) { - s_timerVal[i]++; - } - else if (atm==TMRMODE_THR) { - if (val) s_timerVal[i]++; - } - else if (atm==TMRMODE_THR_REL) { - if (s_cnt[i]) { - val = s_sum[i]/s_cnt[i]; - s_sum[i] -= val*s_cnt[i]; //rest - s_cnt[i] = 0; - s_time_cum_16[i] += val/2; - if (s_time_cum_16[i] >= 16) { - s_timerVal[i] ++; - s_time_cum_16[i] -= 16; - } - } - } - else if (atm==TMRMODE_THR_TRG) { - if (val || s_timerVal[i] > 0) - s_timerVal[i]++; - } - else { - if (atm<(TMR_VAROFS+MAX_SWITCH-1)) - sw_toggled[i] = getSwitch((tm>0 ? tm-(TMR_VAROFS-1) : tm+(TMR_VAROFS-1)), 0); // normal switch - if (sw_toggled[i]) - s_timerVal[i]++; - } - - switch(s_timerState[i]) - { - case TMR_RUNNING: - if (timer->val && s_timerVal[i]>=(int16_t)timer->val) s_timerState[i]=TMR_BEEPING; - break; - case TMR_BEEPING: - if (s_timerVal[i] >= (int16_t)timer->val + MAX_ALERT_TIME) s_timerState[i]=TMR_STOPPED; - break; - } - - if (timer->val) s_timerVal[i] = timer->val - s_timerVal[i]; //if counting backwards - display backwards - } - } - - static int16_t last_tmr; - if (last_tmr != s_timerVal[0]) { // beep only if seconds advance - if (s_timerState[0] == TMR_RUNNING) { - if (g_eeGeneral.preBeep && g_model.timer1.val) { // beep when 30, 15, 10, 5,4,3,2,1 seconds remaining - if(s_timerVal[0]==30) {beepAgain=2; beepWarn2();} //beep three times - if(s_timerVal[0]==20) {beepAgain=1; beepWarn2();} //beep two times - if(s_timerVal[0]==10) beepWarn2(); - if(s_timerVal[0]<= 3) beepWarn2(); - - if(g_eeGeneral.flashBeep && (s_timerVal[0]==30 || s_timerVal[0]==20 || s_timerVal[0]==10 || s_timerVal[0]<=3)) - g_LightOffCounter = FLASH_DURATION; - } - - if (g_eeGeneral.minuteBeep && (((g_model.timer1.val ? g_model.timer1.val-s_timerVal[0] : s_timerVal[0])%60)==0)) { // short beep every minute - beepWarn2(); - if(g_eeGeneral.flashBeep) g_LightOffCounter = FLASH_DURATION; - } - } - else if(s_timerState[0] == TMR_BEEPING) - { - beepWarn(); - if(g_eeGeneral.flashBeep) g_LightOffCounter = FLASH_DURATION; - } - last_tmr = s_timerVal[0]; - } -} +static uint8_t lastSwPos[2] = {0, 0}; +static uint16_t s_cnt[2] = {0, 0}; +static uint16_t s_sum[2] = {0, 0}; +static uint8_t sw_toggled[2] = {false, false}; +static uint16_t s_time_cum_16[2] = {0, 0}; uint8_t s_traceBuf[MAXTRACE]; uint16_t s_traceWr; int8_t s_traceCnt; -FORCEINLINE void thrTrace(int16_t val) // called in perOut - once envery 0.01sec -{ - static uint16_t s_time_tot; - static uint16_t s_time_trace; - static uint8_t s_cnt_1s; - static uint16_t s_sum_1s; - static uint16_t s_cnt_10s; - static uint16_t s_sum_10s; - - s_cnt_1s ++; - s_sum_1s +=val; - - uint16_t tmr10ms = get_tmr10ms(); - if (tmr10ms - s_time_tot < 100) // 1sec - return; - - s_time_tot += 100; - s_timeCumTot += 1; - - val = s_sum_1s / s_cnt_1s; - s_timeCum16ThrP += val/2; - if (val) s_timeCumThr += 1; - - s_cnt_10s += s_cnt_1s; - s_sum_10s += s_sum_1s; - s_cnt_1s = 0; - s_sum_1s = 0; - - if (tmr10ms - s_time_trace < 1000) // 10sec - return; - - s_time_trace += 1000; - val = s_sum_10s/s_cnt_10s; - s_sum_10s = 0; - s_cnt_10s = 0; - - s_traceBuf[s_traceWr++] = val; - if (s_traceWr >= MAXTRACE) s_traceWr=0; - if (s_traceCnt >= 0) s_traceCnt++; -} #ifdef HELI uint16_t isqrt32(uint32_t n) @@ -1317,27 +1169,6 @@ void perOut(int16_t *chanOut, uint8_t phase) for (uint8_t i=CHOUT_BASE; i NUM_POTS) { - val = RESX + g_chans512[g_model.thrTraceSrc-NUM_POTS-1]; - } - else { - val = calibratedStick[g_model.thrTraceSrc+NUM_STICKS-1]; - } - - val /= (RESX/16); // calibrate it - - incTimers(val); - - thrTrace(val); // trace thr 0..32 (/32) - } - memset(chans, 0, sizeof(chans)); // All outputs to 0 //========== MIXER LOOP =============== @@ -1514,8 +1345,9 @@ char userDataDisplayBuf[TELEM_SCREEN_BUFFER_SIZE]; void perMain() { static uint16_t lastTMR; - tick10ms = (get_tmr10ms() != lastTMR); - lastTMR = get_tmr10ms(); + uint16_t tmr10ms = get_tmr10ms(); + tick10ms = (tmr10ms != lastTMR); + lastTMR = tmr10ms; #define MAX_ACT 0xffff static uint16_t fp_act[MAX_PHASES] = {0}; @@ -1565,10 +1397,10 @@ void perMain() next_chans512[i] = ((int32_t)sum_chans512[i] / weight); } // printf("output = %d\n", next_chans512[2]); fflush(stdout); - } - else { - perOut(next_chans512, phase); - } + } + else { + perOut(next_chans512, phase); + } for (uint8_t i=0; i NUM_POTS) { + val = RESX + g_chans512[g_model.thrTraceSrc-NUM_POTS-1]; + } + else { + val = calibratedStick[g_model.thrTraceSrc+NUM_STICKS-1]; + } + + val /= (RESX/16); // calibrate it + + // Throttle trace start + static uint16_t s_time_tot; + static uint16_t s_time_trace; + static uint8_t s_cnt_1s; + static uint16_t s_sum_1s; + static uint16_t s_cnt_10s; + static uint16_t s_sum_10s; + + s_cnt_1s++; + s_sum_1s += val; + + if (tmr10ms - s_time_tot >= 100) { // 1sec + s_time_tot += 100; + s_timeCumTot += 1; + + val = s_sum_1s / s_cnt_1s; + s_timeCum16ThrP += val / 2; + if (val) s_timeCumThr += 1; + + s_cnt_10s += s_cnt_1s; + s_sum_10s += s_sum_1s; + s_cnt_1s = 0; + s_sum_1s = 0; + + if (tmr10ms - s_time_trace >= 1000) {// 10sec + s_time_trace += 1000; + val = s_sum_10s / s_cnt_10s; + s_sum_10s = 0; + s_cnt_10s = 0; + + s_traceBuf[s_traceWr++] = val; + if (s_traceWr >= MAXTRACE) s_traceWr = 0; + if (s_traceCnt >= 0) s_traceCnt++; + } + } + // Throttle trace end + + // Timers start + uint8_t i = 0; + do { + int8_t tm; + uint16_t tv; + if (i == 0) { + tm = g_model.timer1.mode; + tv = g_model.timer1.val; + } + else if (i == 1) { + tm = g_model.timer2.mode; + tv = g_model.timer2.val; + } + else { + break; + } + + if (tm) { + if (s_timerState[i] == TMR_OFF) { + s_timerState[i] = TMR_RUNNING; + s_cnt[i] = 0; + s_sum[i] = 0; + s_time_cum_16[i] = 0; + } + + uint8_t atm = (tm >= 0 ? tm : TMR_VAROFS-tm-1); + + // value for time described in timer->mode + // OFFABSTHsTH%THt + if (atm == TMRMODE_THR_REL) { + s_cnt[i]++; + s_sum[i]+=val; + } + + if (atm>=(TMR_VAROFS+MAX_SWITCH-1)){ // toggeled switch + if(!(sw_toggled[i] | s_sum[i] | s_cnt[i] | lastSwPos[i])) lastSwPos[i] = tm < 0; // if initializing then init the lastSwPos + uint8_t swPos = getSwitch(tm>0 ? tm-(TMR_VAROFS+MAX_SWITCH-1-1) : tm+(TMR_VAROFS+MAX_SWITCH-1-1), 0); + if (swPos && !lastSwPos[i]) sw_toggled[i] = !sw_toggled[i]; // if switch is flipped first time -> change counter state + lastSwPos[i] = swPos; + } + + if ( (s_timerVal_10ms[i] += 1 ) >= 100 ) { + s_timerVal_10ms[i] -= 100 ; + + if (tv) s_timerVal[i] = tv - s_timerVal[i]; + + if (atm==TMRMODE_ABS) { + s_timerVal[i]++; + } + else if (atm==TMRMODE_THR) { + if (val) s_timerVal[i]++; + } + else if (atm==TMRMODE_THR_REL) { + if (s_cnt[i]) { + val = s_sum[i]/s_cnt[i]; + s_sum[i] -= val*s_cnt[i]; //rest + s_cnt[i] = 0; + s_time_cum_16[i] += val/2; + if (s_time_cum_16[i] >= 16) { + s_timerVal[i] ++; + s_time_cum_16[i] -= 16; + } + } + } + else if (atm==TMRMODE_THR_TRG) { + if (val || s_timerVal[i] > 0) + s_timerVal[i]++; + } + else { + if (atm<(TMR_VAROFS+MAX_SWITCH-1)) + sw_toggled[i] = getSwitch((tm>0 ? tm-(TMR_VAROFS-1) : tm+(TMR_VAROFS-1)), 0); // normal switch + if (sw_toggled[i]) + s_timerVal[i]++; + } + + switch(s_timerState[i]) + { + case TMR_RUNNING: + if (tv && s_timerVal[i]>=(int16_t)tv) s_timerState[i]=TMR_BEEPING; + break; + case TMR_BEEPING: + if (s_timerVal[i] >= (int16_t)tv + MAX_ALERT_TIME) s_timerState[i]=TMR_STOPPED; + break; + } + + if (tv) s_timerVal[i] = tv - s_timerVal[i]; //if counting backwards - display backwards + } + } + ++i; + } while(1); + + static int16_t last_tmr; + if (last_tmr != s_timerVal[0]) { // beep only if seconds advance + if (s_timerState[0] == TMR_RUNNING) { + if (g_eeGeneral.preBeep && g_model.timer1.val) { // beep when 30, 15, 10, 5,4,3,2,1 seconds remaining + if(s_timerVal[0]==30) {beepAgain=2; beepWarn2();} //beep three times + if(s_timerVal[0]==20) {beepAgain=1; beepWarn2();} //beep two times + if(s_timerVal[0]==10) beepWarn2(); + if(s_timerVal[0]<= 3) beepWarn2(); + + if(g_eeGeneral.flashBeep && (s_timerVal[0]==30 || s_timerVal[0]==20 || s_timerVal[0]==10 || s_timerVal[0]<=3)) + g_LightOffCounter = FLASH_DURATION; + } + + if (g_eeGeneral.minuteBeep && (((g_model.timer1.val ? g_model.timer1.val-s_timerVal[0] : s_timerVal[0])%60)==0)) { // short beep every minute + beepWarn2(); + if(g_eeGeneral.flashBeep) g_LightOffCounter = FLASH_DURATION; + } + } + else if(s_timerState[0] == TMR_BEEPING) { + beepWarn(); + if(g_eeGeneral.flashBeep) g_LightOffCounter = FLASH_DURATION; + } + last_tmr = s_timerVal[0]; + } + // Timers end if (s_fade_flight_phases) { for (uint8_t p=0; p