// // Created by YY on 2024/2/27. // #include "car_box.h" #include "../jni_log.h" #include "../common/string_util.h" #include "../common/serial_port.h" #include "../rtk_module/parse_gps.h" #include #define DEBUG(fmt, args...) LOGD(" <%s>: " fmt, __func__, ##args) #define PARSE_BUFF_SIZE 4096 static SerialPort *pCls = nullptr; static void UartThread(void *p) { struct serial_config *cfg = (struct serial_config *) p; pCls = new SerialPort(*cfg); int res = pCls->InitSerialPort(); DEBUG("Serial %s open %d", cfg->name, res); uint8_t RxBuf[PARSE_BUFF_SIZE]; int RxBufLen = 0; while (res == 0) { int ul = pCls->ReadSerialPort((uint8_t *)RxBuf + RxBufLen, sizeof(RxBuf) - RxBufLen); if (ul < 0) { continue; } else if (ul == 0) { // usb串口断开 break; } 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) { const uint8_t *ptr = parseGPS(RxBuf, RxBuf + RxBufLen); if (ptr != RxBuf) { memcpy(RxBuf, ptr, RxBufLen - (ptr - RxBuf)); RxBufLen -= ptr - RxBuf; } else if (RxBufLen == sizeof(RxBuf)) { //填满了,且没有一个\r,都抛弃 DEBUG("Parse CarBox error"); RxBufLen = 0; } } } delete pCls; pCls = nullptr; } void InitCarBox(void) { // TODO static struct serial_config serialConfig; strcpy(serialConfig.name, "/dev/ttyHSL0"); serialConfig.baud = 115200; serialConfig.data_bit = 8; serialConfig.verify_bit = 'N'; serialConfig.stop_bit = 1; serialConfig.flow_ctrl = 0; std::thread([&] { while (true) { std::thread t(UartThread, &serialConfig); t.join(); std::this_thread::sleep_for(std::chrono::seconds(3)); } }).detach(); } void SendRtcmToUart(const uint8_t *dat, int length) { if (pCls != nullptr) { pCls->WriteSerialPort(dat, length); } } void handleCarinfo(const struct nmea *s) { // DEBUG("handleCarinfo"); } void handleKsxt(const struct nmea *s) { // DEBUG("handleKsxt"); char buff[256] = {0}; memcpy(buff, s->nmea_value[9].data, s->nmea_value[9].length); DEBUG("定位 %s", buff); }