Add initial board, HAL, and executor modules
This commit is contained in:
1 parent
3b9e129c88
commit
0b2eebe76d
82 files changed
+20611
No files matched your search
@@ -0,0 +1,41 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
#include "esp_err.h"
|
||||
|
||||
/**
|
||||
* @brief Base Board Hardware Abstraction Layer
|
||||
* Abstracts the communication transport (UART vs I2C) and sensor reading.
|
||||
*/
|
||||
class BaseBoardHal
|
||||
{
|
||||
public:
|
||||
virtual ~BaseBoardHal() = default;
|
||||
|
||||
/**
|
||||
* @brief Initialize the hardware interface
|
||||
*/
|
||||
virtual esp_err_t Init() = 0;
|
||||
|
||||
/**
|
||||
* @brief Send raw data to the base board
|
||||
* @param data Pointer to data buffer
|
||||
* @param len Length of data
|
||||
*/
|
||||
virtual esp_err_t Send(const uint8_t *data, size_t len) = 0;
|
||||
|
||||
/**
|
||||
* @brief Read raw data from the base board
|
||||
* @param data Pointer to data buffer
|
||||
* @param len Length of data to read
|
||||
*/
|
||||
virtual esp_err_t Read(uint8_t *data, size_t len) = 0;
|
||||
|
||||
/**
|
||||
* @brief Get the current angle from Hall sensor (or via query)
|
||||
* @param[out] angle Output angle in degrees (0.0 - 360.0)
|
||||
* @return ESP_OK on success
|
||||
*/
|
||||
virtual esp_err_t GetAngle(float *angle) = 0;
|
||||
};
|
||||
@@ -0,0 +1,65 @@
|
||||
#pragma once
|
||||
|
||||
#include "base_board_hal.h"
|
||||
#include "i2c_bus.h"
|
||||
#include "esp_log.h"
|
||||
|
||||
class BaseBoardHalI2c : public BaseBoardHal
|
||||
{
|
||||
public:
|
||||
static constexpr uint8_t kBaseSlaveAddr = 0x22;
|
||||
// TMAG5273 default address often 0x35 or defined by config
|
||||
static constexpr uint8_t kHallSensorAddr = 0x35;
|
||||
|
||||
BaseBoardHalI2c(i2c_bus_handle_t bus_handle)
|
||||
: bus_handle_(bus_handle) {}
|
||||
|
||||
virtual ~BaseBoardHalI2c()
|
||||
{
|
||||
// i2c_bus handles device management internally if used via i2c_bus_create
|
||||
// But here we just use the bus handle directly.
|
||||
}
|
||||
|
||||
virtual esp_err_t Init() override
|
||||
{
|
||||
if (!bus_handle_) return ESP_ERR_INVALID_STATE;
|
||||
|
||||
// Check if device is alive
|
||||
esp_err_t err = i2c_bus_probe_addr(bus_handle_, kBaseSlaveAddr << 1);
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGW("BaseBoardHalI2c", "Base board not found at 0x%02X", kBaseSlaveAddr);
|
||||
// Don't fail init, maybe it's sleeping
|
||||
} else {
|
||||
ESP_LOGI("BaseBoardHalI2c", "Base board found at 0x%02X", kBaseSlaveAddr);
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
virtual esp_err_t Send(const uint8_t *data, size_t len) override
|
||||
{
|
||||
if (!bus_handle_) return ESP_ERR_INVALID_STATE;
|
||||
|
||||
// i2c_bus_write_bytes expects: bus, addr, reg_addr, reg_len, data, datalen
|
||||
// The data pointer in i2c_bus_write_bytes is (uint8_t *), not (const uint8_t *)
|
||||
// This is a common issue in legacy C APIs. We have to cast away constness.
|
||||
|
||||
return i2c_bus_write_bytes(bus_handle_, kBaseSlaveAddr << 1, NULL, 0, (uint8_t*)data, len);
|
||||
}
|
||||
|
||||
virtual esp_err_t Read(uint8_t *data, size_t len) override
|
||||
{
|
||||
if (!bus_handle_) return ESP_ERR_INVALID_STATE;
|
||||
|
||||
return i2c_bus_read_bytes(bus_handle_, kBaseSlaveAddr << 1, NULL, 0, data, len);
|
||||
}
|
||||
|
||||
virtual esp_err_t GetAngle(float *angle) override
|
||||
{
|
||||
// TODO: Implement TMAG5273 read logic using i2c_bus_read_bytes
|
||||
return ESP_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
private:
|
||||
i2c_bus_handle_t bus_handle_;
|
||||
};
|
||||
@@ -0,0 +1,45 @@
|
||||
#pragma once
|
||||
|
||||
#include "base_board_hal.h"
|
||||
#include "driver/uart.h"
|
||||
|
||||
class BaseBoardHalUart : public BaseBoardHal
|
||||
{
|
||||
public:
|
||||
BaseBoardHalUart(uart_port_t port) : port_(port) {}
|
||||
virtual ~BaseBoardHalUart() = default;
|
||||
|
||||
virtual esp_err_t Init() override
|
||||
{
|
||||
// Assuming UART is already initialized by board.cc or similar
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
virtual esp_err_t Send(const uint8_t *data, size_t len) override
|
||||
{
|
||||
if (port_ >= UART_NUM_MAX) {
|
||||
return ESP_ERR_INVALID_STATE;
|
||||
}
|
||||
int written = uart_write_bytes(port_, (const char *)data, len);
|
||||
return (written == (int)len) ? ESP_OK : ESP_FAIL;
|
||||
}
|
||||
|
||||
virtual esp_err_t Read(uint8_t *data, size_t len) override
|
||||
{
|
||||
if (port_ >= UART_NUM_MAX) {
|
||||
return ESP_ERR_INVALID_STATE;
|
||||
}
|
||||
int read = uart_read_bytes(port_, data, len, pdMS_TO_TICKS(100));
|
||||
return (read == (int)len) ? ESP_OK : ESP_FAIL;
|
||||
}
|
||||
|
||||
virtual esp_err_t GetAngle(float *angle) override
|
||||
{
|
||||
// TODO: Implement angle reading via UART (query command or report parsing)
|
||||
// For now, return not supported or cached value if we had one
|
||||
return ESP_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
private:
|
||||
uart_port_t port_;
|
||||
};
|
||||
@@ -0,0 +1,13 @@
|
||||
# main/04_hal/base_board_hal/module.cmake
|
||||
|
||||
# 注意:此文件夹可能没有 cpp 源文件,仅有头文件。如果有源文件,请追加到 MODULE_SRCS。
|
||||
|
||||
# 判断 menuconfig 中的开关
|
||||
if(NOT CONFIG_ENABLE_HAL_BASE_BOARD_HAL AND NOT EARLY_EXPANSION)
|
||||
message(STATUS " [Skip] base_board_hal module disabled by menuconfig.")
|
||||
return()
|
||||
endif()
|
||||
|
||||
list(APPEND MODULE_INCLUDE_DIRS
|
||||
"04_hal/base_board_hal"
|
||||
)
|
||||
Reference in new issue
Block a user