/* * Copyright (C) OpenTX * * Based on code named * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include "opentx.h" event_t s_evt; struct t_inactivity inactivity = {0}; #if defined(CPUARM) event_t getEvent(bool trim) { event_t evt = s_evt; int8_t k = EVT_KEY_MASK(s_evt) - TRM_BASE; bool trim_evt = (k>=0 && k= 48) { //3 6 12 24 48 pulses in every 480ms m_state >>= 1; m_cnt = 0; } // no break case 1: if ((m_cnt & (m_state-1)) == 0) { putEvent(EVT_KEY_REPT(key())); } break; case KSTATE_PAUSE: //pause if (m_cnt >= 64) { m_state = 8; m_cnt = 0; } break; case KSTATE_KILLED: //killed break; } } uint8_t Key::key() const { return (this - keys); } void pauseEvents(event_t event) { event = EVT_KEY_MASK(event); if (event < (int)DIM(keys)) keys[event].pauseEvents(); } void killEvents(event_t event) { #if defined(ROTARY_ENCODERS) if (event == EVT_ROTARY_LONG) { killEvents(BTN_REa + g_eeGeneral.reNavigation - 1); return; } #endif event = EVT_KEY_MASK(event); if (event < (int)DIM(keys)) { keys[event].killEvents(); } } #if defined(CPUARM) bool clearKeyEvents() { #if defined(PCBSKY9X) CoTickDelay(100); // 200ms #endif // loop until all keys are up #if !defined(BOOT) tmr10ms_t start = get_tmr10ms(); #endif while (keyDown()) { #if defined(SIMU) SIMU_SLEEP_NORET(1/*ms*/); #else wdt_reset(); #endif #if !defined(BOOT) if ((get_tmr10ms() - start) >= 300) { // wait no more than 3 seconds //timeout expired, at least one key stuck return false; } #endif } memclear(keys, sizeof(keys)); putEvent(0); return true; } #else void clearKeyEvents() { // loop until all keys are up while (keyDown()) { #if defined(SIMU) SIMU_SLEEP(1/*ms*/); #else wdt_reset(); #endif #if defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION) && !defined(TELEMETREZ) rotencPoll(); #endif } memclear(keys, sizeof(keys)); putEvent(0); } #endif // #if defined(CPUARM)