P0功能已实现,按键、LED、过零检测、配网、OTA都已正常实现
This commit is contained in:
+160
-15
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user