Browse Source

实现SOS蓝牙数据上报

xuxinyi 2 months ago
parent
commit
b3f90cfcd2
3 changed files with 56 additions and 13 deletions
  1. 3 2
      Core/Inc/E52.h
  2. 4 3
      Core/Src/E52.c
  3. 49 8
      Core/Src/main.c

+ 3 - 2
Core/Inc/E52.h

@@ -170,14 +170,15 @@ typedef struct __attribute__((packed)){
     uint8_t function_code;      // 功能码
     uint8_t badge_addr_high;    //胸牌地址高字节
     uint8_t badge_addr_low;     //胸牌地址低字节
-    uint8_t SOS_data;            //蓝牙数据
+    // uint8_t SOS_data;            //蓝牙数据
+    uint8_t bl_data[8];            //蓝牙数据
     uint8_t finish_send;        // 是否完成发送
     uint8_t target_addr_H;       // 目标地址高字节
     uint8_t target_addr_L;   // 目标地址低字节
     uint8_t frame_tail_H;    // 帧尾高字节
     uint8_t frame_tail_L;    // 帧尾低字节
 } SendSOS_structure;
-void E52_Send_SOS_Fun(void);
+void E52_Send_SOS_Fun(uint8_t i,uint8_t finishData);
 
 
 

+ 4 - 3
Core/Src/E52.c

@@ -95,7 +95,7 @@ void E52_Send_Bl_Data_Fun(uint8_t i, uint8_t finishData) {
     // TODO: command:02
 }
 
-void E52_Send_SOS_Fun() {
+void E52_Send_SOS_Fun(uint8_t i,uint8_t finishData) {
     printf("这是发送SOS数据\r\n");
     SendSOS_structure SendSOS_structure;
     SendSOS_structure.frame_header_H = 0x55;
@@ -103,8 +103,9 @@ void E52_Send_SOS_Fun() {
     SendSOS_structure.function_code = 0x04;
     SendSOS_structure.badge_addr_high = deviceInfo.loraDeviceAddress_H;
     SendSOS_structure.badge_addr_low = deviceInfo.loraDeviceAddress_L;
-    SendSOS_structure.SOS_data = 0x01; //暂定01
-    SendSOS_structure.finish_send = 0x01;
+    // SendSOS_structure.SOS_data = 0x01; //暂定01
+    memcpy(SendSOS_structure.bl_data, totalData[i], 8);
+    SendSOS_structure.finish_send = finishData;
     SendSOS_structure.frame_tail_H = 0xFF;
     SendSOS_structure.frame_tail_L = 0xEE;
     // printf("blData size = %d\n", sizeof(SendSOS_structure));

+ 49 - 8
Core/Src/main.c

@@ -293,27 +293,68 @@ int main(void)
   printf("Device is ready\r\n");
   printf("设备地址:0x%02X%02X\n", deviceInfo.loraDeviceAddress_H, deviceInfo.loraDeviceAddress_L);
   uint8_t i = 0;
+
   while (1)
   {
     /* USER CODE END WHILE */
 
     /* USER CODE BEGIN 3 */
+
+
+    GPIO_PinState sosState = HAL_GPIO_ReadPin(SOS_KEY_GPIO_Port, SOS_KEY_Pin);//高为未按压,低为按下,优先级最高
+    // printf("SOS_KEY_Pin pin state = %d\r\n", sosState);
+
+    if (!sosState) {
+      E52_Heartbeat_Fun();
+      printf("SOS中\r\n");
+
+      deviceInfo.BlDataFlag = BL_START;
+      printf("开启蓝牙扫描\r\n");
+      HAL_Delay(1000);
+      deviceInfo.BlDataFlag = BL_STOP;
+      int k = 0;
+      while (receiveBlDataCount > k) {
+
+        printf("发送第%d个蓝牙数据给Lora\r\n", k);
+        if (deviceInfo.loraSendSuccessFlag == 0) {
+          E52_Send_SOS_Fun(k,0x00);
+        }else {
+          continue;
+        }
+        memset(totalData[k], 0, sizeof(totalData[k]));
+        k++;
+      }
+      HAL_Delay(1000);
+      E52_Send_Bl_Data_Fun(k,0x01);
+      printf("停止蓝牙扫描,开始发送蓝牙数据给Lora\r\n");
+
+      HAL_Delay(2000);
+      receiveBlDataCount = 0;
+      deviceInfo.timeCount = 0;
+      deviceInfo.forwardBLAndLoraDataDuration = 0;
+      k = 0;
+      printf("发送结束\r\n");
+      HAL_Delay(2000);
+
+      continue;
+      // HAL_Delay(000);
+    }
+
+
     // 命令为IDLE,且步骤为STEP_INIT 说明有新数据。
-    if (GET_CMD( deviceInfo.commandFromCloud) == IDLE && GET_STEP(deviceInfo.commandFromCloud) == STEP_VERIFY) {
+    if (GET_CMD( deviceInfo.commandFromCloud) == IDLE && GET_STEP(deviceInfo.commandFromCloud) == STEP_VERIFY && sosState) {
       E52_Analyze_Data();
     }
 
     // 检查是否接收到"心跳"命令,且设备在线
-    if (!deviceInfo.isOnline){
+    if (!deviceInfo.isOnline && sosState){
       printf("The device is not online.\r\n");
       if (!deviceInfo.loraSendSuccessFlag) {
         E52_Heartbeat_Fun();
       }
       HAL_Delay(3000);
     }
-    GPIO_PinState state;
-    state = HAL_GPIO_ReadPin(SOS_KEY_GPIO_Port, SOS_KEY_Pin);
-    printf("SOS_KEY_Pin pin state = %d\r\n", state);
+
     // if (SOS_key_struct.sosCheckActive) {
     //   RTC_DateTimeTypeDef now;
     //   RTC_GetDateTime(&hrtc, &now);
@@ -334,7 +375,7 @@ int main(void)
     // }
 
     // 03:请求蓝牙数据
-    if (GET_CMD( deviceInfo.commandFromCloud)  == REQUEST_BLUETOOTH_DATA && deviceInfo.isOnline) {
+    if (GET_CMD( deviceInfo.commandFromCloud)  == REQUEST_BLUETOOTH_DATA && deviceInfo.isOnline && sosState) {
 
       switch (GET_STEP(deviceInfo.commandFromCloud)) {
         case REQUEST_BLUETOOTH_DATA_SCAN:
@@ -380,7 +421,7 @@ int main(void)
     }
 
     // 08:请求心跳数据
-    if (GET_CMD( deviceInfo.commandFromCloud)  == E52_HEARTBEAT && deviceInfo.isOnline) {
+    if (GET_CMD( deviceInfo.commandFromCloud)  == E52_HEARTBEAT && deviceInfo.isOnline && sosState) {
       switch (GET_STEP(deviceInfo.commandFromCloud)) {
         case HEARTBEAT_SEND:
           if (deviceInfo.loraSendSuccessFlag == 0) {
@@ -402,7 +443,7 @@ int main(void)
     }
 
     // 07:配置E52
-    if (GET_CMD( deviceInfo.commandFromCloud)  == CONFIGURE_E52 && deviceInfo.isOnline) {
+    if (GET_CMD( deviceInfo.commandFromCloud)  == CONFIGURE_E52 && deviceInfo.isOnline && sosState) {
       switch (GET_STEP(deviceInfo.commandFromCloud)) {
           case CONFIGURE_E52_SET_BROADCAST_TYPE:      //第一步,配置广播类型
               E52_CONFIG_BROADCAST_TYPE_FUN(deviceInfo.broadcast_type);