X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Finput%2Fsmoothcontrol.cpp;h=0532aef68ca66d62dc6d38808da0a08c07529eb9;hb=479298192e3e5b71a402f79520c90372a4c4b504;hp=d45c9536d5e3a5b586f7d28b27e42d8a629d2ecd;hpb=daf317db7a79a4c92880042125814ca942c3a6fa;p=libs%2Fgui.git diff --git a/source/input/smoothcontrol.cpp b/source/input/smoothcontrol.cpp index d45c953..0532aef 100644 --- a/source/input/smoothcontrol.cpp +++ b/source/input/smoothcontrol.cpp @@ -1,51 +1,44 @@ -/* $Id$ - -This file is part of libmspgbase -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include "smoothcontrol.h" +#include + +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) @@ -55,12 +48,12 @@ 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); @@ -79,16 +72,28 @@ void SmoothControl::on_release() 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);