mirror of
https://github.com/ratspeak/ratdeck.git
synced 2026-07-01 20:01:44 +00:00
55 lines
1.2 KiB
C++
55 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#include <Arduino.h>
|
|
#include "esp_ota_ops.h"
|
|
#include "esp_partition.h"
|
|
|
|
namespace rs_cardputer_adv {
|
|
|
|
enum class FirmwareMode : uint8_t {
|
|
Launcher,
|
|
Ratcom,
|
|
RNode,
|
|
};
|
|
|
|
struct SwitchResult {
|
|
bool ok;
|
|
const char *message;
|
|
};
|
|
|
|
inline esp_partition_subtype_t mode_subtype(FirmwareMode mode) {
|
|
switch (mode) {
|
|
case FirmwareMode::Launcher:
|
|
return ESP_PARTITION_SUBTYPE_APP_OTA_0;
|
|
case FirmwareMode::Ratcom:
|
|
return ESP_PARTITION_SUBTYPE_APP_OTA_1;
|
|
case FirmwareMode::RNode:
|
|
return ESP_PARTITION_SUBTYPE_APP_OTA_2;
|
|
}
|
|
return ESP_PARTITION_SUBTYPE_APP_OTA_0;
|
|
}
|
|
|
|
inline const esp_partition_t *mode_partition(FirmwareMode mode) {
|
|
return esp_partition_find_first(ESP_PARTITION_TYPE_APP, mode_subtype(mode), nullptr);
|
|
}
|
|
|
|
inline SwitchResult set_next_boot(FirmwareMode mode) {
|
|
const esp_partition_t *target = mode_partition(mode);
|
|
if (target == nullptr) {
|
|
return {false, "target partition not found"};
|
|
}
|
|
|
|
esp_err_t err = esp_ota_set_boot_partition(target);
|
|
if (err != ESP_OK) {
|
|
return {false, esp_err_to_name(err)};
|
|
}
|
|
|
|
return {true, "boot partition updated"};
|
|
}
|
|
|
|
inline SwitchResult return_to_launcher_next_boot() {
|
|
return set_next_boot(FirmwareMode::Launcher);
|
|
}
|
|
|
|
} // namespace rs_cardputer_adv
|