Tasmota/lib/libesp32/berry_tasmota/src/be_cron_class.cpp
s-hadinger 01eade7e47
Berry native class array (#15178)
* Berry simplified classes in Flash

* Remove be_load_lvgl_classes
2022-03-19 14:27:03 +01:00

76 lines
2.2 KiB
C++

/********************************************************************
* Light_state class - abstract light state
*
* Handles all states and events for a virtual light.
* Can be eventually subclassed to handle a physical light.
*
*******************************************************************/
#include "be_constobj.h"
#include "be_mapping.h"
#include "ccronexpr.h"
extern uint32_t LocalTime(void);
static const uint32_t START_VALID_TIME = 1451602800; // Time is synced and after 2016-01-01
// create
static cron_expr* ccronexpr_init(struct bvm* vm, char* expr) {
cron_expr* cron = new cron_expr();
const char* error = nullptr;
cron_parse_expr(expr, cron, &error);
if (error) {
be_raise(vm, "value_error", error); // TODO any way to pass VM?
}
return cron;
}
BE_FUNC_CTYPE_DECLARE(ccronexpr_init, "+.p", "@s")
// deinit
static void ccronexpr_deinit(cron_expr* cron) {
delete cron;
}
BE_FUNC_CTYPE_DECLARE(ccronexpr_deinit, "", ".")
// next
// Returns the next trigger time, or 0 if rtc is invalid
static uint32_t ccronexpr_next(cron_expr* cron) {
uint32_t now_local = LocalTime();
return now_local > START_VALID_TIME ? cron_next(cron, now_local) : 0;
}
BE_FUNC_CTYPE_DECLARE(ccronexpr_next, "i", ".")
// time_reached
// Compares as uint32_t (Berry only handles int32_t) to avoid the 2038 bug
// Also prevents from triggering an event if the clock is not set (i.e. year is 1970)
static bool ccronexpr_time_reached(uint32_t date) {
uint32_t now_local = LocalTime();
bool reached = (date <= now_local);
return now_local > START_VALID_TIME ? reached : false;
}
BE_FUNC_CTYPE_DECLARE(ccronexpr_time_reached, "b", "i")
// now (local time)
static uint32_t ccronexpr_now(void) {
return LocalTime();
}
BE_FUNC_CTYPE_DECLARE(ccronexpr_now, "i", "")
#include "be_fixed_be_class_ccronexpr.h"
/* @const_object_info_begin
class be_class_ccronexpr (scope: global, name: ccronexpr) {
.p, var // pointer to cron_expr*
init, ctype_func(ccronexpr_init)
// deinit, ctype_func(ccronexpr_deinit)
next, ctype_func(ccronexpr_next)
time_reached, static_ctype_func(ccronexpr_time_reached)
now, static_ctype_func(ccronexpr_now)
}
@const_object_info_end */