| /*============================================================================= |
| ** 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); |
| } |
| } |