char3下发,char4通知

This commit is contained in:
stark1898y 2024-12-12 19:38:57 +08:00
parent 55be46451e
commit 65d60c4c23
14 changed files with 566 additions and 84 deletions

View File

@ -172,5 +172,5 @@
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
<storageModule moduleId="refreshScope"/>
</cproject> </cproject>

View File

@ -1,4 +1,7 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
encoding//BSP/inc/bsp_valve.h=UTF-8
encoding//BSP/src/bsp_valve.c=UTF-8
encoding//common/letter-shell/extensions/log/log.h=UTF-8
encoding//common/letter-shell/shell.c=UTF-8 encoding//common/letter-shell/shell.c=UTF-8
encoding//common/letter-shell/shell_cfg.h=UTF-8 encoding//common/letter-shell/shell_cfg.h=UTF-8
encoding//common/letter-shell/shell_port.c=UTF-8 encoding//common/letter-shell/shell_port.c=UTF-8

View File

@ -10,6 +10,9 @@
"devinfoservice.h": "c", "devinfoservice.h": "c",
"ch59x_uart.h": "c", "ch59x_uart.h": "c",
"bsp_uart.h": "c", "bsp_uart.h": "c",
"shell_port.h": "c" "shell_port.h": "c",
"atomic": "cpp",
"cstddef": "cpp",
"type_traits": "cpp"
} }
} }

View File

