ジャイロ追加前

Dependencies:   mbed FreeRTOS

Committer:
MasashiNomura
Date:
Mon Jan 21 11:57:35 2019 +0000
Revision:
41:45c982b1c5b6
Parent:
40:debe99e228d3
Child:
42:cc8501b824ba
20190121 Modify for 45inc. HbMotor,HbManager,GF etc

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();
takeru0x1103 18:5aa48aec9cae 20 //ヨー角キャリブレーション
takeru0x1103 18:5aa48aec9cae 21 if(gf_Cal.bf.yaw==true){
takeru0x1103 18:5aa48aec9cae 22 imu->CalYaw();
takeru0x1103 18:5aa48aec9cae 23 gf_Cal.bf.yaw=false;
takeru0x1103 18:5aa48aec9cae 24 sp.printf("Yaw caribration %f\t",nowAngle);
takeru0x1103 18:5aa48aec9cae 25 nowAngle=0;
takeru0x1103 18:5aa48aec9cae 26 }
takeru0x1103 18:5aa48aec9cae 27 //ジャイロオフセットキャリブレーション
takeru0x1103 18:5aa48aec9cae 28 if(gf_Cal.bf.gy==true){
takeru0x1103 18:5aa48aec9cae 29 imu->CalGyro();
takeru0x1103 18:5aa48aec9cae 30 gf_Cal.bf.gy=false;
takeru0x1103 18:5aa48aec9cae 31 sp.printf("Gyro caribration %d\t",nowRate);
takeru0x1103 18:5aa48aec9cae 32 nowRate=0;
takeru0x1103 17:f9610f3cfa1b 33 }
takeru0x1103 17:f9610f3cfa1b 34
MasashiNomura 41:45c982b1c5b6 35 if(gf_Print.d1.bf.yaw) {
MasashiNomura 25:f3a6e7eec9c3 36 tmpf = imu->GetYawRef();
MasashiNomura 25:f3a6e7eec9c3 37 sp.printf("Ang\t%f ref %f\t",nowAngle,tmpf);
MasashiNomura 25:f3a6e7eec9c3 38 }
MasashiNomura 41:45c982b1c5b6 39 if(gf_Print.d1.bf.gy) {
MasashiNomura 25:f3a6e7eec9c3 40 tmpi = imu->GetGyroRef();
MasashiNomura 25:f3a6e7eec9c3 41 sp.printf("Gyr\t%d ref %d\t",nowRate,tmpi);
MasashiNomura 25:f3a6e7eec9c3 42 }
takeru0x1103 18:5aa48aec9cae 43 }
MasashiNomura 25:f3a6e7eec9c3 44 void HbManager::calAtt(){
MasashiNomura 25:f3a6e7eec9c3 45 if(att == NULL) return;
MasashiNomura 25:f3a6e7eec9c3 46 if(imu == NULL) return;
MasashiNomura 25:f3a6e7eec9c3 47 imu->CalYaw();
MasashiNomura 25:f3a6e7eec9c3 48 sp.printf("Yaw auto caribration %f\t",nowAngle);
MasashiNomura 25:f3a6e7eec9c3 49 nowAngle=0;
MasashiNomura 25:f3a6e7eec9c3 50 imu->CalGyro();
MasashiNomura 25:f3a6e7eec9c3 51 sp.printf("Gyro auto caribration %d\t\r\n",nowRate);
MasashiNomura 25:f3a6e7eec9c3 52 nowRate=0;
MasashiNomura 25:f3a6e7eec9c3 53 }
MasashiNomura 25:f3a6e7eec9c3 54
takeru0x1103 18:5aa48aec9cae 55 //------------------------------------------------------
takeru0x1103 18:5aa48aec9cae 56 //姿勢制御
takeru0x1103 18:5aa48aec9cae 57 //------------------------------------------------------
takeru0x1103 18:5aa48aec9cae 58 void HbManager::controlAttitude(){
takeru0x1103 19:4b0fe9a5ec38 59
MasashiNomura 36:2cc739c7e4cb 60 float pidRtn;
MasashiNomura 36:2cc739c7e4cb 61
MasashiNomura 36:2cc739c7e4cb 62 pidRtn = att->pid2(0,nowAngle,nowRate);
takeru0x1103 19:4b0fe9a5ec38 63
MasashiNomura 41:45c982b1c5b6 64 if(gf_Print.d1.bf.pp){sp.printf("PID:P=%f,",att->getPp());}
MasashiNomura 41:45c982b1c5b6 65 if(gf_Print.d1.bf.p) {sp.printf("PID:P=%f,",att->getP()); }
MasashiNomura 41:45c982b1c5b6 66 if(gf_Print.d1.bf.i) {sp.printf("PID:I=%f,",att->getI()); }
MasashiNomura 41:45c982b1c5b6 67 if(gf_Print.d1.bf.d) {sp.printf("PID:D=%f,",att->getD()); }
MasashiNomura 41:45c982b1c5b6 68 if(gf_Print.d1.bf.v) {sp.printf("PID:V=%f,",att->getV()); }
MasashiNomura 41:45c982b1c5b6 69 if(gf_Print.d1.bf.fb){
MasashiNomura 31:56c554c560c1 70 sp.printf("PID FB,%f,",pidRtn);
MasashiNomura 31:56c554c560c1 71 sp.printf("%f,",nowAngle);
MasashiNomura 31:56c554c560c1 72 sp.printf("%f,",nowRate);
MasashiNomura 31:56c554c560c1 73 }
takeru0x1103 18:5aa48aec9cae 74
takeru0x1103 19:4b0fe9a5ec38 75 //右回りはセンサ値はプラスで逆に戻そうとしてPIDの結果はマイナスで左回りのフィードバック(左前と右後ろを強く)
MasashiNomura 32:7f4145cc3551 76 // float fl = pidRtn * -1;
MasashiNomura 32:7f4145cc3551 77 // float fr = pidRtn;
MasashiNomura 32:7f4145cc3551 78 // float bl = pidRtn;
MasashiNomura 32:7f4145cc3551 79 // float br = pidRtn * -1;
MasashiNomura 32:7f4145cc3551 80 // MAX RPM=9000 PWM MAX Val=4095 -> 2.25
MasashiNomura 32:7f4145cc3551 81 float fl = pidRtn * 2.25 * -1;
MasashiNomura 32:7f4145cc3551 82 float fr = pidRtn * 2.25;
MasashiNomura 32:7f4145cc3551 83 float bl = pidRtn * 2.25;
MasashiNomura 32:7f4145cc3551 84 float br = pidRtn * 2.25 * -1;
MasashiNomura 32:7f4145cc3551 85 for(int i = 0; i < 4; ++i){
MasashiNomura 32:7f4145cc3551 86 gf_MtReq[i].req = true;
MasashiNomura 32:7f4145cc3551 87 }
MasashiNomura 32:7f4145cc3551 88 gf_MtReq[0].val = (INT16)fl;
MasashiNomura 32:7f4145cc3551 89 gf_MtReq[1].val = (INT16)fr;
MasashiNomura 32:7f4145cc3551 90 gf_MtReq[2].val = (INT16)bl;
MasashiNomura 32:7f4145cc3551 91 gf_MtReq[3].val = (INT16)br;
takeru0x1103 17:f9610f3cfa1b 92 }
MasashiNomura 24:c5945aaae777 93
MasashiNomura 24:c5945aaae777 94 void HbManager::controlAttitude(float cmdAngle){
MasashiNomura 24:c5945aaae777 95 float pidRtn;
MasashiNomura 24:c5945aaae777 96
MasashiNomura 36:2cc739c7e4cb 97 pidRtn = att->pid2(cmdAngle,nowAngle,nowRate);
MasashiNomura 36:2cc739c7e4cb 98
MasashiNomura 41:45c982b1c5b6 99 if(gf_Print.d1.bf.pp){sp.printf("PID:P=%f,",att->getPp());}
MasashiNomura 41:45c982b1c5b6 100 if(gf_Print.d1.bf.p) {sp.printf("PID:P=%f,",att->getP()); }
MasashiNomura 41:45c982b1c5b6 101 if(gf_Print.d1.bf.i) {sp.printf("PID:I=%f,",att->getI()); }
MasashiNomura 41:45c982b1c5b6 102 if(gf_Print.d1.bf.d) {sp.printf("PID:D=%f,",att->getD()); }
MasashiNomura 41:45c982b1c5b6 103 if(gf_Print.d1.bf.v) {sp.printf("PID:V=%f,",att->getV()); }
MasashiNomura 41:45c982b1c5b6 104 if(gf_Print.d1.bf.fb){
MasashiNomura 36:2cc739c7e4cb 105 sp.printf("PID FB,%f,",pidRtn);
MasashiNomura 36:2cc739c7e4cb 106 sp.printf("%f,",nowAngle);
MasashiNomura 36:2cc739c7e4cb 107 sp.printf("%f,",nowRate);
MasashiNomura 36:2cc739c7e4cb 108 }
MasashiNomura 24:c5945aaae777 109
MasashiNomura 24:c5945aaae777 110 //右回りはセンサ値はプラスで逆に戻そうとしてPIDの結果はマイナスで左回りのフィードバック(左前と右後ろを強く)
MasashiNomura 36:2cc739c7e4cb 111 // MAX RPM=9000 PWM MAX Val=4095 -> 2.25
MasashiNomura 36:2cc739c7e4cb 112 float fl = pidRtn * 2.25 * -1;
MasashiNomura 36:2cc739c7e4cb 113 float fr = pidRtn * 2.25;
MasashiNomura 36:2cc739c7e4cb 114 float bl = pidRtn * 2.25;
MasashiNomura 36:2cc739c7e4cb 115 float br = pidRtn * 2.25 * -1;
MasashiNomura 36:2cc739c7e4cb 116 for(int i = 0; i < 4; ++i){
MasashiNomura 36:2cc739c7e4cb 117 gf_MtReq[i].req = true;
MasashiNomura 36:2cc739c7e4cb 118 }
MasashiNomura 36:2cc739c7e4cb 119 gf_MtReq[0].val = (INT16)fl;
MasashiNomura 36:2cc739c7e4cb 120 gf_MtReq[1].val = (INT16)fr;
MasashiNomura 36:2cc739c7e4cb 121 gf_MtReq[2].val = (INT16)bl;
MasashiNomura 36:2cc739c7e4cb 122 gf_MtReq[3].val = (INT16)br;
MasashiNomura 36:2cc739c7e4cb 123
MasashiNomura 36:2cc739c7e4cb 124 // float pidRtn;
MasashiNomura 36:2cc739c7e4cb 125
MasashiNomura 36:2cc739c7e4cb 126 // pidRtn= att->pid(cmdAngle,nowAngle,nowRate);
MasashiNomura 36:2cc739c7e4cb 127 // //
MasashiNomura 41:45c982b1c5b6 128 // if(gf_Print.d1.bf.pp){sp.printf("PID:P=%f,",att->getPp());}
MasashiNomura 41:45c982b1c5b6 129 // if(gf_Print.d1.bf.p) {sp.printf("PID:P=%f,",att->getP()); }
MasashiNomura 41:45c982b1c5b6 130 // if(gf_Print.d1.bf.i) {sp.printf("PID:I=%f,",att->getI()); }
MasashiNomura 41:45c982b1c5b6 131 // if(gf_Print.d1.bf.d) {sp.printf("PID:D=%f,",att->getD()); }
MasashiNomura 41:45c982b1c5b6 132 // if(gf_Print.d1.bf.fb){sp.printf("PID feedback=%f,",pidRtn);}
MasashiNomura 24:c5945aaae777 133
MasashiNomura 36:2cc739c7e4cb 134 // //右回りはセンサ値はプラスで逆に戻そうとしてPIDの結果はマイナスで左回りのフィードバック(左前と右後ろを強く)
MasashiNomura 36:2cc739c7e4cb 135 // float fl = pidRtn * -1;
MasashiNomura 36:2cc739c7e4cb 136 // float fr = pidRtn;
MasashiNomura 36:2cc739c7e4cb 137 // float bl = pidRtn;
MasashiNomura 36:2cc739c7e4cb 138 // float br = pidRtn * -1;
MasashiNomura 36:2cc739c7e4cb 139
MasashiNomura 36:2cc739c7e4cb 140 // motorVal[0] = (INT16)fl;//前左
MasashiNomura 36:2cc739c7e4cb 141 // motorVal[1] = (INT16)fr;//前右
MasashiNomura 36:2cc739c7e4cb 142 // motorVal[2] = (INT16)bl;//後左
MasashiNomura 36:2cc739c7e4cb 143 // motorVal[3] = (INT16)br;//後右
MasashiNomura 24:c5945aaae777 144 }
MasashiNomura 24:c5945aaae777 145
MasashiNomura 24:c5945aaae777 146 void HbManager::setAttPara(typPidPara para){
MasashiNomura 24:c5945aaae777 147 if(att == NULL) return;
MasashiNomura 24:c5945aaae777 148 att->setPp(para.PP);
MasashiNomura 24:c5945aaae777 149 att->setP(para.P);
MasashiNomura 24:c5945aaae777 150 att->setI(para.I);
MasashiNomura 24:c5945aaae777 151 att->setD(para.D);
MasashiNomura 24:c5945aaae777 152 att->setIMax(para.IMax);
MasashiNomura 24:c5945aaae777 153 att->setIMin(para.IMin);
MasashiNomura 31:56c554c560c1 154 att->setV(para.V);
MasashiNomura 24:c5945aaae777 155 }
MasashiNomura 24:c5945aaae777 156
takeru0x1103 18:5aa48aec9cae 157 //------------------------------------------------------
takeru0x1103 18:5aa48aec9cae 158 //モーター制御
takeru0x1103 18:5aa48aec9cae 159 //------------------------------------------------------
takeru0x1103 18:5aa48aec9cae 160 void HbManager::controlMotor(){
MasashiNomura 25:f3a6e7eec9c3 161 INT16 tmp,dif;
MasashiNomura 29:eb3d72dd94aa 162 for(int i = 0; i < 4; ++i){
MasashiNomura 32:7f4145cc3551 163 if(gf_MtReqOfs[i].req){
MasashiNomura 32:7f4145cc3551 164 tmp = subProp[i]->getValue(OFS);
MasashiNomura 32:7f4145cc3551 165 dif = tmp - (INT16)gf_MtReqOfs[i].val;
MasashiNomura 29:eb3d72dd94aa 166 if(dif == 0){
MasashiNomura 40:debe99e228d3 167 subProp[i]->setValue(OFS, (INT16)gf_MtReqOfs[i].val);
MasashiNomura 32:7f4145cc3551 168 gf_MtReqOfs[i].req = false;
MasashiNomura 29:eb3d72dd94aa 169 }
MasashiNomura 29:eb3d72dd94aa 170 else {
MasashiNomura 29:eb3d72dd94aa 171 //if(dif > 0){
MasashiNomura 29:eb3d72dd94aa 172 // --tmp;
MasashiNomura 29:eb3d72dd94aa 173 //}
MasashiNomura 29:eb3d72dd94aa 174 //else{
MasashiNomura 29:eb3d72dd94aa 175 // ++tmp;
MasashiNomura 29:eb3d72dd94aa 176 //}
MasashiNomura 29:eb3d72dd94aa 177 if(1000 < dif){
MasashiNomura 29:eb3d72dd94aa 178 tmp-=100;
MasashiNomura 29:eb3d72dd94aa 179 }
MasashiNomura 29:eb3d72dd94aa 180 else if(100 < dif){
MasashiNomura 29:eb3d72dd94aa 181 tmp-= 10;
MasashiNomura 29:eb3d72dd94aa 182 }
MasashiNomura 40:debe99e228d3 183 else if(100 >= dif && 10 < dif){
MasashiNomura 29:eb3d72dd94aa 184 tmp-= 5;
MasashiNomura 29:eb3d72dd94aa 185 }
MasashiNomura 29:eb3d72dd94aa 186 else if ( 10 >= dif && 1 <= dif){
MasashiNomura 29:eb3d72dd94aa 187 tmp-=1;
MasashiNomura 29:eb3d72dd94aa 188 }
MasashiNomura 29:eb3d72dd94aa 189 else if ( -1000 > dif){
MasashiNomura 29:eb3d72dd94aa 190 tmp+=100;
MasashiNomura 29:eb3d72dd94aa 191 }
MasashiNomura 40:debe99e228d3 192 else if ( -100 >= dif){
MasashiNomura 29:eb3d72dd94aa 193 tmp+=10;
MasashiNomura 29:eb3d72dd94aa 194 }
MasashiNomura 40:debe99e228d3 195 else if(-100 <= dif && -10 > dif){
MasashiNomura 29:eb3d72dd94aa 196 tmp+= 5;
MasashiNomura 29:eb3d72dd94aa 197 }
MasashiNomura 29:eb3d72dd94aa 198 else if ( -10 <= dif && -1 >= dif){
MasashiNomura 29:eb3d72dd94aa 199 tmp+=1;
MasashiNomura 29:eb3d72dd94aa 200 }
MasashiNomura 32:7f4145cc3551 201 subProp[i]->setValue(OFS, tmp);
MasashiNomura 29:eb3d72dd94aa 202 }
MasashiNomura 29:eb3d72dd94aa 203 }
MasashiNomura 29:eb3d72dd94aa 204 }
MasashiNomura 28:fdb3b144e342 205
MasashiNomura 32:7f4145cc3551 206 for(int i = 0; i< 4;++i){
MasashiNomura 32:7f4145cc3551 207 if(gf_MtReq[i].req){
MasashiNomura 33:eb260dbfc22a 208 subProp[i]->setValue(ATT,gf_MtReq[i].val);
MasashiNomura 36:2cc739c7e4cb 209 gf_MtReq[i].req = false;
MasashiNomura 29:eb3d72dd94aa 210 }
MasashiNomura 29:eb3d72dd94aa 211 }
takeru0x1103 19:4b0fe9a5ec38 212
MasashiNomura 41:45c982b1c5b6 213 if(gf_Print.d1.bf.m1){ sp.printf("m1=%d,",(INT16)subProp[0]->getValue(ATT)); }
MasashiNomura 41:45c982b1c5b6 214 if(gf_Print.d1.bf.m2){ sp.printf("m2=%d,",(INT16)subProp[1]->getValue(ATT)); }
MasashiNomura 41:45c982b1c5b6 215 if(gf_Print.d1.bf.m3){ sp.printf("m3=%d,",(INT16)subProp[2]->getValue(ATT)); }
MasashiNomura 41:45c982b1c5b6 216 if(gf_Print.d1.bf.m4){ sp.printf("m4=%d,",(INT16)subProp[3]->getValue(ATT)); }
MasashiNomura 40:debe99e228d3 217
MasashiNomura 40:debe99e228d3 218 //DEBUG用FPGAに直接指示
MasashiNomura 40:debe99e228d3 219 INT16 pos;
MasashiNomura 40:debe99e228d3 220 INT16 typ;
MasashiNomura 40:debe99e228d3 221 if(gf_State == SLEEP){
MasashiNomura 40:debe99e228d3 222 for(int i = 0; i < 8; ++i){
MasashiNomura 40:debe99e228d3 223 pos = i / 2;
MasashiNomura 40:debe99e228d3 224 typ = i % 2;
MasashiNomura 40:debe99e228d3 225 if(gf_MtReqDct[i].req){
MasashiNomura 40:debe99e228d3 226 tmp = subProp[pos]->getValueFpgaMot((eMotType)typ);
MasashiNomura 40:debe99e228d3 227 dif = tmp - (INT16)gf_MtReqDct[i].val;
MasashiNomura 40:debe99e228d3 228 if(dif == 0){
MasashiNomura 40:debe99e228d3 229 subProp[pos]->setValueFpgaMot((eMotType)typ, (INT16)gf_MtReqDct[i].val);
MasashiNomura 40:debe99e228d3 230 gf_MtReqDct[i].req = false;
MasashiNomura 40:debe99e228d3 231 }
MasashiNomura 40:debe99e228d3 232 else {
MasashiNomura 40:debe99e228d3 233 if(1000 < dif){
MasashiNomura 40:debe99e228d3 234 tmp-=100;
MasashiNomura 40:debe99e228d3 235 }
MasashiNomura 40:debe99e228d3 236 else if(100 < dif){
MasashiNomura 40:debe99e228d3 237 tmp-= 10;
MasashiNomura 40:debe99e228d3 238 }
MasashiNomura 40:debe99e228d3 239 else if(100 >= dif && 10 < dif){
MasashiNomura 40:debe99e228d3 240 tmp-= 5;
MasashiNomura 40:debe99e228d3 241 }
MasashiNomura 40:debe99e228d3 242 else if ( 10 >= dif && 1 <= dif){
MasashiNomura 40:debe99e228d3 243 tmp-=1;
MasashiNomura 40:debe99e228d3 244 }
MasashiNomura 40:debe99e228d3 245 else if ( -1000 > dif){
MasashiNomura 40:debe99e228d3 246 tmp+=100;
MasashiNomura 40:debe99e228d3 247 }
MasashiNomura 40:debe99e228d3 248 else if ( -100 >= dif){
MasashiNomura 40:debe99e228d3 249 tmp+=10;
MasashiNomura 40:debe99e228d3 250 }
MasashiNomura 40:debe99e228d3 251 else if(-100 <= dif && -10 > dif){
MasashiNomura 40:debe99e228d3 252 tmp+= 5;
MasashiNomura 40:debe99e228d3 253 }
MasashiNomura 40:debe99e228d3 254 else if ( -10 <= dif && -1 >= dif){
MasashiNomura 40:debe99e228d3 255 tmp+=1;
MasashiNomura 40:debe99e228d3 256 }
MasashiNomura 40:debe99e228d3 257 subProp[pos]->setValueFpgaMot((eMotType)typ, tmp);
MasashiNomura 40:debe99e228d3 258 }
MasashiNomura 40:debe99e228d3 259 }
MasashiNomura 40:debe99e228d3 260 }
MasashiNomura 40:debe99e228d3 261 }
MasashiNomura 26:732bc37fbefd 262 }
MasashiNomura 26:732bc37fbefd 263
MasashiNomura 30:13ada1a24c59 264 INT16 HbManager::getCurMotVal(eMotPos pos){
MasashiNomura 30:13ada1a24c59 265 if(subProp[(int)pos] == NULL) return 0;
MasashiNomura 32:7f4145cc3551 266 return subProp[(int)pos]->getValue(USER);
MasashiNomura 30:13ada1a24c59 267 }
MasashiNomura 30:13ada1a24c59 268 void HbManager::setMotVal(eMotPos pos, INT16 val){
MasashiNomura 30:13ada1a24c59 269 if(subProp[(int)pos] == NULL) return;
MasashiNomura 32:7f4145cc3551 270 subProp[(int)pos]->setValue(USER, val);
MasashiNomura 30:13ada1a24c59 271 }
MasashiNomura 25:f3a6e7eec9c3 272
MasashiNomura 40:debe99e228d3 273 void HbManager::setFpgaMot(eMotPos pos,eMotType type, INT16 val){
MasashiNomura 40:debe99e228d3 274 if(subProp[(int)pos] == NULL) return;
MasashiNomura 40:debe99e228d3 275 subProp[(int)pos]->setValueFpgaMot(type, val);
MasashiNomura 40:debe99e228d3 276 }
MasashiNomura 40:debe99e228d3 277
MasashiNomura 36:2cc739c7e4cb 278 // void HbManager::setMotFPGA(UCHAR num, INT16 val){
MasashiNomura 36:2cc739c7e4cb 279 // //UCHAR tmpN = num / 2;
MasashiNomura 36:2cc739c7e4cb 280 // //UCHAR tmp = num % 2;
MasashiNomura 36:2cc739c7e4cb 281 // // mot[tmpN]->setValueFPGA(tmp, val);
MasashiNomura 36:2cc739c7e4cb 282 // // sp.printf("FPGA Direct NUM:[%d] [%d]\r\n",tmpN, tmp, val);
MasashiNomura 36:2cc739c7e4cb 283 // }
MasashiNomura 27:ff63c23bc689 284
takeru0x1103 17:f9610f3cfa1b 285 //------------------------------------------------------
takeru0x1103 17:f9610f3cfa1b 286 //エンジン制御
takeru0x1103 17:f9610f3cfa1b 287 //------------------------------------------------------
MasashiNomura 39:1b76f7df8804 288 void HbManager::getEngine(){
takeru0x1103 18:5aa48aec9cae 289 UINT16 rpm[2];
takeru0x1103 18:5aa48aec9cae 290 int i;
takeru0x1103 17:f9610f3cfa1b 291
takeru0x1103 18:5aa48aec9cae 292 //エンジン回転数読み出し
takeru0x1103 18:5aa48aec9cae 293 rpm[0] = eng[0]->getRpm();
takeru0x1103 18:5aa48aec9cae 294 rpm[1] = eng[1]->getRpm();
takeru0x1103 17:f9610f3cfa1b 295
MasashiNomura 41:45c982b1c5b6 296 if(gf_Print.d1.bf.e1){ sp.printf("%d",rpm[0]); }
MasashiNomura 41:45c982b1c5b6 297 if(gf_Print.d1.bf.e2){ sp.printf("%d,",rpm[1]); }
MasashiNomura 39:1b76f7df8804 298 }
MasashiNomura 39:1b76f7df8804 299
MasashiNomura 39:1b76f7df8804 300 void HbManager::controlEngine(){
MasashiNomura 39:1b76f7df8804 301 UINT16 rpm[2];
MasashiNomura 39:1b76f7df8804 302 int i;
MasashiNomura 41:45c982b1c5b6 303 INT16 tmp, dif;
MasashiNomura 39:1b76f7df8804 304 // //エンジン回転数読み出し
MasashiNomura 39:1b76f7df8804 305 // rpm[0] = eng[0]->getRpm();
MasashiNomura 39:1b76f7df8804 306 // rpm[1] = eng[1]->getRpm();
MasashiNomura 39:1b76f7df8804 307
MasashiNomura 41:45c982b1c5b6 308 // if(gf_Print.d1.bf.e1){ sp.printf("%d",rpm[0]); }
MasashiNomura 41:45c982b1c5b6 309 // if(gf_Print.d1.bf.e2){ sp.printf("%d,",rpm[1]); }
takeru0x1103 17:f9610f3cfa1b 310
MasashiNomura 41:45c982b1c5b6 311 INT16 step = 100;
takeru0x1103 18:5aa48aec9cae 312 //アクセル設定
takeru0x1103 18:5aa48aec9cae 313 for(i=0; i<2; i++){
MasashiNomura 38:24ee50452755 314 if(gf_AxReq[i].bf.req==true){
MasashiNomura 41:45c982b1c5b6 315 tmp = eng[i]->getAccel();
MasashiNomura 41:45c982b1c5b6 316 dif = tmp - (INT16)gf_AxReq[i].bf.val;
MasashiNomura 41:45c982b1c5b6 317 if(dif == 0){
MasashiNomura 41:45c982b1c5b6 318 eng[i]->setAccel((INT16)gf_AxReq[i].bf.val);
MasashiNomura 41:45c982b1c5b6 319 gf_AxReq[i].bf.req=false;
MasashiNomura 41:45c982b1c5b6 320 }
MasashiNomura 41:45c982b1c5b6 321 else {
MasashiNomura 41:45c982b1c5b6 322 if(dif > 0){
MasashiNomura 41:45c982b1c5b6 323 if(dif > step){
MasashiNomura 41:45c982b1c5b6 324 tmp -= step;
MasashiNomura 41:45c982b1c5b6 325 }
MasashiNomura 41:45c982b1c5b6 326 else
MasashiNomura 41:45c982b1c5b6 327 {
MasashiNomura 41:45c982b1c5b6 328 tmp -= dif;
MasashiNomura 41:45c982b1c5b6 329 }
MasashiNomura 41:45c982b1c5b6 330 }
MasashiNomura 41:45c982b1c5b6 331 else {
MasashiNomura 41:45c982b1c5b6 332 if( abs(dif) > step){
MasashiNomura 41:45c982b1c5b6 333 tmp += step;
MasashiNomura 41:45c982b1c5b6 334 }
MasashiNomura 41:45c982b1c5b6 335 else
MasashiNomura 41:45c982b1c5b6 336 {
MasashiNomura 41:45c982b1c5b6 337 tmp -= dif;
MasashiNomura 41:45c982b1c5b6 338 }
MasashiNomura 41:45c982b1c5b6 339 }
MasashiNomura 41:45c982b1c5b6 340 eng[i]->setAccel(tmp);
MasashiNomura 41:45c982b1c5b6 341 // if(1000 < dif){
MasashiNomura 41:45c982b1c5b6 342 // tmp-=100;
MasashiNomura 41:45c982b1c5b6 343 // }
MasashiNomura 41:45c982b1c5b6 344 // else if(100 < dif){
MasashiNomura 41:45c982b1c5b6 345 // tmp-= 10;
MasashiNomura 41:45c982b1c5b6 346 // }
MasashiNomura 41:45c982b1c5b6 347 // else if(100 >= dif && 10 < dif){
MasashiNomura 41:45c982b1c5b6 348 // tmp-= 5;
MasashiNomura 41:45c982b1c5b6 349 // }
MasashiNomura 41:45c982b1c5b6 350 // else if ( 10 >= dif && 1 <= dif){
MasashiNomura 41:45c982b1c5b6 351 // tmp-=1;
MasashiNomura 41:45c982b1c5b6 352 // }
MasashiNomura 41:45c982b1c5b6 353 // else if ( -1000 > dif){
MasashiNomura 41:45c982b1c5b6 354 // tmp+=100;
MasashiNomura 41:45c982b1c5b6 355 // }
MasashiNomura 41:45c982b1c5b6 356 // else if ( -100 >= dif){
MasashiNomura 41:45c982b1c5b6 357 // tmp+=10;
MasashiNomura 41:45c982b1c5b6 358 // }
MasashiNomura 41:45c982b1c5b6 359 // else if(-100 <= dif && -10 > dif){
MasashiNomura 41:45c982b1c5b6 360 // tmp+= 5;
MasashiNomura 41:45c982b1c5b6 361 // }
MasashiNomura 41:45c982b1c5b6 362 // else if ( -10 <= dif && -1 >= dif){
MasashiNomura 41:45c982b1c5b6 363 // tmp+=1;
MasashiNomura 41:45c982b1c5b6 364 // }
MasashiNomura 41:45c982b1c5b6 365 // eng[i]->setAccel(tmp);
MasashiNomura 41:45c982b1c5b6 366 }
MasashiNomura 41:45c982b1c5b6 367 //sp.printf("val=%d\r\n" , gf_AxReq[i].bf.val);
MasashiNomura 41:45c982b1c5b6 368 // accelVal[i] = gf_AxReq[i].bf.val;
MasashiNomura 41:45c982b1c5b6 369 // eng[i]->setAccel(accelVal[i]);
MasashiNomura 41:45c982b1c5b6 370 // gf_AxReq[i].bf.req=false;
takeru0x1103 18:5aa48aec9cae 371 }
takeru0x1103 17:f9610f3cfa1b 372 }
MasashiNomura 36:2cc739c7e4cb 373 }
MasashiNomura 36:2cc739c7e4cb 374 void HbManager::clearHvAxl(){
MasashiNomura 36:2cc739c7e4cb 375 for(int i = 0; i < 2; ++i){
MasashiNomura 36:2cc739c7e4cb 376 eng[i]->clearHoverAccel();
MasashiNomura 36:2cc739c7e4cb 377 }
MasashiNomura 36:2cc739c7e4cb 378 }
MasashiNomura 36:2cc739c7e4cb 379 bool HbManager::chkSetHvAxl(eEgPos pos){
MasashiNomura 36:2cc739c7e4cb 380 if(pos == FRONT){
MasashiNomura 36:2cc739c7e4cb 381 return eng[0]->chkSetHoverAccel();
MasashiNomura 36:2cc739c7e4cb 382 }
MasashiNomura 36:2cc739c7e4cb 383 else/* if(pos == REAR)*/{
MasashiNomura 36:2cc739c7e4cb 384 return eng[1]->chkSetHoverAccel();
MasashiNomura 36:2cc739c7e4cb 385 }
takeru0x1103 17:f9610f3cfa1b 386 }
MasashiNomura 36:2cc739c7e4cb 387 void HbManager::setHvAxl(eEgPos pos, INT16 val){
MasashiNomura 36:2cc739c7e4cb 388 if(pos == FRONT){
MasashiNomura 36:2cc739c7e4cb 389 eng[0]->setHoverAccel(val);
MasashiNomura 36:2cc739c7e4cb 390 }
MasashiNomura 36:2cc739c7e4cb 391 else/* if(pos == REAR)*/{
MasashiNomura 36:2cc739c7e4cb 392 eng[1]->setHoverAccel(val);
MasashiNomura 36:2cc739c7e4cb 393 }
MasashiNomura 36:2cc739c7e4cb 394 }
MasashiNomura 38:24ee50452755 395 INT16 HbManager::getHvAxl(eEgPos pos){
MasashiNomura 38:24ee50452755 396 if(pos == FRONT){
MasashiNomura 38:24ee50452755 397 return eng[0]->getHoverAccelVal();
MasashiNomura 38:24ee50452755 398 }
MasashiNomura 38:24ee50452755 399 else/* if(pos == REAR)*/{
MasashiNomura 38:24ee50452755 400 return eng[1]->getHoverAccelVal();
MasashiNomura 38:24ee50452755 401 }
MasashiNomura 38:24ee50452755 402 }
MasashiNomura 36:2cc739c7e4cb 403 void HbManager::setAccelVal(eEgPos pos, INT16 val){
MasashiNomura 36:2cc739c7e4cb 404 if(pos == FRONT){
MasashiNomura 36:2cc739c7e4cb 405 gf_AxReq[0].bf.req = true;
MasashiNomura 38:24ee50452755 406 gf_AxReq[0].bf.val = val > MAX_VAL_12BIT ? MAX_VAL_12BIT: (UINT16)val;
MasashiNomura 36:2cc739c7e4cb 407 } else {
MasashiNomura 36:2cc739c7e4cb 408 gf_AxReq[1].bf.req = true;
MasashiNomura 38:24ee50452755 409 gf_AxReq[1].bf.val = val > MAX_VAL_12BIT ? MAX_VAL_12BIT: (UINT16)val;
MasashiNomura 36:2cc739c7e4cb 410 }
MasashiNomura 36:2cc739c7e4cb 411 }
MasashiNomura 39:1b76f7df8804 412 INT16 HbManager::getAccelVal(eEgPos pos){
MasashiNomura 39:1b76f7df8804 413 if(pos == FRONT){
MasashiNomura 39:1b76f7df8804 414 return eng[0]->getAccel();
MasashiNomura 39:1b76f7df8804 415 }
MasashiNomura 39:1b76f7df8804 416 else/* if(pos == REAR)*/{
MasashiNomura 39:1b76f7df8804 417 return eng[1]->getAccel();
MasashiNomura 39:1b76f7df8804 418 }
MasashiNomura 39:1b76f7df8804 419 }
MasashiNomura 23:79e20be4bc5b 420 //------------------------------------------------------
MasashiNomura 23:79e20be4bc5b 421 //ステート遷移関連
MasashiNomura 23:79e20be4bc5b 422 //------------------------------------------------------
MasashiNomura 23:79e20be4bc5b 423 bool HbManager::chkOverIDLE(){
MasashiNomura 23:79e20be4bc5b 424 return eng[0]->chkOverIDLECycle() && eng[1]->chkOverIDLECycle();
MasashiNomura 23:79e20be4bc5b 425 }
MasashiNomura 23:79e20be4bc5b 426
MasashiNomura 23:79e20be4bc5b 427 bool HbManager::chkInRangeIDLE(){
MasashiNomura 23:79e20be4bc5b 428 return eng[0]->chkInRangeIDLE() && eng[1]->chkInRangeIDLE();
MasashiNomura 23:79e20be4bc5b 429 }
MasashiNomura 23:79e20be4bc5b 430 // ステート遷移関連end
MasashiNomura 23:79e20be4bc5b 431 //------------------------------------------------------
MasashiNomura 23:79e20be4bc5b 432
MasashiNomura 23:79e20be4bc5b 433 //------------------------------------------------------
MasashiNomura 23:79e20be4bc5b 434 //ユーザー操作関連
MasashiNomura 23:79e20be4bc5b 435 //------------------------------------------------------
MasashiNomura 22:24c9c2dedca9 436 void HbManager::getUserCommand(){
MasashiNomura 22:24c9c2dedca9 437 usrSW = ope->GetUserOpe();
MasashiNomura 23:79e20be4bc5b 438 //sp.printf("SW Val=%X\r\n", usrSW.w);
MasashiNomura 22:24c9c2dedca9 439 }
takeru0x1103 17:f9610f3cfa1b 440
MasashiNomura 38:24ee50452755 441 float HbManager::getUserMotAxlRaw(){
MasashiNomura 38:24ee50452755 442 return ope->GetAinAccelRaw();
MasashiNomura 38:24ee50452755 443 }
MasashiNomura 38:24ee50452755 444
MasashiNomura 33:eb260dbfc22a 445 INT16 HbManager::getUserMotAxl(){
MasashiNomura 33:eb260dbfc22a 446 return ope->GetAinAccel();
MasashiNomura 33:eb260dbfc22a 447 }
MasashiNomura 33:eb260dbfc22a 448
MasashiNomura 38:24ee50452755 449 float HbManager::getUserEngTrottleRaw(){
MasashiNomura 38:24ee50452755 450 return ope->GetAinThrottleRaw();
MasashiNomura 38:24ee50452755 451 }
MasashiNomura 38:24ee50452755 452
MasashiNomura 36:2cc739c7e4cb 453 INT16 HbManager::getUserEngTrottle(){
MasashiNomura 36:2cc739c7e4cb 454 return ope->GetAinThrottle();
MasashiNomura 36:2cc739c7e4cb 455 }
MasashiNomura 36:2cc739c7e4cb 456
MasashiNomura 23:79e20be4bc5b 457 bool HbManager::chkSWUserOpe(HbUserOpe::SW_TYPE stype){
MasashiNomura 23:79e20be4bc5b 458 return ope->ChkCtrlSW(stype);
MasashiNomura 23:79e20be4bc5b 459 }
MasashiNomura 30:13ada1a24c59 460 bool HbManager::chkSWUserOpeRE(HbUserOpe::SW_TYPE stype){
MasashiNomura 26:732bc37fbefd 461 return ope->ChkCtrlSwRiseEdge(stype);
MasashiNomura 26:732bc37fbefd 462 }
MasashiNomura 23:79e20be4bc5b 463 bool HbManager::chkSWUserOpeAny(){
MasashiNomura 23:79e20be4bc5b 464 return ope->ChkCtrlSwAny();
MasashiNomura 23:79e20be4bc5b 465 }
MasashiNomura 36:2cc739c7e4cb 466
MasashiNomura 36:2cc739c7e4cb 467 bool HbManager::chkSWUserOpeBoth(HbUserOpe::SW_TYPE stype1,HbUserOpe::SW_TYPE stype2){
MasashiNomura 36:2cc739c7e4cb 468 return ope->ChkCtrlSwBoth(stype1,stype2);
MasashiNomura 36:2cc739c7e4cb 469 }
MasashiNomura 36:2cc739c7e4cb 470
MasashiNomura 23:79e20be4bc5b 471 typUserSw HbManager::getUserSw(){
MasashiNomura 23:79e20be4bc5b 472 return usrSW;
MasashiNomura 23:79e20be4bc5b 473 }
MasashiNomura 31:56c554c560c1 474
MasashiNomura 31:56c554c560c1 475 void HbManager::chkSW(enmHbState stat){
MasashiNomura 31:56c554c560c1 476
MasashiNomura 39:1b76f7df8804 477 INT16 tmpRpm,tmpAxl;
MasashiNomura 31:56c554c560c1 478 // Front Left
MasashiNomura 31:56c554c560c1 479 if(chkSWUserOpeRE(HbUserOpe::BRK_L)){
MasashiNomura 32:7f4145cc3551 480 gf_MtReqU[0].req=true;
MasashiNomura 31:56c554c560c1 481 tmpRpm = getCurMotVal(F_L);
MasashiNomura 35:3779201b4c73 482 if(tmpRpm < BRK_RPM){
MasashiNomura 35:3779201b4c73 483 setMotVal(F_L, BRK_RPM);
MasashiNomura 31:56c554c560c1 484 }
MasashiNomura 31:56c554c560c1 485 } else if(chkSWUserOpe(HbUserOpe::BRK_L)){
MasashiNomura 32:7f4145cc3551 486 if(gf_MtReqU[0].req==true){
MasashiNomura 35:3779201b4c73 487 setMotVal(F_L, BRK_RPM);
MasashiNomura 31:56c554c560c1 488 }
MasashiNomura 31:56c554c560c1 489 } else if(!chkSWUserOpe(HbUserOpe::BRK_L)){
MasashiNomura 32:7f4145cc3551 490 if(gf_MtReqU[0].req){
MasashiNomura 31:56c554c560c1 491 tmpRpm = getCurMotVal(F_L);
MasashiNomura 31:56c554c560c1 492 if(tmpRpm == 0){
MasashiNomura 32:7f4145cc3551 493 gf_MtReqU[0].req = false;
MasashiNomura 31:56c554c560c1 494 }else if(tmpRpm > 1000){
MasashiNomura 31:56c554c560c1 495 tmpRpm-=100;
MasashiNomura 31:56c554c560c1 496 } else if(tmpRpm >= 100){
MasashiNomura 31:56c554c560c1 497 tmpRpm-=50;
MasashiNomura 31:56c554c560c1 498 } else if(tmpRpm > 0){
MasashiNomura 31:56c554c560c1 499 tmpRpm-=10;
MasashiNomura 31:56c554c560c1 500 if(tmpRpm < 0) tmpRpm = 0;
MasashiNomura 31:56c554c560c1 501 } else if(tmpRpm < -1000){
MasashiNomura 31:56c554c560c1 502 tmpRpm+=100;
MasashiNomura 31:56c554c560c1 503 } else if(tmpRpm <= -100){
MasashiNomura 31:56c554c560c1 504 tmpRpm+=50;
MasashiNomura 31:56c554c560c1 505 }else if(tmpRpm < 0){
MasashiNomura 31:56c554c560c1 506 tmpRpm+=10;
MasashiNomura 31:56c554c560c1 507 if(tmpRpm > 0) tmpRpm = 0;
MasashiNomura 31:56c554c560c1 508 }
MasashiNomura 31:56c554c560c1 509 setMotVal(F_L, tmpRpm);
MasashiNomura 31:56c554c560c1 510 }
MasashiNomura 31:56c554c560c1 511 }
MasashiNomura 31:56c554c560c1 512
MasashiNomura 31:56c554c560c1 513 if(chkSWUserOpeRE(HbUserOpe::BRK_R)){
MasashiNomura 32:7f4145cc3551 514 gf_MtReqU[1].req=true;
MasashiNomura 31:56c554c560c1 515 tmpRpm = getCurMotVal(F_R);
MasashiNomura 35:3779201b4c73 516 if(tmpRpm < BRK_RPM){
MasashiNomura 35:3779201b4c73 517 setMotVal(F_R, BRK_RPM);
MasashiNomura 31:56c554c560c1 518 }
MasashiNomura 31:56c554c560c1 519 } else if(chkSWUserOpe(HbUserOpe::BRK_R)){
MasashiNomura 32:7f4145cc3551 520 if(gf_MtReqU[1].req==true){
MasashiNomura 35:3779201b4c73 521 setMotVal(F_R, BRK_RPM);
MasashiNomura 31:56c554c560c1 522 }
MasashiNomura 31:56c554c560c1 523 } else if(!chkSWUserOpe(HbUserOpe::BRK_R)){
MasashiNomura 32:7f4145cc3551 524 if(gf_MtReqU[1].req){
MasashiNomura 31:56c554c560c1 525 tmpRpm = getCurMotVal(F_R);
MasashiNomura 31:56c554c560c1 526 if(tmpRpm == 0){
MasashiNomura 32:7f4145cc3551 527 gf_MtReqU[1].req = false;
MasashiNomura 31:56c554c560c1 528 }else if(tmpRpm > 1000){
MasashiNomura 31:56c554c560c1 529 tmpRpm-=100;
MasashiNomura 31:56c554c560c1 530 } else if(tmpRpm >= 100){
MasashiNomura 31:56c554c560c1 531 tmpRpm-=50;
MasashiNomura 31:56c554c560c1 532 } else if(tmpRpm > 0){
MasashiNomura 31:56c554c560c1 533 tmpRpm-=10;
MasashiNomura 31:56c554c560c1 534 if(tmpRpm < 0) tmpRpm = 0;
MasashiNomura 31:56c554c560c1 535 } else if(tmpRpm < -1000){
MasashiNomura 31:56c554c560c1 536 tmpRpm+=100;
MasashiNomura 31:56c554c560c1 537 } else if(tmpRpm <= -100){
MasashiNomura 31:56c554c560c1 538 tmpRpm+=50;
MasashiNomura 31:56c554c560c1 539 }else if(tmpRpm < 0){
MasashiNomura 31:56c554c560c1 540 tmpRpm+=10;
MasashiNomura 31:56c554c560c1 541 if(tmpRpm > 0) tmpRpm = 0;
MasashiNomura 31:56c554c560c1 542 }
MasashiNomura 31:56c554c560c1 543 setMotVal(F_R, tmpRpm);
MasashiNomura 31:56c554c560c1 544 }
MasashiNomura 31:56c554c560c1 545 }
MasashiNomura 31:56c554c560c1 546
MasashiNomura 34:234b87f3e6ce 547 if(chkSWUserOpeRE(HbUserOpe::FLT_ON)){
MasashiNomura 39:1b76f7df8804 548 if(stat == IDLE){
MasashiNomura 39:1b76f7df8804 549 gf_AxReq[0].bf.req = true;
MasashiNomura 39:1b76f7df8804 550 gf_AxReq[1].bf.req = true;
MasashiNomura 39:1b76f7df8804 551 gf_AxReq[0].bf.val = getHvAxl(FRONT);
MasashiNomura 39:1b76f7df8804 552 gf_AxReq[1].bf.val = getHvAxl(REAR);
MasashiNomura 39:1b76f7df8804 553 setStateF(TAKE_OFF);
MasashiNomura 39:1b76f7df8804 554 }
MasashiNomura 34:234b87f3e6ce 555 sp.printf("FLT_ON Push \r\n");
MasashiNomura 34:234b87f3e6ce 556 }
MasashiNomura 34:234b87f3e6ce 557 if(chkSWUserOpeRE(HbUserOpe::FLT_OFF)){
MasashiNomura 39:1b76f7df8804 558 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE){
MasashiNomura 39:1b76f7df8804 559 gf_AxReq[0].bf.req = true;
MasashiNomura 39:1b76f7df8804 560 gf_AxReq[1].bf.req = true;
MasashiNomura 39:1b76f7df8804 561 gf_AxReq[0].bf.val = 0;
MasashiNomura 39:1b76f7df8804 562 gf_AxReq[1].bf.val = 0;
MasashiNomura 39:1b76f7df8804 563 if(stat == DRIVE){
MasashiNomura 39:1b76f7df8804 564 setStateF(EMGGND);
MasashiNomura 39:1b76f7df8804 565 } else {
MasashiNomura 39:1b76f7df8804 566 setStateF(GROUND);
MasashiNomura 39:1b76f7df8804 567 }
MasashiNomura 39:1b76f7df8804 568 }
MasashiNomura 34:234b87f3e6ce 569 sp.printf("FLT_OFF Push \r\n");
MasashiNomura 31:56c554c560c1 570 }
MasashiNomura 39:1b76f7df8804 571 if(chkSWUserOpe(HbUserOpe::F_ENG_UP)){
MasashiNomura 39:1b76f7df8804 572 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE){
MasashiNomura 39:1b76f7df8804 573 tmpAxl = getAccelVal(FRONT);
MasashiNomura 39:1b76f7df8804 574 if(tmpAxl < MAX_VAL_12BIT){
MasashiNomura 39:1b76f7df8804 575 ++tmpAxl;
MasashiNomura 39:1b76f7df8804 576 }
MasashiNomura 39:1b76f7df8804 577 gf_AxReq[0].bf.req = true;
MasashiNomura 39:1b76f7df8804 578 gf_AxReq[0].bf.val = tmpAxl;
MasashiNomura 39:1b76f7df8804 579 }
MasashiNomura 39:1b76f7df8804 580 }
MasashiNomura 39:1b76f7df8804 581 if(chkSWUserOpe(HbUserOpe::F_ENG_DOWN)){
MasashiNomura 39:1b76f7df8804 582 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE){
MasashiNomura 39:1b76f7df8804 583 tmpAxl = getAccelVal(FRONT);
MasashiNomura 39:1b76f7df8804 584 if(tmpAxl > 0){
MasashiNomura 39:1b76f7df8804 585 --tmpAxl;
MasashiNomura 39:1b76f7df8804 586 }
MasashiNomura 39:1b76f7df8804 587 gf_AxReq[0].bf.req = true;
MasashiNomura 39:1b76f7df8804 588 gf_AxReq[0].bf.val = tmpAxl;
MasashiNomura 31:56c554c560c1 589 }
MasashiNomura 39:1b76f7df8804 590 }
MasashiNomura 39:1b76f7df8804 591 if(chkSWUserOpe(HbUserOpe::R_ENG_UP)){
MasashiNomura 39:1b76f7df8804 592 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE){
MasashiNomura 39:1b76f7df8804 593 tmpAxl = getAccelVal(REAR);
MasashiNomura 39:1b76f7df8804 594 if(tmpAxl < MAX_VAL_12BIT){
MasashiNomura 39:1b76f7df8804 595 ++tmpAxl;
MasashiNomura 39:1b76f7df8804 596 }
MasashiNomura 39:1b76f7df8804 597 gf_AxReq[1].bf.req = true;
MasashiNomura 39:1b76f7df8804 598 gf_AxReq[1].bf.val = tmpAxl;
MasashiNomura 36:2cc739c7e4cb 599 }
MasashiNomura 39:1b76f7df8804 600 }
MasashiNomura 39:1b76f7df8804 601 if(chkSWUserOpe(HbUserOpe::R_ENG_DOWN)){
MasashiNomura 39:1b76f7df8804 602 if(stat == TAKE_OFF || stat == HOVER || stat == DRIVE){
MasashiNomura 39:1b76f7df8804 603 tmpAxl = getAccelVal(REAR);
MasashiNomura 39:1b76f7df8804 604 if(tmpAxl > 0){
MasashiNomura 39:1b76f7df8804 605 --tmpAxl;
MasashiNomura 39:1b76f7df8804 606 }
MasashiNomura 39:1b76f7df8804 607 gf_AxReq[1].bf.req = true;
MasashiNomura 39:1b76f7df8804 608 gf_AxReq[1].bf.val = tmpAxl;
MasashiNomura 39:1b76f7df8804 609 }
MasashiNomura 39:1b76f7df8804 610 }
MasashiNomura 39:1b76f7df8804 611 // if(chkSWUserOpe(HbUserOpe::ALL_STOP)){
MasashiNomura 39:1b76f7df8804 612 // // モーター
MasashiNomura 39:1b76f7df8804 613 // for(int i = 0; i < 4; ++i){
MasashiNomura 39:1b76f7df8804 614 // gf_MtReq[i].req = true;
MasashiNomura 39:1b76f7df8804 615 // gf_MtReq[i].val = 0;
MasashiNomura 39:1b76f7df8804 616 // gf_MtReqOfs[i].req = true;
MasashiNomura 39:1b76f7df8804 617 // gf_MtReqOfs[i].val = 0;
MasashiNomura 39:1b76f7df8804 618 // }
MasashiNomura 39:1b76f7df8804 619 // // エンジン用サーボ
MasashiNomura 39:1b76f7df8804 620 // for(int i = 0; i < 2; ++i){
MasashiNomura 39:1b76f7df8804 621 // gf_AxReq[i].bf.req = true;
MasashiNomura 39:1b76f7df8804 622 // gf_AxReq[i].bf.val = 0;
MasashiNomura 39:1b76f7df8804 623 // }
MasashiNomura 39:1b76f7df8804 624 // gf_FromActiveStat = isActiveState();
MasashiNomura 39:1b76f7df8804 625 // setStateF(MOT_STOP);
MasashiNomura 39:1b76f7df8804 626 // }
MasashiNomura 31:56c554c560c1 627 }
MasashiNomura 23:79e20be4bc5b 628 // ユーザー操作関連end
MasashiNomura 23:79e20be4bc5b 629 //------------------------------------------------------
MasashiNomura 23:79e20be4bc5b 630
takeru0x1103 17:f9610f3cfa1b 631 //======================================================
takeru0x1103 17:f9610f3cfa1b 632 //コンストラクタ
takeru0x1103 17:f9610f3cfa1b 633 //======================================================
takeru0x1103 17:f9610f3cfa1b 634 HbManager::HbManager(){
takeru0x1103 18:5aa48aec9cae 635 //メンバクラスインスタンス
takeru0x1103 18:5aa48aec9cae 636 eng[0] = new HbEngine(0);
takeru0x1103 18:5aa48aec9cae 637 eng[1] = new HbEngine(1);
MasashiNomura 32:7f4145cc3551 638 att = new HbAttitude(2.0 , 0 , 0 , 0);//パラメータ outP P I D
MasashiNomura 28:fdb3b144e342 639 // mot[0] = new HbMotor(0);
MasashiNomura 28:fdb3b144e342 640 // mot[1] = new HbMotor(1);
MasashiNomura 28:fdb3b144e342 641 // mot[2] = new HbMotor(2);
MasashiNomura 28:fdb3b144e342 642 // mot[3] = new HbMotor(3);
MasashiNomura 28:fdb3b144e342 643
MasashiNomura 28:fdb3b144e342 644 subProp[0] = new HbSubProp(F_L);
MasashiNomura 28:fdb3b144e342 645 subProp[0]->setCoef(IN, 0.00004, 0.0401, 29.262);
MasashiNomura 28:fdb3b144e342 646 subProp[0]->setCoef(OUT,0.00004, 0.1336, -69.184);
MasashiNomura 22:24c9c2dedca9 647
MasashiNomura 28:fdb3b144e342 648 subProp[1] = new HbSubProp(F_R);
MasashiNomura 28:fdb3b144e342 649 subProp[1]->setCoef(IN, 0.00004, 0.0151, 70.947);
MasashiNomura 28:fdb3b144e342 650 subProp[1]->setCoef(OUT,0.00004, 0.1336, -69.184);
MasashiNomura 28:fdb3b144e342 651
MasashiNomura 28:fdb3b144e342 652 subProp[2] = new HbSubProp(R_L);
MasashiNomura 28:fdb3b144e342 653 subProp[2]->setCoef(IN, 0.00004, 0.0244, 53.954);
MasashiNomura 28:fdb3b144e342 654 subProp[2]->setCoef(OUT,0.00003, 0.1579, -114.22);
MasashiNomura 28:fdb3b144e342 655
MasashiNomura 28:fdb3b144e342 656 subProp[3] = new HbSubProp(R_R);
MasashiNomura 28:fdb3b144e342 657 subProp[3]->setCoef(IN, 0.00004, 0.0111, 82.044);
MasashiNomura 28:fdb3b144e342 658 subProp[3]->setCoef(OUT,0.00003, 0.1617, -123.27);
MasashiNomura 28:fdb3b144e342 659
takeru0x1103 18:5aa48aec9cae 660 imu = new Imu(p28,p27);
takeru0x1103 18:5aa48aec9cae 661
MasashiNomura 22:24c9c2dedca9 662 ope = new HbUserOpe();
MasashiNomura 22:24c9c2dedca9 663
MasashiNomura 36:2cc739c7e4cb 664 // //初期化
MasashiNomura 36:2cc739c7e4cb 665 // motorVal[0]=0;
MasashiNomura 36:2cc739c7e4cb 666 // motorVal[1]=0;
MasashiNomura 36:2cc739c7e4cb 667 // motorVal[2]=0;
MasashiNomura 36:2cc739c7e4cb 668 // motorVal[3]=0;
takeru0x1103 17:f9610f3cfa1b 669 }