WLG/wifi_5g/dial.cpp
2024-10-23 09:22:06 +08:00

249 lines
8.3 KiB
C++

#include "dial.h"
#include <stdio.h>
// #include <fcntl.h>
// #include <unistd.h>
// #include <termios.h>
// #include <sys/types.h>
// #include <sys/stat.h>
#include <string>
#include "common/common_func.hpp"
Dial::Dial() {
m_fd = 0;
m_curState = CPIN;
m_dial = 0;
m_APN = 0;
}
Dial::~Dial() {}
int Dial::openPort(const char *pPort) {
m_fd = config_uart(pPort, 115200);
print_info("m_fd = %d\n", m_fd);
return m_fd;
}
int Dial::parseData(Event event, const char *pData) {
print_info("m_curState = %d,event = %d\n", m_curState, event);
std::string signal;
std::string ret;
std::string str;
int pos = 0;
switch (event) {
case Event_CPIN:
if (!strncmp(pData, "READY", 5)) {
m_curState = QCFGNET;
} else if (!strncmp(pData, "NOT READY", 9)) {
m_curState = CPIN;
GlobalConfig::NetStatus = "\"LIMSRV\"";
}
break;
case Event_QCFGNET:
case Event_QCFGSMS: break;
case Event_QICSGPAPN: {
m_curState = QNETDEVCTL;
} break;
case Event_QENG:
GlobalConfig::NetStatus = GetOneContent(pData, 1, ",");
GlobalConfig::NetType = GetOneContent(pData, 2, ",");
signal = GetOneContent(pData, 12, ",");
GlobalConfig::NetSignal = atoi(signal.c_str());
print_info("NetStatus = %s,NetSignal = %d\n", GlobalConfig::NetStatus.c_str(), GlobalConfig::NetSignal);
break;
case Event_QNETDEVCTL:
print_info("m_curState Event_QNETDEVCTL = %d\n", m_curState);
if (m_dial == 1) {
m_curState = QNETDEVSTATUS;
}
break;
case Event_QNETDEVSTATUS:
ret = GetOneContent(pData, 3, ",");
if (ret == "0" || ret == "")
m_curState = QDCHPC;
else
m_curState = QNETDEVSTATUS;
break;
case Event_OK:
if (m_curState == QNETDEVCTL && m_dial == 1) {
m_dial = 0;
m_curState = QNETDEVSTATUS;
}
if (m_curState == Event_QCFGNET) {
m_curState = QNETDEVCTL;
}
if (m_curState == QICSGPAPN && m_APN == 1) {
m_APN = 0;
m_curState = QNETDEVCTL;
}
break;
case Event_ERROR:
if (m_curState == CPIN && !strcmp(pData, "3")) {
m_curState = CPIN;
GlobalConfig::NetStatus = "\"LIMSRV\"";
}
if (m_curState == QNETDEVCTL) {
m_curState = QNETDEVSTATUS;
}
break;
case Event_TEMP:
str = std::string(pData);
pos = str.find("soc-thermal");
if (pos > 0) {
std::string socTmp = str.substr(pos + 14, 2);
GlobalConfig::NR5GTemp = socTmp;
print_info("NR5GTemp = %s\n", GlobalConfig::NR5GTemp.c_str());
}
break;
default: break;
}
}
int Dial::recvData() {
char szbuffer[200] = {0x00};
int offSize = 0;
int timeoutflag = 0;
while (1) {
char buff[1024] = {0x00};
int ret = read_data(m_fd, buff, 1024, 10);
if (ret <= 0) {
timeoutflag++;
if (timeoutflag > 5) {
timeoutflag = 0;
const char *strQENG = "+QENG: ";
const char *strQNETDEVCTL = "+QNETDEVCTL: ";
const char *strQICSGP = "+QICSGP: ";
const char *strQNETDEVSTATUS = "+QNETDEVSTATUS: ";
const char *strQCFG = "+QCFG: ";
const char *strCPIN = "+CPIN: ";
const char *strERROR = "+CME ERROR: ";
const char *strQTEMP = "+QTEMP: ";
const char *strOK = "OK";
char data[128] = {0};
char *pdata = strstr((char *)szbuffer, strQENG);
if (pdata) {
strncpy(data, pdata + 7, sizeof(data));
print_purple("strQENG = %s\n", data);
parseData(Event_QENG, data);
}
pdata = strstr((char *)szbuffer, strQNETDEVCTL);
if (pdata) {
strncpy(data, pdata + 13, sizeof(data));
print_purple("strQNETDEVCTL = %s\n", data);
parseData(Event_QNETDEVCTL, data);
}
pdata = strstr((char *)szbuffer, strQICSGP);
if (pdata) {
strncpy(data, pdata + 9, sizeof(data));
print_purple("strQICSGP = %s\n", data);
parseData(Event_QICSGPAPN, data);
}
pdata = strstr((char *)szbuffer, strQNETDEVSTATUS);
if (pdata) {
strncpy(data, pdata + 16, sizeof(data));
print_purple("strQNETDEVSTATUS = %s\n", data);
parseData(Event_QNETDEVSTATUS, data);
}
pdata = strstr((char *)szbuffer, strQCFG);
if (pdata) {
strncpy(data, pdata + 7, sizeof(data));
print_purple("strQCFG = %s\n", data);
parseData(Event_QCFGNET, data);
}
pdata = strstr((char *)szbuffer, strCPIN);
if (pdata) {
strncpy(data, pdata + 7, sizeof(data));
print_purple("strCPIN = %s\n", data);
parseData(Event_CPIN, data);
}
pdata = strstr((char *)szbuffer, strQTEMP);
if (pdata) {
strncpy(data, pdata + 8, sizeof(data));
print_purple("strQTEMP = %s\n", data);
parseData(Event_TEMP, data);
}
pdata = strstr((char *)szbuffer, strERROR);
if (pdata) {
strncpy(data, pdata + 12, sizeof(data));
print_purple("strERROR = %s\n", data);
parseData(Event_ERROR, data);
}
pdata = strstr((char *)szbuffer, strOK);
if (pdata) {
parseData(Event_OK, data);
}
memset(szbuffer, 0x00, sizeof(szbuffer));
offSize = 0;
}
mssleep(100);
} else if (ret > 0) {
print_info("ret = %d,buff = %s\n", ret, buff);
memcpy(szbuffer + offSize, buff, ret);
offSize = offSize + ret;
print_info("szbuffer = %s\n", szbuffer);
continue;
}
mssleep(500000);
}
}
int Dial::queryPin() { int iRet = write_data(m_fd, "AT+CPIN?\r\n", 12); }
int Dial::configNet() { write_data(m_fd, "AT+QCFG=\"NAT\"\r\n", 19); }
int Dial::configApn() {
m_APN = 1;
std::string strAPN = ReadStrByOpt(SERVERCONFIG, "Server", "APN");
char szCmd[100] = {0x00};
sprintf(szCmd, "AT+QICSGP=1,1,\"%s\",\"\",\"\",1\r\n", strAPN.c_str());
int iRet = write_data(m_fd, szCmd, strlen(strAPN.c_str()) + 34);
print_info("configApn = %d,data = %s\n", iRet, szCmd);
}
int Dial::getCsq() { write_data(m_fd, "AT+QENG=\"servingcell\"\r\n", 27); }
int Dial::getTemp() { write_data(m_fd, "AT+QTEMP\r\n", 12); }
int Dial::conncectUSB() {
int iRet = write_data(m_fd, "AT+QNETDEVCTL=1,1,1\r\n", 23);
print_info("conncectUSB = %d\n", iRet);
}
int Dial::dial5G() {
while (1) {
if (m_curState == CPIN) {
queryPin();
} else if (m_curState == QCFGNET) {
configNet();
} else if (m_curState == QICSGPAPN) {
configApn();
} else if (m_curState == QENG) {
getCsq();
} else if (m_curState == QNETDEVCTL) {
conncectUSB();
m_dial = 1;
} else if (m_curState == QNETDEVSTATUS) {
write_data(m_fd, "AT+QNETDEVSTATUS=1\r\n", 22);
} else if (m_curState == QDCHPC) {
configdhcp();
m_curState = QENG;
} else {
// TODO: show valid log info
}
sleep(5);
getTemp();
sleep(15);
}
}
int Dial::configims() { write_data(m_fd, "AT+QCFG=\"ims\",0\r\n", 21); }
int Dial::configdhcp() { system("busybox udhcpc -f -n -q -t 5 -i usb0"); }
int Dial::setState() { m_curState = CPIN; }
int Dial::closePort() { close(m_fd); }