#include "smoothcontrol.h"
+#include <stdexcept>
+
+using namespace std;
namespace Msp {
namespace Input {
-SmoothControl::SmoothControl():
- value(0),
- paired_ctrl(0),
- dead_zone(0.1),
- threshold(0.9)
-{ }
-
SmoothControl::SmoothControl(const ControlSource &s):
- Control(s),
- value(0),
- paired_ctrl(0),
- dead_zone(0.1),
- threshold(0.9)
+ Control(s)
{ }
SmoothControl::SmoothControl(Device &d, ControlSrcType t, unsigned i):
- Control(d, t, i),
- value(0),
- paired_ctrl(0),
- dead_zone(0.1),
- threshold(0.9)
+ Control(d, t, i)
{ }
SmoothControl::~SmoothControl()
{
- pair(0);
+ pair(nullptr);
}
void SmoothControl::set_dead_zone(float d)
{
- dead_zone=d;
+ if(d<0 || (threshold>0 && d>=threshold))
+ throw invalid_argument("SmoothControl::set_dead_zone");
+ dead_zone = d;
}
void SmoothControl::set_threshold(float t)
{
- threshold=t;
+ if(t>=0 && t<=dead_zone)
+ throw invalid_argument("SmoothControl::set_threshold");
+ threshold = t;
+}
+
+void SmoothControl::set_range(float d, float t)
+{
+ if(d<0 || (t>=0 && d>=t))
+ throw invalid_argument("SmoothControl::set_range");
+ dead_zone = d;
+ threshold = t;
}
void SmoothControl::pair(SmoothControl *ctrl)
if(paired_ctrl)
{
- SmoothControl *old_pair=paired_ctrl;
- paired_ctrl=0;
- old_pair->pair(0);
+ SmoothControl *old_pair = paired_ctrl;
+ paired_ctrl = nullptr;
+ old_pair->pair(nullptr);
}
- paired_ctrl=ctrl;
+ paired_ctrl = ctrl;
if(paired_ctrl)
paired_ctrl->pair(this);
void SmoothControl::on_motion(float v, float r)
{
- if(v<-threshold)
- value=-1;
- else if(v>threshold)
- value=1;
- else if(v<-dead_zone)
- value=(v+dead_zone)/(threshold-dead_zone);
+ float old_value = value;
+ if(v<-dead_zone)
+ value = v+dead_zone;
else if(v>dead_zone)
- value=(v-dead_zone)/(threshold-dead_zone);
+ value = v-dead_zone;
else
- value=0;
+ value = 0;
+
+ if(threshold>=0)
+ {
+ if(v<-threshold)
+ value = -1;
+ else if(v>threshold)
+ value = 1;
+ else
+ value /= threshold-dead_zone;
+ }
+
+ if(value && !old_value)
+ rising_edge = true;
+ else if(!value && old_value)
+ falling_edge = true;
signal_motion.emit(value);