今までのジョイスティックの入力を段階分けしていた方式から、アナログ値をできる限りそのまま使用する方式に変更しました。
Fork of ControlMain2017 by
Diff: ValueProcessor.cpp
- Branch:
- ?????
- Revision:
- 43:2d8bffac06cd
- Parent:
- 42:6cc53727acc2
- Child:
- 44:7b6f627a31da
--- a/ValueProcessor.cpp Wed Apr 26 11:57:00 2017 +0000 +++ b/ValueProcessor.cpp Fri Apr 28 10:21:00 2017 +0000 @@ -1,6 +1,8 @@ #include "ValueProcessor.h" #include "mbed.h" +#define PITCHPERROLL 1.0 + ValueProcess::ValueProcess() { rollNeutral = 0.739; @@ -65,7 +67,6 @@ rollUpperDiff = -rollLowerDiff; } } - return value; } else if(it == enumPitch) { if(Upper > Lower) { if(value < neutral) { @@ -78,8 +79,8 @@ pitchUpperDiff= -pitchLowerDiff; } } - return value; - } else return value; + } + return value; } //範囲外に値がない場合にエラーが発生するので範囲内に収める @@ -116,19 +117,43 @@ return (roll + pitch * PITCHPERROLL) / (1.0 + PITCHPERROLL); } +float ValueProcess::MatchRange(float value) +{ + float RangeRacio; + if(pitchUpperDiff - pitchLowerDiff > rollUpperDiff - rollLowerDiff) { + RangeRacio = pitchUpperDiff / rollUpperDiff; //このメソッドを呼び出す前に、ピッチとロールの上側と下側の範囲は同じようにしてるので、上側だけから比を取ってくる + if(value > rollNeutral) + value = rollNeutral + (value - rollNeutral) * RangeRacio; + else + value = rollNeutral + (value - rollNeutral) * RangeRacio; + } else { + RangeRacio = rollUpperDiff / pitchUpperDiff; + if(value > pitchNeutral) + value = pitchNeutral + (value - pitchNeutral) * RangeRacio; + else + value = pitchNeutral + (value - pitchNeutral) * RangeRacio; + } + return value; +} + void ValueProcess::Processing(float rollRead,float pitchRead,int* input_R,int* input_L) { + setMaxAndMin(enumRoll, rollRead); setMaxAndMin(enumPitch, pitchRead); float MatchedRoll = MatchUpperAndLower(enumRoll, rollNeutral + rollUpperDiff,rollNeutral + rollLowerDiff,rollNeutral,rollRead + neutralDiff); float MatchedPitch = MatchUpperAndLower(enumPitch,pitchNeutral + pitchUpperDiff,pitchNeutral + pitchLowerDiff,pitchNeutral,pitchRead); + + MatchedRoll = MatchRange(MatchedRoll); + MatchedPitch = MatchRange(MatchedPitch); + float FormatedRoll_R = Format2Range(SetRollPitchRacio(MatchedPitch,MatchedRoll),SetRollPitchRacio(pitchNeutral + pitchUpperDiff,rollNeutral + rollUpperDiff),SetRollPitchRacio(pitchNeutral + pitchLowerDiff,rollNeutral + rollLowerDiff)); + *input_R =PhaseFloat(FormatedRoll_R,SetRollPitchRacio(pitchNeutral + pitchUpperDiff,rollNeutral + rollUpperDiff),SetRollPitchRacio(pitchNeutral + pitchLowerDiff,rollNeutral + rollLowerDiff)); float FormatedRoll_L = Format2Range(SetRollPitchRacio(MatchedPitch, - MatchedRoll),SetRollPitchRacio(pitchNeutral + pitchUpperDiff,-rollNeutral - rollLowerDiff),SetRollPitchRacio(pitchNeutral +pitchLowerDiff, - rollNeutral - rollUpperDiff)); *input_L = PhaseFloat(FormatedRoll_L,SetRollPitchRacio(pitchNeutral + pitchUpperDiff ,- rollNeutral - rollLowerDiff),SetRollPitchRacio(pitchNeutral + pitchLowerDiff ,- rollNeutral - rollUpperDiff)); - if(*input_R < 1) *input_R = 1; else if(*input_R > PHASE_NUM)