// // 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" #define DEBUG(fmt, args...) LOGD(" <%s>: " fmt, __func__, ##args) #define PARSE_BUFF_SIZE 4096 struct vSocket { char domain_name[32]; int port; } VAddr; static bool virtRtkIsValid = false; static int connectCnt = 0; static void ConnectLater(union sigval sig); static void ConnectV(void); static void *VDataListenThread(void *p); void InitVirtualDevice(const char *domain_name, int port) { DEBUG("InitVirtualDevice %s: %d", domain_name, port); strcpy(VAddr.domain_name, domain_name); VAddr.port = port; ConnectV(); } bool VirtualIsConnected(void) { bool temp; do { temp = virtRtkIsValid; } while (temp != virtRtkIsValid); return temp; } static void ConnectLater(union sigval sig) { AppTimer_delete(ConnectLater); ConnectV(); } static void ConnectV(void) { pthread_t pid; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached pthread_create(&pid, &attr, VDataListenThread, &VAddr); } 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); }