yy1717
2021-01-19 87156fa3adfa2e3232a6f6e612584aa8a4ebaea1
lib/src/main/cpp/rtk_module/virtual_rtk.cpp
@@ -12,6 +12,7 @@
#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)
@@ -22,12 +23,18 @@
    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)
{
@@ -36,7 +43,23 @@
    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)
@@ -50,21 +73,111 @@
    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;
@@ -139,3 +252,4 @@
    pthread_exit(NULL);
}
*/