今までのジョイスティックの入力を段階分けしていた方式から、アナログ値をできる限りそのまま使用する方式に変更しました。
Fork of ControlMain2017 by
ValueProcessor.cpp
- Committer:
- YusukeWakuta
- Date:
- 2017-04-23
- Branch:
- ?????
- Revision:
- 41:d2d123d7a6fa
- Child:
- 42:6cc53727acc2
File content as of revision 41:d2d123d7a6fa:
#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); }