to Mineta

Dependencies:   VNH5019

Dependents:   agz_base_ver2 agz_base_ver2 get_GPS_data_ver1 aigamozu_program_ver2 ... more

Committer:
kityann
Date:
Mon Apr 13 10:09:30 2015 +0000
Revision:
11:4d71c9cc3b4a
Parent:
10:e77c664ee5e2
Child:
12:eaab0ccb9255
agz;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
m5171135 0:2b8b56ac7a82 1 #include "AigamozuControlPackets.h"
m5171135 0:2b8b56ac7a82 2 #include "VNH5019.h"
m5171135 0:2b8b56ac7a82 3
m5171135 6:f164a716be46 4 //////////////////////////////
m5171135 6:f164a716be46 5 // Init //
m5171135 6:f164a716be46 6 //////////////////////////////
m5171135 5:3f51eeb5aedc 7 AigamozuControlPackets::AigamozuControlPackets(VNH5019 agzSheild):_agzSheild(agzSheild){
m5171135 2:3f2d4f53ceed 8 packetData = new uint8_t[50];
m5171135 2:3f2d4f53ceed 9 packetLength = 0;
m5171135 7:200ce5c1f486 10 //--init base point--//
kityann 11:4d71c9cc3b4a 11 //basePoint[0].x = 13956.2655;
kityann 11:4d71c9cc3b4a 12 //basePoint[0].y = 3731.5060;
kityann 11:4d71c9cc3b4a 13 basePoint[0].x = 100.2655;
kityann 11:4d71c9cc3b4a 14 basePoint[0].y = 30.5060;
m5171135 7:200ce5c1f486 15
kityann 11:4d71c9cc3b4a 16 //basePoint[1].x = 13956.2898;
kityann 11:4d71c9cc3b4a 17 //basePoint[1].y = 3731.5055;
kityann 11:4d71c9cc3b4a 18 basePoint[1].x = 200.2898;
kityann 11:4d71c9cc3b4a 19 basePoint[1].y = 30.5055;
m5171135 7:200ce5c1f486 20
kityann 11:4d71c9cc3b4a 21 //basePoint[2].x = 13956.2915;
kityann 11:4d71c9cc3b4a 22 //basePoint[2].y = 3731.5245;
kityann 11:4d71c9cc3b4a 23 basePoint[2].x = 200.2915;
kityann 11:4d71c9cc3b4a 24 basePoint[2].y = 40.5245;
m5171135 7:200ce5c1f486 25
kityann 11:4d71c9cc3b4a 26 //basePoint[3].x = 13956.2680;
kityann 11:4d71c9cc3b4a 27 //basePoint[3].y = 3731.5248;
kityann 11:4d71c9cc3b4a 28 basePoint[3].x = 100.2680;
kityann 11:4d71c9cc3b4a 29 basePoint[3].y = 40.5248;
m5171135 2:3f2d4f53ceed 30 }
m5171135 2:3f2d4f53ceed 31
m5171135 5:3f51eeb5aedc 32
m5171135 2:3f2d4f53ceed 33 //////////////////////////////
m5171135 2:3f2d4f53ceed 34 // Controller/Base -> Robot //
m5171135 2:3f2d4f53ceed 35 //////////////////////////////
m5171135 4:04dadf67ecb6 36
m5171135 2:3f2d4f53ceed 37 void AigamozuControlPackets::createManualCommad(uint8_t fromID,uint8_t toID,uint8_t directionL,uint8_t pwmL,uint8_t directionR, uint8_t pwmR)
m5171135 2:3f2d4f53ceed 38 {
m5171135 2:3f2d4f53ceed 39 uint8_t tmp[] = {'A','G','S','M','F',fromID,'T',toID,'L',directionL,pwmL,'R',directionR,pwmR,'A','G','E'};
m5171135 2:3f2d4f53ceed 40 for(int i = 0; i < RECEIVE_STATUS_COMMNAD_LENGTH; ++i) packetData[i] = tmp[i];
m5171135 2:3f2d4f53ceed 41 packetLength = RECEIVE_STATUS_COMMNAD_LENGTH;
m5171135 2:3f2d4f53ceed 42 }
m5171135 2:3f2d4f53ceed 43
s1200058 9:4f675487f06b 44 void AigamozuControlPackets::createRequestCommand(uint8_t fromID,uint8_t toID)
m5171135 0:2b8b56ac7a82 45 {
m5171135 2:3f2d4f53ceed 46 uint8_t tmp[] = {'A','G','S','S','F',fromID,'T',toID,'A','G','E'};
m5171135 2:3f2d4f53ceed 47 for(int i = 0; i < REQUEST_COMMNAD_LENGTH; ++i) packetData[i] = tmp[i];
m5171135 2:3f2d4f53ceed 48 packetLength = REQUEST_COMMNAD_LENGTH;
m5171135 2:3f2d4f53ceed 49 }
m5171135 0:2b8b56ac7a82 50
m5171135 2:3f2d4f53ceed 51 void AigamozuControlPackets::createChangeModeCommand(uint8_t fromID,uint8_t toID,uint8_t,MODE mode){
m5171135 2:3f2d4f53ceed 52 uint8_t tmp[] = {'A','G','S','C','F',fromID,'T',toID,mode,'A','G','E'};
m5171135 2:3f2d4f53ceed 53 for(int i = 0; i < CHANGE_MODE_COMMAND_LENGTH; ++i) packetData[i] = tmp[i];
m5171135 2:3f2d4f53ceed 54 packetLength = CHANGE_MODE_COMMAND_LENGTH;
m5171135 2:3f2d4f53ceed 55 }
m5171135 2:3f2d4f53ceed 56
m5171135 2:3f2d4f53ceed 57
m5171135 2:3f2d4f53ceed 58 //////////////////////////////
m5171135 2:3f2d4f53ceed 59 // Robot -> Controller/Base //
m5171135 2:3f2d4f53ceed 60 //////////////////////////////
m5171135 2:3f2d4f53ceed 61
m5171135 2:3f2d4f53ceed 62 void AigamozuControlPackets::createReceiveStatusCommand(uint8_t fromID,uint8_t toID,long latitudeH,long latitudeL,long longitudeH,long longitudeL)
m5171135 2:3f2d4f53ceed 63 {
m5171135 0:2b8b56ac7a82 64 //useing union's split::: long hoge.a(4byte) == uint8_t hoge.b[4]
m5171135 0:2b8b56ac7a82 65 TEST_T latH,latL,lonH,lonL;
m5171135 0:2b8b56ac7a82 66
m5171135 0:2b8b56ac7a82 67 latH.a = latitudeH;
m5171135 0:2b8b56ac7a82 68 latL.a = latitudeL;
m5171135 0:2b8b56ac7a82 69 lonH.a = longitudeH;
m5171135 0:2b8b56ac7a82 70 lonL.a = longitudeL;
m5171135 0:2b8b56ac7a82 71
m5171135 1:80448565c15c 72 uint8_t tmp[] = {'A','G','S','R','F',fromID,'T',toID,'S',nowStatus,71,80,83,latH.b[0],latH.b[1],latH.b[2],latH.b[3],latL.b[0],latL.b[1],latL.b[2],latL.b[3],lonH.b[0],lonH.b[1],lonH.b[2],lonH.b[3],lonL.b[0],lonL.b[1],lonL.b[2],lonL.b[3],65,71,69};
m5171135 2:3f2d4f53ceed 73 for(int i = 0; i < RECEIVE_STATUS_COMMNAD_LENGTH; ++i) packetData[i] = tmp[i];
m5171135 2:3f2d4f53ceed 74 packetLength = RECEIVE_STATUS_COMMNAD_LENGTH;
m5171135 0:2b8b56ac7a82 75 }
m5171135 0:2b8b56ac7a82 76
m5171135 2:3f2d4f53ceed 77
m5171135 2:3f2d4f53ceed 78 //////////////////////////////
m5171135 2:3f2d4f53ceed 79 // Using createPacket //
m5171135 2:3f2d4f53ceed 80 //////////////////////////////
m5171135 4:04dadf67ecb6 81 uint8_t AigamozuControlPackets::checkCommnadType(uint8_t* buf){
m5171135 4:04dadf67ecb6 82 return buf[14];
m5171135 4:04dadf67ecb6 83 }
m5171135 2:3f2d4f53ceed 84
m5171135 2:3f2d4f53ceed 85 uint8_t* AigamozuControlPackets::getPacketData(){
m5171135 2:3f2d4f53ceed 86 return packetData;
m5171135 2:3f2d4f53ceed 87 }
m5171135 2:3f2d4f53ceed 88
m5171135 2:3f2d4f53ceed 89 int AigamozuControlPackets::getPacketLength(){
m5171135 2:3f2d4f53ceed 90 return packetLength;
m5171135 0:2b8b56ac7a82 91 }
m5171135 0:2b8b56ac7a82 92
m5171135 5:3f51eeb5aedc 93 void AigamozuControlPackets::changeSpeed(uint8_t* buf){
m5171135 5:3f51eeb5aedc 94 if(nowMode == MANUAL_MODE){
m5171135 5:3f51eeb5aedc 95 manualCount =0;
m5171135 5:3f51eeb5aedc 96 _agzSheild.changeSpeed(buf[20],buf[21],buf[23],buf[24]);
m5171135 5:3f51eeb5aedc 97 }
m5171135 5:3f51eeb5aedc 98 }
m5171135 4:04dadf67ecb6 99
m5171135 6:f164a716be46 100 //////////////////////////////
m5171135 6:f164a716be46 101 // each mode interrupt //
m5171135 6:f164a716be46 102 //////////////////////////////
m5171135 6:f164a716be46 103
m5171135 6:f164a716be46 104 void AigamozuControlPackets::manualMode(){
m5171135 6:f164a716be46 105 manualCount++;
m5171135 6:f164a716be46 106 if(manualCount > 10){
m5171135 6:f164a716be46 107 _agzSheild.changeSpeed(0,0,0,0);
m5171135 6:f164a716be46 108 manualCount = 0;
m5171135 6:f164a716be46 109 }
m5171135 6:f164a716be46 110 }
m5171135 6:f164a716be46 111
m5171135 6:f164a716be46 112
m5171135 5:3f51eeb5aedc 113 void AigamozuControlPackets::randomAuto(){
m5171135 2:3f2d4f53ceed 114
m5171135 5:3f51eeb5aedc 115 randomCount++;
m5171135 5:3f51eeb5aedc 116
m5171135 5:3f51eeb5aedc 117 if(randomCount < 10) _agzSheild.changeSpeed(1,128,1,128);
m5171135 5:3f51eeb5aedc 118 else if(randomCount < 11) _agzSheild.changeSpeed(2,128,2,128);
m5171135 5:3f51eeb5aedc 119 else randomCount = 0;
m5171135 5:3f51eeb5aedc 120
m5171135 5:3f51eeb5aedc 121 }
m5171135 6:f164a716be46 122
m5171135 6:f164a716be46 123 void AigamozuControlPackets::gpsAuto(){
m5171135 5:3f51eeb5aedc 124
kityann 10:e77c664ee5e2 125 /*
kityann 10:e77c664ee5e2 126 _agzSheild.changeSpeed(2,128,2,128):for moving robot
kityann 10:e77c664ee5e2 127 */
kityann 10:e77c664ee5e2 128
kityann 10:e77c664ee5e2 129 Timer Automove_Timer;
kityann 10:e77c664ee5e2 130
kityann 10:e77c664ee5e2 131 bool out_flag = true;
kityann 10:e77c664ee5e2 132 static bool out_count_flag = false;
kityann 10:e77c664ee5e2 133
m5171135 7:200ce5c1f486 134 printf("Check Start\n");
kityann 11:4d71c9cc3b4a 135 printf("agzPoint=%f,%f\n",agzPoint.x,agzPoint.y);
kityann 11:4d71c9cc3b4a 136 printf("bsdrPoint1=%f,%f\n",basePoint[0].x,basePoint[0].y);
kityann 11:4d71c9cc3b4a 137 printf("bsdrPoint2=%f,%f\n",basePoint[1].x,basePoint[1].y);
kityann 11:4d71c9cc3b4a 138 printf("bsdrPoint3=%f,%f\n",basePoint[2].x,basePoint[2].y);
kityann 11:4d71c9cc3b4a 139 printf("bsdrPoint4=%f,%f\n",basePoint[3].x,basePoint[3].y);
kityann 10:e77c664ee5e2 140 if(AigamozuControlPackets::checkGpsHit(basePoint[0],basePoint[1],basePoint[2],agzPoint)){
kityann 10:e77c664ee5e2 141 printf("InArea\n");
kityann 10:e77c664ee5e2 142 out_flag = false;
kityann 10:e77c664ee5e2 143 out_count_flag = false;
kityann 11:4d71c9cc3b4a 144 }else if(AigamozuControlPackets::checkGpsHit(basePoint[2],basePoint[3],basePoint[0],agzPoint)){
kityann 10:e77c664ee5e2 145 printf("InArea\n");
kityann 10:e77c664ee5e2 146 out_flag = false;
kityann 10:e77c664ee5e2 147 out_count_flag = false;
kityann 10:e77c664ee5e2 148 }else{//if robot is out
kityann 10:e77c664ee5e2 149 printf("OutArea\n");
kityann 10:e77c664ee5e2 150 out_flag = true;
m5171135 7:200ce5c1f486 151 }
m5171135 7:200ce5c1f486 152
kityann 10:e77c664ee5e2 153 //if robot is out:
kityann 10:e77c664ee5e2 154 if(out_flag == true || out_count_flag == false){
kityann 10:e77c664ee5e2 155 Automove_Timer.reset();
kityann 10:e77c664ee5e2 156 out_count_flag = true;
kityann 10:e77c664ee5e2 157 }
kityann 10:e77c664ee5e2 158 if(out_flag){
kityann 10:e77c664ee5e2 159 if(Automove_Timer.read_ms() < 1000){
kityann 10:e77c664ee5e2 160 _agzSheild.changeSpeed(1,64,2,64);//turn
kityann 10:e77c664ee5e2 161 }else if(Automove_Timer.read_ms() < 5000){
kityann 10:e77c664ee5e2 162 _agzSheild.changeSpeed(1,64,1,64);//straight
kityann 10:e77c664ee5e2 163 }else if(Automove_Timer.read_ms() >= 5000){
kityann 10:e77c664ee5e2 164 out_count_flag=false;
kityann 10:e77c664ee5e2 165 }
kityann 10:e77c664ee5e2 166 }else{
kityann 10:e77c664ee5e2 167 //if robot is inner
kityann 10:e77c664ee5e2 168 _agzSheild.changeSpeed(1,64,1,64);//straight
kityann 10:e77c664ee5e2 169 }
kityann 10:e77c664ee5e2 170
kityann 10:e77c664ee5e2 171 }
kityann 10:e77c664ee5e2 172
m5171135 7:200ce5c1f486 173
m5171135 7:200ce5c1f486 174
m5171135 7:200ce5c1f486 175
m5171135 7:200ce5c1f486 176
m5171135 7:200ce5c1f486 177
m5171135 7:200ce5c1f486 178 //Update Robot Point
kityann 11:4d71c9cc3b4a 179 void AigamozuControlPackets::reNewRobotPoint(long latitudeH,long latitudeL,long longitudeH,long longitudeL){
kityann 11:4d71c9cc3b4a 180 agzPoint.x = (double)latitudeH + (double)(latitudeL / 1000000.0);
kityann 11:4d71c9cc3b4a 181 agzPoint.y = (double)longitudeH +(double)(longitudeL / 1000000.0);
m5171135 7:200ce5c1f486 182
m5171135 7:200ce5c1f486 183 }
kityann 11:4d71c9cc3b4a 184
kityann 11:4d71c9cc3b4a 185 //Updata Base Point
kityann 11:4d71c9cc3b4a 186 void AigamozuControlPackets::reNewBasePoint(int id, long latitudeH,long latitudeL,long longitudeH,long longitudeL){
kityann 11:4d71c9cc3b4a 187 basePoint[id].x = (double)latitudeH + (double)(latitudeL / 1000000.0);
kityann 11:4d71c9cc3b4a 188 basePoint[id].y = (double)longitudeH +(double)(longitudeL / 1000000.0);
kityann 11:4d71c9cc3b4a 189 }
m5171135 7:200ce5c1f486 190
m5171135 7:200ce5c1f486 191
m5171135 7:200ce5c1f486 192 //Check Hit Point Area
m5171135 7:200ce5c1f486 193 bool AigamozuControlPackets::checkGpsHit( vertex2D A, vertex2D B, vertex2D C, vertex2D P){
m5171135 7:200ce5c1f486 194 vector2D AB = AigamozuControlPackets::sub_vector(B, A);
m5171135 7:200ce5c1f486 195 vector2D BP = AigamozuControlPackets::sub_vector(P, B);
m5171135 7:200ce5c1f486 196
m5171135 7:200ce5c1f486 197 vector2D BC = AigamozuControlPackets::sub_vector(C, B);
m5171135 7:200ce5c1f486 198 vector2D CP = AigamozuControlPackets::sub_vector(P, C);
m5171135 7:200ce5c1f486 199
m5171135 7:200ce5c1f486 200 vector2D CA = AigamozuControlPackets::sub_vector(A, C);
m5171135 7:200ce5c1f486 201 vector2D AP = AigamozuControlPackets::sub_vector(P, A);
m5171135 7:200ce5c1f486 202
m5171135 7:200ce5c1f486 203 double c1 = AB.x * BP.y - AB.y * BP.x;
m5171135 7:200ce5c1f486 204 double c2 = BC.x * CP.y - BC.y * CP.x;
m5171135 7:200ce5c1f486 205 double c3 = CA.x * AP.y - CA.y * AP.x;
m5171135 7:200ce5c1f486 206
m5171135 7:200ce5c1f486 207 if( ( c1 > 0 && c2 > 0 && c3 > 0 ) || ( c1 < 0 && c2 < 0 && c3 < 0 ) ) {
m5171135 7:200ce5c1f486 208 return true;
m5171135 5:3f51eeb5aedc 209 }
m5171135 6:f164a716be46 210
m5171135 7:200ce5c1f486 211 return false;
m5171135 7:200ce5c1f486 212
m5171135 7:200ce5c1f486 213 }
m5171135 7:200ce5c1f486 214
m5171135 7:200ce5c1f486 215 vector2D AigamozuControlPackets::sub_vector( const vector2D& a, const vector2D& b )
m5171135 7:200ce5c1f486 216 {
m5171135 7:200ce5c1f486 217 vector2D ret;
m5171135 7:200ce5c1f486 218 ret.x = a.x - b.x;
m5171135 7:200ce5c1f486 219 ret.y = a.y - b.y;
m5171135 7:200ce5c1f486 220 return ret;
m5171135 7:200ce5c1f486 221 }
m5171135 7:200ce5c1f486 222
m5171135 7:200ce5c1f486 223
m5171135 7:200ce5c1f486 224
m5171135 5:3f51eeb5aedc 225
m5171135 6:f164a716be46 226 //////////////////////////////
m5171135 6:f164a716be46 227 // Mode change //
m5171135 6:f164a716be46 228 //////////////////////////////
m5171135 2:3f2d4f53ceed 229 bool AigamozuControlPackets::changeMode(uint8_t *buf){
m5171135 2:3f2d4f53ceed 230
m5171135 6:f164a716be46 231 //reset
m5171135 5:3f51eeb5aedc 232 _agzSheild.changeSpeed(0,0,0,0);
m5171135 6:f164a716be46 233 eachModeInt.detach();
m5171135 5:3f51eeb5aedc 234
m5171135 6:f164a716be46 235 //Select Mode
m5171135 2:3f2d4f53ceed 236 switch(buf[19]){
m5171135 2:3f2d4f53ceed 237 case 0:
m5171135 2:3f2d4f53ceed 238 nowMode = STANDBY_MODE;
m5171135 2:3f2d4f53ceed 239 break;
m5171135 2:3f2d4f53ceed 240
m5171135 2:3f2d4f53ceed 241 case 1:
m5171135 6:f164a716be46 242 eachModeInt.attach(this,&AigamozuControlPackets::manualMode,1.0);
m5171135 2:3f2d4f53ceed 243 nowMode = MANUAL_MODE;
m5171135 2:3f2d4f53ceed 244 break;
m5171135 2:3f2d4f53ceed 245
m5171135 2:3f2d4f53ceed 246 case 2:
kityann 11:4d71c9cc3b4a 247 //nowMode = AUTO_MODE;
kityann 11:4d71c9cc3b4a 248 //eachModeInt.attach(this,&AigamozuControlPackets::randomAuto,1.0);
kityann 11:4d71c9cc3b4a 249 eachModeInt.attach(this,&AigamozuControlPackets::gpsAuto,1.0);
kityann 11:4d71c9cc3b4a 250 nowMode = AUTO_GPS_MODE;
m5171135 2:3f2d4f53ceed 251 break;
m5171135 4:04dadf67ecb6 252
m5171135 4:04dadf67ecb6 253 case 3:
kityann 10:e77c664ee5e2 254 eachModeInt.attach(this,&AigamozuControlPackets::gpsAuto,0.2);
m5171135 4:04dadf67ecb6 255 nowMode = AUTO_GPS_MODE;
m5171135 4:04dadf67ecb6 256 break;
m5171135 4:04dadf67ecb6 257
m5171135 6:f164a716be46 258 default:
m5171135 6:f164a716be46 259 nowMode = STANDBY_MODE;
m5171135 6:f164a716be46 260 break;
m5171135 5:3f51eeb5aedc 261
m5171135 2:3f2d4f53ceed 262 }
m5171135 2:3f2d4f53ceed 263 return false;
m5171135 2:3f2d4f53ceed 264 }
m5171135 5:3f51eeb5aedc 265
m5171135 5:3f51eeb5aedc 266
m5171135 2:3f2d4f53ceed 267