blob: 78a7ec184831651b0100c0a04070c3b84cf77c24 [file] [log] [blame]
b.liu4e243dc2023-11-27 11:20:00 +08001#include "lynq-qser-autosuspend.h"
r.xiaoec113d12024-01-12 02:13:28 -08002
3#include <stdio.h>
4#include <unistd.h>
5#include <stddef.h>
6#include <sys/types.h>
7#include <sys/stat.h>
8#include <fcntl.h>
r.xiaocfd7c682024-01-22 03:59:46 -08009#include <pthread.h>
10#include <string.h>
r.xiao7000d212024-01-31 23:45:27 -080011#include <stdlib.h>
12#include <errno.h>
13#include <sys/epoll.h>
14#include <linux/input.h>
r.xiaoec113d12024-01-12 02:13:28 -080015
b.liu4e243dc2023-11-27 11:20:00 +080016#include "mbtk_type.h"
r.xiaoec113d12024-01-12 02:13:28 -080017#include "mbtk_log.h"
18#include "mbtk_info_api.h"
19
20/*
r.xiaod3256ae2024-02-28 23:20:55 -080021This module is system sleep, the system cannot sleep when the lock exists
22To verify whether it is in sleep state, it is necessary to test the power consumption
23Power management principle, as long as a wakelock lock exists, the system will not enter the Suspend state
24So the name can be arbitrarily chosen to indicate that such a lock is needed so that the system does not sleep
r.xiaoec113d12024-01-12 02:13:28 -080025*/
r.xiaod3256ae2024-02-28 23:20:55 -080026#if defined(MBTK_PLATFORM_ASR1806)
r.xiaoec113d12024-01-12 02:13:28 -080027#define MTBK_POWERIND "/system/etc/powerind" //1806
r.xiaod3256ae2024-02-28 23:20:55 -080028#else if defined(MBTK_PLATFORM_ASR1803)
29#define MTBK_POWERIND "/etc/powerind" //1803
30#endif
r.xiaoec113d12024-01-12 02:13:28 -080031
32static bool call_Off = FALSE;
33static bool nw_off = FALSE;
34static bool sms_off = FALSE;
35static bool data_off = FALSE;
36
r.xiao7000d212024-01-31 23:45:27 -080037static pthread_t lpm_t;
r.xiaocfd7c682024-01-22 03:59:46 -080038static int edge_t = 0;
r.xiao7000d212024-01-31 23:45:27 -080039static int epoll_fd_t = -1;
40static int fd_t = -1;
41static int socket_t[2];
r.xiaocfd7c682024-01-22 03:59:46 -080042
43typedef struct{
44 qser_lpm_wakeupin_data_t wakeupin;
45 qser_lpm_wakeupout_data_t wakeupout;
r.xiao7000d212024-01-31 23:45:27 -080046 qser_lpm_Handler_t wakehandle;
r.xiaocfd7c682024-01-22 03:59:46 -080047}lynq_wake_t;
48
49static lynq_wake_t lpm_init;
50
r.xiaoec113d12024-01-12 02:13:28 -080051
r.xiao7000d212024-01-31 23:45:27 -080052typedef struct
53{
54 int fd;
55 char name[64];
56} lock_name;
57
58#define LOCK_MAX_SIZE 129
59
60lock_name lynq_lock_name[LOCK_MAX_SIZE]={0};
61static bool autosleep_enable = FALSE;
62
63static mbtk_info_handle_t* whitelist_info_handle = NULL;
64
r.xiaoec113d12024-01-12 02:13:28 -080065static int powerrind_get()
66{
r.xiao7000d212024-01-31 23:45:27 -080067 char buffer[4];
r.xiaoec113d12024-01-12 02:13:28 -080068 int ret = 0;
69
70 int fd = open(MTBK_POWERIND, O_RDWR | O_SYNC, 0662);
71 if (fd != -1)
72 {
73 read(fd, buffer, strlen(buffer)+1);
74 close(fd);
75 }
76
77 ret = atoi(buffer);
78
79 return ret;
80}
81
r.xiao7000d212024-01-31 23:45:27 -080082#if 1
83static int sleep_epoll_deregister(int epoll_fd,int fd )
r.xiaoec113d12024-01-12 02:13:28 -080084{
r.xiao7000d212024-01-31 23:45:27 -080085 int ret;
86 do {
87 ret = epoll_ctl( epoll_fd, EPOLL_CTL_DEL, fd, NULL );
88 } while (ret < 0 && errno == EINTR);
89 return ret;
90}
r.xiaoec113d12024-01-12 02:13:28 -080091
r.xiao7000d212024-01-31 23:45:27 -080092static int sleep_epoll_register(int epoll_fd, int fd)
93{
94 struct epoll_event ev;
95 int ret, flags;
r.xiaoec113d12024-01-12 02:13:28 -080096
r.xiao7000d212024-01-31 23:45:27 -080097 /* important: make the fd non-blocking */
98 flags = fcntl(fd, F_GETFL);
99 fcntl(fd, F_SETFL, flags | O_NONBLOCK);
r.xiaoec113d12024-01-12 02:13:28 -0800100
r.xiao7000d212024-01-31 23:45:27 -0800101 ev.events = EPOLLIN;
102 ev.data.fd = fd;
103 do {
104 ret = epoll_ctl( epoll_fd, EPOLL_CTL_ADD, fd, &ev );
105 } while (ret < 0 && errno == EINTR);
106
107 return ret;
108}
109#endif
r.xiaoec113d12024-01-12 02:13:28 -0800110
b.liu5fa9e772023-11-23 18:00:55 +0800111int qser_autosuspend_enable(char enable)
112{
r.xiaoec113d12024-01-12 02:13:28 -0800113 //UNUSED(enable);
114
r.xiaod3256ae2024-02-28 23:20:55 -0800115 if((enable == 1) || enable == '1')
r.xiaoec113d12024-01-12 02:13:28 -0800116 {
117 if(!access("/sys/power/autosleep", W_OK))
118 {
119 system("echo mem > /sys/power/autosleep");
120 autosleep_enable = TRUE;
121 return 0;
122 }
123 else
124 {
125 LOGE("/sys/power/autosleep can not write.");
126 return -1;
127 }
128 }
r.xiaod3256ae2024-02-28 23:20:55 -0800129 else if((enable == 0) || enable == '0')
r.xiaoec113d12024-01-12 02:13:28 -0800130 {
131 if(!access("/sys/power/autosleep", W_OK))
132 {
133 system("echo off > /sys/power/autosleep");
134 autosleep_enable = FALSE;
135 return 0;
136 }
137 else
138 {
139 LOGE("/sys/power/autosleep can not write.");
140 return -1;
141 }
142 }
r.xiaod3256ae2024-02-28 23:20:55 -0800143 else
144 {
145 LOGE("qser_autosuspend_enablecan enable err.");
146 return -1;
147 }
b.liu5fa9e772023-11-23 18:00:55 +0800148
149 return 0;
150}
151
152int qser_wakelock_create(const char* name , size_t len)
153{
r.xiaoec113d12024-01-12 02:13:28 -0800154 //UNUSED(name);
155 //UNUSED(len);
r.xiaod3256ae2024-02-28 23:20:55 -0800156 int len_t;
r.xiaoec113d12024-01-12 02:13:28 -0800157
158 if(!autosleep_enable) {
159 LOGE("Autosleep not enable.");
160 return -1;
161 }
162
r.xiaod3256ae2024-02-28 23:20:55 -0800163 len_t = strlen(name);
164
165 if((name != NULL) && (len < 33) && (len_t < 33))
r.xiaoec113d12024-01-12 02:13:28 -0800166 {
167 int i;
r.xiaod3256ae2024-02-28 23:20:55 -0800168 //name
169 for(i=1 ;i<LOCK_MAX_SIZE;i++)
170 {
171 if(strcmp(lynq_lock_name[i].name, name) == 0)
172 {
173 LOGE("Repeated names.");
174 return -1;
175 }
176 }
177
r.xiao7000d212024-01-31 23:45:27 -0800178 for(i=1 ;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800179 {
180 if(lynq_lock_name[i].fd == 0)
181 break;
182 }
r.xiao7000d212024-01-31 23:45:27 -0800183
184 if (i >= LOCK_MAX_SIZE)
185 {
r.xiaob9cf0e62024-02-02 04:11:48 -0800186 LOGE("Fd is full.");
r.xiao7000d212024-01-31 23:45:27 -0800187 return -1;
188 }
189
r.xiaoec113d12024-01-12 02:13:28 -0800190 memcpy(lynq_lock_name[i].name, name, strlen(name)+1);
191 lynq_lock_name[i].fd = i;
r.xiaod3256ae2024-02-28 23:20:55 -0800192 return lynq_lock_name[i].fd -1;//Starting from scratch
r.xiaoec113d12024-01-12 02:13:28 -0800193 }
194 else
195 return -1;
b.liu5fa9e772023-11-23 18:00:55 +0800196
r.xiaod3256ae2024-02-28 23:20:55 -0800197 return -1;
b.liu5fa9e772023-11-23 18:00:55 +0800198}
199
200int qser_wakelock_lock(int fd)
201{
r.xiaoec113d12024-01-12 02:13:28 -0800202 //UNUSED(fd);
203
204 if(!autosleep_enable) {
205 LOGE("Autosleep not enable.");
206 return -1;
207 }
208
209 int i;
r.xiao7000d212024-01-31 23:45:27 -0800210 for(i=1;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800211 {
r.xiaod3256ae2024-02-28 23:20:55 -0800212 if(lynq_lock_name[i].fd -1 == fd)
r.xiaoec113d12024-01-12 02:13:28 -0800213 break;
214 }
r.xiao7000d212024-01-31 23:45:27 -0800215 if(i == LOCK_MAX_SIZE)
r.xiaod3256ae2024-02-28 23:20:55 -0800216 {
217 LOGE("LOCK_MAX_SIZE is full\n");
r.xiaoec113d12024-01-12 02:13:28 -0800218 return -1;
r.xiaod3256ae2024-02-28 23:20:55 -0800219 }
r.xiaoec113d12024-01-12 02:13:28 -0800220
221 if(!access("/sys/power/wake_lock", W_OK))
222 {
223 char cmd[128]={0};
224 sprintf(cmd, "echo %s > /sys/power/wake_lock", lynq_lock_name[i].name);
225 system(cmd);
226 return 0;
227 }
228 else
229 {
r.xiao7000d212024-01-31 23:45:27 -0800230 LOGE("/sys/power/wake_lock can not write.");
r.xiaoec113d12024-01-12 02:13:28 -0800231 return -1;
232 }
b.liu5fa9e772023-11-23 18:00:55 +0800233
234 return 0;
235}
236
237int qser_wakelock_unlock(int fd)
238{
r.xiaoec113d12024-01-12 02:13:28 -0800239 //UNUSED(fd);
240
241 if(!autosleep_enable) {
242 LOGE("Autosleep not enable.");
243 return -1;
244 }
245
246 int i;
r.xiao7000d212024-01-31 23:45:27 -0800247 for(i=1;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800248 {
r.xiaod3256ae2024-02-28 23:20:55 -0800249 if(lynq_lock_name[i].fd -1 == fd)
r.xiaoec113d12024-01-12 02:13:28 -0800250 break;
251 }
r.xiao7000d212024-01-31 23:45:27 -0800252 if(i == LOCK_MAX_SIZE)
r.xiaod3256ae2024-02-28 23:20:55 -0800253 {
254 LOGE("LOCK_MAX_SIZE is full\n");
r.xiaoec113d12024-01-12 02:13:28 -0800255 return -1;
r.xiaod3256ae2024-02-28 23:20:55 -0800256 }
r.xiaoec113d12024-01-12 02:13:28 -0800257
258 if(!access("/sys/power/wake_unlock", W_OK))
259 {
260 char cmd[128]={0};
261 sprintf(cmd, "echo %s > /sys/power/wake_unlock", lynq_lock_name[i].name);
262 system(cmd);
263 return 0;
264 }
265 else
266 {
r.xiao7000d212024-01-31 23:45:27 -0800267 LOGE("/sys/power/wake_unlock can not write.");
r.xiaoec113d12024-01-12 02:13:28 -0800268 return -1;
269 }
b.liu5fa9e772023-11-23 18:00:55 +0800270
271 return 0;
272}
273
274int qser_wakelock_destroy(int fd)
275{
r.xiaoec113d12024-01-12 02:13:28 -0800276 //UNUSED(fd);
277
278 if(!autosleep_enable) {
279 LOGE("Autosleep not enable.");
280 return -1;
281 }
282
283 int i;
r.xiao7000d212024-01-31 23:45:27 -0800284 for(i=1;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800285 {
r.xiaod3256ae2024-02-28 23:20:55 -0800286 if(lynq_lock_name[i].fd -1 == fd)
r.xiaoec113d12024-01-12 02:13:28 -0800287 break;
288 }
r.xiaod3256ae2024-02-28 23:20:55 -0800289
r.xiao7000d212024-01-31 23:45:27 -0800290 if(i == LOCK_MAX_SIZE)
r.xiaod3256ae2024-02-28 23:20:55 -0800291 {
292 LOGE("LOCK_MAX_SIZE is full\n");
r.xiaoec113d12024-01-12 02:13:28 -0800293 return -1;
r.xiaod3256ae2024-02-28 23:20:55 -0800294 }
r.xiaoec113d12024-01-12 02:13:28 -0800295 else
296 {
297 lynq_lock_name[i].fd = 0;
r.xiaod3256ae2024-02-28 23:20:55 -0800298 memset(lynq_lock_name[i].name, 0, 64);
r.xiaoec113d12024-01-12 02:13:28 -0800299 return 0;
300 }
b.liu5fa9e772023-11-23 18:00:55 +0800301
302 return 0;
303}
304
r.xiaocfd7c682024-01-22 03:59:46 -0800305void *threadFunction(void *arg)
306{
307 int pinValue;
r.xiaoce21a042024-02-03 19:35:19 -0800308 int i;
r.xiao7000d212024-01-31 23:45:27 -0800309 char buf[8] = {0};
310 struct input_event ev_input = { 0 };
311 const int size = sizeof(struct input_event);
r.xiaocfd7c682024-01-22 03:59:46 -0800312
r.xiao7000d212024-01-31 23:45:27 -0800313 epoll_fd_t = epoll_create(2);
314/*
315 struct epoll_event event;
316 memset(&event, 0, sizeof(struct epoll_event));
317 event.events = EPOLLIN | EPOLLET;
318 event.data.fd = open("/dev/input/event0", O_RDONLY); // 根据实际情况指定正确的GPIO设备文件名
319
320 fd_t = event.data.fd;
321 if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
322 {
323 LOGE("Failed to add GPIO device file.");
324 return NULL;
325 }
326
327 memset(&event, 0, sizeof(struct epoll_event));
328 event.events = EPOLLIN | EPOLLET;
329 event.data.fd = socket_t[0];
330 LOGE("threadFunction event.data.fd =[%d] ", event.data.fd);
331
332 if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
333 {
334 LOGE("Failed to add GPIO device file.");
335 return NULL;
336 }
337*/
338 fd_t = open("/dev/input/event0", O_RDONLY);
339
340 sleep_epoll_register(epoll_fd_t, fd_t);
341 sleep_epoll_register(epoll_fd_t, socket_t[1]);
342
343 while (true)
344 {
345 struct epoll_event events[2];
346 struct epoll_event ev;
347 int cmd = 0;
348
349 int numEvents = epoll_wait(epoll_fd_t, events, 2, -1);
350
r.xiaoce21a042024-02-03 19:35:19 -0800351 for (i = 0; i < numEvents; ++i)
r.xiao7000d212024-01-31 23:45:27 -0800352 {
353 if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP))
354 {
355 LOGE("Error on GPIO device.");
356 return NULL;
357 }
358 else if ((events[i].events & EPOLLIN) || (events[i].events & EPOLLET))
359 {
360 //handleInterrupt(events[i].data.fd);
361 if (events[i].data.fd == socket_t[1])
362 {
363 memset(buf, 0, sizeof(buf));
364 read(socket_t[1], buf, sizeof(buf));
365 if (1 == atoi(buf))
366 {
367 if(close(fd_t) == 0)
368 LOGI("close(fd_t)ing");
369
370 sleep_epoll_deregister(epoll_fd_t, socket_t[1]);
371 sleep_epoll_deregister(epoll_fd_t, fd_t);
372 /*
373 memset(&ev, 0, sizeof(struct epoll_event));
374 ev.events = EPOLLIN | EPOLLET;
375 ev.data.fd = socket_t[1];
376 epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
377
378 memset(&ev, 0, sizeof(struct epoll_event));
379 ev.events = EPOLLIN | EPOLLET;
380 ev.data.fd = fd_t;
381 epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
382 */
383 LOGI("do pthread_exit");
384 return NULL;
385 }
386 }
387 else if (events[i].data.fd == fd_t)
388 {
389 memset(&ev_input, 0x00, size);
390 read(fd_t, &ev_input, size);
391 LOGI("ev_input type = %x, code = %x, value = %x", ev_input.type, ev_input.code,ev_input.value);
392 if (ev_input.code == 2)
393 {
394 LOGI(">>>>ev_input.value = [%d]",ev_input.value);
395 pinValue = (int)ev_input.value;
396 edge_t = pinValue;
397 lpm_init.wakehandle(edge_t);
398 }
399 }
400 else
401 {
402 LOGE("Unknown events[i].data.fd = %d", events[i].data.fd);
403 }
404 }
405 }
406 }
r.xiaocfd7c682024-01-22 03:59:46 -0800407 return NULL;
408}
b.liu5fa9e772023-11-23 18:00:55 +0800409
r.xiaoec113d12024-01-12 02:13:28 -0800410int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
411{
r.xiaocfd7c682024-01-22 03:59:46 -0800412 //UNUSED(qser_lpm_handler);
413 //UNUSED(qser_lpm_cfg);
r.xiao7000d212024-01-31 23:45:27 -0800414 if (socketpair( AF_LOCAL, SOCK_STREAM, 0, socket_t ) < 0 )
415 {
416 LOGE("[qser_lpm_init] could not create thread control socket pair: %s", strerror(errno));
r.xiaoec113d12024-01-12 02:13:28 -0800417
r.xiao7000d212024-01-31 23:45:27 -0800418 /*close the control socket pair && Retry again.*/
419 if(socket_t[0] > 0)
420 {
421 close(socket_t[0] );
422 socket_t[0] = -1;
423 }
424
425 if(socket_t[1] > 0)
426 {
427 close(socket_t[1] );
428 socket_t[1] = -1;
429 }
430 return -1;
431 }
r.xiaocfd7c682024-01-22 03:59:46 -0800432 lpm_init.wakeupin.wakeupin_pin = qser_lpm_cfg->wakeupin.wakeupin_pin;
r.xiao7000d212024-01-31 23:45:27 -0800433 LOGI(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
r.xiaocfd7c682024-01-22 03:59:46 -0800434 lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->wakeupin.wakeupin_edge;
r.xiao7000d212024-01-31 23:45:27 -0800435 LOGI(">>edge = %d",lpm_init.wakeupin.wakeupin_edge);
r.xiaocfd7c682024-01-22 03:59:46 -0800436 edge_t = qser_lpm_cfg->wakeupin.wakeupin_edge;//保留原始状态值 0 or 1
r.xiao7000d212024-01-31 23:45:27 -0800437 lpm_init.wakehandle = qser_lpm_handler;
r.xiaoec113d12024-01-12 02:13:28 -0800438
r.xiao7000d212024-01-31 23:45:27 -0800439 pthread_attr_t thread_attr;
440 pthread_attr_init(&thread_attr);
441
r.xiaocfd7c682024-01-22 03:59:46 -0800442 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
443 {
r.xiao7000d212024-01-31 23:45:27 -0800444 LOGE("pthread_attr_setdetachstate() fail");
r.xiaocfd7c682024-01-22 03:59:46 -0800445 return -1;
446 }
r.xiao7000d212024-01-31 23:45:27 -0800447
448 if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
449 //if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
r.xiaocfd7c682024-01-22 03:59:46 -0800450 {
r.xiao7000d212024-01-31 23:45:27 -0800451 LOGE("qser_lpm_init can't create thread");
r.xiaocfd7c682024-01-22 03:59:46 -0800452 return -1;
453 }
r.xiaoec113d12024-01-12 02:13:28 -0800454
r.xiao7000d212024-01-31 23:45:27 -0800455 pthread_attr_destroy(&thread_attr);
r.xiaocfd7c682024-01-22 03:59:46 -0800456
r.xiao7000d212024-01-31 23:45:27 -0800457 //if (edge_t != qser_lpm_cfg->wakeupin.wakeupin_edge)//说明有变化,并且和原来的值不相同
458 //qser_lpm_handler(edge_t);
r.xiaoec113d12024-01-12 02:13:28 -0800459
460 return 0;
461}
462
463int qser_lpm_deinit(void)
464{
r.xiao7000d212024-01-31 23:45:27 -0800465 char buf[4]={0};
r.xiaoec113d12024-01-12 02:13:28 -0800466
r.xiao7000d212024-01-31 23:45:27 -0800467 if (fd_t == -1)
468 return 0;
r.xiaocfd7c682024-01-22 03:59:46 -0800469
r.xiao7000d212024-01-31 23:45:27 -0800470 if (fd_t != -1)
r.xiaocfd7c682024-01-22 03:59:46 -0800471 {
r.xiao7000d212024-01-31 23:45:27 -0800472 //char cmd = 1;
473 strcpy(buf, "1");
474 void* dummy = NULL;
475 write( socket_t[0], buf, sizeof(buf) );
476 //pthread_join(lpm_t, &dummy);
477
478 sleep(1);
479 // close the control socket pair
480 if(socket_t[0] > 0)
481 {
482 close(socket_t[0] );
483 socket_t[0] = -1;
484 }
485 if(socket_t[1] > 0)
486 {
487 close(socket_t[1] );
488 socket_t[1] = -1;
489 }
490
491 //重置还原
492 fd_t = -1;
493
r.xiaocfd7c682024-01-22 03:59:46 -0800494 }
495
r.xiaoec113d12024-01-12 02:13:28 -0800496 return 0;
497}
498
499/*
500例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
501其中PS DATA目前暂时不支持,只是保留了这个标志位;
502AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA
5030 means resume all.
504目标文件"/system/etc/powerind"
505如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
506
r.xiaoec113d12024-01-12 02:13:28 -0800507*/
508
509int qser_whitelist_set(char* whitelish)
510{
511 //UNUSED(whitelish);
512 uint32 on = 0;
513 int call_t, nw_t, data_t, sms_t, tmp;
514
515 int len = strlen(whitelish);
516
517 if (len != 4)
518 {
r.xiao7000d212024-01-31 23:45:27 -0800519 LOGE("whitelish num error num=[%d]",len);
r.xiaocfd7c682024-01-22 03:59:46 -0800520 return -1;
r.xiaoec113d12024-01-12 02:13:28 -0800521 }
522
523 tmp = atoi(whitelish);
524
525 call_t = tmp/1000;
526 nw_t = tmp%1000/100;
527 data_t = tmp%1000%100/10;
528 sms_t = tmp%1000%100%10;
529
530 if (call_t == 1)
531 call_Off = TRUE;
532 else
533 call_Off = FALSE;
534
535 if (nw_t == 1)
536 nw_off = TRUE;
537 else
538 nw_off = FALSE;
539
540 if (data_t == 1)
541 data_off = TRUE;
542 else
543 data_off = FALSE;
544
545 if (sms_t == 1)
546 sms_off = TRUE;
547 else
548 sms_off = FALSE;
549
550 if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
551 {
r.xiao7000d212024-01-31 23:45:27 -0800552 on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内
r.xiaoec113d12024-01-12 02:13:28 -0800553 }
554 else
555 {
556 if (call_Off == TRUE)
557 call_t = 8;
558 else
559 call_t = 0;
560
561 if (nw_off == TRUE)
562 nw_t = 1;
563 else
564 nw_t = 0;
565
566 if (data_off == TRUE)
567 data_t = 16;
568 else
569 data_t = 0;
570
571 if (sms_off == TRUE)
572 sms_t = 4;
573 else
574 sms_t = 0;
575
r.xiao7000d212024-01-31 23:45:27 -0800576 on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
r.xiaoec113d12024-01-12 02:13:28 -0800577 }
578
579 if(whitelist_info_handle == NULL)
580 {
581 whitelist_info_handle = mbtk_info_handle_get();
582 if(whitelist_info_handle)
583 {
r.xiao7000d212024-01-31 23:45:27 -0800584 LOGI("creat whitelist_info_handle is success");
r.xiaoec113d12024-01-12 02:13:28 -0800585 }
586 else
587 {
r.xiao7000d212024-01-31 23:45:27 -0800588 LOGE("creat whitelist_info_handle is fail");
r.xiaoec113d12024-01-12 02:13:28 -0800589 return -1;
590 }
591 }
592
593 int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
594 if(err)
595 {
r.xiao7000d212024-01-31 23:45:27 -0800596 LOGE("whitelist_info_handle Error : %d", err);
r.xiaoec113d12024-01-12 02:13:28 -0800597 return -1;
598 }
r.xiaoec113d12024-01-12 02:13:28 -0800599
600 return 0;
601}
602
603
604int qser_whitelist_get(char* whitelish)
605{
606 //UNUSED(whitelish);
r.xiaocfd7c682024-01-22 03:59:46 -0800607 char list[10]={0};
r.xiaoec113d12024-01-12 02:13:28 -0800608 int call_t, nw_t, data_t, sms_t;
r.xiao7000d212024-01-31 23:45:27 -0800609 int get_tmp;
r.xiaoec113d12024-01-12 02:13:28 -0800610
r.xiao7000d212024-01-31 23:45:27 -0800611 get_tmp = powerrind_get();
612 //LOGI(">>>get_tmp: %d",get_tmp);
r.xiaoec113d12024-01-12 02:13:28 -0800613
r.xiao7000d212024-01-31 23:45:27 -0800614 //call 8 nw 1 data 16 sms 4 SIM的上报会一直被包含在内
615 switch(get_tmp)
616 {
617 case 0:
618 sprintf(list, "%d%d%d%d", 1, 1, 1, 1);
619 break;
620 case 8:
621 sprintf(list, "%d%d%d%d", 0, 1, 1, 1);
622 break;
623 case 1:
624 sprintf(list, "%d%d%d%d", 1, 0, 1, 1);
625 break;
626 case 16:
627 sprintf(list, "%d%d%d%d", 1, 1, 0, 1);
628 break;
629 case 4:
630 sprintf(list, "%d%d%d%d", 1, 1, 1, 0);
631 break;
632
633 case 9:
634 sprintf(list, "%d%d%d%d", 0, 0, 1, 1);
635 break;
636 case 24:
637 sprintf(list, "%d%d%d%d", 0, 1, 0, 1);
638 break;
639 case 12:
640 sprintf(list, "%d%d%d%d", 0, 1, 1, 0);
641 break;
642 case 17:
643 sprintf(list, "%d%d%d%d", 1, 0, 0, 1);
644 break;
645 case 5:
646 sprintf(list, "%d%d%d%d", 1, 0, 1, 0);
647 break;
648 case 20:
649 sprintf(list, "%d%d%d%d", 1, 1, 0, 0);
650 break;
651
652 case 25:
653 sprintf(list, "%d%d%d%d", 0, 0, 0, 1);
654 break;
655 case 13:
656 sprintf(list, "%d%d%d%d", 0, 0, 1, 0);
657 break;
658 case 28:
659 sprintf(list, "%d%d%d%d", 0, 1, 0, 0);
660 break;
661 case 21:
662 sprintf(list, "%d%d%d%d", 1, 0, 0, 0);
663 break;
664
665 case 29:
666 sprintf(list, "%d%d%d%d", 0, 0, 0, 0);
667 break;
668
669 default :
670 LOGE("qser_whitelist_get is error");
671 break;
672 }
673
674 //LOGI(">>>get list: %s",list);
r.xiaocfd7c682024-01-22 03:59:46 -0800675 strncpy(whitelish, list, strlen(list));
r.xiaoec113d12024-01-12 02:13:28 -0800676
677 if(whitelist_info_handle != NULL)
678 {
679 mbtk_info_handle_free(&whitelist_info_handle);
r.xiao7000d212024-01-31 23:45:27 -0800680 LOGI("deinit whitelist_info_handle is succuess");
r.xiaoec113d12024-01-12 02:13:28 -0800681 }
682
683 return 0;
684}
685