| | |
| | | #include "../common/apptimer.h" |
| | | #include "../defs.h" |
| | | #include "parse_gps.h" |
| | | #include "../mcu/mcu_if.h" |
| | | |
| | | #define DEBUG(fmt, args...) LOGD("<virtual_device> <%s>: " fmt, __func__, ##args) |
| | | |
| | |
| | | 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); |
| | | static void ConnectV(void); |
| | | static void *VDataListenThread(void *p); |
| | | |
| | | void InitVirtualDevice(const char *domain_name, int port) |
| | | { |
| | |
| | | strcpy(VAddr.domain_name, domain_name); |
| | | VAddr.port = port; |
| | | |
| | | ConnectV(); |
| | | 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) |
| | |
| | | return temp; |
| | | } |
| | | |
| | | bool Virtual2IsConnected(void) |
| | | { |
| | | bool temp; |
| | | |
| | | do { |
| | | temp = virtRtkIsValid2; |
| | | } while (temp != virtRtkIsValid2); |
| | | |
| | | return temp; |
| | | } |
| | | |
| | | static void ConnectLater(union sigval sig) { |
| | | AppTimer_delete(ConnectLater); |
| | | |
| | | ConnectV(); |
| | | 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 ConnectV(void) |
| | | static void TcpEventCallback(int stat, void *p, void *context) |
| | | { |
| | | 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); |
| | | 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; |
| | | |
| | |
| | | |
| | | pthread_exit(NULL); |
| | | } |
| | | */ |