Skip to content

Commit dddfa13

Browse files
committed
[clock] Allow overriding the clock implementation functions
1 parent 87d7a6c commit dddfa13

File tree

4 files changed

+49
-19
lines changed

4 files changed

+49
-19
lines changed

src/modm/platform/clock/avr/clock.cpp.in

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,17 @@ MODM_ISR(TIMER0_COMPA)
7272
interrupt = true;
7373
}
7474

75+
// ----------------------------------------------------------------------------
76+
// Allow the ability to override the clock now functions
77+
#ifndef MODM_CHRONO_MILLI_CLOCK_NOW
78+
# define MODM_CHRONO_MILLI_CLOCK_NOW modm::chrono::milli_clock::now
79+
#endif
80+
#ifndef MODM_CHRONO_MICRO_CLOCK_NOW
81+
# define MODM_CHRONO_MICRO_CLOCK_NOW modm::chrono::micro_clock::now
82+
#endif
83+
7584
modm::chrono::milli_clock::time_point modm_weak
76-
modm::chrono::milli_clock::now() noexcept
85+
MODM_CHRONO_MILLI_CLOCK_NOW() noexcept
7786
{
7887
uint32_t time;
7988
do
@@ -82,11 +91,11 @@ modm::chrono::milli_clock::now() noexcept
8291
time = milli_time;
8392
}
8493
while(interrupt);
85-
return time_point{duration{time}};
94+
return modm::chrono::milli_clock::time_point{modm::chrono::milli_clock::duration{time}};
8695
}
8796

8897
modm::chrono::micro_clock::time_point modm_weak
89-
modm::chrono::micro_clock::now() noexcept
98+
MODM_CHRONO_MICRO_CLOCK_NOW() noexcept
9099
{
91100
uint32_t time;
92101
uint8_t val;
@@ -101,5 +110,5 @@ modm::chrono::micro_clock::now() noexcept
101110

102111
time += uint16_t(val * uint16_t({{scaler}})) >> {{shift}};
103112

104-
return time_point{duration{time}};
113+
return modm::chrono::micro_clock::time_point{modm::chrono::micro_clock::duration{time}};
105114
}

src/modm/platform/clock/systick/systick_timer.cpp.in

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,19 @@ modm::platform::SysTickTimer::disable()
7979
}
8080

8181
// ----------------------------------------------------------------------------
82+
// Allow the ability to override the clock now functions
83+
#ifndef MODM_CHRONO_MILLI_CLOCK_NOW
84+
# define MODM_CHRONO_MILLI_CLOCK_NOW modm::chrono::milli_clock::now
85+
#endif
86+
#ifndef MODM_CHRONO_MICRO_CLOCK_NOW
87+
# define MODM_CHRONO_MICRO_CLOCK_NOW modm::chrono::micro_clock::now
88+
#endif
89+
8290
modm::chrono::milli_clock::time_point modm_weak
83-
modm::chrono::milli_clock::now() noexcept
91+
MODM_CHRONO_MILLI_CLOCK_NOW() noexcept
8492
{
8593
%% if systick_frequency == 1000
86-
return time_point{duration{milli_time}};
94+
return modm::chrono::milli_clock::time_point{modm::chrono::milli_clock::duration{milli_time}};
8795
%% else
8896
uint32_t val, ms;
8997
%% if multicore
@@ -98,16 +106,16 @@ modm::chrono::milli_clock::now() noexcept
98106
}
99107
while(interrupt);
100108
const auto diff = SysTick->LOAD - val;
101-
const auto ms_per_Ncycles = platform::SysTickTimer::ms_per_Ncycles;
102-
constexpr auto Ncycles = platform::SysTickTimer::Ncycles;
109+
const auto ms_per_Ncycles = modm::platform::SysTickTimer::ms_per_Ncycles;
110+
constexpr auto Ncycles = modm::platform::SysTickTimer::Ncycles;
103111

