20230731_XiaoFuZi_emb/ZheDaXiaoFuZi/Src/Usr/Task/McuTaskBlueTooth.c

786 lines
33 KiB
C
Raw Normal View History

#include "McuTaskBlueTooth.h"
#include "McuE104BT52Drv.h"
#include "ZthyToolCheck.h"
#include "McuBspUart.h"
#include "McuBspGpio.h"
#include "McuTaskFlash.h"
#include "McuTaskImu.h"
#include "McuTaskInPara.h"
#include "McuTaskManyPara.h"
#include "McuTaskPosition.h"
#include "McuBspRtc.h"
#include "McuBspTimer.h"
#include "McuSelfDestructionDrv.h"
#include "McuTaskLowPower.h"
#include "BeiDouHtyDrv.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 控制引脚配置 */
#define MCU_TASK_BLUETOOTH_ONOFF_GPIO_PORT GPIOD
#define MCU_TASK_BLUETOOTH_ONOFF_GPIO_PIN GPIO_PIN_7
#define MCU_TASK_BLUETOOTH_ONOFF_GPIO_MODE GPIO_MODE_OUTPUT_PP
#define MCU_TASK_BLUETOOTH_ONOFF_GPIO_SPEED GPIO_SPEED_FREQ_LOW
#define MCU_TASK_BLUETOOTH_ONOFF_GPIO_PULL GPIO_PULLDOWN
/* DATA引脚配置 */
#define MCU_TASK_BLUETOOTH_DATA_GPIO_PORT GPIOD
#define MCU_TASK_BLUETOOTH_DATA_GPIO_PIN GPIO_PIN_3
#define MCU_TASK_BLUETOOTH_DATA_GPIO_MODE GPIO_MODE_ANALOG
#define MCU_TASK_BLUETOOTH_DATA_GPIO_SPEED GPIO_SPEED_FREQ_LOW
#define MCU_TASK_BLUETOOTH_DATA_GPIO_PULL GPIO_PULLDOWN
/* LINK引脚配置 */
#define MCU_TASK_BLUETOOTH_LINK_GPIO_PORT GPIOD
#define MCU_TASK_BLUETOOTH_LINK_GPIO_PIN GPIO_PIN_4
#define MCU_TASK_BLUETOOTH_LINK_GPIO_MODE GPIO_MODE_IT_RISING
#define MCU_TASK_BLUETOOTH_LINK_GPIO_SPEED GPIO_SPEED_FREQ_HIGH
#define MCU_TASK_BLUETOOTH_LINK_GPIO_PULL GPIO_PULLDOWN
/* WKP引脚配置 */
#define MCU_TASK_BLUETOOTH_WKP_GPIO_PORT GPIOD
#define MCU_TASK_BLUETOOTH_WKP_GPIO_PIN GPIO_PIN_5
#define MCU_TASK_BLUETOOTH_WKP_GPIO_MODE GPIO_MODE_OUTPUT_PP
#define MCU_TASK_BLUETOOTH_WKP_GPIO_SPEED GPIO_SPEED_FREQ_LOW
#define MCU_TASK_BLUETOOTH_WKP_GPIO_PULL GPIO_PULLUP
/* E_RST引脚配置 */
#define MCU_TASK_BLUETOOTH_RST_GPIO_PORT GPIOD
#define MCU_TASK_BLUETOOTH_RST_GPIO_PIN GPIO_PIN_6
#define MCU_TASK_BLUETOOTH_RST_GPIO_MODE GPIO_MODE_OUTPUT_PP
#define MCU_TASK_BLUETOOTH_RST_GPIO_SPEED GPIO_SPEED_FREQ_LOW
#define MCU_TASK_BLUETOOTH_RST_GPIO_PULL GPIO_PULLUP
/* 蓝牙的通讯模式 */
#define MCU_TASK_BLUETOOTH_MODE_AT 0
#define MCU_TASK_BLUETOOTH_MODE_TRANS 1
/* 透传模式下的蓝牙接收缓存大小定义 */
#define TASK_BLUETOOTH_RECV_BUF_NUM 30
#define TASK_BLUETOOTH_RECV_BUF_LEN_MAX 220
#define TASK_BLUETOOTH_SEND_BUF_LEN_MAX 220
/* 蓝牙接收buf的状态宏定义 */
#define TASK_BLUETOOTH_RECV_BUF_IDLE_STATE 0
#define TASK_BLUETOOTH_RECV_BUF_SATRT_STATE 1
#define TASK_BLUETOOTH_RECV_BUF_END_STATE 2
#define MCU_TASK_BLUETOOTH_UART_ID MCU_BSP_UART5_ID
static uint32_t gDeviceType = 0; // 设备类型
static uint32_t gDeviceId = 4; // 设备ID
static uint8_t gBlueToothMode = MCU_TASK_BLUETOOTH_MODE_AT; // 蓝牙默认处在的模式
/* AT模式下的蓝牙接收buf */
static uint8_t gAtBufBlueTooth[32] = {0};
static uint8_t gAtBlueToothCount = 0;
/* 透传模式下的蓝牙buf */
static uint8_t gTransRBufBlueTooth[TASK_BLUETOOTH_RECV_BUF_NUM][TASK_BLUETOOTH_RECV_BUF_LEN_MAX] = {{0}};
static uint16_t gTransRBlueToothCount[TASK_BLUETOOTH_RECV_BUF_NUM] = {0};
static uint8_t gTransBlueToothState[TASK_BLUETOOTH_RECV_BUF_NUM] = {0};
static uint8_t gTransTBufBlueTooth[TASK_BLUETOOTH_RECV_BUF_LEN_MAX] = {0};
/* 工作模式 */
static uint8_t gAppWorkMode = 0; // 0表示工作模式
static uint8_t gBlueToothWorkMode = 0; // 0表示蓝牙工作模式
static E104BT52_OBJ TaskBlueToothObj = {0}; // 蓝牙对象
static MCU_BSP_UART_CONF gMcuTaskBlueToothUartConf = {0};// 串口通信配置对象
static MCU_BSP_TIMER_TASK gMcuTaskBlueToothTaskTimer = {0};
static int gMcuTaskBlueToothTimerId = -1;
static uint16_t gMcuTaskBlueToothJoinLowPowerSerial = 0;
static uint16_t gMcuTaskBlueToothNotice = 0;
static void McuTaskBlueToothRead(uint8_t Data);
static int McuTaskBlueToolUartWrite(unsigned char *Buf, unsigned int BufLen);
static int McuTaskBlueToolUartRead(unsigned char *Buf, unsigned int BufLen);
/* 清除接收buf */
static void TaskBlueToothClearRecvState(uint8_t Num);
static void TaskBlueToothNormalAck(uint16_t PlatNum, uint16_t PlatId, uint8_t Result);
static void TaskBlueToothModeDisable(void);
static void TaskBlueToothRestart(void);
int McuTaskBlueToothInit(void)
{
int rt = -1;
/* 初始化通信口 */
gMcuTaskBlueToothUartConf.BaudRate = 115200;
gMcuTaskBlueToothUartConf.WordLength = UART_WORDLENGTH_8B;
gMcuTaskBlueToothUartConf.StopBits = UART_STOPBITS_1;
gMcuTaskBlueToothUartConf.Parity = UART_PARITY_NONE;
gMcuTaskBlueToothUartConf.Mode = UART_MODE_TX_RX;
rt = McuBspUartInit(MCU_TASK_BLUETOOTH_UART_ID, &gMcuTaskBlueToothUartConf,
NULL, McuTaskBlueToothRead);
/* 初始化电源管理口 */
McuBspGpioInit(MCU_TASK_BLUETOOTH_ONOFF_GPIO_PORT, MCU_TASK_BLUETOOTH_ONOFF_GPIO_PIN,
MCU_TASK_BLUETOOTH_ONOFF_GPIO_MODE, MCU_TASK_BLUETOOTH_ONOFF_GPIO_SPEED,
MCU_TASK_BLUETOOTH_ONOFF_GPIO_PULL, 0, NULL);
McuBspGpioSetLevel(MCU_TASK_BLUETOOTH_ONOFF_GPIO_PORT, MCU_TASK_BLUETOOTH_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH);
/* 初始化唤醒引脚 */
McuBspGpioInit(MCU_TASK_BLUETOOTH_WKP_GPIO_PORT, MCU_TASK_BLUETOOTH_WKP_GPIO_PIN,
MCU_TASK_BLUETOOTH_WKP_GPIO_MODE, MCU_TASK_BLUETOOTH_WKP_GPIO_SPEED,
MCU_TASK_BLUETOOTH_WKP_GPIO_PULL, 0, NULL);
/* 初始化连接引脚 */
McuBspGpioInit(MCU_TASK_BLUETOOTH_LINK_GPIO_PORT, MCU_TASK_BLUETOOTH_LINK_GPIO_PIN,
MCU_TASK_BLUETOOTH_LINK_GPIO_MODE, MCU_TASK_BLUETOOTH_LINK_GPIO_SPEED,
MCU_TASK_BLUETOOTH_LINK_GPIO_PULL, MCU_BSP_GPIO_EXTI4, McuTaskLowPowerSetGpioCallback);
/* 初始化数据引脚 */
McuBspGpioInit(MCU_TASK_BLUETOOTH_DATA_GPIO_PORT, MCU_TASK_BLUETOOTH_DATA_GPIO_PIN,
MCU_TASK_BLUETOOTH_DATA_GPIO_MODE, MCU_TASK_BLUETOOTH_DATA_GPIO_SPEED,
MCU_TASK_BLUETOOTH_DATA_GPIO_PULL, 0, NULL);
/* 初始化RST引脚 */
McuBspGpioInit(MCU_TASK_BLUETOOTH_RST_GPIO_PORT, MCU_TASK_BLUETOOTH_RST_GPIO_PIN,
MCU_TASK_BLUETOOTH_RST_GPIO_MODE, MCU_TASK_BLUETOOTH_RST_GPIO_SPEED,
MCU_TASK_BLUETOOTH_RST_GPIO_PULL, 0, NULL);
McuBspGpioSetLevel(MCU_TASK_BLUETOOTH_RST_GPIO_PORT, MCU_TASK_BLUETOOTH_RST_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH);
McuBspUartStartRecv(MCU_TASK_BLUETOOTH_UART_ID);
McuTaskBlueToothSleep();
McuTaskBlueToothWakeUp();
TaskBlueToothObj.BlueToothId = gDeviceId - 1;
TaskBlueToothObj.BluetoothRecv = McuTaskBlueToolUartRead;
TaskBlueToothObj.BluetoothSend = McuTaskBlueToolUartWrite;
TaskBlueToothObj.DelayMs = HAL_Delay;
while (1) {
rt = McuE104BT52DrvInit(&TaskBlueToothObj);
if (rt == 0) {
gBlueToothMode = MCU_TASK_BLUETOOTH_MODE_TRANS;
break;
}
}
/* 对蓝牙模块进行重新上电,因为不这么做无法找到该蓝牙 */
TaskBlueToothRestart();
/* 获取工作模式 */
gAppWorkMode = McuTaskFlashGetAppMode();
McuTaskFlashWriteOpt("BlueTh Init Success\r\n", strlen("BlueTh Init Success\r\n"));
return 0;
}
/* 睡眠 */
void McuTaskBlueToothSleep(void)
{
McuBspGpioSetLevel(MCU_TASK_BLUETOOTH_WKP_GPIO_PORT, MCU_TASK_BLUETOOTH_WKP_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW);
HAL_Delay(600);
McuBspGpioSetLevel(MCU_TASK_BLUETOOTH_WKP_GPIO_PORT, MCU_TASK_BLUETOOTH_WKP_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH);
HAL_Delay(600);
}
/* 唤醒 */
void McuTaskBlueToothWakeUp(void)
{
McuBspGpioSetLevel(MCU_TASK_BLUETOOTH_WKP_GPIO_PORT, MCU_TASK_BLUETOOTH_WKP_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH);
HAL_Delay(600);
McuBspGpioSetLevel(MCU_TASK_BLUETOOTH_WKP_GPIO_PORT, MCU_TASK_BLUETOOTH_WKP_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW);
HAL_Delay(600);
}
/* 通信处理任务 */
int McuTaskBlueTooth(void)
{
int k;
int i = 0;
int j = 0;
uint8_t crc = 0;
uint32_t TmpId;
uint32_t TmpType;
uint16_t MessageId;
uint16_t MessageNum;
uint16_t MessageLen;
while (1) {
for (k = 0; k < TASK_BLUETOOTH_RECV_BUF_NUM; k++) {
if (gTransBlueToothState[k] == TASK_BLUETOOTH_RECV_BUF_END_STATE) {
break;
}
}
if (k >= TASK_BLUETOOTH_RECV_BUF_NUM) {
break;//没有还需要处理的数据
}
/* 消息处理 */
for (i = 1; i < gTransRBlueToothCount[k] - 1; i++) {
if (gTransRBufBlueTooth[k][i] == 0x7f) {
TaskBlueToothClearRecvState(k);
break;
} else if (gTransRBufBlueTooth[k][i] == 0x7e) {
i++;
if (gTransRBufBlueTooth[k][i] == 0x01) {
gTransRBufBlueTooth[k][j] = 0x7e;
} else if (gTransRBufBlueTooth[k][i] == 0x02) {
gTransRBufBlueTooth[k][j] = 0x7f;
} else {
TaskBlueToothClearRecvState(k);
break;
}
} else {
gTransRBufBlueTooth[k][j] = gTransRBufBlueTooth[k][i];
}
j++;
}
if (i < (gTransRBlueToothCount[k] - 1)) {
continue; // 可能还存在需要处理的数据
}
/* 提取消息中的终端设备类型 */
TmpType = (((uint32_t)gTransRBufBlueTooth[k][2]) << 24) |
(((uint32_t)gTransRBufBlueTooth[k][3]) << 16) |
(((uint32_t)gTransRBufBlueTooth[k][4]) << 8) |
((uint32_t)gTransRBufBlueTooth[k][5]);
/* 提取消息中的设备ID */
TmpId = (((uint32_t)gTransRBufBlueTooth[k][6]) << 24) |
(((uint32_t)gTransRBufBlueTooth[k][7]) << 16) |
(((uint32_t)gTransRBufBlueTooth[k][8]) << 8) |
((uint32_t)gTransRBufBlueTooth[k][9]);
/* 提取消息中的平台消息ID */
MessageId = (((uint16_t)gTransRBufBlueTooth[k][0]) << 8) |
((uint16_t)gTransRBufBlueTooth[k][1]);
/* 提取消息中的平台消息流水号 */
MessageNum = (((uint16_t)gTransRBufBlueTooth[k][14]) << 8) |
((uint16_t)gTransRBufBlueTooth[k][15]);
/* 消息长度 */
MessageLen = (((uint16_t)(gTransRBufBlueTooth[k][10] & 0x03)) << 8) | ((uint16_t)gTransRBufBlueTooth[k][11]);
if ((TmpType != gDeviceType) || (TmpId != gDeviceId)) {
TaskBlueToothClearRecvState(k);
continue;
}
crc = 0;
if ((gTransRBufBlueTooth[k][10] & 0x0c) == 0x0c) {
ZthyToolCheckCrc8_0x31(gTransRBufBlueTooth[k], j - 1, &crc);
if (crc != gTransRBufBlueTooth[k][j - 1]) {
TaskBlueToothClearRecvState(k);
continue;
}
} else {
TaskBlueToothClearRecvState(k);
continue;
}
if ((gTransRBufBlueTooth[k][10] & 0x20) == 0x20) {
if (MessageLen != (j - 19)) {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskBlueToothClearRecvState(k);
continue;
} else {
i = 18;
}
} else {
if (MessageLen != (j - 17)) {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskBlueToothClearRecvState(k);
continue;
} else {
i = 16;
}
}
if (gAppWorkMode != 0) {
if (MessageId == PLAT_ACK_MESSAGE_ID) {
uint16_t AckSerial;
uint16_t AckId;
uint8_t AckResult;
if (MessageLen != 5) {
TaskBlueToothClearRecvState(k);
continue;
}
AckSerial = (((uint16_t)gTransRBufBlueTooth[k][i]) << 8) |
((uint16_t)gTransRBufBlueTooth[k][i + 1]);
AckId = (((uint16_t)gTransRBufBlueTooth[k][i + 2]) << 8) |
((uint16_t)gTransRBufBlueTooth[k][i + 3]);
AckResult = gTransRBufBlueTooth[k][i + 4];
if (AckResult != 0) {
continue;
}
/* 分析是哪个报文的回答 */
if (AckId == MCU_TASK_FLASH_SEND_MESSAGE_ID) {
McuTaskFlashAckOk(AckSerial);
}
TaskBlueToothClearRecvState(k);
} else if (MessageId == PLAT_ASK_TERMINAL_DATA_MESSAGE_ID) {
uint16_t AskId;
AskId = (((uint16_t)gTransRBufBlueTooth[k][i]) << 8) |
((uint16_t)gTransRBufBlueTooth[k][i + 1]);
if (AskId == MCU_TASK_IMU_SEND_MESSAGE_ID) {
McuTaskFlashWriteOpt("BlueTh Ask Imu\r\n", strlen("BlueTh Ask Imu\r\n"));
McuTaskImuBlueToothAsk();
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
} else if (AskId == MCU_TASK_INPARA_SEND_MESSAGE_ID) {
McuTaskFlashWriteOpt("BlueTh Ask Inpara\r\n", strlen("BlueTh Ask Inpara\r\n"));
McuTaskInParaBlueToothAsk();
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
} else if (AskId == MCU_TASK_MANYPARA_SEND_MESSAGE_ID) {
McuTaskFlashWriteOpt("BlueTh Ask Manypara\r\n", strlen("BlueTh Ask Manypara\r\n"));
McuTaskManyParaBlueToothAsk();
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
} else if (AskId == MCU_TASK_POSITION_SEND_MESSAGE_ID) {
McuTaskFlashWriteOpt("BlueTh Ask Position\r\n", strlen("BlueTh Ask Position\r\n"));
McuTaskPositionBlueToothAsk();
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
} else {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
}
TaskBlueToothClearRecvState(k);
} else if (MessageId == PLAT_ASK_TERMINAL_UPDATA_MESSAGE_ID) {
McuTaskFlashWriteOpt("BlueTh Ask Update\r\n", strlen("BlueTh Ask Update\r\n"));
McuTaskFlashAskUpdate(gTransRBufBlueTooth[k][i]);
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
TaskBlueToothClearRecvState(k);
} else if (MessageId == PLAT_ASK_TERMINAL_RESTART_MESSAGE_ID) {
McuTaskFlashWriteOpt("BlueTh Ask Restart\r\n", strlen("BlueTh Ask Restart\r\n"));
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
TaskBlueToothClearRecvState(k);
HAL_Delay(1000);
__set_FAULTMASK(1);//关闭所有中断
NVIC_SystemReset();//复位函数
} else if (MessageId == PLAT_ASK_TERMINAL_SELF_DESTROYING_MESSAGE_ID) {
/* 自毁模式设置 */
char Buf[50] = {0};
sprintf(Buf, "BlueTh BeiDou SelfDesMode: %d\r\n" , gTransRBufBlueTooth[k][i]);
McuTaskFlashWriteOpt(Buf, strlen(Buf));
McuTaskSetSelfStructionMode(gTransRBufBlueTooth[k][i]);
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
TaskBlueToothClearRecvState(k);
} else if (MessageId == PLAT_ASK_CHANGE_BEIDOU_SEND_MODE) {
uint64_t BeiDouNum = 0;
/* 设置北斗通讯的周期 */
if (gTransRBufBlueTooth[k][i] != 0xff) {
char Buf[50] = {0};
sprintf(Buf, "BlueTh BeiDou Period: %d\r\n" , gTransRBufBlueTooth[k][i + 1]);
McuTaskFlashWriteOpt(Buf, strlen(Buf));
if (0 > McuTaskFlashSetWakeUpPeriod(gTransRBufBlueTooth[k][i])) {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskBlueToothClearRecvState(k);
continue;
} else {
McuTaskLowPowerSetPeriod(gTransRBufBlueTooth[k][i]);
}
}
/* 设置北斗重发次数 */
if (gTransRBufBlueTooth[k][i + 1] != 0xff) {
char Buf[50] = {0};
sprintf(Buf, "BlueTh BeiDou Retry: %d\r\n" , gTransRBufBlueTooth[k][i + 1]);
McuTaskFlashWriteOpt(Buf, strlen(Buf));
if (0 > McuTaskFlashSetWakeUpPeriod(gTransRBufBlueTooth[k][i + 1])) {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskBlueToothClearRecvState(k);
continue;
} else {
McuTaskFlashSetBeiDouRetryTime(gTransRBufBlueTooth[k][i + 1]);
}
}
/* 设置北斗卡号 */
BeiDouNum = (((uint64_t)gTransRBufBlueTooth[k][2]) << 56) |
(((uint64_t)gTransRBufBlueTooth[k][3]) << 48) |
(((uint64_t)gTransRBufBlueTooth[k][4]) << 40) |
(((uint64_t)gTransRBufBlueTooth[k][5]) << 32) |
(((uint64_t)gTransRBufBlueTooth[k][6]) << 24) |
(((uint64_t)gTransRBufBlueTooth[k][7]) << 16) |
(((uint64_t)gTransRBufBlueTooth[k][8]) << 8) |
((uint64_t)gTransRBufBlueTooth[k][9]);
if (BeiDouNum != 0xffffffffffffffff) {
char BeiDouNumBuf[20] = {0};
char Buf[50] = {0};
sprintf(Buf, "BlueTh BeiDou Card: %lld\r\n" , BeiDouNum);
McuTaskFlashWriteOpt(Buf, strlen(Buf));
sprintf(BeiDouNumBuf, "%lld", BeiDouNum);
if (0 > McuDrvBeiDouHtyConfOpposite(BeiDouNumBuf, strlen(BeiDouNumBuf))) {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskBlueToothClearRecvState(k);
continue;
}
}
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
TaskBlueToothClearRecvState(k);
} else if (MessageId == PLAT_ASK_CHANGE_WORK_MODE) {
uint64_t Time;
char ModeBuf[50] = {0};
MCU_BSP_CLOCK RtcTime;
if (gTransRBufBlueTooth[k][i] > 2) {
gTransRBufBlueTooth[k][i] = 0;
}
gAppWorkMode = gTransRBufBlueTooth[k][i];
McuTaskFlashSetAppMode(gAppWorkMode);
sprintf(ModeBuf, "BlueTh CheckMode: %d\r\n" , gAppWorkMode);
McuTaskFlashWriteOpt(ModeBuf, strlen(ModeBuf));
Time = (((uint64_t)gTransRBufBlueTooth[k][i + 1]) << 56) |
(((uint64_t)gTransRBufBlueTooth[k][i + 2]) << 48) |
(((uint64_t)gTransRBufBlueTooth[k][i + 3]) << 40) |
(((uint64_t)gTransRBufBlueTooth[k][i + 4]) << 32) |
(((uint64_t)gTransRBufBlueTooth[k][i + 5]) << 24) |
(((uint64_t)gTransRBufBlueTooth[k][i + 6]) << 16) |
(((uint64_t)gTransRBufBlueTooth[k][i + 7]) << 8) |
((uint64_t)gTransRBufBlueTooth[k][i + 8]);
RtcTime.Year = Time / 10000000000;
RtcTime.Month = (Time / 100000000) % 100;
RtcTime.Date = (Time / 1000000) % 100;
RtcTime.Hours = (Time / 10000) % 100;
RtcTime.Minutes = (Time / 100) % 100;
RtcTime.Seconds = Time % 100;
McuBspRtcSetTime(&RtcTime);
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
TaskBlueToothClearRecvState(k);
} else if (MessageId == PLAT_ASK_ASK_FLASH_DATA) {
if (0 > McuTaskFlashSetAsk(gTransRBufBlueTooth[k][i])) {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
} else {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
}
TaskBlueToothClearRecvState(k);
} else if (MessageId == PLAT_ASK_UPDATE_FILE_DATA) {
uint16_t buflen;
uint16_t AllCount = (((uint16_t)gTransRBufBlueTooth[k][i]) << 8) |
((uint16_t)gTransRBufBlueTooth[k][i + 1]);
uint16_t LocalCount = (((uint16_t)gTransRBufBlueTooth[k][i + 2]) << 8) |
((uint16_t)gTransRBufBlueTooth[k][i + 3]);
buflen = MessageLen - 4;
if (0 > McuTaskFlashUpdateProgram(LocalCount, AllCount, &(gTransRBufBlueTooth[k][i + 4]), buflen)) {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
} else {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
if (AllCount == LocalCount) {
HAL_Delay(1000);
__set_FAULTMASK(1);//关闭所有中断
NVIC_SystemReset();//复位函数
}
}
TaskBlueToothClearRecvState(k);
}
} else {
if (MessageId == PLAT_ASK_CHANGE_WORK_MODE) {
uint64_t Time;
char ModeBuf[50] = {0};
MCU_BSP_CLOCK RtcTime;
if (gTransRBufBlueTooth[k][i] > 2) {
gTransRBufBlueTooth[k][i] = 0;
}
gAppWorkMode = gTransRBufBlueTooth[k][i];
McuTaskFlashSetAppMode(gAppWorkMode);
sprintf(ModeBuf, "BlueTh CheckMode: %d\r\n" , gAppWorkMode);
McuTaskFlashWriteOpt(ModeBuf, strlen(ModeBuf));
Time = (((uint64_t)gTransRBufBlueTooth[k][i + 1]) << 56) |
(((uint64_t)gTransRBufBlueTooth[k][i + 2]) << 48) |
(((uint64_t)gTransRBufBlueTooth[k][i + 3]) << 40) |
(((uint64_t)gTransRBufBlueTooth[k][i + 4]) << 32) |
(((uint64_t)gTransRBufBlueTooth[k][i + 5]) << 24) |
(((uint64_t)gTransRBufBlueTooth[k][i + 6]) << 16) |
(((uint64_t)gTransRBufBlueTooth[k][i + 7]) << 8) |
((uint64_t)gTransRBufBlueTooth[k][i + 8]);
RtcTime.Year = Time / 10000000000;
RtcTime.Month = (Time / 100000000) % 100;
RtcTime.Date = (Time / 1000000) % 100;
RtcTime.Hours = (Time / 10000) % 100;
RtcTime.Minutes = (Time / 100) % 100;
RtcTime.Seconds = Time % 100;
McuBspRtcSetTime(&RtcTime);
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_OK);
TaskBlueToothClearRecvState(k);
} else {
TaskBlueToothNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskBlueToothClearRecvState(k);
}
}
}
return 0;
}
/* 发送函数 */
uint32_t TaskBlueToothSendMessage(uint16_t MessageId, uint16_t *Serial, uint8_t *SendBuf, uint32_t SendBufLen)
{
uint32_t i = 0;
uint32_t j = 0;
uint32_t k = 0;
uint32_t e =0;
uint32_t RealSendLen = 0;
uint16_t SendPiece = 0; // 发送条数,用来记录是否具有分包
uint16_t MessageProperties = 0; // 消息属性
uint8_t SendBufTmp[1050] = {0};
if (Serial == NULL) {
return 0;
}
SendPiece = (SendBufLen / 1023) + 1; // 计算总共需要发几条信息
for (i = 0; i < SendPiece; i++) {
if (SendPiece != 1) {
if (i != (SendPiece - 1)) {
MessageProperties = 0x2000 | 0x0c00 | 1023;
} else {
MessageProperties = 0x2000 | 0x0c00 | (SendBufLen % 1023);
}
} else {
MessageProperties = 0x0000 | 0x0c00 | SendBufLen;
}
j = 0;
/* 消息ID */
SendBufTmp[j] = (uint8_t)((MessageId & 0xff00) >> 8);
j++;
SendBufTmp[j] = (uint8_t)(MessageId & 0x00ff);
j++;
/* 设备类型 */
SendBufTmp[j] = (uint8_t)((gDeviceType & 0xff000000) >> 24);
j++;
SendBufTmp[j] = (uint8_t)((gDeviceType & 0x00ff0000) >> 16);
j++;
SendBufTmp[j] = (uint8_t)((gDeviceType & 0x0000ff00) >> 8);
j++;
SendBufTmp[j] = (uint8_t)(gDeviceType & 0x000000ff);
j++;
/* 设备ID号 */
SendBufTmp[j] = (uint8_t)((gDeviceId & 0xff000000) >> 24);
j++;
SendBufTmp[j] = (uint8_t)((gDeviceId & 0x00ff0000) >> 16);
j++;
SendBufTmp[j] = (uint8_t)((gDeviceId & 0x0000ff00) >> 8);
j++;
SendBufTmp[j] = (uint8_t)(gDeviceId & 0x000000ff);
j++;
/* 消息体属性 */
SendBufTmp[j] = (uint8_t)((MessageProperties & 0xff00) >> 8);
j++;
SendBufTmp[j] = (uint8_t)(MessageProperties & 0x00ff);
j++;
/* 协议版本号 */
SendBufTmp[j] = 0x00;
j++;
SendBufTmp[j] = 0x01;
j++;
/* 消息流水号 */
SendBufTmp[j] = (uint8_t)(((*Serial) & 0xff00) >> 8);
j++;
SendBufTmp[j] = (uint8_t)((*Serial) & 0x00ff);
j++;
/* 消息包装项 + 消息内容 */
if (SendPiece != 1) {
/* 消息总包数 */
SendBufTmp[j] = (uint8_t)((SendPiece & 0xff00) >> 8);
j++;
SendBufTmp[j] = (uint8_t)(SendPiece & 0x00ff);
j++;
/* 包序号 */
SendBufTmp[j] = (uint8_t)(((i + 1) & 0xff00) >> 8);
j++;
SendBufTmp[j] = (uint8_t)((i + 1) & 0x00ff);
j++;
if (i != (SendPiece - 1)) {
memcpy(&SendBufTmp[j], &(SendBuf[1023 * i]), 1023);
j += 1023;
} else {
memcpy(&SendBufTmp[j], &(SendBuf[1023 * i]), SendBufLen % 1023);
j += (SendBufLen % 1023);
}
} else {
if ((SendBuf != NULL) && (SendBufLen != 0)) {
memcpy(&SendBufTmp[j], SendBuf, SendBufLen);
j += SendBufLen;
}
}
/* 进行校验 */
SendBufTmp[j] = 0;
ZthyToolCheckCrc8_0x31(SendBufTmp, j, &SendBufTmp[j]);
j++;
/* 进行转义 */
e = 0;
gTransTBufBlueTooth[e] = 0x7f; // 标志位
e++;
for (k = 0; k < j; k++) {
if (SendBufTmp[k] == 0x7e) {
gTransTBufBlueTooth[e] = 0x7e;
e++;
gTransTBufBlueTooth[e] = 0x01;
e++;
} else if (SendBufTmp[k] == 0x7f) {
gTransTBufBlueTooth[e] = 0x7e;
e++;
gTransTBufBlueTooth[e] = 0x02;
e++;
} else {
gTransTBufBlueTooth[e] = SendBufTmp[k];
e++;
}
}
gTransTBufBlueTooth[e] = 0x7f; // 标志位
e++;
/* 发送数据 */
if (gAppWorkMode != 0 && (gBlueToothWorkMode == 1 || gMcuTaskBlueToothNotice == 1)) {
McuBspUartSend(MCU_TASK_BLUETOOTH_UART_ID, gTransTBufBlueTooth, e);
}
RealSendLen += e;
}
return RealSendLen;
}
/* 发送通知 */
void TaskBlueToothJoinLowPowerNoticePlat(void)
{
gMcuTaskBlueToothNotice = 1;
TaskBlueToothSendMessage(DEVICE_NOTICE_PLAT_BLUETOOTH_JOIN_LOWPOWER, &gMcuTaskBlueToothJoinLowPowerSerial, NULL, 0);
gMcuTaskBlueToothJoinLowPowerSerial++;
gMcuTaskBlueToothNotice = 0;
}
unsigned char TaskBlueToothGetAppMode(void)
{
return gAppWorkMode;
}
unsigned char TaskBlueToothGetBluetoothMode(void)
{
return gBlueToothWorkMode;
}
/* 新增定时器 */
void TaskBlueToothNewTimer(void)
{
if (gAppWorkMode != 0) {
if (gMcuTaskBlueToothTimerId < 0) {
gBlueToothWorkMode = 1;
gMcuTaskBlueToothTaskTimer.TaskPeriod = 60;
gMcuTaskBlueToothTaskTimer.Callback = TaskBlueToothModeDisable;
gMcuTaskBlueToothTimerId = McuBspTimerAddTask(&gMcuTaskBlueToothTaskTimer);
} else if (gMcuTaskBlueToothTimerId >= 0) {
McuBspTimerTaskRefresh(gMcuTaskBlueToothTimerId);
}
}
}
/* 删除一个定时器 */
void TaskBlueToothDelTimer(void)
{
if (gMcuTaskBlueToothTimerId >= 0) {
gBlueToothWorkMode = 0;
McuBspTimerDelTask(gMcuTaskBlueToothTimerId);
gMcuTaskBlueToothTimerId = -1;
}
}
/* 重启蓝牙模块 */
static void TaskBlueToothRestart(void)
{
McuBspGpioSetLevel(MCU_TASK_BLUETOOTH_ONOFF_GPIO_PORT, MCU_TASK_BLUETOOTH_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW);
McuBspGpioSetLevel(MCU_TASK_BLUETOOTH_RST_GPIO_PORT, MCU_TASK_BLUETOOTH_RST_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW);
HAL_Delay(4000);
McuBspGpioSetLevel(MCU_TASK_BLUETOOTH_RST_GPIO_PORT, MCU_TASK_BLUETOOTH_RST_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH);
McuBspGpioSetLevel(MCU_TASK_BLUETOOTH_ONOFF_GPIO_PORT, MCU_TASK_BLUETOOTH_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH);
}
/* 失能蓝牙 */
static void TaskBlueToothModeDisable(void)
{
gMcuTaskBlueToothTimerId = -1;
if (0 == (0x02 & McuTaskImuAskStatus()) && 0 == (0x02 & McuTaskInParaAskStatus()) &&
0 == (0x02 & McuTaskManyParaAskStatus()) && 0 == (0x02 & McuTaskPositionAskStatus()) &&
0 == McuTaskFlashGetAsk()) {
gBlueToothWorkMode = 0;
} else {
if (gMcuTaskBlueToothTimerId < 0) {
gBlueToothWorkMode = 1;
gMcuTaskBlueToothTaskTimer.TaskPeriod = 60;
gMcuTaskBlueToothTaskTimer.Callback = TaskBlueToothModeDisable;
gMcuTaskBlueToothTimerId = McuBspTimerAddTask(&gMcuTaskBlueToothTaskTimer);
}
}
}
static void TaskBlueToothNormalAck(uint16_t PlatNum, uint16_t PlatId, uint8_t Result)
{
uint8_t Ack[5] = {0};
static uint16_t Serial = 0;
Ack[0] = (uint8_t)((PlatNum & 0xff00) >> 8);
Ack[1] = (uint8_t)(PlatNum & 0x00ff);
Ack[2] = (uint8_t)((PlatId & 0xff00) >> 8);
Ack[3] = (uint8_t)(PlatId & 0x00ff);
Ack[4] = Result;
gMcuTaskBlueToothNotice = 1;
TaskBlueToothSendMessage(0x0000, &Serial, Ack, sizeof(Ack));
gMcuTaskBlueToothNotice = 0;
Serial++;
}
static int McuTaskBlueToolUartWrite(unsigned char *Buf, unsigned int BufLen)
{
if (gBlueToothMode == MCU_TASK_BLUETOOTH_MODE_AT) {
gAtBlueToothCount = 0;
}
return McuBspUartSend(MCU_TASK_BLUETOOTH_UART_ID, Buf, BufLen);
}
static int McuTaskBlueToolUartRead(unsigned char *Buf, unsigned int BufLen)
{
int i = 0;
if (BufLen >= 32) {
return -1;
}
/* 等待接收完成 */
while (gAtBlueToothCount < BufLen) {
HAL_Delay(1);
i++;
/* 超时 */
if (i >= 300) {
break;
}
}
for (i = 0; i < gAtBlueToothCount; i++) {
Buf[i] = gAtBufBlueTooth[i];
}
return i;
}
static void McuTaskBlueToothRead(uint8_t Data)
{
if (gBlueToothMode != MCU_TASK_BLUETOOTH_MODE_AT) {
if (Data == 0x7f) {
int i;
for (i = 0; i < TASK_BLUETOOTH_RECV_BUF_NUM; i++) {
if (gTransBlueToothState[i] == TASK_BLUETOOTH_RECV_BUF_SATRT_STATE) {
if (gTransRBlueToothCount[i] < 18) {
/* 说明接收的包不全或者包出现问题该0x7f不是结束标志位是开始标志位
0x7f */
gTransBlueToothState[i] = TASK_BLUETOOTH_RECV_BUF_IDLE_STATE;
gTransRBlueToothCount[i] = 0;
break;
} else {
gTransRBufBlueTooth[i][gTransRBlueToothCount[i]] = Data;
gTransRBlueToothCount[i]++;
gTransRBlueToothCount[i] = gTransRBlueToothCount[i] % TASK_BLUETOOTH_RECV_BUF_LEN_MAX;
gTransBlueToothState[i] = TASK_BLUETOOTH_RECV_BUF_END_STATE;
return;
}
}
}
for (i = 0; i < TASK_BLUETOOTH_RECV_BUF_NUM; i++) {
if (gTransBlueToothState[i] == TASK_BLUETOOTH_RECV_BUF_IDLE_STATE) {
gTransRBufBlueTooth[i][gTransRBlueToothCount[i]] = Data;
gTransRBlueToothCount[i]++;
gTransBlueToothState[i] = TASK_BLUETOOTH_RECV_BUF_SATRT_STATE;
break;
}
}
} else {
int i;
for (i = 0; i < TASK_BLUETOOTH_RECV_BUF_NUM; i++) {
if (gTransBlueToothState[i] == TASK_BLUETOOTH_RECV_BUF_SATRT_STATE) {
gTransRBufBlueTooth[i][gTransRBlueToothCount[i]] = Data;
gTransRBlueToothCount[i]++;
gTransRBlueToothCount[i] = gTransRBlueToothCount[i] % TASK_BLUETOOTH_RECV_BUF_LEN_MAX;
break;
}
}
}
} else {
gAtBufBlueTooth[gAtBlueToothCount] = Data;
gAtBlueToothCount++;
gAtBlueToothCount = gAtBlueToothCount % 32;
}
}
/* 清除接收buf */
static void TaskBlueToothClearRecvState(uint8_t Num)
{
gTransRBlueToothCount[Num] = 0;
gTransBlueToothState[Num] = TASK_BLUETOOTH_RECV_BUF_IDLE_STATE;
}