/* * local_control.c * Code related to the local control mode * * Created on: Nov 4, 2025 * Author: sowgro */ #include #include #include #include "GPIO.h" #include "project.h" int click_count = 0; uint32_t last_press = 0; uint32_t time_down = 0; int hold_pending = 0; /** * Initialize local control mode (does not enable it) */ void local_control_init() { GPIO_Init(); NVIC_EnableIRQ(EXTI9_5_IRQn); } /** * Logic that should be called constantly from the main loop. */ void local_control_loop() { uint32_t now = systick_get_count(); if (hold_pending) { hold_pending = 0; printf("Hold click action\r\n"); } if (now - last_press > 10000) { last_press = 0; switch(click_count) { case 1: printf("Single click action\r\n"); break; case 2: printf("Double click action\r\n"); break; } click_count = 0; } } /** * Handles external button press */ void EXTI9_5_IRQHandler() { static int prevStatus = -1; if (~EXTI->PR1 & EXTI_PR1_PIF9) return; EXTI->PR1 |= EXTI_PR1_PIF9; if (project_get_mode() != LOCAL_MODE) return; int status = !!(GPIOA->IDR & GPIO_PIN_9); if (prevStatus == status) return; prevStatus = status; handle_press(status); } /** * Logs button information */ void handle_press(int pressed) { uint32_t now = systick_get_count(); if (pressed) { time_down = now; } else { // printf("now: %i, time_down: %i diff: %i\r\n", now, time_down, now - time_down); if (/*(now - time_down) < 10 ||*/ !time_down) { printf("ignored\r\n"); // printf("now: %i, time_down: %i diff: %i\r\n", now, time_down, now - time_down); } else if ((now - time_down) < 10000) { // printf("SHORT PRESS\r\n"); time_down = 0; last_press = now; click_count++; } else { // printf("LONG PRESS\r\n"); hold_pending = 1; time_down = 0; } } }