AceTime  1.7.1
Date and time classes for Arduino that support timezones from the TZ Database, and a system clock that can synchronize from an NTP server or an RTC chip.
TimePeriod.h
1 /*
2  * MIT License
3  * Copyright (c) 2018 Brian T. Park
4  */
5 
6 #ifndef ACE_TIME_TIME_PERIOD_H
7 #define ACE_TIME_TIME_PERIOD_H
8 
9 #include <stdint.h>
10 
11 class Print;
12 
13 namespace ace_time {
14 
21 class TimePeriod {
22  public:
24  static const int32_t kInvalidPeriodSeconds = INT32_MIN;
25 
30  static const int32_t kMaxPeriodSeconds = 921599;
31 
36  static TimePeriod forError() {
37  return TimePeriod(255, 255, 255, 0);
38  }
39 
49  explicit TimePeriod(uint8_t hour, uint8_t minute, uint8_t second,
50  int8_t sign = 1):
51  mHour(hour),
52  mMinute(minute),
53  mSecond(second),
54  mSign(sign) {}
55 
64  explicit TimePeriod(int32_t seconds = 0) {
65  if (seconds < -kMaxPeriodSeconds || seconds > kMaxPeriodSeconds) {
66  mSecond = mMinute = mHour = 255;
67  mSign = 0;
68  return;
69  }
70 
71  if (seconds < 0) {
72  mSign = -1;
73  seconds = -seconds;
74  } else {
75  mSign = 1;
76  }
77  mSecond = seconds % 60;
78  seconds /= 60;
79  mMinute = seconds % 60;
80  seconds /= 60;
81  mHour = seconds;
82  }
83 
85  uint8_t hour() const { return mHour; }
86 
88  void hour(uint8_t hour) { mHour = hour; }
89 
91  uint8_t minute() const { return mMinute; }
92 
94  void minute(uint8_t minute) { mMinute = minute; }
95 
97  uint8_t second() const { return mSecond; }
98 
100  void second(uint8_t second) { mSecond = second; }
101 
103  int8_t sign() const { return mSign; }
104 
109  void sign(int8_t sign) { mSign = sign; }
110 
116  int32_t toSeconds() const {
117  if (isError()) {
118  return kInvalidPeriodSeconds;
119  }
120  int32_t seconds = ((mHour * (int16_t) 60) + mMinute) * (int32_t) 60
121  + mSecond;
122  return (mSign > 0) ? seconds : -seconds;
123  }
124 
126  bool isError() const {
127  return mSign == 0 || mSecond == 255 || mMinute == 255;
128  }
129 
135  int8_t compareTo(const TimePeriod& that) const {
136  int32_t thisSeconds = toSeconds();
137  int32_t thatSeconds = that.toSeconds();
138  if (thisSeconds < thatSeconds) {
139  return -1;
140  } else if (thisSeconds > thatSeconds) {
141  return 1;
142  } else {
143  return 0;
144  }
145  }
146 
155  void printTo(Print& printer) const;
156 
157  // Use default copy constructor and assignment operator.
158  TimePeriod(const TimePeriod&) = default;
159  TimePeriod& operator=(const TimePeriod&) = default;
160 
161  private:
162  friend bool operator==(const TimePeriod& a, const TimePeriod& b);
163 
164  uint8_t mHour; // [0, 255], normally hour < 24
165  uint8_t mMinute; // [0, 59], normally minute < 60
166  uint8_t mSecond; // [0, 59], normally second < 60
167 
175  int8_t mSign;
176 };
177 
182 inline bool operator==(const TimePeriod& a, const TimePeriod& b) {
183  return a.mSecond == b.mSecond
184  && a.mMinute == b.mMinute
185  && a.mHour == b.mHour
186  && a.mSign == b.mSign;
187 }
188 
190 inline bool operator!=(const TimePeriod& a, const TimePeriod& b) {
191  return ! (a == b);
192 }
193 
194 }
195 
196 #endif
ace_time::TimePeriod::second
void second(uint8_t second)
Set the second.
Definition: TimePeriod.h:100
ace_time::TimePeriod
Represents a period of time relative to some known point in time, potentially represented by a DateTi...
Definition: TimePeriod.h:21
ace_time::TimePeriod::second
uint8_t second() const
Return the second.
Definition: TimePeriod.h:97
ace_time::TimePeriod::hour
uint8_t hour() const
Return the hour.
Definition: TimePeriod.h:85
ace_time::TimePeriod::forError
static TimePeriod forError()
Factory method that creates a TimePeriod representing an error so that isError() returns true.
Definition: TimePeriod.h:36
ace_time::TimePeriod::sign
int8_t sign() const
Return the sign bit.
Definition: TimePeriod.h:103
ace_time::TimePeriod::toSeconds
int32_t toSeconds() const
Convert to number of seconds.
Definition: TimePeriod.h:116
ace_time::TimePeriod::hour
void hour(uint8_t hour)
Set the hour.
Definition: TimePeriod.h:88
ace_time::TimePeriod::TimePeriod
TimePeriod(uint8_t hour, uint8_t minute, uint8_t second, int8_t sign=1)
Constructor.
Definition: TimePeriod.h:49
ace_time::TimePeriod::minute
void minute(uint8_t minute)
Set the minute.
Definition: TimePeriod.h:94
ace_time::TimePeriod::kInvalidPeriodSeconds
static const int32_t kInvalidPeriodSeconds
An invalid time period seconds.
Definition: TimePeriod.h:24
ace_time::TimePeriod::operator==
friend bool operator==(const TimePeriod &a, const TimePeriod &b)
Return true if two TimePeriod objects are equal.
Definition: TimePeriod.h:182
ace_time::TimePeriod::TimePeriod
TimePeriod(int32_t seconds=0)
Constructor from number of seconds.
Definition: TimePeriod.h:64
ace_time::TimePeriod::compareTo
int8_t compareTo(const TimePeriod &that) const
Compare 'this' TimePeriod with 'that' TimePeriod and return (<0, 0, >0) according to (this<that,...
Definition: TimePeriod.h:135
ace_time::TimePeriod::sign
void sign(int8_t sign)
Set the sign bit.
Definition: TimePeriod.h:109
ace_time::TimePeriod::printTo
void printTo(Print &printer) const
Print to given printer.
Definition: TimePeriod.cpp:14
ace_time::TimePeriod::kMaxPeriodSeconds
static const int32_t kMaxPeriodSeconds
The largest period that can be represented by this class, in seconds.
Definition: TimePeriod.h:30
ace_time::TimePeriod::isError
bool isError() const
Return true if this represents an error.
Definition: TimePeriod.h:126
ace_time::TimePeriod::minute
uint8_t minute() const
Return the minute.
Definition: TimePeriod.h:91