blob: a25276435b34495789ce0ed5bcee83e585972983 [file] [log] [blame]
you.chen5ef374a2023-12-26 17:25:16 +08001#ifdef LED_SUPPORT
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5#include <binder/Parcel.h>
6#include <sys/socket.h>
7#include <errno.h>
8#include <unistd.h>
9#include <cutils/jstring.h>
10#include <sys/types.h>
11#include <time.h>
12#include <signal.h>
13#include "led.h"
14#include "led_inner.h"
15#include <liblog/lynq_deflog.h>
16#include "common.h"
17
18#undef LOG_TAG
19#define LOG_TAG "LED"
20
21
22/*************************************************************
23 Constants and Macros
24*************************************************************/
25#define GPIO_NETLED_CONNECT_REFLASH_TIMER 200
26#define GPIO_NETLED_CREG_REFLASH_TIMER 800
27#define MBTK_GPIO_NETLED_N 77
28
29/*************************************************************
30 Extern Function Declaration
31*************************************************************/
32void mbtk_netled_reflash_handle();
33
34/*************************************************************
35 Variables:local,extern
36*************************************************************/
37//static rex_timer_type mbtk_gpio_netled_timer;
38static mbtk_netled_state_t mbtk_netled_state;
39/*************************************************************
40 Definitions:enum,struct,union
41*************************************************************/
42
43/*=============================================
44FUNCTION
45 mbtk_get_netled_state
46
47DESCRIPTION
48 This function to return pointer of mbtk_netled_state.
49
50DEPENDENCIES
51 None
52
53PARAMETERS
54 None
55
56RETURN VALUE
57 &mbtk_netled_state
58
59SIDE EFFECTS
60 None
61=============================================*/
62
63mbtk_netled_state_t * mbtk_get_netled_state()
64{
65 return &mbtk_netled_state;
66}
67
68/*=============================================
69FUNCTION
70 mbtk_init_netled_state
71
72DESCRIPTION
73 This function to init mbtk_netled_state.
74
75DEPENDENCIES
76 None
77
78PARAMETERS
79 None
80
81RETURN VALUE
82 None
83
84SIDE EFFECTS
85 None
86=============================================*/
87
88void mbtk_init_netled_state()
89{
90 mbtk_netled_state_t * netled_state = NULL;
91 netled_state = mbtk_get_netled_state();
92
93 netled_state->gpio_netled_cs_flag = false;
94 netled_state->gpio_netled_goingsleep_flag = false;
95 netled_state->gpio_netled_ppp_flag = false;
96 netled_state->gpio_netled_wwan_flag = false;
97
98}
99
100static timer_t s_mbtk_gpio_netled_timer;
101
102static int s_mbtk_gpio_netled_timer_sig_value = 11; /* 2,3,4 are used by network */
103
104void start_led_timer(timer_t timer, int signal_value, int milliseconds)
105{
106 RLOGD("start_led_timer(), timer_id=%ld, signal_value=%d, time=%d",(long)timer, signal_value, milliseconds);
107
108 struct itimerspec expire;
109 expire.it_interval.tv_sec = 0;
110 expire.it_interval.tv_nsec = 0;
111 expire.it_value.tv_sec = milliseconds/1000;
112 expire.it_value.tv_nsec = (milliseconds%1000)*1000000;
113 if (timer_settime(timer, 0, &expire, NULL) == -1) {
114 RLOGE("timer_settime failed reason=[%s]", strerror(errno));
115 }
116
117}
118
119void stop_led_timer(timer_t timer, int signal_value) {
120 RLOGD("stop_led_timer(), timer_id=%ld, signal_value=%d", (long)timer, signal_value);
121 struct itimerspec timespec;
122 if(timer_gettime(timer, &timespec) == -1) {
123 RLOGE("stop_led_timer(), get time fail(%s)", strerror(errno));
124 return;
125 }
126 RLOGD("stop_led_timer(), tv_sec=%ld, tv_nsec=%ld",timespec.it_value.tv_sec, timespec.it_value.tv_nsec);
127 if((timespec.it_value.tv_sec == 0) && (timespec.it_value.tv_nsec == 0) ) {
128 RLOGD("stop_led_timer(), timer_id(%ld) had stopped, just return", (long)timer);
129 return;
130 } else {
131 start_led_timer(timer, signal_value, 0);
132 }
133}
134
135static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
136void led_timer_handler(sigval_t sig)
137{
138 RLOGD("led_timer_handler, sig_value: %d", sig.sival_int);
139 int s;
140 s = pthread_mutex_lock(&mtx);
141 if(s != 0) {
142 RLOGE("led_timer_handler, pthead_mutex_lock fail");
143 }
144 if(sig.sival_int == s_mbtk_gpio_netled_timer_sig_value)
145 {
146 mbtk_netled_reflash_handle();
147 }
148 s = pthread_mutex_unlock(&mtx);
149 if(s != 0) {
150 RLOGE("led_timer_handler, pthead_mutex_unlock fail");
151 }
152}
153
154void init_led_timer(timer_t* timer, int signal_value)
155{
156 struct sigevent sevp;
157 memset(&sevp, 0, sizeof(sevp));
158 sevp.sigev_value.sival_int = signal_value;
159 sevp.sigev_notify = SIGEV_THREAD;
160 sevp.sigev_notify_function = led_timer_handler;
161
162 if(timer_create(CLOCK_MONOTONIC, &sevp, timer) == -1) {
163 RLOGE("init_led_timer() failed reason=[%s]", strerror(errno));
164 }
165 RLOGD("init_led_timer(), timer_Id = %ld, signal_value=%d", (long)(*timer), signal_value);
166}
167
168void init_led_timer_all()
169{
170 init_led_timer(&s_mbtk_gpio_netled_timer,s_mbtk_gpio_netled_timer_sig_value);
171}
172
173void deinit_led_timer_all()
174{
175 stop_led_timer(s_mbtk_gpio_netled_timer,s_mbtk_gpio_netled_timer_sig_value);
176}
177
178/*=============================================
179FUNCTION
180 mbtk_netled_init
181
182DESCRIPTION
183 This function to init timer
184
185DEPENDENCIES
186 None
187
188PARAMETERS
189 param not used
190
191RETURN VALUE
192 None
193
194SIDE EFFECTS
195 None
196=============================================*/
197void mbtk_netled_init()
198{
199 mbtk_init_netled_state();
200 init_led_timer_all();
201}
202
203/*=============================================
204FUNCTION
205 mbtk_netled_deinit
206
207DESCRIPTION
208 This function to init timer
209
210DEPENDENCIES
211 None
212
213PARAMETERS
214 param not used
215
216RETURN VALUE
217 None
218
219SIDE EFFECTS
220 None
221=============================================*/
222void mbtk_netled_deinit()
223{
224 deinit_led_timer_all();
225}
226
227
228/*=============================================
229FUNCTION
230 mbtk_get_at_netled_cmd
231
232DESCRIPTION
233 This function to return netled switch value.
234
235DEPENDENCIES
236 None
237
238PARAMETERS
239 None
240
241RETURN VALUE
242 int
243
244SIDE EFFECTS
245 None
246=============================================*/
247
248int mbtk_get_at_netled_cmd(void)
249{
250 return 1;
251// return (int) dsatutil_get_val(MBTK_AT_GPIO_CGNETLED_IDX,0,0,NUM_TYPE);
252}
253
254/*=============================================
255FUNCTION
256 mbtk_get_reg_net_status
257
258DESCRIPTION
259 This function that determine if net registers successfully.
260
261DEPENDENCIES
262 None
263
264PARAMETERS
265 param not used
266
267RETURN VALUE
268 mbtk_netled_reg_net_status
269
270SIDE EFFECTS
271 None
272=============================================*/
273
274mbtk_netled_reg_net_status mbtk_get_reg_net_status(void)
275{
you.chen5ef374a2023-12-26 17:25:16 +0800276 if(false == ril_get_if_insert_simcard())
277 {
278 RLOGE("ril_get_if_insert_simcard false" );
you.chen3782be92024-01-08 13:27:06 +0800279 return NET_REG_FAIL;
you.chen5ef374a2023-12-26 17:25:16 +0800280 }
281
282 if(true == ril_get_if_3gpp_reg_success())
283 {
284 RLOGD("ril_get_if_3gpp_reg_success true");
you.chen3782be92024-01-08 13:27:06 +0800285 return NET_REG_SUCCESS;
you.chen5ef374a2023-12-26 17:25:16 +0800286 }
287
you.chen3782be92024-01-08 13:27:06 +0800288 if(true == ril_get_if_3gpp_data_reg_success())
289 {
290 RLOGD("ril_get_if_3gpp_data_reg_success true");
291 return NET_REG_SUCCESS;
292 }
you.chen5ef374a2023-12-26 17:25:16 +0800293
you.chen3782be92024-01-08 13:27:06 +0800294 return NET_REG_FAIL;
you.chen5ef374a2023-12-26 17:25:16 +0800295}
296
297/*=============================================
298FUNCTION
299 mbtk_netled_get_socket_conn_status
300
301DESCRIPTION
302 This function that socket connects successfully.
303
304DEPENDENCIES
305 None
306
307PARAMETERS
308 param not used
309
310RETURN VALUE
311 mbtk_netled_socket_conn_status
312
313SIDE EFFECTS
314 None
315=============================================*/
316
317mbtk_netled_socket_conn_status mbtk_netled_get_socket_conn_status(void)
318{
319 mbtk_netled_socket_conn_status socket_conn_status = MBTK_SOCKET_DISCONNECT;
320 mbtk_netled_state_t * netled_state = mbtk_get_netled_state();
321
322 if(netled_state->gpio_netled_ppp_flag || netled_state->gpio_netled_wwan_flag)
323 {
324 RLOGD("GPIO: ppp wwan netled state sockNum %d,%d",
325 netled_state->gpio_netled_ppp_flag, netled_state->gpio_netled_wwan_flag);
326
327 socket_conn_status = MBTK_SOCKET_CONNECTED;
328 return socket_conn_status;
329 }
330
331 return socket_conn_status;
332
333}
334
335/*=============================================
336FUNCTION
337 mbtk_netled_get_current_state
338
339DESCRIPTION
340 get the netled status .
341
342DEPENDENCIES
343 None
344
345PARAMETERS
346 param not used
347
348RETURN VALUE
349 mbtk_netled_status_type
350
351SIDE EFFECTS
352 None
353=============================================*/
354mbtk_netled_status_type mbtk_netled_get_current_state(void)
355{
356 mbtk_netled_reg_net_status reg_net_status = NET_REG_FAIL;
357 mbtk_netled_status_type netled_status_type = GPIO_NETLED_OFF;
358 mbtk_netled_socket_conn_status socket_conn_status = MBTK_SOCKET_DISCONNECT;
359 int mbtk_netled_at_cmd_value = mbtk_get_at_netled_cmd(); // 0 -- close netled / 1 -- open netled
360 mbtk_netled_state_t * netled_state = mbtk_get_netled_state();
361
362 if(mbtk_netled_at_cmd_value == 0 ||
363 netled_state->gpio_netled_goingsleep_flag == true)
364 {
365 netled_status_type = GPIO_NETLED_OFF;
366 return netled_status_type;
367 }
368
369 reg_net_status = mbtk_get_reg_net_status();
370 if( NET_REG_FAIL == reg_net_status || true == netled_state->gpio_netled_cs_flag )
371 {
372 netled_status_type = GPIO_NETLED_LIGHT;
373 }
374 else if( NET_REG_SUCCESS == reg_net_status )
375 {
376 socket_conn_status = mbtk_netled_get_socket_conn_status();
377
378 if( MBTK_SOCKET_CONNECTED == socket_conn_status )
379 {
380 netled_status_type = GPIO_NETLED_CONNECT;
381 }
382 else if( MBTK_SOCKET_DISCONNECT == socket_conn_status )
383 {
384 netled_status_type = GPIO_NETLED_REG;
385 }
386 }
387 return netled_status_type;
388}
389
390
391
392bool is_mbtk_timer_finish() {
393 struct itimerspec timespec;
394 if(timer_gettime(s_mbtk_gpio_netled_timer, &timespec) == -1) {
395 RLOGD("%s(), get time fail(%s)", __FUNCTION__, strerror(errno));
396 return true;
397 }
398 RLOGD("%s(), tv_sec=%ld, tv_nsec=%ld", __FUNCTION__,timespec.it_value.tv_sec, timespec.it_value.tv_nsec);
399 if((timespec.it_value.tv_sec == 0) && (timespec.it_value.tv_nsec == 0) ) {
400 RLOGD("%s(), timer_id(%ld) had stopped", __FUNCTION__, (long)s_mbtk_gpio_netled_timer);
401 return true;
402 }
403 return false;
404}
405
406/*=============================================
407FUNCTION
408 mbtk_netled_state_update
409
410DESCRIPTION
411 This function to reflash network led status and write gpio value
412
413DEPENDENCIES
414 None
415
416PARAMETERS
417 param flag
418
419RETURN VALUE
420 None
421
422SIDE EFFECTS
423 None
424=============================================*/
425void mbtk_netled_state_update(mbtk_netled_reflash_type flag)
426{
427// rex_timer_cnt_type prev_value;
428 mbtk_netled_state_t * netled_state = NULL;
429 netled_state = mbtk_get_netled_state();
430
431 switch (flag)
432 {
433 case GPIO_NETLED_REFLASH_NORMAL:
434 break;
435 case GPIO_NETLED_CS_CALLING:
436 netled_state->gpio_netled_cs_flag = true;
437 break;
438 case GPIO_NETLED_PPP_CONNECT:
439 netled_state->gpio_netled_ppp_flag = true;
440 break;
441 case GPIO_NETLED_PPP_CLOSED:
442 netled_state->gpio_netled_ppp_flag = false;
443 break;
444 case GPIO_NETLED_CS_CALLEND:
445 netled_state->gpio_netled_cs_flag = false;
446 break;
447 case GPIO_NETLED_AP_GOINGSLEEP:
448 netled_state->gpio_netled_goingsleep_flag = true;
449 break;
450 case GPIO_NETLED_AP_WAKEUP:
451 netled_state->gpio_netled_goingsleep_flag = false;
452 break;
453 case GPIO_NETLED_WWAN_CONNECT:
454 netled_state->gpio_netled_wwan_flag = true;
455 break;
456 case GPIO_NETLED_WWAN_CLOSED:
457 netled_state->gpio_netled_wwan_flag = false;
458 break;
459
460 }
461
462 //prev_value = rex_get_timer(&mbtk_gpio_netled_timer);
463// prev_value = timer_get_64(&mbtk_gpio_netled_timer, T_MSEC);
464// if( prev_value == 0)
465 if((flag== GPIO_NETLED_AP_GOINGSLEEP) || is_mbtk_timer_finish())
466 {
467 // MBTK_MSG1_HIGH("GPIO: rex_get_timer prev_value =%d",prev_value);
468 //rex_set_timer(&mbtk_gpio_netled_timer, 1);
469 //timer_set_64(&mbtk_gpio_netled_timer,1,0,T_MSEC);
470 start_led_timer(s_mbtk_gpio_netled_timer, s_mbtk_gpio_netled_timer_sig_value, 1);
471 }
472
473 return ;
474}
475
476/*=============================================
477FUNCTION
478 mbtk_netled_reflash_handle
479
480DESCRIPTION
481 This function to reflash network led status and write gpio value
482
483DEPENDENCIES
484 None
485
486PARAMETERS
487 param not used
488
489RETURN VALUE
490 None
491
492SIDE EFFECTS
493 None
494=============================================*/
495
496void mbtk_gpio_write_output(int gpio_port, int value)
497{
498 if(value==1)
499 {
500 system("echo 255 > /sys/class/leds/led9515:green:cellular-radio/brightness");
501 }
502 else
503 {
504 system("echo 0 > /sys/class/leds/led9515:green:cellular-radio/brightness");
505 }
506}
507
you.chen5ef374a2023-12-26 17:25:16 +0800508/*=============================================
509FUNCTION
510 mbtk_netled_reflash_handle
511
512DESCRIPTION
513 This function to reflash network led status and write gpio value
514
515DEPENDENCIES
516 None
517
518PARAMETERS
519 param not used
520
521RETURN VALUE
522 None
523
524SIDE EFFECTS
525 None
526=============================================*/
527void mbtk_netled_reflash_handle()
528{
529 mbtk_netled_status_type state = GPIO_NETLED_MAX;
530 state = mbtk_netled_get_current_state();
531 RLOGD("mbtk_netled_get_current_state state = %d",state);
532 static int led_val = 0;
533
534 switch(state)
535 {
536 case GPIO_NETLED_OFF:
537 {
538 if( 0 != led_val )
539 {
540 led_val = 0;
541 mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, 0);
542 }
543 }
544 break;
545 case GPIO_NETLED_REG:
546 {
547 led_val = ( (1 == led_val)? 0:1 );
548 mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, led_val);
549 start_led_timer(s_mbtk_gpio_netled_timer, s_mbtk_gpio_netled_timer_sig_value, GPIO_NETLED_CREG_REFLASH_TIMER);
550
551 // timer_set_64(&mbtk_gpio_netled_timer,GPIO_NETLED_CREG_REFLASH_TIMER,0,T_MSEC);
552 //rex_set_timer(&mbtk_gpio_netled_timer, GPIO_NETLED_CREG_REFLASH_TIMER);
553 }
554 break;
555 case GPIO_NETLED_CONNECT:
556 {
557 led_val = ( (1 == led_val)? 0:1 );
558 mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, led_val);
559 start_led_timer(s_mbtk_gpio_netled_timer, s_mbtk_gpio_netled_timer_sig_value, GPIO_NETLED_CONNECT_REFLASH_TIMER);
560 // timer_set_64(&mbtk_gpio_netled_timer,GPIO_NETLED_CONNECT_REFLASH_TIMER,0,T_MSEC);
561 //rex_set_timer(&mbtk_gpio_netled_timer, GPIO_NETLED_CONNECT_REFLASH_TIMER);
562 }
563 break;
564 case GPIO_NETLED_LIGHT:
565 {
566 if( 1 != led_val )
567 {
568 led_val = 1;
569 mbtk_gpio_write_output(MBTK_GPIO_NETLED_N, 1);
570 }
571 }
572 break;
573 default:
574 RLOGE("GPIO: Unkown netled state !");
575 }
576}
577#endif