P0功能已实现,按键、LED、过零检测、配网、OTA都已正常实现

This commit is contained in:
2026-09-04 18:49:07 +08:00
parent 2fb61a6458
commit 0de88083ba
47 changed files with 5184 additions and 26 deletions
+160 -15
View File
@@ -1,18 +1,50 @@
/******************************************************************************
* @file usr_jb_main.c
* @brief CBR1 业务组合根:只编排调用顺序
* @author cyWu <1917507415@qq.com>
* @date 2026.09.04
* @version V1.1.0
* @history
* - V1.1.0, 2026.09.04, cyWu, 精简注释
* - V1.0.0, 2026.09.04, 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 "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 "bsp_zc.h"
#include "app_pair.h"
#include "app_function.h"
#include "app_relay.h"
#include "app_zc.h"
#include "app_led.h"
#include "app_arbiter.h"
#include "app_linkage.h"
#include "app_runrec.h"
#include "app_timer_task.h"
#include "app_th_scan.h"
#include "app_nvm.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 +54,141 @@ 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 / printf
* @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();
}
user_key_scan(dt); /* 内部完成 5s/12s 长按分级,只置标志 */
user_key_handle(); /* 派发短按:切加热 */
app_zc_poll(dt); /* 只做 100ms 无沿超时兜底(切变在过零 ISR) */
app_function_poll(); /* 同步 DP0 = 实际继电器态 */
app_runrec_tick(dt); /* 实际吸合才累计;满 10 分钟只打脏,不写 flash */
app_nvm_tick(dt); /* 变化检测 + 500ms 防抖计时(不写 flash!) */
app_led_run(dt); /* 灯跟继电器实际态;内部推进配对会话 */
}
#if (BOARD_ZC_ENABLE && BOARD_ZC_SW_POLL_1MS)
/**
* @brief 过零 1ms 软件采样兜底
* @param priv 未使用
* @return 无
*/
static void usr_timer_1ms(void *priv)
{
(void)priv;
bsp_zc_scan_1ms();
}
#endif
/**
* @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 业务初始化(上电即开机)
* @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);
app_relay_init(); /* 执行器(请求/实际态)先于过零与仲裁 */
app_zc_init(); /* PA1 双沿 → 继电器切变(app_relay 回调) */
app_arbiter_init(); /* 占用仲裁(手动>定时>联动)先于联动/定时引擎 */
app_linkage_init();
app_runrec_init();
app_timer_init();
app_th_scan_init();
app_nvm_init();
app_nvm_load(); /* P1: 会回填 heat_switch/联动/定时/31 天运行记录 */
app_function_init();
user_key_init();
/* 上电时键若还按着:只锁短按(避免一上电就切加热),长按 5s/12s 分级照常生效,
* 所以"插电时就按住 5s 进配对"这一用法仍然成立 */
user_key_lock_if_held();
/* priority=1 常驻注册,永不重挂(220V 常电不需要低功耗) */
usr_timer_add(NULL, usr_timer_tick, USR_TIMER_IDLE_MS, 1);
#if (BOARD_ZC_ENABLE && BOARD_ZC_SW_POLL_1MS)
/* 过零软件兜底采样:真实 1ms 节拍(P33 中断之外的第二道保险) */
usr_timer_add(NULL, usr_timer_1ms, 1, 1);
#endif
log_info("timer started, period=%ums, zc_irq=%d, zc_poll_1ms=%d\n",
(unsigned)USR_TIMER_IDLE_MS, BOARD_ZC_USE_IRQ,
(BOARD_ZC_ENABLE && BOARD_ZC_SW_POLL_1MS) ? 1 : 0);
}
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_th_scan_tick(); /* P2:断连时 500ms 重连广播/500ms 扫描交替 */
app_linkage_run(500); /* P2:联动引擎(任务上下文;仲裁见 app_arbiter */
app_timer_run(500); /* P2:定时引擎(RTC 门闩 + 窗判断) */
app_runrec_rotate_if_needed(); /* P2:跨天旋转/落盘/灌 DP17 */
app_function_loop(); /* VM 防抖落盘 + 配对/OTA 动作落地 */
#if (BOARD_ZC_ENABLE && BOARD_ZC_DIAG_LOG)
/* 台上诊断:确认过零 FPIN 中断真的在跑(edge 持续不涨 = 前端没信号/中断没起来) */
{
static uint32_t s_zc_cnt_last;
uint32_t cnt = bsp_zc_edge_count();
uint32_t last = bsp_zc_last_edge_ms();
uint32_t ago = last ? ((uint32_t)timer_get_ms() - last) : 0xFFFFFFFFu;
log_info("zc diag: edge=%u(+%u) ago=%ums lvl=%d req=%d act=%d\n",
cnt, (uint32_t)(cnt - s_zc_cnt_last), ago, (int)bsp_zc_level(),
(int)app_relay_get_request(), (int)app_relay_get_actual());
s_zc_cnt_last = cnt;
}
#endif
}