2025-07-05 23:40:20 +08:00
|
|
|
|
# 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的运作的原理
|
2025-07-06 19:21:42 +08:00
|
|
|
|
目前项目工程是一个已有的项目的代码,你需要在这个基础上进行改造,删除不要的东西。
|
2025-07-05 23:40:20 +08:00
|
|
|
|
|
2025-07-06 19:21:42 +08:00
|
|
|
|
## 参考已有产品的的代码
|
|
|
|
|
!!这部分非常重要!!!,里面有很多的hilink,配网,和云端交互等的示例,可以帮助你更好的编写代码
|
2025-07-05 23:40:20 +08:00
|
|
|
|
这是此前的一款射灯产品的源码,里面核心的几个文件夹为:
|
2025-07-06 19:21:42 +08:00
|
|
|
|
application/ws63/user_main
|
|
|
|
|
application/samples/wifi/ohos_connect/hilink_adapt/product/
|
|
|
|
|
你可以参考看看里面哪些是能够复用的部分。哪些是要删除的
|
2025-07-05 23:40:20 +08:00
|
|
|
|
|
|
|
|
|
## 软件相关的定义如下:
|
|
|
|
|
1. 其物理模型2Q4G.json,但是里面的netInfo timer update这几个是hilink内部已经实现无需我们关心,我们只需要关心switch3、switch2、switch1、switch4 switch这几个物理模型。
|
|
|
|
|
1. switch 是整个面板的总开关,其是属于一个软件上的控制,只有当其属于打开状态时其他的开关才允许控制
|
|
|
|
|
2. switch1->switch4 是对应四个物理开关,每个switch可以控制对应的一个开关。
|
2025-07-16 20:09:45 +08:00
|
|
|
|
3. 设备的状态是开是数值1,关闭是数值0.
|
2025-07-05 23:40:20 +08:00
|
|
|
|
|
|
|
|
|
## 物理连接相关定义及其中一些信息进行补充:
|
|
|
|
|
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 是整个控制面板的背光灯,高电平亮灯(黄色),低电平灭灯(无背光)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 需求分析
|
2025-07-16 20:09:45 +08:00
|
|
|
|
### 基本功能需求:
|
|
|
|
|
1. 设备的一些信息需要存储在flash中
|
2025-07-05 23:40:20 +08:00
|
|
|
|
1. 设备的每个按键的开关状态
|
|
|
|
|
2. 设备的背光灯状态
|
|
|
|
|
3. 设备的总开关状态
|
|
|
|
|
4. 设备的配网状态
|
|
|
|
|
|
2025-07-16 20:09:45 +08:00
|
|
|
|
2. 物理按键和APP按键控制要统一
|
|
|
|
|
1. 设备可以通过APP进行控制,也可以通过物理按键进行控制,通过物理按键进行控制时也需要存储按键的开关状态APP控制时也需要存储按键的开关状态。这样二者的信息能够统一同步
|
2025-07-05 23:40:20 +08:00
|
|
|
|
|
2025-07-16 20:09:45 +08:00
|
|
|
|
3. 每个按键的的指示灯和开关状态需要同步,当按键按下时,指示灯亮,当按键松开时,指示灯需要保持长亮。
|
|
|
|
|
4. 你需要在HILINK_NotifyDevStatus对应的 HILINK_M2M_CLOUD_ONLINE 和 HILINK_M2M_CLOUD_OFFLINE 中添加对应的逻辑,当设备上线时,需要将按键的开关状态和指示灯状态进行同步,当设备下线时,需要将按键的开关状态和指示灯状态进行同步。
|
2025-07-05 23:40:20 +08:00
|
|
|
|
|
2025-07-16 20:09:45 +08:00
|
|
|
|
5. 你需要在 HILINK_DEVICE_UNREGISTER 中添加对应的逻辑,当设备被删除时,需要将按键的开关状态和指示灯状态进行同步。
|
|
|
|
|
6. 设备的按键状态的修改请立即进行保存,避免突然断电导致状态丢失。
|
|
|
|
|
7. 设备上线后才能立即进行同步所有物模型信息,避免同步失败导致APP界面异常
|
|
|
|
|
8. 需要支持离线后的本地蓝牙控制。
|
2025-07-05 23:40:20 +08:00
|
|
|
|
|
2025-07-16 20:09:45 +08:00
|
|
|
|
### 产测需求:
|
|
|
|
|
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秒执行一个动作
|
2025-07-11 07:59:14 +08:00
|
|
|
|
4. 需要校验WIFI 信号强度 -70
|
2025-07-05 23:40:20 +08:00
|
|
|
|
|
2025-07-16 20:09:45 +08:00
|
|
|
|
|
2025-07-05 23:40:20 +08:00
|
|
|
|
### SORONTEK智能面板配网:
|
2025-07-16 20:09:45 +08:00
|
|
|
|
配网有两种触发条件:
|
|
|
|
|
1. **自动配网**: 设备处于出厂状态(`is_first_boot = true`)时,上电自动进入配网
|
|
|
|
|
2. **手动配网**: 设备处于未绑定状态时,长按左上角第一个按键10秒进入配网
|
|
|
|
|
3. 配网过程中,面板背光灯快闪1秒,表示开关已进入配网状态
|
|
|
|
|
4. 配网中途只有被按下的按键的指示灯进行闪烁,固定1HZ闪烁,其他按键指示灯保持长亮
|
|
|
|
|
5. 配网超时10分钟,超时未配网按键指示灯恢复长亮
|
2025-07-05 23:40:20 +08:00
|
|
|
|
=》前三分钟指示灯保持闪烁,后七分钟指示灯保持长亮。
|
|
|
|
|
|
2025-07-16 20:09:45 +08:00
|
|
|
|
## 软件编写规范
|
|
|
|
|
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 函数里面根据当前处于的模式(离线蓝牙控制模式还是云端网络控制)选择走本地上报还是云端上报。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 23:40:20 +08:00
|
|
|
|
## 其他补充信息
|
|
|
|
|
### 出厂/复位 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子串即可
|
|
|
|
|
|
|
|
|
|
|
2025-07-16 20:09:45 +08:00
|
|
|
|
## 编译和打包命令
|
|
|
|
|
|
|
|
|
|
### 基本编译命令
|
|
|
|
|
```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` 标志
|
|
|
|
|
|
2025-07-05 23:40:20 +08:00
|
|
|
|
现在需要请你帮我实现一个四开关面板程序功能
|
|
|
|
|
请先分析需求,拆解步骤,然后逐步进行编码。
|