1 /*
2  * Copyright (C) 2019-2020 Alibaba Group Holding Limited
3  */
4 
5 #include <aos/aos.h>
6 #include <uservice/uservice.h>
7 #include <uservice/eventid.h>
8 #include <devices/netdrv.h>
9 
10 #include <netmgr.h>
11 #include <netmgr_service.h>
12 #include <devices/hal/gprs_impl.h>
13 
14 
15 
16 typedef struct {
17     netmgr_hdl_t hdl;
18     gprs_setting_t config;
19 } param_gprs_setting_t;
20 
21 static const char *TAG = "netmgr_gprs";
22 
netmgr_gprs_provision(netmgr_dev_t * node)23 static int netmgr_gprs_provision(netmgr_dev_t *node)
24 {
25     aos_dev_t *dev = node->dev;
26     netdev_driver_t *drv = dev->drv;
27 
28     gprs_driver_t *gprs_drv = (gprs_driver_t *)drv->link_ops;
29     netmgr_subscribe(EVENT_GPRS_LINK_UP);
30     netmgr_subscribe(EVENT_GPRS_LINK_DOWN);
31 
32     if (gprs_drv->module_init_check(dev) < 0) {
33         LOGW(TAG, "GPRS MODULE CHECK ERR");
34         return -1;
35     }
36 
37     gprs_drv->set_mode(dev, CONNECT_MODE_GPRS);
38 
39     if (gprs_drv->connect_to_gprs(dev) < 0) {
40         return -1;
41     }
42 
43     return 0;
44 
45 }
46 
netmgr_gprs_unprovision(netmgr_dev_t * node)47 static int netmgr_gprs_unprovision(netmgr_dev_t *node)
48 {
49     return 0;
50 }
51 
netmgr_gprs_reset(netmgr_dev_t * node)52 static int netmgr_gprs_reset(netmgr_dev_t *node)
53 {
54     aos_dev_t *dev = node->dev;
55     netdev_driver_t *drv = dev->drv;
56 
57     gprs_driver_t *gprs_drv = (gprs_driver_t *)drv->link_ops;
58 
59     if (gprs_drv->reset(dev) < 0) {
60         LOGE(TAG, "GPRS RESET ERR");
61         return -1;
62     }
63 
64     return (netmgr_gprs_provision(node));
65 }
66 
netmgr_gprs_info(netmgr_dev_t * node)67 static int netmgr_gprs_info(netmgr_dev_t *node)
68 {
69     aos_dev_t  *dev = node->dev;
70     netdev_driver_t *drv = dev->drv;
71     gprs_driver_t *gprs_drv = (gprs_driver_t *)drv->link_ops;
72     net_ops_t  *net_drv = drv->net_ops;
73     ip_addr_t ipaddr;
74     int csq = 99;
75     char ccid[21];
76     int insert = -1;
77     int ret;
78 
79     memset(&ipaddr, 0, sizeof(ipaddr));
80     net_drv->get_ipaddr(dev, &ipaddr, NULL, NULL);
81 
82     gprs_drv->get_csq(dev, &csq);
83 
84     ret = gprs_drv->get_simcard_info(dev, ccid, &insert);
85     printf("\n%s%d\tLink encap:GPRS\n", drv->drv.name, drv->drv.device_id);
86     printf("    \tinet addr:%s\n", ipaddr_ntoa(&ipaddr));
87     if(csq == 99 ) {
88         printf("    \tSignal Quality: not known\n");
89     } else {
90         printf("    \tSignal Quality(%d): %d dBm\n", csq, (csq - 31) * 2 - 52);
91     }
92     if(ret < 0) {
93         printf("    \tSim insert is FAIL\n");
94     } else {
95         printf("    \tSim insert is %s\n",insert >= 0?"OK":"FAIL");
96         printf("    \tSim ccid:%s\n", ccid);
97     }
98     return 0;
99 }
100 
101 
gprs_evt_link_down(struct netmgr_uservice * netmgr,rpc_t * rpc)102 static int gprs_evt_link_down(struct netmgr_uservice *netmgr, rpc_t *rpc)
103 {
104     netmgr_set_gotip("gprs", 0);
105     event_publish(EVENT_NETMGR_NET_DISCON, NULL);
106     return 0;
107 }
netmgr_gprs_init(struct netmgr_uservice * netmgr)108 static netmgr_dev_t * netmgr_gprs_init(struct netmgr_uservice *netmgr)
109 {
110     netmgr_dev_t *node = NULL;
111     int ival = 0;
112 
113     // get gprs configuration
114 #ifdef CONFIG_KV_SMART
115     ival = netmgr_kv_getint(KV_GPRS_EN);
116 #else
117     ival = 1;
118 #endif
119 
120     if (ival == 1) {
121         netmgr_reg_srv_func(EVENT_GPRS_LINK_DOWN, gprs_evt_link_down);
122 
123         node = (netmgr_dev_t *)aos_zalloc(sizeof(netmgr_dev_t));
124 
125         if (node) {
126             node->dev = device_open_id("gprs", 0);
127             aos_assert(node->dev);
128             node->provision = netmgr_gprs_provision;
129             node->unprovision = netmgr_gprs_unprovision;
130             node->info = netmgr_gprs_info;
131             node->reset = netmgr_gprs_reset;
132             strcpy(node->name, "gprs");
133 
134             slist_add_tail((slist_t *)node, &netmgr->dev_list);
135         }
136 
137     }
138 
139     return (netmgr_hdl_t)node;
140 }
141 
142 /**
143  * @brief net manage init for gprs
144  * @return NULL on error
145  */
netmgr_dev_gprs_init()146 netmgr_hdl_t netmgr_dev_gprs_init()
147 {
148     return netmgr_gprs_init(&netmgr_svc);
149 }
150 
151 /**
152  * @brief  net manage config for gprs device(developed not yet, reserved)
153  * @param  [in] hdl
154  * @param  [in] mode
155  * @return 0 on success
156  */
netmgr_config_gprs(netmgr_hdl_t hdl,int mode)157 int netmgr_config_gprs(netmgr_hdl_t hdl, int mode)
158 {
159     int ret = -1;
160     param_gprs_setting_t param;
161     gprs_setting_t *config = &param.config;
162 
163     aos_check_return_einval(hdl);
164 
165     param.hdl = hdl;
166     config->foo = mode;
167 
168     uservice_call_sync(netmgr_svc.srv, API_GPRS_CONFIG, &param, &ret, sizeof(int));
169 
170     return ret;
171 }
172