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 = ¶m.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, ¶m, &ret, sizeof(int));
169
170 return ret;
171 }
172