diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-08-01 12:13:48 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-08-01 12:13:48 +1000 |
| commit | 955a8ce303a9f8fd6a34009934e3d7aaeff3ec17 (patch) | |
| tree | 18d5783a5c7be0a3e08e6ff0ea595432bc380761 /src/drivers | |
| parent | d41de537a0e31e1c5ad18b5024c781f6e4a07bbb (diff) | |
| download | tangara-fw-955a8ce303a9f8fd6a34009934e3d7aaeff3ec17.tar.gz | |
Basic nvs init + bluetooth in the build
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/drivers/bluetooth.cpp | 11 | ||||
| -rw-r--r-- | src/drivers/include/bluetooth.hpp | 19 | ||||
| -rw-r--r-- | src/drivers/include/nvs.hpp | 27 | ||||
| -rw-r--r-- | src/drivers/nvs.cpp | 73 |
5 files changed, 132 insertions, 1 deletions
diff --git a/src/drivers/CMakeLists.txt b/src/drivers/CMakeLists.txt index 40cd0c4f..9774f80b 100644 --- a/src/drivers/CMakeLists.txt +++ b/src/drivers/CMakeLists.txt @@ -5,6 +5,7 @@ idf_component_register( SRCS "touchwheel.cpp" "i2s_dac.cpp" "gpios.cpp" "battery.cpp" "storage.cpp" "i2c.cpp" "spi.cpp" "display.cpp" "display_init.cpp" "samd.cpp" "relative_wheel.cpp" "wm8523.cpp" + "nvs.cpp" "bluetooth.cpp" INCLUDE_DIRS "include" - REQUIRES "esp_adc" "fatfs" "result" "lvgl" "span" "tasks") + REQUIRES "esp_adc" "fatfs" "result" "lvgl" "span" "tasks" "nvs_flash" "bt") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/drivers/bluetooth.cpp b/src/drivers/bluetooth.cpp new file mode 100644 index 00000000..9748522f --- /dev/null +++ b/src/drivers/bluetooth.cpp @@ -0,0 +1,11 @@ +#include "bluetooth.hpp" + +#include "esp_bt.h" + +namespace drivers { + +auto Bluetooth::Enable() -> Bluetooth* { + return nullptr; +} + +} // namespace drivers diff --git a/src/drivers/include/bluetooth.hpp b/src/drivers/include/bluetooth.hpp new file mode 100644 index 00000000..f3a4b2ac --- /dev/null +++ b/src/drivers/include/bluetooth.hpp @@ -0,0 +1,19 @@ + +#pragma once + +#include <vector> + +namespace drivers { + +class Bluetooth { + public: + static auto Enable() -> Bluetooth*; + Bluetooth(); + ~Bluetooth(); + + struct Device {}; + auto Scan() -> std::vector<Device>; + private: + }; + +} diff --git a/src/drivers/include/nvs.hpp b/src/drivers/include/nvs.hpp new file mode 100644 index 00000000..be783583 --- /dev/null +++ b/src/drivers/include/nvs.hpp @@ -0,0 +1,27 @@ +/* + * Copyright 2023 jacqueline <me@jacqueline.id.au> + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#pragma once + +#include "esp_err.h" +#include "nvs.h" + +namespace drivers { + +class NvsStorage { + public: + static auto Open() -> NvsStorage*; + + auto SchemaVersion() -> uint8_t; + + explicit NvsStorage(nvs_handle_t); + ~NvsStorage(); + + private: + nvs_handle_t handle_; +}; + +} // namespace drivers
\ No newline at end of file diff --git a/src/drivers/nvs.cpp b/src/drivers/nvs.cpp new file mode 100644 index 00000000..a2de9518 --- /dev/null +++ b/src/drivers/nvs.cpp @@ -0,0 +1,73 @@ +/* + * Copyright 2023 jacqueline <me@jacqueline.id.au> + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "nvs.hpp" +#include <stdint.h> + +#include <cstdint> +#include <memory> + +#include "esp_log.h" +#include "nvs.h" +#include "nvs_flash.h" + +namespace drivers { + +static constexpr char kTag[] = "nvm"; +static constexpr uint8_t kSchemaVersion = 1; + +static constexpr char kKeyVersion[] = "ver"; + +auto NvsStorage::Open() -> NvsStorage* { + esp_err_t err = nvs_flash_init(); + if (err == ESP_ERR_NVS_NO_FREE_PAGES) { + ESP_LOGW(kTag, "partition needs initialisation"); + nvs_flash_erase(); + err = nvs_flash_init(); + } + if (err != ESP_OK) { + ESP_LOGE(kTag, "failed to init nvm"); + return nullptr; + } + + nvs_handle_t handle; + if ((err = nvs_open("tangara", NVS_READWRITE, &handle)) != ESP_OK) { + ESP_LOGE(kTag, "failed to open nvs namespace"); + return nullptr; + } + + std::unique_ptr<NvsStorage> instance = std::make_unique<NvsStorage>(handle); + if (instance->SchemaVersion() < kSchemaVersion) { + ESP_LOGW(kTag, "namespace needs downgrading"); + nvs_erase_all(handle); + nvs_set_u8(handle, kKeyVersion, kSchemaVersion); + err = nvs_commit(handle); + if (err != ESP_OK) { + ESP_LOGW(kTag, "failed to init namespace"); + return nullptr; + } + } + + ESP_LOGI(kTag, "nvm storage initialised okay"); + return instance.release(); +} + +NvsStorage::NvsStorage(nvs_handle_t handle) : handle_(handle) {} + +NvsStorage::~NvsStorage() { + nvs_close(handle_); + nvs_flash_deinit(); +} + +auto NvsStorage::SchemaVersion() -> uint8_t { + uint8_t ret; + if (nvs_get_u8(handle_, kKeyVersion, &ret) != ESP_OK) { + return UINT8_MAX; + } + return ret; +} + +} // namespace drivers |
