// // Created by YY on 2020/1/20. // #include #include #include #include "virtual_rtk.h" #include "../jni_log.h" #include "../common/net.h" #include "../native-lib.h" #include "../common/apptimer.h" #include "../defs.h" #include "parse_gps.h" #include "../mcu/mcu_if.h" #define DEBUG(fmt, args...) LOGD(" <%s>: " fmt, __func__, ##args) #define PARSE_BUFF_SIZE 4096 struct vSocket { char domain_name[32]; int port; } VAddr; static CTcpPort *ctp = NULL, *ctp2 = NULL; static bool virtRtkIsValid = false; static int connectCnt = 0; static void TcpEventCallback(int stat, void *p, void *context); static void TcpDataCallback(void *buffer, int length, void *p, void *context); static bool virtRtkIsValid2 = false; static int connectCnt2 = 0; static void TcpEventCallback2(int stat, void *p, void *context); static void TcpDataCallback2(void *buffer, int length, void *p, void *context); static void ConnectLater(union sigval sig); void InitVirtualDevice(const char *domain_name, int port) { DEBUG("InitVirtualDevice %s: %d", domain_name, port); strcpy(VAddr.domain_name, domain_name); VAddr.port = port; if (ctp == NULL) { ctp = new CTcpPort(); ctp->set_event_callback(TcpEventCallback, NULL); ctp->set_data_callback(TcpDataCallback, NULL); ctp->OpenTcpPort(domain_name, port); } if (ctp2 == NULL) { ctp2 = new CTcpPort(); ctp2->set_event_callback(TcpEventCallback2, NULL); ctp2->set_data_callback(TcpDataCallback2, NULL); ctp2->OpenTcpPort(domain_name, port + 1); } } bool VirtualIsConnected(void) { bool temp; do { temp = virtRtkIsValid; } while (temp != virtRtkIsValid); return temp; } bool Virtual2IsConnected(void) { bool temp; do { temp = virtRtkIsValid2; } while (temp != virtRtkIsValid2); return temp; } static void ConnectLater(union sigval sig) { AppTimer_delete(ConnectLater); if (sig.sival_int == 1) { if (ctp != NULL) { ctp->OpenTcpPort(VAddr.domain_name, VAddr.port); } } else { if (ctp2 != NULL) { ctp2->OpenTcpPort(VAddr.domain_name, VAddr.port + 1); } } } static void TcpEventCallback(int stat, void *p, void *context) { CTcpPort *pTcpPort = (CTcpPort *)p; if (stat == 0) { DEBUG("虚拟平台连接成功 %s: %d", pTcpPort->m_sIp.c_str(), pTcpPort->m_nPort); virtRtkIsValid = true; connectCnt = 0; PlayTTS("模拟器连接", NULL); } else { DEBUG("虚拟平台连接失败"); virtRtkIsValid = false; connectCnt++; if (connectCnt < 3) { AppTimer_add(ConnectLater, D_SEC(3), 1); } PlayTTS("模拟器断开", NULL); } } static void TcpDataCallback(void *buffer, int length, void *p, void *context) { static uint8_t RxBuf[PARSE_BUFF_SIZE]; static int RxBufLen = 0; if (length > 0) { memcpy(RxBuf + RxBufLen, buffer, length); RxBufLen += length; const uint8_t *ptr = parseGPS(RxBuf, RxBuf + RxBufLen); if(ptr != RxBuf) { memcpy(RxBuf, ptr, RxBufLen - (ptr - RxBuf)); RxBufLen -= ptr - RxBuf; } else if(RxBufLen == PARSE_BUFF_SIZE) { //填满了,且没有一个\r,都抛弃 DEBUG("Parse GPS error"); RxBufLen = 0; } } } static void TcpEventCallback2(int stat, void *p, void *context) { CTcpPort *pTcpPort = (CTcpPort *)p; if (stat == 0) { DEBUG("灯光虚拟平台连接成功 %s: %d", pTcpPort->m_sIp.c_str(), pTcpPort->m_nPort); virtRtkIsValid2 = true; connectCnt2 = 0; PlayTTS("灯光模拟器连接", NULL); } else { DEBUG("灯光虚拟平台连接失败"); virtRtkIsValid2 = false; connectCnt2++; if (connectCnt2 < 3) { AppTimer_add(ConnectLater, D_SEC(3), 2); } PlayTTS("灯光模拟器断开", NULL); } } static void TcpDataCallback2(void *buffer, int length, void *p, void *context) { static uint8_t RxBuf[PARSE_BUFF_SIZE]; static int RxBufLen = 0; if (length > 0) { memcpy(RxBuf + RxBufLen, buffer, length); RxBufLen += length; if (RxBufLen > 0) { ParseMcu(RxBuf, RxBufLen); RxBufLen = 0; } } } /* static void *VDataListenThread(void *p) { struct vSocket *vs = (struct vSocket *)p; uint8_t RxBuf[PARSE_BUFF_SIZE]; int fds_ret; struct timeval tv; fd_set rdfds; fd_set exfds; int fd = -1; int RxBufLen = 0; connectCnt++; fd = ConnectTCP(vs->domain_name, vs->port); if (fd > 0) { DEBUG("虚拟平台连接成功"); virtRtkIsValid = true; connectCnt = 0; PlayTTS("模拟器连接", NULL); } else { DEBUG("虚拟平台连接失败"); } while (fd > 0) { tv.tv_sec = 5; tv.tv_usec = 0; FD_ZERO(&rdfds); //clean FD_SET(fd, &rdfds); //set fds_ret = select(fd + 1, &rdfds, NULL, NULL, &tv); if (fds_ret < 0) { break; } else if(fds_ret == 0) { //Occur failure(such as line disconnect) } else if(FD_ISSET(fd, &rdfds)) { int lx = ReadTCP(fd, RxBuf + RxBufLen, sizeof(RxBuf) - RxBufLen); if (lx < 0) { break; } else if (lx > 0) { RxBufLen += lx; const uint8_t *ptr = parseGPS(RxBuf, RxBuf + RxBufLen); if(ptr != RxBuf) { memcpy(RxBuf, ptr, RxBufLen - (ptr - RxBuf)); RxBufLen -= ptr - RxBuf; } else if(RxBufLen == PARSE_BUFF_SIZE) { //填满了,且没有一个\r,都抛弃 DEBUG("Parse GPS error"); RxBufLen = 0; } } } } if (fd > 0) { DEBUG("虚拟平台断开"); DisconnectTCP(fd); PlayTTS("模拟器断开", NULL); } virtRtkIsValid = false; if (connectCnt < 5) { AppTimer_add(ConnectLater, D_SEC(3)); } DEBUG("虚拟平台线程退出"); pthread_exit(NULL); } */