blob: e73121d9e5b40bcd47bae6880bce736fa52283e9 [file] [log] [blame]
#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;
}
}