/****************************************************************************** * @file usr_jb_main.c * @brief CBR2 业务组合根:只编排调用顺序(P0 双键/双灯/双脚泵) * @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(任务上下文)。 * P0 关闭 LINKAGE/TIMER/TH_SCAN/RUNREC/NVM(board_pin.h)。 ******************************************************************************/ #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 "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_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_pump_init(); /* 泵两脚低(bsp_hw 已配),状态清零 */ app_spray_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 P0 up: led=%d key=%d pump=%d spray=%d\n", BOARD_LED_ENABLE, BOARD_KEY_ENABLE, BOARD_PUMP_ENABLE, BOARD_SPRAY_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_function_loop(); /* 配对/OTA 动作落地(app_defer 消费) */ }