From f7a18ec4494b9c5c9ef3fd440bbf68ffc6425e18 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期四, 08 十二月 2022 15:40:56 +0800
Subject: [PATCH] 智慧驾培首次提交
---
lib/src/main/cpp/mcu/mcu_if.cpp | 482 ++++------------------------------------------------
1 files changed, 43 insertions(+), 439 deletions(-)
diff --git a/lib/src/main/cpp/mcu/mcu_if.cpp b/lib/src/main/cpp/mcu/mcu_if.cpp
index c658caa..9d9f928 100644
--- a/lib/src/main/cpp/mcu/mcu_if.cpp
+++ b/lib/src/main/cpp/mcu/mcu_if.cpp
@@ -3,9 +3,11 @@
//
#include <cstring>
-#include <pthread.h>
+#include <thread>
+#include <mutex>
#include <cstdlib>
#include "mcu_if.h"
+#include "ahp.h"
#include "../common/apptimer.h"
#include "../utils/crc16.h"
#include "../defs.h"
@@ -15,92 +17,34 @@
#include "../rtk_module/parse_gps.h"
#include "../native-lib.h"
#include "../rtk_module/virtual_rtk.h"
+#include "../common/string_util.h"
#define DEBUG(fmt, args...) LOGD("<mcu_if> <%s>: " fmt, __func__, ##args)
#define MCU_UART UART_1
-enum parse_status_t {
- SYNC_HEAD_ONE,
- SYNC_HEAD_TWO,
- GET_ID_HI,
- GET_ID_LO,
- GET_LENGTH_HI,
- GET_LENGTH_LO,
- GET_PAYLOAD,
- GET_CRC16_HI,
- GET_CRC16_LO
-};
-
-#define ID_CM_APP_BOOT 0x0001
-#define ID_MC_MCU_BOOT 0x8001
-#define ID_CM_DFU_UPLOAD 0x0002
-#define ID_MC_DFU_RSP 0x8002
-#define ID_CM_RW_INFO 0x0003
-#define ID_MC_RW_INFO_RSP 0x8003
-#define ID_CM_MCU_DFU_REQ 0x0004
-#define ID_MC_MCU_DFU_RSP 0x8004
-#define ID_CM_MCU_DFU_DATA 0x0005
-#define ID_CM_MCU_DFU_DATA_CMP 0x0006
-#define ID_MC_CAR_INFO2 0x8006
-#define ID_MC_CAR_INFO 0x8007
+#define ID_CM_AHP_INQ 0x0001
+#define ID_MC_AHP_RESP 0x8001
+#define ID_CM_AHP_DFU_DATA_UPLOAD 0x0002
+#define ID_MC_AHP_DFU_RESP 0x8002
#define ID_MC_RTK_DATA 0x8008
#define ID_CM_RTK_DATA 0x0008
#define ID_CM_READ_RFCARD 0x0009
-#define ID_MC_RFCARD_RSP 0x8009
-#define ID_CM_SHUTDOWN 0x0020
-#define ID_MC_GNSS_DATA 0x800A
-#define ID_CM_SINAN_CMD_DATA 0x000B
-
-static parse_status_t parse_status;
-
-static struct {
- uint16_t id;
- uint16_t length;
- uint16_t rx_len;
- uint8_t buffer[4096 + 4];
- uint16_t crc16;
-}McuPkt;
-
-static uint8_t *dfuFile = NULL;
-static uint8_t dfuFileBitmap[128];
-
-static int dfuFileLength = 0;
-static int dfuTryCnt = 0;
-const int DFU_MAX_TRY = 3;
-const int DFU_FILE_BLOCK_SIZE = 896;
static int (*WriteMcu)(int id, const void *buf, int len);
static int WriteBluetooth(int id, const void *buf, int len);
-static void *UartThread1(void *p);
-static void ParseMcuTimeout(union sigval sig);
-static void McuCommandEntry(uint16_t id, const uint8_t *data, int length);
+static void ReadCardTimeout(apptimer_var_t val);
-static void SendDfuFile(int fileLen, int sentLen, int blockLen, const uint8_t *data);
-static void GoNextDfuLater(union sigval sig);
-static void GoNextDfu(void);
-static void ReadCardTimeout(union sigval sig);
-
-void McuCommModeSel(int mode)
-{
- if (mode == 0) {
- WriteMcu = WriteSerialPort;
- } else {
- WriteMcu = WriteBluetooth;
- }
+ParseUart::ParseUart(funptr fun) {
+ McuPkt.buffer = new uint8_t [4096 + 4];
+ this->fun = fun;
+ parse_status = SYNC_HEAD_ONE;
}
-void ParseMcuInit(void)
-{
- dfuFile = NULL;
- dfuFileLength = 0;
-
- parse_status = SYNC_HEAD_ONE;
- AppTimer_delete(ParseMcuTimeout);
-
-// SendMcuCommand(ID_CM_APP_BOOT, NULL, 0);
+ParseUart::~ParseUart() {
+ delete []McuPkt.buffer;
}
static int WriteBluetooth(int id, const void *buf, int len)
@@ -109,70 +53,26 @@
return len;
}
-
-#define PARSE_BUFF_SIZE 4096
-
-static void *UartThread1(void *p) {
- struct serial_config *cfg = (struct serial_config *) p;
-
- int res = InitSerialPort(MCU_UART, cfg->baud, cfg->data_bit, cfg->verify_bit, cfg->stop_bit, cfg->flow_ctrl);
- DEBUG("Serial %s open %d", cfg->name, res);
- uint8_t RxBuf[PARSE_BUFF_SIZE];
- int RxBufLen = 0;
-
- if (res == 0)
- ParseMcuInit();
-
- while (res == 0) {
- int ul = ReadSerialPort(MCU_UART, (uint8_t *)RxBuf + RxBufLen, sizeof(RxBuf) - RxBufLen);
- RxBufLen += ul;
-
- /*{
- static char buffd[16384];
-
- buffd[0] = 0;
- int i = 0;
- for (i = 0; i < ul; i++) {
- if ((i % 32) == 0) {
- sprintf(buffd + strlen(buffd), "\n");
- }
- sprintf(buffd + strlen(buffd), "%02X ", RxBuf[i]);
- if (strlen(buffd) > 800) {
- DEBUG("%s <- %s...", "UART", buffd);
- buffd[0] = 0;
- }
- }
- if (strlen(buffd) > 0)
- DEBUG("%s <- %s", "UART", buffd);
- }*/
-
- if (RxBufLen > 0) {
-// DEBUG("RECV LEN %d", RxBufLen);
- if (Virtual2IsConnected()) {
-
- } else {
- ParseMcu(RxBuf, RxBufLen);
- }
- RxBufLen = 0;
- }
- }
- if (res == 0) {
- UninitSerialPort(MCU_UART);
- }
- pthread_exit(NULL);
-}
-
-void ParseMcu(const uint8_t *data, int length)
+void ParseUart::ParseMcu(const uint8_t *data, int length)
{
int x = 0;
+ uint32_t now = AppTimer_GetTickCount();
+
+ if (now < sync_time) {
+ sync_time = now;
+ }
+
+ if (now - sync_time >= D_SEC(5)) {
+ parse_status = SYNC_HEAD_ONE;
+ }
+
while (x < length) {
uint8_t c = data[x];
switch (parse_status) {
case SYNC_HEAD_ONE:
if (c == 0x55) {
parse_status = SYNC_HEAD_TWO;
- AppTimer_delete(ParseMcuTimeout);
- AppTimer_add(ParseMcuTimeout, D_SEC(5));
+ sync_time = now;
}
x++;
break;
@@ -209,7 +109,6 @@
if (McuPkt.length >= 1500) {
DEBUG("Pkt Too large!");
parse_status = SYNC_HEAD_ONE;
- AppTimer_delete(ParseMcuTimeout);
}
McuPkt.buffer[0] = HI_UINT16(McuPkt.id);
@@ -241,14 +140,14 @@
uint16_t crc16 = CRCCCITT(McuPkt.buffer, McuPkt.length + 4, 0, 0);
-// DEBUG("mcuif crc16 but 0x%04X exp 0x%04X", McuPkt.crc16, crc16);
+// DEBUG("mcuif 0x%02X: crc16 but 0x%04X exp 0x%04X", McuPkt.id, McuPkt.crc16, crc16);
- if (McuPkt.crc16 == crc16) {
- McuCommandEntry(McuPkt.id, McuPkt.buffer + 4, McuPkt.length);
+ if (McuPkt.crc16 == crc16 && fun != nullptr) {
+ fun(McuPkt.id, McuPkt.buffer + 4, McuPkt.length);
+ //McuCommandEntry(McuPkt.id, McuPkt.buffer + 4, McuPkt.length);
}
parse_status = SYNC_HEAD_ONE;
- AppTimer_delete(ParseMcuTimeout);
x++;
break;
}
@@ -258,8 +157,11 @@
}
}
-void SendMcuCommand(uint16_t id, const uint8_t *data, int length)
+void SendMcuCommand(SerialPort *pClass, pSerialPortClassFun fun, uint16_t id, const uint8_t *data, int length)
{
+ if (pClass == nullptr)
+ return;
+
uint8_t buffer[2048];
int x = 0;
@@ -279,325 +181,34 @@
buffer[x++] = HI_UINT16(crc16);
buffer[x++] = LO_UINT16(crc16);
- WriteMcu(MCU_UART, buffer, x);
-}
-
-void ConfigMCU(bool ayDevice)
-{
- if (ayDevice) {
- McuCommModeSel(0);
-
- // TODO
- static struct serial_config serialConfig;
-
- strcpy(serialConfig.name, "/dev/ttyHSL1");
- serialConfig.baud = 115200;
- serialConfig.data_bit = 8;
- serialConfig.verify_bit = 'N';
- serialConfig.stop_bit = 1;
- serialConfig.flow_ctrl = 0;
-
- pthread_t pid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached
- pthread_create(&pid, &attr, UartThread1, &serialConfig);
- } else {
- McuCommModeSel(1);
- }
+ (pClass->*fun)(buffer, x);
}
void SendRtkToMcu(const uint8_t *data, int length)
{
- SendMcuCommand(ID_CM_RTK_DATA, data, length);
+ //SendMcuCommand(ID_CM_RTK_DATA, data, length);
}
-static void ParseMcuTimeout(union sigval sig) {
- AppTimer_delete(ParseMcuTimeout);
- parse_status = SYNC_HEAD_ONE;
-}
-
-static void sendrtk(union sigval sig) {
+static void sendrtk(apptimer_var_t val) {
uint8_t data[486];
memset(data, 0x86, sizeof(data));
- SendMcuCommand(ID_CM_RTK_DATA, data, sizeof(data));
+ //SendMcuCommand(ID_CM_RTK_DATA, data, sizeof(data));
- SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
+ //SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
- AppTimer_delete(sendrtk);
AppTimer_add(sendrtk, D_SEC(1));
-}
-
-static uint8_t GnssBuf[PARSE_BUFF_SIZE];
-static int GnssBufLen = 0;
-
-static void McuCommandEntry(uint16_t id, const uint8_t *data, int length)
-{
- static int ii = 0;
-
- switch (id) {
- case ID_MC_MCU_BOOT:
- DEBUG("MCU BOOT");
- if (length == 8) {
- PlatformStatusChanged(CAN_UPDATE_EVT, data, length);
- }
-
- break;
- case ID_MC_DFU_RSP:
- DEBUG("ID_MC_DFU_RSP %d len %d", data[0], length);
-
- if (data[0] == 0) {
- // 绗竴鍖呬紶杈撴垚鍔�
- dfuFileBitmap[0] |= 0x01;
- } else if (data[0] == 10) {
- // 鍗囩骇瀹屾垚
- memset(dfuFileBitmap, 0xFF, sizeof(dfuFileBitmap));
- } else if (data[0] == 11) {
- // 鏀惧純浼犺緭
- UploadDfuFileEnd();
- } else if (data[0] == 12) {
- // 鍏ㄩ儴閲嶄紶
- memset(dfuFileBitmap, 0, sizeof(dfuFileBitmap));
- } else if (data[0] == 13) {
- // 閮ㄥ垎閲嶄紶锛屾湁鍚庣画瀛楁
- DEBUG("BITMAP %02X %02X %02X %02X %02X", data[1], data[2], data[3], data[4], data[5]);
-
- int total = dfuFileLength / DFU_FILE_BLOCK_SIZE + ((dfuFileLength % DFU_FILE_BLOCK_SIZE)?1:0);
- int a = 0, b = 0;
- for (int i = 1; i < length; ++i) {
- for (int j = 0; j < 8; ++j) {
- if ((data[i] & BV(j))) b++;
- a++;
- if (a == total) {
- i = length;
- break;
- }
- }
- }
-
- DEBUG("BITMAP total %d succ %d", total, b);
-
- //memset(dfuFileBitmap, 0, sizeof(dfuFileBitmap));
- memcpy(dfuFileBitmap, data + 1, length - 1);
-
- if (total % 8) {
- dfuFileBitmap[total/8] &= ~BV((total%8) - 1);
- } else {
- dfuFileBitmap[(total+7)/8 - 1] &= ~BV(7);
- }
-// dfuFileBitmap[total/8] &= ~BV(total%8);
- }
-
- dfuTryCnt = 0;
- AppTimer_delete(GoNextDfuLater);
- GoNextDfu();
- break;
- case ID_MC_RW_INFO_RSP:
- break;
- case ID_MC_MCU_DFU_RSP:
- break;
- case ID_MC_CAR_INFO2:
- /* DEBUG("ID_MC_CAR_INFO2 %d", length);
-
- {
- static char buffd[16384];
-
- buffd[0] = 0;
- int i = 0;
- for (i = 0; i < length; i++) {
- if ((i % 32) == 0) {
- sprintf(buffd + strlen(buffd), "\n");
- }
- sprintf(buffd + strlen(buffd), "%02X ", data[i]);
- if (strlen(buffd) > 800) {
- DEBUG("%s <- %s...", "杞﹁締淇″彿" , buffd);
- buffd[0] = 0;
- }
- }
- if (strlen(buffd) > 0)
- DEBUG("%s <- %s", "杞﹁締淇″彿" , buffd);
- }*/
-
- if (length > 0) {
- PlatformStatusChanged(CAR_SENSOR_UPDATE_EVT, data, length);
- }
- break;
- case ID_MC_CAR_INFO: {
-// DEBUG("ID_MC_CAR_INFO %d", length);
-
- if (length > 0)
- PlatformStatusChanged(MCU_UPDATE_EVT, data, length);
- break;
- }
- case ID_MC_RTK_DATA:
- DEBUG("ID_MC_RTK_DATA");
- break;
- case ID_MC_RFCARD_RSP:
- DEBUG("ID_MC_RFCARD_RSP");
- AppTimer_delete(ReadCardTimeout);
-
- if (length > 0)
- PlatformStatusChanged(CARD_UPDATE_EVT, data, length);
- break;
- case ID_MC_GNSS_DATA: {
- length = (length > PARSE_BUFF_SIZE - GnssBufLen) ? (PARSE_BUFF_SIZE - GnssBufLen) : length;
-
- memcpy(GnssBuf + GnssBufLen, data, length);
- GnssBufLen += length;
-
- if (GnssBufLen > 0) {
- if (VirtualIsConnected()) { //PC妯℃嫙鐢ㄦ椂
- static bool first = false;
-
- if (!first) {
- first = true;
-
- uint8_t buff[33] = "emulator";
- buff[32] = 1;
- PlatformStatusChanged(RTK_STATUS_EVT, buff, 33);
- }
-
- GnssBufLen = 0;
- } else {
- const uint8_t *ptr = parseGPS(GnssBuf, GnssBuf + GnssBufLen);
- if (ptr != GnssBuf) {
- memcpy(GnssBuf, ptr, GnssBufLen - (ptr - GnssBuf));
- GnssBufLen -= ptr - GnssBuf;
- } else if (GnssBufLen == PARSE_BUFF_SIZE) { //濉弧浜嗭紝涓旀病鏈変竴涓猏r锛岄兘鎶涘純
- DEBUG("Parse GPS error");
- GnssBufLen = 0;
- }
- }
- }
- break;
- }
- default:
- break;
- }
-}
-
-static void SendDfuFile(int fileLen, int sentLen, int blockLen, const uint8_t *data) {
- uint8_t buffer[1024];
- int x = 0;
-
- DEBUG("SendDfuFile fileLen %d sentLen %d blockLen %d", fileLen, sentLen, blockLen);
-
- buffer[x++] = BREAK_UINT32(fileLen, 3);
- buffer[x++] = BREAK_UINT32(fileLen, 2);
- buffer[x++] = BREAK_UINT32(fileLen, 1);
- buffer[x++] = BREAK_UINT32(fileLen, 0);
-
- buffer[x++] = BREAK_UINT32(sentLen, 3);
- buffer[x++] = BREAK_UINT32(sentLen, 2);
- buffer[x++] = BREAK_UINT32(sentLen, 1);
- buffer[x++] = BREAK_UINT32(sentLen, 0);
-
- buffer[x++] = HI_UINT16(blockLen);
- buffer[x++] = LO_UINT16(blockLen);
-
- memcpy(buffer + x, data, blockLen);
- x += blockLen;
-
- SendMcuCommand(ID_CM_DFU_UPLOAD, buffer, x);
-}
-
-static void GoNextDfuLater(union sigval sig) {
- AppTimer_delete(GoNextDfuLater);
-
- GoNextDfu();
-}
-
-static void GoNextDfu(void)
-{
- int dfuFileSent = 0, currDfuBlockLength = 0;
-
- if (dfuFileLength == 0 || dfuFile == NULL)
- return;
-
- int row = 0, col = 0;
-
- dfuFileSent = dfuFileLength;
-
- for (row = 0; row < sizeof(dfuFileBitmap); ++row) {
- for (col = 0; col < 8; ++col) {
- if ((dfuFileBitmap[row] & BV(col)) == 0) {
- DEBUG("ROW = %d COL = %d", row, col);
- dfuFileSent = row * DFU_FILE_BLOCK_SIZE * 8 + col * DFU_FILE_BLOCK_SIZE;
- goto GET_FILE_START;
- }
- }
- }
-
-GET_FILE_START:
- currDfuBlockLength = (dfuFileLength - dfuFileSent > DFU_FILE_BLOCK_SIZE) ? DFU_FILE_BLOCK_SIZE : (dfuFileLength - dfuFileSent);
-
- if (dfuFileSent >= dfuFileLength || currDfuBlockLength == 0) {
- UploadDfuFileEnd();
- return;
- }
-
- SendDfuFile(dfuFileLength, dfuFileSent, currDfuBlockLength, dfuFile + dfuFileSent);
-
- if (dfuFileSent > 0 && dfuFileSent + currDfuBlockLength < dfuFileLength) {
- dfuFileBitmap[row] |= BV(col);
- }
-
- if (dfuFileSent == 0 || dfuFileSent + currDfuBlockLength == dfuFileLength) {
- dfuTryCnt++;
- if (dfuTryCnt > DFU_MAX_TRY) {
- UploadDfuFileEnd();
- return;
- }
- DEBUG("GoNextDfuLater 3 sec...");
- AppTimer_add(GoNextDfuLater, D_SEC(3));
- } else {
- AppTimer_add(GoNextDfuLater, 10);
- }
-}
-
-void UploadDfuFileEnd(void)
-{
- DEBUG("UploadDfuFileEnd");
-
- if (dfuFile != NULL)
- free(dfuFile);
- dfuFileLength = 0;
-
- AppTimer_delete(GoNextDfuLater);
-}
-
-void UploadDfuFile(const uint8_t *file, int length)
-{
- DEBUG("UploadDfuFile %ld", length);
-
- if (length > 0) {
- if (dfuFile != NULL)
- free(dfuFile);
-
- dfuTryCnt = 0;
-
- dfuFile = (uint8_t *) malloc(length);
- dfuFileLength = length;
- memcpy(dfuFile, file, length);
- memset(dfuFileBitmap, 0, sizeof(dfuFileBitmap));
- AppTimer_delete(GoNextDfuLater);
-
- GoNextDfu();
- }
}
static int readCartCnt = 0;
-static void ReadCardTimeout(union sigval sig) {
- AppTimer_delete(ReadCardTimeout);
-
+static void ReadCardTimeout(apptimer_var_t val) {
readCartCnt++;
if (readCartCnt < 2) {
AppTimer_add(ReadCardTimeout, D_SEC(3));
- SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
+ //SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
} else {
uint8_t data[8] = {0};
PlatformStatusChanged(CARD_UPDATE_EVT, data, sizeof(data));
@@ -610,12 +221,5 @@
AppTimer_delete(ReadCardTimeout);
AppTimer_add(ReadCardTimeout, D_SEC(3));
- SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
-}
-
-void ShutdownInd(int timeout)
-{
- uint8_t v = timeout;
-
- SendMcuCommand(ID_CM_SHUTDOWN, &v, 1);
+ //SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
}
--
Gitblit v1.8.0