2025-12-03 10:44:14 +08:00
|
|
|
|
#include "task_func.h"
|
|
|
|
|
|
#include "./nvs/nvs.h"
|
2025-12-02 16:25:20 +08:00
|
|
|
|
#include "timer.h"
|
|
|
|
|
|
#include "system/includes.h"
|
2025-12-03 15:11:15 +08:00
|
|
|
|
#include "user_cfg.h"
|
2025-12-02 16:25:20 +08:00
|
|
|
|
#include "earphone.h" // 宏定义 EARPHONE_STATE_...
|
2025-12-03 15:11:15 +08:00
|
|
|
|
#include "ble_user.h"
|
|
|
|
|
|
#include "le_client_demo.h"
|
|
|
|
|
|
#include "le_common.h"
|
|
|
|
|
|
#include "./ble_handler/client_handler.h"
|
2025-12-02 16:25:20 +08:00
|
|
|
|
// =================================================================================
|
|
|
|
|
|
// 宏定义与日志
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
|
|
|
|
|
|
#define RC_LOG_ENABLE 1
|
|
|
|
|
|
#if RC_LOG_ENABLE
|
|
|
|
|
|
#define rc_log(format, ...) printf("[RC_APP] " format, ##__VA_ARGS__)
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define rc_log(format, ...)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
// 外部函数声明
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
extern void TYPE_V_EVENT(char* uid);
|
2025-12-03 10:44:14 +08:00
|
|
|
|
extern void TYPE_A_EVENT(char* uid);
|
2025-12-02 16:25:20 +08:00
|
|
|
|
// =================================================================================
|
|
|
|
|
|
// 静态函数声明
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
|
|
|
|
|
|
static RFID_Device_Type_t get_rfid_device_type(const u8* uid);
|
|
|
|
|
|
|
|
|
|
|
|
// BLE 状态转换的辅助函数
|
|
|
|
|
|
static void rc_ble_state_set_connecting(void);
|
|
|
|
|
|
static void rc_ble_state_set_connected(void);
|
|
|
|
|
|
static void rc_ble_state_set_disconnected(void);
|
|
|
|
|
|
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
// 全局变量
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
|
|
|
|
|
|
static RC_Context_t g_rc_context; // 全局上下文实例
|
|
|
|
|
|
static u16 g_rfid_timer_id = 0; // RFID 定时器ID
|
|
|
|
|
|
static u16 g_ble_timer_id = 0; // BLE 定时器ID
|
2025-12-03 15:11:15 +08:00
|
|
|
|
static u8 current_board_mac[MAIN_BOARD_MAC_ADDR_LENGTH] = {0}; //当前连接主板的名称 -- mac
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-12-02 16:25:20 +08:00
|
|
|
|
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
// 核心回调函数 (Core Callback Handlers)
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief RFID回调处理函数 (由定时器周期性调用)
|
|
|
|
|
|
*/
|
|
|
|
|
|
void rc_rfid_callback_handler(void *priv)
|
|
|
|
|
|
{
|
|
|
|
|
|
u8 uid[UID_LENGTH] = {0};
|
|
|
|
|
|
|
2025-12-03 10:44:14 +08:00
|
|
|
|
//读id卡
|
|
|
|
|
|
// TYPE_V_EVENT((char *)uid);
|
|
|
|
|
|
TYPE_A_EVENT((char *)uid);
|
|
|
|
|
|
|
|
|
|
|
|
//是否有rfid卡靠近
|
2025-12-02 16:25:20 +08:00
|
|
|
|
u8 is_new_data = 0;
|
|
|
|
|
|
for (int i = 0; i < UID_LENGTH; i++) {
|
|
|
|
|
|
if (uid[i] != 0x00) {
|
|
|
|
|
|
is_new_data = 1;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!is_new_data) {
|
2025-12-03 10:44:14 +08:00
|
|
|
|
return; //没有rfid卡靠近,返回
|
2025-12-02 16:25:20 +08:00
|
|
|
|
}
|
2025-12-03 15:11:15 +08:00
|
|
|
|
|
2025-12-02 16:25:20 +08:00
|
|
|
|
|
|
|
|
|
|
rc_log("New RFID card detected.\n");
|
|
|
|
|
|
|
|
|
|
|
|
RFID_Device_Type_t device_type = get_rfid_device_type(uid);
|
2025-12-03 15:11:15 +08:00
|
|
|
|
|
2025-12-02 16:25:20 +08:00
|
|
|
|
switch (device_type) {
|
2025-12-03 10:44:14 +08:00
|
|
|
|
case RFID_DEVICE_TYPE_MAIN_BOARD: //船主板上的rfid卡
|
2025-12-03 15:11:15 +08:00
|
|
|
|
if(strncmp(uid, current_board_mac, UID_LENGTH) == 0){
|
|
|
|
|
|
// 扫到的rfid卡的uid和当前连接的主板mac相同
|
|
|
|
|
|
return;
|
2025-12-02 16:25:20 +08:00
|
|
|
|
}
|
2025-12-03 15:11:15 +08:00
|
|
|
|
//扫到新的主板
|
|
|
|
|
|
rc_log("Device is Main Board. Storing MAC...\n");
|
2025-12-02 16:25:20 +08:00
|
|
|
|
// 将新的MAC地址写入Flash
|
2025-12-03 15:11:15 +08:00
|
|
|
|
nvs_write_main_board_mac(uid);
|
|
|
|
|
|
|
|
|
|
|
|
// memset(current_board_mac, uid, sizeof(current_board_mac));
|
|
|
|
|
|
|
|
|
|
|
|
// TODO:发送指令,让主板断开经典蓝牙连接
|
2025-12-10 17:40:26 +08:00
|
|
|
|
// TODO: 切断BLE
|
2025-12-03 15:11:15 +08:00
|
|
|
|
|
|
|
|
|
|
// g_ble_connect_new_device(current_board_mac); //连接新主板
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-12-02 16:25:20 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
2025-12-10 17:40:26 +08:00
|
|
|
|
case RFID_DEVICE_TYPE_REMOTE_CONTROL: //扫的是遥控器
|
2025-12-02 16:25:20 +08:00
|
|
|
|
rc_log("Device is another Remote Control.\n");
|
2025-12-10 17:40:26 +08:00
|
|
|
|
if(g_rc_context.team != TEAM_YES){
|
|
|
|
|
|
nvs_clear_info(); //清楚nfc数据
|
|
|
|
|
|
return; //非组队状态
|
|
|
|
|
|
}
|
2025-12-03 15:11:15 +08:00
|
|
|
|
if (g_ble_get_state() == BLE_ST_NOTIFY_IDICATE) {
|
2025-12-02 16:25:20 +08:00
|
|
|
|
rc_log("Sending teaming request to main board...\n");
|
2025-12-03 15:11:15 +08:00
|
|
|
|
//TODO:
|
|
|
|
|
|
//向主板发送新的遥控器rfid uid
|
2025-12-02 16:25:20 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
rc_log("Not connected to main board, ignoring teaming request.\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
rc_log("Unknown RFID device type.\n");
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2025-12-03 15:11:15 +08:00
|
|
|
|
* @brief BLE回调处理函数 (由定时器周期性调用)s
|
2025-12-02 16:25:20 +08:00
|
|
|
|
*/
|
|
|
|
|
|
void rc_ble_callback_handler(void *priv)
|
|
|
|
|
|
{
|
2025-12-09 13:05:51 +08:00
|
|
|
|
u8 read_uid[UID_LENGTH] = {0};
|
2025-12-03 15:11:15 +08:00
|
|
|
|
nvs_read_main_board_mac(read_uid); //读nvs
|
2025-12-02 16:25:20 +08:00
|
|
|
|
|
2025-12-03 15:11:15 +08:00
|
|
|
|
//读到的是当前连接的主板uid
|
|
|
|
|
|
if((strncmp(read_uid, current_board_mac, UID_LENGTH) == 0) && g_ble_get_state()){
|
|
|
|
|
|
return;
|
2025-12-02 16:25:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-03 15:11:15 +08:00
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// bool is_connected = ble_hid_is_connected();
|
|
|
|
|
|
|
|
|
|
|
|
// // 状态机转换
|
|
|
|
|
|
// if (is_connected && g_rc_context.state != RC_STATE_CONNECTED) {
|
|
|
|
|
|
// rc_ble_state_set_connected();
|
|
|
|
|
|
// } else if (!is_connected && g_rc_context.state != RC_STATE_DISCONNECTED) {
|
|
|
|
|
|
// rc_ble_state_set_disconnected();
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// // 状态机行为
|
|
|
|
|
|
// switch (g_rc_context.state) {
|
|
|
|
|
|
// case RC_STATE_DISCONNECTED:
|
|
|
|
|
|
// {
|
|
|
|
|
|
// u8 target_mac[MAC_ADDR_LENGTH] = {0};
|
|
|
|
|
|
// // 检查Flash中是否有已配对的MAC
|
|
|
|
|
|
// if (nvs_read_main_board_mac(target_mac) > 0) {
|
|
|
|
|
|
// rc_log("Found paired MAC. Start scanning...\n");
|
|
|
|
|
|
// // 启动扫描和连接。SDK的HID实现会自动连接到已配对的设备。
|
|
|
|
|
|
// EARPHONE_STATE_SET_PAGE_SCAN_ENABLE();
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// rc_log("No paired MAC found. Waiting for RFID pairing...\n");
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
|
|
|
|
// case RC_STATE_CONNECTING:
|
|
|
|
|
|
// // 在这个状态下,我们只是等待 is_connected 变为 true
|
|
|
|
|
|
// rc_log("Waiting for connection result...\n");
|
|
|
|
|
|
// break;
|
|
|
|
|
|
|
|
|
|
|
|
// case RC_STATE_CONNECTED:
|
|
|
|
|
|
// // 已连接,目前无需周期性操作
|
|
|
|
|
|
// // rc_log("BLE is connected.\n");
|
|
|
|
|
|
// break;
|
2025-12-02 16:25:20 +08:00
|
|
|
|
|
2025-12-03 15:11:15 +08:00
|
|
|
|
// default:
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// }
|
2025-12-02 16:25:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 根据UID前缀判断设备类型
|
|
|
|
|
|
*/
|
|
|
|
|
|
static RFID_Device_Type_t get_rfid_device_type(const u8* uid)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (uid == NULL) {
|
|
|
|
|
|
return RFID_DEVICE_TYPE_UNKNOWN;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 根据 RC_app_main.h 中定义的UID前缀进行判断
|
|
|
|
|
|
if (uid[0] == UID_PREFIX_MAIN_BOARD) {
|
|
|
|
|
|
return RFID_DEVICE_TYPE_MAIN_BOARD;
|
|
|
|
|
|
} else if (uid[0] == UID_PREFIX_REMOTE_CONTROL) {
|
|
|
|
|
|
return RFID_DEVICE_TYPE_REMOTE_CONTROL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return RFID_DEVICE_TYPE_UNKNOWN;
|
|
|
|
|
|
}
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
// 辅助函数 (Helper Functions)
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 进入 CONNECTING 状态的逻辑
|
|
|
|
|
|
*/
|
|
|
|
|
|
static void rc_ble_state_set_connecting(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
rc_log("State transition to -> CONNECTING\n");
|
|
|
|
|
|
g_rc_context.state = RC_STATE_CONNECTING;
|
|
|
|
|
|
// 可以在这里控制LED灯效,例如黄灯呼吸闪烁
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 进入 CONNECTED 状态的逻辑
|
|
|
|
|
|
*/
|
|
|
|
|
|
static void rc_ble_state_set_connected(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
rc_log("State transition to -> CONNECTED\n");
|
|
|
|
|
|
g_rc_context.state = RC_STATE_CONNECTED;
|
|
|
|
|
|
// 停止扫描以省电
|
|
|
|
|
|
EARPHONE_STATE_CANCEL_PAGE_SCAN();
|
|
|
|
|
|
|
|
|
|
|
|
// 发送指令,要求主板连接遥控器的经典蓝牙
|
|
|
|
|
|
u8 classic_conn_req_payload[] = {0x01, 0x02, 0x03};
|
|
|
|
|
|
rc_log("Sending request for classic BT connection.\n");
|
|
|
|
|
|
ble_hid_data_send(0xFE, classic_conn_req_payload, sizeof(classic_conn_req_payload));
|
|
|
|
|
|
|
|
|
|
|
|
// 在这里控制LED灯效,例如蓝灯呼吸闪烁三次后熄灭
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 进入 DISCONNECTED 状态的逻辑
|
|
|
|
|
|
*/
|
|
|
|
|
|
static void rc_ble_state_set_disconnected(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
rc_log("State transition to -> DISCONNECTED\n");
|
|
|
|
|
|
g_rc_context.state = RC_STATE_DISCONNECTED;
|
|
|
|
|
|
// 在这里控制LED灯效,例如黄灯呼吸闪烁
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化函数 (Initialization Function)
|
|
|
|
|
|
// =================================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 遥控器应用主初始化函数
|
|
|
|
|
|
*/
|
|
|
|
|
|
void rc_app_main_init(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
rc_log("Initializing Remote Control App...\n");
|
|
|
|
|
|
|
|
|
|
|
|
// 1. 初始化全局上下文
|
|
|
|
|
|
memset(&g_rc_context, 0, sizeof(RC_Context_t));
|
|
|
|
|
|
g_rc_context.state = RC_STATE_DISCONNECTED; // 初始状态为未连接
|
2025-12-10 17:40:26 +08:00
|
|
|
|
g_rc_context.team = TEAM_NO;
|
|
|
|
|
|
FM176XX_HardInit();
|
2025-12-02 16:25:20 +08:00
|
|
|
|
|
|
|
|
|
|
// 2. 检查并启动RFID处理定时器
|
|
|
|
|
|
if (g_rfid_timer_id == 0) {
|
|
|
|
|
|
g_rfid_timer_id = sys_timer_add(NULL, rc_rfid_callback_handler, RC_RFID_CALLBACK_INTERVAL_MS);
|
|
|
|
|
|
rc_log("RFID handler timer started (ID: %d).\n", g_rfid_timer_id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 检查并启动BLE处理定时器
|
|
|
|
|
|
if (g_ble_timer_id == 0) {
|
|
|
|
|
|
g_ble_timer_id = sys_timer_add(NULL, rc_ble_callback_handler, RC_BLE_CALLBACK_INTERVAL_MS);
|
|
|
|
|
|
rc_log("BLE handler timer started (ID: %d).\n", g_ble_timer_id);
|
|
|
|
|
|
}
|
2025-12-09 13:05:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//test
|
|
|
|
|
|
#define TEST_FUNCTION 1
|
|
|
|
|
|
void test_task(void){
|
2025-12-10 17:40:26 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-12-09 13:05:51 +08:00
|
|
|
|
#if TEST_FUNCTION == 1
|
2025-12-10 17:40:26 +08:00
|
|
|
|
FM176XX_HardInit();
|
2025-12-09 13:05:51 +08:00
|
|
|
|
while(1){
|
|
|
|
|
|
u8 uid[UID_LENGTH] = {0};
|
|
|
|
|
|
//读id卡
|
|
|
|
|
|
TYPE_V_EVENT((char *)uid);
|
|
|
|
|
|
// TYPE_A_EVENT((char *)uid);
|
|
|
|
|
|
|
2025-12-10 17:40:26 +08:00
|
|
|
|
os_time_dly(100);
|
2025-12-09 13:05:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
void test_func_main(void){
|
|
|
|
|
|
#if TEST_FUNCTION == 1
|
|
|
|
|
|
os_task_create(test_task, NULL, 1, 1024, 128, "rfid_test");
|
|
|
|
|
|
#endif
|
2025-12-02 16:25:20 +08:00
|
|
|
|
}
|