Przeglądaj źródła

修改SOS逻辑,添加最后数据帧,添加空数据时候清除信号强度

xuxinyi 2 miesięcy temu
rodzic
commit
b831e7fe48
5 zmienionych plików z 36 dodań i 6 usunięć
  1. 1 0
      Core/Inc/RTC_SLEEP.h
  2. 4 1
      Core/Src/E52.c
  3. 1 0
      Core/Src/RTC_SLEEP.c
  4. 28 4
      Core/Src/main.c
  5. 2 1
      Core/Src/stm32f1xx_it.c

+ 1 - 0
Core/Inc/RTC_SLEEP.h

@@ -34,6 +34,7 @@
 extern RTC_TimeTypeDef SOS_key_struct;
 extern RTC_TimeTypeDef JUGE_key_struct;
 extern RTC_TimeTypeDef Online_struct;
+extern RTC_TimeTypeDef SOS_struct;
 
 // void RTC_GetDateTime(RTC_HandleTypeDef *hrtc, RTC_DateTimeTypeDef *datetime);
 

+ 4 - 1
Core/Src/E52.c

@@ -80,7 +80,7 @@ void E52_Send_Bl_Data_Fun(uint8_t i, uint8_t finishData) {
     SendBlData_structure sendBlData_structure;
     sendBlData_structure.frame_header_H = 0x55;
     sendBlData_structure.frame_header_L = 0xAA;
-    if (deviceInfo.isSOS) {
+    if (!deviceInfo.isSOS) {
         sendBlData_structure.function_code = 0x02;
     }else {
         sendBlData_structure.function_code = 0x04;
@@ -88,6 +88,9 @@ void E52_Send_Bl_Data_Fun(uint8_t i, uint8_t finishData) {
     sendBlData_structure.badge_addr_high = deviceInfo.loraDeviceAddress_H;
     sendBlData_structure.badge_addr_low = deviceInfo.loraDeviceAddress_L;
     memcpy(sendBlData_structure.bl_data, totalData[i], 8);
+    if (sendBlData_structure.bl_data[0] == 0x00) { //如果蓝牙数据未空,信号强度改为FF。
+        sendBlData_structure.bl_data[7] = 0xFF;
+    }
     sendBlData_structure.finish_send = finishData;
     sendBlData_structure.frame_tail_H = 0xFF;
     sendBlData_structure.frame_tail_L = 0xEE;

+ 1 - 0
Core/Src/RTC_SLEEP.c

@@ -6,6 +6,7 @@
 RTC_TimeTypeDef SOS_key_struct =  {0};
 RTC_TimeTypeDef JUGE_key_struct = {0};
 RTC_TimeTypeDef Online_struct = {0};
+RTC_TimeTypeDef SOS_struct = {0};
 // RTC_key_struct SOS_key_struct = {
 //     .key_Count = 0,
 //     .key_Duration = 0,

+ 28 - 4
Core/Src/main.c

@@ -363,6 +363,19 @@ int main(void)
       }
     }
 
+    // if (deviceInfo.isSOS) {
+    //   RTC_TimeTypeDef now = {0};
+    //   HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
+    //
+    //   int pressedSeconds = (now.Hours * 3600 + now.Minutes * 60 + now.Seconds)
+    //                      - (SOS_struct.Hours * 3600 + SOS_struct.Minutes * 60 + SOS_struct.Seconds);
+    //   if (pressedSeconds < 0) pressedSeconds += 24 * 3600;
+    //
+    //   if (pressedSeconds >= 120) { //如果出现异常情况,导致SOS一直处于被按下情况,关闭SOS。
+    //     deviceInfo.isSOS = FALSE;
+    //   }
+    // }
+
 
     // 解析后台命令
     if (GET_CMD( deviceInfo.commandFromCloud) == IDLE && GET_STEP(deviceInfo.commandFromCloud) == STEP_VERIFY) {
@@ -385,7 +398,7 @@ int main(void)
           i = 0;
           while (receiveBlDataCount > i) {
 
-            printf("发送第%d个蓝牙数据给Lora\r\n", i);
+            // printf("发送第%d个蓝牙数据给Lora\r\n", i);
             if (deviceInfo.loraSendSuccessFlag == 0) {
               E52_Send_Bl_Data_Fun(i,0x00);
             }else {
@@ -394,10 +407,10 @@ int main(void)
             memset(totalData[i], 0, sizeof(totalData[i]));
             i++;
           }
-
+          // printf("发送最后一位,开始发送蓝牙数据给Lora\r\n");
           E52_Send_Bl_Data_Fun(i,0x01);
           deviceInfo.commandFromCloud = COMBINE_CMD_STEP(REQUEST_BLUETOOTH_DATA, STEP_COMPLETE);
-          printf("停止蓝牙扫描,开始发送蓝牙数据给Lora\r\n");
+          printf("发送完成\r\n");
           break;          //发送数据阶段
         case STEP_COMPLETE:
           receiveBlDataCount = 0;
@@ -405,12 +418,23 @@ int main(void)
           deviceInfo.forwardBLAndLoraDataDuration = 0;
           i = 0;
           deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
-          printf("发送结束\r\n");
+          // printf("发送结束\r\n");
           break;
 
         default:
           // 处理未知步骤
           printf("收到未知步骤,忽略处理\r\n");
+          deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_VERIFY);
+          rx_buf_uart2[0] = 0x55;
+          rx_buf_uart2[1] = 0xBB;
+          rx_buf_uart2[2] = 0x03;
+          rx_buf_uart2[3] = deviceInfo.loraDeviceAddress_H;
+          rx_buf_uart2[4] = deviceInfo.loraDeviceAddress_L;
+          rx_buf_uart2[5] = 0x03;
+          rx_buf_uart2[6] = 0xE8;
+          rx_buf_uart2[7] = 0x00;
+          rx_buf_uart2[8] = 0xFF;
+          rx_buf_uart2[9] = 0xEE;
           break;
       }
     }

+ 2 - 1
Core/Src/stm32f1xx_it.c

@@ -304,7 +304,7 @@ void USART2_IRQHandler(void)
           rx_buf_uart2_DMA[3] == deviceInfo.loraDeviceAddress_H &&
           rx_buf_uart2_DMA[4] == deviceInfo.loraDeviceAddress_L &&
           rx_buf_uart2_DMA[8] == 0xFF &&
-          rx_buf_uart2_DMA[9] == 0xEE)
+          rx_buf_uart2_DMA[9] == 0xEE && !deviceInfo.isSOS)
       {
         if (GET_CMD(deviceInfo.commandFromCloud) == IDLE &&
             GET_STEP(deviceInfo.commandFromCloud) == STEP_INIT)
@@ -425,6 +425,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
     } else {
       // 按下(下降沿)
       printf("SOS_KEY 按下\r\n");
+      SOS_struct = currentTime;  // 记录上报时间
       deviceInfo.isSOS = TRUE;
     }
   }