Files
ekko.bao 6b6e483fa0 1. 增加本地离线控制功能
2. 优化代码逻辑加入很多异步操作
3. 适配switch相关物模型
2025-07-16 20:09:45 +08:00

228 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
你是一个资深的物联网嵌入式工程师。这里有一个基于完善的一个智能家居的sdk进行开发的需求其是基于汉枫(hf)模组+鸿蒙系统(ohos)开发的。
## SDK 相关介绍
1. hf模组SDK提供了硬件的控制的相关接口
2. ohos SDK 提供了设备和云端交互的一系列接口。
整个SDK是比较庞大的不过我们着重关注以下内容
1. application/samples/wifi/ohos_connect/hilink_adapt/entry/hilink_ble_main.c 包含了一系列hilink 的配置和配网是hf sdk和ohos之间接洽的入口
其中 hilink_ble_main 是整个hilink sdk相关配置的入口
2. application/samples/wifi/ohos_connect/hilink_adapt/product/hilink_device.c 包括了物理模型和云端模型的映射
SVC_INFO 是物理模型和云端模型的映射关系,
其中handle_get_xxx是云端模型获取物理模型的数据handle_put_xxx是云端模型设置物理模型的数据。
3. application/ws63/user_main 用户自定义程序代码放置的地方入口
4. application/samples/wifi/ohos_connect/hilink_adapt/product/device_profile.h 设备的基本信息包括设备型号、设备名称、设备ID等
5. application/ws63/hsf 所有hf sdk的接口都在这里包括了flash、gpio、uart、wifi、net、update、crypto、thread、product、net、ntp、debug_print等。
6. application/samples/peripheral 里面包含hf模组提供一些外设的控制示例代码可供参考。
7. build/config/target_config/ws63/config.py 是整个工程的编译配置文件
8. indie_upg.md 是关于支持hilink独立升级如何修改代码的说明文档可供参考
通过以上信息你已经可以基本了解整个SDK的运作的原理
目前项目工程是一个已有的项目的代码,你需要在这个基础上进行改造,删除不要的东西。
## 参考已有产品的的代码
这部分非常重要里面有很多的hilink配网和云端交互等的示例可以帮助你更好的编写代码
这是此前的一款射灯产品的源码,里面核心的几个文件夹为:
application/ws63/user_main
application/samples/wifi/ohos_connect/hilink_adapt/product/
你可以参考看看里面哪些是能够复用的部分。哪些是要删除的
## 软件相关的定义如下:
1. 其物理模型2Q4G.json但是里面的netInfo timer update这几个是hilink内部已经实现无需我们关心我们只需要关心switch3、switch2、switch1、switch4 switch这几个物理模型。
1. switch 是整个面板的总开关,其是属于一个软件上的控制,只有当其属于打开状态时其他的开关才允许控制
2. switch1->switch4 是对应四个物理开关每个switch可以控制对应的一个开关。
3. 设备的状态是开是数值1关闭是数值0.
## 物理连接相关定义及其中一些信息进行补充:
GPOP00 <--> LED1
GPOP02 <--> LED2
GPOP05 <--> LED3
GPOP10 <--> LED4
LED1->LED4是控制面板的每个按键的指示灯其高电平表示指示灯白灯低电平表示指示灯亮黄灯所以按键的指示灯无论如何都是有的只是颜色有区别。
GPOP12 <--> C1
GPOP13 <--> C2
GPOP14 <--> C3
GPOP07 <--> C4
C1->C4 是负责实际的开关的控制,是输出端口,高电平表示开关接通,低电平表示开关断开。
GPOP09 <--> KEY1
GPOP04 <--> KEY2
GPOP11 <--> KEY3
GPOP08 <--> KEY4
KEY1->KEY4是物理按键书输入端口接收用户的物理按下信号。低电平表示按键按下闭合高电平表示按键松开。
GPOP03 <--> LED
LED 是整个控制面板的背光灯,高电平亮灯(黄色),低电平灭灯(无背光)
## 需求分析
### 基本功能需求:
1. 设备的一些信息需要存储在flash中
1. 设备的每个按键的开关状态
2. 设备的背光灯状态
3. 设备的总开关状态
4. 设备的配网状态
2. 物理按键和APP按键控制要统一
1. 设备可以通过APP进行控制也可以通过物理按键进行控制通过物理按键进行控制时也需要存储按键的开关状态APP控制时也需要存储按键的开关状态。这样二者的信息能够统一同步
3. 每个按键的的指示灯和开关状态需要同步,当按键按下时,指示灯亮,当按键松开时,指示灯需要保持长亮。
4. 你需要在HILINK_NotifyDevStatus对应的 HILINK_M2M_CLOUD_ONLINE 和 HILINK_M2M_CLOUD_OFFLINE 中添加对应的逻辑,当设备上线时,需要将按键的开关状态和指示灯状态进行同步,当设备下线时,需要将按键的开关状态和指示灯状态进行同步。
5. 你需要在 HILINK_DEVICE_UNREGISTER 中添加对应的逻辑,当设备被删除时,需要将按键的开关状态和指示灯状态进行同步。
6. 设备的按键状态的修改请立即进行保存,避免突然断电导致状态丢失。
7. 设备上线后才能立即进行同步所有物模型信息避免同步失败导致APP界面异常
8. 需要支持离线后的本地蓝牙控制。
### 产测需求:
1. 只有处于出厂状态,从未被绑定才会触发产测
2. 主动扫描识别固定的热点名 ShuorongSelfTest 作为进入产测的信号5秒未搜索扫指定名字退出产测
=> 搜索识别指定wifi热点名称是后台的行为其他诸如配网逻辑保持不变。所以这里建议单开一个线程实现
产测获取wifi信息相关代码可以参考 /home/ekko.bao/work/hilink-hf_lpt26x/SR_Light_Hilink_14.2.1.312_20250704/application/ws63/user_main/spotlight/factory_test.c wifi_scan_and_check函数的实现。
3. 测试流程开1-开2-开3-开4-全关-全开-全关每1.5秒执行一个动作
4. 需要校验WIFI 信号强度 -70
### SORONTEK智能面板配网
配网有两种触发条件:
1. **自动配网**: 设备处于出厂状态(`is_first_boot = true`)时,上电自动进入配网
2. **手动配网**: 设备处于未绑定状态时长按左上角第一个按键10秒进入配网
3. 配网过程中面板背光灯快闪1秒表示开关已进入配网状态
4. 配网中途只有被按下的按键的指示灯进行闪烁固定1HZ闪烁其他按键指示灯保持长亮
5. 配网超时10分钟超时未配网按键指示灯恢复长亮
=》前三分钟指示灯保持闪烁,后七分钟指示灯保持长亮。
## 软件编写规范
1. 实现需求需要在application/ws63/user_main另外新建文件夹(命名你根据产品需求定义)实现相关逻辑
2. hf的接口提供了多套api架构
1. include/driver 里面存放的是更底层的api 是hf开头的api。
2. application/ws63/hsf 里面存放的高一层级的api。是uapi开头的api
二者均可提供服务但是请优先使用 application/ws63/hsf 里面的接口
如:
1. flush操作的api可见 application/ws63/hsf/hfflash.h 里面定义的 HSF_API 修饰的api
但是有一些例外:
1. gpio 其相关api可见 include/driver/pinctrl.h 和 include/driver/gpio.h。
其中 PIN_MODE_0 为输入模式PIN_MODE_1输出模式
GPIO口枚举可见drivers/chips/ws63/include/platform_core_rom.h
2. 定时器使用 uapi_timer_xx 头文件定义在-> include/driver/timer.h
3. 离线本地蓝牙上报和接收接口可见:
1. 处理接受的数据 application/samples/wifi/ohos_connect/hilink_adapt/entry/hilink_ble_main.c => BleHandleCustomData
2. 上报数据 application/samples/wifi/ohos_connect/hilink_adapt/include/ble_cfg_net_api.h => BLE_SendCustomData
使用示例可见application/samples/wifi/ohos_connect/hilink_adapt/entry/hilink_ble_main.c => ReporSwitchStatus
实现考虑和云端的合二为一,复用上报的代码:在 fast_report 函数里面根据当前处于的模式(离线蓝牙控制模式还是云端网络控制)选择走本地上报还是云端上报。
## 其他补充信息
### 出厂/复位 SORONTEK智能面板默认状态
1. 所有开关控制其处于断开状态
2. 所有按键指示灯处于黄灯常量状态
3. 面板背光灯处于常亮(黄灯)状态
程序入口在 application/ws63/user_main/app_main.c 里面的 user_app_main 里面调用
来自云端的控制信号从 application/samples/wifi/ohos_connect/hilink_adapt/product/hilink_device.c 中的 handle_put_xxx中接受所以需要在这里面call对应的实际控制函数
上报使用 fast_report函数传入对应的svc_id子串即可
## 编译和打包命令
### 基本编译命令
```bash
# 清除构建并编译主程序
python3 build.py -c ws63-liteos-hilink
# 并行编译(推荐)
python3 build.py -j8 ws63-liteos-hilink
# 独立升级编译(包含两个目标)
python3 indie_build.py sdk # 仅编译SDK
python3 indie_build.py all # 编译所有组件
# 生成升级包
python3 package.py
```
### 编译输出目录
- `output/LPT262_hilink.fwpkg` - 主固件包
- `output/LPT262_hilink_UPGRADE.bin` - 升级固件
- `output/package.zip` - OTA升级包
### 调试编译选项
```bash
# 添加编译宏
python3 build.py -def=DEBUG_SWITCH_PANEL,LOG_LEVEL=3 ws63-liteos-hilink
# 仅编译指定组件
python3 build.py -component=user_main ws63-liteos-hilink
# 使用ninja生成器更快
python3 build.py -ninja ws63-liteos-hilink
```
## 关键API参考
### GPIO控制
```c
// 引用头文件
#include "driver/gpio.h"
#include "driver/pinctrl.h"
// GPIO初始化
uapi_pin_set_mode(GPIO_00, PIN_MODE_1); // 输出模式
uapi_gpio_set_dir(GPIO_00, GPIO_DIRECTION_OUTPUT);
// GPIO操作
uapi_gpio_set_val(GPIO_00, GPIO_LEVEL_HIGH);
uapi_gpio_get_val(GPIO_00, &level);
```
### Flash存储
```c
// 引用头文件
#include "application/ws63/hsf/hfflash.h"
// Flash操作
HSF_WriteFlash(offset, data, len);
HSF_ReadFlash(offset, data, len);
```
### 定时器
```c
// 引用头文件
#include "driver/timer.h"
// 定时器操作
uapi_timer_create(&timer_id);
uapi_timer_start(timer_id, timeout, callback);
```
### 延时操作
```c
msleep(1000); // 延时1秒
```
## 设备状态管理要点
### 设备绑定状态管理
- **`is_first_boot` 标志**: 表示设备从未被绑定的状态(可理解为 `not_first_bind`
- 出厂状态:`is_first_boot = true` (从未被绑定)
- 首次绑定后:`is_first_boot = false` (永久设置,不可逆)
- 设备删除后:`is_first_boot` 保持 `false` (不影响该标志)
- **未绑定状态**: 设备当前没有绑定到任何用户账户(包括出厂状态和被删除后的状态)
- **产测触发条件**: 只有 `is_first_boot = true` 时才会触发产测流程
- **配网触发条件**:
- 出厂状态(`is_first_boot = true`):上电自动进入配网
- 未绑定状态长按左上角第一个按键10秒可进入配网
### 设备状态同步要点
1. **云端上报入口**: `fast_report(svc_id)` - 自动处理蓝牙/云端模式
2. **云端控制入口**: `application/samples/wifi/ohos_connect/hilink_adapt/product/hilink_device.c` 中的 `handle_put_xxx` 函数
3. **状态存储**: 所有设备状态变化必须立即调用Flash写入操作
4. **设备事件处理**: 在 `HILINK_NotifyDevStatus` 中处理设备上线/下线/删除事件
- `HILINK_M2M_CLOUD_ONLINE`: 设备上线时同步所有状态
- `HILINK_M2M_CLOUD_OFFLINE`: 设备下线时保持本地状态
- `HILINK_DEVICE_UNREGISTER`: 设备删除时不影响 `is_first_boot` 标志
现在需要请你帮我实现一个四开关面板程序功能
请先分析需求,拆解步骤,然后逐步进行编码。