00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "Magnetometer.h"
00014
00015
00016
00017
00018
00019
00020
00021
00022 Magnetometer::Magnetometer( )
00023 {
00024 }
00025
00026
00027
00028
00029 Magnetometer::Magnetometer( TiXmlHandle handle ): m_magCountsBody(3)
00030 {
00031 m_magCountsSensor.initialize(3);
00032
00033 char* magfn;
00034 magfn = (char*)malloc(50);
00035
00036 buffer = (char*) malloc(100);
00037 magread = (char*) malloc(7);
00038
00039 TiXmlHandle magHandle = handle.FirstChild("HARDWARE_PROPERTIES").FirstChild("MAGNETOMETER");
00040
00041 magfn = (char *)magHandle.Child("PORT",0).Element() -> Attribute("value");
00042
00043 int response;
00044 Vector mtob(3);
00045
00046 response = magHandle.Child("SENSOR_2_BODY_VECTOR", 0).Element() -> QueryDoubleAttribute("value1", &mtob(1));
00047 checkResponse(response);
00048 response = magHandle.Child("SENSOR_2_BODY_VECTOR", 0).Element() -> QueryDoubleAttribute("value2", &mtob(2));
00049 checkResponse(response);
00050 response = magHandle.Child("SENSOR_2_BODY_VECTOR", 0).Element() -> QueryDoubleAttribute("value3", &mtob(3));
00051 checkResponse(response);
00052
00053 response = magHandle.Child("X_OFFSET", 0).Element() -> QueryDoubleAttribute("value", &m_xOff);
00054 checkResponse(response);
00055 response = magHandle.Child("Y_OFFSET", 0).Element() -> QueryDoubleAttribute("value", &m_yOff);
00056 checkResponse(response);
00057 response = magHandle.Child("MAJOR_AXIS", 0).Element() -> QueryDoubleAttribute("value", &m_majorA);
00058 checkResponse(response);
00059 response = magHandle.Child("MINOR_AXIS", 0).Element() -> QueryDoubleAttribute("value", &m_minorA);
00060 checkResponse(response);
00061 response = magHandle.Child("PHI", 0).Element() -> QueryDoubleAttribute("value", &m_phi);
00062 checkResponse(response);
00063
00064
00065 mtob(1) = Deg2Rad(mtob(1));
00066 mtob(2) = Deg2Rad(mtob(2));
00067 mtob(3) = Deg2Rad(mtob(3));
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 m_Rmb.initialize(3,3);
00102 m_Rmb( _(1,3), _(1,3) ) = DirectionCosineMatrix(mtob(1),mtob(2),mtob(3),321);
00103
00104 Initialize( magfn );
00105 }
00106
00107
00108
00109 Magnetometer::~Magnetometer( )
00110 {
00111
00112 cerr << "Deinitialize Magnetometer" << endl;
00113
00114
00115 say(m_magfd,"*99WE\r");
00116 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00117 say(m_magfd, "*99D\r");
00118 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00119 cerr << "Set Magnetometer to Factory Defaults - Response: " << endl << buffer << endl;
00120 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00121 cerr << buffer << endl;
00122
00123 close(m_magfd);
00124
00125 }
00126
00127
00128
00129
00130
00131
00132 int Magnetometer::Initialize( const string& magfn )
00133 {
00134
00135 if (init_serial((char*)magfn.c_str(), B9600, &(m_magfd)) < 0 )
00136 {
00137 cerr << "ERROR: Magnetometer serial initialization failed.\n";
00138 exit(1);
00139 }
00140
00141 cerr << "\nInitialization of Magnetometer" << endl;
00142
00143 DefaultConfiguration( );
00144
00145 SetBaud19200Configuration( );
00146
00147 close(m_magfd);
00148
00149
00150 if (init_serial((char*)magfn.c_str(), B19200, &(m_magfd)) < 0 )
00151 {
00152 cerr << "ERROR: Magnetometer serial initialization failed.\n";
00153 exit(1);
00154 }
00155
00156 PolledDataConfiguration( );
00157
00158 SetBinaryConfiguration( );
00159
00160 SetSampleRateConfiguration( );
00161
00162 SetResetOnConfiguration( );
00163
00164
00165 SetAveragingOnConfiguration( );
00166
00167
00168 ReEnterOnConfiguration( );
00169
00170
00171 QuerryConfiguration( );
00172
00173 return( 0 );
00174 }
00175
00176
00177
00178 void Magnetometer::DefaultConfiguration( )
00179 {
00180
00181 say(m_magfd,"*99WE\r");
00182 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00183 say(m_magfd, "*99D\r");
00184 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00185 cerr << "Set Magnetometer to Factory Defaults - Response: " << endl << buffer << endl;
00186 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00187 cerr << buffer << endl;
00188 usleep(1000000);
00189 }
00190
00191
00192
00193 void Magnetometer::SetBaud19200Configuration( )
00194 {
00195
00196 say(m_magfd,"*99WE\r");
00197 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00198 say(m_magfd, "*99!BR=F\r");
00199 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00200 cerr << "Set Magnetometer Baud Rate to 19,200 - Response: " << endl << buffer << endl;
00201 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00202 cerr << buffer << endl;
00203 usleep(100000);
00204 }
00205
00206
00207 void Magnetometer::PolledDataConfiguration( )
00208 {
00209
00210 say(m_magfd, "*99P\r");
00211 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00212 cerr << "Set Magnetometer to polled data mode - Response: " << buffer << endl;
00213 usleep(100000);
00214 }
00215
00216
00217 void Magnetometer::ContinuousDataConfiguration( )
00218 {
00219 say(m_magfd, "*99C\r");
00220 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00221 cerr << "Set Magnetometer to polled data mode - Response: " << buffer << endl;
00222 usleep(100000);
00223 }
00224
00225 void Magnetometer::SetBinaryConfiguration( )
00226 {
00227
00228 say(m_magfd,"*99WE\r");
00229 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00230 say(m_magfd, "*99B\r");
00231 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00232 cerr << "Set Magnetometer to Binary mode - Response: " << buffer << endl;
00233 usleep(100000);
00234 }
00235
00236
00237 void Magnetometer::SetAsciiConfiguration( )
00238 {
00239 say(m_magfd,"*99WE\r");
00240 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00241 say(m_magfd,"*99A\r");
00242 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00243 cerr << "Set Magnetometer to Ascii mode - Response: " << buffer << endl;
00244 usleep(100000);
00245 }
00246
00247
00248
00249 void Magnetometer::SetSampleRateConfiguration( )
00250 {
00251 say(m_magfd, "*99R=154\r");
00252 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00253 cerr << "Set Magnetometer sample rate - Response: " << buffer << endl;
00254 usleep(100000);
00255 }
00256
00257
00258 void Magnetometer::SetResetOnConfiguration( )
00259 {
00260 say(m_magfd,"*99WE\r");
00261 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00262 say(m_magfd, "*99TN\r");
00263 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00264 cerr << "Set Magnetometer to Set/Reset On - Response: " << buffer << endl;
00265 usleep(100000);
00266 }
00267
00268
00269 void Magnetometer::SetResetOffConfiguration( )
00270 {
00271 say(m_magfd,"*99WE\r");
00272 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00273 say(m_magfd, "*99TF\r");
00274 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00275 cerr << "Set Magnetometer to Set/Reset OFF - Response: " << buffer << endl;
00276 usleep(100000);
00277 }
00278
00279
00280 void Magnetometer::SetAveragingOnConfiguration( )
00281 {
00282 say(m_magfd,"*99WE\r");
00283 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00284 say(m_magfd, "*99VN\r");
00285 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00286 cerr << "Set Magnetometer to Averaging On - Response: " << buffer << endl;
00287 usleep(100000);
00288 }
00289
00290
00291 void Magnetometer::SetAveragingOffConfiguration( )
00292 {
00293 say(m_magfd,"*99WE\r");
00294 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00295 say(m_magfd, "*99VF\r");
00296 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00297 cerr << "Set Magnetometer to Averaging OFF - Response: " << buffer << endl;
00298 usleep(100000);
00299 }
00300
00301
00302 void Magnetometer::ReEnterOnConfiguration( )
00303 {
00304 say(m_magfd,"*99WE\r");
00305 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00306 say(m_magfd, "*99Y\r");
00307 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00308 cerr << "Set Magnetometer to Re-Enter On - Response: " << buffer << endl;
00309 usleep(100000);
00310 }
00311
00312
00313 void Magnetometer::ReEnterOffConfiguration( )
00314 {
00315 say(m_magfd,"*99WE\r");
00316 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00317 say(m_magfd, "*99N\r");
00318 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00319 cerr << "Set Magnetometer to Re-Enter OFF - Response: " << buffer << endl;
00320 usleep(100000);
00321 }
00322
00323
00324 void Magnetometer::QuerryConfiguration( )
00325 {
00326 say(m_magfd, "*99Q\r");
00327 hear(m_magfd, buffer, 100, 0, 300000, '\r');
00328 cerr << "Magnetometer Setting Parameters: " << buffer << endl;
00329 }
00330
00331
00332
00333
00334 Measurement Magnetometer::GetMeasurement( )
00335 {
00336 Measurement unintializedMeasurement;
00337 return( unintializedMeasurement );
00338 }
00339
00340
00341
00342
00343
00344 Vector Magnetometer::GetRawVectorMeasurement( )
00345 {
00346
00347
00348 BinaryParser( );
00349
00350 return ( m_magCountsSensor );
00351 }
00352
00353
00354
00355
00356
00357 void Magnetometer::AsciiParser( )
00358 {
00359 say(m_magfd, "*99P\r");
00360
00361
00362 hear(m_magfd, magread, 7, 0, 300000, '\r');
00363
00364 stringstream os(magread);
00365
00366 char* number;
00367 number = (char*) malloc(5);
00368
00369
00370
00371 for (int i=1;os >> buffer;i++)
00372 {
00373 if (i<4) m_magCountsSensor(i) = 1;
00374 if (buffer[0] == '-')
00375 {
00376 os >> buffer;
00377 if(i<4) m_magCountsSensor(i) = -1;
00378 }
00379
00380 if (strchr(buffer,','))
00381 {
00382 strcpy(number, strtok(buffer, ","));
00383
00384 strcat(number,strtok(NULL,"\r"));
00385
00386
00387 strcpy(buffer, number);
00388 bzero(number, sizeof(number));
00389 }
00390
00391
00392 if (i <4) m_magCountsSensor(i) *= atoi(buffer);
00393 }
00394 }
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411 void Magnetometer::BinaryParser( )
00412 {
00413 say(m_magfd, "*99P\r");
00414
00415
00416 hear(m_magfd, magread, 7, 0, 300000, '\r');
00417
00418 m_magCountsSensor(1) = ((static_cast<int>(magread[0])) << 8) + static_cast
00419 <int>(static_cast<unsigned char>(magread[1]));
00420
00421 m_magCountsSensor(2) = ((static_cast<int>(magread[2])) << 8) + static_cast
00422 <int>(static_cast<unsigned char>(magread[3]));
00423
00424 m_magCountsSensor(3) = ((static_cast<int>(magread[4])) << 8) + static_cast
00425 <int>(static_cast<unsigned char>(magread[5]));
00426 return;
00427 }
00428
00429
00430
00431
00432
00433 Vector Magnetometer::GetVectorMeasurement( )
00434 {
00435 static double xtmp, ytmp, xtmp2, ytmp2;
00436
00437 GetRawVectorMeasurement( );
00438
00439
00440 m_magCountsBody = m_Rmb*(m_magCountsSensor);
00441
00442
00443
00444 xtmp = m_magCountsBody(1);
00445 ytmp = m_magCountsBody(2);
00446
00447
00448 xtmp = xtmp - m_xOff;
00449 ytmp = ytmp - m_yOff;
00450
00451
00452 xtmp2 = xtmp*cos(m_phi) + ytmp*sin(m_phi);
00453 ytmp2 = -xtmp*sin(m_phi) + ytmp*cos(m_phi);
00454
00455
00456 xtmp2 = xtmp2*m_minorA/m_majorA;
00457
00458
00459 m_magCountsBody(1) = xtmp2*cos(m_phi) - ytmp2*sin(m_phi);
00460 m_magCountsBody(2) = xtmp2*sin(m_phi) + ytmp2*cos(m_phi);
00461
00462 return( m_magCountsBody );
00463 }
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506