@ -8,38 +8,46 @@ const int pushPin = 5;
const int wheelPin1 = 18 ;
const int wheelPin2 = 23 ;
# define DEBOUNCE_WHEEL_MS 6
# define DEBOUNCE_BTN_MS 20
static void handle_pushbtn ( void * arg ) ;
static void handle_wheel ( void * arg ) ;
void knob_init ( ) {
printf ( " Knob init \n " ) ;
gpio_config_t cfgWheel = {
. pin_bit_mask = ( 1 < < wheelPin1 ) | ( 1 < < wheelPin2 ) ,
. mode = GPIO_MODE_INPUT ,
. pull_up_en = 1 ,
. intr_type = GPIO_INTR_NEGEDGE , // neg means active
} ;
gpio_config ( & cfgWheel ) ;
// gpio_config_t cfgWheel = {
// .pin_bit_mask = (1 << wheelPin1) /*| (1 << wheelPin2)*/,
// .mode = GPIO_MODE_INPUT,
// .pull_up_en = 1,
// .intr_type = GPIO_INTR_NEGEDGE, // neg means active
// };
// gpio_config(&cfgWheel);
gpio_config_t cfgPush = {
. pin_bit_mask = ( 1 < < pushPin ) ,
. pin_bit_mask = ( 1 < < pushPin ) | ( 1 < < wheelPin1 ) ,
. mode = GPIO_MODE_INPUT ,
. pull_up_en = 1 ,
. intr_type = GPIO_INTR_ANYEDGE , // neg means active
} ;
gpio_config ( & cfgPush ) ;
cfgPush . intr_type = GPIO_INTR_DISABLE ;
cfgPush . pin_bit_mask = ( 1 < < wheelPin2 ) ;
gpio_config ( & cfgPush ) ;
gpio_install_isr_service ( 0 ) ;
gpio_intr_enable ( pushPin ) ;
gpio_intr_enable ( wheelPin1 ) ;
gpio_intr_enable ( wheelPin2 ) ;
// gpio_intr_enable(wheelPin2);
gpio_isr_handler_add ( pushPin , handle_pushbtn , ( void * ) 0 ) ;
gpio_isr_handler_add ( wheelPin1 , handle_wheel , ( void * ) 0 ) ;
gpio_isr_handler_add ( wheelPin2 , handle_wheel , ( void * ) 1 ) ;
//gpio_isr_handler_add(wheelPin2, handle_wheel, (void *)1);
}
#if 0
enum state {
S_11 = 0 ,
@ -104,9 +112,37 @@ const uint8_t switch_table[28] = {
} ;
static uint8_t OldEnc = 0 b00 ;
# endif
static void handle_wheel ( void * arg ) {
static uint32_t negedge_time = 0 ;
int dir = 0 ;
const uint32_t inputs = gpio_input_get ( ) ;
const bool a = 0 ! = ( inputs & ( 1 < < wheelPin1 ) ) ; // neg = active
const bool b = 0 ! = ( inputs & ( 1 < < wheelPin2 ) ) ;
const uint32_t time = xTaskGetTickCount ( ) ;
if ( ! a ) {
// negedge
negedge_time = time ;
} else {
// posedge
if ( time - negedge_time > pdMS_TO_TICKS ( DEBOUNCE_WHEEL_MS ) ) {
if ( b ) {
dir = - 1 ;
} else {
dir = 1 ;
}
} else {
// reset the timer
negedge_time = time ;
}
}
#if 0
@ -151,7 +187,7 @@ static void handle_wheel(void *arg) {
} ; // end if encoder value changed.
# endif
# if 1
#if 0
// Omron version
int which = ( int ) arg ;
@ -232,20 +268,24 @@ static void handle_wheel(void *arg) {
if ( dir ! = 0 ) {
BaseType_t higherWoken = 0 ;
xTaskNotifyFromISR ( hGuiThread , dir = = 1 ? 0 b10 : 0 b01 , eSetBits , & higherWoken ) ;
if ( higherWoken ) {
portYIELD_FROM_ISR ( ) ;
}
if ( higherWoken ) portYIELD_FROM_ISR ( ) ;
}
}
static void handle_pushbtn ( void * arg ) {
static uint32_t negedge_time = 0 ;
const uint32_t inputs = gpio_input_get ( ) ;
BaseType_t higherWoken = 0 ;
bool pushed = ( inputs & ( 1 < < pushPin ) ) = = 0 ;
xTaskNotifyFromISR ( hGuiThread , pushed ? 0 b1000 : 0 b0100 , eSetBits , & higherWoken ) ;
if ( higherWoken ) {
portYIELD_FROM_ISR ( ) ;
const uint32_t time = xTaskGetTickCount ( ) ;
if ( pushed ) {
negedge_time = time ;
} else {
if ( time - negedge_time > pdMS_TO_TICKS ( DEBOUNCE_BTN_MS ) ) {
xTaskNotifyFromISR ( hGuiThread , pushed ? 0 b1000 : 0 b0100 , eSetBits , & higherWoken ) ;
if ( higherWoken ) portYIELD_FROM_ISR ( ) ;
}
}
}