129 lines
3.8 KiB
C++
129 lines
3.8 KiB
C++
/*
|
|
* 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"
|
|
|
|
uint8_t rotencPosition;
|
|
|
|
void rotaryEncoderInit()
|
|
{
|
|
SYSCFG_EXTILineConfig(ROTARY_ENCODER_EXTI_PortSource, ROTARY_ENCODER_EXTI_PinSource1);
|
|
|
|
#if defined(ROTARY_ENCODER_EXTI_LINE2)
|
|
SYSCFG_EXTILineConfig(ROTARY_ENCODER_EXTI_PortSource, ROTARY_ENCODER_EXTI_PinSource2);
|
|
#endif
|
|
|
|
EXTI_InitTypeDef EXTI_InitStructure;
|
|
EXTI_StructInit(&EXTI_InitStructure);
|
|
EXTI_InitStructure.EXTI_Line = ROTARY_ENCODER_EXTI_LINE1;
|
|
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
|
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
|
|
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
|
EXTI_Init(&EXTI_InitStructure);
|
|
|
|
#if defined(ROTARY_ENCODER_EXTI_LINE2)
|
|
EXTI_InitStructure.EXTI_Line = ROTARY_ENCODER_EXTI_LINE2;
|
|
EXTI_Init(&EXTI_InitStructure);
|
|
#endif
|
|
|
|
NVIC_InitTypeDef NVIC_InitStructure;
|
|
NVIC_InitStructure.NVIC_IRQChannel = ROTARY_ENCODER_EXTI_IRQn1;
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8;
|
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */;
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
|
|
#if defined(ROTARY_ENCODER_EXTI_IRQn2)
|
|
NVIC_InitStructure.NVIC_IRQChannel = ROTARY_ENCODER_EXTI_IRQn2;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
#endif
|
|
|
|
rotencPosition = ROTARY_ENCODER_POSITION();
|
|
|
|
ROTARY_ENCODER_TIMER->ARR = 99; // 100uS
|
|
ROTARY_ENCODER_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 1000000 - 1; // 1uS
|
|
ROTARY_ENCODER_TIMER->CCER = 0;
|
|
ROTARY_ENCODER_TIMER->CCMR1 = 0;
|
|
ROTARY_ENCODER_TIMER->EGR = 0;
|
|
ROTARY_ENCODER_TIMER->CR1 = 0;
|
|
ROTARY_ENCODER_TIMER->DIER |= TIM_DIER_UIE;
|
|
NVIC_EnableIRQ(ROTARY_ENCODER_TIMER_IRQn);
|
|
NVIC_SetPriority(ROTARY_ENCODER_TIMER_IRQn, 7);
|
|
}
|
|
|
|
void rotaryEncoderCheck()
|
|
{
|
|
uint8_t newPosition = ROTARY_ENCODER_POSITION();
|
|
if (newPosition != rotencPosition && !keyState(KEY_ENTER)) {
|
|
if ((rotencPosition & 0x01) ^ ((newPosition & 0x02) >> 1)) {
|
|
--rotencValue;
|
|
}
|
|
else {
|
|
++rotencValue;
|
|
}
|
|
rotencPosition = newPosition;
|
|
#if !defined(BOOT)
|
|
if (g_eeGeneral.backlightMode & e_backlight_mode_keys) {
|
|
backlightOn();
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
void rotaryEncoderStartDelay()
|
|
{
|
|
ROTARY_ENCODER_TIMER->CR1 = TIM_CR1_CEN | TIM_CR1_URS;
|
|
}
|
|
|
|
extern "C" void ROTARY_ENCODER_EXTI_IRQHandler1(void)
|
|
{
|
|
if (EXTI_GetITStatus(ROTARY_ENCODER_EXTI_LINE1) != RESET) {
|
|
rotaryEncoderStartDelay();
|
|
EXTI_ClearITPendingBit(ROTARY_ENCODER_EXTI_LINE1);
|
|
}
|
|
|
|
#if !defined(ROTARY_ENCODER_EXTI_IRQn2)
|
|
if (EXTI_GetITStatus(ROTARY_ENCODER_EXTI_LINE2) != RESET) {
|
|
rotaryEncoderStartDelay();
|
|
EXTI_ClearITPendingBit(ROTARY_ENCODER_EXTI_LINE2);
|
|
}
|
|
#endif
|
|
|
|
#if !defined(BOOT) && defined(INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER)
|
|
check_intmodule_heartbeat();
|
|
#endif
|
|
}
|
|
|
|
#if defined(ROTARY_ENCODER_EXTI_IRQn2)
|
|
extern "C" void ROTARY_ENCODER_EXTI_IRQHandler2(void)
|
|
{
|
|
if (EXTI_GetITStatus(ROTARY_ENCODER_EXTI_LINE2) != RESET) {
|
|
rotaryEncoderStartDelay();
|
|
EXTI_ClearITPendingBit(ROTARY_ENCODER_EXTI_LINE2);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
extern "C" void ROTARY_ENCODER_TIMER_IRQHandler(void)
|
|
{
|
|
ROTARY_ENCODER_TIMER->SR &= ~TIM_SR_UIF;
|
|
ROTARY_ENCODER_TIMER->CR1 = 0;
|
|
rotaryEncoderCheck();
|
|
} |