From ce54201e47c6bdc27e26c905aeaf9fcb46386167 Mon Sep 17 00:00:00 2001 From: JDierkse Date: Wed, 10 Jun 2020 09:28:05 +0200 Subject: [PATCH] Add Triggers --- Makefile.conf | 7 +++ Timer/Trigger.cpp | 145 ++++++++++++++++++++++++++++++++++++++++++++++ include/Trigger.h | 41 +++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 Timer/Trigger.cpp create mode 100644 include/Trigger.h diff --git a/Makefile.conf b/Makefile.conf index 9b94990..7dcd865 100644 --- a/Makefile.conf +++ b/Makefile.conf @@ -6,6 +6,13 @@ LFLAGS += -lUtilities LFLAGS += -L$(ROOTPATH)/Libraries/Utilities/lib/$(ARCH) CFLAGS += -I$(ROOTPATH)/Libraries/Utilities/include +LFLAGS += -lDateTime +LFLAGS += -L$(ROOTPATH)/Libraries/DateTime/lib/$(ARCH) +CFLAGS += -I$(ROOTPATH)/Libraries/DateTime/include + +CFLAGS += -I$(ROOTPATH)/Libraries/asio/asio/include +CFLAGS += -I$(ROOTPATH)/Libraries/SimpleSignal + LFLAGS += -lTimer LFLAGS += -L$(ROOTPATH)/lib/$(ARCH) CFLAGS += -I$(ROOTPATH) -I$(ROOTPATH)/include diff --git a/Timer/Trigger.cpp b/Timer/Trigger.cpp new file mode 100644 index 0000000..7513bd0 --- /dev/null +++ b/Timer/Trigger.cpp @@ -0,0 +1,145 @@ +#include "Trigger.h" +#include +#include + + +namespace Timer { + +asio::system_timer::time_point Trigger::Second() +{ + return Second(std::chrono::system_clock::now()); +} + +asio::system_timer::time_point Trigger::Minute() +{ + return Minute(std::chrono::system_clock::now()); +} + +asio::system_timer::time_point Trigger::Hour() +{ + return Hour(std::chrono::system_clock::now()); +} + +asio::system_timer::time_point Trigger::Day() +{ + return Day(std::chrono::system_clock::now()); +} + +asio::system_timer::time_point Trigger::Seconds(int seconds) +{ + return Seconds(std::chrono::system_clock::now(), seconds); +} + +asio::system_timer::time_point Trigger::Minutes(int minutes) +{ + return Minutes(std::chrono::system_clock::now(), minutes); +} + +asio::system_timer::time_point Trigger::Hours(int hours) +{ + return Hours(std::chrono::system_clock::now(), hours); +} + +asio::system_timer::time_point Trigger::SecondsMultitude(int seconds) +{ + return SecondsMultitude(std::chrono::system_clock::now(), seconds); +} + +asio::system_timer::time_point Trigger::MinutesMultitude(int minutes) +{ + return MinutesMultitude(std::chrono::system_clock::now(), minutes); +} + +asio::system_timer::time_point Trigger::HoursMultitude(int hours) +{ + return HoursMultitude(std::chrono::system_clock::now(), hours); +} + +asio::system_timer::time_point Trigger::Second(std::chrono::time_point base) +{ + return Seconds(base, 1); +} + +asio::system_timer::time_point Trigger::Minute(std::chrono::time_point base) +{ + return Minutes(base, 1); +} + +asio::system_timer::time_point Trigger::Hour(std::chrono::time_point base) +{ + return Hours(base, 1); +} + +asio::system_timer::time_point Trigger::Day(std::chrono::time_point base) +{ + asio::system_timer::time_point tomorrow = base + std::chrono::hours(24) + std::chrono::seconds(DateTime::GetUTCOffset()); + auto daypoint = date::floor(tomorrow); // This call works on UTC + auto yearMonthDay = date::year_month_day(daypoint); + + DateTime::DateTime dateTime{ + static_cast(yearMonthDay.year()), + static_cast(yearMonthDay.month()), + static_cast(yearMonthDay.day()) + }; + + return DateTime::DateTime_to_time_point(dateTime, date::current_zone()); +} + +asio::system_timer::time_point Trigger::Seconds(std::chrono::time_point base, int seconds) +{ + asio::system_timer::time_point now = base + std::chrono::seconds(1); + auto time = date::make_time(now.time_since_epoch()); + asio::system_timer::duration targetTime = time.hours() + time.minutes() + time.seconds() + std::chrono::seconds(seconds); + return asio::system_timer::time_point(targetTime); +} + +asio::system_timer::time_point Trigger::Minutes(std::chrono::time_point base, int minutes) +{ + asio::system_timer::time_point now = base + std::chrono::seconds(1); + auto time = date::make_time(now.time_since_epoch()); + asio::system_timer::duration targetTime = time.hours() + time.minutes() + std::chrono::minutes(minutes); + return asio::system_timer::time_point(targetTime); +} + +asio::system_timer::time_point Trigger::Hours(std::chrono::time_point base, int hours) +{ + asio::system_timer::time_point now = base + std::chrono::seconds(1); + auto time = date::make_time(now.time_since_epoch()); + asio::system_timer::duration targetTime = time.hours() + time.minutes() + std::chrono::hours(hours); + return asio::system_timer::time_point(targetTime); +} + +asio::system_timer::time_point Trigger::SecondsMultitude(std::chrono::time_point base, int seconds) +{ + asio::system_timer::time_point now = base + std::chrono::seconds(1); + auto time = date::make_time(now.time_since_epoch()); + + auto baseSeconds = time.seconds() - std::chrono::seconds(time.seconds().count() % seconds); + + asio::system_timer::duration targetTime = time.hours() + time.minutes() + baseSeconds + std::chrono::seconds(seconds); + return asio::system_timer::time_point(targetTime); +} + +asio::system_timer::time_point Trigger::MinutesMultitude(std::chrono::time_point base, int minutes) +{ + asio::system_timer::time_point now = base + std::chrono::seconds(1); + auto time = date::make_time(now.time_since_epoch()); + + auto baseMinutes = time.minutes() - std::chrono::minutes(time.minutes().count() % minutes); + + asio::system_timer::duration targetTime = time.hours() + baseMinutes + std::chrono::minutes(minutes); + return asio::system_timer::time_point(targetTime); +} + +asio::system_timer::time_point Trigger::HoursMultitude(std::chrono::time_point base, int hours) +{ + asio::system_timer::time_point now = base + std::chrono::seconds(1); + auto time = date::make_time(now.time_since_epoch()); + + auto baseHours = time.hours() - std::chrono::hours(time.hours().count() % hours); + + asio::system_timer::duration targetTime = baseHours + std::chrono::hours(hours); + return asio::system_timer::time_point(targetTime); +} + +} // namespace Timer diff --git a/include/Trigger.h b/include/Trigger.h new file mode 100644 index 0000000..34c4658 --- /dev/null +++ b/include/Trigger.h @@ -0,0 +1,41 @@ +#ifndef TRIGGER_H +#define TRIGGER_H + +#include + + +namespace Timer { + +class Trigger +{ +public: + static asio::system_timer::time_point Second(); + static asio::system_timer::time_point Minute(); + static asio::system_timer::time_point Hour(); + static asio::system_timer::time_point Day(); + + static asio::system_timer::time_point Seconds(int seconds); + static asio::system_timer::time_point Minutes(int minutes); + static asio::system_timer::time_point Hours(int hours); + + static asio::system_timer::time_point SecondsMultitude(int seconds); + static asio::system_timer::time_point MinutesMultitude(int minutes); + static asio::system_timer::time_point HoursMultitude(int hours); + + static asio::system_timer::time_point Second(std::chrono::time_point base); + static asio::system_timer::time_point Minute(std::chrono::time_point base); + static asio::system_timer::time_point Hour(std::chrono::time_point base); + static asio::system_timer::time_point Day(std::chrono::time_point base); + + static asio::system_timer::time_point Seconds(std::chrono::time_point base, int seconds); + static asio::system_timer::time_point Minutes(std::chrono::time_point base, int minutes); + static asio::system_timer::time_point Hours(std::chrono::time_point base, int hours); + + static asio::system_timer::time_point SecondsMultitude(std::chrono::time_point base, int seconds); + static asio::system_timer::time_point MinutesMultitude(std::chrono::time_point base, int minutes); + static asio::system_timer::time_point HoursMultitude(std::chrono::time_point base, int hours); +}; + +} // namespace Timer + +#endif // TRIGGER_H