blob: 33ce4680ab9592b5ed3783cea8df01cb85c40ced [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;
95 }
96 }
97 else
98 {
99 if(status == MBTK_NET_LED_CLOSE)
100 {
101 mbtk_net_led_prev_state = mbtk_net_led_state;
102 }
103 }
104
r.xiaoe1404b32024-05-23 22:43:39 -0700105 if (status == MBTK_NET_LED_CALL_CONNECT)
106 {
107 MBTK_NET_LED_LOCK_SET = 1;
108 }
109
110 if (status == MBTK_NET_LED_CALL_DISCONNECT)
111 {
112 MBTK_NET_LED_LOCK_SET = 0;
113 status = MBTK_NET_LED_NET_CONNECT;
114 }
115
wangyouqiang38e53362024-01-23 10:53:48 +0800116 mbtk_net_led_state = status;
117}
118
119static int mbtk_led_gpio_init(int gpio)
120{
121 char buffer[50]= {0};
122 char pin_index_buffer[5]= {0};
123 int fd =-1;
124 int result = -1;
125
126 memset(buffer,0,50);
127 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
128 if(access(buffer , F_OK) != 0)
129 {
130 fd = open("/sys/class/gpio/export",O_WRONLY);
131 if(fd < -1)
132 {
133 LOGE("[led]Open export fail.", gpio);
134 return MBTK_RESULT_FAIL;
135 }
136
137 memset(pin_index_buffer,0,5);
138 sprintf(pin_index_buffer,"%d", gpio);
139 result = write(fd,pin_index_buffer,strlen(pin_index_buffer));
140 close(fd);
141 if(result < 0)
142 {
143 LOGE("[led]Gpio[%d] export fail.", gpio);
144 return MBTK_RESULT_FAIL;
145 }
146 fd = -1;
147 }
148
149 fd = open(buffer, O_WRONLY);
150 if(fd < -1)
151 {
152 LOGE("[led]Open gpio[%d] direct fail.", gpio);
153 return MBTK_RESULT_FAIL;
154 }
155
156 result = write(fd, "out",strlen("out"));
157 close(fd);
158 if(result < 0)
159 {
160 LOGE("[led]Set gpio[%d] direct fail.", gpio);
161 return MBTK_RESULT_FAIL;
162 }
163 return MBTK_RESULT_SUCCESS;
164}
165
166static int mbtk_led_gpio_level_set(int gpio, int value)
167{
168 char buffer[50]= {0};
169 int fd =-1;
170 int result =-1;
171
172 memset(buffer,0,50);
173 sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
174 fd = open(buffer,O_WRONLY);
175 if(fd < -1)
176 {
177 LOGE("[led]Open gpio[%d] value fail.", gpio);
178 return MBTK_RESULT_FAIL;
179 }
180 if(value == 0)
181 {
182 result = write(fd,"0",1);
183 }
184 else
185 {
186 result = write(fd,"1",1);
187 }
188 close(fd);
189
190 if(result != 1)
191 {
192 LOGE("[led]Set gpio[%d] value fail.", gpio);
193 return MBTK_RESULT_FAIL;
194 }
195
196 return MBTK_RESULT_SUCCESS;
197}
198
199static void net_led_close(void)
200{
201 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
202}
203
204static void net_led_open(void)
205{
206 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
207}
208
209static void net_led_flicker_200ms(void)
210{
211 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
liuyanga158f3d2024-08-01 14:13:13 +0800212 usleep(100000);
wangyouqiang38e53362024-01-23 10:53:48 +0800213 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
liuyanga158f3d2024-08-01 14:13:13 +0800214 usleep(100000);
wangyouqiang38e53362024-01-23 10:53:48 +0800215}
216
217static void net_led_flicker_800ms(void)
218{
219 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
r.xiao94e02852024-06-04 05:15:14 -0700220 usleep(800000);
wangyouqiang38e53362024-01-23 10:53:48 +0800221 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
r.xiao94e02852024-06-04 05:15:14 -0700222 usleep(800000);
wangyouqiang38e53362024-01-23 10:53:48 +0800223}
224
225static void* net_led_thread_run(void* arg)
226{
227 mbtk_net_led_type status = MBTK_NET_LED_CLOSE;
228 while(1)
229 {
230 status = mbtk_net_led_get();
231 //LOGE("[led] get net led status = [%d].", status);
r.xiaoe1404b32024-05-23 22:43:39 -0700232
233 if (status == MBTK_NET_LED_CALL_CONNECT) //call 优先
wangyouqiang38e53362024-01-23 10:53:48 +0800234 {
r.xiaoe1404b32024-05-23 22:43:39 -0700235 net_led_open();
236 }
237 else
238 {
239 switch(status)
wangyouqiang38e53362024-01-23 10:53:48 +0800240 {
r.xiaoe1404b32024-05-23 22:43:39 -0700241 case MBTK_NET_LED_CLOSE:
242 case MBTK_NET_LED_POWER:
243 {
244 net_led_close();
liuyanga158f3d2024-08-01 14:13:13 +0800245 sleep(3);
r.xiaoe1404b32024-05-23 22:43:39 -0700246 break;
247 }
248 case MBTK_NET_LED_SEARCH_NETWORK:
249 {
250 net_led_open();
liuyanga158f3d2024-08-01 14:13:13 +0800251 sleep(3);
r.xiaoe1404b32024-05-23 22:43:39 -0700252 break;
253 }
254 case MBTK_NET_LED_DATA_CONNECT:
255 {
256 net_led_flicker_200ms();
257 break;
258 }
259 case MBTK_NET_LED_NET_CONNECT:
260 {
261 net_led_flicker_800ms();
262 break;
263 }
264 default:
265 {
266 LOGE("[led]Uknown status.");
liuyanga158f3d2024-08-01 14:13:13 +0800267 sleep(1);
r.xiaoe1404b32024-05-23 22:43:39 -0700268 break;
269 }
wangyouqiang38e53362024-01-23 10:53:48 +0800270 }
271 }
liuyanga158f3d2024-08-01 14:13:13 +0800272 usleep(100000);
wangyouqiang38e53362024-01-23 10:53:48 +0800273 }
274 return NULL;
275}
276
277int status_led_set(mbtk_status_led_type status)
278{
279 int ret = MBTK_RESULT_FAIL;
280 ret = mbtk_led_gpio_level_set(MBTK_STATUS_LED, status);
281 if(ret != MBTK_RESULT_SUCCESS)
282 {
283 LOGE("[led]set status led fail.");
284 return MBTK_RESULT_FAIL;
285 }
286
287 mbtk_status_led_state = status;
288 return MBTK_RESULT_SUCCESS;
289}
290
291
292int mbtk_led_init(void)
293{
294 int ret = MBTK_RESULT_FAIL;
295
296 mbtk_led_gpio_init(MBTK_STATUS_LED);
297 mbtk_led_gpio_init(MBTK_NET_LED);
298 status_led_set(MBTK_STATUS_LED_OPEN);
299 mbtk_net_led_set(MBTK_NET_LED_SEARCH_NETWORK);
300
301 pthread_attr_t thread_attr;
302 pthread_t net_led_thread_id;
303 pthread_t status_led_thread_id;
304 pthread_attr_init(&thread_attr);
305 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
306 {
307 LOGE("[led] pthread_attr_setdetachstate() fail.");
308 return MBTK_RESULT_FAIL;
309 }
310
311 if(pthread_create(&net_led_thread_id, &thread_attr, net_led_thread_run, NULL))
312 {
313 LOGE("[led] pthread_create() fail.");
314 return MBTK_RESULT_FAIL;
315 }
316
317 pthread_attr_destroy(&thread_attr);
318 return MBTK_RESULT_SUCCESS;
319}
320/******************************FUNC*****************************************/
321
322#endif