ProtoCore v0.0.2
Deterministic, zero-heap network stack for embedded targets
Loading...
Searching...
No Matches
ota_rollback.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4/**
5 * @file ota_rollback.cpp
6 * @brief OTA rollback decision (pure) + esp_ota_ops commit/rollback (ESP32).
7 */
8
10
11#if PC_ENABLE_OTA_ROLLBACK
12
13#if defined(ARDUINO)
14#include "esp_ota_ops.h"
15#include "services/system/clock.h" // pc_millis() (pulls in Arduino millis())
16#endif
17pc_ota_action pc_ota_decide(uint8_t img_state, bool self_test_ok, uint32_t ms_since_boot, uint32_t window_ms)
18{
19 if (img_state != pc_ota_img::PC_OTA_IMG_PENDING_VERIFY)
20 {
21 return pc_ota_action::PC_OTA_WAIT; // not a freshly-updated image: nothing to do
22 }
23 if (self_test_ok)
24 {
25 return pc_ota_action::PC_OTA_COMMIT;
26 }
27 if (ms_since_boot >= window_ms)
28 {
29 return pc_ota_action::PC_OTA_ROLLBACK; // never confirmed in time -> self-heal
30 }
31 return pc_ota_action::PC_OTA_WAIT;
32}
33
34#ifdef ARDUINO
35
36uint8_t pc_ota_img_state(void)
37{
38 const esp_partition_t *running = esp_ota_get_running_partition();
39 esp_ota_img_states_t st = ESP_OTA_IMG_UNDEFINED;
40 if (!running || esp_ota_get_state_partition(running, &st) != ESP_OK)
41 {
42 return pc_ota_img::PC_OTA_IMG_UNDEFINED;
43 }
44 return (uint8_t)st;
45}
46
47void pc_ota_commit(void)
48{
49 esp_ota_mark_app_valid_cancel_rollback();
50}
51
52void pc_ota_rollback(void)
53{
54 esp_ota_mark_app_invalid_rollback_and_reboot(); // does not return
55}
56
57pc_ota_action pc_ota_rollback_tick(bool self_test_ok)
58{
59 pc_ota_action a = pc_ota_decide(pc_ota_img_state(), self_test_ok, pc_millis(), PC_OTA_CONFIRM_WINDOW_MS);
60 if (a == pc_ota_action::PC_OTA_COMMIT)
61 {
62 pc_ota_commit();
63 }
64 else if (a == pc_ota_action::PC_OTA_ROLLBACK)
65 {
66 pc_ota_rollback();
67 }
68 return a;
69}
70
71#else // host build - no OTA partitions
72
73uint8_t pc_ota_img_state(void)
74{
75 return pc_ota_img::PC_OTA_IMG_UNDEFINED;
76}
77void pc_ota_commit(void)
78{
79}
80void pc_ota_rollback(void)
81{
82}
83pc_ota_action pc_ota_rollback_tick(bool)
84{
85 return pc_ota_action::PC_OTA_WAIT;
86}
87
88#endif // ARDUINO
89
90#endif // PC_ENABLE_OTA_ROLLBACK
Pluggable monotonic clock for all library timing.
uint32_t pc_millis(void)
The library's monotonic time at 1000 Hz (milliseconds).
Definition clock.h:71
OTA rollback protection / soft-brick safeguard (PC_ENABLE_OTA_ROLLBACK).
#define PC_OTA_CONFIRM_WINDOW_MS
Confirm window (ms): a pending image not confirmed within this rolls back.