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.

89 lines
2.1 KiB

#pragma once
#include "../ITimerChannel.h"
#include "../types.h"
#include "Arduino.h"
namespace TeensyTimerTool
{
class TCK_t;
class TckChannel : public ITimerChannel
{
public:
inline TckChannel() { triggered = false; }
inline virtual ~TckChannel(){};
inline void begin(callback_t cb, unsigned period, bool periodic)
{
Serial.println("begin");
triggered = false;
this->periodic = periodic;
this->period = period * (F_CPU / 1'000'000);
this->callback = cb;
startCNT = ARM_DWT_CYCCNT;
}
inline void start()
{
Serial.println("start");
this->startCNT = ARM_DWT_CYCCNT;
this->triggered = true;
}
inline void stop()
{
this->triggered = false;
}
// inline void setPeriod(uint32_t microSeconds);
inline uint32_t getPeriod(void);
inline void trigger(uint32_t delay) // µs
{
this->startCNT = ARM_DWT_CYCCNT;
this->period = delay * (F_CPU / 1'000'000) - 68;
this->triggered = true;
}
protected:
uint32_t startCNT, period;
callback_t callback;
bool triggered;
bool periodic;
inline void tick();
bool block = false;
friend TCK_t;
};
// IMPLEMENTATION ==============================================
void TckChannel::tick()
{
static bool lock = false;
if (!lock && period != 0 && triggered && (ARM_DWT_CYCCNT - startCNT) >= period)
{
lock = true;
startCNT = ARM_DWT_CYCCNT;
triggered = periodic; // i.e., stays triggerd if periodic, stops if oneShot
callback();
lock = false;
}
}
// void TckChannel::setPeriod(uint32_t microSeconds)
// {
// period = microSeconds * (F_CPU / 1'000'000) ;
// }
uint32_t TckChannel::getPeriod()
{
return period * (1'000'000.0f / F_CPU);
}
} // namespace TeensyTimerTool