@ -19,6 +19,18 @@
#include "gattprofile.h" #include "gattprofile.h"
#include "peripheral.h" #include "peripheral.h"
#include "bsp_valve.h"
#include "log.h"
#undef LOG_ENABLE
#define LOG_ENABLE 1
#undef LOG_TAG
#define LOG_TAG "BSP_VALVE"
/********************************************************************* /*********************************************************************
* MACROS * MACROS
*/ */
@ -440,7 +452,7 @@ uint16_t Peripheral_ProcessEvent(uint8_t task_id, uint16_t events)
if(events & SBP_PHY_UPDATE_EVT) if(events & SBP_PHY_UPDATE_EVT)
{ {
// start phy update // start phy update
PRINT("PHY Update %x...\n", GAPRole_UpdatePHY(peripheralConnList.connHandle, 0, logDebug("PHY Update %x...\n", GAPRole_UpdatePHY(peripheralConnList.connHandle, 0,
GAP_PHY_BIT_LE_2M, GAP_PHY_BIT_LE_2M, 0)); GAP_PHY_BIT_LE_2M, GAP_PHY_BIT_LE_2M, 0));
return (events ^ SBP_PHY_UPDATE_EVT); return (events ^ SBP_PHY_UPDATE_EVT);
@ -472,7 +484,7 @@ static void Peripheral_ProcessGAPMsg(gapRoleEvent_t *pEvent)
{ {
case GAP_SCAN_REQUEST_EVENT: case GAP_SCAN_REQUEST_EVENT:
{ {
PRINT("Receive scan req from %x %x %x %x %x %x ..\n", pEvent->scanReqEvt.scannerAddr[0], logDebug("Receive scan req from %x %x %x %x %x %x ..\n", pEvent->scanReqEvt.scannerAddr[0],
pEvent->scanReqEvt.scannerAddr[1], pEvent->scanReqEvt.scannerAddr[2], pEvent->scanReqEvt.scannerAddr[3], pEvent->scanReqEvt.scannerAddr[1], pEvent->scanReqEvt.scannerAddr[2], pEvent->scanReqEvt.scannerAddr[3],
pEvent->scanReqEvt.scannerAddr[4], pEvent->scanReqEvt.scannerAddr[5]); pEvent->scanReqEvt.scannerAddr[4], pEvent->scanReqEvt.scannerAddr[5]);
break; break;
@ -480,7 +492,7 @@ static void Peripheral_ProcessGAPMsg(gapRoleEvent_t *pEvent)
case GAP_PHY_UPDATE_EVENT: case GAP_PHY_UPDATE_EVENT:
{ {
PRINT("Phy update Rx:%x Tx:%x ..\n", pEvent->linkPhyUpdate.connRxPHYS, pEvent->linkPhyUpdate.connTxPHYS); logDebug("Phy update Rx:%x Tx:%x ..\n", pEvent->linkPhyUpdate.connRxPHYS, pEvent->linkPhyUpdate.connTxPHYS);
break; break;
} }
@ -516,7 +528,7 @@ static void Peripheral_ProcessTMOSMsg(tmos_event_hdr_t *pMsg)
if(pMsgEvent->method == ATT_MTU_UPDATED_EVENT) if(pMsgEvent->method == ATT_MTU_UPDATED_EVENT)
{ {
peripheralMTU = pMsgEvent->msg.exchangeMTUReq.clientRxMTU; peripheralMTU = pMsgEvent->msg.exchangeMTUReq.clientRxMTU;
PRINT("mtu exchange: %d\n", pMsgEvent->msg.exchangeMTUReq.clientRxMTU); logDebug("mtu exchange: %d\n", pMsgEvent->msg.exchangeMTUReq.clientRxMTU);
} }
break; break;
} }
@ -543,7 +555,7 @@ static void Peripheral_LinkEstablished(gapRoleEvent_t *pEvent)
if(peripheralConnList.connHandle != GAP_CONNHANDLE_INIT) if(peripheralConnList.connHandle != GAP_CONNHANDLE_INIT)
{ {
GAPRole_TerminateLink(pEvent->linkCmpl.connectionHandle); GAPRole_TerminateLink(pEvent->linkCmpl.connectionHandle);
PRINT("Connection max...\n"); logDebug("Connection max...\n");
} }
else else
{ {
@ -561,7 +573,7 @@ static void Peripheral_LinkEstablished(gapRoleEvent_t *pEvent)
// Start read rssi // Start read rssi
tmos_start_task(Peripheral_TaskID, SBP_READ_RSSI_EVT, SBP_READ_RSSI_EVT_PERIOD); tmos_start_task(Peripheral_TaskID, SBP_READ_RSSI_EVT, SBP_READ_RSSI_EVT_PERIOD);
PRINT("Conn %x - Int %x \n", event->connectionHandle, event->connInterval); logDebug("Conn %x - Int %x \n", event->connectionHandle, event->connInterval);
} }
} }
@ -595,7 +607,7 @@ static void Peripheral_LinkTerminated(gapRoleEvent_t *pEvent)
} }
else else
{ {
PRINT("ERR..\n"); logDebug("ERR..\n");
} }
} }
@ -611,7 +623,7 @@ static void Peripheral_LinkTerminated(gapRoleEvent_t *pEvent)
*/ */
static void peripheralRssiCB(uint16_t connHandle, int8_t rssi) static void peripheralRssiCB(uint16_t connHandle, int8_t rssi)
{ {
PRINT("RSSI -%d dB Conn %x \n", -rssi, connHandle); logDebug("RSSI -%d dB Conn %x \n", -rssi, connHandle);
} }
/********************************************************************* /*********************************************************************
@ -635,12 +647,12 @@ static void peripheralParamUpdateCB(uint16_t connHandle, uint16_t connInterval,
peripheralConnList.connSlaveLatency = connSlaveLatency; peripheralConnList.connSlaveLatency = connSlaveLatency;
peripheralConnList.connTimeout = connTimeout; peripheralConnList.connTimeout = connTimeout;
PRINT("peripheralParamUpdateCB (connHandle)%x - (connInterval) %x- (connSlaveLatency) %x - (connTimeout) %x\n" logDebug("peripheralParamUpdateCB (connHandle)%x - (connInterval) %x- (connSlaveLatency) %x - (connTimeout) %x\n"
, connHandle, connInterval, connSlaveLatency, connTimeout); , connHandle, connInterval, connSlaveLatency, connTimeout);
} }
else else
{ {
PRINT("ERR..\n"); logDebug("ERR..\n");
} }
} }
@ -658,19 +670,19 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven
switch(newState & GAPROLE_STATE_ADV_MASK) switch(newState & GAPROLE_STATE_ADV_MASK)
{ {
case GAPROLE_STARTED: case GAPROLE_STARTED:
PRINT("Initialized..\n"); logDebug("Initialized..\n");
break; break;
case GAPROLE_ADVERTISING: case GAPROLE_ADVERTISING:
if(pEvent->gap.opcode == GAP_LINK_TERMINATED_EVENT) if(pEvent->gap.opcode == GAP_LINK_TERMINATED_EVENT)
{ {
Peripheral_LinkTerminated(pEvent); Peripheral_LinkTerminated(pEvent);
PRINT("Disconnected.. Reason:%x\n", pEvent->linkTerminate.reason); logDebug("Disconnected.. Reason:%x\n", pEvent->linkTerminate.reason);
PRINT("Advertising..\n"); logDebug("Advertising..\n");
} }
else if(pEvent->gap.opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT) else if(pEvent->gap.opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT)
{ {
PRINT("Advertising..\n"); logDebug("Advertising..\n");
} }
break; break;
@ -678,46 +690,46 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven
if(pEvent->gap.opcode == GAP_LINK_ESTABLISHED_EVENT) if(pEvent->gap.opcode == GAP_LINK_ESTABLISHED_EVENT)
{ {
Peripheral_LinkEstablished(pEvent); Peripheral_LinkEstablished(pEvent);
PRINT("Connected..\n"); logDebug("Connected..\n");
} }
break; break;
case GAPROLE_CONNECTED_ADV: case GAPROLE_CONNECTED_ADV:
if(pEvent->gap.opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT) if(pEvent->gap.opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT)
{ {
PRINT("Connected Advertising..\n"); logDebug("Connected Advertising..\n");
} }
break; break;
case GAPROLE_WAITING: case GAPROLE_WAITING:
if(pEvent->gap.opcode == GAP_END_DISCOVERABLE_DONE_EVENT) if(pEvent->gap.opcode == GAP_END_DISCOVERABLE_DONE_EVENT)
{ {
PRINT("Waiting for advertising..\n"); logDebug("Waiting for advertising..\n");
} }
else if(pEvent->gap.opcode == GAP_LINK_TERMINATED_EVENT) else if(pEvent->gap.opcode == GAP_LINK_TERMINATED_EVENT)
{ {
Peripheral_LinkTerminated(pEvent); Peripheral_LinkTerminated(pEvent);
PRINT("Disconnected.. Reason:%x\n", pEvent->linkTerminate.reason); logDebug("Disconnected.. Reason:%x\n", pEvent->linkTerminate.reason);
} }
else if(pEvent->gap.opcode == GAP_LINK_ESTABLISHED_EVENT) else if(pEvent->gap.opcode == GAP_LINK_ESTABLISHED_EVENT)
{ {
if(pEvent->gap.hdr.status != SUCCESS) if(pEvent->gap.hdr.status != SUCCESS)
{ {
PRINT("Waiting for advertising..\n"); logDebug("Waiting for advertising..\n");
} }
else else
{ {
PRINT("Error..\n"); logDebug("Error..\n");
} }
} }
else else
{ {
PRINT("Error..%x\n", pEvent->gap.opcode); logDebug("Error..%x\n", pEvent->gap.opcode);
} }
break; break;
case GAPROLE_ERROR: case GAPROLE_ERROR:
PRINT("Error..\n"); logDebug("Error..\n");
break; break;
default: default:
@ -741,12 +753,21 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven
*/ */
static void performPeriodicTask(void) static void performPeriodicTask(void)
{ {
static uint8_t counter = 0; // static uint8_t counter = 0;
uint8_t notiData[SIMPLEPROFILE_CHAR4_LEN] = {0x11, 0x22, 0x33, 0x44, 0}; // uint8_t notiData[SIMPLEPROFILE_CHAR4_LEN] = {0x11, 0x22, 0x33, 0x44, 0};
notiData[4] = counter; // notiData[4] = counter;
// peripheralChar4Notify(notiData, SIMPLEPROFILE_CHAR4_LEN); // // peripheralChar4Notify(notiData, SIMPLEPROFILE_CHAR4_LEN);
peripheralChar4Notify(notiData, 5); // peripheralChar4Notify(notiData, 5);
counter++; // counter++;
TsRawFrameData RawData;
static uint8_t humi;
humi = 0;
BSP_VALVE_Generate_Data(&RawData, 30, 25, humi++);
if (humi > 99)
{
humi = 0;
}
peripheralChar4Notify(&RawData.buf[0], RawData.len);
} }
/********************************************************************* /*********************************************************************
@ -764,7 +785,7 @@ static void peripheralChar4Notify(uint8_t *pValue, uint16_t len)
attHandleValueNoti_t noti; attHandleValueNoti_t noti;
if(len > (peripheralMTU - 3)) if(len > (peripheralMTU - 3))
{ {
PRINT("Too large noti\n"); logDebug("Too large noti\n");
return; return;
} }
noti.len = len; noti.len = len;
@ -779,6 +800,9 @@ static void peripheralChar4Notify(uint8_t *pValue, uint16_t len)
} }
} }
uint8_t newValue[SIMPLEPROFILE_CHAR3_LEN];
/********************************************************************* /*********************************************************************
* @fn simpleProfileChangeCB * @fn simpleProfileChangeCB
* *
@ -792,31 +816,66 @@ static void peripheralChar4Notify(uint8_t *pValue, uint16_t len)
*/ */
static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len) static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len)
{ {
TsRawFrameData RawData;
switch(paramID) switch(paramID)
{ {
case SIMPLEPROFILE_CHAR1: case SIMPLEPROFILE_CHAR1:
{ {
uint8_t newValue[SIMPLEPROFILE_CHAR1_LEN]; uint8_t newValue[SIMPLEPROFILE_CHAR1_LEN];
tmos_memcpy(newValue, pValue, len); tmos_memcpy(newValue, pValue, len);
PRINT("profile ChangeCB CHAR1.. Start\n"); logDebug("profile ChangeCB CHAR1.. Start\n");
for (uint8_t i = 0; i < len; i++) for (uint8_t i = 0; i < len; i++)
{ {
PRINT("%02x ", newValue[i]); logDebug("%02x ", newValue[i]);
} }
PRINT("\n profile ChangeCB CHAR1.. End\n"); logDebug("\n profile ChangeCB CHAR1.. End\n");
break; break;
} }
case SIMPLEPROFILE_CHAR3: case SIMPLEPROFILE_CHAR3:
{ {
uint8_t newValue[SIMPLEPROFILE_CHAR3_LEN]; tmos_memset(newValue, 0, sizeof(newValue));
tmos_memcpy(newValue, pValue, len); tmos_memcpy(newValue, pValue, len);
PRINT("profile ChangeCB CHAR3.. Start\n"); logDebug("profile ChangeCB CHAR3.. Start");
// logHexDumpAll(newValue, len);
for (uint8_t i = 0; i < len; i++) for (uint8_t i = 0; i < len; i++)
{ {
PRINT("%02x ", newValue[i]); logDebug("%02x ", newValue[i]);
} }
PRINT("\n profile ChangeCB CHAR3.. End\n"); #if 1
TsFrameData *HostFrameData = BSP_VAVLE_GetFrameData(newValue, len);
if (HostFrameData != NULL)
{
logHexDumpAll(&HostFrameData->data[0], HostFrameData->len); // 数据段
// HR_ProcessData(HostFrameData);
switch (HostFrameData->cmd)
{
case kCmdCfg:
// uint8_t data_buf[64] = {0};
// tmos_memset(data_buf, 0, sizeof(data_buf));
// 处理数据帧
logDebug("kCmdCfg");
break;
case kCmdCloseVavle:
logDebug("kCmdCloseVavle");
BSP_VALVE_Generate_ValveResponse(&RawData, kCmdCloseVavle, 1);
peripheralChar4Notify((uint8_t*)&RawData.buf[0], RawData.len);
break;
case kCmdOpenVavle:
logDebug("kCmdOpenVavle");
BSP_VALVE_Generate_ValveResponse(&RawData, kCmdOpenVavle, 1);
peripheralChar4Notify((uint8_t*)&RawData.buf[0], RawData.len);
break;
default:
logError("无效的命令");
// logHexDumpAll(data, len);
break;
}
}
tmos_msg_deallocate((uint8_t*)HostFrameData);
HostFrameData = NULL;
#endif
logDebug("profile ChangeCB CHAR3.. End");
break; break;
} }

View File

@ -56,58 +56,58 @@ __attribute__((noinline)) void Main_Circulation()
{ {
// 12V_EN // 12V_EN
BOOST_EN; BOOST_EN;
PRINT("BOOST_EN\n"); logDebug("BOOST_EN\n");
// LED_R // LED_R
LED_R_ON; LED_R_ON;
DelayMs(1000); DelayMs(1000);
PRINT("LED_R_ON\n"); logDebug("LED_R_ON\n");
LED_ALL_OFF_DEINIT; LED_ALL_OFF_DEINIT;
DelayMs(1000); DelayMs(1000);
PRINT("LED_ALL_OFF_DEINIT\n"); logDebug("LED_ALL_OFF_DEINIT\n");
// BEEP // BEEP
BEEP_ON; BEEP_ON;
DelayMs(1000); DelayMs(1000);
PRINT("BEEP_ON\n"); logDebug("BEEP_ON\n");
BEEP_OFF_DEINIT; BEEP_OFF_DEINIT;
DelayMs(1000); DelayMs(1000);
PRINT("BEEP_OFF_DEINIT\n"); logDebug("BEEP_OFF_DEINIT\n");
// LED_G // LED_G
LED_G_ON; LED_G_ON;
DelayMs(1000); DelayMs(1000);
PRINT("LED_G_ON\n"); logDebug("LED_G_ON\n");
LED_ALL_OFF_DEINIT; LED_ALL_OFF_DEINIT;
DelayMs(1000); DelayMs(1000);
PRINT("LED_ALL_OFF_DEINIT\n"); logDebug("LED_ALL_OFF_DEINIT\n");
// LED_Y // LED_Y
LED_Y_ON; LED_Y_ON;
DelayMs(1000); DelayMs(1000);
PRINT("LED_Y_ON\n"); logDebug("LED_Y_ON\n");
LED_ALL_OFF_DEINIT; LED_ALL_OFF_DEINIT;
DelayMs(1000); DelayMs(1000);
PRINT("LED_ALL_OFF_DEINIT\n"); logDebug("LED_ALL_OFF_DEINIT\n");
PRINT("Delay 6s\n"); logDebug("Delay 6s\n");
// EMV_CHARGE // EMV_CHARGE
EMV_CHARGE_EN; EMV_CHARGE_EN;
PRINT("EMV_CHARGE_EN\n"); logDebug("EMV_CHARGE_EN\n");
DelayMs(1000); DelayMs(1000);
EMV_CHARGE_OFF_DEINIT; EMV_CHARGE_OFF_DEINIT;
PRINT("EMV_CHARGE_OFF_DEINIT 500 ms\n"); logDebug("EMV_CHARGE_OFF_DEINIT 500 ms\n");
// EMV_CTRL // EMV_CTRL
EMV_ON; EMV_ON;
PRINT("EMV_ON\n"); logDebug("EMV_ON\n");
DelayMs(100); DelayMs(100);
BOOST_OFF_DEINIT; BOOST_OFF_DEINIT;
@ -145,8 +145,8 @@ int main(void)
// UART1_DefInit(); // UART1_DefInit();
// ¸Ä³É1500000²¨ÌØÂÊÁË // ¸Ä³É1500000²¨ÌØÂÊÁË
BSP_UART1_Init(1500000); BSP_UART1_Init(460800);
// PRINT("Start @ChipID=%02X\n", R8_CHIP_ID); // logDebug("Start @ChipID=%02X\n", R8_CHIP_ID);
logDebug("Start @ChipID=%02X\n", R8_CHIP_ID); logDebug("Start @ChipID=%02X\n", R8_CHIP_ID);
#endif #endif
@ -161,14 +161,8 @@ int main(void)
BSP_KEY_Init(); BSP_KEY_Init();
BSP_ADC_Init(); BSP_ADC_Init();
PRINT("%s\n", VER_LIB);
// while (1)
// {
// DelayMs(1000);
// }
CH59x_BLEInit(); CH59x_BLEInit();
logDebug("%s\n", VER_LIB);
HAL_Init(); HAL_Init();
GAPRole_PeripheralInit(); GAPRole_PeripheralInit();
Peripheral_Init(); Peripheral_Init();

45
BSP/inc/bsp_flash.h Normal file
View File

@ -0,0 +1,45 @@
/*
* @Author : stark1898y 1658608470@qq.com
* @Date : 2024-12-12 15:54:51
* @LastEditors : stark1898y 1658608470@qq.com
* @LastEditTime : 2024-12-12 16:34:01
* @FilePath : \BLE_TYQ_CH592F\BSP\inc\bsp_flash.h
* @Description :
*
* Copyright (c) 2024 by yzy, All Rights Reserved.
*/
#ifndef __BSP_FLASH_H__
#define __BSP_FLASH_H__
#include "CONFIG.h"
/*CH584具有data_flash和code flash两部分。 codeflash为448k dataflash为32k
CodeFlash读操作是有硬件加扰的FFDataFlash读操作没有硬件加扰
CodeFlash和DataFlash都可以直接指针读数据()
0x00000000-0x0006FFFF CodeFlash 448KB
0x00070000-0x00077FFF DataFlash 32KB
0x00078000-0x0007DFFF BootLoader 24KB
0x0007E000-0x0007FFFF InfoFlash 8KB
*/
/*BLE蓝牙falsh写入注意地址是相对于dataflash的而dataflash的起始地址是0x3FFF所以传入的参数是0x3FFF+offset
https://www.cnblogs.com/JayWellsBlog/p/18223898
/buff缓存在ram中的地址4hardfault复位
https://www.cnblogs.com/iot-fan/p/16053937.html
*/
#define DATA_FALASH_START_ADDR (0X3FFF) // 传入的是相对地址,用对函数即可
#define DATA_FLASH_PAGE_SIZE (256U)
#define FLASH_INFO_ADDR (DATA_FALASH_START_ADDR)
#define FLASH_INFO_WRITE_FLAG_ADDR (DATA_FALASH_START_ADDR)
#define FLASH_INFO_WRITE_FLAG_VAL (0XAABBCCDD)
#define FLASH_INFO_WRITE_FLAG_LEN (4U)
void BSP_FLASH_Init(void);
#endif // !__BSP_FLASH_H__

View File

@ -5,7 +5,7 @@
#include "CONFIG.h" #include "CONFIG.h"
#define UART1_RX_BUFFER_LENGTH 64U #define UART1_RX_BUFFER_LENGTH 64U
#define UART1_TX_BUFFER_LENGTH 128U #define UART1_TX_BUFFER_LENGTH 1024U
void BSP_UART1_Init(uint32_t baudrate); void BSP_UART1_Init(uint32_t baudrate);

82
BSP/inc/bsp_valve.h Normal file
View File

@ -0,0 +1,82 @@
/*
* @Author : stark1898y 1658608470@qq.com
* @Date : 2024-12-12 15:55:38
* @LastEditors : stark1898y 1658608470@qq.com
* @LastEditTime : 2024-12-12 19:08:06
* @FilePath : \BLE_TYQ_CH592F\BSP\inc\bsp_valve.h
* @Description :
*
* Copyright (c) 2024 by yzy, All Rights Reserved.
*/
#ifndef __BSP_VALVE_H__
#define __BSP_VALVE_H__
#include "CONFIG.h"
#define FRAME_HEADER 0xAA
#define FRAME_TAIL 0x55
// 0xAA CMD/DATA/ DATA_LEN (DATA) checksum 0x55
typedef enum
{
kCmdCfg = 0X01,
kCmdCloseVavle,
kCmdOpenVavle,
kCmdData,
} TeFrameCmd;
// typedef enum
// {
// } TeCmdIndex;
typedef struct __attribute__((packed))
{
TeFrameCmd cmd; // CMD/DATA
uint8_t len; // DATA_LEN
// TsValveData data;
uint8_t data[];
} TsFrameData;
typedef struct __attribute__((packed))
{
uint8_t len;
uint8_t buf[128];
} TsRawFrameData;
// 阀门类型
typedef enum
{
kTyq = 0X01,
kZbf,
kDcf,
} TeVavleType;
typedef struct __attribute__((packed))
{
uint8_t type; // 阀门类型
uint8_t bat; // 1B 电池电压 30=3V,18=1.8V
int8_t temp; // 1B 阀门温度 有符号整数 25 ℃
uint8_t hum; // 1B 阀门湿度 %RH
// uint8_t status; // 1B 阀门工作状态 超欠压、过流
// uint8_t connct_status; // 1B 阀门连接状态 电磁阀BLE控制盒 0=未连接 1=已连接
// uint8_t switch_status; // 1B 阀门开关状态 0=未知 1=关闭 2=关闭过,未按按键恢复 3=关闭过,按下了恢复键 4=打开
// uint32_t in_pressure; // 4B 阀门入口压力 Pa
// uint32_t out_pressure; // 4B 阀门出口压力 Pa
// uint32_t atm_pressure; // 4B 阀门大气压力 Pa
} TsValveData;
uint8_t CheckSum(const uint8_t *data, size_t len);
void BSP_VAVLE_Init(void);
TsFrameData* BSP_VAVLE_GetFrameData(uint8_t *data, uint16_t len);
void BSP_VALVE_Generate_Data(TsRawFrameData *pRawData, uint8_t bat, int8_t temp, uint8_t hum);
void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd, uint8_t status);
#endif // ! __BSP_VALVE_H__

50
BSP/src/bsp_flash.c Normal file
View File

@ -0,0 +1,50 @@
/*
* @Author : stark1898y 1658608470@qq.com
* @Date : 2024-12-12 15:54:57
* @LastEditors : stark1898y 1658608470@qq.com
* @LastEditTime : 2024-12-12 16:47:22
* @FilePath : \BLE_TYQ_CH592F\BSP\src\bsp_flash.c
* @Description :
*
* Copyright (c) 2024 by yzy, All Rights Reserved.
*/
#include "bsp_flash.h"
#include "CONFIG.h"
#include "string.h"
#include "bsp_valve.h"
#undef LOG_ENABLE
#define LOG_ENABLE 1
#include "log.h"
void Flash_ErasePage_ReadCfgInfo(uint8_t *page_buf)
{
EEPROM_READ(FLASH_INFO_ADDR, page_buf, DATA_FLASH_PAGE_SIZE);
EEPROM_ERASE(FLASH_INFO_ADDR, DATA_FLASH_PAGE_SIZE);
}
int Flash_Write_CfgInfo(uint8_t *page_buf)
{
EEPROM_WRITE(FLASH_INFO_ADDR, page_buf, DATA_FLASH_PAGE_SIZE);
return 0;
}
void BSP_FLASH_Init(void)
{
uint32_t flash_write_flag = 0;
EEPROM_READ(FLASH_INFO_WRITE_FLAG_ADDR, &flash_write_flag, FLASH_INFO_WRITE_FLAG_LEN);
// 判断是否需要初始化
if (flash_write_flag != FLASH_INFO_WRITE_FLAG_VAL) // 用以防止刷掉写入的数据
{
flash_write_flag = FLASH_INFO_WRITE_FLAG_VAL;
// 擦除数据
EEPROM_ERASE(FLASH_INFO_ADDR, DATA_FLASH_PAGE_SIZE); // 擦除待写区
EEPROM_WRITE(FLASH_INFO_WRITE_FLAG_ADDR, &flash_write_flag, FLASH_INFO_WRITE_FLAG_LEN);
logWarning("First Init flash_write_flag:%d", flash_write_flag);
}
logDebug("BSP_FLASH_Init");
}

View File

@ -67,7 +67,7 @@ void BSP_UART1_Init(uint32_t baudrate)
/* 配置串口1先配置IO口模式再配置串口 */ /* 配置串口1先配置IO口模式再配置串口 */
GPIOA_SetBits(bTXD1); GPIOA_SetBits(bTXD1);
GPIOB_ModeCfg(bRXD1, GPIO_ModeIN_PU); // RXD-配置上拉输入 // GPIOB_ModeCfg(bRXD1, GPIO_ModeIN_PU); // RXD-配置上拉输入
GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出注意先让IO口输出高电平 GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出注意先让IO口输出高电平
// UART1_DefInit(); // UART1_DefInit();
{ {
@ -77,10 +77,11 @@ void BSP_UART1_Init(uint32_t baudrate)
R8_UART1_IER = RB_IER_TXD_EN; R8_UART1_IER = RB_IER_TXD_EN;
R8_UART1_DIV = 1; R8_UART1_DIV = 1;
} }
UART1_ByteTrigCfg(UART_1BYTE_TRIG); // UART1_ByteTrigCfg(UART_1BYTE_TRIG);
// 中断方式接收数据 // 中断方式接收数据
UART1_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY); // UART1_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY);
PFIC_EnableIRQ(UART1_IRQn); // UART1_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY);
// PFIC_EnableIRQ(UART1_IRQn);
UART1_FifoInit(); UART1_FifoInit();

245
BSP/src/bsp_valve.c Normal file
View File

@ -0,0 +1,245 @@
/*
* @Author: mbw
* @Date: 2024-12-09 11:40:10
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-11 15:43:47
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_valve.c
* @Description:
*
* Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
*/
#include "bsp_valve.h"
#include "bsp_flash.h"
#include "bsp_uart.h"
#include "bsp_beep_led_emv.h"
// 0xAA CMD/DATA/ DATA_LEN (DATA) checksum 0x55
#include "log.h"
#undef LOG_ENABLE
#define LOG_ENABLE 0
#undef LOG_TAG
#define LOG_TAG "BSP_VALVE"
/**
* @description: 256255
* @param {uint8_t} *data
* @param {uint16_t} len
* @return {*}
*/
uint8_t CheckSum(const uint8_t *data, size_t len)
{
uint8_t sum = 0;
for (size_t i = 0; i < len; i++)
{
sum += data[i];
}
return sum;
}
#if 0
/**
* @description:
* @param {TsFrameData} *pFrameData
* @param {uint8_t} *p_src
* @param {uint16_t} src_len
* @return {*}
*/
TsFrameData *HR_GetFrameData(const uint8_t *p_src, const uint8_t src_len)
{
uint8_t data_field_len = 0;
uint8_t check_sum = 0;
TsFrameData *get_buffer = NULL;
for (uint8_t i = 0; i < src_len; i++)
{
// 找帧头
if (p_src[i] == FRAME_HEADER)
{
// 找数据长度
data_field_len = p_src[i + 2];
// 找帧尾
if (p_src[i + 2 + data_field_len + 2] == FRAME_TAIL)
{
check_sum = CheckSum(&p_src[i], (3 + data_field_len));
if (p_src[i + 2 + data_field_len + 1] == check_sum)
{
get_buffer = (TsFrameData *)tmos_msg_allocate(sizeof(TsFrameData) + sizeof(uint8_t) * data_field_len);
if (get_buffer == NULL)
{
logError("tmos_msg_allocate fail");
return NULL;
}
get_buffer->cmd = p_src[i + 1];
get_buffer->len = data_field_len;
if (data_field_len > 0)
{
tmos_memcmp(get_buffer->data, &p_src[i + 4], data_field_len);
}
logDebug("HR_GetDataFrame Success!");
return get_buffer;
}
}
}
}
logError("HR_GetDataFrame Fail!");
return get_buffer;
}
#endif
TsFrameData* BSP_VAVLE_GetFrameData(uint8_t *data, uint16_t len)
{
int ret = 0;
uint16_t index = 0;
TsFrameData *get_buffer = NULL;
// 解析接收到的数据帧先寻找AA开头然后再找AA下一个字节其代表了数据长度然后找到代表长度的值的长度的下一位其为校验码校验码后为结束码0x55
// 如果数据正确,则提取数据,不正确,则不处理
if (len < 4)
{ // 至少需要 4 个字节:起始码、长度、校验码、结束码
logError("数据帧长度不足");
logHexDumpAll(data, len);
// return 1;
}
while (index < len && data[index] != FRAME_HEADER) // 寻找起始码 0xAA
{
index++;
}
if (index >= len - 3) // 不够空间容纳长度、校验码和结束码
{
logError("数据帧起始码错误");
logHexDumpAll(data, len);
// return 2;
}
uint16_t data_len = data[index + 2]; // 读取数据长度
if (index + 3 + data_len + 1 >= len) // 检查数据长度是否合理 数据长度 + 校验码 + 结束码
{
logError("数据帧长度错误");
logHexDumpAll(data, len);
// return 3;
}
uint8_t check_sum = data[index + 3 + data_len]; // 读取校验码
uint8_t calculated_sum = CheckSum(&data[index], data_len + 3); // 计算校验码
if (check_sum != calculated_sum)
{
logError("数据帧校验码错误 check_sum = %02X, calculated_sum = %02X", check_sum, calculated_sum);
logHexDumpAll(data, len);
// return 4;
}
if (data[index + 3 + data_len + 1] != FRAME_TAIL) // 检查结束码
{
logError("数据帧结束码错误");
logHexDumpAll(data, len);
// return 5;
}
logDebug("数据帧校验通过");
get_buffer = (TsFrameData *)tmos_msg_allocate(sizeof(TsFrameData) + sizeof(uint8_t) * data_len);
if (get_buffer == NULL)
{
logError("tmos_msg_allocate fail");
return NULL;
}
get_buffer->cmd = data[index + 1];
get_buffer->len = data_len;
// get_buffer->data = data;
if (data_len > 0)
{
tmos_memcpy(get_buffer->data, &data[index + 3], data_len);
return get_buffer;
}
// //有效数据长度
// size_t data_len = (data_len + 5);
// //到这一步说明数据没问题,将接收到的数据通过中心任务发送出去
// uint8_t *p_data;
// p_data = tmos_msg_allocate(data_len);
// if (p_data)
// {
// tmos_memcpy(p_data, data, data_len);
// tmos_msg_send(BtRxTaskId, p_data);
// tmos_start_task(BtRxTaskId, SYS_EVENT_MSG, 0);
// }
}
uint8_t _GenerateRawFrame(TsRawFrameData *pRawData, uint8_t cmd, const uint8_t *p_src, uint8_t src_len)
{
// 0xAA CMD/DATA/ DATA_LEN (DATA) checksum 0x55
pRawData->len = src_len + 5;
tmos_memset(pRawData->buf, 0, sizeof(pRawData->buf));
pRawData->buf[0] = FRAME_HEADER;
pRawData->buf[1] = cmd;
pRawData->buf[2] = src_len;
tmos_memcpy(&pRawData->buf[3], p_src, src_len);
// 从帧起始符开始到校验码之前所有字节的和的模256
// 即各字节不计超过255的溢出值的二进制算术和。
pRawData->buf[pRawData->len - 2] = CheckSum(&pRawData->buf[0], pRawData->len - 2);
pRawData->buf[pRawData->len - 1] = FRAME_TAIL;
logHexDumpAll(&pRawData->buf[0], pRawData->len);
return 0;
}
void BSP_VALVE_Generate_Data(TsRawFrameData *pRawData, uint8_t bat, int8_t temp, uint8_t hum)
{
TsValveData ValveData;
ValveData.type = kTyq; // 阀门类型
ValveData.bat = bat; // 电池电压 30=3V,18=1.8V
ValveData.temp = temp; // 阀门温度 有符号整数 25 ℃
ValveData.hum = hum; // 阀门湿度 %RH
_GenerateRawFrame(pRawData, kCmdData, (uint8_t*)&ValveData, sizeof(ValveData));
logHexDumpAll(&pRawData->buf[0], pRawData->len);
}
void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd, uint8_t status)
{
uint8_t data = 0;
data = status;
_GenerateRawFrame(pRawData, cmd, &data, 1);
logHexDumpAll(&pRawData->buf[0], pRawData->len);
}
void BSP_CloseValve(void)
{
// EMV_CHARGE
EMV_CHARGE_EN;
logDebug("EMV_CHARGE_EN");
DelayMs(1000);
EMV_CHARGE_OFF_DEINIT;
logDebug("EMV_CHARGE_OFF_DEINIT 500 ms");
// EMV_CTRL
EMV_ON;
logDebug("EMV_ON\n");
DelayMs(100);
}
void BSP_VAVLE_Init(void)
{
logInfo("BSP_Valve_Init");
}

View File

@ -4,9 +4,9 @@
* @brief log * @brief log
* @version 1.0.0 * @version 1.0.0
* @date 2020-07-30 * @date 2020-07-30
* *
* @copyright (c) 2020 Letter * @copyright (c) 2020 Letter
* *
*/ */
#ifndef __LOG_H__ #ifndef __LOG_H__
#define __LOG_H__ #define __LOG_H__
@ -90,7 +90,7 @@ extern "C" {
/** /**
* @brief * @brief
* *
*/ */
typedef enum typedef enum
{ {
@ -98,7 +98,7 @@ typedef enum
LOG_ERROR = 1, /**< 错误 */ LOG_ERROR = 1, /**< 错误 */
LOG_WRANING = 2, /**< 警告 */ LOG_WRANING = 2, /**< 警告 */
LOG_INFO = 3, /**< 消息 */ LOG_INFO = 3, /**< 消息 */
LOG_DEBUG = 4, /**< 调试 */ logDebugEBUG = 4, /**< 调试 */
LOG_VERBOSE = 5, /**< 冗余 */ LOG_VERBOSE = 5, /**< 冗余 */
LOG_ALL = 6, /**< 所有日志 */ LOG_ALL = 6, /**< 所有日志 */
} LogLevel; } LogLevel;
@ -106,14 +106,14 @@ typedef enum
/** /**
* @brief log对象定义 * @brief log对象定义
* *
*/ */
typedef struct log_def typedef struct log_def
{ {
void (*write)(char *, short); /**< 写buffer */ void (*write)(char *, short); /**< 写buffer */
char active; /**< 是否激活 */ char active; /**< 是否激活 */
LogLevel level; /**< 日志级别 */ LogLevel level; /**< 日志级别 */
#if LOG_USING_LOCK == 1 #if LOG_USING_LOCK == 1
int (*lock)(struct log_def *); /**< log 加锁 */ int (*lock)(struct log_def *); /**< log 加锁 */
int (*unlock)(struct log_def *); /**< log 解锁 */ int (*unlock)(struct log_def *); /**< log 解锁 */
#endif /** LOG_USING_LOCK == 1 */ #endif /** LOG_USING_LOCK == 1 */
@ -124,7 +124,7 @@ typedef struct log_def
/** /**
* @brief log打印() * @brief log打印()
* *
* @param fmt * @param fmt
* @param ... * @param ...
*/ */
@ -134,7 +134,7 @@ typedef struct log_def
/** /**
* @brief * @brief
* *
* @param text * @param text
* @param level * @param level
* @param fmt * @param fmt
@ -147,7 +147,7 @@ typedef struct log_def
/** /**
* @brief log输出 * @brief log输出
* *
* @param fmt * @param fmt
* @param ... * @param ...
*/ */
@ -156,7 +156,7 @@ typedef struct log_def
/** /**
* @brief log输出 * @brief log输出
* *
* @param fmt * @param fmt
* @param ... * @param ...
*/ */
@ -165,7 +165,7 @@ typedef struct log_def
/** /**
* @brief log输出 * @brief log输出
* *
* @param fmt * @param fmt
* @param ... * @param ...
*/ */
@ -174,16 +174,16 @@ typedef struct log_def
/** /**
* @brief log输出 * @brief log输出
* *
* @param fmt * @param fmt
* @param ... * @param ...
*/ */
#define logDebug(fmt, ...) \ #define logDebug(fmt, ...) \
logFormat(DEBUG_TEXT, LOG_DEBUG, fmt, ##__VA_ARGS__) logFormat(DEBUG_TEXT, logDebugEBUG, fmt, ##__VA_ARGS__)
/** /**
* @brief log输出 * @brief log输出
* *
* @param fmt * @param fmt
* @param ... * @param ...
*/ */
@ -192,7 +192,7 @@ typedef struct log_def
/** /**
* @brief * @brief
* *
* @param expr * @param expr
* @param action * @param action
*/ */
@ -204,7 +204,7 @@ typedef struct log_def
/** /**
* @brief 16 * @brief 16
* *
* @param base * @param base
* @param length * @param length
*/ */

View File

@ -51,7 +51,7 @@ log是一个用于嵌入式系统的日志打印工具可以为日志定义
Log uartLog = { Log uartLog = {
.write = uartLogWrite, .write = uartLogWrite,
.active = true, .active = true,
.level = LOG_DEBUG .level = logDebugEBUG
}; };
``` ```
@ -191,7 +191,7 @@ log工具可以结合letter shell的尾行模式实现log和shell共用一个
Log uartLog = { Log uartLog = {
.write = uartLogWrite, .write = uartLogWrite,
.active = true, .active = true,
.level = LOG_DEBUG .level = logDebugEBUG
}; };
``` ```

View File

@ -14,7 +14,7 @@
#include "shell.h" #include "shell.h"
#define SHELL_BUF_LENGTH 128 #define SHELL_BUF_LENGTH 1024
extern Shell shell; extern Shell shell;