doubao_chat/lib/net/turing/turing_alarm.c

165 lines
3.7 KiB
C

#include <string.h>
#include <stdlib.h>
#include "printf.h"
#include <time.h>
#include "turing.h"
#include "turing_alarm.h"
#include "os/os_api.h"
#include "system/timer.h"
typedef struct __turing_alarm_node {
void *priv;
u16 id;
u8 set;
u8 cyc;
} turing_alarm_node;
static turing_alarm_node turing_alarm[MAX_ALARM_NUM];
static OS_MUTEX alarm_mutex;
static void turing_alarm_callback(void *param)
{
turing_alarm_node *node = (turing_alarm_node *)param;
void *priv = NULL;
priv = node->priv;
if (!node->cyc) {
os_mutex_pend(&alarm_mutex, 0);
node->id = 0;
node->priv = NULL;
node->set = 0;
node->cyc = 0;
os_mutex_post(&alarm_mutex);
}
if (!turing_app_get_connect_status()) {
return;
}
}
int turing_alarm_set(const char *p_date, const char *p_time, const char *p_cyc, const char *second, void *priv)
{
int ret = -1;
if (!p_date || !p_time || !p_cyc) {
return ret;
}
struct tm tmSet;
time_t tSet;
time_t tNow = time(NULL) + 28800;
const char *buf = p_date;
u32 timeout = 0;
memset(&tmSet, 0, sizeof(struct tm));
if (second && strlen(second) > 0) {
timeout = atoi(second);
} else {
tmSet.tm_year = atoi(buf);
buf = strstr(buf, "-");
if (!buf) {
goto __exit;
}
tmSet.tm_mon = atoi(++buf);
buf = strstr(buf, "-");
if (!buf) {
goto __exit;
}
tmSet.tm_mday = atoi(++buf);
if ((tmSet.tm_year > 2036) || (tmSet.tm_year < 2019)) {
goto __exit;
}
tmSet.tm_year -= 1900;
if ((tmSet.tm_mon == 0) || (tmSet.tm_mon > 12)) {
goto __exit;
}
tmSet.tm_mon -= 1;
if ((tmSet.tm_mday == 0) || (tmSet.tm_mday > 31)) {
goto __exit;
}
// time
buf = p_time;
tmSet.tm_hour = atoi(buf);
buf = strstr(buf, ":");
if (!buf) {
goto __exit;
}
tmSet.tm_min = atoi(++buf);
buf = strstr(buf, ":");
if (!buf) {
goto __exit;
}
tmSet.tm_sec = atoi(++buf);
if (tmSet.tm_hour > 23) {
goto __exit;
}
if (tmSet.tm_min > 59) {
goto __exit;
}
if (tmSet.tm_sec > 59) {
goto __exit;
}
// set
tSet = mktime(&tmSet);
if (tSet <= tNow) {
goto __exit;
}
timeout = tSet - tNow;
}
os_mutex_pend(&alarm_mutex, 0);
for (int i = 0; i < MAX_ALARM_NUM; ++i) {
if (!turing_alarm[i].set) {
turing_alarm[i].set = 1;
turing_alarm[i].priv = priv;
if (*p_cyc == '1') {
turing_alarm[i].cyc = 1;
turing_alarm[i].id = sys_timeout_add(&turing_alarm[i], turing_alarm_callback, timeout * 1000);
} else {
turing_alarm[i].cyc = 0;
turing_alarm[i].id = sys_timer_add(&turing_alarm[i], turing_alarm_callback, timeout * 1000);
}
ret = 0;
break;
}
}
os_mutex_post(&alarm_mutex);
__exit:
return ret;
}
void turing_alarm_init(void)
{
if (!os_mutex_valid(&alarm_mutex)) {
os_mutex_create(&alarm_mutex);
}
}
void turing_alarm_del_all(void)
{
os_mutex_pend(&alarm_mutex, 0);
for (int i = 0; i < MAX_ALARM_NUM; ++i) {
if (turing_alarm[i].set) {
sys_timeout_del(turing_alarm[i].id);
turing_alarm[i].id = 0;
turing_alarm[i].priv = NULL;
turing_alarm[i].set = 0;
turing_alarm[i].cyc = 0;
}
}
os_mutex_post(&alarm_mutex);
}