ジャイロ追加前

Dependencies:   mbed FreeRTOS

Committer:
MasashiNomura
Date:
Mon Mar 11 04:24:00 2019 +0000
Revision:
64:40943c843da7
Parent:
62:4b873328d3a8
Parent:
63:aee44afe6363
Child:
66:0b3b290137b6
2019/03/11 Merge

Who changed what in which revision?

UserRevisionLine numberNew contents of line
takeru0x1103 17:f9610f3cfa1b 1 #include "HbManager.h"
takeru0x1103 17:f9610f3cfa1b 2 #include "globalFlags.h"
takeru0x1103 17:f9610f3cfa1b 3 #include "uart.h"
MasashiNomura 39:1b76f7df8804 4 #include "fpga.h"
MasashiNomura 39:1b76f7df8804 5
MasashiNomura 39:1b76f7df8804 6 UINT16 HbManager::proofOfSurvival()
MasashiNomura 39:1b76f7df8804 7 {
MasashiNomura 39:1b76f7df8804 8 return fpgaTest(1);
MasashiNomura 39:1b76f7df8804 9 }
takeru0x1103 18:5aa48aec9cae 10
takeru0x1103 18:5aa48aec9cae 11 //------------------------------------------------------
takeru0x1103 18:5aa48aec9cae 12 //姿勢状態取得
takeru0x1103 18:5aa48aec9cae 13 //------------------------------------------------------
takeru0x1103 18:5aa48aec9cae 14 void HbManager::getAttitude(){
MasashiNomura 25:f3a6e7eec9c3 15 float tmpf;
MasashiNomura 25:f3a6e7eec9c3 16 INT16 tmpi;
takeru0x1103 18:5aa48aec9cae 17 //姿勢状態取得
takeru0x1103 18:5aa48aec9cae 18 nowAngle = imu->GetYaw();
takeru0x1103 18:5aa48aec9cae 19 nowRate = imu->GetGyroZ();
MasashiNomura 47:d3fa874f336e 20
MasashiNomura 47:d3fa874f336e 21 if(gf_Cal.bf.yaw==true && gf_Cal.bf.gy==true){
MasashiNomura 47:d3fa874f336e 22 nowTrgtAng = 0;
MasashiNomura 47:d3fa874f336e 23 }
takeru0x1103 18:5aa48aec9cae 24 //ヨー角キャリブレーション
takeru0x1103 18:5aa48aec9cae 25 if(gf_Cal.bf.yaw==true){
takeru0x1103 18:5aa48aec9cae 26 imu->CalYaw();
takeru0x1103 18:5aa48aec9cae 27 gf_Cal.bf.yaw=false;
takeru0x1103 18:5aa48aec9cae 28 sp.printf("Yaw caribration %f\t",nowAngle);
takeru0x1103 18:5aa48aec9cae 29 nowAngle=0;
takeru0x1103 18:5aa48aec9cae 30 }
takeru0x1103 18:5aa48aec9cae 31 //ジャイロオフセットキャリブレーション
takeru0x1103 18:5aa48aec9cae 32 if(gf_Cal.bf.gy==true){
takeru0x1103 18:5aa48aec9cae 33 imu->CalGyro();
takeru0x1103 18:5aa48aec9cae 34 gf_Cal.bf.gy=false;
takeru0x1103 18:5aa48aec9cae 35 sp.printf("Gyro caribration %d\t",nowRate);
takeru0x1103 18:5aa48aec9cae 36 nowRate=0;
takeru0x1103 17:f9610f3cfa1b 37 }
takeru0x1103 17:f9610f3cfa1b 38
MasashiNomura 41:45c982b1c5b6 39 if(gf_Print.d1.bf.yaw) {
MasashiNomura 25:f3a6e7eec9c3 40 tmpf = imu->GetYawRef();
MasashiNomura 25:f3a6e7eec9c3 41 sp.printf("Ang\t%f ref %f\t",nowAngle,tmpf);
MasashiNomura 25:f3a6e7eec9c3 42 }
MasashiNomura 41:45c982b1c5b6 43 if(gf_Print.d1.bf.gy) {
MasashiNomura 25:f3a6e7eec9c3 44 tmpi = imu->GetGyroRef();
MasashiNomura 25:f3a6e7eec9c3 45 sp.printf("Gyr\t%d ref %d\t",nowRate,tmpi);
MasashiNomura 25:f3a6e7eec9c3 46 }
MasashiNomura 50:76413e8e073d 47 for(int i = 0; i < 4; ++i){
MasashiNomura 50:76413e8e073d 48 if(gf_MtAttOfs[i].req){
MasashiNomura 50:76413e8e073d 49 motorOfsVal[i] = gf_MtAttOfs[i].val;
MasashiNomura 50:76413e8e073d 50 gf_MtAttOfs[i].req = false;
MasashiNomura 50:76413e8e073d 51 }
MasashiNomura 50:76413e8e073d 52 }
MasashiNomura 56:f363a6877c6a 53 if(gf_MtBrk.req){
MasashiNomura 56:f363a6877c6a 54 mot_brk = gf_MtBrk.val;
MasashiNomura 56:f363a6877c6a 55 gf_MtBrk.req = false;
MasashiNomura 56:f363a6877c6a 56 sp.printf("Mot Brk:[%d]",mot_brk);
MasashiNomura 56:f363a6877c6a 57 }
YutakaTakagi 59:6b4dcd964d0f 58 if(gf_AngBrk.req){
YutakaTakagi 61:49254cc00d08 59 ang_rate_brk = gf_AngBrk.val / static_cast<float>(UPDATE_RATE);
YutakaTakagi 59:6b4dcd964d0f 60 gf_AngBrk.req = false;
YutakaTakagi 61:49254cc00d08 61 sp.printf("Ang Rate Brk:[%f]",ang_rate_brk);
YutakaTakagi 59:6b4dcd964d0f 62 }
MasashiNomura 63:aee44afe6363 63 if(gf_MtDefaultOffset.req){
MasashiNomura 63:aee44afe6363 64 mot_takeoff_offset = gf_MtDefaultOffset.val;
MasashiNomura 63:aee44afe6363 65 gf_MtDefaultOffset.req = false;
MasashiNomura 63:aee44afe6363 66 sp.printf("take off Offset:[%d]",mot_takeoff_offset);
MasashiNomura 63:aee44afe6363 67 }
takeru0x1103 18:5aa48aec9cae 68 }
MasashiNomura 25:f3a6e7eec9c3 69 void HbManager::calAtt(){
MasashiNomura 25:f3a6e7eec9c3 70 if(att == NULL) return;
MasashiNomura 25:f3a6e7eec9c3 71 if(imu == NULL) return;
MasashiNomura 25:f3a6e7eec9c3 72 imu->CalYaw();
MasashiNomura 25:f3a6e7eec9c3 73 sp.printf("Yaw auto caribration %f\t",nowAngle);
MasashiNomura 25:f3a6e7eec9c3 74 nowAngle=0;
MasashiNomura 25:f3a6e7eec9c3 75 imu->CalGyro();
MasashiNomura 25:f3a6e7eec9c3 76 sp.printf("Gyro auto caribration %d\t\r\n",nowRate);
MasashiNomura 25:f3a6e7eec9c3 77 nowRate=0;
MasashiNomura 47:d3fa874f336e 78
MasashiNomura 47:d3fa874f336e 79 nowTrgtAng = 0;
MasashiNomura 25:f3a6e7eec9c3 80 }
MasashiNomura 25:f3a6e7eec9c3 81
takeru0x1103 18:5aa48aec9cae 82 //------------------------------------------------------
takeru0x1103 18:5aa48aec9cae 83 //姿勢制御
takeru0x1103 18:5aa48aec9cae 84 //------------------------------------------------------
takeru0x1103 18:5aa48aec9cae 85 void HbManager::controlAttitude(){
takeru0x1103 19:4b0fe9a5ec38 86
MasashiNomura 36:2cc739c7e4cb 87 float pidRtn;
MasashiNomura 36:2cc739c7e4cb 88
MasashiNomura 48:71aec693a7dc 89 if(g_PidPara.mode == PID_0_OFF || g_PidPara.mode == PID_0_ON){
MasashiNomura 48:71aec693a7dc 90 pidRtn = att->pid(nowTrgtAng,nowAngle,nowRate);
MasashiNomura 48:71aec693a7dc 91 } else {
MasashiNomura 48:71aec693a7dc 92 pidRtn = att->pid2(nowTrgtAng,nowAngle,nowRate);
MasashiNomura 48:71aec693a7dc 93 }
takeru0x1103 19:4b0fe9a5ec38 94
MasashiNomura 47:d3fa874f336e 95 if(att != NULL){
MasashiNomura 48:71aec693a7dc 96 if(gf_Print.d1.bf.pp){sp.printf("PID:PP=%f,",att->getPp());}
MasashiNomura 47:d3fa874f336e 97 if(gf_Print.d1.bf.p) {sp.printf("PID:P=%f,",att->getP()); }
MasashiNomura 47:d3fa874f336e 98 if(gf_Print.d1.bf.i) {sp.printf("PID:I=%f,",att->getI()); }
MasashiNomura 47:d3fa874f336e 99 if(gf_Print.d1.bf.d) {sp.printf("PID:D=%f,",att->getD()); }
MasashiNomura 47:d3fa874f336e 100 if(gf_Print.d1.bf.v) {sp.printf("PID:V=%f,",att->getV()); }
MasashiNomura 47:d3fa874f336e 101 if(gf_Print.d1.bf.fb){
YutakaTakagi 62:4b873328d3a8 102 sp.printf("PID FB: %f, %f, %f, %f,", pidRtn, nowTrgtAng, nowAngle, nowRate);
MasashiNomura 47:d3fa874f336e 103 }
MasashiNomura 46:5074781a28dd 104 }
MasashiNomura 48:71aec693a7dc 105 float fl, fr, bl, br;
MasashiNomura 56:f363a6877c6a 106 if(gf_State == TAKE_OFF || gf_State == DRIVE || gf_State == HOVER){
MasashiNomura 56:f363a6877c6a 107 if(g_PidPara.mode == PID_0_ON){
MasashiNomura 56:f363a6877c6a 108 if(pidRtn < 0){
MasashiNomura 56:f363a6877c6a 109 //fl = pidRtn - motorOfsVal[0];
MasashiNomura 56:f363a6877c6a 110 fl = 0.0;
MasashiNomura 56:f363a6877c6a 111 fr = -pidRtn + motorOfsVal[1];
MasashiNomura 56:f363a6877c6a 112 bl = -pidRtn + motorOfsVal[2];
MasashiNomura 56:f363a6877c6a 113 //br = pidRtn - motorOfsVal[3];
MasashiNomura 56:f363a6877c6a 114 br = 0.0;
MasashiNomura 56:f363a6877c6a 115 } else {
MasashiNomura 56:f363a6877c6a 116 fl = pidRtn + motorOfsVal[0];
MasashiNomura 56:f363a6877c6a 117 //fr = -pidRtn - motorOfsVal[1];
MasashiNomura 56:f363a6877c6a 118 //bl = -pidRtn - motorOfsVal[2];
MasashiNomura 56:f363a6877c6a 119 fr = 0.0;
MasashiNomura 56:f363a6877c6a 120 bl = 0.0;
MasashiNomura 56:f363a6877c6a 121 br = pidRtn + motorOfsVal[3];
MasashiNomura 56:f363a6877c6a 122 }
MasashiNomura 56:f363a6877c6a 123 } else if(g_PidPara.mode == PID_1_ON){
MasashiNomura 56:f363a6877c6a 124 if(pidRtn < 0){
MasashiNomura 56:f363a6877c6a 125 fl = -pidRtn * 2.25 + motorOfsVal[0];
MasashiNomura 56:f363a6877c6a 126 fr = pidRtn * 2.25 - motorOfsVal[1];
MasashiNomura 56:f363a6877c6a 127 bl = pidRtn * 2.25 - motorOfsVal[2];
MasashiNomura 56:f363a6877c6a 128 br = -pidRtn * 2.25 + motorOfsVal[3];
MasashiNomura 56:f363a6877c6a 129 } else {
MasashiNomura 56:f363a6877c6a 130 fl = -pidRtn * 2.25 - motorOfsVal[0];
MasashiNomura 56:f363a6877c6a 131 fr = pidRtn * 2.25 + motorOfsVal[1];
MasashiNomura 56:f363a6877c6a 132 bl = pidRtn * 2.25 + motorOfsVal[2];
MasashiNomura 56:f363a6877c6a 133 br = -pidRtn * 2.25 - motorOfsVal[3];
MasashiNomura 56:f363a6877c6a 134 }
MasashiNomura 56:f363a6877c6a 135 }else{
MasashiNomura 56:f363a6877c6a 136 fl = 0;
MasashiNomura 56:f363a6877c6a 137 fr = 0;
MasashiNomura 56:f363a6877c6a 138 bl = 0;
MasashiNomura 56:f363a6877c6a 139 br = 0;
MasashiNomura 51:9a994998607b 140 }
MasashiNomura 56:f363a6877c6a 141 } else {
MasashiNomura 48:71aec693a7dc 142 fl = 0;
MasashiNomura 48:71aec693a7dc 143 fr = 0;
MasashiNomura 48:71aec693a7dc 144 bl = 0;
MasashiNomura 48:71aec693a7dc 145 br = 0;
MasashiNomura 46:5074781a28dd 146 }
MasashiNomura 32:7f4145cc3551 147 gf_MtReq[0].val = (INT16)fl;
MasashiNomura 32:7f4145cc3551 148 gf_MtReq[1].val = (INT16)fr;
MasashiNomura 32:7f4145cc3551 149 gf_MtReq[2].val = (INT16)bl;
MasashiNomura 32:7f4145cc3551 150 gf_MtReq[3].val = (INT16)br;
MasashiNomura 46:5074781a28dd 151 for(int i = 0; i < 4; ++i){
MasashiNomura 46:5074781a28dd 152 gf_MtReq[i].req = true;
MasashiNomura 46:5074781a28dd 153 }
takeru0x1103 17:f9610f3cfa1b 154 }
MasashiNomura 24:c5945aaae777 155
MasashiNomura 24:c5945aaae777 156 void HbManager::controlAttitude(float cmdAngle){
MasashiNomura 24:c5945aaae777 157 float pidRtn;
MasashiNomura 24:c5945aaae777 158
MasashiNomura 36:2cc739c7e4cb 159 pidRtn = att->pid2(cmdAngle,nowAngle,nowRate);
MasashiNomura 36:2cc739c7e4cb 160
MasashiNomura 41:45c982b1c5b6 161 if(gf_Print.d1.bf.pp){sp.printf("PID:P=%f,",att->getPp());}
MasashiNomura 41:45c982b1c5b6 162 if(gf_Print.d1.bf.p) {sp.printf("PID:P=%f,",att->getP()); }
MasashiNomura 41:45c982b1c5b6 163 if(gf_Print.d1.bf.i) {sp.printf("PID:I=%f,",att->getI()); }
MasashiNomura 41:45c982b1c5b6 164 if(gf_Print.d1.bf.d) {sp.printf("PID:D=%f,",att->getD()); }
MasashiNomura 41:45c982b1c5b6 165 if(gf_Print.d1.bf.v) {sp.printf("PID:V=%f,",att->getV()); }
MasashiNomura 41:45c982b1c5b6 166 if(gf_Print.d1.bf.fb){
MasashiNomura 36:2cc739c7e4cb 167 sp.printf("PID FB,%f,",pidRtn);
MasashiNomura 36:2cc739c7e4cb 168 sp.printf("%f,",nowAngle);
MasashiNomura 36:2cc739c7e4cb 169 sp.printf("%f,",nowRate);
MasashiNomura 36:2cc739c7e4cb 170 }
MasashiNomura 24:c5945aaae777 171
MasashiNomura 24:c5945aaae777 172 //右回りはセンサ値はプラスで逆に戻そうとしてPIDの結果はマイナスで左回りのフィードバック(左前と右後ろを強く)
MasashiNomura 36:2cc739c7e4cb 173 // MAX RPM=9000 PWM MAX Val=4095 -> 2.25
MasashiNomura 36:2cc739c7e4cb 174 float fl = pidRtn * 2.25 * -1;
MasashiNomura 36:2cc739c7e4cb 175 float fr = pidRtn * 2.25;
MasashiNomura 36:2cc739c7e4cb 176 float bl = pidRtn * 2.25;
MasashiNomura 36:2cc739c7e4cb 177 float br = pidRtn * 2.25 * -1;
MasashiNomura 36:2cc739c7e4cb 178 gf_MtReq[0].val = (INT16)fl;
MasashiNomura 36:2cc739c7e4cb 179 gf_MtReq[1].val = (INT16)fr;
MasashiNomura 36:2cc739c7e4cb 180 gf_MtReq[2].val = (INT16)bl;
MasashiNomura 36:2cc739c7e4cb 181 gf_MtReq[3].val = (INT16)br;
MasashiNomura 46:5074781a28dd 182 for(int i = 0; i < 4; ++i){
MasashiNomura 46:5074781a28dd 183 gf_MtReq[i].req = true;
MasashiNomura 46:5074781a28dd 184 }
MasashiNomura 36:2cc739c7e4cb 185
MasashiNomura 36:2cc739c7e4cb 186 // float pidRtn;
MasashiNomura 36:2cc739c7e4cb 187
MasashiNomura 36:2cc739c7e4cb 188 // pidRtn= att->pid(cmdAngle,nowAngle,nowRate);
MasashiNomura 36:2cc739c7e4cb 189 // //
MasashiNomura 41:45c982b1c5b6 190 // if(gf_Print.d1.bf.pp){sp.printf("PID:P=%f,",att->getPp());}
MasashiNomura 41:45c982b1c5b6 191 // if(gf_Print.d1.bf.p) {sp.printf("PID:P=%f,",att->getP()); }
MasashiNomura 41:45c982b1c5b6 192 // if(gf_Print.d1.bf.i) {sp.printf("PID:I=%f,",att->getI()); }
MasashiNomura 41:45c982b1c5b6 193 // if(gf_Print.d1.bf.d) {sp.printf("PID:D=%f,",att->getD()); }
MasashiNomura 41:45c982b1c5b6 194 // if(gf_Print.d1.bf.fb){sp.printf("PID feedback=%f,",pidRtn);}
MasashiNomura 24:c5945aaae777 195
MasashiNomura 36:2cc739c7e4cb 196 // //右回りはセンサ値はプラスで逆に戻そうとしてPIDの結果はマイナスで左回りのフィードバック(左前と右後ろを強く)
MasashiNomura 36:2cc739c7e4cb 197 // float fl = pidRtn * -1;
MasashiNomura 36:2cc739c7e4cb 198 // float fr = pidRtn;
MasashiNomura 36:2cc739c7e4cb 199 // float bl = pidRtn;
MasashiNomura 36:2cc739c7e4cb 200 // float br = pidRtn * -1;
MasashiNomura 36:2cc739c7e4cb 201
MasashiNomura 36:2cc739c7e4cb 202 // motorVal[0] = (INT16)fl;//前左
MasashiNomura 36:2cc739c7e4cb 203 // motorVal[1] = (INT16)fr;//前右
MasashiNomura 36:2cc739c7e4cb 204 // motorVal[2] = (INT16)bl;//後左
MasashiNomura 36:2cc739c7e4cb 205 // motorVal[3] = (INT16)br;//後右
MasashiNomura 24:c5945aaae777 206 }
MasashiNomura 24:c5945aaae777 207
MasashiNomura 24:c5945aaae777 208 void HbManager::setAttPara(typPidPara para){
MasashiNomura 24:c5945aaae777 209 if(att == NULL) return;
MasashiNomura 24:c5945aaae777 210 att->setPp(para.PP);
MasashiNomura 24:c5945aaae777 211 att->setP(para.P);
MasashiNomura 24:c5945aaae777 212 att->setI(para.I);
MasashiNomura 24:c5945aaae777 213 att->setD(para.D);
MasashiNomura 24:c5945aaae777 214 att->setIMax(para.IMax);
MasashiNomura 24:c5945aaae777 215 att->setIMin(para.IMin);
MasashiNomura 31:56c554c560c1 216 att->setV(para.V);
MasashiNomura 24:c5945aaae777 217 }
MasashiNomura 24:c5945aaae777 218
takeru0x1103 18:5aa48aec9cae 219 //------------------------------------------------------
takeru0x1103 18:5aa48aec9cae 220 //モーター制御
takeru0x1103 18:5aa48aec9cae 221 //------------------------------------------------------
takeru0x1103 18:5aa48aec9cae 222 void HbManager::controlMotor(){
MasashiNomura 25:f3a6e7eec9c3 223 INT16 tmp,dif;
MasashiNomura 56:f363a6877c6a 224 // DEBUG用FPGAに直接指示用
MasashiNomura 40:debe99e228d3 225 INT16 pos;
MasashiNomura 40:debe99e228d3 226 INT16 typ;
MasashiNomura 40:debe99e228d3 227 if(gf_State == SLEEP){
MasashiNomura 40:debe99e228d3 228 for(int i = 0; i < 8; ++i){
MasashiNomura 40:debe99e228d3 229 pos = i / 2;
MasashiNomura 40:debe99e228d3 230 typ = i % 2;
MasashiNomura 56:f363a6877c6a 231 tmp = subProp[pos]->getValueFpgaMot((eMotType)typ);
MasashiNomura 40:debe99e228d3 232 if(gf_MtReqDct[i].req){
MasashiNomura 40:debe99e228d3 233 dif = tmp - (INT16)gf_MtReqDct[i].val;
MasashiNomura 40:debe99e228d3 234 if(dif == 0){
MasashiNomura 40:debe99e228d3 235 subProp[pos]->setValueFpgaMot((eMotType)typ, (INT16)gf_MtReqDct[i].val);
MasashiNomura 40:debe99e228d3 236 gf_MtReqDct[i].req = false;
MasashiNomura 40:debe99e228d3 237 }
MasashiNomura 40:debe99e228d3 238 else {
MasashiNomura 40:debe99e228d3 239 if(1000 < dif){
MasashiNomura 40:debe99e228d3 240 tmp-=100;
MasashiNomura 40:debe99e228d3 241 }
MasashiNomura 40:debe99e228d3 242 else if(100 < dif){
MasashiNomura 40:debe99e228d3 243 tmp-= 10;
MasashiNomura 40:debe99e228d3 244 }
MasashiNomura 40:debe99e228d3 245 else if(100 >= dif && 10 < dif){
MasashiNomura 40:debe99e228d3 246 tmp-= 5;
MasashiNomura 40:debe99e228d3 247 }
MasashiNomura 40:debe99e228d3 248 else if ( 10 >= dif && 1 <= dif){
MasashiNomura 40:debe99e228d3 249 tmp-=1;
MasashiNomura 40:debe99e228d3 250 }
MasashiNomura 40:debe99e228d3 251 else if ( -1000 > dif){
MasashiNomura 40:debe99e228d3 252 tmp+=100;
MasashiNomura 40:debe99e228d3 253 }
MasashiNomura 40:debe99e228d3 254 else if ( -100 >= dif){
MasashiNomura 40:debe99e228d3 255 tmp+=10;
MasashiNomura 40:debe99e228d3 256 }
MasashiNomura 40:debe99e228d3 257 else if(-100 <= dif && -10 > dif){
MasashiNomura 40:debe99e228d3 258 tmp+= 5;
MasashiNomura 40:debe99e228d3 259 }
MasashiNomura 40:debe99e228d3 260 else if ( -10 <= dif && -1 >= dif){
MasashiNomura 40:debe99e228d3 261 tmp+=1;
MasashiNomura 40:debe99e228d3 262 }
MasashiNomura 40:debe99e228d3 263 subProp[pos]->setValueFpgaMot((eMotType)typ, tmp);
MasashiNomura 40:debe99e228d3 264 }
MasashiNomura 40:debe99e228d3 265 }
MasashiNomura 56:f363a6877c6a 266 else
MasashiNomura 56:f363a6877c6a 267 {
MasashiNomura 56:f363a6877c6a 268 subProp[pos]->setValueFpgaMot((eMotType)typ, tmp);
MasashiNomura 56:f363a6877c6a 269 }
MasashiNomura 40:debe99e228d3 270 }
MasashiNomura 40:debe99e228d3 271 }
MasashiNomura 56:f363a6877c6a 272 else
MasashiNomura 56:f363a6877c6a 273 {
MasashiNomura 56:f363a6877c6a 274 // オフセット分の回転数セット
MasashiNomura 56:f363a6877c6a 275 for(int i = 0; i < 4; ++i){
MasashiNomura 56:f363a6877c6a 276 tmp = subProp[i]->getValue(OFS);
MasashiNomura 56:f363a6877c6a 277 if(gf_MtReqOfs[i].req){
MasashiNomura 56:f363a6877c6a 278 dif = tmp - (INT16)gf_MtReqOfs[i].val;
MasashiNomura 56:f363a6877c6a 279 if(dif == 0){
MasashiNomura 56:f363a6877c6a 280 subProp[i]->setValue(OFS, (INT16)gf_MtReqOfs[i].val);
MasashiNomura 56:f363a6877c6a 281 gf_MtReqOfs[i].req = false;
MasashiNomura 56:f363a6877c6a 282 }
MasashiNomura 56:f363a6877c6a 283 else {
MasashiNomura 56:f363a6877c6a 284 if(1000 < dif){
MasashiNomura 56:f363a6877c6a 285 tmp-=100;
MasashiNomura 56:f363a6877c6a 286 }
MasashiNomura 56:f363a6877c6a 287 else if(100 < dif){
MasashiNomura 56:f363a6877c6a 288 tmp-= 10;
MasashiNomura 56:f363a6877c6a 289 }
MasashiNomura 56:f363a6877c6a 290 else if(100 >= dif && 10 < dif){
MasashiNomura 56:f363a6877c6a 291 tmp-= 5;
MasashiNomura 56:f363a6877c6a 292 }
MasashiNomura 56:f363a6877c6a 293 else if ( 10 >= dif && 1 <= dif){
MasashiNomura 56:f363a6877c6a 294 tmp-=1;
MasashiNomura 56:f363a6877c6a 295 }
MasashiNomura 56:f363a6877c6a 296 else if ( -1000 > dif){
MasashiNomura 56:f363a6877c6a 297 tmp+=100;
MasashiNomura 56:f363a6877c6a 298 }
MasashiNomura 56:f363a6877c6a 299 else if ( -100 >= dif){
MasashiNomura 56:f363a6877c6a 300 tmp+=10;
MasashiNomura 56:f363a6877c6a 301 }
MasashiNomura 56:f363a6877c6a 302 else if(-100 <= dif && -10 > dif){
MasashiNomura 56:f363a6877c6a 303 tmp+= 5;
MasashiNomura 56:f363a6877c6a 304 }
MasashiNomura 56:f363a6877c6a 305 else if ( -10 <= dif && -1 >= dif){
MasashiNomura 56:f363a6877c6a 306 tmp+=1;
MasashiNomura 56:f363a6877c6a 307 }
MasashiNomura 56:f363a6877c6a 308 subProp[i]->setValue(OFS, tmp);
MasashiNomura 56:f363a6877c6a 309 }
MasashiNomura 56:f363a6877c6a 310 }
MasashiNomura 56:f363a6877c6a 311 else
MasashiNomura 56:f363a6877c6a 312 {
MasashiNomura 56:f363a6877c6a 313 subProp[i]->setValue(OFS, tmp);
MasashiNomura 56:f363a6877c6a 314 }
MasashiNomura 56:f363a6877c6a 315 }
MasashiNomura 56:f363a6877c6a 316
MasashiNomura 56:f363a6877c6a 317 // 姿勢制御分の回転数セット
MasashiNomura 56:f363a6877c6a 318 for(int i = 0; i< 4;++i){
MasashiNomura 56:f363a6877c6a 319 if(gf_MtReq[i].req){
MasashiNomura 56:f363a6877c6a 320 subProp[i]->setValue(ATT,gf_MtReq[i].val);
MasashiNomura 56:f363a6877c6a 321 gf_MtReq[i].req = false;
MasashiNomura 56:f363a6877c6a 322 }
MasashiNomura 56:f363a6877c6a 323 else
MasashiNomura 56:f363a6877c6a 324 {
MasashiNomura 56:f363a6877c6a 325 tmp = subProp[i]->getValue(ATT);
MasashiNomura 56:f363a6877c6a 326 subProp[i]->setValue(ATT,tmp);
MasashiNomura 56:f363a6877c6a 327 }
MasashiNomura 56:f363a6877c6a 328 }
MasashiNomura 56:f363a6877c6a 329
MasashiNomura 56:f363a6877c6a 330 // ユーザー操作分の回転数セット
MasashiNomura 56:f363a6877c6a 331 for(int i = 0; i < 4; ++i){
MasashiNomura 56:f363a6877c6a 332 if(gf_MtReqU[i].req){
MasashiNomura 56:f363a6877c6a 333 subProp[i]->setValue(USER,gf_MtReqU[i].val);
MasashiNomura 56:f363a6877c6a 334 gf_MtReqU[i].req = false;
MasashiNomura 56:f363a6877c6a 335 }
MasashiNomura 56:f363a6877c6a 336 else
MasashiNomura 56:f363a6877c6a 337 {
MasashiNomura 56:f363a6877c6a 338 tmp = subProp[i]->getValue(USER);
MasashiNomura 56:f363a6877c6a 339 subProp[i]->setValue(USER,tmp);
MasashiNomura 56:f363a6877c6a 340 }
MasashiNomura 56:f363a6877c6a 341 }
MasashiNomura 56:f363a6877c6a 342
MasashiNomura 56:f363a6877c6a 343 for(int i = 0; i < 4; ++i){
MasashiNomura 56:f363a6877c6a 344 subProp[i]->setValue();
MasashiNomura 56:f363a6877c6a 345 }
MasashiNomura 56:f363a6877c6a 346 }
MasashiNomura 56:f363a6877c6a 347
MasashiNomura 56:f363a6877c6a 348 if(gf_Print.d1.bf.m1){ sp.printf("m1=%d,",(INT16)subProp[0]->getValue(ATT)); }
MasashiNomura 56:f363a6877c6a 349 if(gf_Print.d1.bf.m2){ sp.printf("m2=%d,",(INT16)subProp[1]->getValue(ATT)); }
MasashiNomura 56:f363a6877c6a 350 if(gf_Print.d1.bf.m3){ sp.printf("m3=%d,",(INT16)subProp[2]->getValue(ATT)); }
MasashiNomura 56:f363a6877c6a 351 if(gf_Print.d1.bf.m4){ sp.printf("m4=%d,",(INT16)subProp[3]->getValue(ATT)); }
MasashiNomura 26:732bc37fbefd 352 }
MasashiNomura 26:732bc37fbefd 353
MasashiNomura 30:13ada1a24c59 354 INT16 HbManager::getCurMotVal(eMotPos pos){
MasashiNomura 30:13ada1a24c59 355 if(subProp[(int)pos] == NULL) return 0;
MasashiNomura 32:7f4145cc3551 356 return subProp[(int)pos]->getValue(USER);
MasashiNomura 30:13ada1a24c59 357 }
MasashiNomura 46:5074781a28dd 358
MasashiNomura 30:13ada1a24c59 359 void HbManager::setMotVal(eMotPos pos, INT16 val){
MasashiNomura 30:13ada1a24c59 360 if(subProp[(int)pos] == NULL) return;
MasashiNomura 32:7f4145cc3551 361 subProp[(int)pos]->setValue(USER, val);
MasashiNomura 30:13ada1a24c59 362 }
MasashiNomura 25:f3a6e7eec9c3 363
MasashiNomura 46:5074781a28dd 364 void HbManager::setMotValOfs(eMotPos pos, INT16 val){
MasashiNomura 46:5074781a28dd 365 if(subProp[(int)pos] == NULL) return;
MasashiNomura 46:5074781a28dd 366 subProp[(int)pos]->setValue(OFS, val);
MasashiNomura 46:5074781a28dd 367 }
MasashiNomura 46:5074781a28dd 368
MasashiNomura 56:f363a6877c6a 369 void HbManager::setMotValAtt(eMotPos pos, INT16 val){
MasashiNomura 56:f363a6877c6a 370 if(subProp[(int)pos] == NULL) return;
MasashiNomura 56:f363a6877c6a 371 subProp[(int)pos]->setValue(ATT, val);
MasashiNomura 56:f363a6877c6a 372 }
MasashiNomura 56:f363a6877c6a 373
MasashiNomura 63:aee44afe6363 374 void HbManager::setMotTakeOffOffset(){
MasashiNomura 63:aee44afe6363 375 for(int i = 0; i < 4; ++i){
MasashiNomura 63:aee44afe6363 376 gf_MtReqOfs[i].req = true;
MasashiNomura 63:aee44afe6363 377 gf_MtReqOfs[i].val = mot_takeoff_offset;
MasashiNomura 63:aee44afe6363 378 }
MasashiNomura 63:aee44afe6363 379 }
MasashiNomura 40:debe99e228d3 380 void HbManager::setFpgaMot(eMotPos pos,eMotType type, INT16 val){
MasashiNomura 40:debe99e228d3 381 if(subProp[(int)pos] == NULL) return;
MasashiNomura 40:debe99e228d3 382 subProp[(int)pos]->setValueFpgaMot(type, val);
MasashiNomura 40:debe99e228d3 383 }
MasashiNomura 40:debe99e228d3 384
MasashiNomura 36:2cc739c7e4cb 385 // void HbManager::setMotFPGA(UCHAR num, INT16 val){
MasashiNomura 36:2cc739c7e4cb 386 // //UCHAR tmpN = num / 2;
MasashiNomura 36:2cc739c7e4cb 387 // //UCHAR tmp = num % 2;
MasashiNomura 36:2cc739c7e4cb 388 // // mot[tmpN]->setValueFPGA(tmp, val);
MasashiNomura 36:2cc739c7e4cb 389 // // sp.printf("FPGA Direct NUM:[%d] [%d]\r\n",tmpN, tmp, val);
MasashiNomura 36:2cc739c7e4cb 390 // }
MasashiNomura 27:ff63c23bc689 391
takeru0x1103 17:f9610f3cfa1b 392 //------------------------------------------------------
takeru0x1103 17:f9610f3cfa1b 393 //エンジン制御
takeru0x1103 17:f9610f3cfa1b 394 //------------------------------------------------------
MasashiNomura 39:1b76f7df8804 395 void HbManager::getEngine(){
takeru0x1103 18:5aa48aec9cae 396 UINT16 rpm[2];
takeru0x1103 17:f9610f3cfa1b 397
takeru0x1103 18:5aa48aec9cae 398 //エンジン回転数読み出し
takeru0x1103 18:5aa48aec9cae 399 rpm[0] = eng[0]->getRpm();
takeru0x1103 18:5aa48aec9cae 400 rpm[1] = eng[1]->getRpm();
takeru0x1103 17:f9610f3cfa1b 401
MasashiNomura 41:45c982b1c5b6 402 if(gf_Print.d1.bf.e1){ sp.printf("%d",rpm[0]); }
MasashiNomura 41:45c982b1c5b6 403 if(gf_Print.d1.bf.e2){ sp.printf("%d,",rpm[1]); }
MasashiNomura 42:cc8501b824ba 404 if(gf_Print.d2.bf.ep1){sp.printf("set %d hover %d ", getAccelVal(FRONT), getHvAxl(FRONT));}
MasashiNomura 42:cc8501b824ba 405 if(gf_Print.d2.bf.ep2){sp.printf("set %d hover %d ", getAccelVal(REAR), getHvAxl(REAR));}
MasashiNomura 42:cc8501b824ba 406
MasashiNomura 42:cc8501b824ba 407 if(gf_AxReqH[0].bf.req){
MasashiNomura 42:cc8501b824ba 408 setHvAxl(FRONT,gf_AxReqH[0].bf.val);
MasashiNomura 42:cc8501b824ba 409 gf_AxReqH[0].bf.req = false;
MasashiNomura 42:cc8501b824ba 410 }
MasashiNomura 42:cc8501b824ba 411 if(gf_AxReqH[1].bf.req){
MasashiNomura 42:cc8501b824ba 412 setHvAxl(REAR,gf_AxReqH[1].bf.val);
MasashiNomura 42:cc8501b824ba 413 gf_AxReqH[1].bf.req = false;
MasashiNomura 42:cc8501b824ba 414 }
MasashiNomura 43:156199c2f9b6 415 for(int i = 0; i < 2; ++i){
MasashiNomura 43:156199c2f9b6 416 if(gf_AxStepReq[i].bf.req){
MasashiNomura 43:156199c2f9b6 417 en_srv_step[i] = gf_AxStepReq[i].bf.val;
MasashiNomura 43:156199c2f9b6 418 gf_AxStepReq[i].bf.req = false;
MasashiNomura 53:b09c062cc31c 419 sp.printf("set Axl Step [%d] val[%d]",i+1, en_srv_step[i]);
MasashiNomura 53:b09c062cc31c 420 }
MasashiNomura 53:b09c062cc31c 421 if(gf_AxAdjStepReq[i].bf.req){
MasashiNomura 53:b09c062cc31c 422 en_srv_adj_step[i] = gf_AxAdjStepReq[i].bf.val;
MasashiNomura 53:b09c062cc31c 423 gf_AxAdjStepReq[i].bf.req = false;
MasashiNomura 53:b09c062cc31c 424 sp.printf("set Axl Adjust Step [%d] val[%d]",i+1, en_srv_adj_step[i]);
MasashiNomura 43:156199c2f9b6 425 }
MasashiNomura 43:156199c2f9b6 426 }
MasashiNomura 39:1b76f7df8804 427 }
MasashiNomura 39:1b76f7df8804 428
MasashiNomura 39:1b76f7df8804 429 void HbManager::controlEngine(){
MasashiNomura 39:1b76f7df8804 430 int i;
MasashiNomura 41:45c982b1c5b6 431 INT16 tmp, dif;
MasashiNomura 45:3b51dd26b579 432 INT16 step = 100;
takeru0x1103 18:5aa48aec9cae 433 //アクセル設定
takeru0x1103 18:5aa48aec9cae 434 for(i=0; i<2; i++){
MasashiNomura 38:24ee50452755 435 if(gf_AxReq[i].bf.req==true){
MasashiNomura 45:3b51dd26b579 436 step = en_srv_step[i];
MasashiNomura 41:45c982b1c5b6 437 tmp = eng[i]->getAccel();
MasashiNomura 41:45c982b1c5b6 438 dif = tmp - (INT16)gf_AxReq[i].bf.val;
MasashiNomura 41:45c982b1c5b6 439 if(dif == 0){
MasashiNomura 45:3b51dd26b579 440 accelVal[i] = gf_AxReq[i].bf.val;
MasashiNomura 45:3b51dd26b579 441 eng[i]->setAccel(accelVal[i]);
MasashiNomura 41:45c982b1c5b6 442 gf_AxReq[i].bf.req=false;
MasashiNomura 42:cc8501b824ba 443 //sp.printf("Servo Moving FINISH!!\r\n");
MasashiNomura 41:45c982b1c5b6 444 }
MasashiNomura 41:45c982b1c5b6 445 else {
MasashiNomura 41:45c982b1c5b6 446 if(dif > 0){
MasashiNomura 41:45c982b1c5b6 447 if(dif > step){
MasashiNomura 41:45c982b1c5b6 448 tmp -= step;
MasashiNomura 41:45c982b1c5b6 449 }
MasashiNomura 41:45c982b1c5b6 450 else
MasashiNomura 41:45c982b1c5b6 451 {
MasashiNomura 41:45c982b1c5b6 452 tmp -= dif;
MasashiNomura 41:45c982b1c5b6 453 }
MasashiNomura 41:45c982b1c5b6 454 }
MasashiNomura 41:45c982b1c5b6 455 else {
MasashiNomura 41:45c982b1c5b6 456 if( abs(dif) > step){
MasashiNomura 41:45c982b1c5b6 457 tmp += step;
MasashiNomura 41:45c982b1c5b6 458 }
MasashiNomura 41:45c982b1c5b6 459 else
MasashiNomura 41:45c982b1c5b6 460 {
MasashiNomura 41:45c982b1c5b6 461 tmp -= dif;
MasashiNomura 41:45c982b1c5b6 462 }
MasashiNomura 41:45c982b1c5b6 463 }
MasashiNomura 41:45c982b1c5b6 464 eng[i]->setAccel(tmp);
MasashiNomura 41:45c982b1c5b6 465 }
MasashiNomura 41:45c982b1c5b6 466 //sp.printf("val=%d\r\n" , gf_AxReq[i].bf.val);
MasashiNomura 45:3b51dd26b579 467 }
MasashiNomura 45:3b51dd26b579 468 else
MasashiNomura 45:3b51dd26b579 469 {// 直前でセットされた値をセット
MasashiNomura 45:3b51dd26b579 470 eng[i]->setAccel(accelVal[i]);
takeru0x1103 18:5aa48aec9cae 471 }
takeru0x1103 17:f9610f3cfa1b 472 }
MasashiNomura 36:2cc739c7e4cb 473 }
MasashiNomura 46:5074781a28dd 474
MasashiNomura 46:5074781a28dd 475 void HbManager::controlEngine(enmHbState stat){
MasashiNomura 46:5074781a28dd 476 int i;
MasashiNomura 46:5074781a28dd 477 INT16 tmp, dif;
MasashiNomura 46:5074781a28dd 478 INT16 step = 100;
MasashiNomura 46:5074781a28dd 479 //アクセル設定
MasashiNomura 46:5074781a28dd 480 if(stat == CHK_EG_F || stat == CHK_EG_R){
MasashiNomura 46:5074781a28dd 481 for(i=0; i<2; i++){
MasashiNomura 46:5074781a28dd 482 if(gf_AxReq[i].bf.req==true){
MasashiNomura 46:5074781a28dd 483 accelVal[i] = gf_AxReq[i].bf.val;
MasashiNomura 46:5074781a28dd 484 eng[i]->setAccel(accelVal[i]);
MasashiNomura 46:5074781a28dd 485 gf_AxReq[i].bf.req=false;
MasashiNomura 46:5074781a28dd 486 //sp.printf("val=%d\r\n" , accelVal[i]);
MasashiNomura 46:5074781a28dd 487 }
MasashiNomura 46:5074781a28dd 488 else
MasashiNomura 46:5074781a28dd 489 {// 直前でセットされた値をセット
MasashiNomura 46:5074781a28dd 490 eng[i]->setAccel(accelVal[i]);
MasashiNomura 46:5074781a28dd 491 }
MasashiNomura 46:5074781a28dd 492 }
MasashiNomura 46:5074781a28dd 493 }else {
MasashiNomura 46:5074781a28dd 494 for(i=0; i<2; i++){
MasashiNomura 46:5074781a28dd 495 if(gf_AxReq[i].bf.req==true){
MasashiNomura 46:5074781a28dd 496 step = en_srv_step[i];
MasashiNomura 46:5074781a28dd 497 tmp = eng[i]->getAccel();
MasashiNomura 46:5074781a28dd 498 dif = tmp - (INT16)gf_AxReq[i].bf.val;
MasashiNomura 46:5074781a28dd 499 if(dif == 0){
MasashiNomura 46:5074781a28dd 500 accelVal[i] = gf_AxReq[i].bf.val;
MasashiNomura 46:5074781a28dd 501 eng[i]->setAccel(accelVal[i]);
MasashiNomura 46:5074781a28dd 502 gf_AxReq[i].bf.req=false;
MasashiNomura 46:5074781a28dd 503 //sp.printf("Servo Moving FINISH!!\r\n");
MasashiNomura 46:5074781a28dd 504 }
MasashiNomura 46:5074781a28dd 505 else {
MasashiNomura 46:5074781a28dd 506 if(dif > 0){
MasashiNomura 46:5074781a28dd 507 if(dif > step){
MasashiNomura 46:5074781a28dd 508 tmp -= step;
MasashiNomura 46:5074781a28dd 509 }
MasashiNomura 46:5074781a28dd 510 else
MasashiNomura 46:5074781a28dd 511 {
MasashiNomura 46:5074781a28dd 512 tmp -= dif;
MasashiNomura 46:5074781a28dd 513 }
MasashiNomura 46:5074781a28dd 514 }
MasashiNomura 46:5074781a28dd 515 else {
MasashiNomura 46:5074781a28dd 516 if( abs(dif) > step){
MasashiNomura 46:5074781a28dd 517 tmp += step;
MasashiNomura 46:5074781a28dd 518 }
MasashiNomura 46:5074781a28dd 519 else
MasashiNomura 46:5074781a28dd 520 {
MasashiNomura 46:5074781a28dd 521 tmp -= dif;
MasashiNomura 46:5074781a28dd 522 }
MasashiNomura 46:5074781a28dd 523 }
MasashiNomura 46:5074781a28dd 524 eng[i]->setAccel(tmp);
MasashiNomura 46:5074781a28dd 525 }
MasashiNomura 46:5074781a28dd 526 //sp.printf("val=%d\r\n" , gf_AxReq[i].bf.val);
MasashiNomura 46:5074781a28dd 527 }
MasashiNomura 46:5074781a28dd 528 else
MasashiNomura 46:5074781a28dd 529 {// 直前でセットされた値をセット
MasashiNomura 46:5074781a28dd 530 eng[i]->setAccel(accelVal[i]);
MasashiNomura 46:5074781a28dd 531 }
MasashiNomura 46:5074781a28dd 532 }
MasashiNomura 46:5074781a28dd 533 }
MasashiNomura 46:5074781a28dd 534 }
MasashiNomura 46:5074781a28dd 535
MasashiNomura 36:2cc739c7e4cb 536 void HbManager::clearHvAxl(){
MasashiNomura 36:2cc739c7e4cb 537 for(int i = 0; i < 2; ++i){
MasashiNomura 36:2cc739c7e4cb 538 eng[i]->clearHoverAccel();
MasashiNomura 36:2cc739c7e4cb 539 }
MasashiNomura 36:2cc739c7e4cb 540 }
MasashiNomura 36:2cc739c7e4cb 541 bool HbManager::chkSetHvAxl(eEgPos pos){
MasashiNomura 36:2cc739c7e4cb 542 if(pos == FRONT){
MasashiNomura 36:2cc739c7e4cb 543 return eng[0]->chkSetHoverAccel();
MasashiNomura 36:2cc739c7e4cb 544 }
MasashiNomura 36:2cc739c7e4cb 545 else/* if(pos == REAR)*/{
MasashiNomura 36:2cc739c7e4cb 546 return eng[1]->chkSetHoverAccel();
MasashiNomura 36:2cc739c7e4cb 547 }
takeru0x1103 17:f9610f3cfa1b 548 }
MasashiNomura 36:2cc739c7e4cb 549 void HbManager::setHvAxl(eEgPos pos, INT16 val){
MasashiNomura 36:2cc739c7e4cb 550 if(pos == FRONT){
MasashiNomura 36:2cc739c7e4cb 551 eng[0]->setHoverAccel(val);
MasashiNomura 36:2cc739c7e4cb 552 }
MasashiNomura 36:2cc739c7e4cb 553 else/* if(pos == REAR)*/{
MasashiNomura 36:2cc739c7e4cb 554 eng[1]->setHoverAccel(val);
MasashiNomura 36:2cc739c7e4cb 555 }
MasashiNomura 36:2cc739c7e4cb 556 }
MasashiNomura 38:24ee50452755 557 INT16 HbManager::getHvAxl(eEgPos pos){
MasashiNomura 38:24ee50452755 558 if(pos == FRONT){
MasashiNomura 38:24ee50452755 559 return eng[0]->getHoverAccelVal();
MasashiNomura 38:24ee50452755 560 }
MasashiNomura 38:24ee50452755 561 else/* if(pos == REAR)*/{
MasashiNomura 38:24ee50452755 562 return eng[1]->getHoverAccelVal();
MasashiNomura 38:24ee50452755 563 }
MasashiNomura 38:24ee50452755 564 }
MasashiNomura 36:2cc739c7e4cb 565 void HbManager::setAccelVal(eEgPos pos, INT16 val){
MasashiNomura 36:2cc739c7e4cb 566 if(pos == FRONT){
MasashiNomura 36:2cc739c7e4cb 567 gf_AxReq[0].bf.req = true;
MasashiNomura 38:24ee50452755 568 gf_AxReq[0].bf.val = val > MAX_VAL_12BIT ? MAX_VAL_12BIT: (UINT16)val;
MasashiNomura 36:2cc739c7e4cb 569 } else {
MasashiNomura 36:2cc739c7e4cb 570 gf_AxReq[1].bf.req = true;
MasashiNomura 38:24ee50452755 571 gf_AxReq[1].bf.val = val > MAX_VAL_12BIT ? MAX_VAL_12BIT: (UINT16)val;
MasashiNomura 36:2cc739c7e4cb 572 }
MasashiNomura 36:2cc739c7e4cb 573 }
MasashiNomura 39:1b76f7df8804 574 INT16 HbManager::getAccelVal(eEgPos pos){
MasashiNomura 39:1b76f7df8804 575 if(pos == FRONT){
MasashiNomura 39:1b76f7df8804 576 return eng[0]->getAccel();
MasashiNomura 39:1b76f7df8804 577 }
MasashiNomura 39:1b76f7df8804 578 else/* if(pos == REAR)*/{
MasashiNomura 39:1b76f7df8804 579 return eng[1]->getAccel();
MasashiNomura 39:1b76f7df8804 580 }
MasashiNomura 39:1b76f7df8804 581 }
MasashiNomura 23:79e20be4bc5b 582 //------------------------------------------------------
MasashiNomura 23:79e20be4bc5b 583 //ステート遷移関連
MasashiNomura 23:79e20be4bc5b 584 //------------------------------------------------------
MasashiNomura 23:79e20be4bc5b 585 bool HbManager::chkOverIDLE(){
MasashiNomura 23:79e20be4bc5b 586 return eng[0]->chkOverIDLECycle() && eng[1]->chkOverIDLECycle();
MasashiNomura 23:79e20be4bc5b 587 }
MasashiNomura 23:79e20be4bc5b 588
MasashiNomura 23:79e20be4bc5b 589 bool HbManager::chkInRangeIDLE(){
MasashiNomura 23:79e20be4bc5b 590 return eng[0]->chkInRangeIDLE() && eng[1]->chkInRangeIDLE();
MasashiNomura 23:79e20be4bc5b 591 }
MasashiNomura 23:79e20be4bc5b 592 // ステート遷移関連end
MasashiNomura 23:79e20be4bc5b 593 //------------------------------------------------------
MasashiNomura 23:79e20be4bc5b 594
MasashiNomura 23:79e20be4bc5b 595 //------------------------------------------------------
MasashiNomura 23:79e20be4bc5b 596 //ユーザー操作関連
MasashiNomura 23:79e20be4bc5b 597 //------------------------------------------------------
MasashiNomura 22:24c9c2dedca9 598 void HbManager::getUserCommand(){
MasashiNomura 22:24c9c2dedca9 599 usrSW = ope->GetUserOpe();
MasashiNomura 23:79e20be4bc5b 600 //sp.printf("SW Val=%X\r\n", usrSW.w);
MasashiNomura 22:24c9c2dedca9 601 }
takeru0x1103 17:f9610f3cfa1b 602
MasashiNomura 38:24ee50452755 603 float HbManager::getUserMotAxlRaw(){
MasashiNomura 38:24ee50452755 604 return ope->GetAinAccelRaw();
MasashiNomura 38:24ee50452755 605 }
MasashiNomura 38:24ee50452755 606
MasashiNomura 33:eb260dbfc22a 607 INT16 HbManager::getUserMotAxl(){
MasashiNomura 33:eb260dbfc22a 608 return ope->GetAinAccel();
MasashiNomura 33:eb260dbfc22a 609 }
MasashiNomura 33:eb260dbfc22a 610
MasashiNomura 38:24ee50452755 611 float HbManager::getUserEngTrottleRaw(){
MasashiNomura 38:24ee50452755 612 return ope->GetAinThrottleRaw();
MasashiNomura 38:24ee50452755 613 }
MasashiNomura 38:24ee50452755 614
MasashiNomura 36:2cc739c7e4cb 615 INT16 HbManager::getUserEngTrottle(){
MasashiNomura 36:2cc739c7e4cb 616 return ope->GetAinThrottle();
MasashiNomura 36:2cc739c7e4cb 617 }
MasashiNomura 36:2cc739c7e4cb 618
MasashiNomura 23:79e20be4bc5b 619 bool HbManager::chkSWUserOpe(HbUserOpe::SW_TYPE stype){
MasashiNomura 23:79e20be4bc5b 620 return ope->ChkCtrlSW(stype);
MasashiNomura 23:79e20be4bc5b 621 }
MasashiNomura 30:13ada1a24c59 622 bool HbManager::chkSWUserOpeRE(HbUserOpe::SW_TYPE stype){
MasashiNomura 26:732bc37fbefd 623 return ope->ChkCtrlSwRiseEdge(stype);
MasashiNomura 26:732bc37fbefd 624 }
MasashiNomura 23:79e20be4bc5b 625 bool HbManager::chkSWUserOpeAny(){
MasashiNomura 23:79e20be4bc5b 626 return ope->ChkCtrlSwAny();
MasashiNomura 23:79e20be4bc5b 627 }
MasashiNomura 36:2cc739c7e4cb 628
MasashiNomura 36:2cc739c7e4cb 629 bool HbManager::chkSWUserOpeBoth(HbUserOpe::SW_TYPE stype1,HbUserOpe::SW_TYPE stype2){
MasashiNomura 36:2cc739c7e4cb 630 return ope->ChkCtrlSwBoth(stype1,stype2);
MasashiNomura 36:2cc739c7e4cb 631 }
MasashiNomura 36:2cc739c7e4cb 632
MasashiNomura 23:79e20be4bc5b 633 typUserSw HbManager::getUserSw(){
MasashiNomura 23:79e20be4bc5b 634 return usrSW;
MasashiNomura 23:79e20be4bc5b 635 }
MasashiNomura 31:56c554c560c1 636
MasashiNomura 31:56c554c560c1 637 void HbManager::chkSW(enmHbState stat){
MasashiNomura 31:56c554c560c1 638
MasashiNomura 39:1b76f7df8804 639 INT16 tmpRpm,tmpAxl;
MasashiNomura 31:56c554c560c1 640 // Front Left
YutakaTakagi 59:6b4dcd964d0f 641 if(g_PidPara.mode == PID_0_ON){
YutakaTakagi 59:6b4dcd964d0f 642 if(chkSWUserOpeRE(HbUserOpe::BRK_L) || chkSWUserOpe(HbUserOpe::BRK_L)){
YutakaTakagi 59:6b4dcd964d0f 643 nowTrgtAng -= ang_rate_brk;
YutakaTakagi 59:6b4dcd964d0f 644 }
YutakaTakagi 59:6b4dcd964d0f 645 if(chkSWUserOpeRE(HbUserOpe::BRK_R) || chkSWUserOpe(HbUserOpe::BRK_R)){
YutakaTakagi 59:6b4dcd964d0f 646 nowTrgtAng += ang_rate_brk;
YutakaTakagi 59:6b4dcd964d0f 647 }
YutakaTakagi 59:6b4dcd964d0f 648 for(int i = 0; i < 4; ++i){
YutakaTakagi 59:6b4dcd964d0f 649 gf_MtReqU[i].req = true;
YutakaTakagi 59:6b4dcd964d0f 650 gf_MtReqU[i].val = 0;
YutakaTakagi 59:6b4dcd964d0f 651 }
MasashiNomura 31:56c554c560c1 652 }
YutakaTakagi 59:6b4dcd964d0f 653 else{
YutakaTakagi 59:6b4dcd964d0f 654 if(chkSWUserOpeRE(HbUserOpe::BRK_L)){
YutakaTakagi 59:6b4dcd964d0f 655 //nowTrgtAng -= 1;
YutakaTakagi 59:6b4dcd964d0f 656 gf_MtReqU[0].req = true;
YutakaTakagi 59:6b4dcd964d0f 657 gf_MtReqU[0].val = mot_brk;
YutakaTakagi 59:6b4dcd964d0f 658 //setMotVal(F_L, mot_brk);
YutakaTakagi 59:6b4dcd964d0f 659 gf_MtReqU[3].req = true;
YutakaTakagi 59:6b4dcd964d0f 660 gf_MtReqU[3].val = mot_brk;
YutakaTakagi 59:6b4dcd964d0f 661 //setMotVal(R_R, mot_brk);
YutakaTakagi 59:6b4dcd964d0f 662 } else if(chkSWUserOpe(HbUserOpe::BRK_L)){
YutakaTakagi 59:6b4dcd964d0f 663 //nowTrgtAng -= 0.1;
YutakaTakagi 59:6b4dcd964d0f 664 gf_MtReqU[0].req = true;
YutakaTakagi 59:6b4dcd964d0f 665 gf_MtReqU[0].val = mot_brk;
YutakaTakagi 59:6b4dcd964d0f 666 //setMotVal(F_L, mot_brk);
YutakaTakagi 59:6b4dcd964d0f 667 gf_MtReqU[3].req = true;
YutakaTakagi 59:6b4dcd964d0f 668 gf_MtReqU[3].val = mot_brk;
YutakaTakagi 59:6b4dcd964d0f 669 //setMotVal(R_R, mot_brk);
YutakaTakagi 59:6b4dcd964d0f 670 }else if(!chkSWUserOpe(HbUserOpe::BRK_L)){
YutakaTakagi 59:6b4dcd964d0f 671 gf_MtReqU[0].req = true;
YutakaTakagi 59:6b4dcd964d0f 672 gf_MtReqU[0].val = 0;
YutakaTakagi 59:6b4dcd964d0f 673 //setMotVal(F_L, mot_brk);
YutakaTakagi 59:6b4dcd964d0f 674 gf_MtReqU[3].req = true;
YutakaTakagi 59:6b4dcd964d0f 675 gf_MtReqU[3].val = 0;
YutakaTakagi 59:6b4dcd964d0f 676 }
MasashiNomura 56:f363a6877c6a 677 // else if(!chkSWUserOpe(HbUserOpe::BRK_L)){
MasashiNomura 56:f363a6877c6a 678 // if(gf_MtReqU[0].req){
MasashiNomura 56:f363a6877c6a 679 // tmpRpm = getCurMotVal(F_L);
MasashiNomura 56:f363a6877c6a 680 // if(tmpRpm == 0){
MasashiNomura 56:f363a6877c6a 681 // gf_MtReqU[0].req = false;
MasashiNomura 56:f363a6877c6a 682 // }else if(tmpRpm > 1000){
MasashiNomura 56:f363a6877c6a 683 // tmpRpm-=100;
MasashiNomura 56:f363a6877c6a 684 // } else if(tmpRpm >= 100){
MasashiNomura 56:f363a6877c6a 685 // tmpRpm-=50;
MasashiNomura 56:f363a6877c6a 686 // } else if(tmpRpm > 0){
MasashiNomura 56:f363a6877c6a 687 // tmpRpm-=10;
MasashiNomura 56:f363a6877c6a 688 // if(tmpRpm < 0) tmpRpm = 0;
MasashiNomura 56:f363a6877c6a 689 // } else if(tmpRpm < -1000){
MasashiNomura 56:f363a6877c6a 690 // tmpRpm+=100;
MasashiNomura 56:f363a6877c6a 691 // } else if(tmpRpm <= -100){
MasashiNomura 56:f363a6877c6a 692 // tmpRpm+=50;
MasashiNomura 56:f363a6877c6a 693 // }else if(tmpRpm < 0){
MasashiNomura 56:f363a6877c6a 694 // tmpRpm+=10;
MasashiNomura 56:f363a6877c6a 695 // if(tmpRpm > 0) tmpRpm = 0;
MasashiNomura 56:f363a6877c6a 696 // }
MasashiNomura 56:f363a6877c6a 697 // setMotVal(F_L, tmpRpm);
MasashiNomura 56:f363a6877c6a 698 // }
MasashiNomura 56:f363a6877c6a 699 // if(gf_MtReqU[3].req){
MasashiNomura 56:f363a6877c6a 700 // tmpRpm = getCurMotVal(R_R);
MasashiNomura 56:f363a6877c6a 701 // if(tmpRpm == 0){
MasashiNomura 56:f363a6877c6a 702 // gf_MtReqU[3].req = false;
MasashiNomura 56:f363a6877c6a 703 // }else if(tmpRpm > 1000){
MasashiNomura 56:f363a6877c6a 704 // tmpRpm-=100;
MasashiNomura 56:f363a6877c6a 705 // } else if(tmpRpm >= 100){
MasashiNomura 56:f363a6877c6a 706 // tmpRpm-=50;
MasashiNomura 56:f363a6877c6a 707 // } else if(tmpRpm > 0){
MasashiNomura 56:f363a6877c6a 708 // tmpRpm-=10;
MasashiNomura 56:f363a6877c6a 709 // if(tmpRpm < 0) tmpRpm = 0;
MasashiNomura 56:f363a6877c6a 710 // } else if(tmpRpm < -1000){
MasashiNomura 56:f363a6877c6a 711 // tmpRpm+=100;
MasashiNomura 56:f363a6877c6a 712 // } else if(tmpRpm <= -100){
MasashiNomura 56:f363a6877c6a 713 // tmpRpm+=50;
MasashiNomura 56:f363a6877c6a 714 // }else if(tmpRpm < 0){
MasashiNomura 56:f363a6877c6a 715 // tmpRpm+=10;
MasashiNomura 56:f363a6877c6a 716 // if(tmpRpm > 0) tmpRpm = 0;
MasashiNomura 56:f363a6877c6a 717 // }
MasashiNomura 56:f363a6877c6a 718 // setMotVal(R_R, tmpRpm);
MasashiNomura 56:f363a6877c6a 719 // }
MasashiNomura 56:f363a6877c6a 720 // }
MasashiNomura 31:56c554c560c1 721
YutakaTakagi 59:6b4dcd964d0f 722 if(chkSWUserOpeRE(HbUserOpe::BRK_R)){
YutakaTakagi 59:6b4dcd964d0f 723 //nowTrgtAng += 1;
YutakaTakagi 59:6b4dcd964d0f 724 gf_MtReqU[1].req = true;
YutakaTakagi 59:6b4dcd964d0f 725 gf_MtReqU[1].val = mot_brk;
YutakaTakagi 59:6b4dcd964d0f 726 //setMotVal(F_R, mot_brk);
YutakaTakagi 59:6b4dcd964d0f 727 gf_MtReqU[2].req = true;
YutakaTakagi 59:6b4dcd964d0f 728 gf_MtReqU[2].val = mot_brk;
YutakaTakagi 59:6b4dcd964d0f 729 //setMotVal(R_L, mot_brk);
YutakaTakagi 59:6b4dcd964d0f 730 } else if(chkSWUserOpe(HbUserOpe::BRK_R)){
YutakaTakagi 59:6b4dcd964d0f 731 //nowTrgtAng += 0.1;
YutakaTakagi 59:6b4dcd964d0f 732 gf_MtReqU[1].req = true;
YutakaTakagi 59:6b4dcd964d0f 733 gf_MtReqU[1].val = mot_brk;
YutakaTakagi 59:6b4dcd964d0f 734 //setMotVal(F_R, mot_brk);
YutakaTakagi 59:6b4dcd964d0f 735 gf_MtReqU[2].req = true;
YutakaTakagi 59:6b4dcd964d0f 736 gf_MtReqU[2].val = mot_brk;
YutakaTakagi 59:6b4dcd964d0f 737 //setMotVal(R_L, mot_brk);
YutakaTakagi 59:6b4dcd964d0f 738 } else if(!chkSWUserOpe(HbUserOpe::BRK_R)){
YutakaTakagi 59:6b4dcd964d0f 739 gf_MtReqU[1].req = true;
YutakaTakagi 59:6b4dcd964d0f 740 gf_MtReqU[1].val = 0;
YutakaTakagi 59:6b4dcd964d0f 741 gf_MtReqU[2].req = true;
YutakaTakagi 59:6b4dcd964d0f 742 gf_MtReqU[2].val = 0;
YutakaTakagi 59:6b4dcd964d0f 743 }
MasashiNomura 56:f363a6877c6a 744 // else if(!chkSWUserOpe(HbUserOpe::BRK_R)){
MasashiNomura 56:f363a6877c6a 745 // if(gf_MtReqU[1].req){
MasashiNomura 56:f363a6877c6a 746 // tmpRpm = getCurMotVal(F_R);
MasashiNomura 56:f363a6877c6a 747 // if(tmpRpm == 0){
MasashiNomura 56:f363a6877c6a 748 // gf_MtReqU[1].req = false;
MasashiNomura 56:f363a6877c6a 749 // }else if(tmpRpm > 1000){
MasashiNomura 56:f363a6877c6a 750 // tmpRpm-=100;
MasashiNomura 56:f363a6877c6a 751 // } else if(tmpRpm >= 100){
MasashiNomura 56:f363a6877c6a 752 // tmpRpm-=50;
MasashiNomura 56:f363a6877c6a 753 // } else if(tmpRpm > 0){
MasashiNomura 56:f363a6877c6a 754 // tmpRpm-=10;
MasashiNomura 56:f363a6877c6a 755 // if(tmpRpm < 0) tmpRpm = 0;
MasashiNomura 56:f363a6877c6a 756 // } else if(tmpRpm < -1000){
MasashiNomura 56:f363a6877c6a 757 // tmpRpm+=100;
MasashiNomura 56:f363a6877c6a 758 // } else if(tmpRpm <= -100){
MasashiNomura 56:f363a6877c6a 759 // tmpRpm+=50;
MasashiNomura 56:f363a6877c6a 760 // }else if(tmpRpm < 0){
MasashiNomura 56:f363a6877c6a 761 // tmpRpm+=10;
MasashiNomura 56:f363a6877c6a 762 // if(tmpRpm > 0) tmpRpm = 0;
MasashiNomura 56:f363a6877c6a 763 // }
MasashiNomura 56:f363a6877c6a 764 // setMotVal(F_R, tmpRpm);
MasashiNomura 56:f363a6877c6a 765 // }
MasashiNomura 56:f363a6877c6a 766 // if(gf_MtReqU[2].req){
MasashiNomura 56:f363a6877c6a 767 // tmpRpm = getCurMotVal(R_L);
MasashiNomura 56:f363a6877c6a 768 // if(tmpRpm == 0){
MasashiNomura 56:f363a6877c6a 769 // gf_MtReqU[1].req = false;
MasashiNomura 56:f363a6877c6a 770 // }else if(tmpRpm > 1000){
MasashiNomura 56:f363a6877c6a 771 // tmpRpm-=100;
MasashiNomura 56:f363a6877c6a 772 // } else if(tmpRpm >= 100){
MasashiNomura 56:f363a6877c6a 773 // tmpRpm-=50;
MasashiNomura 56:f363a6877c6a 774 // } else if(tmpRpm > 0){
MasashiNomura 56:f363a6877c6a 775 // tmpRpm-=10;
MasashiNomura 56:f363a6877c6a 776 // if(tmpRpm < 0) tmpRpm = 0;
MasashiNomura 56:f363a6877c6a 777 // } else if(tmpRpm < -1000){
MasashiNomura 56:f363a6877c6a 778 // tmpRpm+=100;
MasashiNomura 56:f363a6877c6a 779 // } else if(tmpRpm <= -100){
MasashiNomura 56:f363a6877c6a 780 // tmpRpm+=50;
MasashiNomura 56:f363a6877c6a 781 // }else if(tmpRpm < 0){
MasashiNomura 56:f363a6877c6a 782 // tmpRpm+=10;
MasashiNomura 56:f363a6877c6a 783 // if(tmpRpm > 0) tmpRpm = 0;
MasashiNomura 56:f363a6877c6a 784 // }
MasashiNomura 56:f363a6877c6a 785 // setMotVal(R_L, tmpRpm);
MasashiNomura 56:f363a6877c6a 786 // }
MasashiNomura 56:f363a6877c6a 787 // }
YutakaTakagi 59:6b4dcd964d0f 788 }
MasashiNomura 31:56c554c560c1 789
MasashiNomura 34:234b87f3e6ce 790 if(chkSWUserOpeRE(HbUserOpe::FLT_ON)){
MasashiNomura 39:1b76f7df8804 791 if(stat == IDLE){
MasashiNomura 39:1b76f7df8804 792 gf_AxReq[0].bf.req = true;
MasashiNomura 39:1b76f7df8804 793 gf_AxReq[1].bf.req = true;
MasashiNomura 47:d3fa874f336e 794 gf_AxReq[0].bf.val = getHvAxl(FRONT) / 2;
MasashiNomura 47:d3fa874f336e 795 gf_AxReq[1].bf.val = getHvAxl(REAR) / 2;
MasashiNomura 47:d3fa874f336e 796 setStateF(UPPER_IDLE);
MasashiNomura 47:d3fa874f336e 797 }
MasashiNomura 47:d3fa874f336e 798 else if(stat == UPPER_IDLE){
MasashiNomura 47:d3fa874f336e 799 gf_AxReq[0].bf.req = true;
MasashiNomura 47:d3fa874f336e 800 gf_AxReq[1].bf.req = true;
MasashiNomura 39:1b76f7df8804 801 gf_AxReq[0].bf.val = getHvAxl(FRONT);
MasashiNomura 39:1b76f7df8804 802 gf_AxReq[1].bf.val = getHvAxl(REAR);
MasashiNomura 39:1b76f7df8804 803 setStateF(TAKE_OFF);
MasashiNomura 39:1b76f7df8804 804 }
MasashiNomura 34:234b87f3e6ce 805 sp.printf("FLT_ON Push \r\n");
MasashiNomura 34:234b87f3e6ce 806 }
MasashiNomura 34:234b87f3e6ce 807 if(chkSWUserOpeRE(HbUserOpe::FLT_OFF)){
MasashiNomura 47:d3fa874f336e 808 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE || stat == UPPER_IDLE || stat == IDLE){
MasashiNomura 42:cc8501b824ba 809 for(int i = 0; i < 2; ++i){
MasashiNomura 47:d3fa874f336e 810 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE){
MasashiNomura 47:d3fa874f336e 811 setHvAxl((eEgPos)i, gf_AxReq[i].bf.val);
MasashiNomura 47:d3fa874f336e 812 }
MasashiNomura 42:cc8501b824ba 813 gf_AxReq[i].bf.req = true;
MasashiNomura 42:cc8501b824ba 814 gf_AxReq[i].bf.val = 0;
MasashiNomura 42:cc8501b824ba 815 }
MasashiNomura 39:1b76f7df8804 816 if(stat == DRIVE){
MasashiNomura 39:1b76f7df8804 817 setStateF(EMGGND);
MasashiNomura 39:1b76f7df8804 818 } else {
MasashiNomura 39:1b76f7df8804 819 setStateF(GROUND);
MasashiNomura 39:1b76f7df8804 820 }
MasashiNomura 39:1b76f7df8804 821 }
MasashiNomura 34:234b87f3e6ce 822 sp.printf("FLT_OFF Push \r\n");
MasashiNomura 31:56c554c560c1 823 }
MasashiNomura 45:3b51dd26b579 824 //if(chkSWUserOpe(HbUserOpe::F_ENG_UP)){
MasashiNomura 45:3b51dd26b579 825 if(chkSWUserOpeRE(HbUserOpe::F_ENG_UP)){
MasashiNomura 39:1b76f7df8804 826 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE){
MasashiNomura 43:156199c2f9b6 827 gf_BlinkLED = true;
MasashiNomura 53:b09c062cc31c 828 INT16 step = en_srv_adj_step[0];
MasashiNomura 39:1b76f7df8804 829 tmpAxl = getAccelVal(FRONT);
MasashiNomura 42:cc8501b824ba 830 tmpAxl+=step;
MasashiNomura 42:cc8501b824ba 831 if(tmpAxl > MAX_VAL_12BIT){
MasashiNomura 42:cc8501b824ba 832 tmpAxl = MAX_VAL_12BIT;
MasashiNomura 39:1b76f7df8804 833 }
MasashiNomura 39:1b76f7df8804 834 gf_AxReq[0].bf.req = true;
MasashiNomura 39:1b76f7df8804 835 gf_AxReq[0].bf.val = tmpAxl;
MasashiNomura 39:1b76f7df8804 836 }
MasashiNomura 39:1b76f7df8804 837 }
MasashiNomura 45:3b51dd26b579 838 //if(chkSWUserOpe(HbUserOpe::F_ENG_DOWN)){
MasashiNomura 45:3b51dd26b579 839 if(chkSWUserOpeRE(HbUserOpe::F_ENG_DOWN)){
MasashiNomura 39:1b76f7df8804 840 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE){
MasashiNomura 43:156199c2f9b6 841 gf_BlinkLED = true;
MasashiNomura 53:b09c062cc31c 842 INT16 step = en_srv_adj_step[0];
MasashiNomura 39:1b76f7df8804 843 tmpAxl = getAccelVal(FRONT);
MasashiNomura 42:cc8501b824ba 844 tmpAxl-=step;
MasashiNomura 42:cc8501b824ba 845 if(tmpAxl < 0){
MasashiNomura 42:cc8501b824ba 846 tmpAxl = 0;
MasashiNomura 39:1b76f7df8804 847 }
MasashiNomura 39:1b76f7df8804 848 gf_AxReq[0].bf.req = true;
MasashiNomura 39:1b76f7df8804 849 gf_AxReq[0].bf.val = tmpAxl;
MasashiNomura 31:56c554c560c1 850 }
MasashiNomura 39:1b76f7df8804 851 }
MasashiNomura 45:3b51dd26b579 852 //if(chkSWUserOpe(HbUserOpe::R_ENG_UP)){
MasashiNomura 45:3b51dd26b579 853 if(chkSWUserOpeRE(HbUserOpe::R_ENG_UP)){
MasashiNomura 39:1b76f7df8804 854 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE){
MasashiNomura 53:b09c062cc31c 855 INT16 step = en_srv_adj_step[1];
MasashiNomura 43:156199c2f9b6 856 gf_BlinkLED = true;
MasashiNomura 39:1b76f7df8804 857 tmpAxl = getAccelVal(REAR);
MasashiNomura 42:cc8501b824ba 858 tmpAxl+=step;
MasashiNomura 42:cc8501b824ba 859 if(tmpAxl > MAX_VAL_12BIT){
MasashiNomura 42:cc8501b824ba 860 tmpAxl = MAX_VAL_12BIT;
MasashiNomura 39:1b76f7df8804 861 }
MasashiNomura 39:1b76f7df8804 862 gf_AxReq[1].bf.req = true;
MasashiNomura 39:1b76f7df8804 863 gf_AxReq[1].bf.val = tmpAxl;
MasashiNomura 36:2cc739c7e4cb 864 }
MasashiNomura 39:1b76f7df8804 865 }
MasashiNomura 45:3b51dd26b579 866 //if(chkSWUserOpe(HbUserOpe::R_ENG_DOWN)){
MasashiNomura 45:3b51dd26b579 867 if(chkSWUserOpeRE(HbUserOpe::R_ENG_DOWN)){
MasashiNomura 39:1b76f7df8804 868 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE){
MasashiNomura 53:b09c062cc31c 869 INT16 step = en_srv_adj_step[1];
MasashiNomura 43:156199c2f9b6 870 gf_BlinkLED = true;
MasashiNomura 39:1b76f7df8804 871 tmpAxl = getAccelVal(REAR);
MasashiNomura 42:cc8501b824ba 872 tmpAxl-=step;
MasashiNomura 42:cc8501b824ba 873 if(tmpAxl < 0){
MasashiNomura 42:cc8501b824ba 874 tmpAxl = 0;
MasashiNomura 39:1b76f7df8804 875 }
MasashiNomura 39:1b76f7df8804 876 gf_AxReq[1].bf.req = true;
MasashiNomura 39:1b76f7df8804 877 gf_AxReq[1].bf.val = tmpAxl;
MasashiNomura 39:1b76f7df8804 878 }
MasashiNomura 39:1b76f7df8804 879 }
MasashiNomura 57:56b7e66a0c3d 880 if(chkSWUserOpeRE(HbUserOpe::CTRL_SW)){
MasashiNomura 57:56b7e66a0c3d 881 bool flg = false;
MasashiNomura 57:56b7e66a0c3d 882 switch (g_PidPara.mode)
MasashiNomura 57:56b7e66a0c3d 883 {
MasashiNomura 57:56b7e66a0c3d 884 case PID_0_OFF:
MasashiNomura 57:56b7e66a0c3d 885 g_PidPara.mode = PID_0_ON;
YutakaTakagi 59:6b4dcd964d0f 886 calAtt();
MasashiNomura 57:56b7e66a0c3d 887 flg = true;
MasashiNomura 57:56b7e66a0c3d 888 break;
MasashiNomura 57:56b7e66a0c3d 889 case PID_1_OFF:
MasashiNomura 57:56b7e66a0c3d 890 g_PidPara.mode = PID_1_ON;
MasashiNomura 57:56b7e66a0c3d 891 flg = true;
MasashiNomura 57:56b7e66a0c3d 892 break;
MasashiNomura 57:56b7e66a0c3d 893 case PID_0_ON:
MasashiNomura 57:56b7e66a0c3d 894 /* code */
MasashiNomura 57:56b7e66a0c3d 895 g_PidPara.mode = PID_0_OFF;
MasashiNomura 57:56b7e66a0c3d 896 break;
MasashiNomura 57:56b7e66a0c3d 897 case PID_1_ON:
MasashiNomura 57:56b7e66a0c3d 898 g_PidPara.mode = PID_1_OFF;
MasashiNomura 57:56b7e66a0c3d 899 break;
MasashiNomura 57:56b7e66a0c3d 900 default:
MasashiNomura 57:56b7e66a0c3d 901 g_PidPara.mode = PID_0_OFF;
MasashiNomura 57:56b7e66a0c3d 902 break;
MasashiNomura 57:56b7e66a0c3d 903 }
MasashiNomura 57:56b7e66a0c3d 904 sp.printf("CTRL_SW Push : %d \r\n", flg);
MasashiNomura 57:56b7e66a0c3d 905 }
MasashiNomura 39:1b76f7df8804 906 // if(chkSWUserOpe(HbUserOpe::ALL_STOP)){
MasashiNomura 39:1b76f7df8804 907 // // モーター
MasashiNomura 39:1b76f7df8804 908 // for(int i = 0; i < 4; ++i){
MasashiNomura 39:1b76f7df8804 909 // gf_MtReq[i].req = true;
MasashiNomura 39:1b76f7df8804 910 // gf_MtReq[i].val = 0;
MasashiNomura 39:1b76f7df8804 911 // gf_MtReqOfs[i].req = true;
MasashiNomura 39:1b76f7df8804 912 // gf_MtReqOfs[i].val = 0;
MasashiNomura 39:1b76f7df8804 913 // }
MasashiNomura 39:1b76f7df8804 914 // // エンジン用サーボ
MasashiNomura 39:1b76f7df8804 915 // for(int i = 0; i < 2; ++i){
MasashiNomura 39:1b76f7df8804 916 // gf_AxReq[i].bf.req = true;
MasashiNomura 39:1b76f7df8804 917 // gf_AxReq[i].bf.val = 0;
MasashiNomura 39:1b76f7df8804 918 // }
MasashiNomura 39:1b76f7df8804 919 // gf_FromActiveStat = isActiveState();
MasashiNomura 39:1b76f7df8804 920 // setStateF(MOT_STOP);
MasashiNomura 39:1b76f7df8804 921 // }
MasashiNomura 31:56c554c560c1 922 }
MasashiNomura 23:79e20be4bc5b 923 // ユーザー操作関連end
MasashiNomura 23:79e20be4bc5b 924 //------------------------------------------------------
MasashiNomura 23:79e20be4bc5b 925
takeru0x1103 17:f9610f3cfa1b 926 //======================================================
takeru0x1103 17:f9610f3cfa1b 927 //コンストラクタ
takeru0x1103 17:f9610f3cfa1b 928 //======================================================
takeru0x1103 17:f9610f3cfa1b 929 HbManager::HbManager(){
takeru0x1103 18:5aa48aec9cae 930 //メンバクラスインスタンス
takeru0x1103 18:5aa48aec9cae 931 eng[0] = new HbEngine(0);
takeru0x1103 18:5aa48aec9cae 932 eng[1] = new HbEngine(1);
MasashiNomura 42:cc8501b824ba 933 eng[0]->setHoverAccel(1500);
MasashiNomura 42:cc8501b824ba 934 eng[1]->setHoverAccel(1500);
MasashiNomura 47:d3fa874f336e 935 att = new HbAttitude(2.0 , 2.0 , 0 , 0);//パラメータ outP P I D
MasashiNomura 45:3b51dd26b579 936
MasashiNomura 45:3b51dd26b579 937 accelVal[0] = 0;
MasashiNomura 45:3b51dd26b579 938 accelVal[1] = 0;
MasashiNomura 50:76413e8e073d 939 for(int i = 0; i < 4; ++i){
MasashiNomura 50:76413e8e073d 940 motorOfsVal[i] = 0;
MasashiNomura 50:76413e8e073d 941 }
MasashiNomura 28:fdb3b144e342 942 // mot[0] = new HbMotor(0);
MasashiNomura 28:fdb3b144e342 943 // mot[1] = new HbMotor(1);
MasashiNomura 28:fdb3b144e342 944 // mot[2] = new HbMotor(2);
MasashiNomura 28:fdb3b144e342 945 // mot[3] = new HbMotor(3);
MasashiNomura 28:fdb3b144e342 946
MasashiNomura 42:cc8501b824ba 947 // subProp[0] = new HbSubProp(F_L);
MasashiNomura 42:cc8501b824ba 948 // subProp[0]->setCoef(IN, 0.00004, 0.0401, 29.262);
MasashiNomura 42:cc8501b824ba 949 // subProp[0]->setCoef(OUT,0.00004, 0.1336, -69.184);
MasashiNomura 42:cc8501b824ba 950
MasashiNomura 42:cc8501b824ba 951 // subProp[1] = new HbSubProp(F_R);
MasashiNomura 42:cc8501b824ba 952 // subProp[1]->setCoef(IN, 0.00004, 0.0151, 70.947);
MasashiNomura 42:cc8501b824ba 953 // subProp[1]->setCoef(OUT,0.00004, 0.1336, -69.184);
MasashiNomura 42:cc8501b824ba 954
MasashiNomura 42:cc8501b824ba 955 // subProp[2] = new HbSubProp(R_L);
MasashiNomura 42:cc8501b824ba 956 // subProp[2]->setCoef(IN, 0.00004, 0.0244, 53.954);
MasashiNomura 42:cc8501b824ba 957 // subProp[2]->setCoef(OUT,0.00003, 0.1579, -114.22);
MasashiNomura 42:cc8501b824ba 958
MasashiNomura 42:cc8501b824ba 959 // subProp[3] = new HbSubProp(R_R);
MasashiNomura 42:cc8501b824ba 960 // subProp[3]->setCoef(IN, 0.00004, 0.0111, 82.044);
MasashiNomura 42:cc8501b824ba 961 // subProp[3]->setCoef(OUT,0.00003, 0.1617, -123.27);
MasashiNomura 42:cc8501b824ba 962
MasashiNomura 28:fdb3b144e342 963 subProp[0] = new HbSubProp(F_L);
MasashiNomura 42:cc8501b824ba 964 subProp[0]->setCoef(IN, 0.00004, 0.0786, -5.248);
MasashiNomura 42:cc8501b824ba 965 subProp[0]->setCoef(OUT,0.00005, 0.0112, 104.45);
MasashiNomura 22:24c9c2dedca9 966
MasashiNomura 28:fdb3b144e342 967 subProp[1] = new HbSubProp(F_R);
MasashiNomura 42:cc8501b824ba 968 subProp[1]->setCoef(IN, 0.00005, 0.0095, 126.11);
MasashiNomura 42:cc8501b824ba 969 subProp[1]->setCoef(OUT,0.00004, 0.0798, -2.1167);
MasashiNomura 28:fdb3b144e342 970
MasashiNomura 28:fdb3b144e342 971 subProp[2] = new HbSubProp(R_L);
MasashiNomura 42:cc8501b824ba 972 subProp[2]->setCoef(IN, 0.00004, 0.1039, -50.946);
MasashiNomura 42:cc8501b824ba 973 subProp[2]->setCoef(OUT,0.00004, 0.0886, -21.033);
MasashiNomura 28:fdb3b144e342 974
MasashiNomura 28:fdb3b144e342 975 subProp[3] = new HbSubProp(R_R);
MasashiNomura 42:cc8501b824ba 976 subProp[3]->setCoef(IN, 0.00005, 0.0108, 105.15);
MasashiNomura 42:cc8501b824ba 977 subProp[3]->setCoef(OUT,0.00004, 0.0456, 50.611);
MasashiNomura 28:fdb3b144e342 978
takeru0x1103 18:5aa48aec9cae 979 imu = new Imu(p28,p27);
MasashiNomura 47:d3fa874f336e 980 nowTrgtAng = 0.0f;
MasashiNomura 22:24c9c2dedca9 981 ope = new HbUserOpe();
MasashiNomura 22:24c9c2dedca9 982
MasashiNomura 53:b09c062cc31c 983 for(int i = 0; i < 2; ++i){
MasashiNomura 53:b09c062cc31c 984 en_srv_step[i] = 30;
MasashiNomura 63:aee44afe6363 985 en_srv_adj_step[i] = 50;
MasashiNomura 53:b09c062cc31c 986 }
MasashiNomura 64:40943c843da7 987
MasashiNomura 56:f363a6877c6a 988 mot_brk = DEF_BRK_RPM;
YutakaTakagi 62:4b873328d3a8 989 ang_rate_brk = DEF_BRK_ANG / static_cast<float>(UPDATE_RATE);
MasashiNomura 63:aee44afe6363 990
MasashiNomura 63:aee44afe6363 991 mot_takeoff_offset = DEF_MOT_OFFSET;
MasashiNomura 36:2cc739c7e4cb 992 // //初期化
MasashiNomura 36:2cc739c7e4cb 993 // motorVal[0]=0;
MasashiNomura 36:2cc739c7e4cb 994 // motorVal[1]=0;
MasashiNomura 36:2cc739c7e4cb 995 // motorVal[2]=0;
MasashiNomura 36:2cc739c7e4cb 996 // motorVal[3]=0;
takeru0x1103 17:f9610f3cfa1b 997 }