19 #ifndef BLE_COMMON_DURATION_H_ 20 #define BLE_COMMON_DURATION_H_ 24 #include "platform/mbed_assert.h" 25 #include "platform/mbed_chrono.h" 29 #if !defined(DOXYGEN_ONLY) 36 template<u
int32_t Min, u
int32_t Max, u
int32_t Default = Min>
38 static const uint32_t
MIN = Min;
39 static const uint32_t
MAX = Max;
40 static const uint32_t DEFAULT = Default;
49 template<
typename Rep>
56 struct DefaultRange<uint8_t> {
57 typedef Range<0, 0xFF> type;
64 struct DefaultRange<uint16_t > {
65 typedef Range<0, 0xFFFF> type;
72 struct DefaultRange<uint32_t> {
73 typedef Range<0, 0xFFFFFFFF> type;
82 template<
typename T, T V>
84 static const T VALUE = V;
101 typename Range =
typename DefaultRange<Rep>::type,
102 typename Forever =
void*
140 template<
typename OtherRep, u
int32_t OtherTB,
typename OtherRange,
typename OtherF>
142 duration(clamp(other.value() * (OtherTB / TB)))
144 static_assert(OtherTB >= TB && (OtherTB % TB) == 0,
"Incompatible units");
158 template<
typename OtherRep,
typename OtherRange,
typename OtherF>
160 duration(clamp(((other_ms.value() * 1000) + TB - 1) / TB))
181 return ((uint32_t)duration * TB) / 1000;
187 static const uint32_t TIME_BASE = TB;
238 #if defined(DOXYGEN_ONLY) 243 bool isForever()
const;
246 template<
typename DefaultForever =
void*>
248 std::is_same<DefaultForever, Forever>::value,
257 template<
typename DefaultForever =
void*>
259 !std::is_same<DefaultForever, Forever>::value,
264 return duration == Forever::VALUE;
272 std::chrono::duration<Rep, typename std::ratio<TB, 1000000>::type>
277 return std::chrono::duration<Rep, typename std::ratio<TB, 1000000>::type>{duration};
281 static Rep clamp(Rep in)
285 }
else if (in > MAX) {
323 template<
typename DurationOut,
typename RepIn, u
int32_t TBIn,
typename RangeIn,
typename FIn>
326 return DurationOut(((duration.
value() * TBIn) + DurationOut::TIME_BASE - 1) / DurationOut::TIME_BASE);
338 typename RepLHS, uint32_t TBLHS,
typename RangeLHS,
typename FLHS,
339 typename RepRHS, uint32_t TBRHS,
typename RangeRHS,
typename FRHS>
356 template<
typename Rep, u
int32_t TB,
typename Range,
typename F>
375 template<
typename Rep, u
int32_t TB,
typename Range,
typename F>
391 template<
typename Rep, u
int32_t TB,
typename Range,
typename F>
406 typename RepLHS, uint32_t TBLHS,
typename RangeLHS,
typename FLHS,
407 typename RepRHS, uint32_t TBRHS,
typename RangeRHS,
typename FRHS
411 return lhs.
value() * lhs.TIME_BASE < rhs.value() * rhs.TIME_BASE;
422 template<
typename Rep, u
int32_t Us,
typename Range,
typename F>
425 return lhs.
value() < rhs.value();
437 typename RepLHS, uint32_t TBLHS,
typename RangeLHS,
typename FLHS,
438 typename RepRHS, uint32_t TBRHS,
typename RangeRHS,
typename FRHS
456 template<
typename Rep, u
int32_t Us,
typename Range>
459 return lhs.
value() <= rhs.value();
471 typename RepLHS, uint32_t TBLHS,
typename RangeLHS,
typename FLHS,
472 typename RepRHS, uint32_t TBRHS,
typename RangeRHS,
typename FRHS
490 template<
typename Rep, u
int32_t Us,
typename Range,
typename F>
505 typename RepLHS, uint32_t TBLHS,
typename RangeLHS,
typename FLHS,
506 typename RepRHS, uint32_t TBRHS,
typename RangeRHS,
typename FRHS
513 return !(lhs == rhs);
524 template<
typename Rep, u
int32_t Us,
typename Range,
typename F>
527 return !(lhs == rhs);
539 typename RepLHS, uint32_t TBLHS,
typename RangeLHS,
typename FLHS,
540 typename RepRHS, uint32_t TBRHS,
typename RangeRHS,
typename FRHS
558 template<
typename Rep, u
int32_t Us,
typename Range,
typename F>
573 typename RepLHS, uint32_t TBLHS,
typename RangeLHS,
typename FLHS,
574 typename RepRHS, uint32_t TBRHS,
typename RangeRHS,
typename FRHS
592 template<
typename Rep, u
int32_t Us,
typename Range,
typename F>
600 #if !defined(DOXYGEN_ONLY) 602 template<u
int32_t Min, u
int32_t Max, u
int32_t Default>
605 template<u
int32_t Min, u
int32_t Max, u
int32_t Default>
608 template<u
int32_t Min, u
int32_t Max, u
int32_t Default>
609 const uint32_t Range<Min, Max, Default>::DEFAULT;
611 template<
typename T, T V>
612 const T Value<T, V>::VALUE;
616 template<
typename Rep, u
int32_t TB,
typename Range,
typename Forever>
619 template<
typename Rep, u
int32_t TB,
typename Range,
typename Forever>
622 template<
typename Rep, u
int32_t TB,
typename Range,
typename Forever>
627 #endif //BLE_COMMON_DURATION_H_ Duration< Rep, TB, Range, F > operator+(Duration< Rep, TB, Range, F > lhs, Duration< Rep, TB, Range, F > rhs)
Add two durations together.
DurationOut durationCast(Duration< RepIn, TBIn, RangeIn, FIn > duration)
Cast a duration to another.
static Duration forever()
Return the Duration value meaning forever.
bool operator>=(Duration< RepLHS, TBLHS, RangeLHS, FLHS > lhs, Duration< RepRHS, TBRHS, RangeRHS, FRHS > rhs)
Indicate if the duration lhs greater or equal to the duration rhs.
Duration< uint32_t, 1000 *millisecond_t::TIME_BASE > second_t
Type that represents seconds.
Rep value() const
Return the duration in TB units.
bool operator>(Duration< RepLHS, TBLHS, RangeLHS, FLHS > lhs, Duration< RepRHS, TBRHS, RangeRHS, FRHS > rhs)
Indicate if the duration lhs greater than the duration rhs.
bool operator==(Duration< RepLHS, TBLHS, RangeLHS, FLHS > lhs, Duration< RepRHS, TBRHS, RangeRHS, FRHS > rhs)
Indicate if the duration lhs is equal to the duration rhs.
bool operator!=(Duration< Rep, Us, Range, F > lhs, Duration< Rep, Us, Range, F > rhs)
Indicate if the duration lhs is not equal to the duration rhs.
#define MAX(a, b)
Returns the maximum value between a and b.
static Duration max()
Return the maximum duration.
uint32_t valueInMs() const
Return the duration in milliseconds.
Duration< uint32_t, 1000 *microsecond_t::TIME_BASE > millisecond_t
Type that represents milliseconds.
static const uint32_t TIME_BASE
The time base.
Duration< Rep, TB, Range, F > operator*(Duration< Rep, TB, Range, F > lhs, uint32_t rhs)
Multiply a duration and a positive integer.
bool operator==(Duration< Rep, Us, Range, F > lhs, Duration< Rep, Us, Range, F > rhs)
Indicate if the duration lhs is equal to the duration rhs.
Duration(Rep v)
Construct a Duration from an integer value.
Duration< Rep, TB, Range, F > operator*(uint32_t lhs, Duration< Rep, TB, Range, F > rhs)
Multiply a duration and a positive integer.
const Rep * storage() const
Return a pointer to the value of the duration.
#define MIN(a, b)
Returns the minimum value between a and b.
Duration(Duration< OtherRep, OtherTB, OtherRange, OtherF > other)
Construct a Duration from another Duration.
bool operator<=(Duration< RepLHS, TBLHS, RangeLHS, FLHS > lhs, Duration< RepRHS, TBRHS, RangeRHS, FRHS > rhs)
Indicate if the duration lhs is less than or equal to the duration rhs.
microsecond_t operator+(Duration< RepLHS, TBLHS, RangeLHS, FLHS > lhs, Duration< RepRHS, TBRHS, RangeRHS, FRHS > rhs)
Add two durations together and return the result in microseconds.
bool operator!=(Duration< RepLHS, TBLHS, RangeLHS, FLHS > lhs, Duration< RepRHS, TBRHS, RangeRHS, FRHS > rhs)
Indicate if the duration lhs is not equal to the duration rhs.
Duration()
Construct a default Duration.
Rep representation_t
Type of the actual representation.
static Duration min()
Return the minimum duration.
Entry namespace for all BLE API definitions.
bool operator>=(Duration< Rep, Us, Range, F > lhs, Duration< Rep, Us, Range, F > rhs)
Indicate if the duration lhs greater or equal to the duration rhs.
Duration< uint32_t, 1 > microsecond_t
Type that represents micro seconds.
bool operator>(Duration< Rep, Us, Range, F > lhs, Duration< Rep, Us, Range, F > rhs)
Indicate if the duration lhs greater than the duration rhs.
Duration(Duration< OtherRep, 1000, OtherRange, OtherF > other_ms, void *=nullptr)
Construct a new Duration from a Duration in milliseconds.
std::chrono::duration< Rep, typename std::ratio< TB, 1000000 >::type > valueChrono() const
Convert the duration into an std::chrono one.