This commit is contained in:
小马_666 2024-12-16 15:34:47 +08:00
parent c086350b69
commit 4480a85138
16 changed files with 515 additions and 368 deletions

View File

@ -16,6 +16,4 @@ encoding//StdPeriphDriver/inc/CH58x_gpio.h=GBK
encoding//StdPeriphDriver/inc/CH58x_sys.h=GBK
encoding//StdPeriphDriver/inc/CH58x_uart.h=GBK
encoding//StdPeriphDriver/inc/ISP585.h=GBK
encoding//bsp/inc/bsp_master.h=GBK
encoding//bsp/inc/bsp_uart.h=UTF-8
encoding//bsp/src/bsp_master.c=GBK

View File

@ -20,6 +20,8 @@
"files.associations": {
"*.dbclient-js": "javascript",
"config.h": "c",
"ch58xble_lib.h": "c"
"ch58xble_lib.h": "c",
"bsp_uart.h": "c",
"bsp_iwdg.h": "c"
}
}

View File

@ -116,6 +116,7 @@ extern centralConnItem_t centralConnList[CENTRAL_MAX_CONNECTION];
int BSP_Master_Send(centralConnItem_t *centralConnList, uint8_t id, uint8_t *Data, uint8_t Len);
void Master_Connect(void);
void Master_DisConnect(void);
/*********************************************************************
*********************************************************************/

View File

