Files
JBao_Sprayer_FW/apps/usr_jb_proto/usr_jb_main.c
T
wuchuyuan 0dd65e1552 1、喷淋器 P1/P2功能实现
2、红灯按连接态慢闪
2026-09-09 19:57:00 +08:00

164 lines
5.8 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 usr_jb_main.c
* @brief CBR2 业务组合根:只编排调用顺序(20ms tick + 500ms loop
* @author cyWu <1917507415@qq.com>
* @date 2026.09.09
* @version V1.0.0
* @history
* - V1.0.0, 2026.09.09, cyWu, P0 组合根(对齐加热垫框架,删过零/继电器)
*
* @note jb_product.c 不写业务。20ms tick 禁止写 VM / 切 BLE
* 配对、OTA、落盘在 500ms usr_timer_loop(任务上下文)。
******************************************************************************/
#include "system/includes.h"
#include "app_config.h"
#include "app_main.h"
#include "app_task.h"
#include "user_cfg.h"
#include "jb_protocol.h"
#include "jb_product.h"
#include "jb_ringbuffer.h"
#include "jb_common.h"
#include "usr_le_product.h"
#include "usr_le_api.h"
#include "bsp_hw.h"
#include "app_pair.h"
#include "app_function.h"
#include "app_led.h"
#include "app_pump.h"
#include "app_spray.h"
#include "app_nvm.h"
#include "app_arbiter.h"
#include "app_th_scan.h"
#include "app_linkage.h"
#include "app_timer_task.h"
#include "app_runrec.h"
#include "key_manager.h"
#define LOG_TAG_CONST APP
#define LOG_TAG "[USR_JB]"
#define LOG_INFO_ENABLE
#include "debug.h"
/* 向 usr_le_code 提供产品身份(换产品只改 jb_protocol.h 宏即可) */
const uint8_t g_usr_le_prodcode[USR_LE_PRODCODE_LEN] = {
JB_CATEGORY_CODE[0], JB_CATEGORY_CODE[1],
JB_CATEGORY_CODE[2], JB_CATEGORY_CODE[3]
};
const uint8_t g_usr_le_pcode[USR_LE_PCODE_LEN] = {
JB_PRODUCT_CODE[0], JB_PRODUCT_CODE[1], JB_PRODUCT_CODE[2],
JB_PRODUCT_CODE[3], JB_PRODUCT_CODE[4], JB_PRODUCT_CODE[5]
};
#define USR_TIMER_IDLE_MS 20 /**< 全局统一节拍(规格书第 3 章) */
static void usr_timer_tick(void *priv);
static void usr_log_boot_version(void);
/**
* @brief 20ms 业务节拍(硬件定时器中断)
* @param priv 未使用
* @note 禁止写 VM / 切 BLE / 跑联动与计划引擎
* @return 无
*/
static void usr_timer_tick(void *priv)
{
uint16_t dt = USR_TIMER_IDLE_MS;
uint16_t i;
(void)priv;
for (i = 0; i < dt; i++) {
jbTimerIrq(); /* 协议 1ms 时基:实际循环 dt 次对齐真实时间 */
}
user_key_scan(dt); /* 双键扫描(内部完成长按分级,只置标志) */
user_key_handle(); /* 派发按键回调:喷淋启停 / 配对提示 / OTA 标志 */
app_spray_poll(dt); /* 作业引擎:时长/间隔倒数,到点切泵(唯一切泵者) */
app_function_poll(); /* 同步 DP1 = 作业态(含间隔等待) */
app_nvm_tick(dt); /* VM 防抖计时(只计时,写入在任务上下文) */
app_runrec_tick(dt); /* 泵实际导通折秒(只累计,写入在任务上下文) */
app_led_run(dt); /* 绿=作业态、红=配对态;内部推进配对会话 */
}
/**
* @brief 上电打印固件版本与编译时间,方便串口对应当前是哪一包
* @return 无
*/
static void usr_log_boot_version(void)
{
log_info("sw V%d.%d.%d hw V%d.%d.%d build %s %s\n",
JB_MCU_SW_VERSION_MAJOR, JB_MCU_SW_VERSION_MINOR, JB_MCU_SW_VERSION_PATCH,
JB_MCU_HW_VERSION_MAJOR, JB_MCU_HW_VERSION_MINOR, JB_MCU_HW_VERSION_PATCH,
__DATE__, __TIME__);
}
/**
* @brief 业务初始化(5V 常电上电即开机,无按键等待)
* @return 无
*/
void usr_jb_init(void)
{
usr_log_boot_version(); /* UART 已在 app_main 起来,最先能看到版本 */
bsp_hw_init();
app_led_init(); /* 先于一切业务:灯效事件表要最先装载 */
jbInit();
userInit(); /* DP7 默认 10s×3+3s 已就位 */
app_nvm_init();
app_nvm_load(); /* VM 有效则覆盖 DP7/计划/plan_en;DP1/泵不恢复(不自动喷) */
app_pump_init(); /* 泵两脚低(bsp_hw 已配),状态清零 */
app_spray_init(); /* 作业引擎:空闲不喷 */
app_th_scan_init();
app_linkage_init(); /* 联动引擎(湿度回差,P2 */
app_timer_init(); /* 计划引擎(到点触发一轮,P2) */
app_runrec_init(); /* 31 天运行记录(P2 */
app_arbiter_init();
app_function_init();
user_key_init(); /* 双键:PB1 喷淋短按 / PA0 配网 5s-12s */
/* 上电时键若还按着:只锁该键短按(防一上电就开喷),长按 5s/12s 分级照常,
* 所以"插电时就按住 PA0 5s 进配对"这一用法仍然成立 */
user_key_lock_if_held();
/* priority=1 常驻注册,永不重挂(5V 常电不需要低功耗) */
usr_timer_add(NULL, usr_timer_tick, USR_TIMER_IDLE_MS, 1);
log_info("sprayer up: led=%d key=%d pump=%d spray=%d lkg=%d tmr=%d scan=%d rec=%d nvm=%d\n",
BOARD_LED_ENABLE, BOARD_KEY_ENABLE,
BOARD_PUMP_ENABLE, BOARD_SPRAY_ENABLE,
BOARD_LINKAGE_ENABLE, BOARD_TIMER_ENABLE,
BOARD_TH_SCAN_ENABLE, BOARD_RUNREC_ENABLE, BOARD_NVM_ENABLE);
}
/**
* @brief BLE 收到见宝载荷,送入协议环形缓冲
* @param data 载荷指针
* @param len 载荷长度,单位字节
* @return 无
*/
void usr_jb_le_recieve_data(u8 *data, u16 len)
{
jbPutData(data, len);
}
/**
* @brief 约 500ms:协议周期处理、配对/OTA 落地(任务上下文)
* @return 无
*/
void usr_timer_loop(void)
{
userHandle();
jbProtocolHandle(&gDevData);
app_arbiter_poll(); /* 轮结束收口:单次自毁/出队/联动补判 */
app_th_scan_tick(); /* 断连已配对:重连广播/扫描 500ms 交替 */
app_linkage_run(500); /* 湿度回差开停 */
app_timer_run(500); /* 计划到点入队 + 空闲起轮 */
app_runrec_rotate_if_needed(); /* 收 pending 秒/灌 DP18/跨天旋转 */
app_function_loop(); /* VM 防抖落盘 + 配对/OTA 落地 */
}