Akifumi Takahashi / AMPulseTrain

Dependents:   Interference_Simple

Committer:
aktk
Date:
Fri Feb 21 05:31:49 2020 +0000
Branch:
35e9675a
Revision:
9:80a5ef57af11
Parent:
7:5eae3f90d161
Modified types of Signal and Carrier from "* const" to just "*"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 1:19c3a52c80c3 1 #include "PulseTrain.h"
aktk 1:19c3a52c80c3 2
aktk 1:19c3a52c80c3 3 PulseTrain::PulseTrain(
aktk 7:5eae3f90d161 4 uint32_t const arg_freq_init,
aktk 7:5eae3f90d161 5 float const arg_duty_init,
aktk 1:19c3a52c80c3 6 uint32_t const arg_freq_max
aktk 1:19c3a52c80c3 7 ):
aktk 1:19c3a52c80c3 8 FREQ_MAX(arg_freq_max),
aktk 7:5eae3f90d161 9 m_freq(velidateRange<uint32_t>(arg_freq_init, 1, FREQ_MAX)),
aktk 7:5eae3f90d161 10 m_duty(velidateRange<float>(arg_duty_init, 0.0, 1.0))
aktk 1:19c3a52c80c3 11 {
aktk 4:7d5afb2e3b79 12 m_period_us = 1000000 / m_freq + (1000000 % m_freq > m_freq / 2 ? 1 : 0);
aktk 1:19c3a52c80c3 13 init();
aktk 1:19c3a52c80c3 14 m_callback_asClock = doNothing;
aktk 1:19c3a52c80c3 15 m_callback_asPulseEdge = doNothing;
aktk 1:19c3a52c80c3 16
aktk 1:19c3a52c80c3 17 }
aktk 1:19c3a52c80c3 18
aktk 1:19c3a52c80c3 19 void PulseTrain::attachCallback_asClock(Callback<void(bool)> arg_callback)
aktk 1:19c3a52c80c3 20 {
aktk 1:19c3a52c80c3 21 m_callback_asClock = arg_callback;
aktk 1:19c3a52c80c3 22 }
aktk 1:19c3a52c80c3 23
aktk 1:19c3a52c80c3 24 void PulseTrain::attachCallback_asPulseEdge(Callback<void(bool)> arg_callback)
aktk 1:19c3a52c80c3 25 {
aktk 1:19c3a52c80c3 26 m_callback_asPulseEdge = arg_callback;
aktk 1:19c3a52c80c3 27 }
aktk 1:19c3a52c80c3 28
aktk 1:19c3a52c80c3 29 void PulseTrain::setFrequency(uint32_t const arg_freq)
aktk 1:19c3a52c80c3 30 {
aktk 1:19c3a52c80c3 31 m_freq = velidateRange<uint32_t>(arg_freq, 1, FREQ_MAX);
aktk 4:7d5afb2e3b79 32 m_period_us = 1000000 / m_freq + (1000000 % m_freq > m_freq / 2 ? 1 : 0);
aktk 1:19c3a52c80c3 33 init();
aktk 1:19c3a52c80c3 34 }
aktk 1:19c3a52c80c3 35
aktk 1:19c3a52c80c3 36 void PulseTrain::setDutycycle(float const arg_duty)
aktk 1:19c3a52c80c3 37 {
aktk 1:19c3a52c80c3 38 m_duty = velidateRange<float>(arg_duty, 0.0, 1.0);
aktk 1:19c3a52c80c3 39 init();
aktk 1:19c3a52c80c3 40 }
aktk 1:19c3a52c80c3 41
aktk 1:19c3a52c80c3 42 template <typename T>
aktk 1:19c3a52c80c3 43 T PulseTrain::velidateRange(T const arg_val, T const arg_min, T const arg_max)
aktk 1:19c3a52c80c3 44 {
aktk 1:19c3a52c80c3 45 if(arg_val < arg_min) return arg_min;
aktk 1:19c3a52c80c3 46 else if (arg_val <= arg_max) return arg_val;
aktk 1:19c3a52c80c3 47 else return arg_max;
aktk 1:19c3a52c80c3 48 }
aktk 1:19c3a52c80c3 49
aktk 1:19c3a52c80c3 50 void PulseTrain::init()
aktk 1:19c3a52c80c3 51 {
aktk 1:19c3a52c80c3 52 int a, b, r;
aktk 1:19c3a52c80c3 53 a = m_period_us;
aktk 1:19c3a52c80c3 54 b = a * m_duty;
aktk 1:19c3a52c80c3 55 r = a % b;
aktk 1:19c3a52c80c3 56 while ( r != 0 ) {
aktk 1:19c3a52c80c3 57 a = b;
aktk 1:19c3a52c80c3 58 b = r;
aktk 1:19c3a52c80c3 59 r = a % b;
aktk 1:19c3a52c80c3 60 }
aktk 1:19c3a52c80c3 61 m_clock_period_us = b;
aktk 1:19c3a52c80c3 62
aktk 1:19c3a52c80c3 63 m_period_pcp = m_period_us / m_clock_period_us;
aktk 1:19c3a52c80c3 64 m_falling = m_period_pcp * m_duty;
aktk 1:19c3a52c80c3 65 }
aktk 1:19c3a52c80c3 66
aktk 1:19c3a52c80c3 67 void PulseTrain::incrementClock()
aktk 1:19c3a52c80c3 68 {
aktk 1:19c3a52c80c3 69 static unsigned int l_itr = 0;
aktk 1:19c3a52c80c3 70
aktk 1:19c3a52c80c3 71 if (l_itr == m_raising) {
aktk 1:19c3a52c80c3 72 m_pulsestate = true;
aktk 1:19c3a52c80c3 73 m_callback_asPulseEdge(m_pulsestate);
aktk 1:19c3a52c80c3 74 } else if (l_itr == m_falling) {
aktk 1:19c3a52c80c3 75 m_pulsestate = false;
aktk 1:19c3a52c80c3 76 m_callback_asPulseEdge(m_pulsestate);
aktk 1:19c3a52c80c3 77 }
aktk 1:19c3a52c80c3 78
aktk 1:19c3a52c80c3 79 l_itr = (l_itr + 1) % m_period_pcp;
aktk 1:19c3a52c80c3 80
aktk 1:19c3a52c80c3 81 m_callback_asClock(m_pulsestate);
aktk 1:19c3a52c80c3 82 }
aktk 1:19c3a52c80c3 83
aktk 1:19c3a52c80c3 84
aktk 1:19c3a52c80c3 85 bool PulseTrain::getState()
aktk 1:19c3a52c80c3 86 {
aktk 1:19c3a52c80c3 87 return m_pulsestate;
aktk 1:19c3a52c80c3 88 }
aktk 1:19c3a52c80c3 89
aktk 1:19c3a52c80c3 90 uint32_t PulseTrain::getFrequency()
aktk 1:19c3a52c80c3 91 {
aktk 1:19c3a52c80c3 92 return m_freq;
aktk 1:19c3a52c80c3 93 }
aktk 1:19c3a52c80c3 94
aktk 1:19c3a52c80c3 95 float PulseTrain::getDutycycle()
aktk 1:19c3a52c80c3 96 {
aktk 1:19c3a52c80c3 97 return m_duty;
aktk 1:19c3a52c80c3 98 }
aktk 1:19c3a52c80c3 99
aktk 4:7d5afb2e3b79 100 uint32_t PulseTrain::getPeriod_us()
aktk 1:19c3a52c80c3 101 {
aktk 1:19c3a52c80c3 102 return m_period_us;
aktk 1:19c3a52c80c3 103 }
aktk 1:19c3a52c80c3 104
aktk 1:19c3a52c80c3 105 uint32_t PulseTrain::getClockperiod_us()
aktk 1:19c3a52c80c3 106 {
aktk 1:19c3a52c80c3 107 return m_clock_period_us;
aktk 1:19c3a52c80c3 108 }