bool _rtcmem_status = false; void _rtcmemInit() { memset((uint32_t*)RTCMEM_ADDR, 0, sizeof(uint32_t) * RTCMEM_BLOCKS); Rtcmem->magic = RTCMEM_MAGIC; } // Treat memory as dirty on cold boot, hardware wdt reset and rst pin bool _rtcmemStatus() { bool readable; switch (systemResetReason()) { case REASON_EXT_SYS_RST: case REASON_WDT_RST: case REASON_DEFAULT_RST: readable = false; break; default: readable = true; } readable = readable and (RTCMEM_MAGIC == Rtcmem->magic); return readable; } #if TERMINAL_SUPPORT void _rtcmemInitCommands() { terminalRegisterCommand(F("RTCMEM.REINIT"), [](Embedis* e) { _rtcmemInit(); }); terminalRegisterCommand(F("RTCMEM.TEST"), [](Embedis* e) { }); terminalRegisterCommand(F("RTCMEM.DUMP"), [](Embedis* e) { DEBUG_MSG_P(PSTR("[RTCMEM] status:%u blocks:%u addr:0x%p\n"), _rtcmemStatus(), RtcmemSize, Rtcmem); for (uint8_t block=0; block(RTCMEM_ADDR)[block]); } }); } #endif bool rtcmemStatus() { return _rtcmem_status; } void rtcmemSetup() { _rtcmem_status = _rtcmemStatus(); if (!_rtcmem_status) { _rtcmemInit(); } #if TERMINAL_SUPPORT _rtcmemInitCommands(); #endif }