blob: 26f57be28e9b585b01e14bd496d95113468409e3 [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
27#define USER_LOG_TAG "LYNQ_POWERALARM"
28
l.yang168f8d22023-09-06 14:16:13 +080029#define MIN_TIME 1
30#define MAX_TIME 268435456
31
l.yangb488ebc2023-08-21 17:58:00 +080032
l.yangb488ebc2023-08-21 17:58:00 +080033typedef int (*sc_rtc_timer_exp_cb)(unsigned int src_id, int rtc_id);
l.yang3a9c6612023-11-14 11:28:02 +080034typedef int (*lynq_wakealarm_add_cb)(unsigned int src_id, int rtc_id);
35
l.yangb488ebc2023-08-21 17:58:00 +080036extern int sc_rtc_timer_init(void);
37extern int sc_rtc_timer_uninit(void );
38extern int sc_rtc_timer_add(int srcid, int rtc_id, unsigned long ulSec, sc_rtc_timer_exp_cb rtc_notify);
39extern int sc_rtc_timer_del(int srcid, int rtc_id);
40
l.yang168f8d22023-09-06 14:16:13 +080041extern 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 +080042
l.yang989cbdb2023-09-18 11:29:39 +080043extern int sc_rtc_get_poweroff_alarm_modid(int src_id,char *name);
44
45extern 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);
46
l.yang3a9c6612023-11-14 11:28:02 +080047
l.yangb488ebc2023-08-21 17:58:00 +080048/*****************************************
l.yang3a9c6612023-11-14 11:28:02 +080049* @brief:lynq_rtc_service_init
50* @param count [IN]:NA
l.yangb488ebc2023-08-21 17:58:00 +080051* @param sum [OUT]:NA
l.yang3a9c6612023-11-14 11:28:02 +080052* @return :success src_id, failed -1
l.yangb488ebc2023-08-21 17:58:00 +080053* @todo:
54* @see:NA
55* @warning:
l.yang3a9c6612023-11-14 11:28:02 +080056*****************************************/
57int lynq_rtc_service_init(void)
l.yangb488ebc2023-08-21 17:58:00 +080058{
l.yang3a9c6612023-11-14 11:28:02 +080059 int src_id = -1;
60
61 LYLOGSET(LOG_INFO);
62 LYLOGEINIT(USER_LOG_TAG);
63
64 src_id = sc_rtc_timer_init();
65 if (src_id <= 0)
66 {
67 LYERRLOG("rtc_timer_init fail!");
68 return -1;
69 }
70 return src_id;
71
72}
73
74/*****************************************
75* @brief:lynq_rtc_service_init
76* @param count [IN]:NA
77* @param sum [OUT]:NA
78* @return :success src_id, failed -1
79* @todo:
80* @see:NA
81* @warning:
82*****************************************/
83int lynq_rtc_service_deinit(void)
84{
85 int ret = -1;
86 ret = sc_rtc_timer_uninit();
87 if(ret != 0)
88 {
89 LYINFLOG("Deinit failed!!!");
90 return -1;
91 }
92
l.yangb488ebc2023-08-21 17:58:00 +080093 return 0;
l.yang3a9c6612023-11-14 11:28:02 +080094
l.yangb488ebc2023-08-21 17:58:00 +080095}
96
97
98/*****************************************
99* @brief:Set wakealarm time
l.yang3a9c6612023-11-14 11:28:02 +0800100* @param count [IN]:char *buffer,int src_id ...
l.yangb488ebc2023-08-21 17:58:00 +0800101* @param sum [OUT]:NA
102* @return :success 0, failed -1
103* @todo:
104* @see:NA
105* @warning:
106******************************************/
l.yang3a9c6612023-11-14 11:28:02 +0800107ssize_t wakealarm(char *buffer,int src_id,int rtc_id,lynq_wakealarm_add_cb wakealarm_notify )
l.yangb488ebc2023-08-21 17:58:00 +0800108{
109 unsigned long time_sec = 0;
110 int ret = 0;
l.yang168f8d22023-09-06 14:16:13 +0800111 char *buf_bak = buffer;
112 time_t tmp_time = 0;
l.yang989cbdb2023-09-18 11:29:39 +0800113
l.yang168f8d22023-09-06 14:16:13 +0800114 struct tm *wake_arlarm = NULL;
115 tmp_time = time(NULL);
l.yang989cbdb2023-09-18 11:29:39 +0800116 localtime(&tmp_time);
l.yangb488ebc2023-08-21 17:58:00 +0800117
l.yangb488ebc2023-08-21 17:58:00 +0800118 if(buffer == NULL)
119 {
120 LYINFLOG("Bad input parameter,exit!!!!");
121 return -1;
122 }
123
l.yang168f8d22023-09-06 14:16:13 +0800124 while(*buffer != '\0' )
125 {
126 if((*buffer < '0') || (*buffer > '9'))
127 {
128 LYERRLOG("Illeagel input buffer , there is invalid character!!!!");
129 return -1;
130 }
131 else
132 {
133 buffer++;
134 }
135 }
136
137
138 buffer = buf_bak;
139 time_sec = strtoul(buffer,NULL,10);
140 if(time_sec < MIN_TIME || time_sec > MAX_TIME || errno == ERANGE)
141 {
142 LYERRLOG("Illeagle input: too large or too small !!!");
143 return -1;
144 }
145
146 tmp_time += time_sec;
147 wake_arlarm = localtime(&tmp_time);
l.yangb488ebc2023-08-21 17:58:00 +0800148
l.yang4c4e7382023-08-22 16:13:09 +0800149 LYINFLOG("Set wakealarm %lu seconds ",time_sec);
l.yang3a9c6612023-11-14 11:28:02 +0800150
151 ret = sc_rtc_timer_add_utc(src_id, rtc_id,wake_arlarm,0,wakealarm_notify);
l.yangb488ebc2023-08-21 17:58:00 +0800152 if(ret < 0)
153 {
154 LYINFLOG("Add rtc timer failed!!!!");
155 return -1;
156 }
157
158 LYINFLOG("Set wakealarm success !!!");
159
l.yangb488ebc2023-08-21 17:58:00 +0800160 return 0;
161
162}
163
164
165/*****************************************
166* @brief:set poweralarm time
l.yang3a9c6612023-11-14 11:28:02 +0800167* @param count [IN]:char *buffer, int srcid
l.yangb488ebc2023-08-21 17:58:00 +0800168* @param sum [OUT]:NA
169* @return :success 0, failed -1
170* @todo:
171* @see:NA
172* @warning:
173******************************************/
l.yang3a9c6612023-11-14 11:28:02 +0800174ssize_t poweralarm(char *buffer,int src_id )
l.yangb488ebc2023-08-21 17:58:00 +0800175{
l.yang3a9c6612023-11-14 11:28:02 +0800176
l.yangb488ebc2023-08-21 17:58:00 +0800177 unsigned long time_sec = 0;
178 int ret = 0;
l.yang168f8d22023-09-06 14:16:13 +0800179 char *buf_bak = buffer;
l.yang3a9c6612023-11-14 11:28:02 +0800180
l.yang989cbdb2023-09-18 11:29:39 +0800181 int alarmid = 0;
182 char username[8] = "user";
183 time_t tmp_time = 0;
184 struct tm *power_arlarm = NULL;
185 tmp_time = time(NULL);
186 localtime(&tmp_time);
l.yangb488ebc2023-08-21 17:58:00 +0800187 LYLOGSET(LOG_INFO);
188 LYLOGEINIT(USER_LOG_TAG);
l.yang168f8d22023-09-06 14:16:13 +0800189
l.yangb488ebc2023-08-21 17:58:00 +0800190 if(buffer == NULL)
191 {
l.yang168f8d22023-09-06 14:16:13 +0800192 LYERRLOG("Bad input parameter,exit!!!!");
l.yangb488ebc2023-08-21 17:58:00 +0800193 return -1;
194 }
l.yang168f8d22023-09-06 14:16:13 +0800195
196 while(*buffer != '\0' )
197 {
198 if(( *buffer < '0' )|| ( *buffer > '9'))
199 {
200 LYERRLOG("Illeagel input buffer , there is invalid character!!!!");
201 return -1;
202 }
203 else
204 {
205 buffer++;
206 }
207 }
208
l.yangb488ebc2023-08-21 17:58:00 +0800209
l.yang168f8d22023-09-06 14:16:13 +0800210 buffer = buf_bak;
211 time_sec = strtoul(buffer,NULL,10);
l.yang989cbdb2023-09-18 11:29:39 +0800212
213 tmp_time += time_sec;
214 power_arlarm = localtime(&tmp_time);
215
l.yang168f8d22023-09-06 14:16:13 +0800216 if(time_sec < MIN_TIME || time_sec > MAX_TIME || errno == ERANGE)
217 {
218 LYERRLOG("Illeagle input: too large or too small !!!");
219 return -1;
220 }
l.yangb488ebc2023-08-21 17:58:00 +0800221
l.yang4c4e7382023-08-22 16:13:09 +0800222 LYINFLOG("Set poweralarm %lu seconds",time_sec);
l.yang989cbdb2023-09-18 11:29:39 +0800223
l.yang3a9c6612023-11-14 11:28:02 +0800224
225 alarmid = sc_rtc_get_poweroff_alarm_modid(src_id, username);
l.yang989cbdb2023-09-18 11:29:39 +0800226 if(alarmid < 0)
l.yangb488ebc2023-08-21 17:58:00 +0800227 {
l.yang989cbdb2023-09-18 11:29:39 +0800228 LYERRLOG("Get poweroff alarm id failed !!!");
l.yangb488ebc2023-08-21 17:58:00 +0800229 return -1;
230 }
l.yang989cbdb2023-09-18 11:29:39 +0800231
l.yang3a9c6612023-11-14 11:28:02 +0800232 ret = sc_rtc_add_poweroff_alarm(src_id, alarmid, 0, power_arlarm, NULL);
l.yang989cbdb2023-09-18 11:29:39 +0800233 if(ret < 0)
234 {
235 LYERRLOG("Set power alarm failed !!!");
236 return -1;
237 }
238 LYINFLOG("Set power alarm success !!!!");
l.yangb488ebc2023-08-21 17:58:00 +0800239
l.yangb488ebc2023-08-21 17:58:00 +0800240 return 0;
l.yang989cbdb2023-09-18 11:29:39 +0800241
l.yangb488ebc2023-08-21 17:58:00 +0800242}
243
244/**********************************************
245* @brief:cancel_wakealarm,
l.yang3a9c6612023-11-14 11:28:02 +0800246* @param count [IN]:int src_id, int rtc_id
l.yangb488ebc2023-08-21 17:58:00 +0800247* @param sum [OUT]:NA
248* @return :success 0, failed -1
249* @todo:
250* @see:NA
251* @warning:
252********************************************/
l.yang3a9c6612023-11-14 11:28:02 +0800253ssize_t cancel_wakealarm(int src_id, int rtc_id)
l.yangb488ebc2023-08-21 17:58:00 +0800254{
255 int ret = 0;
256
257 LYINFLOG("Enter cancel_wakealarm ");
l.yang3a9c6612023-11-14 11:28:02 +0800258 ret = sc_rtc_timer_del(src_id, rtc_id);
l.yangb488ebc2023-08-21 17:58:00 +0800259 if(ret < 0)
260 {
l.yang168f8d22023-09-06 14:16:13 +0800261 LYERRLOG("Del wakealarm failed!!!");
l.yangb488ebc2023-08-21 17:58:00 +0800262 return -1;
263 }
l.yang3a9c6612023-11-14 11:28:02 +0800264 LYINFLOG("Cancel success ");
l.yangb488ebc2023-08-21 17:58:00 +0800265 return 0;
266
267}
268
269
270/*****************************************
271* @brief:lynq_set_poweralarm
l.yang3a9c6612023-11-14 11:28:02 +0800272* @param count [IN]:unsigned long time_sec , int src_id
l.yangb488ebc2023-08-21 17:58:00 +0800273* @param sum [OUT]:NA
274* @return :success 0, failed -1
275* @todo:
276* @see:NA
277* @warning:
278******************************************/
l.yang3a9c6612023-11-14 11:28:02 +0800279int lynq_set_poweralarm(unsigned long time_sec,int src_id)
l.yangb488ebc2023-08-21 17:58:00 +0800280{
l.yang168f8d22023-09-06 14:16:13 +0800281
l.yangb488ebc2023-08-21 17:58:00 +0800282 int ret = 0;
l.yang989cbdb2023-09-18 11:29:39 +0800283 int alarmid = 0;
284 char username[8] = "user";
285
286 time_t tmp_time = 0;
287 struct tm *power_arlarm = NULL;
288 tmp_time = time(NULL);
289 localtime(&tmp_time);
l.yang989cbdb2023-09-18 11:29:39 +0800290
l.yang3a9c6612023-11-14 11:28:02 +0800291
l.yang989cbdb2023-09-18 11:29:39 +0800292 tmp_time += time_sec;
293 power_arlarm = localtime(&tmp_time);
l.yang3a9c6612023-11-14 11:28:02 +0800294
l.yang168f8d22023-09-06 14:16:13 +0800295 if(time_sec < MIN_TIME || time_sec > MAX_TIME )
296 {
297 LYERRLOG("Illeagle input: too large or too small !!!");
298 return -1;
299 }
l.yang989cbdb2023-09-18 11:29:39 +0800300
301 LYINFLOG("lynq_set_poweralarm %lu seconds",time_sec);
l.yang989cbdb2023-09-18 11:29:39 +0800302
l.yang3a9c6612023-11-14 11:28:02 +0800303
304 alarmid = sc_rtc_get_poweroff_alarm_modid(src_id, username);
l.yang989cbdb2023-09-18 11:29:39 +0800305 if(alarmid < 0)
306 {
307 LYERRLOG("Get poweroff alarm id failed !!!");
308 return -1;
309 }
310
l.yang3a9c6612023-11-14 11:28:02 +0800311 ret = sc_rtc_add_poweroff_alarm(src_id, alarmid, 0, power_arlarm, NULL);
l.yangb488ebc2023-08-21 17:58:00 +0800312 if(ret < 0)
313 {
l.yang989cbdb2023-09-18 11:29:39 +0800314 LYERRLOG("Set power alarm failed !!!");
l.yangb488ebc2023-08-21 17:58:00 +0800315 return -1;
316 }
317
l.yang989cbdb2023-09-18 11:29:39 +0800318 LYINFLOG("Set power alarm success !!!!");
319
l.yangb488ebc2023-08-21 17:58:00 +0800320 return 0;
l.yang989cbdb2023-09-18 11:29:39 +0800321
l.yangb488ebc2023-08-21 17:58:00 +0800322
323}
324
325
326/*****************************************
327* @brief:lynq_set_wakealarm
l.yang3a9c6612023-11-14 11:28:02 +0800328* @param count [IN]:unsigned long time_sec,....
l.yangb488ebc2023-08-21 17:58:00 +0800329* @param sum [OUT]:NA
330* @return :success 0, failed -1
331* @todo:
332* @see:NA
333* @warning:
334******************************************/
l.yang3a9c6612023-11-14 11:28:02 +0800335int 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 +0800336{
337 int ret = 0;
l.yang4c4e7382023-08-22 16:13:09 +0800338
l.yang168f8d22023-09-06 14:16:13 +0800339 time_t tmp_time = 0;
l.yang168f8d22023-09-06 14:16:13 +0800340 struct tm *wake_arlarm = NULL;
341 tmp_time = time(NULL);
l.yang989cbdb2023-09-18 11:29:39 +0800342 localtime(&tmp_time);
l.yang3a9c6612023-11-14 11:28:02 +0800343
l.yang168f8d22023-09-06 14:16:13 +0800344 if(time_sec < MIN_TIME || time_sec > MAX_TIME)
345 {
346 LYERRLOG("Illeagle input: too large or too small !!!");
347 return -1;
348 }
349
l.yang4c4e7382023-08-22 16:13:09 +0800350 LYINFLOG("lynq_set_wakealarm %lu seconds ",time_sec);
l.yang3a9c6612023-11-14 11:28:02 +0800351
l.yang168f8d22023-09-06 14:16:13 +0800352 tmp_time += time_sec;
353 wake_arlarm = localtime(&tmp_time);
354 LYINFLOG("Set wakealarm %lu seconds ",time_sec);
355
l.yang3a9c6612023-11-14 11:28:02 +0800356 ret = sc_rtc_timer_add_utc(src_id, rtc_id,wake_arlarm,0,wakealarm_notify);
l.yangb488ebc2023-08-21 17:58:00 +0800357 if(ret < 0)
358 {
359 LYINFLOG("Add rtc timer failed!!!!");
360 return -1;
361 }
362
363 LYINFLOG("Set wakealarm success !!!");
l.yangb488ebc2023-08-21 17:58:00 +0800364
365 return 0;
366
367}
368
l.yang3a9c6612023-11-14 11:28:02 +0800369
you.chen21c62b72023-09-08 09:41:11 +0800370DEFINE_LYNQ_LIB_LOG(LYNQ_POWERALARM)
l.yangb488ebc2023-08-21 17:58:00 +0800371
372#ifdef __cplusplus
373}
374#endif
375