The movement Library for Lars
https://valencia.lbsfilm.at/tag/robot/
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.
85 lines
1.5 KiB
85 lines
1.5 KiB
#include "Octosnake.h" |
|
#include <Arduino.h> |
|
|
|
Oscillator::Oscillator(){ |
|
_period = 2000; |
|
_amplitude = 50; |
|
_phase = 0; |
|
_offset = 0; |
|
_stop = true; |
|
_ref_time = millis(); |
|
_delta_time = 0; |
|
} |
|
|
|
float Oscillator::refresh(){ |
|
if (!_stop){ |
|
_delta_time = (millis()-_ref_time) % _period; |
|
_output = (float)_amplitude*sin(time_to_radians(_delta_time) |
|
+ degrees_to_radians(_phase)) |
|
+ _offset; |
|
} |
|
|
|
return _output; |
|
} |
|
|
|
void Oscillator::reset(){ |
|
_ref_time = millis(); |
|
} |
|
|
|
void Oscillator::start(){ |
|
reset(); |
|
_stop = false; |
|
} |
|
|
|
void Oscillator::start(unsigned long ref_time){ |
|
_ref_time = ref_time; |
|
_stop = false; |
|
} |
|
|
|
void Oscillator::stop(){ |
|
_stop = true; |
|
} |
|
|
|
void Oscillator::setPeriod(int period){ |
|
_period = period; |
|
} |
|
|
|
void Oscillator::setAmplitude(int amplitude){ |
|
_amplitude = amplitude; |
|
} |
|
|
|
void Oscillator::setPhase(int phase){ |
|
_phase = phase; |
|
} |
|
|
|
void Oscillator::setOffset(int offset){ |
|
_offset = offset; |
|
} |
|
|
|
void Oscillator::setTime(unsigned long ref){ |
|
_ref_time = ref; |
|
} |
|
|
|
float Oscillator::getOutput(){ |
|
return _output; |
|
} |
|
|
|
unsigned long Oscillator::getTime(){ |
|
return _ref_time; |
|
} |
|
|
|
float Oscillator::getPhaseProgress(){ |
|
return ((float)_delta_time/_period) * 360; |
|
} |
|
|
|
float Oscillator::time_to_radians(double time){ |
|
return time*2*PI/_period; |
|
} |
|
|
|
float Oscillator::degrees_to_radians(float degrees){ |
|
return degrees*2*PI/360; |
|
} |
|
|
|
float Oscillator::degrees_to_time(float degrees){ |
|
return degrees*_period/360; |
|
}
|
|
|