This commit is contained in:
小马_666 2025-05-23 18:14:35 +08:00
commit f659d45597
12 changed files with 269 additions and 85 deletions

View File

@ -91,6 +91,7 @@
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.1983282875" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.1000761142" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.1944008784" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>
<<<<<<< HEAD
<builder buildPath="${workspace_loc:/BLE_TYQ_BJQ_CH584M/obj" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.1421508906" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="true" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/>
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1244756189" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler">
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1692176068" name="Use preprocessor" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor" useByScannerDiscovery="false" value="true" valueType="boolean"/>
@ -380,6 +381,9 @@
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.1000761142" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.1944008784" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>
<builder buildPath="${workspace_loc:/BLE_TYQ_BJQ_CH584M/dbg" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.1421508906" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="true" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/>
=======
<builder buildPath="${workspace_loc:/ZBF_Master_ch584m/obj" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.1421508906" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="true" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/>
>>>>>>> b359ca31ba23eac16a4689edfc57bbc833547ae2
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1244756189" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler">
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1692176068" name="Use preprocessor" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.nostdinc.821897907" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.nostdinc" useByScannerDiscovery="true" value="false" valueType="boolean"/>

View File

@ -4,7 +4,7 @@
"path": "."
},
{
"name": "BLE_TYQ_BJQ_CH584M",
"name": "ZBF_Master_ch584m",
"path": "../"
}
],

View File

@ -4,8 +4,8 @@
{
"type": "mrs-debugger",
"request": "launch",
"name": "BLE_TYQ_BJQ_CH584M",
"cwd": "d:\\SXDT\\Project\\CH32\\ble_-tyq_-bjq_-ch584-m",
"name": "ZBF_Master_ch584m",
"cwd": "d:\\SXDT\\Project\\HED\\zbf_master_ch584m",
"openOCDCfg": {
"useLocalOpenOCD": true,
"executable": "c:/MounRiver/MounRiver_Studio2/resources/app/resources/win32/components/WCH/OpenOCD/OpenOCD/bin/openocd.exe",
@ -39,8 +39,8 @@
"additionalCommands": []
},
"loadedFiles": {
"executableFile": "d:\\SXDT\\Project\\CH32\\ble_-tyq_-bjq_-ch584-m\\obj\\BLE_TYQ_BJQ_CH584M.elf",
"symbolFile": "d:\\SXDT\\Project\\CH32\\ble_-tyq_-bjq_-ch584-m\\obj\\BLE_TYQ_BJQ_CH584M.elf",
"executableFile": "d:\\SXDT\\Project\\HED\\zbf_master_ch584m\\obj\\ZBF_Master_ch584m.elf",
"symbolFile": "d:\\SXDT\\Project\\HED\\zbf_master_ch584m\\obj\\ZBF_Master_ch584m.elf",
"executableFileOffset": 0,
"symbolFileOffset": 0
},

View File

@ -1,6 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<projectDescription>
<<<<<<< HEAD
<name>BLE_TYQ_BJQ_CH584M</name>
=======
<name>ZBF_Master_ch584m</name>
>>>>>>> b359ca31ba23eac16a4689edfc57bbc833547ae2
<comment/>
<projects/>
<buildSpec>

View File

@ -1,5 +1,6 @@
Vendor=WCH
Toolchain=RISC-V
<<<<<<< HEAD
Series=CH58X
RTOS=NoneOS
MCU=CH583M
@ -8,6 +9,16 @@ PeripheralVersion=1.0
Description=
Mcu Type=CH58x
Address=0x00000000
=======
Series=CH32L103
RTOS=NoneOS
MCU=CH32L103C8T6
Link=WCH-Link
PeripheralVersion=1.0
Description=
Mcu Type=
Address=
>>>>>>> b359ca31ba23eac16a4689edfc57bbc833547ae2
Target Path=
Exe Path=
Exe Arguments=

View File

@ -18,9 +18,9 @@
}
],
"files.associations": {
"*.dbclient-js": "javascript",
"*.sqlbook": "sql",
"*.ndjson": "jsonl",
"*.dbclient-js": "javascript",
"config.h": "c",
"ch58xble_lib.h": "c",
"bsp_uart.h": "c",
@ -37,6 +37,7 @@
"bsp_flash.h": "c",
"shell.h": "c",
"ch58x_uart.h": "c",
"bsp_tim.h": "c"
"bsp_tim.h": "c",
"ch58x_common.h": "c"
}
}

