//
|
// Created by YY on 2020/1/20.
|
//
|
|
#include <cstdlib>
|
#include <cstring>
|
#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("<virtual_device> <%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(apptimer_var_t val);
|
static void ConnectLater2(apptimer_var_t val);
|
|
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(apptimer_var_t val) {
|
if (ctp != NULL) {
|
ctp->OpenTcpPort(VAddr.domain_name, VAddr.port);
|
}
|
}
|
|
static void ConnectLater2(apptimer_var_t val)
|
{
|
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("虚拟平台连接失败");
|
if (virtRtkIsValid) {
|
PlayTTS("模拟器断开", NULL);
|
}
|
virtRtkIsValid = false;
|
connectCnt++;
|
|
if (connectCnt < 3) {
|
AppTimer_add(ConnectLater, D_SEC(3), 1);
|
}
|
}
|
}
|
|
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("灯光虚拟平台连接失败");
|
if (virtRtkIsValid2) {
|
PlayTTS("灯光模拟器断开", NULL);
|
}
|
virtRtkIsValid2 = false;
|
connectCnt2++;
|
|
if (connectCnt2 < 3) {
|
AppTimer_add(ConnectLater2, D_SEC(3), 2);
|
}
|
}
|
}
|
|
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);
|
}
|
*/
|