|
-
-
-
-
-
- #include "TimeAlarms.h"
-
- #define IS_ONESHOT true
- #define IS_REPEAT false
-
-
-
-
-
- AlarmClass::AlarmClass()
- {
- Mode.isEnabled = Mode.isOneShot = 0;
- Mode.alarmType = dtNotAllocated;
- value = nextTrigger = 0;
- onTickHandler = NULL;
- }
-
-
-
-
-
- void AlarmClass::updateNextTrigger()
- {
- if (Mode.isEnabled) {
- time_t time = now();
- if (dtIsAlarm(Mode.alarmType) && nextTrigger <= time) {
-
- if (Mode.alarmType == dtExplicitAlarm) {
-
- nextTrigger = value;
- } else if (Mode.alarmType == dtDailyAlarm) {
-
- if (value + previousMidnight(now()) <= time) {
-
- nextTrigger = value + nextMidnight(time);
- } else {
-
- nextTrigger = value + previousMidnight(time);
- }
- } else if (Mode.alarmType == dtWeeklyAlarm) {
-
- if ((value + previousSunday(now())) <= time) {
-
- nextTrigger = value + nextSunday(time);
- } else {
-
- nextTrigger = value + previousSunday(time);
- }
- } else {
-
- Mode.isEnabled = false;
- }
- }
- if (Mode.alarmType == dtTimer) {
-
- nextTrigger = time + value;
- }
- }
- }
-
-
-
-
- TimeAlarmsClass::TimeAlarmsClass()
- {
- isServicing = false;
- for(uint8_t id = 0; id < dtNBR_ALARMS; id++) {
- free(id);
- }
- }
-
- void TimeAlarmsClass::enable(AlarmID_t ID)
- {
- if (isAllocated(ID)) {
- if (( !(dtUseAbsoluteValue(Alarm[ID].Mode.alarmType) && (Alarm[ID].value == 0)) ) && (Alarm[ID].onTickHandler != NULL)) {
-
-
-
- Alarm[ID].Mode.isEnabled = true;
- Alarm[ID].updateNextTrigger();
- } else {
- Alarm[ID].Mode.isEnabled = false;
- }
- }
- }
-
- void TimeAlarmsClass::disable(AlarmID_t ID)
- {
- if (isAllocated(ID)) {
- Alarm[ID].Mode.isEnabled = false;
- }
- }
-
-
- void TimeAlarmsClass::write(AlarmID_t ID, time_t value)
- {
- if (isAllocated(ID)) {
- Alarm[ID].value = value;
- Alarm[ID].nextTrigger = 0;
- enable(ID);
- }
- }
-
-
- time_t TimeAlarmsClass::read(AlarmID_t ID) const
- {
- if (isAllocated(ID)) {
- return Alarm[ID].value ;
- } else {
- return dtINVALID_TIME;
- }
- }
-
-
- dtAlarmPeriod_t TimeAlarmsClass::readType(AlarmID_t ID) const
- {
- if (isAllocated(ID)) {
- return (dtAlarmPeriod_t)Alarm[ID].Mode.alarmType ;
- } else {
- return dtNotAllocated;
- }
- }
-
- void TimeAlarmsClass::free(AlarmID_t ID)
- {
- if (isAllocated(ID)) {
- Alarm[ID].Mode.isEnabled = false;
- Alarm[ID].Mode.alarmType = dtNotAllocated;
- Alarm[ID].onTickHandler = NULL;
- Alarm[ID].value = 0;
- Alarm[ID].nextTrigger = 0;
- }
- }
-
-
- uint8_t TimeAlarmsClass::count() const
- {
- uint8_t c = 0;
- for(uint8_t id = 0; id < dtNBR_ALARMS; id++) {
- if (isAllocated(id)) c++;
- }
- return c;
- }
-
-
- bool TimeAlarmsClass::isAlarm(AlarmID_t ID) const
- {
- return( isAllocated(ID) && dtIsAlarm(Alarm[ID].Mode.alarmType) );
- }
-
-
- bool TimeAlarmsClass::isAllocated(AlarmID_t ID) const
- {
- return (ID < dtNBR_ALARMS && Alarm[ID].Mode.alarmType != dtNotAllocated);
- }
-
-
-
- AlarmID_t TimeAlarmsClass::getTriggeredAlarmId() const
- {
- if (isServicing) {
- return servicedAlarmId;
- } else {
- return dtINVALID_ALARM_ID;
- }
- }
-
-
- void TimeAlarmsClass::delay(unsigned long ms)
- {
- unsigned long start = millis();
- do {
- serviceAlarms();
- yield();
- } while (millis() - start <= ms);
- }
-
- void TimeAlarmsClass::waitForDigits( uint8_t Digits, dtUnits_t Units)
- {
- while (Digits != getDigitsNow(Units)) {
- serviceAlarms();
- }
- }
-
- void TimeAlarmsClass::waitForRollover( dtUnits_t Units)
- {
-
- while (getDigitsNow(Units) == 0) {
- serviceAlarms();
- }
- waitForDigits(0, Units);
- }
-
- uint8_t TimeAlarmsClass::getDigitsNow( dtUnits_t Units) const
- {
- time_t time = now();
- if (Units == dtSecond) return numberOfSeconds(time);
- if (Units == dtMinute) return numberOfMinutes(time);
- if (Units == dtHour) return numberOfHours(time);
- if (Units == dtDay) return dayOfWeek(time);
- return 255;
- }
-
-
- bool TimeAlarmsClass::getIsServicing() const
- {
- return isServicing;
- }
-
-
-
-
- void TimeAlarmsClass::serviceAlarms()
- {
- if (!isServicing) {
- isServicing = true;
- for (servicedAlarmId = 0; servicedAlarmId < dtNBR_ALARMS; servicedAlarmId++) {
- if (Alarm[servicedAlarmId].Mode.isEnabled && (now() >= Alarm[servicedAlarmId].nextTrigger)) {
- OnTick_t TickHandler = Alarm[servicedAlarmId].onTickHandler;
- if (Alarm[servicedAlarmId].Mode.isOneShot) {
- free(servicedAlarmId);
- } else {
- Alarm[servicedAlarmId].updateNextTrigger();
- }
- if (TickHandler != NULL) {
- (*TickHandler)();
- }
- }
- }
- isServicing = false;
- }
- }
-
-
- time_t TimeAlarmsClass::getNextTrigger() const
- {
- time_t nextTrigger = 0;
-
- for (uint8_t id = 0; id < dtNBR_ALARMS; id++) {
- if (isAllocated(id)) {
- if (nextTrigger == 0) {
- nextTrigger = Alarm[id].nextTrigger;
- }
- else if (Alarm[id].nextTrigger < nextTrigger) {
- nextTrigger = Alarm[id].nextTrigger;
- }
- }
- }
- return nextTrigger;
- }
-
- time_t TimeAlarmsClass::getNextTrigger(AlarmID_t ID) const
- {
- if (isAllocated(ID)) {
- return Alarm[ID].nextTrigger;
- } else {
- return 0;
- }
- }
-
-
- AlarmID_t TimeAlarmsClass::create(time_t value, OnTick_t onTickHandler, uint8_t isOneShot, dtAlarmPeriod_t alarmType)
- {
- if ( ! ( (dtIsAlarm(alarmType) && now() < SECS_PER_YEAR) || (dtUseAbsoluteValue(alarmType) && (value == 0)) ) ) {
-
- for (uint8_t id = 0; id < dtNBR_ALARMS; id++) {
- if (Alarm[id].Mode.alarmType == dtNotAllocated) {
-
- Alarm[id].onTickHandler = onTickHandler;
- Alarm[id].Mode.isOneShot = isOneShot;
- Alarm[id].Mode.alarmType = alarmType;
- Alarm[id].value = value;
- enable(id);
- return id;
- }
- }
- }
- return dtINVALID_ALARM_ID;
- }
-
-
- TimeAlarmsClass Alarm = TimeAlarmsClass() ;
|