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,202 @@
|
||||
#include "millimeter_wave_radar.h"
|
||||
#include <cstring>
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/task.h>
|
||||
#include <esp_log.h>
|
||||
|
||||
static const char *TAG = "MillimeterWaveRadar";
|
||||
|
||||
bool MillimeterWaveRadar::Init() {
|
||||
uart_config_t uart_config = {
|
||||
.baud_rate = MillimeterWaveRadar::BAUD_RATE,
|
||||
.data_bits = UART_DATA_8_BITS,
|
||||
.parity = UART_PARITY_DISABLE,
|
||||
.stop_bits = UART_STOP_BITS_1,
|
||||
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
|
||||
.source_clk = UART_SCLK_DEFAULT,
|
||||
};
|
||||
|
||||
ESP_ERROR_CHECK(uart_param_config(UART_NUM, &uart_config));
|
||||
ESP_ERROR_CHECK(uart_set_pin(UART_NUM, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
|
||||
ESP_ERROR_CHECK(uart_driver_install(UART_NUM, 256, 0, 0, NULL, 0));
|
||||
|
||||
// 清空缓冲区
|
||||
uart_flush(UART_NUM);
|
||||
return true;
|
||||
}
|
||||
|
||||
uint8_t MillimeterWaveRadar::CalculateChecksum(uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4) {
|
||||
return d1 ^ d2 ^ d3 ^ d4;
|
||||
}
|
||||
|
||||
// 通过查看最高位是0还是1来判断是否是写命令。但是查询感应模式时最高位不是1(5A 11 00 00 00 11 FE),输入的是0x11,所以仅对此条不适用。
|
||||
bool MillimeterWaveRadar::IsWriteCommand(uint8_t cmd) {
|
||||
if (cmd == 0x11) {
|
||||
return false;
|
||||
}
|
||||
return (cmd & 0x80) == 0x00; // 写命令高位为0
|
||||
}
|
||||
|
||||
bool MillimeterWaveRadar::SendFrame(const uint8_t *frame, size_t len) {
|
||||
int written = uart_write_bytes(UART_NUM, frame, len);
|
||||
uart_wait_tx_done(UART_NUM, pdMS_TO_TICKS(10));
|
||||
return written == (int)len;
|
||||
}
|
||||
|
||||
MillimeterWaveRadar::Result MillimeterWaveRadar::ReceiveFrame(uint8_t *buffer, size_t maxSize, size_t &receivedLen) {
|
||||
TickType_t start = xTaskGetTickCount();
|
||||
size_t total = 0;
|
||||
while ((xTaskGetTickCount() - start) < pdMS_TO_TICKS(TIMEOUT_MS)) {
|
||||
size_t available;
|
||||
uart_get_buffered_data_len(UART_NUM, &available);
|
||||
if (available >= 7) {
|
||||
int read = uart_read_bytes(UART_NUM, buffer, 7, pdMS_TO_TICKS(10));
|
||||
if (read == 7) {
|
||||
receivedLen = 7;
|
||||
// 校验帧头尾
|
||||
if (buffer[0] != 0x5A || buffer[6] != 0xFE) {
|
||||
ESP_LOGW(TAG, "Invalid frame header/tail");
|
||||
return Result::CHECKSUM_ERROR;
|
||||
}
|
||||
// 校验 checksum
|
||||
uint8_t expected = CalculateChecksum(buffer[1], buffer[2], buffer[3], buffer[4]);
|
||||
if (expected != buffer[5]) {
|
||||
ESP_LOGW(TAG, "Checksum mismatch");
|
||||
return Result::CHECKSUM_ERROR;
|
||||
}
|
||||
return Result::OK;
|
||||
}
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(1));
|
||||
}
|
||||
return Result::TIMEOUT;
|
||||
}
|
||||
|
||||
MillimeterWaveRadar::Result MillimeterWaveRadar::SetParameter(uint8_t paramId, uint32_t value) {
|
||||
if (!IsWriteCommand(paramId)) {
|
||||
return Result::INVALID_PARAM;
|
||||
}
|
||||
|
||||
uint8_t frame[7];
|
||||
frame[0] = 0x5A;
|
||||
frame[1] = paramId;
|
||||
|
||||
switch (paramId) {
|
||||
case SET_RADAR_DISTANCE_THRESHOLD:
|
||||
if (value < 100 || value > 65000) return Result::INVALID_PARAM;
|
||||
frame[2] = 0x00;
|
||||
frame[3] = (value >> 8) & 0xFF;
|
||||
frame[4] = value & 0xFF;
|
||||
ESP_LOGI(TAG, "Setting distance threshold to %d", static_cast<int>(value));
|
||||
break;
|
||||
case SET_RADAR_DELAY_TIME:
|
||||
if (value > 0xFFFFFF) return Result::INVALID_PARAM;
|
||||
frame[2] = (value >> 16) & 0xFF;
|
||||
frame[3] = (value >> 8) & 0xFF;
|
||||
frame[4] = value & 0xFF;
|
||||
ESP_LOGI(TAG, "Setting delay time to %d", static_cast<int>(value));
|
||||
break;
|
||||
case SET_RADAR_LOCKOUT_TIME:
|
||||
if (value > 0xFFFFFF) return Result::INVALID_PARAM;
|
||||
frame[2] = (value >> 16) & 0xFF;
|
||||
frame[3] = (value >> 8) & 0xFF;
|
||||
frame[4] = value & 0xFF;
|
||||
ESP_LOGI(TAG, "Setting lockout time to %d", static_cast<int>(value));
|
||||
break;
|
||||
case SET_RADAR_LIGHT_SENSOR_ENABLE:
|
||||
case SET_RADAR_OUTPUT_LEVEL:
|
||||
case SET_RADAR_POWER_MODE:
|
||||
case SET_RADAR_TRIGGER_MODE:
|
||||
case SET_RADAR_TX_POWER_LEVEL:
|
||||
case SET_RADAR_PWM_ENABLE:
|
||||
case SET_RADAR_PULSE_WIDTH:
|
||||
case SET_RADAR_SENSING_MODE:
|
||||
case SET_RADAR_SENSING_RESULT:
|
||||
if (value > 0xFF) return Result::INVALID_PARAM;
|
||||
frame[2] = 0x00;
|
||||
frame[3] = 0x00;
|
||||
frame[4] = value & 0xFF;
|
||||
break;
|
||||
case SET_RADAR_LIGHT_THRESHOLD:
|
||||
if (value > 0xFF) return Result::INVALID_PARAM;
|
||||
frame[2] = 0x00;
|
||||
frame[3] = 0x00;
|
||||
frame[4] = value & 0xFF;
|
||||
break;
|
||||
case SET_RADAR_PWM_DUTY:
|
||||
if (value > 3500) return Result::INVALID_PARAM;
|
||||
frame[2] = 0x00;
|
||||
frame[3] = (value >> 8) & 0xFF;
|
||||
frame[4] = value & 0xFF;
|
||||
break;
|
||||
default:
|
||||
return Result::INVALID_PARAM;
|
||||
}
|
||||
|
||||
frame[5] = CalculateChecksum(frame[1], frame[2], frame[3], frame[4]);
|
||||
frame[6] = 0xFE;
|
||||
|
||||
if (!SendFrame(frame, 7)) {
|
||||
return Result::UART_ERROR;
|
||||
}
|
||||
|
||||
uint8_t reply[7];
|
||||
size_t len;
|
||||
Result res = ReceiveFrame(reply, sizeof(reply), len);
|
||||
ESP_LOGW(TAG, "Received raw reply frame: %02X %02X %02X %02X %02X %02X %02X",
|
||||
reply[0], reply[1], reply[2], reply[3], reply[4], reply[5], reply[6]);
|
||||
if (res != Result::OK) return res;
|
||||
|
||||
// 发送保存指令
|
||||
uint8_t saveFrame[7] = {0x5A, 0x20, 0x00, 0x00, 0x01, 0x21, 0xFE};
|
||||
SendFrame(saveFrame, 7);
|
||||
// 等待保存回复(协议注释1:约100ms)
|
||||
vTaskDelay(pdMS_TO_TICKS(110)); // 稍微多等一点
|
||||
uart_flush(UART_NUM); // 清除可能的残留
|
||||
|
||||
return Result::OK;
|
||||
}
|
||||
|
||||
void MillimeterWaveRadar::OnRadarDetect(RadarDetectCallback callback) {
|
||||
ESP_LOGI(TAG, "Registering radar detection callback");
|
||||
radar_detect_callback_ = callback;
|
||||
}
|
||||
|
||||
void MillimeterWaveRadar::TriggerRadarDetectCallback() {
|
||||
ESP_LOGI(TAG, "Triggering radar detection callback");
|
||||
if (radar_detect_callback_) {
|
||||
radar_detect_callback_();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
MillimeterWaveRadar::Result MillimeterWaveRadar::QueryParameter(uint8_t paramId, uint32_t &outputValue) {
|
||||
if (IsWriteCommand(paramId)) {
|
||||
ESP_LOGE(TAG, "Attempted to query with a write command ID: 0x%02X", paramId);
|
||||
return Result::INVALID_PARAM;
|
||||
}
|
||||
|
||||
uint8_t frame[7] = {0x5A, paramId, 0x00, 0x00, 0x00, paramId, 0xFE};
|
||||
ESP_LOGI(TAG, "Sending query frame for param 0x%02X: %02X %02X %02X %02X %02X %02X %02X",
|
||||
paramId, frame[0], frame[1], frame[2], frame[3], frame[4], frame[5], frame[6]);
|
||||
|
||||
if (!SendFrame(frame, 7)) {
|
||||
ESP_LOGE(TAG, "UART send failed");
|
||||
return Result::UART_ERROR;
|
||||
}
|
||||
|
||||
uint8_t reply[7];
|
||||
size_t len;
|
||||
Result res = ReceiveFrame(reply, sizeof(reply), len);
|
||||
if (res != Result::OK) {
|
||||
ESP_LOGW(TAG, "Failed to receive reply for param 0x%02X, error code: %d", paramId, static_cast<int>(res));
|
||||
return res;
|
||||
}
|
||||
|
||||
// 打印原始回复帧(新增功能)
|
||||
ESP_LOGW(TAG, "Received raw reply frame: %02X %02X %02X %02X %02X %02X %02X",
|
||||
reply[0], reply[1], reply[2], reply[3], reply[4], reply[5], reply[6]);
|
||||
|
||||
return Result::OK;
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <driver/uart.h>
|
||||
#include <functional>
|
||||
|
||||
// 参数名称宏定义(对应协议中的命令)
|
||||
#define SET_RADAR_DISTANCE_THRESHOLD 0x01 // 设置感应距离门限值。Data3、Data4 为感应距离门限值,取值范围为 100 ~ 65000【值越大,感应距离越近】
|
||||
#define SET_RADAR_DELAY_TIME 0x02 // 设置输出延时时间。取值范围为 0X00~ 0XFFFFFF
|
||||
#define SET_RADAR_LIGHT_SENSOR_ENABLE 0x03 // 开关光感。Data4 为 0x01 时开启光感,为 0x00 时关闭光感。
|
||||
#define SET_RADAR_LOCKOUT_TIME 0x04 // 设置封锁时间。取值范围为 0X00~ 0XFFFFFF
|
||||
#define SET_RADAR_OUTPUT_LEVEL 0x05 // 设置有效电平。Data4 为 0x01 时高电平有效,为 0x00 时低电平有效
|
||||
#define SET_RADAR_POWER_MODE 0x06 // 设置功耗模式。Data4 为 0x00 时超低功耗模式(50/60uA),为 0x01 时常规功耗模式(13mA 档位)
|
||||
#define SET_RADAR_SENSING_RESULT 0x07 // 设置触发状态。Data4 为 0x00 时触发状态为未触发感应,为 0x01 时触发状态为已触发感应。
|
||||
#define SET_RADAR_TRIGGER_MODE 0x0A // 设置触发模式。Data4 为 0x00 时触发模式为连续触发,为 0x01 时触发模式为单次触发。
|
||||
#define SET_RADAR_TX_POWER_LEVEL 0x0B // 设置发射功率档位。Data4 取值范围为 0~ 7,总共 8 档发射功率可调,值越大,功率越小,=7 时最小,相当于关闭发射功率。发射功率档位值越小,实际发射功率越大,距离越远,抗干扰性越好。
|
||||
#define SET_RADAR_LIGHT_THRESHOLD 0x0C // 设置光感门限值。取值范围为 0X00~ 0XFFFFFF。
|
||||
#define SET_RADAR_PWM_ENABLE 0x0D // 开关 PWM 功能
|
||||
#define SET_RADAR_PWM_DUTY 0x0E // 设置 PWM 占空比
|
||||
#define SET_RADAR_PULSE_WIDTH 0x0F // 设置供电脉冲宽度
|
||||
#define SET_RADAR_SENSING_MODE 0x10 // 选择感应模式。Data4 为 0x00 时为移动感应模式,为 0x01 时为手扫感应模式。
|
||||
|
||||
// 参数名称宏定义(对应协议中的命令)
|
||||
#define QUERY_RADAR_DISTANCE_THRESHOLD 0x81 // 查询感应距离门限值
|
||||
#define QUERY_RADAR_DELAY_TIME 0x82 // 查询输出延时时间
|
||||
#define QUERY_RADAR_LIGHT_SENSOR_ENABLE 0x83 // 查询开关光感
|
||||
#define QUERY_RADAR_LOCKOUT_TIME 0x84 // 查询封锁时间
|
||||
#define QUERY_RADAR_OUTPUT_LEVEL 0x85 // 查询有效电平
|
||||
#define QUERY_RADAR_POWER_MODE 0x86 // 查询功耗模式
|
||||
#define QUERY_RADAR_SENSING_RESULT 0x87 // 查询触发状态
|
||||
#define QUERY_RADAR_TRIGGER_MODE 0x8A // 查询触发模式
|
||||
#define QUERY_RADAR_TX_POWER_LEVEL 0x8B // 查询发射功率档位
|
||||
#define QUERY_RADAR_LIGHT_THRESHOLD 0x8C // 查询光感门限值
|
||||
#define QUERY_RADAR_PWM_ENABLE 0x8D // 查询开关 PWM 功能
|
||||
#define QUERY_RADAR_PWM_DUTY 0x8E // 查询 PWM 占空比
|
||||
#define QUERY_RADAR_PULSE_WIDTH 0x8F // 查询供电脉冲宽度
|
||||
#define QUERY_RADAR_SENSING_MODE 0x11 // 查询感应模式
|
||||
|
||||
class MillimeterWaveRadar {
|
||||
public:
|
||||
// 雷达检测回调函数类型定义
|
||||
typedef std::function<void(void)> RadarDetectCallback;
|
||||
enum class Result {
|
||||
OK,
|
||||
TIMEOUT,
|
||||
CHECKSUM_ERROR,
|
||||
INVALID_PARAM,
|
||||
UART_ERROR
|
||||
};
|
||||
|
||||
// 初始化 UART(使用 UART1, TX=GPIO39, RX=GPIO40)
|
||||
bool Init();
|
||||
|
||||
// 设置参数(自动保存)
|
||||
Result SetParameter(uint8_t paramId, uint32_t value);
|
||||
|
||||
// 查询参数(返回值通过 outputValue 返回)
|
||||
Result QueryParameter(uint8_t paramId, uint32_t &outputValue);
|
||||
|
||||
Result QueryRawResponse(uint8_t paramId);
|
||||
|
||||
// 注册雷达检测回调函数
|
||||
void OnRadarDetect(RadarDetectCallback callback);
|
||||
|
||||
// 触发雷达检测回调函数(供IO扩展板调用)
|
||||
void TriggerRadarDetectCallback();
|
||||
|
||||
private:
|
||||
static constexpr uart_port_t UART_NUM = UART_NUM_1;
|
||||
static constexpr int TX_PIN = 39;
|
||||
static constexpr int RX_PIN = 40;
|
||||
static constexpr uint32_t BAUD_RATE = 9600;
|
||||
static constexpr uint32_t TIMEOUT_MS = 100;
|
||||
|
||||
// 雷达检测回调函数
|
||||
RadarDetectCallback radar_detect_callback_ = nullptr;
|
||||
|
||||
bool SendFrame(const uint8_t *frame, size_t len);
|
||||
Result ReceiveFrame(uint8_t *buffer, size_t maxSize, size_t &receivedLen);
|
||||
uint8_t CalculateChecksum(uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4);
|
||||
bool IsWriteCommand(uint8_t cmd);
|
||||
};
|
||||
@@ -0,0 +1,16 @@
|
||||
# main/05_executors/millimeter_wave_radar/module.cmake
|
||||
|
||||
|
||||
# 判断 menuconfig 中的开关
|
||||
if(NOT CONFIG_ENABLE_EXEC_MILLIMETER_WAVE_RADAR AND NOT EARLY_EXPANSION)
|
||||
message(STATUS " [Skip] millimeter_wave_radar module disabled by menuconfig.")
|
||||
return()
|
||||
endif()
|
||||
|
||||
list(APPEND MODULE_SRCS
|
||||
"05_executors/millimeter_wave_radar/millimeter_wave_radar.cc"
|
||||
)
|
||||
|
||||
list(APPEND MODULE_INCLUDE_DIRS
|
||||
"05_executors/millimeter_wave_radar"
|
||||
)
|
||||
Reference in new issue
Block a user