add oktosnake

This commit is contained in:
Lars H 2017-11-17 13:15:12 +01:00
parent 3ee01ca05b
commit f233845919
2 changed files with 134 additions and 0 deletions

87
Octosnake.cpp Normal file
View File

@ -0,0 +1,87 @@
#include <ESP32_Servo.h>
#include "Octosnake.h"
//#include <Servo.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;
}

47
Octosnake.h Normal file
View File

@ -0,0 +1,47 @@
#include <ESP32_Servo.h>
#ifndef octosnake_h
#define octosnake_h
#include <Arduino.h>
//#include <Servo.h>
#ifndef PI
#define PI 3.14159
#endif
class Oscillator{
public:
Oscillator();
float refresh();
void reset();
void start();
void start(unsigned long ref_time);
void stop();
float time_to_radians(double time);
float degrees_to_radians(float degrees);
float degrees_to_time(float degrees);
void setPeriod(int period);
void setAmplitude(int amplitude);
void setPhase(int phase);
void setOffset(int offset);
void setTime(unsigned long ref);
float getOutput();
float getPhaseProgress();
unsigned long getTime();
private:
int _period;
int _amplitude;
int _phase;
int _offset;
float _output;
bool _stop;
unsigned long _ref_time = 0;
float _delta_time = 0;
};
#endif