From c24e69b44c227c258158f5d2d392bb20a19ccd2f Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 25 Aug 2023 11:14:21 +0200 Subject: [PATCH] Allow to interrupt sleep sequence during final animation with a simple button press. Because otherwise one must wait for sleep animation to finish, then press button then wait for boot animation to finish... Also, fix saved config CRC after config has been saved --- CHANGELOG.md | 1 + firmware/application/src/app_main.c | 60 ++++++++++++------- .../src/rfid/nfctag/tag_emulation.c | 1 + 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d29ccdd..f544e28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added support for interrupting sleep sequence with a button press during animation (@doegox) - Fixed logs corruption and app reset on FDS write, added logs flush on sleep (@doegox) - Added support for long-press of buttons (@nemanjan00) - Changed `hw slot delete`, now it can always delete from slot. (@augustozanellato) diff --git a/firmware/application/src/app_main.c b/firmware/application/src/app_main.c index 7ad6795..a1e9b98 100644 --- a/firmware/application/src/app_main.c +++ b/firmware/application/src/app_main.c @@ -53,6 +53,8 @@ static bool m_is_a_btn_press = false; static bool m_is_b_btn_release = false; static bool m_is_a_btn_release = false; +static bool m_system_off_processing = false; + // cpu reset reason static uint32_t m_reset_source; static uint32_t m_gpregret_val; @@ -153,6 +155,12 @@ static void button_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t a * @return None */ static void timer_button_event_handle(void *arg) { + // if button press during shutdown, it's only to wake up quickly + if (m_system_off_processing) { + m_system_off_processing = false; + NRF_LOG_INFO("BUTTON press during shutdown"); + return; + } nrf_drv_gpiote_pin_t pin = *(nrf_drv_gpiote_pin_t *)arg; // Check here if the current GPIO is at the pressed level if (nrf_gpio_pin_read(pin) == 1) { @@ -234,26 +242,10 @@ static void button_init(void) { */ static void system_off_enter(void) { ret_code_t ret; - - // Disable the HF NFC event first - NRF_NFCT->INTENCLR = NRF_NFCT_DISABLE_ALL_INT; - // Then disable the LF LPCOMP event - NRF_LPCOMP->INTENCLR = LPCOMP_INTENCLR_CROSS_Msk | LPCOMP_INTENCLR_UP_Msk | LPCOMP_INTENCLR_DOWN_Msk | LPCOMP_INTENCLR_READY_Msk; - + m_system_off_processing = true; // Save tag data tag_emulation_save(); - // Configure RAM hibernation hold - uint32_t ram8_retention = // RAM8 Each section has 32KB capacity - // POWER_RAM_POWER_S0RETENTION_On << POWER_RAM_POWER_S0RETENTION_Pos ; - // POWER_RAM_POWER_S1RETENTION_On << POWER_RAM_POWER_S1RETENTION_Pos | - // POWER_RAM_POWER_S2RETENTION_On << POWER_RAM_POWER_S2RETENTION_Pos | - // POWER_RAM_POWER_S3RETENTION_On << POWER_RAM_POWER_S3RETENTION_Pos | - // POWER_RAM_POWER_S4RETENTION_On << POWER_RAM_POWER_S4RETENTION_Pos | - POWER_RAM_POWER_S5RETENTION_On << POWER_RAM_POWER_S5RETENTION_Pos; - ret = sd_power_ram_power_set(8, ram8_retention); - APP_ERROR_CHECK(ret); - if (g_is_low_battery_shutdown) { // Don't create too complex animations, just blink LED1 three times. rgb_marquee_stop(); @@ -283,15 +275,39 @@ static void system_off_enter(void) { color = 2; } } - ledblink5(color, slot, dir ? 7 : 0); - ledblink4(color, dir, 7, 99, 75); - ledblink4(color, !dir, 7, 75, 50); - ledblink4(color, dir, 7, 50, 25); - ledblink4(color, !dir, 7, 25, 0); + if (m_system_off_processing) ledblink5(color, slot, dir ? 7 : 0); + if (m_system_off_processing) ledblink4(color, dir, 7, 99, 75); + if (m_system_off_processing) ledblink4(color, !dir, 7, 75, 50); + if (m_system_off_processing) ledblink4(color, dir, 7, 50, 25); + if (m_system_off_processing) ledblink4(color, !dir, 7, 25, 0); } rgb_marquee_stop(); + if (!m_system_off_processing) { + for (uint8_t i = 0; i < RGB_LIST_NUM; i++) { + nrf_gpio_pin_clear(p_led_array[i]); + } + light_up_by_slot(); + sleep_timer_start(SLEEP_DELAY_MS_BUTTON_CLICK); + return; + } } + // Disable the HF NFC event first + NRF_NFCT->INTENCLR = NRF_NFCT_DISABLE_ALL_INT; + // Then disable the LF LPCOMP event + NRF_LPCOMP->INTENCLR = LPCOMP_INTENCLR_CROSS_Msk | LPCOMP_INTENCLR_UP_Msk | LPCOMP_INTENCLR_DOWN_Msk | LPCOMP_INTENCLR_READY_Msk; + + // Configure RAM hibernation hold + uint32_t ram8_retention = // RAM8 Each section has 32KB capacity + // POWER_RAM_POWER_S0RETENTION_On << POWER_RAM_POWER_S0RETENTION_Pos ; + // POWER_RAM_POWER_S1RETENTION_On << POWER_RAM_POWER_S1RETENTION_Pos | + // POWER_RAM_POWER_S2RETENTION_On << POWER_RAM_POWER_S2RETENTION_Pos | + // POWER_RAM_POWER_S3RETENTION_On << POWER_RAM_POWER_S3RETENTION_Pos | + // POWER_RAM_POWER_S4RETENTION_On << POWER_RAM_POWER_S4RETENTION_Pos | + POWER_RAM_POWER_S5RETENTION_On << POWER_RAM_POWER_S5RETENTION_Pos; + ret = sd_power_ram_power_set(8, ram8_retention); + APP_ERROR_CHECK(ret); + // IOs that need to be configured as floating analog inputs ==> no pull-up or pull-down uint32_t gpio_cfg_default_nopull[] = { #if defined(PROJECT_CHAMELEON_ULTRA) diff --git a/firmware/application/src/rfid/nfctag/tag_emulation.c b/firmware/application/src/rfid/nfctag/tag_emulation.c index a036878..93616c3 100644 --- a/firmware/application/src/rfid/nfctag/tag_emulation.c +++ b/firmware/application/src/rfid/nfctag/tag_emulation.c @@ -407,6 +407,7 @@ void tag_emulation_save_config(void) { bool ret = fds_write_sync(FDS_EMULATION_CONFIG_FILE_ID, FDS_EMULATION_CONFIG_RECORD_KEY, sizeof(slotConfig) / 4, (uint8_t *)&slotConfig); if (ret) { NRF_LOG_INFO("Save tag slot config success."); + m_slot_config_crc = new_calc_crc; } else { NRF_LOG_ERROR("Save tag slot config error."); }