/* * Authors (alphabetical order) * - Bertrand Songis * - Bryan J. Rentoul (Gruvin) * * gruvin9x is based on code named er9x by * Author - Erez Raviv , which is in turn * was based on the original (and ongoing) project by Thomas Husterer, * th9x -- http://code.google.com/p/th9x/ * * 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 "open9x.h" uint16_t eeprom_pointer; const char* eeprom_buffer_data; volatile int8_t eeprom_buffer_size = 0; #ifdef SIMU extern void eeprom_write_byte(); #else inline void eeprom_write_byte() { EEAR = eeprom_pointer; EEDR = *eeprom_buffer_data; #if defined (PCBV4) EECR |= 1< 0) { eeprom_write_byte(); } else { #if defined (PCBV4) EECR &= ~(1< 0) wdt_reset(); } } static uint8_t s_evt; void putEvent(uint8_t evt) { s_evt = evt; } uint8_t getEvent() { uint8_t evt = s_evt; s_evt=0; return evt; } class Key { #define FILTERBITS 4 #ifdef SIMU #define FFVAL 1 #else #define FFVAL ((1<16) m_dblcnt=0; //pause zu lang fuer double m_cnt = 0; } break; //fallthrough case KSTATE_START: putEvent(EVT_KEY_FIRST(enuk)); inacCounter = 0; m_dblcnt++; m_state = KSTATE_RPTDELAY; m_cnt = 0; break; case KSTATE_RPTDELAY: // gruvin: delay state before first key repeat if(m_cnt == 24) putEvent(EVT_KEY_LONG(enuk)); if (m_cnt == 40) { m_state = 16; m_cnt = 0; } break; case 16: case 8: case 4: case 2: if(m_cnt >= 48) { //3 6 12 24 48 pulses in every 480ms m_state >>= 1; m_cnt = 0; } //fallthrough case 1: if( (m_cnt & (m_state-1)) == 0) putEvent(EVT_KEY_REPT(enuk)); break; case KSTATE_PAUSE: //pause if(m_cnt >= 64) { m_state = 8; m_cnt = 0; } break; case KSTATE_KILLED: //killed break; } } bool keyState(EnumKeys enuk) { uint8_t result = 0 ; if (enuk < (int)DIM(keys)) return keys[enuk].state() ? 1 : 0; #if defined (PCBV4) switch(enuk){ case SW_ElevDR: result = PINC & (1<> 3; # else // Gruvin's PCBv2.14/v3 key scanning ... #define KEY_Y0 1 // EXIT / MENU #define KEY_Y1 2 // LEFT / RIGHT / UP / DOWN #define KEY_Y2 4 // LV_Trim_Up / Down / LH_Trim_Up / Down #define KEY_Y3 8 // RV_Trim_Up / Down / RH_Trim_Up / Down #define TRIM_M_LH_DWN 0 // KEY_X0 #define TRIM_M_LH_UP 1 // KEY_X1 #define TRIM_M_LV_DWN 2 // KEY_X2 #define TRIM_M_LV_UP 3 // KEY_X3 #define TRIM_M_RV_DWN 4 // KEY_X0 #define TRIM_M_RV_UP 5 // KEY_X1 #define TRIM_M_RH_DWN 6 // KEY_X2 #define TRIM_M_RH_UP 7 // KEY_3X uint8_t in, tin; in = keyDown(); // in gruvin9x.cpp # endif // PCBV4 #else uint8_t in = ~PINB; #endif for(int i=1; i<7; i++) { //INP_B_KEY_MEN 1 .. INP_B_KEY_LFT 6 keys[enuk].input(in & (1< 0) frskyUsrStreaming--; if (frskyStreaming > 0) { frskyStreaming--; } else if (g_eeGeneral.enableTelemetryAlarm && (g_model.frsky.channels[0].ratio || g_model.frsky.channels[1].ratio)) { #if defined (AUDIO) if (!(g_tmr10ms % 30)) { audioDefevent(AU_WARNING1); } #else if (!(g_tmr10ms % 30)) { warble = !(g_tmr10ms % 60); AUDIO_WARNING2(); } #endif } #endif #endif // These moved here from perOut() [gruvin9x.cpp] to improve beep trigger reliability. if(mixWarning & 1) if(((g_tmr10ms&0xFF)== 0)) AUDIO_MIX_WARNING_1(); if(mixWarning & 2) if(((g_tmr10ms&0xFF)== 64) || ((g_tmr10ms&0xFF)== 72)) AUDIO_MIX_WARNING_1(); if(mixWarning & 4) if(((g_tmr10ms&0xFF)==128) || ((g_tmr10ms&0xFF)==136) || ((g_tmr10ms&0xFF)==144)) AUDIO_MIX_WARNING_3(); }