to Mineta

Dependencies:   VNH5019

Dependents:   agz_base_ver2 agz_base_ver2 get_GPS_data_ver1 aigamozu_program_ver2 ... more

Committer:
s1200058
Date:
Mon Apr 13 11:33:06 2015 +0000
Revision:
12:eaab0ccb9255
Parent:
11:4d71c9cc3b4a
Child:
13:a5bc425540a7
ver2

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;
s1200058 12:eaab0ccb9255 133 int i;
s1200058 12:eaab0ccb9255 134 /*
m5171135 7:200ce5c1f486 135 printf("Check Start\n");
kityann 11:4d71c9cc3b4a 136 printf("agzPoint=%f,%f\n",agzPoint.x,agzPoint.y);
kityann 11:4d71c9cc3b4a 137 printf("bsdrPoint1=%f,%f\n",basePoint[0].x,basePoint[0].y);
kityann 11:4d71c9cc3b4a 138 printf("bsdrPoint2=%f,%f\n",basePoint[1].x,basePoint[1].y);
kityann 11:4d71c9cc3b4a 139 printf("bsdrPoint3=%f,%f\n",basePoint[2].x,basePoint[2].y);
kityann 11:4d71c9cc3b4a 140 printf("bsdrPoint4=%f,%f\n",basePoint[3].x,basePoint[3].y);
s1200058 12:eaab0ccb9255 141 */
s1200058 12:eaab0ccb9255 142 printf("-1, %f, %f\n",agzPoint.x,agzPoint.y);
s1200058 12:eaab0ccb9255 143 for(i = 0; i < 4; i++){
s1200058 12:eaab0ccb9255 144 printf(" %d, %f, %f\n", i, basePoint[i].x,basePoint[i].y);
s1200058 12:eaab0ccb9255 145 }
kityann 10:e77c664ee5e2 146 if(AigamozuControlPackets::checkGpsHit(basePoint[0],basePoint[1],basePoint[2],agzPoint)){
kityann 10:e77c664ee5e2 147 printf("InArea\n");
kityann 10:e77c664ee5e2 148 out_flag = false;
kityann 10:e77c664ee5e2 149 out_count_flag = false;
kityann 11:4d71c9cc3b4a 150 }else if(AigamozuControlPackets::checkGpsHit(basePoint[2],basePoint[3],basePoint[0],agzPoint)){
kityann 10:e77c664ee5e2 151 printf("InArea\n");
kityann 10:e77c664ee5e2 152 out_flag = false;
kityann 10:e77c664ee5e2 153 out_count_flag = false;
kityann 10:e77c664ee5e2 154 }else{//if robot is out
kityann 10:e77c664ee5e2 155 printf("OutArea\n");
kityann 10:e77c664ee5e2 156 out_flag = true;
m5171135 7:200ce5c1f486 157 }
m5171135 7:200ce5c1f486 158
kityann 10:e77c664ee5e2 159 //if robot is out:
kityann 10:e77c664ee5e2 160 if(out_flag == true || out_count_flag == false){
kityann 10:e77c664ee5e2 161 Automove_Timer.reset();
kityann 10:e77c664ee5e2 162 out_count_flag = true;
kityann 10:e77c664ee5e2 163 }
kityann 10:e77c664ee5e2 164 if(out_flag){
kityann 10:e77c664ee5e2 165 if(Automove_Timer.read_ms() < 1000){
kityann 10:e77c664ee5e2 166 _agzSheild.changeSpeed(1,64,2,64);//turn
kityann 10:e77c664ee5e2 167 }else if(Automove_Timer.read_ms() < 5000){
kityann 10:e77c664ee5e2 168 _agzSheild.changeSpeed(1,64,1,64);//straight
kityann 10:e77c664ee5e2 169 }else if(Automove_Timer.read_ms() >= 5000){
kityann 10:e77c664ee5e2 170 out_count_flag=false;
kityann 10:e77c664ee5e2 171 }
kityann 10:e77c664ee5e2 172 }else{
kityann 10:e77c664ee5e2 173 //if robot is inner
kityann 10:e77c664ee5e2 174 _agzSheild.changeSpeed(1,64,1,64);//straight
kityann 10:e77c664ee5e2 175 }
kityann 10:e77c664ee5e2 176
kityann 10:e77c664ee5e2 177 }
kityann 10:e77c664ee5e2 178
m5171135 7:200ce5c1f486 179
m5171135 7:200ce5c1f486 180
m5171135 7:200ce5c1f486 181
m5171135 7:200ce5c1f486 182
m5171135 7:200ce5c1f486 183
m5171135 7:200ce5c1f486 184 //Update Robot Point
kityann 11:4d71c9cc3b4a 185 void AigamozuControlPackets::reNewRobotPoint(long latitudeH,long latitudeL,long longitudeH,long longitudeL){
kityann 11:4d71c9cc3b4a 186 agzPoint.x = (double)latitudeH + (double)(latitudeL / 1000000.0);
kityann 11:4d71c9cc3b4a 187 agzPoint.y = (double)longitudeH +(double)(longitudeL / 1000000.0);
m5171135 7:200ce5c1f486 188
m5171135 7:200ce5c1f486 189 }
kityann 11:4d71c9cc3b4a 190
kityann 11:4d71c9cc3b4a 191 //Updata Base Point
kityann 11:4d71c9cc3b4a 192 void AigamozuControlPackets::reNewBasePoint(int id, long latitudeH,long latitudeL,long longitudeH,long longitudeL){
kityann 11:4d71c9cc3b4a 193 basePoint[id].x = (double)latitudeH + (double)(latitudeL / 1000000.0);
kityann 11:4d71c9cc3b4a 194 basePoint[id].y = (double)longitudeH +(double)(longitudeL / 1000000.0);
kityann 11:4d71c9cc3b4a 195 }
m5171135 7:200ce5c1f486 196
m5171135 7:200ce5c1f486 197
m5171135 7:200ce5c1f486 198 //Check Hit Point Area
m5171135 7:200ce5c1f486 199 bool AigamozuControlPackets::checkGpsHit( vertex2D A, vertex2D B, vertex2D C, vertex2D P){
m5171135 7:200ce5c1f486 200 vector2D AB = AigamozuControlPackets::sub_vector(B, A);
m5171135 7:200ce5c1f486 201 vector2D BP = AigamozuControlPackets::sub_vector(P, B);
m5171135 7:200ce5c1f486 202
m5171135 7:200ce5c1f486 203 vector2D BC = AigamozuControlPackets::sub_vector(C, B);
m5171135 7:200ce5c1f486 204 vector2D CP = AigamozuControlPackets::sub_vector(P, C);
m5171135 7:200ce5c1f486 205
m5171135 7:200ce5c1f486 206 vector2D CA = AigamozuControlPackets::sub_vector(A, C);
m5171135 7:200ce5c1f486 207 vector2D AP = AigamozuControlPackets::sub_vector(P, A);
m5171135 7:200ce5c1f486 208
m5171135 7:200ce5c1f486 209 double c1 = AB.x * BP.y - AB.y * BP.x;
m5171135 7:200ce5c1f486 210 double c2 = BC.x * CP.y - BC.y * CP.x;
m5171135 7:200ce5c1f486 211 double c3 = CA.x * AP.y - CA.y * AP.x;
m5171135 7:200ce5c1f486 212
m5171135 7:200ce5c1f486 213 if( ( c1 > 0 && c2 > 0 && c3 > 0 ) || ( c1 < 0 && c2 < 0 && c3 < 0 ) ) {
m5171135 7:200ce5c1f486 214 return true;
m5171135 5:3f51eeb5aedc 215 }
m5171135 6:f164a716be46 216
m5171135 7:200ce5c1f486 217 return false;
m5171135 7:200ce5c1f486 218
m5171135 7:200ce5c1f486 219 }
m5171135 7:200ce5c1f486 220
m5171135 7:200ce5c1f486 221 vector2D AigamozuControlPackets::sub_vector( const vector2D& a, const vector2D& b )
m5171135 7:200ce5c1f486 222 {
m5171135 7:200ce5c1f486 223 vector2D ret;
m5171135 7:200ce5c1f486 224 ret.x = a.x - b.x;
m5171135 7:200ce5c1f486 225 ret.y = a.y - b.y;
m5171135 7:200ce5c1f486 226 return ret;
m5171135 7:200ce5c1f486 227 }
m5171135 7:200ce5c1f486 228
m5171135 7:200ce5c1f486 229
m5171135 7:200ce5c1f486 230
m5171135 5:3f51eeb5aedc 231
m5171135 6:f164a716be46 232 //////////////////////////////
m5171135 6:f164a716be46 233 // Mode change //
m5171135 6:f164a716be46 234 //////////////////////////////
m5171135 2:3f2d4f53ceed 235 bool AigamozuControlPackets::changeMode(uint8_t *buf){
m5171135 2:3f2d4f53ceed 236
m5171135 6:f164a716be46 237 //reset
m5171135 5:3f51eeb5aedc 238 _agzSheild.changeSpeed(0,0,0,0);
m5171135 6:f164a716be46 239 eachModeInt.detach();
m5171135 5:3f51eeb5aedc 240
m5171135 6:f164a716be46 241 //Select Mode
m5171135 2:3f2d4f53ceed 242 switch(buf[19]){
m5171135 2:3f2d4f53ceed 243 case 0:
m5171135 2:3f2d4f53ceed 244 nowMode = STANDBY_MODE;
m5171135 2:3f2d4f53ceed 245 break;
m5171135 2:3f2d4f53ceed 246
m5171135 2:3f2d4f53ceed 247 case 1:
m5171135 6:f164a716be46 248 eachModeInt.attach(this,&AigamozuControlPackets::manualMode,1.0);
m5171135 2:3f2d4f53ceed 249 nowMode = MANUAL_MODE;
m5171135 2:3f2d4f53ceed 250 break;
m5171135 2:3f2d4f53ceed 251
m5171135 2:3f2d4f53ceed 252 case 2:
kityann 11:4d71c9cc3b4a 253 //nowMode = AUTO_MODE;
kityann 11:4d71c9cc3b4a 254 //eachModeInt.attach(this,&AigamozuControlPackets::randomAuto,1.0);
kityann 11:4d71c9cc3b4a 255 eachModeInt.attach(this,&AigamozuControlPackets::gpsAuto,1.0);
kityann 11:4d71c9cc3b4a 256 nowMode = AUTO_GPS_MODE;
m5171135 2:3f2d4f53ceed 257 break;
m5171135 4:04dadf67ecb6 258
m5171135 4:04dadf67ecb6 259 case 3:
kityann 10:e77c664ee5e2 260 eachModeInt.attach(this,&AigamozuControlPackets::gpsAuto,0.2);
m5171135 4:04dadf67ecb6 261 nowMode = AUTO_GPS_MODE;
m5171135 4:04dadf67ecb6 262 break;
m5171135 4:04dadf67ecb6 263
m5171135 6:f164a716be46 264 default:
m5171135 6:f164a716be46 265 nowMode = STANDBY_MODE;
m5171135 6:f164a716be46 266 break;
m5171135 5:3f51eeb5aedc 267
m5171135 2:3f2d4f53ceed 268 }
m5171135 2:3f2d4f53ceed 269 return false;
m5171135 2:3f2d4f53ceed 270 }
m5171135 5:3f51eeb5aedc 271
m5171135 5:3f51eeb5aedc 272
m5171135 2:3f2d4f53ceed 273