Files
433_STM32/Core/Src/rf433_rx_app.c

239 lines
6.5 KiB
C
Raw Normal View History

/**
******************************************************************************
* @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) */