blob: 9540d87927f7182e3c854ec71f397f89912729dc [file] [log] [blame]
/*=============================================================================
** FileName: lynq_common.cpp
** Desc: lynq common
** Author: Warren
** Version: V1.0
** LastChange: 2021-09-27
** History:
**=============================================================================*/
#include <stdio.h>
#include <string.h>
#include <log/log.h>
#include "lynq_common.h"
#include "lynq_user.h"
#include "common.h"
#include <pthread.h>
#define USB_BUF_SIZE 8192
#include <liblog/lynq_deflog.h>
#include <sys/time.h>
#include "Phone_utils.h"
usb_cmd_t Usb_commands[] = {
#include "lynq_commands.h"
};
usb_at_transfer_t Usb_transfer_commands[] = {
#include "lynq_at_transfer_table.h"
};
#undef LOG_TAG
#define LOG_TAG "LYNQ_COMMON"
extern apn_table_t apn_table[LYNQ_APN_CHANNEL_MAX] = {};
extern int apn_count = 0;
extern char lynq_at[LYNQ_AT_LEN_MAX]= {};
pthread_cond_t lynq_at_cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lynq_at_mutex= PTHREAD_MUTEX_INITIALIZER;
//int lynqSendToRil(int argc,char *argv[],int uToken);
usb_at_transfer_t *lynqFindId(char *cmd)
{
if(cmd==NULL)
{
RLOGD("lynqFindId CMD is NULL!!!");
return ((usb_at_transfer_t*)NULL);
}
for(int i=0;Usb_transfer_commands[i].cmdName;i++)
{
if (strcmp (cmd, Usb_transfer_commands[i].cmdName) == 0)
return (&Usb_transfer_commands[i]);
}
return ((usb_at_transfer_t*)NULL);
}
usb_cmd_t * lynqFindUsbEvent(char *cmd)
{
if(cmd==NULL)
{
RLOGD("lynqFindUsbEvent CMD is NULL!!!");
return ((usb_cmd_t*)NULL);
}
printf("cmd =%s\n",cmd);
for(int i=0;Usb_commands[i].cmdName;i++)
{
if (strcmp (cmd, Usb_commands[i].cmdName) == 0)
return (&Usb_commands[i]);
}
return ((usb_cmd_t *)NULL);
}
int routeCmd(int request)
{
switch (request)
{
case LYNQ_REQUEST_CGMI:
case LYNQ_REQUEST_GMI:
case LYNQ_REQUEST_CGACT:
case LYNQ_REQUEST_CGDCONT:
{
return LYNQ_GOTO_AT;
}
case LYNQ_REQUEST_ATD:
case LYNQ_REQUEST_LAPNACT:
case LYNQ_REQUEST_ELAPNACT:
case LYNQ_REQUEST_SCREEN_STATE:
case LYNQ_REQUEST_SWITCH_SIM:
{
return LYNQ_GOTO_TELE_REQ;
}
case LYNQ_REQUEST_SEND_LOG_DATA:
{
return LYNQ_GOTO_PLAT_REQ;
}
case LYNQ_USER_REQUEST_GNSS:
case LYNQ_USER_REQUEST_OTHRE:
case LYNQ_PLAT_LGMDS:
{
return LYNQ_GOTO_USER_REQ;
}
case LYNQ_REQUEST_RNDIS:
{
return LYNQ_GOTO_RNDIS_REQ;
}
case LYNQ_REQUEST_LINFO:
return LYNQ_GOTO_LINFO_REQ;
case LYNQ_REQUEST_FACTORY:
return LYNQ_GOTO_FACTORY;
default:
return -1;
}
}
int g_number(const char *p){
int cnt = 0;
while(*p != '\0'){
if(*p == ','){
cnt++;
}
*p++;
}
return cnt+4;//for count character string
}
int syncRespToUsb(int error_code)
{
char BUF[32] = {};
int ret = -1;
int len = 0;
if(error_code==0)
{
len = write(ttyGS3_fd,"OK\n",3);
}
else
{
sprintf(BUF,"+CME ERROR: %d\n\0",error_code);
len = write(ttyGS3_fd,BUF,strlen(BUF));
}
if(len < 0)
{
perror("lynq resp write:");
return -1;
}
return 0;
}
int lynqSetArgv(char **argv, char** Point,const char* value)
{
*argv=*Point;
sprintf(*argv, "%s", value);
(*Point) += (strlen(value)+1);
}
//argv[2]:0 send,1 list,2 get
int lynqParseUsbCommand(const char* cmd,char *argv[],char test[],char* parser_buf,int maxArgc)
{
char *token;
char *str = test;
char *string;
char *parameter;
char* Point=parser_buf;
int cnt = g_number(cmd);
memcpy(test, cmd, strlen(cmd));
test[strlen(cmd)] = '\0';
argv[1] = (char *)cmd;
if(strstr(cmd,"=?"))
{
token = strtok(str, "=?");
//argv[0] = token;
argv[0] = strstr(token, "+")+1;
lynqSetArgv(&(argv[2]),&Point,"1");
while (token != NULL)
{
string = token;
token = strtok(NULL, "=?");
}
parameter = strtok(string, ",");
int i = 3;
while (parameter != NULL)
{
argv[i++] = parameter;
parameter = strtok(NULL, ",");
}
}
else if(strstr(cmd,"="))
{
lynqSetArgv(&(argv[2]),&Point,"0");
token = strtok(str, "=");
//argv[0] = token;
argv[0] = strstr(token, "+")+1;
while (token != NULL)
{
string = token;
token = strtok(NULL, "=");
}
parameter = strtok(string, ",");
int i = 3;
while (parameter != NULL)
{
argv[i++] = parameter;
parameter = strtok(NULL, ",");
}
}
else if(strstr(cmd,"?"))
{
lynqSetArgv(&(argv[2]),&Point,"2");
token = strtok(str, "?");
//argv[0] = token;
argv[0] = strstr(token, "+")+1;
while (token != NULL)
{
string = token;
token = strtok(NULL, "?");
}
parameter = strtok(string, ",");
int i = 3;
while (parameter != NULL)
{
argv[i++] = parameter;
parameter = strtok(NULL, ",");
}
}
else
{
lynqSetArgv(&(argv[2]),&Point,"0");
if(strstr(cmd,"+"))
{
argv[0] = test+3;
return 3;
}
else
{
RLOGD("sp test 01");
if(!strcmp(cmd, "ATA")){
lynqSetArgv(&(argv[0]),&Point,"ATA");
return 3;
}
if(!strcmp(cmd, "AT")){
lynqSetArgv(&(argv[0]),&Point,"AT");
return 3;
}
/*UNKNOW*/
else if(!strncmp(cmd, "ATD", 3)){
lynqSetArgv(&(argv[0]),&Point,"ATD");
argv[3] = test+3;
return 4;
}
else if(!strncmp(cmd, "ATE", 3)){
lynqSetArgv(&(argv[0]),&Point,"ATE");
argv[3] = test+3;
return 4;
}
else if(!strcmp(cmd, "ATH")){
lynqSetArgv(&(argv[0]),&Point,"ATH");
return 3;
}
else if(!strncmp(cmd, "ATI", 3)){
lynqSetArgv(&(argv[0]),&Point,"ATI");
argv[3] = test+3;
return 4;
}
else if(!strncmp(cmd, "ATL", 3)){
lynqSetArgv(&(argv[0]),&Point,"ATL");
argv[3] = test+3;
return 4;
}
else if(!strncmp(cmd, "ATO", 3)){
lynqSetArgv(&(argv[0]),&Point,"ATO");
argv[3] = test+3;
return 3;
}
/*ATP*/
/*
*/
else if(!strncmp(cmd, "ATQ", 3)){
lynqSetArgv(&(argv[0]),&Point,"ATQ");
argv[3] = test+3;
return 4;
}
else if(!strncmp(cmd, "ATSO", 4)){
lynqSetArgv(&(argv[0]),&Point,"ATSO");
argv[3] = test+4;
return 4;
}
else if(!strncmp(cmd, "ATS3", 4)){
lynqSetArgv(&(argv[0]),&Point,"ATS3");
argv[3] = test+4;
return 4;
}
else if(!strncmp(cmd, "ATS4", 4)){
lynqSetArgv(&(argv[0]),&Point,"ATS4");
argv[3] = test+4;
return 4;
}
else if(!strncmp(cmd, "ATS5", 4)){
lynqSetArgv(&(argv[0]),&Point,"ATS5");
argv[3] = test+4;
return 4;
}
/*ATS6*/
/*
*/
else if(!strncmp(cmd, "ATS7", 4)){
lynqSetArgv(&(argv[0]),&Point,"ATS7");
argv[3] = test+4;
return 4;
}
else if(!strncmp(cmd, "ATS8", 4)){
lynqSetArgv(&(argv[0]),&Point,"ATS8");
argv[3] = test+4;
return 4;
}
else if(!strncmp(cmd, "ATS10", 5)){
lynqSetArgv(&(argv[0]),&Point,"ATS10");
argv[3] = test+5;
return 4;
}
/*ATT*/
/*
*/
else if(!strncmp(cmd, "ATV", 3)){
lynqSetArgv(&(argv[0]),&Point,"ATV");
argv[3] = test+3;
return 4;
}
/*ATX*/
/*
*/
else if(!strncmp(cmd, "ATZ", 3)){
lynqSetArgv(&(argv[0]),&Point,"ATZ");
argv[3] = test+3;
return 4;
}
else if(!strncmp(cmd, "AT&F", 4)){
lynqSetArgv(&(argv[0]),&Point,"AT&F");
argv[3] = test+4;
return 4;
}
else
{
RLOGD("can't find this command");
return -1;
}
}
}
//char *testtest = strstr(argv[0], "+")+1;
//printf("testtest:%s\n", testtest);
//argv[0] = testtest;
//printf("%d\n", __FUNCTION__);
if(cnt > maxArgc)
return -1;
return cnt;
}
int CGMI(int argc,char*argv[],char *rilReq, int uToken)
{
return 0;
}
int dialACall(int argc,char*argv[],char *rilReq, int uToken)
{
if(argc < 4)
{
RLOGD("parameter error!!!");
return 1;
}
char *new_argv[3] = {};
new_argv[0] = (char *)rilReq;
new_argv[1] = argv[3];
new_argv[2] = "0";
android::lynqSendToRil(3,new_argv,uToken);
return 0;
}
int checkDataRegistration(int uToken)
{
/*chech radio status*/
int ret = -1;
char *argv_temp[3]={};
argv_temp[0] = "RIL_REQUEST_DATA_REGISTRATION_STATE";
android::lynqSendToRil(1,argv_temp,uToken);
ret = lynqATWaitWithTime(10);
printf("ret=%d\n,current_data_reg=%d\n",ret,current_data_reg);
/*
if(ret == ETIMEDOUT)
{
int n = write(ttyGS3_fd,"+CME:ERROR 8004\n",strlen("+CME:ERROR 8004\n"));
if(n<0)
{
perror("lynq resp write:");
}
return -1;
}
*/
if(current_data_reg!=0)
{
int n = write(ttyGS3_fd,"+CME ERROR: 1\n",strlen("+CME ERROR: 1\n"));
if(n<0)
{
perror("lynq resp write:");
}
return -1;
}
return 0;
}
int setupData(int argc,char*argv[],char *rilReq, int uToken)
{
int status = 0;
int ret = -1;
if(argc < 4)
{
RLOGD("parameter error!!!");
return -1;
}
bzero(lynq_at,LYNQ_AT_LEN_MAX);
sprintf(lynq_at,"LAPNACT");
status = atoi(argv[3]);
char *new_argv[3] = {};
if(status==1)
{
ret = checkDataRegistration(uToken);
if(ret != 0)
{
RLOGD("[setupData] radio is not available!!!");
return -1;
}
new_argv[0] = (char *)rilReq;
android::lynqSendToRil(1,new_argv,uToken);
syncRespToUsb(0);
}
else if(status == 0)
{
new_argv[0] = "RIL_REQUEST_DEACTIVATE_DATA_CALL";
android::lynqSendToRil(1,new_argv,uToken);
}
return 0;
}
int setupData_e(int argc,char*argv[],char *rilReq, int uToken)
{
int status = 0;
int ret = -1;
if(argc < 5)
{
RLOGD("parameter error!!!");
return 1;
}
bzero(lynq_at,LYNQ_AT_LEN_MAX);
sprintf(lynq_at,"ELAPNACT");
char *new_argv[10] = {};
status = atoi(argv[3]);
if(status == 1 )
{
ret = checkDataRegistration(uToken);
if(ret != 0)
{
RLOGD("[setupData] radio is not available!!!");
return -1;
}
new_argv[0] = (char *)rilReq;
new_argv[1] = argv[4];//apn
new_argv[2] = argv[5];//apntype
new_argv[3] = argv[6];//user
new_argv[4] = argv[7];//password
new_argv[5] = argv[8];//authType
new_argv[6] = argv[9];//normalprotocol
new_argv[7] = argv[10];//roamingprotocol
//memcpy(apn_table[apn_count].apn,argv[4],strlen(argv[4]));
//apn_count++;
android::lynqSendToRil(8,new_argv,uToken);
syncRespToUsb(0);
}
else if(status == 0)
{
new_argv[0] = "RIL_REQUEST_DEACTIVATE_DATA_CALL";
new_argv[1] = argv[4];//apntype
android::lynqSendToRil(2,new_argv,uToken);
}
return 0;
}
int switchSim(int argc,char*argv[],char *rilReq, int uToken)
{
int slot = 0;
int ret = -1;
char *new_argv[10] = {};
if(argc < 4)
{
RLOGD("parameter error!!!");
return 1;
}
slot = atoi(argv[3]);
new_argv[0] = (char *)rilReq;
new_argv[1] = argv[3];
android::lynqSendToRil(2,new_argv,uToken);
return 0;
}
int lynq_screen(int argc,char*argv[],char *rilReq, int uToken){
system("echo 11 | emdlogger_ctrl");
sleep(5);
system("mdlogctl stop");
system("echo mem > /sys/power/autosleep");
system("echo 0 > /dev/wmtWifi");
system("echo 7 9 0 > /proc/driver/wmt_dbg");
char *new_argv[10] = {};
if(argc < 4)
{
RLOGD("parameter error!!!");
return 1;
}
new_argv[0] = (char *)rilReq;
new_argv[1] = argv[3];
android::lynqSendToRil(2,new_argv,uToken);
sleep(1);
system("disown -a");
return 0;
}
void* getMDstate(int argc,char*argv[],int uToken)
{
FILE *FP;
char BUFFER[64]={};
char BUF[32] = {};
int ret = -1;
int len = 0;
FP = popen("cat /sys/kernel/ccci/boot","r");
fgets(BUFFER,sizeof(BUFFER),FP);
printf("buffer %s",BUFFER);
modemStatus = atoi(&BUFFER[4]);
sprintf(BUF,"+LGMDS:%d\n\0",modemStatus);
len = write(ttyGS3_fd,BUF,strlen(BUF));
if(len < 0)
{
perror("lynq resp write:");
return 0;
}
syncRespToUsb(0);
return 0;
}
int lynqATWaitWithTime(int time)
{
int ret = 0;
struct timespec start_tm;
//struct timespec end_tm;
//int timeout_ms = 2500;
clock_gettime(CLOCK_MONOTONIC, &start_tm);
//struct timeval now;
struct timespec outTime;
//gettimeofday(&now, NULL);//now.tv_sec(s),now.tv_usec(Micro s)
outTime.tv_sec = start_tm.tv_sec + time;
pthread_mutex_lock(&lynq_at_mutex);
//ret = pthread_cond_timedwait(&lynq_at_cond,&lynq_at_mutex,&outTime);
pthread_cond_wait(&lynq_at_cond,&lynq_at_mutex);
pthread_mutex_unlock(&lynq_at_mutex);
return ret;
}
void lynqAtRespWatingEvent()
{
pthread_mutex_lock(&lynq_at_mutex);
pthread_cond_signal(&lynq_at_cond);
pthread_mutex_unlock(&lynq_at_mutex);
return;
}
void lynqInfo(char*argv[])
{
int type = atoi(argv[2]);
if(type==2){
lynq_output_LINFO_all();
syncRespToUsb(0);
}
else if(type==0){
int status = atoi(argv[3]);
if(status==1 || status==0){
lynq_output_LINFO_enable=status;
lynq_output_info("+LINFO: Report switch when key information changed is set: %d\n",lynq_output_LINFO_enable);
syncRespToUsb(0);
}
else {
lynq_output_info("parameter error\n");
syncRespToUsb(100);
}
}
else if(type==1){
lynq_output_info("+LINFO: (0-1)\n");
syncRespToUsb(0);
}
else {
lynq_output_info("parameter error\n");
syncRespToUsb(100);
}
}