You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.0 KiB

#pragma once
//#include "TckChannelBase.h"
#include "TckChannel.h"
#include "core_pins.h"
namespace TeensyTimerTool
{
extern const unsigned NR_OF_TCK_TIMERS;
class TCK_t
{
public:
template<typename counterType> static inline ITimerChannel* getTimer();
static inline void removeTimer(TckChannelBase*);
static inline void tick();
protected:
static bool isInitialized;
static TckChannelBase* channels[NR_OF_TCK_TIMERS];
};
// IMPLEMENTATION ==================================================================
template<typename counterType>
ITimerChannel* TCK_t::getTimer()
{
if (!isInitialized)
{
for (unsigned chNr = 0; chNr < NR_OF_TCK_TIMERS; chNr++)
{
channels[chNr] = nullptr;
}
isInitialized = true;
// enable the cycle counter
ARM_DEMCR |= ARM_DEMCR_TRCENA;
ARM_DWT_CTRL |= ARM_DWT_CTRL_CYCCNTENA;
// initialize the yield hook
#if defined(TEENSYDUINO) && YIELD_TYPE == YIELD_STANDARD
extern void initYieldHook();
initYieldHook();
#endif
}
for (unsigned chNr = 0; chNr < NR_OF_TCK_TIMERS; chNr++)
{
if (channels[chNr] == nullptr)
{
channels[chNr] = new TckChannel<counterType>();
return channels[chNr];
}
}
return nullptr;
}
void TCK_t::removeTimer(TckChannelBase* channel)
{
for (unsigned chNr = 0; chNr < NR_OF_TCK_TIMERS; chNr++)
{
if (channels[chNr] == channel)
{
channels[chNr] = nullptr;
delete channel;
break;
}
}
}
void TCK_t::tick()
{
for (unsigned i = 0; i < NR_OF_TCK_TIMERS; i++)
{
if (channels[i] != nullptr)
{
channels[i]->tick();
}
}
}
}