-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTimer.h
104 lines (99 loc) · 2.04 KB
/
Timer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#ifndef _TIMER_H_
#define _TIMER_H_
#include "device.h"
#include "macros.h"
#include <math.h>
#include <inttypes.h>
#define CLOCKED_TIMER_FREQUENCY_MULTIPLIER 1024
class Timer {
public:
float duty;
float frequency;
float minimum;
float maximum;
virtual void setFrequency(float f){
frequency = f;
updateFrequency();
updateDutyCycle();
}
/* expects a value 0.0-1.0 */
virtual void setDutyCycle(float d){
duty = d;
updateDutyCycle();
}
// set the frequency as a percentage of max speed, 0.0-1.0
void setRate(float r){
r *= (maximum-minimum);
r += minimum;
setFrequency(r);
}
float midiToFreq(uint8_t note){
return 440.0 * pow(2, (note - 69) / 12.0);
}
void setMidiNote(uint8_t note){
setFrequency(midiToFreq(note));
}
#ifdef SERIAL_DEBUG
virtual void dump(){
printString("f ");
printInteger(frequency);
printString(", d ");
printInteger(duty*255);
}
#endif
protected:
virtual void updateFrequency(){}
virtual void updateDutyCycle(){}
};
/**
* 16-bit manually triggered timer.
* Has a range of 2ms to 32 seconds when triggered every millisecond.
*/
class ClockedTimer : public Timer {
private:
volatile uint16_t time;
uint16_t period;
uint16_t duration;
public:
ClockedTimer() {
/* minimum = CLOCKED_TIMER_MIN_FREQUENCY; */
/* maximum = CLOCKED_TIMER_MAX_FREQUENCY; */
}
void reset(){
time = 0;
}
void clock(){
if(++time > period){
time = 0;
on();
}else if(time > duration){
off();
}else{
on();
}
}
void updateFrequency(){
if(frequency <= 0){
period = 2;
}else{
period = (uint16_t)(CLOCKED_TIMER_FREQUENCY_MULTIPLIER/frequency);
}
}
void updateDutyCycle(){
duration = period*duty;
}
virtual void on(){}
virtual void off(){}
#ifdef SERIAL_DEBUG
virtual void dump(){
Timer::dump();
printString(", t ");
printInteger(time);
printString(", p ");
printInteger(period);
printString(", d ");
printInteger(duration);
}
#endif
};
#endif /* _TIMER_H_ */