@ -12,6 +12,13 @@
#undef LOG_ENABLE
#define LOG_ENABLE 1
#define MASTER_START_EVT (0X01 << 0)
#define MASTER_CONNECT_EVT (0X01 << 1)
#define MASTER_DISCONN_EVT (0X01 << 2)
#define MASTER_DETECT_EVT (0X01 << 3)
uint8_t MasterCtrTaskId;
/*********************************************************************
* MACROS
*/
@ -23,20 +30,19 @@
* CONSTANTS
*/
// Maximum number of scan responses
#define DEFAULT_MAX_SCAN_RES 30
#define DEFAULT_MAX_SCAN_RES 1
// Scan duration in 0.625ms
#define DEFAULT_SCAN_DURATION 2400 // 2400*0.625 = 1500ms
#define DEFAULT_SCAN_DURATION 1600 * 3 // 2400*0.625 = 1500ms
// Connection min interval in 1.25ms
#define DEFAULT_MIN_CONNECTION_INTERVAL 80
#define DEFAULT_MIN_CONNECTION_INTERVAL (80 * 9)
// Connection max interval in 1.25ms
#define DEFAULT_MAX_CONNECTION_INTERVAL 80 * 5
#define DEFAULT_MAX_CONNECTION_INTERVAL 80 * 10
// Connection supervision timeout in 10ms
/*修改为最大值*/
#define DEFAULT_CONNECTION_TIMEOUT 100 // 32s
#define DEFAULT_CONNECTION_TIMEOUT (100 * 5)
// Discovey mode (limited, general, all)
#define DEFAULT_DISCOVERY_MODE DEVDISC_MODE_ALL
@ -54,19 +60,19 @@
#define DEFAULT_LINK_WHITE_LIST FALSE
// Default read RSSI period in 0.625ms
#define DEFAULT_RSSI_PERIOD 2400
#define DEFAULT_RSSI_PERIOD 4800
// Minimum connection interval (units of 1.25ms)
#define DEFAULT_UPDATE_MIN_CONN_INTERVAL 20
#define DEFAULT_UPDATE_MIN_CONN_INTERVAL DEFAULT_MIN_CONNECTION_INTERVAL
// Maximum connection interval (units of 1.25ms)
#define DEFAULT_UPDATE_MAX_CONN_INTERVAL 100
#define DEFAULT_UPDATE_MAX_CONN_INTERVAL DEFAULT_MAX_CONNECTION_INTERVAL
// Slave latency to use parameter update
#define DEFAULT_UPDATE_SLAVE_LATENCY 5
#define DEFAULT_UPDATE_SLAVE_LATENCY 3
// Supervision timeout value (units of 10ms)
#define DEFAULT_UPDATE_CONN_TIMEOUT 600
#define DEFAULT_UPDATE_CONN_TIMEOUT 100 * 5
// Default passcode
#define DEFAULT_PASSCODE 0
@ -84,10 +90,10 @@
#define DEFAULT_IO_CAPABILITIES GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT
// Default service discovery timer delay in 0.625ms
#define DEFAULT_SVC_DISCOVERY_DELAY 800
#define DEFAULT_SVC_DISCOVERY_DELAY 10
// Default parameter update delay in 0.625ms
#define DEFAULT_PARAM_UPDATE_DELAY 3200
#define DEFAULT_PARAM_UPDATE_DELAY 1600
// Default read or write timer delay in 0.625ms
#define DEFAULT_READ_OR_WRITE_DELAY 1600
@ -96,7 +102,7 @@
#define DEFAULT_WRITE_CCCD_DELAY 1600
// Establish link timeout in 0.625ms
#define ESTABLISH_LINK_TIMEOUT 3200
#define ESTABLISH_LINK_TIMEOUT 1600 * 3
// Application states
enum
@ -147,10 +153,7 @@ static gapDevRec_t centralDevList[DEFAULT_MAX_SCAN_RES];
// Peer device address
peerAddrDefItem_t PeerAddrDef[CENTRAL_MAX_CONNECTION] = {
// {0xcf, 0xb4, 0x8f, 0x10, 0x53, 0x5c},
// {0xe1, 0X51, 0x89, 0x88, 0x19, 0x70},
// {0xb6, 0xb4, 0x8f, 0x10, 0x53, 0x5c},
// {0x03, 0x02, 0x03, 0xE4, 0xC2, 0x84},
};
// Connection item list
@ -181,6 +184,7 @@ static void centralInitConnItem(uint8_t task_id, centralConnItem_t *centralConnL
static uint8_t centralAddrCmp(peerAddrDefItem_t *PeerAddrDef, uint8_t *addr);
int BSP_Master_Receive_Data(uint8_t task_id, uint8_t *data, uint16_t len);
uint16_t Master_ProcessEvent(uint8_t task_id, uint16_t events);
/*********************************************************************
* PROFILE CALLBACKS
*/
@ -244,10 +248,15 @@ void Central_Init()
centralInitConnItem(centralTaskId, centralConnList);
// Initialize GATT Client
GATT_InitClient();
// Register to receive incoming ATT Indications/Notifications
GATT_RegisterForInd(centralTaskId);
// Setup a delayed profile startup
tmos_set_event(centralTaskId, START_DEVICE_EVT);
//用户自定义
MasterCtrTaskId = TMOS_ProcessEventRegister(Master_ProcessEvent);
tmos_set_event(MasterCtrTaskId, MASTER_START_EVT);
}
/*********************************************************************
@ -348,14 +357,19 @@ uint16_t Central_ProcessEvent(uint8_t task_id, uint16_t events)
*/
static uint16_t connect0_ProcessEvent(uint8_t task_id, uint16_t events)
{
logDebug("connect0_ProcessEvent 0x%02x", events);
if (events & START_SVC_DISCOVERY_EVT)
{
logDebug("START_SVC_DISCOVERY_EVT");
centralConnList[CONNECT0_ITEM].procedureInProgress = FALSE;
// start service discovery
centralConnIistStartDiscovery_0();
// centralConnIistStartDiscovery_0();;
return (events ^ START_SVC_DISCOVERY_EVT);
}
if (events & START_READ_OR_WRITE_EVT)
{
logDebug("START_READ_OR_WRITE_EVT");
if (centralConnList[CONNECT0_ITEM].procedureInProgress == FALSE)
{
if (centralDoWrite)
@ -421,14 +435,14 @@ static uint16_t connect0_ProcessEvent(uint8_t task_id, uint16_t events)
logDebug("CH3_WRITE_EVT\r\n");
if (centralConnList[CONNECT0_ITEM].procedureInProgress == FALSE)
{
logDebug("centralConnList CH3_WRITE_EVT\n");
// logDebug("centralConnList CH3_WRITE_EVT\n");
static uint8_t sendcnt = 0;
attWriteReq_t req;
req.cmd = FALSE;
req.sig = FALSE;
req.handle = centralConnList[CONNECT0_ITEM].charHd3;
logDebug("handle:%x\r\n", req.handle);
// logDebug("handle:%x\r\n", req.handle);
req.len = 3;
req.pValue = GATT_bm_alloc(centralConnList[CONNECT0_ITEM].connHandle, ATT_WRITE_REQ, req.len, NULL, 0);
if (req.pValue != NULL)
@ -459,10 +473,10 @@ static uint16_t connect0_ProcessEvent(uint8_t task_id, uint16_t events)
{
// Do a write
attWriteReq_t req;
logDebug("CH4_NOTI_EVT handle:%x\r\n", req.handle);
logDebug("CH4_NOTI_EVT handle:%x\r\n", req.handle + 1);
req.cmd = FALSE;
req.sig = FALSE;
req.handle = centralConnList[CONNECT0_ITEM].charHd4;
req.handle = centralConnList[CONNECT0_ITEM].charHd4 + 1;
req.len = 2;
req.pValue = GATT_bm_alloc(centralConnList[CONNECT0_ITEM].connHandle, ATT_WRITE_REQ, req.len, NULL, 0); // 内存申请
if (req.pValue != NULL)
@ -599,9 +613,7 @@ static void centralProcessGATTMsg(gattMsgEvent_t *pMsg)
logDebug("MTU: %x\r\n", pMsg->msg.mtuEvt.MTU);
}
if ((pMsg->method == ATT_READ_RSP) ||
((pMsg->method == ATT_ERROR_RSP) &&
(pMsg->msg.errorRsp.reqOpcode == ATT_READ_REQ)))
if ((pMsg->method == ATT_READ_RSP) || ((pMsg->method == ATT_ERROR_RSP) && (pMsg->msg.errorRsp.reqOpcode == ATT_READ_REQ)))
{
if (pMsg->method == ATT_ERROR_RSP)
{
@ -613,13 +625,11 @@ static void centralProcessGATTMsg(gattMsgEvent_t *pMsg)
{
// After a successful read, display the read value
logDebug("Read rsp: ");
logHexDumpAll(pMsg->msg.readRsp.pValue, pMsg->msg.readRsp.len);
// logHexDumpAll(pMsg->msg.readRsp.pValue, pMsg->msg.readRsp.len);
}
centralConnList[connItem].procedureInProgress = FALSE;
}
else if ((pMsg->method == ATT_WRITE_RSP) ||
((pMsg->method == ATT_ERROR_RSP) &&
(pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ)))
else if ((pMsg->method == ATT_WRITE_RSP) || ((pMsg->method == ATT_ERROR_RSP) && (pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ)))
{
if (pMsg->method == ATT_ERROR_RSP == ATT_ERROR_RSP)
{
@ -638,7 +648,6 @@ static void centralProcessGATTMsg(gattMsgEvent_t *pMsg)
else if (pMsg->method == ATT_HANDLE_VALUE_NOTI)
{
logDebug("Noti: ");
logHexDumpAll(pMsg->msg.handleValueNoti.pValue, pMsg->msg.handleValueNoti.len);
if (connItem == CONNECT0_ITEM)
{
BSP_Master_Receive_Data(CONNECT0_ITEM, pMsg->msg.handleValueNoti.pValue, pMsg->msg.handleValueNoti.len);
@ -647,6 +656,7 @@ static void centralProcessGATTMsg(gattMsgEvent_t *pMsg)
else if (centralConnList[connItem].discState != BLE_DISC_STATE_IDLE)
{
centralGATTDiscoveryEvent(connItem, pMsg);
centralConnList[connItem].discState = BLE_DISC_STATE_IDLE;
}
GATT_bm_free(&pMsg->msg, pMsg->method);
}
@ -678,6 +688,9 @@ static void centralRssiCB(uint16_t connHandle, int8_t rssi)
*/
static void centralHciMTUChangeCB(uint16_t connHandle, uint16_t maxTxOctets, uint16_t maxRxOctets)
{
logDebug("MTU changed: %d, %d\r\n", maxTxOctets, maxRxOctets);
// centralConnList[CONNECT0_ITEM].procedureInProgress = FALSE;
// tmos_start_task(centralConnList[CONNECT0_ITEM].taskID, CH4_NOTI_EVT, 1600);
}
/*********************************************************************
@ -695,13 +708,11 @@ static void centralEventCB(gapRoleEvent_t *pEvent)
{
case GAP_DEVICE_INIT_DONE_EVENT:
{
logDebug("Discovering...\r\n");
GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST);
GAPRole_CentralCancelDiscovery();
logDebug("停止扫瞄,发起直连\r\n");
tmos_start_task(MasterCtrTaskId, MASTER_CONNECT_EVT, 800);
}
break;
case GAP_DEVICE_INFO_EVENT:
{
// Add device to list
@ -710,49 +721,8 @@ static void centralEventCB(gapRoleEvent_t *pEvent)
break;
case GAP_DEVICE_DISCOVERY_EVENT:
{
uint8_t i;
#if 1
// See if peer device has been discovered
for (i = 0; i < centralScanRes; i++)
{
// if (centralAddrCmp(PeerAddrDef, centralDevList[i].addr))
// break;
// if (tmos_memcmp(valve_list.valve_data[0].valve_mac, centralDevList[i].addr, B_ADDR_LEN))
break;
}
// Peer device not found
if (i == centralScanRes)
{
logDebug("Device not found...\r\n");
centralScanRes = 0;
GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST);
logDebug("Discovering...\r\n");
}
// Peer device found
else
{
logDebug("Device found...\r\n");
#if 0
GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,
DEFAULT_LINK_WHITE_LIST,
centralDevList[i].addrType,
centralDevList[i].addr);
#endif
GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,
DEFAULT_LINK_WHITE_LIST,
ADDRTYPE_PUBLIC,
valve_list.valve_data[0].valve_mac);
logInfo("valve_list.valve_data[0].valve_mac:");
logHexDumpAll(valve_list.valve_data[0].valve_mac, B_ADDR_LEN);
// Start establish link timeout event
tmos_start_task(centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT);
logDebug("Connecting...\r\n");
}
#endif
Master_Connect();
logDebug("Connecting...\r\n");
}
break;
@ -784,8 +754,13 @@ static void centralEventCB(gapRoleEvent_t *pEvent)
if (connItem == CONNECT0_ITEM)
{
centralConnList[connItem].procedureInProgress = TRUE;
// Initiate service discovery
// update MTU
// attExchangeMTUReq_t req =
// {
// .clientRxMTU = BLE_BUFF_MAX_LEN - 4,
// };
// GATT_ExchangeMTU(pEvent->linkCmpl.connectionHandle, &req, centralTaskId);
// Initiate service discovery
tmos_start_task(centralConnList[connItem].taskID, START_SVC_DISCOVERY_EVT, DEFAULT_SVC_DISCOVERY_DELAY);
// Initiate connect parameter update
@ -793,19 +768,7 @@ static void centralEventCB(gapRoleEvent_t *pEvent)
// Start RSSI polling
tmos_start_task(centralConnList[connItem].taskID, START_READ_RSSI_EVT, DEFAULT_RSSI_PERIOD);
}
// 连接1
else if (connItem == CONNECT1_ITEM)
{
}
// 连接2
// else if(connItem == CONNECT2_ITEM)
// {
// }
logDebug("Connected...\r\n");
// See if need discover again
@ -818,9 +781,6 @@ static void centralEventCB(gapRoleEvent_t *pEvent)
{
logDebug("Discovering...\r\n");
centralScanRes = 0;
GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST);
}
}
}
@ -829,13 +789,9 @@ static void centralEventCB(gapRoleEvent_t *pEvent)
logDebug("Connect Failed...Reason:%X\r\n", pEvent->gap.hdr.status);
logDebug("Discovering...\r\n");
centralScanRes = 0;
GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST);
}
}
break;
case GAP_LINK_TERMINATED_EVENT:
{
uint8_t connItem;
@ -855,22 +811,15 @@ static void centralEventCB(gapRoleEvent_t *pEvent)
centralConnList[connItem].charHdl = 0;
centralConnList[connItem].procedureInProgress = FALSE;
centralScanRes = 0;
tmos_stop_task(centralConnList[connItem].taskID, START_READ_RSSI_EVT);
logDebug("Discovering...\r\n");
GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST);
}
break;
case GAP_LINK_PARAM_UPDATE_EVENT:
{
logDebug("Update %x - Int %x \r\n", pEvent->linkUpdate.connectionHandle, pEvent->linkUpdate.connInterval);
}
break;
default:
break;
}
@ -960,12 +909,10 @@ static void centralConnIistStartDiscovery_0(void)
centralConnList[CONNECT0_ITEM].svcStartHdl = centralConnList[CONNECT0_ITEM].svcEndHdl = centralConnList[CONNECT0_ITEM].charHdl = 0;
centralConnList[CONNECT0_ITEM].discState = BLE_DISC_STATE_SVC;
// Discovery simple BLE service
GATT_DiscPrimaryServiceByUUID(centralConnList[CONNECT0_ITEM].connHandle,
uuid,
ATT_BT_UUID_SIZE,
centralTaskId);
centralTaskId);
}
/*********************************************************************
@ -981,6 +928,13 @@ static void centralGATTDiscoveryEvent(uint8_t connItem, gattMsgEvent_t *pMsg)
// 连接0的枚举
if (connItem == CONNECT0_ITEM)
{
logDebug("发现句柄配置\r\n");
centralConnList[connItem].charHdl = 0X23;
centralConnList[connItem].charHd2 = 0X26;
centralConnList[connItem].charHd3 = 0x29;
centralConnList[connItem].charHd4 = 0x2C;
centralConnList[connItem].procedureInProgress = FALSE;
#if 0
if (centralConnList[connItem].discState == BLE_DISC_STATE_SVC)
{
// Service found, store handles
@ -1020,17 +974,20 @@ static void centralGATTDiscoveryEvent(uint8_t connItem, gattMsgEvent_t *pMsg)
(pMsg->method == ATT_ERROR_RSP))
{
// Discover characteristic
centralConnList[connItem].discState = BLE_DISC_STATE_CHAR;
uint8_t ret = GATT_DiscAllChars(centralConnList[connItem].connHandle, 0x01, 0xFFFF, centralTaskId);
logDebug("GATT_DiscAllChars:%02x\r\n", ret);
// centralConnList[connItem].discState = BLE_DISC_STATE_CHAR;
// uint8_t ret = GATT_DiscAllChars(centralConnList[connItem].connHandle, 0x01, 0xFFFF, centralTaskId);
// logDebug("GATT_DiscAllChars:%02x\r\n", ret);
}
}
else if (centralConnList[connItem].discState == BLE_DISC_STATE_CHAR)
{
// Characteristic found, store handle
if (pMsg->method == ATT_READ_BY_TYPE_RSP &&
pMsg->msg.readByTypeRsp.numPairs > 0)
{
#if 0
for (unsigned char i = 0; i < pMsg->msg.readByTypeRsp.numPairs; i++)
{
// characteristic properties
@ -1087,7 +1044,6 @@ static void centralGATTDiscoveryEvent(uint8_t connItem, gattMsgEvent_t *pMsg)
{
if (char_properties & (GATT_PROP_NOTIFY))
{
centralConnList[connItem].discState = BLE_DISC_STATE_IDLE;
centralConnList[connItem].charHd4 = char_value_handle + 1;
centralConnList[connItem].procedureInProgress = FALSE;
logDebug("char4 Write handle\t:%04x\r\n", char_value_handle);
@ -1095,18 +1051,22 @@ static void centralGATTDiscoveryEvent(uint8_t connItem, gattMsgEvent_t *pMsg)
}
}
}
}
}
// 连接1的枚举
// else if (connItem == CONNECT1_ITEM)
// {
// }
// 连接2的枚举
// else if(connItem == CONNECT2_ITEM)
// {
// }
#endif
}
}
#endif
}
// 连接1的枚举
// else if (connItem == CONNECT1_ITEM)
// {
// }
// 连接2的枚举
// else if(connItem == CONNECT2_ITEM)
// {
// }
}
/*********************************************************************
* @fn centralAddDeviceInfo
@ -1182,8 +1142,10 @@ int BSP_Master_Send(centralConnItem_t *centralConnList, uint8_t id, uint8_t *Dat
if (centralConnList[id].state == BLE_STATE_CONNECTED) // 检查连接状态是否为连接状态
{
logDebug("BLE_STATE_CONNECTED");
if (centralConnList[id].procedureInProgress == FALSE)
{
logDebug("FALSE");
req.cmd = FALSE;
req.sig = FALSE;
req.handle = centralConnList[id].charHd3;
@ -1196,29 +1158,31 @@ int BSP_Master_Send(centralConnItem_t *centralConnList, uint8_t id, uint8_t *Dat
if (res == SUCCESS)
{
logDebug("\n Master Write ok");
centralConnList[id].procedureInProgress = FALSE;
ret = 0;
centralConnList[id].procedureInProgress = TRUE;
ret = 0;
}
else
{
logDebug("\n Master Write faild= %x", res);
logError("\n Master Write faild= %x", res);
GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
ret = 1;
}
}
else
{
logDebug("\n alloc Faild");
logError("\n alloc Faild");
ret = 2;
}
}
else
{
logError("procedureInProgress");
ret = 3;
}
}
else
{
logError("no BLE_STATE_CONNECTED");
ret = 4;
}
return ret;
@ -1274,33 +1238,29 @@ int BSP_Master_Receive_Data(uint8_t task_id, uint8_t *data, uint16_t len)
return -5;
}
logDebug("BT 数据帧校验通过");
// logDebug("BT 数据帧校验通过");
// //有效数据长度
size_t data_len = (datalength + 5);
ret = data_len;
ret = data_len;
if (data[index + 1] == kCmdCloseVavle) // 0x02 代表了其是控制阀门响应
{
logDebug("BT 控制阀门响应包");
if (data[index + datalength + 2] == 1)//响应数据位
// logDebug("BT 控制阀门响应包");
if (data[index + datalength + 2] == 1) // 响应数据位
{
logInfo("BT 控制阀门成功");
logInfo("关闭阀门成功");
}
else
{
logError("BT 控制阀门失败");
}
logHexDumpAll(&data[index], len);
}
else if (data[index + 1] == kValveCmdRep) // 这个是代表了其是心跳数据包
{
logDebug("BT 心跳数据包");
logHexDumpAll(&data[index], len);
valve_list.valve_num = task_id + 1;
valve_list.valve_data[task_id].valve_id = data[index + 4];
// tmos_memcpy(valve_list.valve_data[task_id].valve_mac, &data[index + 5], 6); //将数据提取到结构体中
logDebug("BT 心跳数据包:");
logHexDumpAll(data, data_len);
}
//到这一步说明数据没问题,将接收到的数据通过中心任务发送出去
// 到这一步说明数据没问题,将接收到的数据通过中心任务发送出去
uint8_t *p_data;
p_data = tmos_msg_allocate(data_len);
if (p_data)
@ -1309,27 +1269,91 @@ int BSP_Master_Receive_Data(uint8_t task_id, uint8_t *data, uint16_t len)
tmos_msg_send(BtRxTaskId, p_data);
tmos_start_task(BtRxTaskId, SYS_EVENT_MSG, 0);
}
return ret;
}
void Master_Connect(void)
{
uint8_t cnt = Flash_Get_Valve_Num();
uint8_t def_mac[6] = {0xFF};
uint8_t cnt = Flash_Get_Valve_Num();
logDebug("cnt:%d\r\n", cnt);
if (cnt == 0)
{
GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,
DEFAULT_LINK_WHITE_LIST,
ADDRTYPE_PUBLIC,
def_mac);
tmos_start_task(centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT);
return;
}
for (uint8_t i = 0; i < cnt; i++)
{
if (valve_list.valve_data[cnt].valve_id != 0)
if (valve_list.valve_data[i].valve_id != 0)
{
logDebug("valve_id:%d\r\n", valve_list.valve_data[cnt].valve_id);
logHexDumpAll(valve_list.valve_data[cnt].valve_mac, 6);
logDebug("valve_id:%d\r\n", valve_list.valve_data[i].valve_id);
logHexDumpAll(valve_list.valve_data[i].valve_mac, 6);
GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,
DEFAULT_LINK_WHITE_LIST,
ADDRTYPE_PUBLIC,
valve_list.valve_data[cnt].valve_mac);
DEFAULT_LINK_WHITE_LIST,
ADDRTYPE_PUBLIC,
valve_list.valve_data[i].valve_mac);
tmos_start_task(centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT);
logDebug("Connecting...\r\n");
}
}
}
void Master_DisConnect(void)
{
GAPRole_TerminateLink(INVALID_CONNHANDLE);
logDebug("主动断开连接\r\n");
}
uint16_t Master_ProcessEvent(uint8_t task_id, uint16_t events)
{
int8_t ret = 0;
uint8_t *pMsg;
uint8_t master_buf[64] = {0};
if (events & MASTER_START_EVT)
{
if (centralConnList[0].state != BLE_STATE_CONNECTED)
{
if (Flash_Get_Valve_Num())
{
tmos_start_task(task_id, MASTER_CONNECT_EVT, 2400);
}
}
return (events ^ MASTER_START_EVT);
}
else if(events & MASTER_DETECT_EVT)
{
if (centralConnList[0].state != BLE_STATE_CONNECTED)
{
tmos_start_task(task_id, MASTER_CONNECT_EVT, 2400);
}
else
{
tmos_start_task(task_id, MASTER_DETECT_EVT, 2400);
}
return (events ^ MASTER_DETECT_EVT);
}
else if (events & MASTER_CONNECT_EVT)
{
if (centralConnList[0].state != BLE_STATE_CONNECTED)
{
Master_Connect();
tmos_start_task(task_id, MASTER_DETECT_EVT, 2400);
}
return (events ^ MASTER_CONNECT_EVT);
}
else if (events & MASTER_DISCONN_EVT)
{
Master_DisConnect();
return (events ^ MASTER_DISCONN_EVT);
}
return 0;
}

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-12-03 11:13:13
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-13 18:31:17
* @LastEditTime: 2024-12-15 17:16:45
* @FilePath: \ble_-tyq_-bjq_-ch584-m\APP\multiCentral_main.c
* @Description:
*
@ -25,13 +25,13 @@
#include "HAL.h"
#include "multiCentral.h"
#include "bsp_uart.h"
#include "log.h"
#include "bsp_iwdg.h"
#include "bsp_flash.h"
#include "bsp_valve.h"
#undef LOG_ENABLE
#define LOG_ENABLE 1
#include "log.h"
/*********************************************************************
* GLOBAL TYPEDEFS
*/
@ -80,10 +80,6 @@ int main(void)
GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
#endif
CH58x_BLEInit();
HAL_Init();
GAPRole_CentralInit();
Central_Init();
#if DEBUG == Debug_UART0
GPIOA_SetBits(GPIO_Pin_14);
GPIOPinRemap(ENABLE, RB_PIN_UART0);
@ -99,9 +95,16 @@ int main(void)
BSP_UART3_Init();
logDebug("test log debug\n");
#endif
CH58x_BLEInit();
HAL_Init();
GAPRole_CentralInit();
Central_Init();
BSP_FLASH_Init();
BSP_Valve_Init();
BSP_UART1_Init(); // BT UART
// IWDG_Init(1000);
Main_Circulation();
}

View File

@ -14,6 +14,12 @@
/* ͷ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> */
#include "HAL.h"
#undef LOG_ENABLE
#define LOG_ENABLE 1
#include "log.h"
tmosTaskID halTaskID;
uint32_t g_LLE_IRQLibHandlerLocation;
/*******************************************************************************
@ -133,7 +139,7 @@ void CH58x_BLEInit(void)
for(i = 0; i < 6; i++)
{
cfg.MacAddr[i] = MacAddr[i];
PRINT("%02x ", cfg.MacAddr[i]);
logDebug("%02x ", cfg.MacAddr[i]);
}
}

36
bsp/inc/bsp_iwdg.h Normal file
View File

@ -0,0 +1,36 @@
/***
* @Author: mbw
* @Date: 2024-12-15 16:29:58
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-15 16:40:26
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\inc\bsp_iwdg.h
* @Description:
* @
* @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
*/
#ifndef __BSP_IWDG_H__
#define __BSP_IWDG_H__
#include "CONFIG.h"
#define RB_RLR 0x0FFF // RW, watch-dog counter reload (write protect)
#define RB_PR 0x7000 // PR, prescale (write protect)
#define RB_PVU 0x8000 // RO, register update flag (write protect)
#define RB_COUNT 0xFF0000 // RO, watch-dog down counter
#define RB_STOP_EN 0x20000000 // RW, watch-dog stop enable (write protect)
#define RB_WR_PROTECT 0x40000000 // RO, write protect
#define RB_IWDG_EN 0x80000000 // RO, watch-dog enable
void IWDG_Init(uint16_t ms);
// 需要定时调用喂狗
// 在看门狗键寄存器 (R32_IWDG_KR) 中,软件要以一定的间隔写入 0xAAAA重装载计数值这就是喂狗的操作。
// 否则,当计数器为 0 时,看门狗会产生复位。
#define FEED_IWDG() \
{ \
R32_IWDG_KR = 0xAAAA; \
}
void ShowRestartReason(void);
#endif // !__BSP_IWDG_H__

View File

@ -1,19 +0,0 @@
#ifndef __BSP_MASTER_H__
#define __BSP_MASTER_H__
#include "CH58x_common.h"
#include "CH58xBLE_LIB.h"
// 0xAA CMD/DATA/ DATA_LEN (DATA) checksum 0x55
typedef struct __attribute__((packed))
{
uint8_t header;
uint8_t cmd; // CMD/DATA
uint8_t len; // DATA_LEN
uint8_t *pData;
uint8_t checksum;
uint8_t tail;
} TsFrameData;
#endif // ! __BSP_MASTER_H__

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-12-06 16:52:29
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-09 11:15:13
* @LastEditTime: 2024-12-14 14:51:37
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\inc\bsp_uart.h
* @Description:
* @
@ -25,7 +25,6 @@
#define BT_UART_TX_PIN GPIO_Pin_9 //PA9
#define BT_UART_RX_PIN GPIO_Pin_8 //PA8
typedef struct __attribute__((packed))
{
uint8_t cmd;

View File

@ -61,19 +61,13 @@ struct __attribute__((packed)) valve_data
{
uint8_t valve_id;
uint8_t valve_mac[6];
TeVavleType 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
uint8_t valve_connct_status;
uint8_t valve_switch_status;
uint8_t valve_temp;
uint32_t valve_in_pressure;
uint32_t valve_out_pressure;
uint32_t valve_atm_pressure;
uint8_t valve_type;
};
typedef struct valve_data_list
@ -91,8 +85,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_Valve_Ctr_Resp(uint8_t id, uint8_t *mac_addr, WireLessState status);
int BSP_Bt_Valve_Resp(uint8_t 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 14:49:21
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-13 13:57:30
* @LastEditTime: 2024-12-15 15:05:39
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_flash.c
* @Description: MAC地址等关键信息进行保存和读取操作
*
@ -13,6 +13,9 @@
#include "string.h"
#include "bsp_valve.h"
#undef LOG_ENABLE
#define LOG_ENABLE 1
# include "log.h"
void Flash_ErasePage_ReadConfigInfo(uint8_t *page_buf)
{
@ -49,16 +52,14 @@ int Flash_Get_Mac_Addr(uint8_t *mac_addr, uint8_t number)
{
__attribute__((aligned(4)))
uint8_t data[FLASH_MAC_INFO_LEN + 2]; // 读写buf需要4字节对齐
// char mac[16] = {0};
EEPROM_READ((FLASH_MAC_INFO_START_ADDR + number * FLASH_MAC_INFO_LEN), data, FLASH_MAC_INFO_LEN);
if (data == NULL)
if (tmos_isbufset(data, 0xFF, FLASH_MAC_INFO_LEN))
{
// PRINTF("Flash_Get_Mac_Addr failed");
logDebug("MAC地址为空,请先配网");
tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN);
return -1;
}
// sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x",
// data[5], data[4], data[3], data[2], data[1], data[0]);
// PRINTF("mac_addr:%s", mac);
tmos_memcpy(mac_addr, data, FLASH_MAC_INFO_LEN);
return 0;

130
bsp/src/bsp_iwdg.c Normal file
View File

@ -0,0 +1,130 @@
/*
* @Author : stark1898y 1658608470@qq.com
* @Date : 2024-12-15 16:13:41
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-16 10:50:56
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_iwdg.c
* @Description :
*
* Copyright (c) 2024 by yzy, All Rights Reserved.
*/
#include "bsp_iwdg.h"
#include "bsp_uart.h"
#include "log.h"
// https://www.cnblogs.com/debugdabiaoge/p/17580033.html
// https://www.cnblogs.com/risc5-ble/p/17853714.html
#undef LOG_ENABLE
#define LOG_ENABLE 1
#undef LOG_TAG
#define LOG_TAG "idwg"
uint8_t IWDGTaskId;
#define IWIG_FEED_EVENT (0x01 << 0)
uint16_t IWDG_ProcessEvent(uint8_t task_id, uint16_t events)
{
if (events & IWIG_FEED_EVENT)
{
FEED_IWDG();
tmos_start_task(task_id, IWIG_FEED_EVENT, 20000);
return (events ^ IWIG_FEED_EVENT);
}
return 0;
}
// 32k rc
// div 0:4 | 1:8 | 2:16 | 3:32 |
// 4:64 | 5:128 | 6:256 | 7:512(32K分频512时钟62.5Hz) |
// reload max 4095
// 独立看门狗IWDG由专用的内部低速时钟LSI驱动能够在低功耗模式下正常工作。
void IWDG_Init(uint16_t ms)
{
uint16_t div = 512;
float tick_ms = 1000 / (32000 / 512);
uint16_t reload = (ms / tick_ms) + 1;
// // 解除IWDG保护
// R32_IWDG_KR = 0x5555;
// R32_IWDG_CFG = (RB_PR & (div << 12)) | (RB_STOP_EN) | (reload & RB_RLR);
// // 开启IWDG保护
// R32_IWDG_KR = 0xCCCC;
// logDebug("R32_IWDG_CFG = %X", R32_IWDG_CFG);
R32_IWDG_KR = 0x5555; // 解除IWDG保护
R32_IWDG_CFG |= (7 << 12); // 32K分频512时钟62.5Hz
R32_IWDG_CFG &= 0xFFFFF000;
R32_IWDG_CFG |= 0x10; // 看门狗时间约256ms0x10/(32K/512))
R32_IWDG_KR = 0xCCCC;
PRINT("R32_IWDG_CFG = %x\r\n", R32_IWDG_CFG);
IWDGTaskId = TMOS_ProcessEventRegister(IWDG_ProcessEvent);
tmos_set_event(IWDGTaskId, IWIG_FEED_EVENT);
}
// #define RB_RESET_FLAG 0x07 // RO: recent reset flag
// #define RST_FLAG_SW 0x00
// #define RST_FLAG_RPOR 0x01
// #define RST_FLAG_WTR 0x02
// #define RST_FLAG_MR 0x03
// //#define RST_FLAG_GPWSM 0x04 // RO, power on reset flag during sleep/shutdown: 0=no power on reset during sleep/shutdown, 1=power on reset occurred during sleep/shutdown
// #define RST_FLAG_GPWSM 0x05
// // RB_RESET_FLAG: recent reset flag
// // 000 - SR, software reset, by RB_SOFTWARE_RESET=1 @RB_WDOG_RST_EN=0
// // 001 - RPOR, real power on reset
// // 010 - WTR, watch-dog timer-out reset
// // 011 - MR, external manual reset by RST pin input low
// // 101 - GRWSM, global reset by waking under shutdown mode
// 1?? - LRW, power on reset occurred during sleep
// 打印复位状态寄存器,显示复位原因
// 最近一次复位状态:
// 000软件复位 SRRB_WDOG_RST_EN=0时软件复位可产生此状态否则可复位但不产生此状态
// 001上电复位 RPOR
// 010看门狗超时复位 WTR
// 011外部手动复位 MR
// 101从下电模式唤醒时的复位 GRWSM
// 100/110/111唤醒复位 LRW且此前的上一次复位分别是 SR/WTR/MR。
void ShowRestartReason(void)
{
uint8_t reason = R8_RESET_STATUS & 0x07;
logDebug("R8_RESET_STATUS = %02x", reason);
switch (reason)
{
case RST_FLAG_SW:
logDebug("RST_FLAG_SW");
break;
case RST_FLAG_RPOR:
logDebug("RST_FLAG_RPOR");
break;
case RST_FLAG_WTR:
logDebug("RST_FLAG_WTR");
break;
case RST_FLAG_MR:
logDebug("RST_FLAG_MR");
break;
case RST_FLAG_GPWSM:
logDebug("RST_FLAG_GPWSM");
break;
case 0x04:
logDebug("LRW, last SR");
break;
case 0x06:
logDebug("LRW, last WTR");
break;
case 0x07:
logDebug("LRW, last MR");
default:
break;
}
}

View File

@ -1,23 +0,0 @@
/*
* @Author: mbw
* @Date: 2024-12-11 13:52:38
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-12 09:11:54
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_Master.c
* @Description:
*
* Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
*/
#include "bsp_master.h"
#include "bsp_uart.h"
#include "log.h"
#include "multiCentral.h"
#include "bsp_valve.h"
#undef LOG_ENABLE
#define LOG_ENABLE 1
void BSP_Bt_Init(void)
{
}

View File

@ -1,28 +1,40 @@
/*
* @Author: mbw
* @Date: 2024-12-07 15:13:24
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-16 14:54:45
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_tim.c
* @Description:
*
* Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
*/
#include "bsp_tim.h"
#include "HAL.h"
// tick_1ms_cnt在SysTick_Handler()中1ms +1
// tick_1ms_cnt<EFBFBD><EFBFBD>SysTick_Handler()<29><>1ms +1
volatile uint32_t tick_1ms_cnt = 0;
/**
* @description: SysTick1ms
* @description: <EFBFBD><EFBFBD>SysTick<EFBFBD><EFBFBD>1ms<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return {uint32_t}
*/
uint32_t BSP_Get_Tick(void)
{
/* Platform implementation */
return tick_1ms_cnt;
// return tick_1ms_cnt;
return (TMOS_GetSystemClock() / 1.6);
}
// SysTick中断函数
// SysTick<EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD>
__INTERRUPT
__HIGH_CODE
void SysTick_Handler()
{
static uint8_t cnt_ms = 0;
SysTick->SR = 0; // 清除中断标志
SysTick->SR = 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־
tick_1ms_cnt++;
cnt_ms++;

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-12-06 16:52:30
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-13 18:26:38
* @LastEditTime: 2024-12-16 14:56:26
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_uart.c
* @Description:
*
@ -42,7 +42,6 @@ uint8_t uart3_rx_buf[UART3_RX_BUFFER_LENGTH] = {0};
uint8_t BtRxTaskId;
BTFrameData bt_frame = {0};
/**
* @description: 256255
* @param {uint8_t} *data
@ -109,7 +108,7 @@ void UART3_FifoInit(void)
lwrb_init(&uart3_rx_t, uart3_rx_buf, sizeof(uart3_rx_buf));
}
/*bt接收数据处理*/
/*接收到来自报警器的数据处理*/
int BSP_Bt_Process(uint8_t *data, uint16_t len)
{
int ret = 0;
@ -143,11 +142,10 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
return 3; //
}
uint8_t rx_sum = data[index + 2 + datalength]; // 读取校验码
uint8_t calculated_sum = _CheckSum(&data[0], datalength + 2); // 计算校验码
uint8_t rx_sum = data[index + 2 + datalength]; // 读取校验码
uint8_t calculated_sum = _CheckSum(&data[index], datalength + 2); // 计算校验码
if (rx_sum != calculated_sum)
{
logError("BT 数据帧校验码错误 rx_sum = %02X, calculated_sum = %02X", rx_sum, calculated_sum);
logHexDumpAll(data, len);
return 4;
@ -160,47 +158,48 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
return 5;
}
// 当程序走到这里时,就说明接收到了正确的数据帧,开始解析命令
/*AA + 数据长度 + CMD + ID + 数据(mac) + 校验码 + 结束码*/
tmos_memcpy(data_buf, &data[index + 3], datalength);
switch (data[index + 2])
{
case kValveCmdCtr:
ret = BSP_Bt_Valve_Ctr(&data_buf[0], datalength);
logDebug("recv cmd: 0x01, 执行的动作是关闭阀门");
ret = BSP_Bt_Valve_Ctr(&data_buf[0], datalength);
break;
case kValveCmdReg:
ret = BSP_Bt_Register_Valve(&data_buf[0], datalength);
logDebug("recv cmd: 0x02, 执行的动作是注册阀门");
ret = BSP_Bt_Register_Valve(&data_buf[0], datalength);
if (ret == 0)
{
BSP_Bt_Valve_Resp(kValveCmdReg, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE);
BSP_Bt_Valve_Resp(kValveCmdReg, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE);
}
else
{
BSP_Bt_Valve_Resp(kValveCmdReg, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE);
BSP_Bt_Valve_Resp(kValveCmdReg, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE);
}
break;
case kValveCmdRem:
ret = BSP_Bt_Remove_Valve(&data_buf[0], datalength);
logDebug("recv cmd: 0x03, 执行的动作是移除阀门");
ret = BSP_Bt_Remove_Valve(&data_buf[0], datalength);
if (ret == 0)
{
BSP_Bt_Valve_Resp(kValveCmdRem, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE);
BSP_Bt_Valve_Resp(kValveCmdRem, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE);
}
else
{
BSP_Bt_Valve_Resp(kValveCmdRem, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE);
BSP_Bt_Valve_Resp(kValveCmdRem, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE);
}
break;
case kValveCmdRep:
ret = BSP_Bt_Replace_Valve(&data_buf[0], datalength);
logDebug("recv cmd: 0x04, 执行的动作是更换阀门");
ret = BSP_Bt_Replace_Valve(&data_buf[0], datalength);
if (ret == 0)
{
BSP_Bt_Valve_Resp(kValveCmdRep, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE);
BSP_Bt_Valve_Resp(kValveCmdRep, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE);
}
else
{
BSP_Bt_Valve_Resp(kValveCmdRep, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE);
BSP_Bt_Valve_Resp(kValveCmdRep, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE);
}
break;
default:
@ -228,6 +227,7 @@ uint8_t BT_GenerateRawFrame(BTFrameData *pRawData, const uint8_t *p_src, uint8_t
pRawData->buf[pRawData->len - 2] = _CheckSum(&pRawData->buf[0], pRawData->len - 2);
pRawData->buf[pRawData->len - 1] = 0X55;
logInfo("BT_GenerateRawFrame");
logHexDumpAll(&pRawData->buf[0], pRawData->len);
return 0;
@ -294,7 +294,9 @@ uint16_t BSP_Send_Process(uint8_t *pdata)
case kCmdOpenVavle:
break;
case kCmdData:
BSP_Bt_Valve_Resp(kValveEventStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]);
valve_list.valve_data[0].valve_connct_status = 1;
tmos_memcpy(&valve_list.valve_data[0].valve_switch_status, &master_rx_buf[3], master_rx_buf[2]);
BSP_Bt_Valve_Resp(kValveEventStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, 0);
break;
default:
logError("不支持的命令: %d", master_rx_buf[1]);
@ -316,13 +318,15 @@ uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events)
tmos_msg_deallocate(pMsg);
BSP_Send_Process(master_buf);
}
return (events ^ SYS_EVENT_MSG);
}
else if (events & BT_START_EVT)
{
lwrb_reset(&uart1_rx_t);
lwrb_reset(&uart1_tx_t);
tmos_start_task(task_id, BT_INFO_UPDATA_EVT, 0);
tmos_start_task(task_id, BT_REC_EVT, 800);
tmos_start_task(task_id, BT_INFO_UPDATA_EVT, 1600);
return (events ^ BT_START_EVT);
}
else if (events & BT_REC_EVT)
@ -359,8 +363,8 @@ void BSP_UART1_Init(void)
{
/* 配置串口1先配置IO口模式再配置串口 */
GPIOB_SetBits(BT_UART_TX_PIN);
GPIOB_ModeCfg(BT_UART_RX_PIN, GPIO_ModeIN_PU); // RXD-配置上拉输入
GPIOB_ModeCfg(BT_UART_TX_PIN, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出注意先让IO口输出高电平
GPIOA_ModeCfg(BT_UART_RX_PIN, GPIO_ModeIN_PU); // RXD-配置上拉输入
GPIOA_ModeCfg(BT_UART_TX_PIN, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出注意先让IO口输出高电平
UART1_DefInit();
UART1_ByteTrigCfg(UART_7BYTE_TRIG);
// 中断方式接收数据
@ -406,7 +410,7 @@ void UART1_IRQHandler(void)
{
case UART_II_LINE_STAT: // 线路状态错误
{
UART1_GetLinSTA();
UART1_GetLinSTA();
break;
}
case UART_II_RECV_RDY:

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-12-09 11:40:10
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-13 15:39:05
* @LastEditTime: 2024-12-16 13:15:11
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_valve.c
* @Description:
*
@ -12,9 +12,9 @@
#include "bsp_flash.h"
#include "CH58xBLE_LIB.h"
#include "bsp_uart.h"
#include "bsp_master.h"
#include "multiCentral.h"
/*
info
+ + + + +
@ -29,6 +29,7 @@
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;
@ -44,7 +45,9 @@ uint8_t Valve_GenerateRawFrame(BTFrameData *pRawData, const uint8_t cmd, const u
}
pRawData->buf[pRawData->len - 2] = _CheckSum(&pRawData->buf[0], pRawData->len - 2);
pRawData->buf[pRawData->len - 1] = 0X55;
logInfo("向从机发送的数据:");
logHexDumpAll(pRawData->buf, pRawData->len);
return 0;
}
@ -99,9 +102,8 @@ int BSP_Bt_Valve_Ctr(uint8_t *data, uint8_t len)
/*注册阀门信息*/
int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len)
{
size_t i = 0;
uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0};
if ((data[0] >= 1) && (data[0] <= 8))
{
Flash_Get_Mac_Addr(mac_addr, data[0] - 1);
@ -112,24 +114,35 @@ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len)
return 1;
}
for (; i < FLASH_MAC_INFO_LEN; i++)
logDebug("注册阀门信息:");
if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) == TRUE)
{
if (mac_addr[i] != 0xFF)
break;
}
if (i == FLASH_MAC_INFO_LEN) // 说明此处未写入数据那就在此处写入注册MAC地址
{
if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) != 0)
{
logError("register valve error");
return 2;
}
tmos_start_task(BtRxTaskId, BT_INFO_UPDATA_EVT, 0);
logError("已经注册过了");
return 2; // 说明已经注册过了
}
else
{
logError("valve info has been registered"); // 这个ID号已经注册了
return 3;
if (tmos_isbufset(&mac_addr[0], 0xFF, 6) == TRUE) // 说明没有数据,那就全部写入
{
logDebug("没有数据,全部写入:");
logDebug("写入MAC 地址: %02X %02X %02X %02X %02X %02X", data[1], data[2], data[3], data[4], data[5], data[6]);
if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) != 0)
{
logError("阀门注册写入flash 错误");
return 3;
}
else
{
BSP_Bt_Valve_Updata(); // 更新阀门信息
}
}
else
{
logDebug("有数据 请检查");
}
}
return 0;
@ -138,9 +151,9 @@ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len)
/*移除阀门信息*/
int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len)
{
size_t i = 0;
uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0};
if ((data[0] >= 1) && (data[0] <= 8))
size_t i = 0;
uint8_t mac_addr[FLASH_MAC_INFO_LEN + 2] = {0};
if ((data[0] >= 1) && (data[0] <= 8))// 判断是否是正确的ID
{
Flash_Get_Mac_Addr(mac_addr, data[0] - 1);
}
@ -149,26 +162,23 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len)
logError("valve id error");
return -1;
}
for (; i < FLASH_MAC_INFO_LEN; i++)
if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) != TRUE)// 判断是否是相同的MAC地址
{
if (mac_addr[i] != data[i + 1])
break;
logError("mac addr error");
return -2;
}
if (i == FLASH_MAC_INFO_LEN) // 说明MAC地址没问题那么就将其擦除
else
{
tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN);
if (Flash_Set_Mac_Addr(mac_addr, data[0] - 1) != 0)
if (Flash_Set_Mac_Addr(mac_addr, data[0] - 1) != 0) // 清空掉对应位置MAC数据
{
logError("移除阀门信息失败");
return -2;
}
tmos_start_task(BtRxTaskId, BT_INFO_UPDATA_EVT, 10);
}
else
{
logError("valve mac addr error"); // 这个ID号已经注册了
return -3;
BSP_Bt_Valve_Updata();
Master_DisConnect();
}
return 0;
}
@ -177,8 +187,10 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len)
{
size_t i = 0;
uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0};
if ((len == 0) || (len < 12))
if ((len == 0) || (len < 13))//新旧MAC地址长度加id 6 + 6 + 1 = 13至少要大于12
{
logError("data len error");
return -1;
}
if ((data[0] >= 1) && (data[0] <= 8))
@ -190,25 +202,21 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len)
logError("valve id error");
return -2;
}
for (; i < FLASH_MAC_INFO_LEN; i++)
if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) == TRUE)
{
if (mac_addr[i] != data[i + 1])
break;
logError("已经注册过了"); // 不需要重复写入
return 2; // 说明已经注册过了
}
if (i == FLASH_MAC_INFO_LEN) // 说明MAC地址没问题
else
{
tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN);
if (Flash_Set_Mac_Addr(mac_addr, data[0] - 1) != 0)
if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) != 0)
{
logError("擦除阀门信息失败");
return -3;
logError("阀门注册写入flash 错误");
return 3;
}
if (Flash_Set_Mac_Addr(&data[7], data[0] - 1) != 0)
{
logError("更换阀门信息失败");
return -4;
}
tmos_start_task(BtRxTaskId, BT_INFO_UPDATA_EVT, 10);
BSP_Bt_Valve_Updata(); // 更新阀门信息
}
return 0;
}
@ -218,53 +226,64 @@ void BSP_Bt_Valve_Updata(void)
{
uint8_t cnt = 0;
uint8_t mac[6] = {0};
uint8_t num = Flash_Get_Valve_Num();
logInfo("BSP_Bt_Valve_Updata num: %d ", num);
tmos_memset(&valve_list, 0, sizeof(valve_data_list_t));
for (int i = 0; i < MAX_VALVE_NUM; i++) // 这个循环是为了将数据拷贝到valve_list中 并且保证id号和flash对应起来
{
if (Flash_Get_Mac_Addr(mac, i) == 0)
if (Flash_Get_Mac_Addr(mac, i) == 0) // 说明有MAC数据
{
if (tmos_isbufset(mac, 0xFF, 6) == FALSE) // 不是默认值
{
tmos_memcpy(valve_list.valve_data[cnt].valve_mac, mac, 6); // 这样做的目的就是读取方便只需要根据flash中读取到的数量进行读取前N个值
valve_list.valve_data[cnt].valve_id = i + 1;
logDebug("updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X",
valve_list.valve_data[cnt].valve_id,
valve_list.valve_data[cnt].valve_mac[0],
valve_list.valve_data[cnt].valve_mac[1],
valve_list.valve_data[cnt].valve_mac[2],
valve_list.valve_data[cnt].valve_mac[3],
valve_list.valve_data[cnt].valve_mac[4],
valve_list.valve_data[cnt].valve_mac[5]);
cnt++;
valve_list.valve_num = cnt;
}
else
{
tmos_memset(&valve_list.valve_data[i], 0, sizeof(struct valve_data));
}
tmos_memcpy(valve_list.valve_data[cnt].valve_mac, mac, 6); // 这样做的目的就是读取方便只需要根据flash中读取到的数量进行读取前N个值
valve_list.valve_data[cnt].valve_id = i + 1;
logDebug("updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X",
valve_list.valve_data[cnt].valve_id,
valve_list.valve_data[cnt].valve_mac[0],
valve_list.valve_data[cnt].valve_mac[1],
valve_list.valve_data[cnt].valve_mac[2],
valve_list.valve_data[cnt].valve_mac[3],
valve_list.valve_data[cnt].valve_mac[4],
valve_list.valve_data[cnt].valve_mac[5]);
cnt++;
valve_list.valve_num = cnt;
break;
}
else
{
logError("BSP_Bt_Valve_Updata: flash read error");
break;
}
}
Flash_Set_Valve_Num(valve_list.valve_num);
}
int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state)
{
uint8_t ret = 0;
BtData_t *ptr = (BtData_t *)tmos_msg_allocate(sizeof(BtData_t) + 8);
ptr->cmd = kValveCmdRem;
ptr->buf[0] = id;
tmos_memcpy(&ptr->buf[1], mac_addr, 6);
ptr->buf[7] = state;
BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 8);
uint8_t ret = 0;
BtData_t *ptr = (BtData_t *)tmos_msg_allocate(sizeof(struct valve_data));
ptr->cmd = cmd;
switch (cmd)
{
case kValveCmdCtr:
case kValveCmdReg:
case kValveCmdRem:
case kValveCmdRep:
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);
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));
break;
default:
break;
}
tmos_msg_deallocate((uint8_t *)ptr);
ret = BSP_Uart1_Send_Data((uint8_t *)&valve_frame_data.buf[0], valve_frame_data.len);
tmos_start_task(BtRxTaskId, BT_SEND_EVT, 50);
if (ret == valve_frame_data.len)
@ -274,47 +293,9 @@ int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state)
return -1;
}
void BSP_Valve_Init(void)
{
uint8_t cnt = 0;
uint8_t mac[6] = {0};
uint8_t num = Flash_Get_Valve_Num();
logInfo("num: %d", num);
logInfo("BSP_Valve_Init");
valve_list.valve_num = num;
for (int i = 0; i < MAX_VALVE_NUM; i++) // 这个循环是为了将数据拷贝到valve_list中 并且保证id号和flash对应起来
{
if (num > 0)
{
if (Flash_Get_Mac_Addr(mac, i) == 0)
{
if (tmos_isbufset(mac, 0xFF, 6) == FALSE) // 不是默认值
{
tmos_memcpy(valve_list.valve_data[cnt].valve_mac, mac, 6); // 这样做的目的就是读取方便只需要根据flash中读取到的数量进行读取前N个值
valve_list.valve_data[cnt].valve_id = i + 1;
logDebug("updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X",
valve_list.valve_data[cnt].valve_id,
valve_list.valve_data[cnt].valve_mac[0],
valve_list.valve_data[cnt].valve_mac[1],
valve_list.valve_data[cnt].valve_mac[2],
valve_list.valve_data[cnt].valve_mac[3],
valve_list.valve_data[cnt].valve_mac[4],
valve_list.valve_data[cnt].valve_mac[5]);
cnt++;
valve_list.valve_num = cnt;
}
else
{
tmos_memset(&valve_list.valve_data[i], 0, sizeof(struct valve_data));
}
}
else
{
logError("BSP_Bt_Valve_Updata: flash read error");
}
}
}
logInfo("BSP_Valve_Init end");
logDebug("BSP_Valve_Init");
BSP_Bt_Valve_Updata();
}