blob: 27fd24fa5cb1c1612946f66425696dc3f03c24ba [file] [log] [blame]
wangyouqiang38e53362024-01-23 10:53:48 +08001#if 1
2#include <stdio.h>
3#include <stdlib.h>
4#include <unistd.h>
5#include <errno.h>
6#include <pthread.h>
7#include <string.h>
8#include <fcntl.h>
9#include <signal.h>
10
11#include "mbtk_led.h"
12#include "mbtk_log.h"
13
14/****************************DEFINE***************************************/
15#define MBTK_RESULT_FAIL -1
16#define MBTK_RESULT_SUCCESS 0
17
18#define MBTK_NET_LED 99
19#define MBTK_STATUS_LED 8
20/****************************DEFINE***************************************/
21
22/****************************VARIABLE***************************************/
23static mbtk_net_led_type mbtk_net_led_state = MBTK_NET_LED_SEARCH_NETWORK;
24static mbtk_net_led_type mbtk_net_led_prev_state = MBTK_NET_LED_SEARCH_NETWORK;
25static mbtk_status_led_type mbtk_status_led_state = MBTK_STATUS_LED_CLOSE;
r.xiaoe1404b32024-05-23 22:43:39 -070026
27static int MBTK_NET_LED_LOCK_SET = 0;
wangyouqiang38e53362024-01-23 10:53:48 +080028/****************************VARIABLE***************************************/
29
30/******************************FUNC*****************************************/
31int mbtk_read_ccinet(void)
32{
33 FILE *fp;
34 int ret = 0;
35 char buffer[1024];
36 char type[10]={0};
37
38 fp = popen("ifconfig", "r");
39 if (fp == NULL) {
40 printf("popen fail\n");
41 return -1;
42 }
43
44 fread(buffer,1, sizeof(buffer) -1, fp);
45 //LOGE("[led]buffer:%s\n", buffer);
46 pclose(fp); //
47
48 char *p1 = strstr(buffer, "ccinet");
49 if(p1 == NULL)
50 {
wangyouqiang8ebeafe2024-04-15 10:07:44 +080051 //LOGE("[led]read ccinet is null\n");
wangyouqiang38e53362024-01-23 10:53:48 +080052 return -1;
53 }
54
55 return 0;
56}
57
58int mbtk_net_led_get(void)
59{
r.xiaoe1404b32024-05-23 22:43:39 -070060
61 if (MBTK_NET_LED_LOCK_SET == 1)
62 {
63 mbtk_net_led_state = MBTK_NET_LED_CALL_CONNECT;//call 优先级最高
64 return mbtk_net_led_state;
65 }
66
wangyouqiang38e53362024-01-23 10:53:48 +080067 if(mbtk_net_led_state == MBTK_NET_LED_OPEN)
68 {
69 mbtk_net_led_state = mbtk_net_led_prev_state;
70 }
71
72 int ret = -1;
73 if(mbtk_net_led_state == MBTK_NET_LED_NET_CONNECT)
74 {
75 ret = mbtk_read_ccinet();
76 if(ret == 0)
77 {
78 mbtk_net_led_state = MBTK_NET_LED_DATA_CONNECT;
79 }
80 }
81 return mbtk_net_led_state;
82}
83
84void mbtk_net_led_set(mbtk_net_led_type status)
85{
86 if(mbtk_net_led_state == MBTK_NET_LED_CLOSE)
87 {
88 if(status == MBTK_NET_LED_CLOSE || status == MBTK_NET_LED_OPEN)
89 {
90 //
91 }
92 else
93 {
94 mbtk_net_led_prev_state = status;
yq.wang4e350102024-10-18 00:34:55 -070095 return;
wangyouqiang38e53362024-01-23 10:53:48 +080096 }
97 }
98 else
99 {
100 if(status == MBTK_NET_LED_CLOSE)
101 {
102 mbtk_net_led_prev_state = mbtk_net_led_state;
103 }
104 }
105
r.xiaoe1404b32024-05-23 22:43:39 -0700106 if (status == MBTK_NET_LED_CALL_CONNECT)
107 {
108 MBTK_NET_LED_LOCK_SET = 1;
109 }
110
111 if (status == MBTK_NET_LED_CALL_DISCONNECT)
112 {
113 MBTK_NET_LED_LOCK_SET = 0;
114 status = MBTK_NET_LED_NET_CONNECT;
115 }
116
wangyouqiang38e53362024-01-23 10:53:48 +0800117 mbtk_net_led_state = status;
118}
119
120static int mbtk_led_gpio_init(int gpio)
121{
122 char buffer[50]= {0};
123 char pin_index_buffer[5]= {0};
124 int fd =-1;
125 int result = -1;
126
127 memset(buffer,0,50);
128 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
129 if(access(buffer , F_OK) != 0)
130 {
131 fd = open("/sys/class/gpio/export",O_WRONLY);
132 if(fd < -1)
133 {
134 LOGE("[led]Open export fail.", gpio);
135 return MBTK_RESULT_FAIL;
136 }
137
138 memset(pin_index_buffer,0,5);
139 sprintf(pin_index_buffer,"%d", gpio);
140 result = write(fd,pin_index_buffer,strlen(pin_index_buffer));
141 close(fd);
142 if(result < 0)
143 {
144 LOGE("[led]Gpio[%d] export fail.", gpio);
145 return MBTK_RESULT_FAIL;
146 }
147 fd = -1;
148 }
149
150 fd = open(buffer, O_WRONLY);
151 if(fd < -1)
152 {
153 LOGE("[led]Open gpio[%d] direct fail.", gpio);
154 return MBTK_RESULT_FAIL;
155 }
156
157 result = write(fd, "out",strlen("out"));
158 close(fd);
159 if(result < 0)
160 {
161 LOGE("[led]Set gpio[%d] direct fail.", gpio);
162 return MBTK_RESULT_FAIL;
163 }
164 return MBTK_RESULT_SUCCESS;
165}
166
167static int mbtk_led_gpio_level_set(int gpio, int value)
168{
169 char buffer[50]= {0};
170 int fd =-1;
171 int result =-1;
172
173 memset(buffer,0,50);
174 sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
175 fd = open(buffer,O_WRONLY);
176 if(fd < -1)
177 {
178 LOGE("[led]Open gpio[%d] value fail.", gpio);
179 return MBTK_RESULT_FAIL;
180 }
181 if(value == 0)
182 {
183 result = write(fd,"0",1);
184 }
185 else
186 {
187 result = write(fd,"1",1);
188 }
189 close(fd);
190
191 if(result != 1)
192 {
193 LOGE("[led]Set gpio[%d] value fail.", gpio);
194 return MBTK_RESULT_FAIL;
195 }
196
197 return MBTK_RESULT_SUCCESS;
198}
199
200static void net_led_close(void)
201{
202 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
203}
204
205static void net_led_open(void)
206{
207 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
208}
209
210static void net_led_flicker_200ms(void)
211{
212 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
liuyanga158f3d2024-08-01 14:13:13 +0800213 usleep(100000);
wangyouqiang38e53362024-01-23 10:53:48 +0800214 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
liuyanga158f3d2024-08-01 14:13:13 +0800215 usleep(100000);
wangyouqiang38e53362024-01-23 10:53:48 +0800216}
217
218static void net_led_flicker_800ms(void)
219{
220 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
r.xiao94e02852024-06-04 05:15:14 -0700221 usleep(800000);
wangyouqiang38e53362024-01-23 10:53:48 +0800222 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
r.xiao94e02852024-06-04 05:15:14 -0700223 usleep(800000);
wangyouqiang38e53362024-01-23 10:53:48 +0800224}
225
226static void* net_led_thread_run(void* arg)
227{
228 mbtk_net_led_type status = MBTK_NET_LED_CLOSE;
229 while(1)
230 {
231 status = mbtk_net_led_get();
232 //LOGE("[led] get net led status = [%d].", status);
r.xiaoe1404b32024-05-23 22:43:39 -0700233
234 if (status == MBTK_NET_LED_CALL_CONNECT) //call 优先
wangyouqiang38e53362024-01-23 10:53:48 +0800235 {
r.xiaoe1404b32024-05-23 22:43:39 -0700236 net_led_open();
237 }
238 else
239 {
240 switch(status)
wangyouqiang38e53362024-01-23 10:53:48 +0800241 {
r.xiaoe1404b32024-05-23 22:43:39 -0700242 case MBTK_NET_LED_CLOSE:
243 case MBTK_NET_LED_POWER:
244 {
245 net_led_close();
liuyanga158f3d2024-08-01 14:13:13 +0800246 sleep(3);
r.xiaoe1404b32024-05-23 22:43:39 -0700247 break;
248 }
249 case MBTK_NET_LED_SEARCH_NETWORK:
250 {
251 net_led_open();
liuyanga158f3d2024-08-01 14:13:13 +0800252 sleep(3);
r.xiaoe1404b32024-05-23 22:43:39 -0700253 break;
254 }
255 case MBTK_NET_LED_DATA_CONNECT:
256 {
257 net_led_flicker_200ms();
258 break;
259 }
260 case MBTK_NET_LED_NET_CONNECT:
261 {
262 net_led_flicker_800ms();
263 break;
264 }
265 default:
266 {
267 LOGE("[led]Uknown status.");
liuyanga158f3d2024-08-01 14:13:13 +0800268 sleep(1);
r.xiaoe1404b32024-05-23 22:43:39 -0700269 break;
270 }
wangyouqiang38e53362024-01-23 10:53:48 +0800271 }
272 }
liuyanga158f3d2024-08-01 14:13:13 +0800273 usleep(100000);
wangyouqiang38e53362024-01-23 10:53:48 +0800274 }
275 return NULL;
276}
277
278int status_led_set(mbtk_status_led_type status)
279{
280 int ret = MBTK_RESULT_FAIL;
281 ret = mbtk_led_gpio_level_set(MBTK_STATUS_LED, status);
282 if(ret != MBTK_RESULT_SUCCESS)
283 {
284 LOGE("[led]set status led fail.");
285 return MBTK_RESULT_FAIL;
286 }
287
288 mbtk_status_led_state = status;
289 return MBTK_RESULT_SUCCESS;
290}
291
292
293int mbtk_led_init(void)
294{
295 int ret = MBTK_RESULT_FAIL;
296
297 mbtk_led_gpio_init(MBTK_STATUS_LED);
298 mbtk_led_gpio_init(MBTK_NET_LED);
299 status_led_set(MBTK_STATUS_LED_OPEN);
300 mbtk_net_led_set(MBTK_NET_LED_SEARCH_NETWORK);
301
302 pthread_attr_t thread_attr;
303 pthread_t net_led_thread_id;
304 pthread_t status_led_thread_id;
305 pthread_attr_init(&thread_attr);
306 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
307 {
308 LOGE("[led] pthread_attr_setdetachstate() fail.");
309 return MBTK_RESULT_FAIL;
310 }
311
312 if(pthread_create(&net_led_thread_id, &thread_attr, net_led_thread_run, NULL))
313 {
314 LOGE("[led] pthread_create() fail.");
315 return MBTK_RESULT_FAIL;
316 }
317
318 pthread_attr_destroy(&thread_attr);
319 return MBTK_RESULT_SUCCESS;
320}
321/******************************FUNC*****************************************/
322
323#endif