/** ****************************************************************************** * @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 #include #include "uart2_print.h" #define DEBUG_CMD_PARSER 1 #if DEBUG_CMD_PARSER #define DEBUG_LOG(fmt, ...) UART2_Print_Printf("[CMD] " fmt "\r\n", ##__VA_ARGS__) #else #define DEBUG_LOG(fmt, ...) #endif /* ============================================================================ * 私有变量 * ============================================================================ */ 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) */