| #include <string.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <log/log.h> | |
| #include "include/libat_common/lynq_at_common.h" | |
| #include "atci_at_util.h" | |
| #undef LOG_TAG | |
| #define LOG_TAG "AT_COMMON" | |
| int g_mnetcall_mode = 0; | |
| int g_gtarndis_mode = 0; | |
| int g_version_mode = 0; | |
| lynq_atsvc_outcb handle_output; | |
| typedef struct | |
| { | |
| char *cmd; | |
| void (*func)(char *input,int mode); | |
| }Command; | |
| enum | |
| { | |
| Response = 0, | |
| Urc | |
| }; | |
| void lynq_response_ok() | |
| { | |
| char *str = "\r\nOK\r\n"; | |
| handle_output(str, strlen(str), Response); | |
| } | |
| void lynq_response_error() | |
| { | |
| char *str = "\r\n+CME ERROR:100\r\n"; | |
| handle_output(str, strlen(str), Response); | |
| } | |
| static int lynq_catrndis_mode(void) | |
| { | |
| FILE *fp; | |
| char buf[2]; | |
| fp = popen("cat /data/rndis.conf","r"); | |
| fgets(buf,sizeof(buf),fp); | |
| if(buf != NULL) | |
| { | |
| if(buf[0] == '0') | |
| { | |
| return 0; | |
| } | |
| if(buf[0] == '1') | |
| { | |
| return 1; | |
| } | |
| else | |
| { | |
| return 2;//not config | |
| } | |
| } | |
| pclose(fp); | |
| return; | |
| } | |
| static void lynq_get_poepn_buf(char *cmd) | |
| { | |
| FILE *fp; | |
| char buf[128] = {0}; | |
| fp = popen(cmd,"r"); | |
| while(fgets(buf, sizeof(buf), fp) != NULL){} | |
| pclose(fp); | |
| RLOGD("buf is %s size %d\n", buf, sizeof(buf)); | |
| handle_output(buf, strlen(buf), Response); | |
| return; | |
| } | |
| void lynq_handle_rndis(char *input,int type) | |
| { | |
| RLOGD("lynq_handle_rndis type %d\n", type); | |
| char buf[128] = {0}; | |
| if(type == AT_SET_MODE)//set | |
| { | |
| int mode; | |
| if (SYS_FAIL == atci_at_to_equal(&input)) | |
| { | |
| lynq_response_error(); | |
| return SYS_FAIL; | |
| } | |
| if (SYS_FAIL == atci_at_get_nexthexint(&input, &mode)) | |
| { | |
| lynq_response_error(); | |
| return SYS_FAIL; | |
| } | |
| if(mode == 1) | |
| { | |
| g_mnetcall_mode = mode; | |
| system("connmanctl enable gadget"); | |
| system("connmanctl tether gadget on"); | |
| lynq_response_ok(); | |
| } | |
| else if (mode == 0) | |
| { | |
| g_mnetcall_mode = mode; | |
| system("connmanctl disable gadget"); | |
| lynq_response_ok(); | |
| } | |
| else | |
| { | |
| lynq_response_error(); | |
| } | |
| } | |
| else if(type == AT_TEST_MODE)//list | |
| { | |
| sprintf(buf,"+MNETCALL:(0-1)"); | |
| handle_output(buf, strlen(buf), Response); | |
| lynq_response_ok(); | |
| } | |
| else if(type == AT_READ_MODE)//get | |
| { | |
| sprintf(buf,"+MNETCALL:%d", g_mnetcall_mode); | |
| handle_output(buf, strlen(buf), Response); | |
| lynq_response_ok(); | |
| } | |
| else | |
| { | |
| lynq_response_error(); | |
| } | |
| return; | |
| } | |
| void lynq_handle_rndis_configure(char *input,int type) | |
| { | |
| RLOGD("lynq_handle_rndis_configure type %d\n", type); | |
| char buf[128] = {0}; | |
| if(type == AT_SET_MODE)//set | |
| { | |
| int mode; | |
| if (SYS_FAIL == atci_at_to_equal(&input)) | |
| { | |
| lynq_response_error(); | |
| return SYS_FAIL; | |
| } | |
| if (SYS_FAIL == atci_at_get_nexthexint(&input, &mode)) | |
| { | |
| lynq_response_error(); | |
| return SYS_FAIL; | |
| } | |
| if(mode == 1) | |
| { | |
| g_gtarndis_mode = mode; | |
| system("uci set lynq_uci.rndis.status='1'"); | |
| usleep(10*1000); | |
| system("uci commit"); | |
| lynq_response_ok(); | |
| } | |
| else if (mode == 0) | |
| { | |
| g_gtarndis_mode = mode; | |
| system("uci set lynq_uci.rndis.status='0'"); | |
| usleep(10*1000); | |
| system("uci commit"); | |
| lynq_response_ok(); | |
| } | |
| else | |
| { | |
| lynq_response_error(); | |
| } | |
| } | |
| else if(type == AT_TEST_MODE)//list | |
| { | |
| sprintf(buf,"+GTARNDIS:(0-1)"); | |
| handle_output(buf, strlen(buf), Response); | |
| lynq_response_ok(); | |
| } | |
| else if(type == AT_READ_MODE)//get | |
| { | |
| sprintf(buf,"+GTARNDIS:%d", g_gtarndis_mode); | |
| handle_output(buf, strlen(buf), Response); | |
| lynq_response_ok(); | |
| } | |
| else | |
| { | |
| lynq_response_error(); | |
| } | |
| return; | |
| } | |
| void lynq_handle_version(char *input,int type) | |
| { | |
| RLOGD("lynq_handle_version type %d\n", type); | |
| char buf[128] = {0}; | |
| if(type == AT_SET_MODE)//set | |
| { | |
| int mode; | |
| if (SYS_FAIL == atci_at_to_equal(&input)) | |
| { | |
| lynq_response_error(); | |
| return SYS_FAIL; | |
| } | |
| if (SYS_FAIL == atci_at_get_nexthexint(&input, &mode)) | |
| { | |
| lynq_response_error(); | |
| return SYS_FAIL; | |
| } | |
| if(mode == 1) | |
| { | |
| g_version_mode = mode; | |
| lynq_get_poepn_buf("uci get lynq_uci_ro.lynq_version.LYNQ_SW_INSIDE_VERSION"); | |
| //handle_output(buf, strlen(buf), Response); | |
| lynq_response_ok(); | |
| } | |
| else if (mode == 0) | |
| { | |
| g_version_mode = mode; | |
| lynq_get_poepn_buf("uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION"); | |
| //handle_output(buf, strlen(buf), Response); | |
| lynq_response_ok(); | |
| } | |
| else | |
| { | |
| lynq_response_error(); | |
| } | |
| } | |
| else if(type == AT_TEST_MODE)//list | |
| { | |
| sprintf(buf,"+CGIR:(0-1)"); | |
| handle_output(buf, strlen(buf), Response); | |
| lynq_response_ok(); | |
| } | |
| else if(type == AT_READ_MODE)//get | |
| { | |
| sprintf(buf,"+CGIR:%d", g_version_mode); | |
| handle_output(buf, strlen(buf), Response); | |
| lynq_response_ok(); | |
| } | |
| else if(type == AT_ACTIVE_MODE)//active | |
| { | |
| if(g_version_mode == 0) | |
| { | |
| lynq_get_poepn_buf("uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION"); | |
| //handle_output(buf, strlen(buf), Response); | |
| lynq_response_ok(); | |
| } | |
| else if(g_version_mode == 1) | |
| { | |
| lynq_get_poepn_buf("uci get lynq_uci_ro.lynq_version.LYNQ_SW_INSIDE_VERSION"); | |
| //handle_output(buf, strlen(buf), Response); | |
| lynq_response_ok(); | |
| } | |
| } | |
| return; | |
| } | |
| static Command commands[] = | |
| { | |
| {"at+mnetcall",lynq_handle_rndis}, | |
| {"at+gtarndis",lynq_handle_rndis_configure}, | |
| {"at+cgir",lynq_handle_version}, | |
| {NULL, NULL} | |
| }; | |
| Command* find_command (char *input) | |
| { | |
| RLOGD("function %s line %d input %s\n", __FUNCTION__, __LINE__, input); | |
| int i; | |
| int ret = -1; | |
| for (i = 0; commands[i].cmd; i++) | |
| { | |
| ret = strcmp(input, commands[i].cmd); | |
| if(ret == 0) | |
| { | |
| RLOGD("function %s line %d find input %s commands[i].cmd %s strlen %d ret %d\n", __FUNCTION__, __LINE__, input, commands[i].cmd, strlen(commands[i].cmd), ret); | |
| return (&commands[i]); | |
| } | |
| } | |
| RLOGD("function %s line %d not find ret %d \n", __FUNCTION__, __LINE__, ret); | |
| return ((Command *)NULL); | |
| } | |
| void lynq_at_common_cb(char *input, int input_max_size) | |
| { | |
| if(handle_output != NULL) | |
| { | |
| RLOGD("function %s line %d input %s\n", __FUNCTION__, __LINE__, input); | |
| if(input != NULL) | |
| { | |
| char *prefix = NULL; | |
| prefix = atci_get_cmd_prefix(input); | |
| if (NULL == prefix) { | |
| RLOGD("atci_cut_cmd_prefix error"); | |
| return SYS_FAIL; | |
| } | |
| RLOGD("find prefix [%s]", prefix); | |
| Command *cmd = find_command(prefix); | |
| if(cmd != NULL) | |
| { | |
| int cmd_mode = atci_get_cmd_mode(input); | |
| RLOGD("function %s line %d\n", __FUNCTION__, __LINE__); | |
| (*(cmd->func))(input,cmd_mode); | |
| free(prefix); | |
| return; | |
| } | |
| else | |
| { | |
| RLOGD("not find prefix in list"); | |
| } | |
| free(prefix); | |
| } | |
| } | |
| } | |
| lynq_atsvc_incb lynq_register_at_common(lynq_atsvc_outcb out_cb) | |
| { | |
| if(out_cb != NULL) | |
| { | |
| handle_output = out_cb; | |
| RLOGD("function %s line %d\n", __FUNCTION__, __LINE__); | |
| return lynq_at_common_cb; | |
| } | |
| } |