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