TEST(Mixer, RecursiveAddChannelAfterInactivePhase) { MODEL_RESET(); MIXER_RESET(); g_model.flightModeData[1].swtch = SWSRC_ID1; g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_CH2; g_model.mixData[0].flightModes = 0b11110; g_model.mixData[0].weight = 50; g_model.mixData[1].destCh = 0; g_model.mixData[1].mltpx = MLTPX_ADD; g_model.mixData[1].srcRaw = MIXSRC_MAX; g_model.mixData[1].flightModes = 0b11101; g_model.mixData[1].weight = 50; g_model.mixData[2].destCh = 1; g_model.mixData[2].srcRaw = MIXSRC_MAX; g_model.mixData[2].weight = 100; simuSetSwitch(3, -1); #if defined(CPUARM) doMixerCalculations(); #else perMain(); #endif EXPECT_EQ(chans[0], CHANNEL_MAX/2); EXPECT_EQ(chans[1], CHANNEL_MAX); simuSetSwitch(3, 0); #if defined(CPUARM) doMixerCalculations(); #else perMain(); #endif EXPECT_EQ(chans[0], CHANNEL_MAX/2); EXPECT_EQ(chans[1], CHANNEL_MAX); }
void mixerTask(void * pdata) { s_pulses_paused = true; while(1) { if (!s_pulses_paused) { uint16_t t0 = getTmr2MHz(); CoEnterMutexSection(mixerMutex); doMixerCalculations(); CoLeaveMutexSection(mixerMutex); #if defined(FRSKY) || defined(MAVLINK) telemetryWakeup(); #endif if (heartbeat == HEART_WDT_CHECK) { wdt_reset(); heartbeat = 0; } t0 = getTmr2MHz() - t0; if (t0 > maxMixerDuration) maxMixerDuration = t0 ; } CoTickDelay(1); // 2ms for now } }
TEST(getSwitch, inputWithTrim) { MODEL_RESET(); modelDefault(0); MIXER_RESET(); g_model.logicalSw[0] = { LS_FUNC_VPOS, MIXSRC_FIRST_INPUT, 0, 0 }; doMixerCalculations(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); setTrimValue(0, 0, 32); doMixerCalculations(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); }
TEST(Trims, CopySticksToOffset) { MODEL_RESET(); modelDefault(0); anaInValues[ELE_STICK] = -100; #if defined(CPUARM) doMixerCalculations(); #else perMain(); #endif copySticksToOffset(1); EXPECT_EQ(g_model.limitData[1].offset, -97); }
TEST(Mixer, Cascaded5Channels) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].srcRaw = MIXSRC_CH2; g_model.mixData[0].weight = 100; g_model.mixData[1].destCh = 1; g_model.mixData[1].srcRaw = MIXSRC_CH3; g_model.mixData[1].weight = 100; g_model.mixData[2].destCh = 2; g_model.mixData[2].srcRaw = MIXSRC_CH4; g_model.mixData[2].weight = 100; g_model.mixData[3].destCh = 3; g_model.mixData[3].srcRaw = MIXSRC_CH5; g_model.mixData[3].weight = 100; g_model.mixData[4].destCh = 4; g_model.mixData[4].srcRaw = MIXSRC_THR; g_model.mixData[4].weight = 100; for (uint8_t i=0; i<10; i++) { simuSetSwitch(0, 1); doMixerCalculations(); EXPECT_EQ(chans[0], CHANNEL_MAX); EXPECT_EQ(chans[1], CHANNEL_MAX); EXPECT_EQ(chans[2], CHANNEL_MAX); EXPECT_EQ(chans[3], CHANNEL_MAX); EXPECT_EQ(chans[4], CHANNEL_MAX); simuSetSwitch(0, 0); doMixerCalculations(); EXPECT_EQ(chans[0], -CHANNEL_MAX); EXPECT_EQ(chans[1], -CHANNEL_MAX); EXPECT_EQ(chans[2], -CHANNEL_MAX); EXPECT_EQ(chans[3], -CHANNEL_MAX); EXPECT_EQ(chans[4], -CHANNEL_MAX); } }
void perMain() { #if defined(SIMU) doMixerCalculations(); #endif #if defined(LCD_ST7920) uint8_t lcdstate=0; #endif uint16_t t0 = getTmr16KHz(); int16_t delta = (nextMixerEndTime - lastMixerDuration) - t0; if (delta > 0 && delta < MAX_MIXER_DELTA) { #if defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION) rotencPoll(); #endif // @@@ open.20.fsguruh // SLEEP(); // wouldn't that make sense? should save a lot of battery power!!! /* for future use; currently very very beta... */ #if defined(POWER_SAVE) ADCSRA&=0x7F; // disable ADC for power saving ACSR&=0xF7; // disable ACIE Interrupts ACSR|=0x80; // disable Analog Comparator // maybe we disable here a lot more hardware components in future to save even more power MCUCR|=0x20; // enable Sleep (bit5) // MCUCR|=0x28; // enable Sleep (bit5) enable ADC Noise Reduction (bit3) // first tests showed: simple sleep would reduce cpu current from 40.5mA to 32.0mA // noise reduction sleep would reduce it down to 28.5mA; However this would break pulses in theory // however with standard module, it will need about 95mA. Therefore the drop to 88mA is not much noticable do { asm volatile(" sleep \n\t"); // if _SLEEP() is not defined use this t0=getTmr16KHz(); delta= (nextMixerEndTime - lastMixerDuration) - t0; } while ((delta>0) && (delta<MAX_MIXER_DELTA)); // reenabling of the hardware components needed here MCUCR&=0x00; // disable sleep ADCSRA|=0x80; // enable ADC #endif return; }