![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
今までのジョイスティックの入力を段階分けしていた方式から、アナログ値をできる限りそのまま使用する方式に変更しました。
Fork of ControlMain2017 by
Diff: ValueProcessor.cpp
- 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); +}