104112
ms += (uint64_t(diff) * uint64_t(ms_per_Ncycles)) >> Ncycles;
105-
return time_point{duration{ms}};
113+
return modm::chrono::milli_clock::time_point{modm::chrono::milli_clock::duration{ms}};
106114
%% endif
107115
}
108116

109117
modm::chrono::micro_clock::time_point modm_weak
110-
modm::chrono::micro_clock::now() noexcept
118+
MODM_CHRONO_MICRO_CLOCK_NOW() noexcept
111119
{
112120
uint32_t val, us;
113121
%% if multicore
@@ -122,8 +130,8 @@ modm::chrono::micro_clock::now() noexcept
122130
}
123131
while(interrupt);
124132
const auto diff = SysTick->LOAD - val;
125-
const auto us_per_Ncycles = platform::SysTickTimer::us_per_Ncycles;
126-
constexpr auto Ncycles = platform::SysTickTimer::Ncycles;
133+
const auto us_per_Ncycles = modm::platform::SysTickTimer::us_per_Ncycles;
134+
constexpr auto Ncycles = modm::platform::SysTickTimer::Ncycles;
127135

128136
%% if systick_frequency == 1000
129137
// use a 32x32=32bit multiplication
@@ -132,5 +140,6 @@ modm::chrono::micro_clock::now() noexcept
132140
// use a 32x32=64bit multiplication
133141
us += (uint64_t(diff) * uint64_t(us_per_Ncycles)) >> Ncycles;
134142
%% endif
135-
return time_point{duration{us}};
143+
144+
return modm::chrono::micro_clock::time_point{modm::chrono::micro_clock::duration{us}};
136145
}

src/modm/platform/clock/systick/systick_timer.hpp.in

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ private:
8282
static void
8383
enable(uint32_t reload, bool use_processor_clock);
8484

85+
public:
86+
/// @cond
8587
%% if systick_frequency != 1000
8688
// FCPU < 8MHz
8789
// 536e6/4 < 27-bit, 8e6/4 < 21-bit
@@ -101,8 +103,7 @@ private:
101103
static constexpr uint8_t Ncycles{20};
102104
%% endif
103105
static inline uint32_t us_per_Ncycles{0};
104-
friend class modm::chrono::milli_clock;
105-
friend class modm::chrono::micro_clock;
106+
/// @endcond
106107
};
107108

108109
}

src/modm/platform/core/hosted/clock.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,27 @@
1111

1212
#include <modm/architecture/interface/clock.hpp>
1313

14+
// Allow the ability to override the clock now functions
15+
#ifndef MODM_CHRONO_MILLI_CLOCK_NOW
16+
# define MODM_CHRONO_MILLI_CLOCK_NOW modm::chrono::milli_clock::now
17+
#else
18+
#endif
19+
#ifndef MODM_CHRONO_MICRO_CLOCK_NOW
20+
# define MODM_CHRONO_MICRO_CLOCK_NOW modm::chrono::micro_clock::now
21+
#endif
22+
1423
modm::chrono::milli_clock::time_point modm_weak
15-
modm::chrono::milli_clock::now() noexcept
24+
MODM_CHRONO_MILLI_CLOCK_NOW() noexcept
1625
{
1726
const auto time = std::chrono::steady_clock::now().time_since_epoch();
18-
return time_point{std::chrono::duration_cast<duration>(time)};
27+
return modm::chrono::milli_clock::time_point{
28+
std::chrono::duration_cast<modm::chrono::milli_clock::duration>(time)};
1929
}
2030

2131
modm::chrono::micro_clock::time_point modm_weak
22-
modm::chrono::micro_clock::now() noexcept
32+
MODM_CHRONO_MICRO_CLOCK_NOW() noexcept
2333
{
2434
const auto time = std::chrono::high_resolution_clock::now().time_since_epoch();
25-
return time_point{std::chrono::duration_cast<duration>(time)};
35+
return modm::chrono::micro_clock::time_point{
36+
std::chrono::duration_cast<modm::chrono::micro_clock::duration>(time)};
2637
}

0 commit comments

Comments
 (0)