2017年度の製作を開始します

Dependencies:   mbed mbed-rtos

Fork of Control_Main_Full_20160608 by albatross

Committer:
YusukeWakuta
Date:
Wed Jun 07 14:14:09 2017 +0000
Branch:
?????
Revision:
51:8a579a19a4ff
Parent:
49:87af91607b46
Child:
52:a9d23be503c6
???????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
YusukeWakuta 49:87af91607b46 1 #include "InputHandler.h"
YusukeWakuta 49:87af91607b46 2 #include "mbed.h"
YusukeWakuta 49:87af91607b46 3
YusukeWakuta 49:87af91607b46 4 InputCalc::InputCalc()
YusukeWakuta 49:87af91607b46 5 {
YusukeWakuta 49:87af91607b46 6 rawNeu = 0.0;
YusukeWakuta 49:87af91607b46 7 rawMax = NORMMIN;
YusukeWakuta 49:87af91607b46 8 rawMin = NORMMAX;
YusukeWakuta 49:87af91607b46 9
YusukeWakuta 49:87af91607b46 10 shiftedMax = 0.0;
YusukeWakuta 49:87af91607b46 11 shiftedMin = 0.0;
YusukeWakuta 49:87af91607b46 12
YusukeWakuta 49:87af91607b46 13 NeushiftWidth = 0.0;
YusukeWakuta 49:87af91607b46 14 upperShiftRate = 0.0;
YusukeWakuta 49:87af91607b46 15 lowerShiftRate = 0.0;
YusukeWakuta 49:87af91607b46 16 }
YusukeWakuta 49:87af91607b46 17
YusukeWakuta 49:87af91607b46 18 void InputCalc::setNeutral(float input)
YusukeWakuta 49:87af91607b46 19 {
YusukeWakuta 49:87af91607b46 20 float sum = 0.0;
YusukeWakuta 49:87af91607b46 21 for (int i = 0; i < NEUTRAL_SUM_NUM ; i++) {
YusukeWakuta 49:87af91607b46 22 sum += input;
YusukeWakuta 49:87af91607b46 23 }
YusukeWakuta 49:87af91607b46 24 rawNeu = sum / NEUTRAL_SUM_NUM;
YusukeWakuta 49:87af91607b46 25 }
YusukeWakuta 49:87af91607b46 26
YusukeWakuta 49:87af91607b46 27 void InputCalc::setMaxAndMin(double input)
YusukeWakuta 49:87af91607b46 28 {
YusukeWakuta 49:87af91607b46 29 if (input > rawMax)
YusukeWakuta 49:87af91607b46 30 rawMax = input;
YusukeWakuta 49:87af91607b46 31 else if (input < rawMin)
YusukeWakuta 49:87af91607b46 32 rawMin = input;
YusukeWakuta 49:87af91607b46 33 }
YusukeWakuta 49:87af91607b46 34
YusukeWakuta 49:87af91607b46 35 //入力値の中央値を0とし、その分最大値と最小値をシフトします
YusukeWakuta 49:87af91607b46 36 void InputCalc::shift2ZeroNeu()
YusukeWakuta 49:87af91607b46 37 {
YusukeWakuta 51:8a579a19a4ff 38 shiftedMax = rawMax - rawNeu; //初期値を0へとシフトするので、最大値と最小値から中央値を引けばシフト各値もシフトできる
YusukeWakuta 49:87af91607b46 39 shiftedMin = rawMin - rawNeu;
YusukeWakuta 49:87af91607b46 40 }
YusukeWakuta 49:87af91607b46 41
YusukeWakuta 49:87af91607b46 42 //シフトした後の値を-1.0~1.0へと正規化するための比率を取得します
YusukeWakuta 49:87af91607b46 43 void InputCalc::GetNormRate()
YusukeWakuta 49:87af91607b46 44 {
YusukeWakuta 49:87af91607b46 45 upperShiftRate = 1.0 / shiftedMax;
YusukeWakuta 49:87af91607b46 46 lowerShiftRate = -1.0 / shiftedMin;
YusukeWakuta 49:87af91607b46 47 }
YusukeWakuta 49:87af91607b46 48
YusukeWakuta 49:87af91607b46 49 //値を-1.0~1.0へと正規化します
YusukeWakuta 49:87af91607b46 50 void InputCalc::NormValue(double *input)
YusukeWakuta 49:87af91607b46 51 {
YusukeWakuta 49:87af91607b46 52 *input -= rawNeu;
YusukeWakuta 49:87af91607b46 53 if (*input > 0.0)
YusukeWakuta 49:87af91607b46 54 *input *= upperShiftRate;
YusukeWakuta 49:87af91607b46 55 else if (*input < 0.0)
YusukeWakuta 49:87af91607b46 56 *input *= lowerShiftRate;
YusukeWakuta 49:87af91607b46 57 }
YusukeWakuta 49:87af91607b46 58
YusukeWakuta 49:87af91607b46 59 //初期値の分、入力値を0に寄せて、拡大します。
YusukeWakuta 49:87af91607b46 60 void InputCalc::WidenNeutral(double *input)
YusukeWakuta 49:87af91607b46 61 {
YusukeWakuta 49:87af91607b46 62 if (-NEUWIDTH < *input&& *input < NEUWIDTH)
YusukeWakuta 49:87af91607b46 63 *input = 0;
YusukeWakuta 49:87af91607b46 64 else if (*input < -NEUWIDTH) {
YusukeWakuta 49:87af91607b46 65 *input += NEUWIDTH;
YusukeWakuta 49:87af91607b46 66 *input *= WIDENRATE;
YusukeWakuta 49:87af91607b46 67 } else if (NEUWIDTH < *input) {
YusukeWakuta 49:87af91607b46 68 *input -= NEUWIDTH;
YusukeWakuta 49:87af91607b46 69 *input *= WIDENRATE;
YusukeWakuta 49:87af91607b46 70 }
YusukeWakuta 49:87af91607b46 71 }
YusukeWakuta 49:87af91607b46 72
YusukeWakuta 51:8a579a19a4ff 73 //範囲外の値を下限値と上限値に置き換える
YusukeWakuta 49:87af91607b46 74 double InputCalc::CutInvalidInput(double input)
YusukeWakuta 49:87af91607b46 75 {
YusukeWakuta 49:87af91607b46 76 if(input > NORMMAX)
YusukeWakuta 49:87af91607b46 77 input = NORMMAX;
YusukeWakuta 49:87af91607b46 78 else if(input < NORMMIN)
YusukeWakuta 49:87af91607b46 79 input = NORMMIN;
YusukeWakuta 49:87af91607b46 80 }
YusukeWakuta 49:87af91607b46 81
YusukeWakuta 49:87af91607b46 82 double InputCalc::Processing(double input)
YusukeWakuta 49:87af91607b46 83 {
YusukeWakuta 49:87af91607b46 84 setMaxAndMin(input);
YusukeWakuta 49:87af91607b46 85 shift2ZeroNeu();
YusukeWakuta 49:87af91607b46 86 GetNormRate();
YusukeWakuta 49:87af91607b46 87 NormValue(&input);
YusukeWakuta 49:87af91607b46 88 WidenNeutral(&input);
YusukeWakuta 49:87af91607b46 89 return CutInvalidInput(input);
YusukeWakuta 49:87af91607b46 90 }