Files
433_STM32/Core/Src/rf433_rx_app.c

239 lines
6.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @file rf433_rx_app.c
* @brief RF433 RX应用层实现
******************************************************************************
*/
#include "rf433_config.h"
#if (RF433_MODE == RF433_MODE_RX) || (RF433_MODE == RF433_MODE_BOTH)
#include "rf433_rx_app.h"
#include "rf433.h"
#include "rf433_hal.h"
#include "main.h"
#include <stdio.h>
#include <string.h>
/* ============================================================================
* 私有变量
* ============================================================================ */
static rf433_rx_app_t g_rx_app = {0};
/* ============================================================================
* 私有函数声明
* ============================================================================ */
/**
* @brief 控制LED_RX指示灯
* @param state 0: 关闭, 1: 打开
*/
static void rx_led_control(uint8_t state);
/**
* @brief 更新丢包统计
*/
static void rx_update_stats(void);
/* ============================================================================
* 私有函数实现
* ============================================================================ */
static void rx_led_control(uint8_t state)
{
// LED_RX控制 - 使用gpio.c中定义的函数
if (state) {
gpio_led_rx_on(); // 打开LED_RX
} else {
gpio_led_rx_off(); // 关闭LED_RX
}
}
static void rx_update_stats(void)
{
// 计算丢包数
if (g_rx_app.tx_number_record > 0) {
g_rx_app.stats.lost_packets = g_rx_app.tx_number_record - g_rx_app.stats.total_received;
// 计算丢包率
if (g_rx_app.tx_number_record > 0) {
g_rx_app.stats.lost_percent = (uint8_t)((g_rx_app.stats.lost_packets * 100) / g_rx_app.tx_number_record);
} else {
g_rx_app.stats.lost_percent = 0;
}
}
}
/* ============================================================================
* 公共API实现
* ============================================================================ */
rf433_error_t rf433_rx_app_init(const rf433_register_t *config)
{
if (config == NULL) {
return RF433_ERROR;
}
// 初始化RX应用结构体
memset(&g_rx_app, 0, sizeof(rf433_rx_app_t));
g_rx_app.state = RX_STATE_INIT;
g_rx_app.is_running = false;
// 保存配置
memcpy(&g_rx_app.config, config, sizeof(rf433_register_t));
// 配置RF433模块
rf433_error_t ret = rf433_set_config(&g_rx_app.config);
if (ret != RF433_OK) {
return ret;
}
// 设置为透明传输模式
ret = rf433_set_work_mode(RF433_WORK_MODE_TRANSPARENT);
if (ret != RF433_OK) {
return ret;
}
return RF433_OK;
}
rf433_error_t rf433_rx_app_start(void)
{
// 启动RF433接收
rf433_error_t ret = rf433_rx_start();
if (ret != RF433_OK) {
return ret;
}
g_rx_app.state = RX_STATE_RECEIVING;
g_rx_app.is_running = true;
return RF433_OK;
}
rf433_error_t rf433_rx_app_stop(void)
{
// 停止RF433接收
rf433_rx_stop();
g_rx_app.is_running = false;
g_rx_app.state = RX_STATE_IDLE;
rx_led_control(0);
return RF433_OK;
}
void rf433_rx_app_task(void)
{
if (!g_rx_app.is_running) {
return;
}
switch (g_rx_app.state) {
case RX_STATE_INIT:
// 初始化完成,进入接收状态
g_rx_app.state = RX_STATE_RECEIVING;
break;
case RX_STATE_RECEIVING:
// 尝试接收数据(使用与原始代码相同的接收机制)
{
uint8_t buffer[64];
uint32_t actual_len = 0;
// 使用uart1_check_rx_done检查接收完成与原始代码一致
if (uart1_check_rx_done(buffer, &actual_len)) {
// 解析数据包
uint32_t tx_total = 0;
uint32_t tx_current = 0;
rf433_error_t ret = rf433_rx_app_parse_packet(buffer, (uint16_t)actual_len, &tx_total, &tx_current);
if (ret == RF433_OK) {
// 更新统计信息
g_rx_app.stats.total_received++;
g_rx_app.tx_total_number = tx_total;
g_rx_app.tx_current_number = tx_current;
// 更新TX序号记录
if (tx_current > g_rx_app.tx_number_record) {
g_rx_app.tx_number_record = tx_current;
}
// 更新丢包统计
rx_update_stats();
// LED闪烁指示
rx_led_control(1);
HAL_Delay(50);
rx_led_control(0);
}
}
}
break;
case RX_STATE_IDLE:
// 空闲状态,不做任何操作
break;
default:
g_rx_app.state = RX_STATE_IDLE;
break;
}
}
rx_state_t rf433_rx_app_get_state(void)
{
return g_rx_app.state;
}
rf433_error_t rf433_rx_app_get_stats(rf433_rx_stats_t *stats)
{
if (stats == NULL) {
return RF433_ERROR;
}
memcpy(stats, &g_rx_app.stats, sizeof(rf433_rx_stats_t));
return RF433_OK;
}
void rf433_rx_app_reset_stats(void)
{
memset(&g_rx_app.stats, 0, sizeof(rf433_rx_stats_t));
g_rx_app.tx_current_number = 0;
g_rx_app.tx_total_number = 0;
g_rx_app.tx_number_record = 0;
}
rf433_error_t rf433_rx_app_parse_packet(const uint8_t *packet_buf, uint16_t length,
uint32_t *tx_total, uint32_t *tx_current)
{
if (packet_buf == NULL || length == 0 || tx_total == NULL || tx_current == NULL) {
return RF433_ERROR;
}
// 数据包格式: "TX.总次数.当前序号."
// 例如: "TX.010.001." 或 "TX.100.100."
// 参考原始代码application.c中的rx_analysis函数
// 检查最小长度原始代码要求至少10字节
if (length < 10) {
return RF433_ERROR;
}
// 检查前缀 "TX"
if (packet_buf[0] != 'T' || packet_buf[1] != 'X') {
return RF433_ERROR;
}
// 使用sscanf解析数据包与原始代码一致
// 从buffer+3开始解析跳过"TX."
sscanf((char*)(packet_buf + 3), "%d.%d.", tx_total, tx_current);
return RF433_OK;
}
#endif /* (RF433_MODE == RF433_MODE_RX) || (RF433_MODE == RF433_MODE_BOTH) */