diff --git a/TimeAlarms.cpp b/TimeAlarms.cpp index b8fcae3..79e7dea 100644 --- a/TimeAlarms.cpp +++ b/TimeAlarms.cpp @@ -209,13 +209,6 @@ void TimeAlarmsClass::disable(AlarmID_t ID) } } -bool TimeAlarmsClass::isEnabled(AlarmID_t ID) -{ - if (isAllocated(ID)) { - return Alarm[ID].Mode.isEnabled; - } -} - // write the given value to the given alarm void TimeAlarmsClass::write(AlarmID_t ID, time_t value) { @@ -227,7 +220,7 @@ void TimeAlarmsClass::write(AlarmID_t ID, time_t value) } // return the value for the given alarm ID -time_t TimeAlarmsClass::read(AlarmID_t ID) +time_t TimeAlarmsClass::read(AlarmID_t ID) const { if (isAllocated(ID)) { return Alarm[ID].value ; @@ -237,7 +230,7 @@ time_t TimeAlarmsClass::read(AlarmID_t ID) } // return the alarm type for the given alarm ID -dtAlarmPeriod_t TimeAlarmsClass::readType(AlarmID_t ID) +dtAlarmPeriod_t TimeAlarmsClass::readType(AlarmID_t ID) const { if (isAllocated(ID)) { return (dtAlarmPeriod_t)Alarm[ID].Mode.alarmType ; @@ -258,7 +251,7 @@ void TimeAlarmsClass::free(AlarmID_t ID) } // returns the number of allocated timers -uint8_t TimeAlarmsClass::count() +uint8_t TimeAlarmsClass::count() const { uint8_t c = 0; for(uint8_t id = 0; id < dtNBR_ALARMS; id++) { @@ -268,20 +261,20 @@ uint8_t TimeAlarmsClass::count() } // returns true only if id is allocated and the type is a time based alarm, returns false if not allocated or if its a timer -bool TimeAlarmsClass::isAlarm(AlarmID_t ID) +bool TimeAlarmsClass::isAlarm(AlarmID_t ID) const { return( isAllocated(ID) && dtIsAlarm(Alarm[ID].Mode.alarmType) ); } // returns true if this id is allocated -bool TimeAlarmsClass::isAllocated(AlarmID_t ID) +bool TimeAlarmsClass::isAllocated(AlarmID_t ID) const { return (ID < dtNBR_ALARMS && Alarm[ID].Mode.alarmType != dtNotAllocated); } // returns the currently triggered alarm id // returns dtINVALID_ALARM_ID if not invoked from within an alarm handler -AlarmID_t TimeAlarmsClass::getTriggeredAlarmId() +AlarmID_t TimeAlarmsClass::getTriggeredAlarmId() const { if (isServicing) { return servicedAlarmId; // new private data member used instead of local loop variable i in serviceAlarms(); @@ -294,9 +287,10 @@ AlarmID_t TimeAlarmsClass::getTriggeredAlarmId() void TimeAlarmsClass::delay(unsigned long ms) { unsigned long start = millis(); - while (millis() - start <= ms) { + do { serviceAlarms(); - } + yield(); + } while (millis() - start <= ms); } void TimeAlarmsClass::waitForDigits( uint8_t Digits, dtUnits_t Units) @@ -315,7 +309,7 @@ void TimeAlarmsClass::waitForRollover( dtUnits_t Units) waitForDigits(0, Units); } -uint8_t TimeAlarmsClass::getDigitsNow( dtUnits_t Units) +uint8_t TimeAlarmsClass::getDigitsNow( dtUnits_t Units) const { time_t time = now(); if (Units == dtSecond) return numberOfSeconds(time); @@ -326,7 +320,7 @@ uint8_t TimeAlarmsClass::getDigitsNow( dtUnits_t Units) } //returns isServicing -bool TimeAlarmsClass::getIsServicing() +bool TimeAlarmsClass::getIsServicing() const { return isServicing; } @@ -356,18 +350,30 @@ void TimeAlarmsClass::serviceAlarms() } // returns the absolute time of the next scheduled alarm, or 0 if none -time_t TimeAlarmsClass::getNextTrigger() +time_t TimeAlarmsClass::getNextTrigger() const { - time_t nextTrigger = (time_t)0xffffffff; // the max time value + time_t nextTrigger = 0; for (uint8_t id = 0; id < dtNBR_ALARMS; id++) { if (isAllocated(id)) { - if (Alarm[id].nextTrigger < nextTrigger) { + if (nextTrigger == 0) { + nextTrigger = Alarm[id].nextTrigger; + } + else if (Alarm[id].nextTrigger < nextTrigger) { nextTrigger = Alarm[id].nextTrigger; } } } - return nextTrigger == (time_t)0xffffffff ? 0 : nextTrigger; + return nextTrigger; +} + +time_t TimeAlarmsClass::getNextTrigger(AlarmID_t ID) const +{ + if (isAllocated(ID)) { + return Alarm[ID].nextTrigger; + } else { + return 0; + } } // attempt to create an alarm and return true if successful @@ -394,4 +400,3 @@ AlarmID_t TimeAlarmsClass::create(const timeDayOfWeek_t DOWs[], uint8_t nbDOW, t // make one instance for the user to use TimeAlarmsClass Alarm = TimeAlarmsClass() ; - diff --git a/TimeAlarms.h b/TimeAlarms.h index d94b819..42d0b7d 100644 --- a/TimeAlarms.h +++ b/TimeAlarms.h @@ -6,14 +6,15 @@ #include #include "TimeLib.h" +#if !defined(dtNBR_ALARMS ) #if defined(__AVR__) - #define dtNBR_ALARMS 8 // max is 255 #elif defined(ESP8266) #define dtNBR_ALARMS 20 // for esp8266 chip - max is 255 #else #define dtNBR_ALARMS 12 // assume non-AVR has more memory #endif +#endif #define USE_SPECIALIST_METHODS // define this for testing @@ -160,29 +161,29 @@ class TimeAlarmsClass void delay(unsigned long ms); // utility methods - uint8_t getDigitsNow( dtUnits_t Units); // returns the current digit value for the given time unit + uint8_t getDigitsNow( dtUnits_t Units) const; // returns the current digit value for the given time unit void waitForDigits( uint8_t Digits, dtUnits_t Units); void waitForRollover(dtUnits_t Units); // low level methods void enable(AlarmID_t ID); // enable the alarm to trigger void disable(AlarmID_t ID); // prevent the alarm from triggering - bool isEnabled(AlarmID_t ID); // returns true if the given alarm is enabled - AlarmID_t getTriggeredAlarmId(); // returns the currently triggered alarm id - bool getIsServicing(); // returns isServicing + AlarmID_t getTriggeredAlarmId() const; // returns the currently triggered alarm id + bool getIsServicing() const; // returns isServicing void write(AlarmID_t ID, time_t value); // write the value (and enable) the alarm with the given ID - time_t read(AlarmID_t ID); // return the value for the given timer - dtAlarmPeriod_t readType(AlarmID_t ID); // return the alarm type for the given alarm ID + time_t read(AlarmID_t ID) const; // return the value for the given timer + dtAlarmPeriod_t readType(AlarmID_t ID) const; // return the alarm type for the given alarm ID void free(AlarmID_t ID); // free the id to allow its reuse #ifndef USE_SPECIALIST_METHODS private: // the following methods are for testing and are not documented as part of the standard library #endif - uint8_t count(); // returns the number of allocated timers - time_t getNextTrigger(); // returns the time of the next scheduled alarm - bool isAllocated(AlarmID_t ID); // returns true if this id is allocated - bool isAlarm(AlarmID_t ID); // returns true if id is for a time based alarm, false if its a timer or not allocated + uint8_t count() const; // returns the number of allocated timers + time_t getNextTrigger() const; // returns the time of the next scheduled alarm + time_t getNextTrigger(AlarmID_t ID) const; // returns the time of scheduled alarm + bool isAllocated(AlarmID_t ID) const; // returns true if this id is allocated + bool isAlarm(AlarmID_t ID) const; // returns true if id is for a time based alarm, false if its a timer or not allocated }; extern TimeAlarmsClass Alarm; // make an instance for the user