blob: 3333b9ea560a5844061fdfbc88a40d9a1fdf7f3c [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;
26/****************************VARIABLE***************************************/
27
28/******************************FUNC*****************************************/
29int mbtk_read_ccinet(void)
30{
31 FILE *fp;
32 int ret = 0;
33 char buffer[1024];
34 char type[10]={0};
35
36 fp = popen("ifconfig", "r");
37 if (fp == NULL) {
38 printf("popen fail\n");
39 return -1;
40 }
41
42 fread(buffer,1, sizeof(buffer) -1, fp);
43 //LOGE("[led]buffer:%s\n", buffer);
44 pclose(fp); //
45
46 char *p1 = strstr(buffer, "ccinet");
47 if(p1 == NULL)
48 {
wangyouqiang8ebeafe2024-04-15 10:07:44 +080049 //LOGE("[led]read ccinet is null\n");
wangyouqiang38e53362024-01-23 10:53:48 +080050 return -1;
51 }
52
53 return 0;
54}
55
56int mbtk_net_led_get(void)
57{
58 if(mbtk_net_led_state == MBTK_NET_LED_OPEN)
59 {
60 mbtk_net_led_state = mbtk_net_led_prev_state;
61 }
62
63 int ret = -1;
64 if(mbtk_net_led_state == MBTK_NET_LED_NET_CONNECT)
65 {
66 ret = mbtk_read_ccinet();
67 if(ret == 0)
68 {
69 mbtk_net_led_state = MBTK_NET_LED_DATA_CONNECT;
70 }
71 }
72 return mbtk_net_led_state;
73}
74
75void mbtk_net_led_set(mbtk_net_led_type status)
76{
77 if(mbtk_net_led_state == MBTK_NET_LED_CLOSE)
78 {
79 if(status == MBTK_NET_LED_CLOSE || status == MBTK_NET_LED_OPEN)
80 {
81 //
82 }
83 else
84 {
85 mbtk_net_led_prev_state = status;
86 }
87 }
88 else
89 {
90 if(status == MBTK_NET_LED_CLOSE)
91 {
92 mbtk_net_led_prev_state = mbtk_net_led_state;
93 }
94 }
95
96 mbtk_net_led_state = status;
97}
98
99static int mbtk_led_gpio_init(int gpio)
100{
101 char buffer[50]= {0};
102 char pin_index_buffer[5]= {0};
103 int fd =-1;
104 int result = -1;
105
106 memset(buffer,0,50);
107 sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
108 if(access(buffer , F_OK) != 0)
109 {
110 fd = open("/sys/class/gpio/export",O_WRONLY);
111 if(fd < -1)
112 {
113 LOGE("[led]Open export fail.", gpio);
114 return MBTK_RESULT_FAIL;
115 }
116
117 memset(pin_index_buffer,0,5);
118 sprintf(pin_index_buffer,"%d", gpio);
119 result = write(fd,pin_index_buffer,strlen(pin_index_buffer));
120 close(fd);
121 if(result < 0)
122 {
123 LOGE("[led]Gpio[%d] export fail.", gpio);
124 return MBTK_RESULT_FAIL;
125 }
126 fd = -1;
127 }
128
129 fd = open(buffer, O_WRONLY);
130 if(fd < -1)
131 {
132 LOGE("[led]Open gpio[%d] direct fail.", gpio);
133 return MBTK_RESULT_FAIL;
134 }
135
136 result = write(fd, "out",strlen("out"));
137 close(fd);
138 if(result < 0)
139 {
140 LOGE("[led]Set gpio[%d] direct fail.", gpio);
141 return MBTK_RESULT_FAIL;
142 }
143 return MBTK_RESULT_SUCCESS;
144}
145
146static int mbtk_led_gpio_level_set(int gpio, int value)
147{
148 char buffer[50]= {0};
149 int fd =-1;
150 int result =-1;
151
152 memset(buffer,0,50);
153 sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
154 fd = open(buffer,O_WRONLY);
155 if(fd < -1)
156 {
157 LOGE("[led]Open gpio[%d] value fail.", gpio);
158 return MBTK_RESULT_FAIL;
159 }
160 if(value == 0)
161 {
162 result = write(fd,"0",1);
163 }
164 else
165 {
166 result = write(fd,"1",1);
167 }
168 close(fd);
169
170 if(result != 1)
171 {
172 LOGE("[led]Set gpio[%d] value fail.", gpio);
173 return MBTK_RESULT_FAIL;
174 }
175
176 return MBTK_RESULT_SUCCESS;
177}
178
179static void net_led_close(void)
180{
181 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
182}
183
184static void net_led_open(void)
185{
186 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
187}
188
189static void net_led_flicker_200ms(void)
190{
191 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
192 usleep(200);
193 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
194 usleep(200);
195}
196
197static void net_led_flicker_800ms(void)
198{
199 mbtk_led_gpio_level_set(MBTK_NET_LED, 1);
200 usleep(800);
201 mbtk_led_gpio_level_set(MBTK_NET_LED, 0);
202 usleep(800);
203}
204
205static void* net_led_thread_run(void* arg)
206{
207 mbtk_net_led_type status = MBTK_NET_LED_CLOSE;
208 while(1)
209 {
210 status = mbtk_net_led_get();
211 //LOGE("[led] get net led status = [%d].", status);
212 switch(status)
213 {
214 case MBTK_NET_LED_CLOSE:
215 case MBTK_NET_LED_POWER:
216 {
217 net_led_close();
218 sleep(2);
219 break;
220 }
221 case MBTK_NET_LED_SEARCH_NETWORK:
222 {
223 net_led_open();
224 sleep(2);
225 break;
226 }
227 case MBTK_NET_LED_DATA_CONNECT:
228 {
229 net_led_flicker_200ms();
230 break;
231 }
232 case MBTK_NET_LED_NET_CONNECT:
233 {
234 net_led_flicker_800ms();
235 break;
236 }
237 default:
238 {
239 LOGE("[led]Uknown status.");
240 break;
241 }
242 }
243
244 sleep(1);
245 }
246 return NULL;
247}
248
249int status_led_set(mbtk_status_led_type status)
250{
251 int ret = MBTK_RESULT_FAIL;
252 ret = mbtk_led_gpio_level_set(MBTK_STATUS_LED, status);
253 if(ret != MBTK_RESULT_SUCCESS)
254 {
255 LOGE("[led]set status led fail.");
256 return MBTK_RESULT_FAIL;
257 }
258
259 mbtk_status_led_state = status;
260 return MBTK_RESULT_SUCCESS;
261}
262
263
264int mbtk_led_init(void)
265{
266 int ret = MBTK_RESULT_FAIL;
267
268 mbtk_led_gpio_init(MBTK_STATUS_LED);
269 mbtk_led_gpio_init(MBTK_NET_LED);
270 status_led_set(MBTK_STATUS_LED_OPEN);
271 mbtk_net_led_set(MBTK_NET_LED_SEARCH_NETWORK);
272
273 pthread_attr_t thread_attr;
274 pthread_t net_led_thread_id;
275 pthread_t status_led_thread_id;
276 pthread_attr_init(&thread_attr);
277 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
278 {
279 LOGE("[led] pthread_attr_setdetachstate() fail.");
280 return MBTK_RESULT_FAIL;
281 }
282
283 if(pthread_create(&net_led_thread_id, &thread_attr, net_led_thread_run, NULL))
284 {
285 LOGE("[led] pthread_create() fail.");
286 return MBTK_RESULT_FAIL;
287 }
288
289 pthread_attr_destroy(&thread_attr);
290 return MBTK_RESULT_SUCCESS;
291}
292/******************************FUNC*****************************************/
293
294#endif