240 lines
6.4 KiB
C
240 lines
6.4 KiB
C
/**
|
|
******************************************************************************
|
|
* @file rf433_tx_app.c
|
|
* @brief RF433 TX应用层实现
|
|
******************************************************************************
|
|
*/
|
|
|
|
#include "rf433_config.h"
|
|
|
|
#if (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH)
|
|
|
|
#include "rf433_tx_app.h"
|
|
#include "rf433.h"
|
|
#include "main.h"
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
/* ============================================================================
|
|
* 私有变量
|
|
* ============================================================================ */
|
|
|
|
static rf433_tx_app_t g_tx_app = {0};
|
|
|
|
/* ============================================================================
|
|
* 私有函数声明
|
|
* ============================================================================ */
|
|
|
|
/**
|
|
* @brief 构造数据包
|
|
* @param buffer 数据包缓冲区
|
|
* @param buffer_size 缓冲区大小
|
|
* @param total_count 总次数
|
|
* @param current_count 当前序号
|
|
* @return 实际数据包长度
|
|
*/
|
|
static uint16_t tx_build_packet(uint8_t *buffer, uint16_t buffer_size,
|
|
uint32_t total_count, uint32_t current_count);
|
|
|
|
/**
|
|
* @brief 控制LED_TX指示灯
|
|
* @param state 0: 关闭, 1: 打开
|
|
*/
|
|
static void tx_led_control(uint8_t state);
|
|
|
|
/* ============================================================================
|
|
* 私有函数实现
|
|
* ============================================================================ */
|
|
|
|
static uint16_t tx_build_packet(uint8_t *buffer, uint16_t buffer_size,
|
|
uint32_t total_count, uint32_t current_count)
|
|
{
|
|
if (buffer == NULL || buffer_size < 16) {
|
|
return 0;
|
|
}
|
|
|
|
// 数据包格式: "TX.总次数.当前序号."
|
|
// 例如: "TX.010.001."
|
|
int len = snprintf((char *)buffer, buffer_size, "TX.%03lu.%03lu.",
|
|
total_count, current_count);
|
|
|
|
return (len > 0) ? (uint16_t)len : 0;
|
|
}
|
|
|
|
static void tx_led_control(uint8_t state)
|
|
{
|
|
// LED_TX控制 - 使用gpio.c中定义的函数
|
|
if (state) {
|
|
gpio_led_tx_on(); // 打开LED_TX
|
|
} else {
|
|
gpio_led_tx_off(); // 关闭LED_TX
|
|
}
|
|
}
|
|
|
|
/* ============================================================================
|
|
* 公共API实现
|
|
* ============================================================================ */
|
|
|
|
rf433_error_t rf433_tx_app_init(const rf433_register_t *config)
|
|
{
|
|
if (config == NULL) {
|
|
return RF433_ERROR;
|
|
}
|
|
|
|
// 初始化TX应用结构体
|
|
memset(&g_tx_app, 0, sizeof(rf433_tx_app_t));
|
|
g_tx_app.state = TX_STATE_INIT;
|
|
g_tx_app.is_running = false;
|
|
|
|
// 保存配置
|
|
memcpy(&g_tx_app.config, config, sizeof(rf433_register_t));
|
|
|
|
// 配置RF433模块
|
|
rf433_error_t ret = rf433_set_config(&g_tx_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_tx_app_start(uint32_t count, uint32_t interval_ms)
|
|
{
|
|
if (count == 0 || interval_ms == 0) {
|
|
return RF433_ERROR;
|
|
}
|
|
|
|
g_tx_app.total_count = count;
|
|
g_tx_app.send_count = 0;
|
|
g_tx_app.send_interval_ms = interval_ms;
|
|
g_tx_app.last_send_time = 0;
|
|
g_tx_app.state = TX_STATE_INIT;
|
|
g_tx_app.is_running = true;
|
|
|
|
return RF433_OK;
|
|
}
|
|
|
|
rf433_error_t rf433_tx_app_stop(void)
|
|
{
|
|
g_tx_app.is_running = false;
|
|
g_tx_app.state = TX_STATE_IDLE;
|
|
tx_led_control(0);
|
|
|
|
return RF433_OK;
|
|
}
|
|
|
|
rf433_error_t rf433_tx_app_manual_send(uint8_t *data, uint16_t length)
|
|
{
|
|
if (data == NULL || length == 0) {
|
|
return RF433_ERROR;
|
|
}
|
|
|
|
// 发送数据
|
|
rf433_error_t ret = rf433_transmit(data, length);
|
|
if (ret == RF433_OK) {
|
|
// LED闪烁指示
|
|
tx_led_control(1);
|
|
HAL_Delay(50);
|
|
tx_led_control(0);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void rf433_tx_app_task(void)
|
|
{
|
|
if (!g_tx_app.is_running) {
|
|
return;
|
|
}
|
|
|
|
uint32_t current_time = HAL_GetTick();
|
|
|
|
switch (g_tx_app.state) {
|
|
case TX_STATE_INIT:
|
|
// 初始化完成,进入发送状态
|
|
g_tx_app.state = TX_STATE_SENDING;
|
|
break;
|
|
|
|
case TX_STATE_SENDING:
|
|
// 检查是否达到发送次数
|
|
if (g_tx_app.send_count >= g_tx_app.total_count) {
|
|
g_tx_app.state = TX_STATE_IDLE;
|
|
tx_led_control(0);
|
|
break;
|
|
}
|
|
|
|
// 检查发送间隔
|
|
if (current_time - g_tx_app.last_send_time >= g_tx_app.send_interval_ms) {
|
|
// 构造数据包
|
|
uint8_t packet[32];
|
|
uint16_t packet_len = tx_build_packet(packet, sizeof(packet),
|
|
g_tx_app.total_count,
|
|
g_tx_app.send_count + 1);
|
|
|
|
if (packet_len > 0) {
|
|
// 发送数据
|
|
rf433_error_t ret = rf433_transmit(packet, packet_len);
|
|
if (ret == RF433_OK) {
|
|
g_tx_app.send_count++;
|
|
g_tx_app.last_send_time = current_time;
|
|
|
|
// LED闪烁指示
|
|
tx_led_control(1);
|
|
HAL_Delay(50);
|
|
tx_led_control(0);
|
|
}
|
|
}
|
|
|
|
g_tx_app.state = TX_STATE_WAITING;
|
|
}
|
|
break;
|
|
|
|
case TX_STATE_WAITING:
|
|
// 等待一段时间后继续发送
|
|
if (current_time - g_tx_app.last_send_time >= g_tx_app.send_interval_ms) {
|
|
g_tx_app.state = TX_STATE_SENDING;
|
|
}
|
|
break;
|
|
|
|
case TX_STATE_IDLE:
|
|
// 空闲状态,不做任何操作
|
|
break;
|
|
|
|
default:
|
|
g_tx_app.state = TX_STATE_IDLE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
tx_state_t rf433_tx_app_get_state(void)
|
|
{
|
|
return g_tx_app.state;
|
|
}
|
|
|
|
uint32_t rf433_tx_app_get_send_count(void)
|
|
{
|
|
return g_tx_app.send_count;
|
|
}
|
|
|
|
uint32_t rf433_tx_app_get_total_count(void)
|
|
{
|
|
return g_tx_app.total_count;
|
|
}
|
|
|
|
void rf433_tx_app_reset_count(void)
|
|
{
|
|
g_tx_app.send_count = 0;
|
|
g_tx_app.last_send_time = 0;
|
|
if (g_tx_app.is_running) {
|
|
g_tx_app.state = TX_STATE_SENDING;
|
|
}
|
|
}
|
|
|
|
#endif /* (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH) */
|