142 lines
4.6 KiB
C
142 lines
4.6 KiB
C
/******************************************************************************
|
||
* @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 消费) */
|
||
}
|