blob: a850f109a9c333ca769695675a4ba96d53b4e869 [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
b.liu9e8584b2024-11-06 19:21:28 +080027static int MBTK_NET_LED_LOCK_SET = 0;
wangyouqiang38e53362024-01-23 10:53:48 +080028/****************************VARIABLE***************************************/
29
30/******************************FUNC*****************************************/
b.liu9e8584b2024-11-06 19:21:28 +080031int mbtk_read_ccinet(void)
wangyouqiang38e53362024-01-23 10:53:48 +080032{
33 FILE *fp;
b.liu9e8584b2024-11-06 19:21:28 +080034// int ret = 0;
35 char buffer[1024];
36// char type[10]={0};
37
38 fp = popen("ifconfig", "r");
wangyouqiang38e53362024-01-23 10:53:48 +080039 if (fp == NULL) {
40 printf("popen fail\n");
41 return -1;
42 }
b.liu9e8584b2024-11-06 19:21:28 +080043
44 if(fread(buffer,1, sizeof(buffer) -1, fp) <= 0) {
45
46 }
wangyouqiang38e53362024-01-23 10:53:48 +080047 //LOGE("[led]buffer:%s\n", buffer);
b.liu9e8584b2024-11-06 19:21:28 +080048 pclose(fp); //
wangyouqiang38e53362024-01-23 10:53:48 +080049
50 char *p1 = strstr(buffer, "ccinet");
51 if(p1 == NULL)
52 {
wangyouqiang8ebeafe2024-04-15 10:07:44 +080053 //LOGE("[led]read ccinet is null\n");
wangyouqiang38e53362024-01-23 10:53:48 +080054 return -1;
55 }
56
57 return 0;
58}
59
60int mbtk_net_led_get(void)
61{
r.xiaoe1404b32024-05-23 22:43:39 -070062
63 if (MBTK_NET_LED_LOCK_SET == 1)
64 {
65 mbtk_net_led_state = MBTK_NET_LED_CALL_CONNECT;//call 优先级最高
66 return mbtk_net_led_state;
67 }
68
wangyouqiang38e53362024-01-23 10:53:48 +080069 if(mbtk_net_led_state == MBTK_NET_LED_OPEN)
70 {
71 mbtk_net_led_state = mbtk_net_led_prev_state;
72 }
73
74 int ret = -1;
75 if(mbtk_net_led_state == MBTK_NET_LED_NET_CONNECT)
76 {
77 ret = mbtk_read_ccinet();
78 if(ret == 0)
79 {
80 mbtk_net_led_state = MBTK_NET_LED_DATA_CONNECT;
81 }
82 }
83 return mbtk_net_led_state;
84}
85
86void mbtk_net_led_set(mbtk_net_led_type status)
87{
88 if(mbtk_net_led_state == MBTK_NET_LED_CLOSE)
89 {
90 if(status == MBTK_NET_LED_CLOSE || status == MBTK_NET_LED_OPEN)
91 {
92 //
93 }
94 else
95 {
96 mbtk_net_led_prev_state = status;
yq.wang4e350102024-10-18 00:34:55 -070097 return;
wangyouqiang38e53362024-01-23 10:53:48 +080098 }
99 }
100 else
101 {
102 if(status == MBTK_NET_LED_CLOSE)
103 {
104 mbtk_net_led_prev_state = mbtk_net_led_state;
105 }
106 }
107
r.xiaoe1404b32024-05-23 22:43:39 -0700108 if (status == MBTK_NET_LED_CALL_CONNECT)
109 {
110 MBTK_NET_LED_LOCK_SET = 1;
111 }
112
113 if (status == MBTK_NET_LED_CALL_DISCONNECT)
114 {
115 MBTK_NET_LED_LOCK_SET = 0;
116 status = MBTK_NET_LED_NET_CONNECT;
117 }
118
wangyouqiang38e53362024-01-23 10:53:48 +0800119 mbtk_net_led_state = status;
120}
121
122static int mbtk_led_gpio_init(int gpio)
123{
124 char buffer[50]= {0};
125 char pin_index_buffer[5]= {0};
126 int fd =-1;
127 int result = -1;
128
129 memset(buffer,0,50);
130 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
131 if(access(buffer , F_OK) != 0)
132 {
133 fd = open("/sys/class/gpio/export",O_WRONLY);
134 if(fd < -1)
135 {
136 LOGE("[led]Open export fail.", gpio);
137 return MBTK_RESULT_FAIL;
138 }
139
140 memset(pin_index_buffer,0,5);
141 sprintf(pin_index_buffer,"%d", gpio);
142 result = write(fd,pin_index_buffer,strlen(pin_index_buffer));
143 close(fd);
144 if(result < 0)
145 {
146 LOGE("[led]Gpio[%d] export fail.", gpio);
147 return MBTK_RESULT_FAIL;
148 }
149 fd = -1;
150 }
151
152 fd = open(buffer, O_WRONLY);
153 if(fd < -1)
154 {
155 LOGE("[led]Open gpio[%d] direct fail.", gpio);
156 return MBTK_RESULT_FAIL;
157 }
158
159 result = write(fd, "out",strlen("out"));
160 close(fd);
161 if(result < 0)
162 {
163 LOGE("[led]Set gpio[%d] direct fail.", gpio);
164 return MBTK_RESULT_FAIL;
165 }
166 return MBTK_RESULT_SUCCESS;
167}
168
169static int mbtk_led_gpio_level_set(int gpio, int value)
170{
171 char buffer[50]= {0};
172 int fd =-1;
173 int result =-1;
174
175 memset(buffer,0,50);
176 sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
177 fd = open(buffer,O_WRONLY);
178 if(fd < -1)
179 {
180 LOGE("[led]Open gpio[%d] value fail.", gpio);
181 return MBTK_RESULT_FAIL;
182 }
183 if(value == 0)
184 {
185 result = write(fd,"0",1);
186 }
187 else
188 {
189 result = write(fd,"1",1);
190 }
191 close(fd);
b.liu9e8584b2024-11-06 19:21:28 +0800192
wangyouqiang38e53362024-01-23 10:53:48 +0800193 if(result != 1)
194 {
195 LOGE("[led]Set gpio[%d] value fail.", gpio);
196 return MBTK_RESULT_FAIL;
197 }
198
199 return MBTK_RESULT_SUCCESS;
200}
201
202static void net_led_close(void)
203{
204 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
205}
206
207static void net_led_open(void)
208{
209 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
210}
211
212static void net_led_flicker_200ms(void)
213{
214 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
liuyanga158f3d2024-08-01 14:13:13 +0800215 usleep(100000);
wangyouqiang38e53362024-01-23 10:53:48 +0800216 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
liuyanga158f3d2024-08-01 14:13:13 +0800217 usleep(100000);
wangyouqiang38e53362024-01-23 10:53:48 +0800218}
219
220static void net_led_flicker_800ms(void)
221{
222 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
r.xiao94e02852024-06-04 05:15:14 -0700223 usleep(800000);
wangyouqiang38e53362024-01-23 10:53:48 +0800224 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
r.xiao94e02852024-06-04 05:15:14 -0700225 usleep(800000);
wangyouqiang38e53362024-01-23 10:53:48 +0800226}
227
228static void* net_led_thread_run(void* arg)
229{
230 mbtk_net_led_type status = MBTK_NET_LED_CLOSE;
231 while(1)
232 {
233 status = mbtk_net_led_get();
234 //LOGE("[led] get net led status = [%d].", status);
r.xiaoe1404b32024-05-23 22:43:39 -0700235
236 if (status == MBTK_NET_LED_CALL_CONNECT) //call 优先
wangyouqiang38e53362024-01-23 10:53:48 +0800237 {
r.xiaoe1404b32024-05-23 22:43:39 -0700238 net_led_open();
239 }
240 else
241 {
242 switch(status)
wangyouqiang38e53362024-01-23 10:53:48 +0800243 {
r.xiaoe1404b32024-05-23 22:43:39 -0700244 case MBTK_NET_LED_CLOSE:
245 case MBTK_NET_LED_POWER:
246 {
247 net_led_close();
liuyanga158f3d2024-08-01 14:13:13 +0800248 sleep(3);
r.xiaoe1404b32024-05-23 22:43:39 -0700249 break;
250 }
251 case MBTK_NET_LED_SEARCH_NETWORK:
252 {
253 net_led_open();
liuyanga158f3d2024-08-01 14:13:13 +0800254 sleep(3);
r.xiaoe1404b32024-05-23 22:43:39 -0700255 break;
256 }
257 case MBTK_NET_LED_DATA_CONNECT:
258 {
259 net_led_flicker_200ms();
260 break;
261 }
262 case MBTK_NET_LED_NET_CONNECT:
263 {
264 net_led_flicker_800ms();
265 break;
266 }
267 default:
268 {
269 LOGE("[led]Uknown status.");
liuyanga158f3d2024-08-01 14:13:13 +0800270 sleep(1);
r.xiaoe1404b32024-05-23 22:43:39 -0700271 break;
272 }
wangyouqiang38e53362024-01-23 10:53:48 +0800273 }
274 }
liuyanga158f3d2024-08-01 14:13:13 +0800275 usleep(100000);
wangyouqiang38e53362024-01-23 10:53:48 +0800276 }
277 return NULL;
278}
279
280int status_led_set(mbtk_status_led_type status)
281{
282 int ret = MBTK_RESULT_FAIL;
283 ret = mbtk_led_gpio_level_set(MBTK_STATUS_LED, status);
284 if(ret != MBTK_RESULT_SUCCESS)
285 {
286 LOGE("[led]set status led fail.");
287 return MBTK_RESULT_FAIL;
288 }
289
290 mbtk_status_led_state = status;
291 return MBTK_RESULT_SUCCESS;
292}
293
294
295int mbtk_led_init(void)
296{
b.liu9e8584b2024-11-06 19:21:28 +0800297// int ret = MBTK_RESULT_FAIL;
wangyouqiang38e53362024-01-23 10:53:48 +0800298
299 mbtk_led_gpio_init(MBTK_STATUS_LED);
300 mbtk_led_gpio_init(MBTK_NET_LED);
301 status_led_set(MBTK_STATUS_LED_OPEN);
302 mbtk_net_led_set(MBTK_NET_LED_SEARCH_NETWORK);
303
304 pthread_attr_t thread_attr;
305 pthread_t net_led_thread_id;
b.liu9e8584b2024-11-06 19:21:28 +0800306// pthread_t status_led_thread_id;
wangyouqiang38e53362024-01-23 10:53:48 +0800307 pthread_attr_init(&thread_attr);
308 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
309 {
310 LOGE("[led] pthread_attr_setdetachstate() fail.");
311 return MBTK_RESULT_FAIL;
312 }
313
314 if(pthread_create(&net_led_thread_id, &thread_attr, net_led_thread_run, NULL))
315 {
316 LOGE("[led] pthread_create() fail.");
317 return MBTK_RESULT_FAIL;
318 }
319
320 pthread_attr_destroy(&thread_attr);
321 return MBTK_RESULT_SUCCESS;
322}
323/******************************FUNC*****************************************/
324
325#endif