// // Created by MightyPork on 2017/12/15. // #include "sched_queue.h" #include "framework/settings.h" #include "framework/resources.h" #include "framework/system_settings.h" #include "hw_utils.h" #include "lock_jumper.h" #include "status_led.h" static bool LockJumper_ReadPin(void); static GPIO_TypeDef *lock_periph; static uint32_t lock_llpin; static bool old_state = false; static uint32_t debo_ticks = 0; // We use macros LOCK_JUMPER_PORT, LOCK_JUMPER_PIN from plat_compat.h /** Init the jumper subsystem */ void LockJumper_Init(void) { bool suc = true; Resource pinrsc = rsc_portpin2rsc(LOCK_JUMPER_PORT, LOCK_JUMPER_PIN, &suc); assert_param(suc); assert_param(E_SUCCESS == rsc_claim(&UNIT_SYSTEM, pinrsc)); assert_param(hw_pinrsc2ll(pinrsc, &lock_periph, &lock_llpin)); // Configure for input LL_GPIO_SetPinMode(lock_periph, lock_llpin, LL_GPIO_MODE_INPUT); // pull-up/down in the opposite direction of the active state #if PLAT_LOCK_1CLOSED LL_GPIO_SetPinPull(lock_periph, lock_llpin, LL_GPIO_PULL_DOWN); #else LL_GPIO_SetPinPull(lock_periph, lock_llpin, LL_GPIO_PULL_UP); #endif #if PLAT_LOCK_BTN SystemSettings.editable = false; #else SystemSettings.editable = (PLAT_LOCK_1CLOSED != LL_GPIO_IsInputPinSet(lock_periph, lock_llpin)); #endif dbg("Settings editable? %d", SystemSettings.editable); } /** Handle jumper state change */ static void jumper_changed(void) { if (SystemSettings.editable) { // Unlock dbg("LOCK removed, enabling MSC!"); Indicator_Effect(STATUS_DISK_ATTACHED); } else { // Lock dbg("LOCK replaced, disabling MSC!"); Indicator_Effect(STATUS_DISK_REMOVED); if (SystemSettings.modified) { dbg("Saving settings to Flash..."); settings_save(); } else { dbg("No changes to save."); } } plat_usb_reconnect(); } /** Periodic jumper check */ void LockJumper_Check(void) { bool state = LockJumper_ReadPin(); if (state != old_state) { old_state = state; debo_ticks = 3; } if (debo_ticks > 0) { if (--debo_ticks == 0) { dbg("Debo finished, state %d", (int)state); // we've reached a change #if PLAT_LOCK_BTN if (state == true) { SystemSettings.editable = !SystemSettings.editable; jumper_changed(); } #else SystemSettings.editable = state; jumper_changed(); #endif } } } /** * Read the jumper / button state. * * @return true if the jumper is closed, or button pressed */ static bool LockJumper_ReadPin(void) { // lock jumper - start with MSC on if removed #if PLAT_LOCK_1CLOSED return (bool) LL_GPIO_IsInputPinSet(lock_periph, lock_llpin); #else return ! ((bool) LL_GPIO_IsInputPinSet(lock_periph, lock_llpin)); #endif } void LockJumper_CheckInitialState(void) { #if PLAT_LOCK_BTN // no static read - starts with MSC off SystemSettings.editable = false; old_state = false; #else old_state = SystemSettings.editable = ! LockJumper_ReadPin(); #endif }