62 #include <amxc/amxc.h>
64 #include <amxc/amxc_macros.h>
71 amxc_htable_it_clean(&item->
hit, NULL);
79 return item1->
next.sec - item2->
next.sec;
83 amxc_llist_it_t* it = NULL;
111 amxc_string_t strsignal;
113 const char*
id = amxc_htable_it_get_key(&item->
hit);
114 amxc_var_init(&data);
115 amxc_var_set_type(&data, AMXC_VAR_ID_HTABLE);
116 amxc_var_add_key(cstring_t, &data,
"id",
id);
117 amxc_string_init(&strsignal, 0);
119 amxc_string_setf(&strsignal,
"%s:%s", signal,
id);
122 amxc_var_add_key(uint32_t, &data,
"duration", duration);
125 amxc_var_add_key(cstring_t, &data,
"reason", signal);
138 amxc_string_clean(&strsignal);
139 amxc_var_clean(&data);
154 amxc_ts_t prev = { 0, 0, 0};
155 uint32_t duration = 0;
159 when_false(item->
enabled, exit);
169 amxc_ts_to_local(&now);
175 amxc_ts_t end = { 0, 0, 0};
177 duration = end.sec - prev.sec;
180 prev.sec += duration;
181 if(prev.sec > now.sec) {
182 if(item->
timer == NULL) {
202 amxc_llist_it_t* it = amxc_llist_get_first(&scheduler->
ordered_items);
205 uint32_t duration = 0;
207 when_false(timer == scheduler->
timer, exit);
211 amxc_ts_to_local(&now);
214 while(it != NULL && item->
next.sec <= now.sec) {
218 amxc_ts_t end = { 0, 0, 0};
220 duration = end.sec - now.sec;
231 it = amxc_llist_it_get_next(it);
243 amxc_string_t strsignal;
244 amxc_string_init(&strsignal, 0);
246 amxc_string_setf(&strsignal,
"%s:%s", signal,
id);
249 amxc_string_clean(&strsignal);
253 amxc_string_t strsignal;
255 amxc_string_init(&strsignal, 0);
257 amxc_string_setf(&strsignal,
"%s:%s", signal,
id);
267 amxc_string_clean(&strsignal);
274 amxc_htable_it_t* hit = NULL;
277 when_null(scheduler, exit);
278 when_str_empty(
id, exit);
280 hit = amxc_htable_get(&scheduler->
items,
id);
283 enabled = item != NULL? item->
enabled:
true;
287 when_null(item, exit);
304 amxc_ts_to_local(&now);
309 amxc_htable_insert(&scheduler->
items,
id, &item->
hit);
322 when_null(scheduler, exit);
324 when_null(*scheduler, exit);
333 when_null(scheduler, exit);
334 when_null(*scheduler, exit);
347 when_null(scheduler, exit);
353 scheduler->
timer = NULL;
355 amxc_htable_init(&scheduler->
items, 5);
365 when_null(scheduler, exit);
375 amxc_htable_clean(&scheduler->
items, NULL);
384 when_null(scheduler, exit);
385 when_true_status(scheduler->
sigmngr.
enabled == enable, exit, rv = 0);
406 when_null(scheduler, exit);
408 when_true_status(use_local_time == scheduler->
use_local_time, exit, rv = 0);
424 when_null(scheduler, exit);
427 amxc_ts_to_local(&now);
454 amxc_string_t signal;
455 amxc_htable_it_t* hit = NULL;
458 amxc_string_init(&signal, 0);
459 when_null(scheduler, exit);
461 if((
id == NULL) || (*
id == 0)) {
467 hit = amxc_htable_get(&scheduler->
items,
id);
468 when_null(hit, exit);
470 when_null(item, exit);
472 amxc_string_setf(&signal,
"start:%s",
id);
474 when_failed(rv, exit);
475 amxc_string_setf(&signal,
"stop:%s",
id);
477 when_failed(rv, exit);
478 amxc_string_setf(&signal,
"trigger:%s",
id);
482 amxc_string_clean(&signal);
491 amxc_string_t signal;
492 amxc_htable_it_t* hit = NULL;
495 amxc_string_init(&signal, 0);
496 when_null(scheduler, exit);
498 if((
id == NULL) || (*
id == 0)) {
505 hit = amxc_htable_get(&scheduler->
items,
id);
506 when_null(hit, exit);
508 when_null(item, exit);
510 amxc_string_setf(&signal,
"start:%s",
id);
512 when_failed(rv, exit);
513 amxc_string_setf(&signal,
"stop:%s",
id);
515 when_failed(rv, exit);
516 amxc_string_setf(&signal,
"trigger:%s",
id);
520 amxc_string_clean(&signal);
526 const char* cron_expr,
531 when_str_empty(cron_expr, exit);
534 when_null(item, exit);
539 when_failed(rv, exit);
544 if((rv != 0) && (item != NULL)) {
552 const char* cron_begin,
553 const char* cron_end) {
557 when_str_empty(cron_begin, exit);
558 when_str_empty(cron_end, exit);
561 when_null(item, exit);
566 when_failed(rv, exit);
568 when_failed(rv, exit);
573 if((rv != 0) && (item != NULL)) {
582 const char* days_of_week,
587 when_str_empty(days_of_week, exit);
589 if((time == NULL) || (*time == 0)) {
594 when_null(item, exit);
599 when_failed(rv, exit);
604 if((rv != 0) && (item != NULL)) {
612 const char* start_time,
613 const char* end_time,
614 const char* days_of_week) {
618 when_str_empty(days_of_week, exit);
620 if((start_time == NULL) || (*start_time == 0)) {
621 start_time =
"00:00";
624 if((end_time == NULL) || (*end_time == 0)) {
629 when_null(item, exit);
634 when_failed(rv, exit);
636 when_failed(rv, exit);
641 if((rv != 0) && (item != NULL)) {
651 amxc_htable_it_t* hit = NULL;
654 when_null(scheduler, exit);
655 when_str_empty(
id, exit);
657 hit = amxc_htable_get(&scheduler->
items,
id);
658 when_null_status(hit, exit, rv = 0);
661 amxc_htable_it_take(hit);
684 amxc_htable_it_t* hit = NULL;
687 when_null(scheduler, exit);
688 when_str_empty(
id, exit);
690 hit = amxc_htable_get(&scheduler->
items,
id);
691 when_null(hit, exit);
693 when_true_status(enable == item->
enabled, exit, rv = 0);
714 when_null(scheduler, exit);
static void amxp_scheduler_insert(amxp_scheduler_t *scheduler, const char *id, amxp_scheduler_item_t *item)
static amxp_scheduler_item_t * amxp_scheduler_create_or_fetch(amxp_scheduler_t *scheduler, const char *id, uint32_t duration)
static void amxp_scheduler_remove_signal(amxp_scheduler_t *scheduler, const char *signal, const char *id)
static void amxp_scheduler_reset_timer(amxp_scheduler_t *scheduler)
static void amxp_schedule_item_delete(amxc_llist_it_t *it)
static void amxp_scheduler_add_signal(amxp_scheduler_t *scheduler, const char *signal, const char *id)
static void amxp_scheduler_trigger(amxp_timer_t *timer, void *priv)
static void amxp_scheduler_check_item(amxp_scheduler_t *scheduler, amxp_scheduler_item_t *item)
static void amxp_scheduler_item_stop(UNUSED amxp_timer_t *timer, void *priv)
static void amxp_scheduler_emit(amxp_scheduler_t *scheduler, amxp_scheduler_item_t *item, const char *signal, uint32_t duration, bool trigger)
static int amxp_scheduler_compare_items(amxc_llist_it_t *it1, amxc_llist_it_t *it2)
int amxp_cron_build_weekly(amxp_cron_expr_t *target, const char *time, const char *days_of_week)
Builds a weekly cron expression that is triggered at a certain time on certain days of the week.
int64_t amxp_cron_time_until_next(const amxp_cron_expr_t *expr, bool local)
Calculates the time in seconds until next trigger of a parsed cron expression occurs.
int amxp_cron_parse_expr(amxp_cron_expr_t *target, const char *expression, const char **error)
Allocates and initializes an amxp_cron_expr_t structures and parses the given cron expression.
void amxp_cron_clean(amxp_cron_expr_t *cron_expr)
Resets the amxp_cron_expr_t structure to the initialized state.
int amxp_cron_prev(const amxp_cron_expr_t *expr, const amxc_ts_t *ref, amxc_ts_t *next)
Calculates the previous trigger time for a parsed cron expression.
int amxp_cron_next(const amxp_cron_expr_t *expr, const amxc_ts_t *ref, amxc_ts_t *next)
Calculates the next trigger time for a parsed cron expression.
int amxp_scheduler_connect(amxp_scheduler_t *scheduler, const char *id, amxp_slot_fn_t fn, void *priv)
Connects a callback function to the scheduler.
int amxp_scheduler_use_local_time(amxp_scheduler_t *scheduler, bool use_local_time)
Use local time or UTC time in calculation for next trigger times.
int amxp_scheduler_set_weekly_begin_end_item(amxp_scheduler_t *scheduler, const char *id, const char *start_time, const char *end_time, const char *days_of_week)
Adds a schedule item or updates a schedule item using a start time, end time and list of week days.
int amxp_scheduler_enable_item(amxp_scheduler_t *scheduler, const char *id, bool enable)
Enables or disable a schedule item.
int amxp_scheduler_new(amxp_scheduler_t **scheduler)
Allocates a amxp_scheduler_t structures and initializes to an empty scheduler.
int amxp_scheduler_set_weekly_item(amxp_scheduler_t *scheduler, const char *id, const char *time, const char *days_of_week, uint32_t duration)
Adds a schedule item or updates a schedule item using a time and list of week days.
void amxp_scheduler_delete(amxp_scheduler_t **scheduler)
Frees the previously allocated amxp_scheduler_t structure.
int amxp_scheduler_disconnect(amxp_scheduler_t *scheduler, const char *id, amxp_slot_fn_t fn)
Disconnects a callback function from the scheduler.
int amxp_scheduler_remove_item(amxp_scheduler_t *scheduler, const char *id)
Removes a schedule item from the scheduler.
amxp_signal_mngr_t * amxp_scheduler_get_sigmngr(amxp_scheduler_t *scheduler)
Gets the signal manager of a scheduler.
int amxp_scheduler_enable(amxp_scheduler_t *scheduler, bool enable)
Enables or disable the scheduler.
int amxp_scheduler_set_cron_begin_end_item(amxp_scheduler_t *scheduler, const char *id, const char *cron_begin, const char *cron_end)
Adds a schedule item or updates a schedule item using a cron expressions.
int amxp_scheduler_set_cron_item(amxp_scheduler_t *scheduler, const char *id, const char *cron_expr, uint32_t duration)
Adds a schedule item or updates a schedule item using a cron expression.
int amxp_scheduler_init(amxp_scheduler_t *scheduler)
Initializes a amxp_scheduler_t to an empty scheduler.
int amxp_scheduler_update(amxp_scheduler_t *scheduler)
Forces recalculation of the schedule items' next occurrence time.
void amxp_scheduler_clean(amxp_scheduler_t *scheduler)
Cleans the scheduler.
int amxp_sigmngr_add_signal(amxp_signal_mngr_t *const sig_mngr, const char *name)
Adds a signal to a signal manager.
int amxp_sigmngr_init(amxp_signal_mngr_t *sig_mngr)
Initializing function, initializes members of the amxp_signal_mngr_t structure.
int amxp_sigmngr_clean(amxp_signal_mngr_t *sig_mngr)
Clean-up functions, cleans-up all members of a amxp_signal_mngr_t structure.
void amxp_sigmngr_trigger_signal(amxp_signal_mngr_t *const sig_mngr, const char *name, const amxc_var_t *const data)
Triggers a signal.
int amxp_sigmngr_remove_signal(amxp_signal_mngr_t *const sig_mngr, const char *name)
Removes a signal from a signal manager.
amxp_signal_t * amxp_sigmngr_find_signal(const amxp_signal_mngr_t *const sig_mngr, const char *name)
Get the pointer to the signal.
int amxp_sigmngr_enable(amxp_signal_mngr_t *const sig_mngr, bool enable)
Enables or disables the signal manager.
int amxp_signal_delete(amxp_signal_t **signal)
Destructor function, deletes a signal.
int amxp_sigmngr_emit_signal(const amxp_signal_mngr_t *const sig_mngr, const char *name, const amxc_var_t *const data)
Emits a signal.
void amxp_slot_disconnect_all(amxp_slot_fn_t fn)
Disconnects a slot from all signals it was connected to.
int amxp_slot_disconnect(amxp_signal_mngr_t *const sig_mngr, const char *const sig_name, amxp_slot_fn_t fn)
Disconnects a slot from (a) signal(s).
void(* amxp_slot_fn_t)(const char *const sig_name, const amxc_var_t *const data, void *const priv)
Slot callback function signature.
int amxp_slot_connect(amxp_signal_mngr_t *const sig_mngr, const char *const sig_name, const char *const expression, amxp_slot_fn_t fn, void *const priv)
Connects a slot (function) to a named signal of a signal manager.
int amxp_timer_start(amxp_timer_t *timer, unsigned int timeout_msec)
Starts or resets a timer.
int amxp_timer_stop(amxp_timer_t *timer)
Stops the timer.
void amxp_timer_delete(amxp_timer_t **timer)
Deletes a timer.
int amxp_timer_new(amxp_timer_t **timer, amxp_timer_cb_t cb, void *priv)
Allocate and initializes a new timer.
Structure containing the signal manager information.
Structure containing the signal information.
Structure containing a schedule item.
amxp_cron_expr_t end_cron
Structure containing a scheduler.
amxp_signal_mngr_t sigmngr
amxc_llist_t ordered_items
static amxp_signal_mngr_t * sigmngr