blob: 975c942450af5ac5c086d1d7ca1a3ba7162b8885 [file] [log] [blame]
l.yangb488ebc2023-08-21 17:58:00 +08001/*******************************************************
2*
3* @brief: none
4* @details: Add wakealrm and poweralarm api code
5* @author: l.yang
6* @date: 2023.8.17
7* @version: V1.0
8* @copyright: Copyright (c) MobileTek
9*
10*********************************************/
11
12#include<stdio.h>
13#include<stdlib.h>
14#include<unistd.h>
15#include<stdbool.h>
16#include<log/log.h>
17#include "liblog/lynq_deflog.h"
18#include <include/libpoweralarm.h>
19#include <pthread.h>
l.yang168f8d22023-09-06 14:16:13 +080020#include <string.h>
21#include <errno.h>
l.yangb488ebc2023-08-21 17:58:00 +080022
23#ifdef __cplusplus
24extern "C" {
25#endif
26
l.yangc9fc6df2024-06-20 14:16:23 +080027#include "sc_rtc_timer.h"
28
l.yangb488ebc2023-08-21 17:58:00 +080029#define USER_LOG_TAG "LYNQ_POWERALARM"
30
l.yang168f8d22023-09-06 14:16:13 +080031#define MIN_TIME 1
32#define MAX_TIME 268435456
33
l.yangb488ebc2023-08-21 17:58:00 +080034
l.yangc9fc6df2024-06-20 14:16:23 +080035//typedef int (*sc_rtc_timer_exp_cb)(unsigned int src_id, int rtc_id);
l.yang3a9c6612023-11-14 11:28:02 +080036typedef int (*lynq_wakealarm_add_cb)(unsigned int src_id, int rtc_id);
37
l.yangc9fc6df2024-06-20 14:16:23 +080038/*
l.yangb488ebc2023-08-21 17:58:00 +080039extern int sc_rtc_timer_init(void);
40extern int sc_rtc_timer_uninit(void );
41extern int sc_rtc_timer_add(int srcid, int rtc_id, unsigned long ulSec, sc_rtc_timer_exp_cb rtc_notify);
42extern int sc_rtc_timer_del(int srcid, int rtc_id);
43
l.yang168f8d22023-09-06 14:16:13 +080044extern int sc_rtc_timer_add_utc(int srcid, int rtc_id, struct tm *utc_sec, int wakeup, sc_rtc_timer_exp_cb rtc_notify);
l.yangb488ebc2023-08-21 17:58:00 +080045
l.yang989cbdb2023-09-18 11:29:39 +080046extern int sc_rtc_get_poweroff_alarm_modid(int src_id,char *name);
47
48extern int sc_rtc_add_poweroff_alarm(int srcid, int alarm_modid, int rtc_id, struct tm *utc_sec, sc_rtc_timer_exp_cb rtc_notify);
49
l.yangc9fc6df2024-06-20 14:16:23 +080050*/
l.yang42c000c2025-03-12 15:10:25 +080051extern void loglevel_init(void);
l.yang3a9c6612023-11-14 11:28:02 +080052
l.yangb488ebc2023-08-21 17:58:00 +080053/*****************************************
l.yang3a9c6612023-11-14 11:28:02 +080054* @brief:lynq_rtc_service_init
55* @param count [IN]:NA
l.yangb488ebc2023-08-21 17:58:00 +080056* @param sum [OUT]:NA
l.yang3a9c6612023-11-14 11:28:02 +080057* @return :success src_id, failed -1
l.yangb488ebc2023-08-21 17:58:00 +080058* @todo:
59* @see:NA
60* @warning:
l.yang3a9c6612023-11-14 11:28:02 +080061*****************************************/
62int lynq_rtc_service_init(void)
l.yangb488ebc2023-08-21 17:58:00 +080063{
l.yang3a9c6612023-11-14 11:28:02 +080064 int src_id = -1;
65
66 LYLOGSET(LOG_INFO);
67 LYLOGEINIT(USER_LOG_TAG);
l.yang42c000c2025-03-12 15:10:25 +080068 loglevel_init();
l.yang3a9c6612023-11-14 11:28:02 +080069 src_id = sc_rtc_timer_init();
70 if (src_id <= 0)
71 {
72 LYERRLOG("rtc_timer_init fail!");
73 return -1;
74 }
75 return src_id;
76
77}
78
79/*****************************************
80* @brief:lynq_rtc_service_init
81* @param count [IN]:NA
82* @param sum [OUT]:NA
83* @return :success src_id, failed -1
84* @todo:
85* @see:NA
86* @warning:
87*****************************************/
88int lynq_rtc_service_deinit(void)
89{
90 int ret = -1;
91 ret = sc_rtc_timer_uninit();
92 if(ret != 0)
93 {
94 LYINFLOG("Deinit failed!!!");
95 return -1;
96 }
97
l.yangb488ebc2023-08-21 17:58:00 +080098 return 0;
l.yang3a9c6612023-11-14 11:28:02 +080099
l.yangb488ebc2023-08-21 17:58:00 +0800100}
101
102
103/*****************************************
104* @brief:Set wakealarm time
l.yang3a9c6612023-11-14 11:28:02 +0800105* @param count [IN]:char *buffer,int src_id ...
l.yangb488ebc2023-08-21 17:58:00 +0800106* @param sum [OUT]:NA
107* @return :success 0, failed -1
108* @todo:
109* @see:NA
110* @warning:
111******************************************/
l.yang3a9c6612023-11-14 11:28:02 +0800112ssize_t wakealarm(char *buffer,int src_id,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify )
l.yangb488ebc2023-08-21 17:58:00 +0800113{
114 unsigned long time_sec = 0;
115 int ret = 0;
l.yang168f8d22023-09-06 14:16:13 +0800116 char *buf_bak = buffer;
l.yang12978e52025-03-19 17:45:15 +0800117
l.yang168f8d22023-09-06 14:16:13 +0800118 struct tm *wake_arlarm = NULL;
l.yang12978e52025-03-19 17:45:15 +0800119 struct tm wake_arlarm_tm;
120 char time_str[80] = {0};
121 int retry_count = 0;
122 const int MAX_RETRIES = 20;
123 memset(&wake_arlarm_tm, 0, sizeof(wake_arlarm_tm));
l.yangb488ebc2023-08-21 17:58:00 +0800124
l.yangb488ebc2023-08-21 17:58:00 +0800125 if(buffer == NULL)
126 {
127 LYINFLOG("Bad input parameter,exit!!!!");
128 return -1;
129 }
130
l.yang168f8d22023-09-06 14:16:13 +0800131 while(*buffer != '\0' )
132 {
133 if((*buffer < '0') || (*buffer > '9'))
134 {
135 LYERRLOG("Illeagel input buffer , there is invalid character!!!!");
136 return -1;
137 }
138 else
139 {
140 buffer++;
141 }
142 }
143
l.yang168f8d22023-09-06 14:16:13 +0800144 buffer = buf_bak;
145 time_sec = strtoul(buffer,NULL,10);
146 if(time_sec < MIN_TIME || time_sec > MAX_TIME || errno == ERANGE)
147 {
148 LYERRLOG("Illeagle input: too large or too small !!!");
149 return -1;
150 }
151
l.yang12978e52025-03-19 17:45:15 +0800152 while (retry_count < MAX_RETRIES)
l.yangb488ebc2023-08-21 17:58:00 +0800153 {
l.yang12978e52025-03-19 17:45:15 +0800154
155 time_t tmp_time = 0;
156 tmp_time = time(NULL);
157 tmp_time += time_sec;
158 wake_arlarm = localtime_r(&tmp_time,&wake_arlarm_tm);
159
160 strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", wake_arlarm);
161
162 ret = sc_rtc_timer_add_utc(src_id, rtc_id, wake_arlarm, 0, wakealarm_notify);
163 if (ret >= 0)
164 {
165 LYINFLOG("wakealarm set Wake alarm time success: %s\n", time_str);
166 LYINFLOG("Add rtc timer succeeded after %d attempts.", retry_count);
167 return 0;
168 }
169 retry_count++;
170 LYINFLOG("wakealarm set Wake alarm time: %s\n", time_str);
171 LYINFLOG("Add rtc timer failed. Retrying (%d/%d)...", retry_count, MAX_RETRIES);
172 usleep(10000);
173
l.yangb488ebc2023-08-21 17:58:00 +0800174 }
175
l.yang12978e52025-03-19 17:45:15 +0800176 LYINFLOG("Add rtc timer failed after %d attempts!!!!", MAX_RETRIES);
177 return -1;
l.yangb488ebc2023-08-21 17:58:00 +0800178}
179
180
181/*****************************************
182* @brief:set poweralarm time
l.yang3a9c6612023-11-14 11:28:02 +0800183* @param count [IN]:char *buffer, int srcid
l.yangb488ebc2023-08-21 17:58:00 +0800184* @param sum [OUT]:NA
185* @return :success 0, failed -1
186* @todo:
187* @see:NA
188* @warning:
189******************************************/
l.yang3a9c6612023-11-14 11:28:02 +0800190ssize_t poweralarm(char *buffer,int src_id )
l.yangb488ebc2023-08-21 17:58:00 +0800191{
l.yang3a9c6612023-11-14 11:28:02 +0800192
l.yangb488ebc2023-08-21 17:58:00 +0800193 unsigned long time_sec = 0;
194 int ret = 0;
l.yang168f8d22023-09-06 14:16:13 +0800195 char *buf_bak = buffer;
l.yang3a9c6612023-11-14 11:28:02 +0800196
l.yang989cbdb2023-09-18 11:29:39 +0800197 int alarmid = 0;
198 char username[8] = "user";
199 time_t tmp_time = 0;
200 struct tm *power_arlarm = NULL;
201 tmp_time = time(NULL);
202 localtime(&tmp_time);
l.yangb488ebc2023-08-21 17:58:00 +0800203 LYLOGSET(LOG_INFO);
204 LYLOGEINIT(USER_LOG_TAG);
l.yang168f8d22023-09-06 14:16:13 +0800205
l.yangb488ebc2023-08-21 17:58:00 +0800206 if(buffer == NULL)
207 {
l.yang168f8d22023-09-06 14:16:13 +0800208 LYERRLOG("Bad input parameter,exit!!!!");
l.yangb488ebc2023-08-21 17:58:00 +0800209 return -1;
210 }
l.yang168f8d22023-09-06 14:16:13 +0800211
212 while(*buffer != '\0' )
213 {
214 if(( *buffer < '0' )|| ( *buffer > '9'))
215 {
216 LYERRLOG("Illeagel input buffer , there is invalid character!!!!");
217 return -1;
218 }
219 else
220 {
221 buffer++;
222 }
223 }
224
l.yangb488ebc2023-08-21 17:58:00 +0800225
l.yang168f8d22023-09-06 14:16:13 +0800226 buffer = buf_bak;
227 time_sec = strtoul(buffer,NULL,10);
l.yang989cbdb2023-09-18 11:29:39 +0800228
229 tmp_time += time_sec;
230 power_arlarm = localtime(&tmp_time);
231
l.yang168f8d22023-09-06 14:16:13 +0800232 if(time_sec < MIN_TIME || time_sec > MAX_TIME || errno == ERANGE)
233 {
234 LYERRLOG("Illeagle input: too large or too small !!!");
235 return -1;
236 }
l.yangb488ebc2023-08-21 17:58:00 +0800237
l.yang4c4e7382023-08-22 16:13:09 +0800238 LYINFLOG("Set poweralarm %lu seconds",time_sec);
l.yang989cbdb2023-09-18 11:29:39 +0800239
l.yang3a9c6612023-11-14 11:28:02 +0800240
241 alarmid = sc_rtc_get_poweroff_alarm_modid(src_id, username);
l.yang989cbdb2023-09-18 11:29:39 +0800242 if(alarmid < 0)
l.yangb488ebc2023-08-21 17:58:00 +0800243 {
l.yang989cbdb2023-09-18 11:29:39 +0800244 LYERRLOG("Get poweroff alarm id failed !!!");
l.yangb488ebc2023-08-21 17:58:00 +0800245 return -1;
246 }
l.yang989cbdb2023-09-18 11:29:39 +0800247
l.yang3a9c6612023-11-14 11:28:02 +0800248 ret = sc_rtc_add_poweroff_alarm(src_id, alarmid, 0, power_arlarm, NULL);
l.yang989cbdb2023-09-18 11:29:39 +0800249 if(ret < 0)
250 {
251 LYERRLOG("Set power alarm failed !!!");
252 return -1;
253 }
254 LYINFLOG("Set power alarm success !!!!");
l.yangb488ebc2023-08-21 17:58:00 +0800255
l.yangb488ebc2023-08-21 17:58:00 +0800256 return 0;
l.yang989cbdb2023-09-18 11:29:39 +0800257
l.yangb488ebc2023-08-21 17:58:00 +0800258}
259
260/**********************************************
261* @brief:cancel_wakealarm,
l.yang3a9c6612023-11-14 11:28:02 +0800262* @param count [IN]:int src_id, int rtc_id
l.yangb488ebc2023-08-21 17:58:00 +0800263* @param sum [OUT]:NA
264* @return :success 0, failed -1
265* @todo:
266* @see:NA
267* @warning:
268********************************************/
l.yang3a9c6612023-11-14 11:28:02 +0800269ssize_t cancel_wakealarm(int src_id, int rtc_id)
l.yangb488ebc2023-08-21 17:58:00 +0800270{
271 int ret = 0;
272
273 LYINFLOG("Enter cancel_wakealarm ");
l.yang3a9c6612023-11-14 11:28:02 +0800274 ret = sc_rtc_timer_del(src_id, rtc_id);
l.yangb488ebc2023-08-21 17:58:00 +0800275 if(ret < 0)
276 {
l.yang168f8d22023-09-06 14:16:13 +0800277 LYERRLOG("Del wakealarm failed!!!");
l.yangb488ebc2023-08-21 17:58:00 +0800278 return -1;
279 }
l.yang3a9c6612023-11-14 11:28:02 +0800280 LYINFLOG("Cancel success ");
l.yangb488ebc2023-08-21 17:58:00 +0800281 return 0;
282
283}
284
285
286/*****************************************
287* @brief:lynq_set_poweralarm
l.yang3a9c6612023-11-14 11:28:02 +0800288* @param count [IN]:unsigned long time_sec , int src_id
l.yangb488ebc2023-08-21 17:58:00 +0800289* @param sum [OUT]:NA
290* @return :success 0, failed -1
291* @todo:
292* @see:NA
293* @warning:
294******************************************/
l.yang3a9c6612023-11-14 11:28:02 +0800295int lynq_set_poweralarm(unsigned long time_sec,int src_id)
l.yangb488ebc2023-08-21 17:58:00 +0800296{
l.yang168f8d22023-09-06 14:16:13 +0800297
l.yangb488ebc2023-08-21 17:58:00 +0800298 int ret = 0;
l.yang989cbdb2023-09-18 11:29:39 +0800299 int alarmid = 0;
300 char username[8] = "user";
301
302 time_t tmp_time = 0;
303 struct tm *power_arlarm = NULL;
304 tmp_time = time(NULL);
305 localtime(&tmp_time);
l.yang989cbdb2023-09-18 11:29:39 +0800306
l.yang3a9c6612023-11-14 11:28:02 +0800307
l.yang989cbdb2023-09-18 11:29:39 +0800308 tmp_time += time_sec;
309 power_arlarm = localtime(&tmp_time);
l.yang3a9c6612023-11-14 11:28:02 +0800310
l.yang168f8d22023-09-06 14:16:13 +0800311 if(time_sec < MIN_TIME || time_sec > MAX_TIME )
312 {
313 LYERRLOG("Illeagle input: too large or too small !!!");
314 return -1;
315 }
l.yang989cbdb2023-09-18 11:29:39 +0800316
317 LYINFLOG("lynq_set_poweralarm %lu seconds",time_sec);
l.yang989cbdb2023-09-18 11:29:39 +0800318
l.yang3a9c6612023-11-14 11:28:02 +0800319
320 alarmid = sc_rtc_get_poweroff_alarm_modid(src_id, username);
l.yang989cbdb2023-09-18 11:29:39 +0800321 if(alarmid < 0)
322 {
323 LYERRLOG("Get poweroff alarm id failed !!!");
324 return -1;
325 }
326
l.yang3a9c6612023-11-14 11:28:02 +0800327 ret = sc_rtc_add_poweroff_alarm(src_id, alarmid, 0, power_arlarm, NULL);
l.yangb488ebc2023-08-21 17:58:00 +0800328 if(ret < 0)
329 {
l.yang989cbdb2023-09-18 11:29:39 +0800330 LYERRLOG("Set power alarm failed !!!");
l.yangb488ebc2023-08-21 17:58:00 +0800331 return -1;
332 }
333
l.yang989cbdb2023-09-18 11:29:39 +0800334 LYINFLOG("Set power alarm success !!!!");
335
l.yangb488ebc2023-08-21 17:58:00 +0800336 return 0;
l.yang989cbdb2023-09-18 11:29:39 +0800337
l.yangb488ebc2023-08-21 17:58:00 +0800338
339}
340
341
342/*****************************************
343* @brief:lynq_set_wakealarm
l.yang3a9c6612023-11-14 11:28:02 +0800344* @param count [IN]:unsigned long time_sec,....
l.yangb488ebc2023-08-21 17:58:00 +0800345* @param sum [OUT]:NA
346* @return :success 0, failed -1
347* @todo:
348* @see:NA
349* @warning:
350******************************************/
l.yang3a9c6612023-11-14 11:28:02 +0800351int lynq_set_wakealarm(unsigned long time_sec,int src_id,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify )
l.yangb488ebc2023-08-21 17:58:00 +0800352{
353 int ret = 0;
l.yang168f8d22023-09-06 14:16:13 +0800354 struct tm *wake_arlarm = NULL;
l.yang12978e52025-03-19 17:45:15 +0800355 char time_str[80] = {0};
356 int retry_count = 0;
357 const int MAX_RETRIES = 20;
358
359 struct tm wake_arlarm_tm;
360 memset(&wake_arlarm_tm, 0, sizeof(wake_arlarm_tm));
l.yang3a9c6612023-11-14 11:28:02 +0800361
l.yang168f8d22023-09-06 14:16:13 +0800362 if(time_sec < MIN_TIME || time_sec > MAX_TIME)
363 {
364 LYERRLOG("Illeagle input: too large or too small !!!");
365 return -1;
366 }
367
l.yang12978e52025-03-19 17:45:15 +0800368 while (retry_count < MAX_RETRIES)
l.yangb488ebc2023-08-21 17:58:00 +0800369 {
l.yang12978e52025-03-19 17:45:15 +0800370 time_t tmp_time = 0;
371 tmp_time = time(NULL);
372 tmp_time += time_sec;
373 wake_arlarm = localtime_r(&tmp_time,&wake_arlarm_tm);
l.yangb488ebc2023-08-21 17:58:00 +0800374
l.yang12978e52025-03-19 17:45:15 +0800375 strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", wake_arlarm);
376
377 ret = sc_rtc_timer_add_utc(src_id, rtc_id, wake_arlarm, 0, wakealarm_notify);
378 if (ret >= 0)
379 {
380 LYINFLOG("Wake alarm time success: %s\n", time_str);
381 LYINFLOG("Add rtc timer succeeded after %d attempts.", retry_count);
382 return 0;
383 }
384 retry_count++;
385 LYINFLOG("Wake alarm time: %s\n", time_str);
386 LYINFLOG("Add rtc timer failed. Retrying (%d/%d)...", retry_count, MAX_RETRIES);
387 usleep(10000);
388 }
389 LYINFLOG("Add rtc timer failed after %d attempts!!!!", MAX_RETRIES);
390 return -1;
l.yangb488ebc2023-08-21 17:58:00 +0800391}
392
l.yang3a9c6612023-11-14 11:28:02 +0800393
you.chen21c62b72023-09-08 09:41:11 +0800394DEFINE_LYNQ_LIB_LOG(LYNQ_POWERALARM)
l.yangb488ebc2023-08-21 17:58:00 +0800395
396#ifdef __cplusplus
397}
398#endif
399