今までのジョイスティックの入力を段階分けしていた方式から、アナログ値をできる限りそのまま使用する方式に変更しました。

Dependencies:   mbed-rtos mbed

Fork of ControlMain2017 by albatross

Branch:
?????
Revision:
41:d2d123d7a6fa
Child:
42:6cc53727acc2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ValueProcessor.cpp	Sun Apr 23 15:12:59 2017 +0000
@@ -0,0 +1,109 @@
+#include "ValueProcessor.h"
+
+enum InputType {
+    enumRoll,
+    enumPitch
+};
+
+void ValueProcess::setMaxAndMin(InputType it,float value)
+{
+    if(it == enumPitch) {
+        if(value >pitchNeutral + pitchUpperDiff)
+            pitchUpperDiff = value - pitchNeutral;
+        else if(value < rollNeutral + pitchLowerDiff)
+            pitchLowerDiff = value - pitchNeutral;
+        return;
+    } else if(it == enumRoll) {
+        if(value >rollNeutral + rollUpperDiff)
+            rollUpperDiff = value - rollNeutral;
+        else if(value < rollNeutral + rollLowerDiff)
+            rollLowerDiff = value  -rollNeutral ;
+        return;
+    }
+}
+
+void ValueProcessor::setNeutral(float rollRead,float pitchRead)
+{
+    float rollSum;
+    float pitchSum;
+
+    for(int i = 0; i < SUM_UP_NUM; i++) {
+        rollSum += rollPin.read();
+        pitchSum += pitchPin.read();
+    }
+    rollNeutral = rollSum / SUM_UP_NUM;
+    pitchNeutral = pitchSum / SUM_UP_NUM;
+
+    neutralDiff = pitchNeutral - rollNeutral; //ピッチの初期値の方がい小さいと仮定
+    rollNeutral += neutralDiff;
+    rollUpperDiff = 0;
+}
+
+//ジョイスティックの中間値から上と下の幅を合わせます。値を取得するたびに呼び出してください。範囲は広い方に合わせる物とします
+float ValueProcessor::MatchUpperAndLower(InputType it, float max,float min,float neutral,float value)
+{
+    float Upper = max- neutral;
+    float Lower  = neutral - min;
+
+    if(it == enumRoll) {
+        if(Upper > Lower) {
+            if(value < neutral) {
+                value =  neutral + ((value - neutral) * (Upper / Lower));
+                rollLowerDiff  =  -rollUpperDiff;
+            }
+        } else  {
+            if(value > neutral) {
+                value =  neutral + ((value - neutral) * (Lower / Upper));
+                rollUpperDiff = -rollLowerDiff;
+            }
+        }
+        return value;
+    } else if(it == enumPitch) {
+        if(Upper > Lower) {
+            if(value < neutral) {
+                value =  neutral + ((value -neutral) * (Upper / Lower));
+                pitchLowerDiff =  -pitchUpperDiff;
+            }
+        } else  {
+            if(value > neutral) {
+                value =  neutral + ((value - neutral) * (Lower / Upper));
+                pitchUpperDiff= -pitchLowerDiff;
+            }
+        }
+        return value;
+    } else return value;
+}
+
+//範囲外に値がない場合にエラーが発生するので範囲内に収める
+float ValueProcessor::Format2Range(float value,float max,float min)
+{
+    float result;
+
+    if(value > max)
+        result= max;
+    else if(value < min)
+        result = min;
+    else
+        result = value;
+    return result;
+}
+
+//値をint型の段階に分ける
+int ValueProcessor::PhaseFloat(float value,float max,float min)
+{
+    float PhaseWidth = (max - min) / PHASE_NUM;
+    if(value< max&& value > min) {
+        for(int i = 1; i <= PHASE_NUM; i++) {
+            if(value < min + PhaseWidth * i&& value > min + PhaseWidth * (i - 1) )
+                return i;
+        }
+    } else  if(value <= min)
+        return 1;
+    else if(value>=max)
+        return PHASE_NUM;
+}
+
+float ValueProcessor::SetRollPitchRacio(float pitch,float roll)
+{
+    return (roll + pitch * PITCHPERROLL) / (1.0 + PITCHPERROLL);
+}