View File

@ -1253,12 +1253,14 @@ int BSP_Master_Receive_Data(uint8_t task_id, uint8_t *data, uint16_t len)
return -5;
}
// //有效数据长度
size_t data_len = (datalength + 5);
ret = data_len;
if (data[index + 1] == 0x02) // 0x02 代表了其是控制阀门响应
{
// logDebug("BT 控制阀门响应包");
logDebug("BT 控制阀门响应包");
logHexDumpAll(data, len);
if (data[index + datalength + 2] == 1) // 响应数据位
{
logInfo("BT 控制阀门成功");
@ -1273,8 +1275,14 @@ int BSP_Master_Receive_Data(uint8_t task_id, uint8_t *data, uint16_t len)
logDebug("蓝牙从机心跳数据包:");
logHexDumpAll(data, data_len);
}
else
{
logDebug("蓝牙从机数据包:");
logHexDumpAll(data, len);
}
// 到这一步说明数据没问题,将接收到的数据通过中心任务发送出去
uint8_t *p_data;
p_data = tmos_msg_allocate(data_len);
if (p_data)
{
@ -1339,7 +1347,11 @@ uint16_t Master_ProcessEvent(uint8_t task_id, uint16_t events)
{
logDebug("有设备,尝试连接\r\n");
bt_conncet_cnt++;
<<<<<<< HEAD
if (bt_conncet_cnt > 60)//如果多次重试都不行,直接重启设备
=======
if (bt_conncet_cnt > 180)
>>>>>>> b359ca31ba23eac16a4689edfc57bbc833547ae2
{
bt_conncet_cnt = 0;
PFIC_SystemReset();

62
ZBF_Master_ch584m.launch Normal file
View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<launchConfiguration type="com.mounriver.debug.gdbjtag.openocd.launchConfigurationType">
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doFirstReset" value="true"/>
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.enableSemihosting" value="false"/>
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.enableSemihostingNew" value="false"/>
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doContinue" value="true"/>
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doSecondReset" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doStartGdbCLient" value="true"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerExecutable" value="${eclipse_home}toolchain/OpenOCD/bin/${openocd_executable}"/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerTclPortNumber" value="6666"/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerOther" value="-f &quot;${eclipse_home}toolchain/OpenOCD/bin/wch-riscv.cfg&quot;"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${eclipse_home}toolchain/RISC-V Embedded GCC12/bin/riscv-none-elf-gdb.exe"/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off&#xD;&#xA;set architecture riscv:rv32&#xD;&#xA;set remotetimeout unlimited&#xD;&#xA;set disassembler-options xw"/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.firstResetType" value="init"/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.otherInitCommands" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.secondResetType" value="halt"/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.otherRunCommands" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="handle_reset"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>
<stringAttribute key="com.mounriver.debug.gdbjtag.svdPath"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="obj/ZBF_Master_ch584m.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="ZBF_Master_ch584m"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerLog" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?>\r\n&lt;memoryBlockExpressionList context=&quot;Context string&quot;/>\r\n"/>
<intAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>
<intAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="ZBF_Master_ch584m"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
</launchConfiguration>

View File

@ -2,8 +2,8 @@
* @Author: mbw
* @Date: 2024-12-09 11:40:04
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2025-04-22 13:19:22
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\inc\bsp_valve.h
* @LastEditTime: 2025-05-23 11:01:23
* @FilePath: \zbf_master_ch584m\bsp\inc\bsp_valve.h
* @Description:
* @
* @Copyright (c) 2025 by ${git_name_email}, All Rights Reserved.
@ -27,16 +27,27 @@
typedef enum
{
kValveCmdCtr = 0X01,
kValveCmdReg,
kValveCmdRem,
kValveCmdRep,
kValveCmdRemAll,//移除所有的阀门地址
kValveEventStatus,//阀门状态包
kValveConncetStatus,//阀门状态包
kValveCmdMax,
} ValveCmdType;
kValveCmdCtr = 0X01, // 控制命令
kValveCmdReg, // 注册命令
kValveCmdRem, // 移除命令
kValveCmdRep, // 替换命令
kValveCmdRemAll, // 移除所有的阀门地址
kValveEventStatus, // 阀门状态包
kValveConncetStatus, // 阀门连接状态
kValveCmdOverPressure, // 超压关阀
kValveCmdUnderPressure, // 欠压关阀
kValveCmdOverCurrent, // 过流关阀
kValveCmdMicroLeak, // 微漏关阀
kValveCmdTimer, // 定时关阀
kValveCmdOpenWithStove, // 开灶开阀
kValveCmdCloseWithStove, // 关灶关阀
kValveCmdOverTemperature, // 超温关阀
kValveCmdDelayClose, // 延时关阀
kValveCmdManualClose, // 手动关阀
kValveCmdMax, // 枚举最大值
} ValveCmdType;
typedef enum
{
WirelessValveClose = 0x01,
@ -54,9 +65,19 @@ typedef enum
typedef enum
{
kCmdCfg = 0X01,
kCmdCloseVavle,
kCmdOpenVavle,
kCmdData,
kCmdCloseVavle, //关阀
kCmdOpenVavle,//开阀
kCmdData,//命令数据(心跳数据)
kRespOverPressure, // 超压关阀
kRespUnderPressure, // 欠压关阀
kRespOverCurrent, // 过流关阀
kRespMicroLeak, // 微漏关阀
kRespTimer, // 定时关阀
kRespOpenWithStove, // 开灶开阀
kRespCloseWithStove, // 关灶关阀
kRespOverTemperature, // 超温关阀
kRespDelayClose, // 延时关阀
kRespManualClose, // 手动关阀
} TeFrameCmd;
/*
@ -69,7 +90,7 @@ typedef enum
线
线
*/
struct __attribute__((packed)) valve_data
typedef struct __attribute__((packed))
{
uint8_t valve_id;
uint8_t valve_mac[6];
@ -80,12 +101,15 @@ struct __attribute__((packed)) valve_data
uint32_t valve_out_pressure;
uint32_t valve_atm_pressure;
uint8_t valve_type;
};
uint8_t valve_bat;
uint8_t valve_hum;//阀门湿度
int8_t valve_rssi;//阀门rssi
}valve_data;
typedef struct valve_data_list
{
uint8_t valve_num;
struct valve_data valve_data[MAX_VALVE_NUM];
valve_data valve_data[MAX_VALVE_NUM];
} valve_data_list_t;
extern valve_data_list_t valve_list;
@ -97,6 +121,6 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len);
int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len);
void BSP_Bt_Valve_Updata(void);
int BSP_Bt_Remove_All_Valve(void);
int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state);
int BSP_Bt_Valve_Resp(ValveCmdType cmd, uint8_t id, uint8_t *mac_addr, uint8_t state);
#endif // ! __BSP_VALVE_H__

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-12-06 16:52:30
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2025-04-22 15:16:57
* @LastEditTime: 2025-05-23 18:07:59
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_uart.c
* @Description:
*
@ -30,7 +30,7 @@
#define UART3_TX_BUFFER_LENGTH 2048U
uint8_t bt_recv_start_flag = 0;
uint8_t bt_recv_end_flag = 0;
uint8_t bt_recv_end_flag = 0;
lwrb_t uart1_rx_t;
lwrb_t uart1_tx_t;
uint8_t uart1_tx_buf[UART1_TX_BUFFER_LENGTH] = {0};
@ -167,11 +167,11 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
switch (data[index + 2])
{
case kValveCmdCtr:
logDebug("recv cmd: 0x01, 执行的动作是关闭阀门");
ret = BSP_Bt_Valve_Ctr(&data_buf[0], datalength);
break;
case kValveCmdReg:
logDebug("recv cmd: 0x02, 执行的动作是注册阀门");
ret = BSP_Bt_Register_Valve(&data_buf[0], datalength);
if (ret == 0)
{
@ -183,7 +183,7 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
}
break;
case kValveCmdRem:
logDebug("recv cmd: 0x03, 执行的动作是移除阀门");
logDebug("recv cmd: 0x03, 移除阀门");
ret = BSP_Bt_Remove_Valve(&data_buf[0], datalength);
if (ret == 0)
{
@ -195,7 +195,7 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
}
break;
case kValveCmdRep:
logDebug("recv cmd: 0x04, 执行的动作是更换阀门");
logDebug("recv cmd: 0x04, 更换阀门");
ret = BSP_Bt_Replace_Valve(&data_buf[0], datalength);
if (ret == 0)
{
@ -207,7 +207,7 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
}
break;
case kValveCmdRemAll:
logDebug("recv cmd: 0x04, 执行的动作是移除所有阀门信息");
logDebug("recv cmd: 0x04, 移除所有阀门信息");
ret = BSP_Bt_Remove_All_Valve();
if (ret == 0)
{
@ -237,7 +237,6 @@ uint8_t BT_GenerateRawFrame(BTFrameData *pRawData, const uint8_t *p_src, uint8_t
pRawData->buf[1] = src_len;
tmos_memcpy(&pRawData->buf[2], p_src, src_len);
// 从帧起始符开始到校验码之前所有字节的和的模256
// 即各字节不计超过255的溢出值的二进制算术和。
pRawData->buf[pRawData->len - 2] = _CheckSum(&pRawData->buf[0], pRawData->len - 2);
@ -258,7 +257,7 @@ uint8_t BT_GenerateRawFrame(BTFrameData *pRawData, const uint8_t *p_src, uint8_t
uint16_t BSP_Send_Process(uint8_t *pdata)
{
int8_t ret = 0;
__attribute__((aligned(4))) uint8_t master_rx_buf[64] = {0};
uint8_t master_rx_buf[64] = {0};
uint8_t found_frame_start = 0;
uint8_t *frame_start = NULL;
@ -308,6 +307,7 @@ uint16_t BSP_Send_Process(uint8_t *pdata)
BSP_Bt_Valve_Resp(kValveCmdCtr, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kCmdOpenVavle:
BSP_Bt_Valve_Resp(kValveCmdCtr, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kCmdData:
valve_list.valve_data[0].valve_connct_status = 1;
@ -317,19 +317,61 @@ uint16_t BSP_Send_Process(uint8_t *pdata)
{
bt_connect_flag = 1;
logDebug("阀门连接成功");
BSP_Bt_Valve_Resp(kValveConncetStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, TRUE);//表示连接成功
BSP_Bt_Valve_Resp(kValveConncetStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, TRUE); // 表示连接成功
}
else
{
BSP_Bt_Valve_Resp(kValveEventStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, TRUE);
}
break;
// TODO:待完成从机的一些主动上报信息解析
case kRespOverPressure:
logDebug("阀门超压关阀");
BSP_Bt_Valve_Resp(kValveCmdOverPressure, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kRespUnderPressure:
logDebug("阀门欠压关阀");
BSP_Bt_Valve_Resp(kValveCmdUnderPressure, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kRespOverCurrent:
logDebug("阀门过流关阀");
BSP_Bt_Valve_Resp(kValveCmdOverCurrent, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kRespMicroLeak:
logDebug("阀门微漏关阀");
BSP_Bt_Valve_Resp(kValveCmdMicroLeak, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kRespTimer:
logDebug("阀门定时关阀");
BSP_Bt_Valve_Resp(kValveCmdTimer, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kRespOpenWithStove:
logDebug("开灶关阀");
BSP_Bt_Valve_Resp(kValveCmdOpenWithStove, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kRespCloseWithStove:
logDebug("关灶关阀");
BSP_Bt_Valve_Resp(kValveCmdCloseWithStove, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kRespOverTemperature:
logDebug("阀门超温关阀");
BSP_Bt_Valve_Resp(kValveCmdOverTemperature, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kRespDelayClose:
logDebug("阀门延时关闭");
BSP_Bt_Valve_Resp(kValveCmdDelayClose, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
case kRespManualClose:
logDebug("阀门手动关闭");
BSP_Bt_Valve_Resp(kValveCmdManualClose, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
break;
default:
logError("不支持的命令: %d", master_rx_buf[1]);
logError("不支持的从机命令: %d", master_rx_buf[1]);
break;
}
return 0;
return 0;
}
uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events)
@ -361,7 +403,7 @@ uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events)
if (bt_recv_start_flag)
{
bt_recv_start_flag = 0;
bt_recv_end_flag = 1;
bt_recv_end_flag = 1;
tmos_start_task(task_id, BT_REC_EVT, 100);
}
tmos_start_task(task_id, BT_REC_EVT_FINISH, 50);
@ -373,7 +415,7 @@ uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events)
if (bt_recv_end_flag)
{
bt_recv_end_flag = 0;
int len = lwrb_get_full(&uart1_rx_t);
int len = lwrb_get_full(&uart1_rx_t);
if (len > 0)
{
__attribute__((aligned(4))) uint8_t buf[256] = {0};
@ -460,10 +502,10 @@ void UART1_IRQHandler(void)
break;
}
case UART_II_RECV_RDY:
case UART_II_RECV_TOUT: // 接收数据
if ((bt_recv_start_flag == 0)&&(bt_recv_end_flag == 0))//用于检测是否是开始接收数据
case UART_II_RECV_TOUT: // 接收数据
if ((bt_recv_start_flag == 0) && (bt_recv_end_flag == 0)) // 用于检测是否是开始接收数据
{
bt_recv_start_flag = 1;
bt_recv_start_flag = 1;
}
while (R8_UART1_RFC)
{
@ -575,7 +617,7 @@ int reboot(void)
{
PFIC_SystemReset();
return 0;
return 0;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC),
reboot, reboot, "reboot");

View File

@ -2,8 +2,8 @@
* @Author: mbw
* @Date: 2024-12-09 11:40:10
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2025-04-22 15:15:24
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_valve.c
* @LastEditTime: 2025-05-23 11:08:46
* @FilePath: \zbf_master_ch584m\bsp\src\bsp_valve.c
* @Description:
*
* Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
@ -14,7 +14,6 @@
#include "bsp_uart.h"
#include "multiCentral.h"
/*
info
+ + + + +
@ -29,7 +28,6 @@
valve_data_list_t valve_list = {0};
BTFrameData valve_frame_data = {0};
uint8_t Valve_GenerateRawFrame(BTFrameData *pRawData, const uint8_t cmd, const uint8_t *p_src, uint8_t src_len)
{
pRawData->len = src_len + 5;
@ -51,10 +49,10 @@ uint8_t Valve_GenerateRawFrame(BTFrameData *pRawData, const uint8_t cmd, const u
return 0;
}
int BSP_Valve_Close(uint8_t valve_id)
int BSP_Valve_Ctr(uint8_t valve_id, const uint8_t cmd)
{
uint8_t num = Flash_Get_Valve_Num();
uint8_t valve_ctr_valve = WirelessValveClose;
uint8_t valve_ctr_valve = cmd;
if ((valve_id > 8) && (num == 0))
{
logError("BSP_Valve_Close: valve id error");
@ -62,14 +60,19 @@ int BSP_Valve_Close(uint8_t valve_id)
return -1;
}
logDebug("BSP_Valve_Close: valve id: %d", valve_id);
// TODO:检查是否连接, 如果连接,则发送数据,将关闭阀门指令发送过去,然后等待数据接收响应如果接收到响应是关闭状态0x01则返回成功否则失败
Valve_GenerateRawFrame(&valve_frame_data, kCmdCloseVavle, &valve_ctr_valve, 1);
if (cmd == kCmdCloseVavle)
{
Valve_GenerateRawFrame(&valve_frame_data, kCmdCloseVavle, &valve_ctr_valve, 1);
}
else
{
Valve_GenerateRawFrame(&valve_frame_data, kCmdOpenVavle, &valve_ctr_valve, 1);
}
return BSP_Master_Send(centralConnList, CONNECT0_ITEM, &valve_frame_data.buf[0], valve_frame_data.len);
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC),
BSP_Valve_Close, BSP_Valve_Close, "valve_id:CONNECT0_ITEM = 0");
BSP_Valve_Ctr, BSP_Valve_Ctr, "valve_id: 0, close: 0x01, open :0x02");
/*用于控制阀门的状态
* id: 1-8
@ -95,13 +98,25 @@ int BSP_Bt_Valve_Ctr(uint8_t *data, uint8_t len)
return -2;
}
/*如果到这里了说明ID和MAC地址对应没问题则关闭对应阀门*/
return BSP_Valve_Close(data[0]);
/*如果到这里了说明ID和MAC地址对应没问题则控制对应阀门*/
if (data[7] == WirelessValveClose)
{
logDebug("recv cmd: 0x01, 执行的动作是关闭阀门");
return BSP_Valve_Ctr(data[0], kCmdCloseVavle);
}
else if (data[7] == WirelessValveOpen)
{
logDebug("recv cmd: 0x02, 执行的动作是打开阀门");
return BSP_Valve_Ctr(data[0], kCmdOpenVavle);
}
logDebug("data[7] = %#x", data[7]);
return -1;
}
/*注册阀门信息*/
int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len)
{
logDebug("recv cmd: 0x02, 执行的动作是注册阀门");
uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0};
if ((data[0] >= 1) && (data[0] <= 8))
@ -138,7 +153,7 @@ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len)
}
else
{
uint8_t num = Flash_Get_Valve_Num();
uint8_t num = Flash_Get_Valve_Num();
Flash_Set_Valve_Num(num + 1);
BSP_Bt_Valve_Updata(); // 更新阀门信息
}
@ -157,7 +172,7 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len)
{
size_t i = 0;
uint8_t mac_addr[FLASH_MAC_INFO_LEN + 2] = {0};
if ((data[0] >= 1) && (data[0] <= 8))// 判断是否是正确的ID
if ((data[0] >= 1) && (data[0] <= 8)) // 判断是否是正确的ID
{
Flash_Get_Mac_Addr(mac_addr, data[0]);
}
@ -167,10 +182,10 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len)
logHexDumpAll(data, len);
return -1;
}
if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) != TRUE)// 判断是否是相同的MAC地址
if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) != TRUE) // 判断是否是相同的MAC地址
{
logError("mac addr error");
logHexDumpAll(data, len);
logHexDumpAll(data, len);
return -2;
}
else
@ -179,10 +194,10 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len)
if (Flash_Set_Mac_Addr(mac_addr, data[0]) != 0) // 清空掉对应位置MAC数据
{
logError("移除阀门信息失败");
logHexDumpAll(data, len);
logHexDumpAll(data, len);
return -2;
}
uint8_t num = Flash_Get_Valve_Num();
uint8_t num = Flash_Get_Valve_Num();
if (Flash_Set_Valve_Num(num - 1) != 0) // 移除一个阀门
{
logError("移除阀门信息失败");
@ -200,8 +215,8 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len)
int BSP_Bt_Remove_All_Valve(void)
{
uint8_t mac_addr[FLASH_MAC_INFO_LEN + 2] = {0};
uint8_t num = Flash_Get_Valve_Num();
if(num == 0)
uint8_t num = Flash_Get_Valve_Num();
if (num == 0)
{
logError("没有找到任何阀门信息");
return 0;
@ -229,7 +244,7 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len)
uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0};
logDebug("更换阀门信息:");
logHexDumpAll(data, len);
if ((len == 0) || (len < 13))//新旧MAC地址长度加id 6 + 6 + 1 = 13至少要大于12
if ((len == 0) || (len < 13)) // 新旧MAC地址长度加id 6 + 6 + 1 = 13至少要大于12
{
logError("data len error");
return -1;
@ -250,14 +265,14 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len)
}
else
{
//新阀门数据在前
// 新阀门数据在前
if (Flash_Set_Mac_Addr(&data[1], data[0]) != 0)
{
logError("阀门注册写入flash 错误");
return 3;
}
BSP_Bt_Valve_Updata(); // 更新阀门信息
Master_DisConnect();//更新后先断联接
Master_DisConnect(); // 更新后先断联接
}
return 0;
}
@ -266,10 +281,9 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len)
void BSP_Bt_Valve_Updata(void)
{
uint8_t cnt = 0;
__attribute__((aligned(4)))
uint8_t mac[6] = {0};
uint8_t num = Flash_Get_Valve_Num();
uint8_t num = Flash_Get_Valve_Num();
logInfo("BSP_Bt_Valve_Updata num: %d ", num);
if (num == 0)
{
@ -301,14 +315,13 @@ void BSP_Bt_Valve_Updata(void)
}
}
Flash_Set_Valve_Num(valve_list.valve_num);
}
//蓝牙主机对报警器的响应函数。 state表示此对应的项目可能是执行成功与否可能是蓝牙连接状态具体参考对应的case
int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state)
// 蓝牙主机对报警器的响应函数。 state表示此对应的项目可能是执行成功与否可能是蓝牙连接状态具体参考对应的case
int BSP_Bt_Valve_Resp(ValveCmdType cmd, uint8_t id, uint8_t *mac_addr, uint8_t state)
{
uint8_t ret = 0;
BtData_t *ptr = (BtData_t *)tmos_msg_allocate(sizeof(struct valve_data));
BtData_t *ptr = (BtData_t *)tmos_msg_allocate(sizeof(valve_data));
ptr->cmd = cmd;
switch (cmd)
{
@ -316,26 +329,37 @@ int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state)
case kValveCmdReg:
case kValveCmdRem:
case kValveCmdRep:
// TODO:待完成从机的一些主动上报信息解析
case kValveCmdOverPressure:
case kValveCmdUnderPressure:
case kValveCmdOverCurrent:
case kValveCmdMicroLeak:
case kValveCmdTimer:
case kValveCmdOpenWithStove:
case kValveCmdCloseWithStove:
case kValveCmdOverTemperature:
case kValveCmdDelayClose:
ptr->buf[0] = id;
tmos_memcpy(&ptr->buf[1], mac_addr, 6);
ptr->buf[7] = state;
BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 9);
ptr->buf[26] = state;
BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 28);
break;
case kValveCmdRemAll:
ptr->buf[0] = state;
BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 2);
break;
case kValveEventStatus:
tmos_memcpy(&ptr->buf[0], &valve_list.valve_data[id - 1], sizeof(struct valve_data));
BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, sizeof(struct valve_data));
tmos_memcpy(&ptr->buf[0], &valve_list.valve_data[id - 1], sizeof(valve_data));
BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, sizeof(valve_data));
break;
case kValveConncetStatus:
ptr->buf[0] = id;
tmos_memcpy(&ptr->buf[1], mac_addr, 6);
ptr->buf[7] = state; //0表示断开1表示连接
logDebug("连接状态:%d", ptr->buf[7]);
ptr->buf[7] = state; // 0表示断开1表示连接
logDebug("连接状态:%d", ptr->buf[7]);
BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 9);
break;
default:
break;
}