喷淋器 P0 功能实现

This commit is contained in:
2026-09-09 15:03:50 +08:00
parent b880b2e62b
commit 866b522c59
30 changed files with 3773 additions and 25 deletions
+8
View File
@@ -13,6 +13,7 @@
*/
#include "jb_product.h"
#include "board_pin.h"
/* ════════════════════════════════════════════════════════════════
* 全局变量
@@ -36,6 +37,13 @@ void userInit(void)
gDevData.current_temp = 0.0f; /* DP5 当前温度 (float) */
gDevData.current_humi = 0; /* DP6 当前湿度 */
memset(gDevData.spray_config, 0, 8); /* DP7 喷淋配置 */
/* 首次上电(VM 无效)DP7 默认 10s × 3 次 + 间隔 3s(规格书 10.1/10.2):
* Byte0-1 时长 / Byte2 次数 / Byte3-4 间隔,均大端;5-7 预留置 0 */
gDevData.spray_config[0] = (uint8_t)(BOARD_SPRAY_DEFAULT_DUR_S >> 8);
gDevData.spray_config[1] = (uint8_t)(BOARD_SPRAY_DEFAULT_DUR_S & 0xFFu);
gDevData.spray_config[2] = BOARD_SPRAY_DEFAULT_COUNT;
gDevData.spray_config[3] = (uint8_t)(BOARD_SPRAY_DEFAULT_INTERVAL_S >> 8);
gDevData.spray_config[4] = (uint8_t)(BOARD_SPRAY_DEFAULT_INTERVAL_S & 0xFFu);
gDevData.linkage_delete = 0; /* DP8 联动删除 0=关 1=开 */
memset(gDevData.linkage_config, 0, 20); /* DP9 联动配置 */
gDevData.spray_plan_en = 0; /* DP10 喷淋计划总开关 0=关 1=开 */
+1 -1
View File
@@ -23,7 +23,7 @@
* ════════════════════════════════════════════════════════════════ */
#define PKT_HEAD_0 0x55
#define PKT_HEAD_1 0xAA
#define MAX_PACKAGE_LEN 128
#define MAX_PACKAGE_LEN 512 /* 512DP18 run_record 124B 需要;禁止改回 128 */
#define JB_OTA_MAX_PAYLOAD 96 /* OTA 单包 Payload 上限(Byte); 须 <= MAX_PACKAGE_LEN - 11(0x32 帧开销) */
#define DP_COUNT 28
+108 -16
View File
@@ -1,18 +1,43 @@
/******************************************************************************
* @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/NVMboard_pin.h)。
******************************************************************************/
#include "system/includes.h"
#include "app_config.h"
#include "app_main.h"
#include "app_task.h"
#include "user_cfg.h"
#include "vm.h"
#include "sys_time.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"
/* 向 usr_le_code 库提供产品身份(换产品只改 jb_protocol.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]
@@ -22,28 +47,95 @@ const uint8_t g_usr_le_pcode[USR_LE_PCODE_LEN] = {
JB_PRODUCT_CODE[3], JB_PRODUCT_CODE[4], JB_PRODUCT_CODE[5]
};
void usr_timer_1_ms();
static int jb_timer_id=0;
#define USR_TIMER_IDLE_MS 20 /**< 全局统一节拍(规格书第 3 章) */
void usr_jb_init()
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();
if(jb_timer_id==0)jb_timer_id = sys_s_hi_timer_add(NULL, usr_timer_1_ms, TIMER_PERIOD_MS);
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);
}
void usr_timer_1_ms()
/**
* @brief BLE 收到见宝载荷,送入协议环形缓冲
* @param data 载荷指针
* @param len 载荷长度,单位字节
* @return 无
*/
void usr_jb_le_recieve_data(u8 *data, u16 len)
{
jbTimerIrq();
jbPutData(data, len);
}
void usr_jb_le_recieve_data(u8* data,u16 len)
{
jbPutData(data,len);
}
void usr_timer_loop()///500ms
/**
* @brief 约 500ms:协议周期处理、配对/OTA 落地(任务上下文)
* @return 无
*/
void usr_timer_loop(void)
{
userHandle();
jbProtocolHandle(&gDevData);
app_function_loop(); /* 配对/OTA 动作落地(app_defer 消费) */
}