Cmera and GPS labrary

Dependents:   HEPTA_SENSOR HEPTA_SENSOR

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers HeptaCamera_GPS.cpp Source File

HeptaCamera_GPS.cpp

00001 #include "HeptaCamera_GPS.h"
00002 #define WAITIDLE    waitIdle
00003 #define SENDFUNC    sendBytes
00004 #define RECVFUNC    recvBytes
00005 #define WAITFUNC    waitRecv
00006 int num=0;
00007 /**
00008  * Constructor.
00009  *
00010  * @param tx A pin for transmit.
00011  * @param rx A pin for receive.
00012  * @param baud Baud rate. (Default is Baud14400.)
00013  */
00014 HeptaCamera_GPS::HeptaCamera_GPS(PinName tx, PinName rx, PinName CAM, PinName GPS) : serial(tx, rx), CAM_SW(CAM), GPS_SW(GPS)
00015 {
00016 }
00017 
00018 /**
00019  * Destructor.
00020  */
00021 HeptaCamera_GPS::~HeptaCamera_GPS()
00022 {
00023 }
00024 
00025 /**
00026  * Make a sync. for baud rate.
00027  */
00028 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sync()
00029 {
00030     for (int i = 0; i < SYNCMAX; i++) {
00031         if (NoError == sendSync()) {
00032             if (NoError == recvAckOrNck()) {
00033                 if (NoError == recvSync()) {
00034                     if (NoError == sendAck(0x0D, 0x00)) {
00035                         /*
00036                          * After synchronization, the camera needs a little time for AEC and AGC to be stable.
00037                          * Users should wait for 1-2 seconds before capturing the first picture.
00038                          */
00039                         wait(2.0);
00040                         return NoError;
00041                     }
00042                 }
00043             }
00044         }
00045         wait_ms(50);
00046     }
00047     return UnexpectedReply;
00048 }
00049 
00050 /**
00051  * Initialize.
00052  *
00053  * @param baud Camera Interface Speed.
00054  * @param jr JPEG resolution.
00055  */
00056 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::init(Baud baud,JpegResolution jr)
00057 {
00058     int i ;
00059     ErrorNumber en;
00060     WAITIDLE();
00061     setmbedBaud((Baud)(0x07)) ;
00062 
00063     for ( i = 1 ; i < 7 ; i++ ) {
00064         if ( NoError == sendSync() ) {
00065             if ( NoError == recvAckOrNck() ) {
00066                 if ( NoError == recvSync() ) {
00067                     if ( NoError == sendAck(0x0D, 0x00) ) {
00068                         en = sendInitial(baud,jr);
00069                         if (NoError != en) {
00070                             return en;
00071                         }
00072                         en = recvAckOrNck();
00073                         if (NoError != en) {
00074                             return en;
00075                         }
00076                         wait_ms(50) ;
00077                         setmbedBaud(baud);
00078                         //wait_ms(50) ;
00079                         static bool alreadySetupPackageSize = false;
00080                         if (!alreadySetupPackageSize) {
00081                             en = sendSetPackageSize(packageSize);
00082                             if (NoError != en) {
00083                                 return en;
00084                             }
00085                             WAITFUNC();
00086                             en = recvAckOrNck();
00087                             if (NoError != en) {
00088                                 return en;
00089                             }
00090                             alreadySetupPackageSize = true;
00091                         }
00092 
00093                         wait(2.0);
00094                         return (ErrorNumber)NoError;
00095                         /*
00096                          * After synchronization, the camera needs a little time for AEC and AGC to be stable.
00097                          * Users should wait for 1-2 seconds before capturing the first picture.
00098                          */
00099                     }
00100                 }
00101             } else {
00102                 setmbedBaud((Baud)(i+1)) ;
00103             }
00104         }
00105         wait_ms(50);
00106     }
00107     return UnexpectedReply;
00108 }
00109 
00110 
00111 /**
00112  * Get JPEG snapshot picture.
00113  *
00114  * @param func A pointer to a callback function.
00115  *             You can block this function until saving the image datas.
00116  * @return Status of the error.
00117  */
00118 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::getJpegSnapshotPicture(FILE*fp)
00119 {
00120     WAITIDLE();
00121     ErrorNumber en;
00122 
00123 
00124     en = sendSnapshot();
00125     if (NoError != en) {
00126         return en;
00127     }
00128     WAITFUNC();
00129     en = recvAckOrNck();
00130     if (NoError != en) {
00131         return en;
00132     }
00133 
00134     en = sendGetPicture();
00135     if (NoError != en) {
00136         return en;
00137     }
00138     WAITFUNC();
00139     en = recvAckOrNck();
00140     if (NoError != en) {
00141         return en;
00142     }
00143 
00144     /*
00145      * Data : snapshot picture
00146      */
00147     uint32_t length = 0;
00148     WAITFUNC();
00149     en = recvData(&length);
00150     if (NoError != en) {
00151         return en;
00152     }
00153     en = sendAck(0x00, 0);
00154     if (NoError != en) {
00155         return en;
00156     }
00157 
00158     char databuf[packageSize - 6];
00159     uint16_t pkg_total = length / (packageSize - 6);
00160     for (int i = 0; i <= (int)pkg_total; i++) {
00161         uint16_t checksum = 0;
00162         // ID.
00163         char idbuf[2];
00164         WAITFUNC();
00165         if (!RECVFUNC(idbuf, sizeof(idbuf))) {
00166             return (ErrorNumber)UnexpectedReply;
00167         }
00168         checksum += idbuf[0];
00169         checksum += idbuf[1];
00170         uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
00171         if (id != i) {
00172             return (ErrorNumber)UnexpectedReply;
00173         }
00174 
00175         // Size of the data.
00176         char dsbuf[2];
00177         WAITFUNC();
00178         if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
00179             return (ErrorNumber)UnexpectedReply;
00180         }
00181 
00182         // Received the data.
00183         checksum += dsbuf[0];
00184         checksum += dsbuf[1];
00185         uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
00186         WAITFUNC();
00187         if (!RECVFUNC(&databuf[0], ds)) {
00188             return (ErrorNumber)UnexpectedReply;
00189         }
00190         for (int j = 0; j < ds; j++) {
00191             checksum += databuf[j];
00192         }
00193 
00194         // Verify code.
00195         char vcbuf[2];
00196         WAITFUNC();
00197         if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
00198             return (ErrorNumber)UnexpectedReply;
00199         }
00200         uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
00201         if (vc != (checksum & 0xff)) {
00202             return (ErrorNumber)UnexpectedReply;
00203         }
00204 
00205         /*
00206          * Call a call back function.
00207          * You can block this function while working.
00208          */
00209         size_t siz = ds;
00210         for (int ii = 0; ii < (int)siz; ii++) {
00211             fprintf(fp, "%c", databuf[ii]);
00212         }
00213         /*
00214          * We should wait for camera working before reply a ACK.
00215          */
00216         wait_ms(100);
00217         en = sendAck(0x00, 1 + i);
00218         if (NoError != en) {
00219             return en;
00220         }
00221     }
00222 
00223     return (ErrorNumber)NoError;
00224 }
00225 
00226 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::getJpegSnapshotPicture_data(FILE*fp)
00227 {
00228     WAITIDLE();
00229     ErrorNumber en;
00230 
00231 
00232     en = sendSnapshot();
00233     if (NoError != en) {
00234         return en;
00235     }
00236     WAITFUNC();
00237     en = recvAckOrNck();
00238     if (NoError != en) {
00239         return en;
00240     }
00241 
00242     en = sendGetPicture();
00243     if (NoError != en) {
00244         return en;
00245     }
00246     WAITFUNC();
00247     en = recvAckOrNck();
00248     if (NoError != en) {
00249         return en;
00250     }
00251 
00252     /*
00253      * Data : snapshot picture
00254      */
00255     uint32_t length = 0;
00256     WAITFUNC();
00257     en = recvData(&length);
00258     if (NoError != en) {
00259         return en;
00260     }
00261     en = sendAck(0x00, 0);
00262     if (NoError != en) {
00263         return en;
00264     }
00265 
00266     char databuf[packageSize - 6];
00267     uint16_t pkg_total = length / (packageSize - 6);
00268     for (int i = 0; i <= (int)pkg_total; i++) {
00269         uint16_t checksum = 0;
00270         // ID.
00271         char idbuf[2];
00272         WAITFUNC();
00273         if (!RECVFUNC(idbuf, sizeof(idbuf))) {
00274             return (ErrorNumber)UnexpectedReply;
00275         }
00276         checksum += idbuf[0];
00277         checksum += idbuf[1];
00278         uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
00279         if (id != i) {
00280             return (ErrorNumber)UnexpectedReply;
00281         }
00282 
00283         // Size of the data.
00284         char dsbuf[2];
00285         WAITFUNC();
00286         if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
00287             return (ErrorNumber)UnexpectedReply;
00288         }
00289 
00290         // Received the data.
00291         checksum += dsbuf[0];
00292         checksum += dsbuf[1];
00293         uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
00294         WAITFUNC();
00295         if (!RECVFUNC(&databuf[0], ds)) {
00296             return (ErrorNumber)UnexpectedReply;
00297         }
00298         for (int j = 0; j < ds; j++) {
00299             checksum += databuf[j];
00300         }
00301 
00302         // Verify code.
00303         char vcbuf[2];
00304         WAITFUNC();
00305         if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
00306             return (ErrorNumber)UnexpectedReply;
00307         }
00308         uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
00309         if (vc != (checksum & 0xff)) {
00310             return (ErrorNumber)UnexpectedReply;
00311         }
00312 
00313         /*
00314          * Call a call back function.
00315          * You can block this function while working.
00316          */
00317         size_t siz = ds;
00318         for (int ii = 0; ii < (int)siz; ii++) {
00319             fprintf(fp, "%02X ", databuf[ii]);
00320             if(++num%16==0) fprintf(fp,"\r\n");
00321         }
00322         /*
00323          * We should wait for camera working before reply a ACK.
00324          */
00325         wait_ms(100);
00326         en = sendAck(0x00, 1 + i);
00327         if (NoError != en) {
00328             return en;
00329         }
00330     }
00331 
00332     return (ErrorNumber)NoError;
00333 }
00334 
00335 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendInitial(Baud baud, JpegResolution jr)
00336 {
00337     char send[COMMAND_LENGTH];
00338 
00339     send[0] = 0xAA;
00340     send[1] = 0x01;
00341     send[2] = (char)baud;
00342     send[3] = 0x07;
00343     send[4] = 0x00;
00344     send[5] = (char)jr;
00345 
00346     if (!SENDFUNC(send, sizeof(send))) {
00347         return (ErrorNumber)SendRegisterTimeout;
00348     }
00349 
00350     return (ErrorNumber)NoError;
00351 }
00352 
00353 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendGetPicture(void)
00354 {
00355     char send[COMMAND_LENGTH];
00356 
00357     send[0] = 0xAA;
00358     send[1] = 0x04;
00359     send[2] = 0x01;
00360     send[3] = 0x00;
00361     send[4] = 0x00;
00362     send[5] = 0x00;
00363 
00364     if (!SENDFUNC(send, sizeof(send))) {
00365         return (ErrorNumber)SendRegisterTimeout;
00366     }
00367     return (ErrorNumber)NoError;
00368 }
00369 
00370 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendSnapshot(void)
00371 {
00372     char send[COMMAND_LENGTH];
00373     send[0] = 0xAA;
00374     send[1] = 0x05;
00375     send[2] = 0x00;
00376     send[3] = 0x00;
00377     send[4] = 0x00;
00378     send[5] = 0x00;
00379 
00380     if (!SENDFUNC(send, sizeof(send))) {
00381         return (ErrorNumber)SendRegisterTimeout;
00382     }
00383     return (ErrorNumber)NoError;
00384 }
00385 
00386 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendSetPackageSize(uint16_t packageSize)
00387 {
00388     char send[COMMAND_LENGTH];
00389     send[0] = 0xAA;
00390     send[1] = 0x06;
00391     send[2] = 0x08;
00392     send[3] = (packageSize >> 0) & 0xff;
00393     send[4] = (packageSize >> 8) & 0xff;
00394     send[5] = 0x00;
00395 
00396     if (!SENDFUNC(send, sizeof(send))) {
00397         return (ErrorNumber)SendRegisterTimeout;
00398     }
00399     return (ErrorNumber)NoError;
00400 }
00401 
00402 void HeptaCamera_GPS::setmbedBaud(Baud baud)
00403 {
00404     switch((int)baud) {
00405         case 0x02:
00406             serial._baud(460800);
00407             break;
00408         case 0x03:
00409             serial._baud(230400);
00410             break;
00411         case 0x04:
00412             serial._baud(115200);
00413             break;
00414         case 0x05:
00415             serial._baud(57600);
00416             break;
00417         case 0x06:
00418             serial._baud((int)28800);
00419             break;
00420         case 0x07:
00421             serial._baud(14400);
00422             break;
00423         default:
00424             serial._baud(14400);
00425     }
00426 }
00427 
00428 
00429 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendReset(ResetType specialReset)
00430 {
00431     char send[COMMAND_LENGTH];
00432     send[0] = 0xAA;
00433     send[1] = 0x08;
00434     send[2] = 0x00;
00435     send[3] = 0x00;
00436     send[4] = 0x00;
00437     send[5] = specialReset;
00438     /*
00439      * Special reset : If the parameter is 0xFF, the command is a special Reset command and the firmware responds to it immediately.
00440      */
00441 
00442     if (!SENDFUNC(send, sizeof(send))) {
00443         return (ErrorNumber)SendRegisterTimeout;
00444     }
00445 
00446     return (ErrorNumber)NoError;
00447 }
00448 
00449 
00450 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::recvData(uint32_t *length)
00451 {
00452     char recv[COMMAND_LENGTH];
00453     if (!RECVFUNC(recv, sizeof(recv))) {
00454         return (ErrorNumber)UnexpectedReply;
00455     }
00456     if ((0xAA != recv[0]) || (0x0A != recv[1])) {
00457         return (ErrorNumber)UnexpectedReply;
00458     }
00459     recv[2] = (char)0x01;
00460     *length = (recv[5] << 16) | (recv[4] << 8) | (recv[3] << 0);
00461     return (ErrorNumber)NoError;
00462 }
00463 
00464 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendSync()
00465 {
00466     char send[COMMAND_LENGTH];
00467     send[0] = 0xAA;
00468     send[1] = 0x0D;
00469     send[2] = 0x00;
00470     send[3] = 0x00;
00471     send[4] = 0x00;
00472     send[5] = 0x00;
00473 
00474 
00475     if (!SENDFUNC(send, sizeof(send))) {
00476         return (ErrorNumber)SendRegisterTimeout;
00477     }
00478     return (ErrorNumber)NoError;
00479 }
00480 
00481 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::recvSync()
00482 {
00483     char recv[COMMAND_LENGTH];
00484 
00485     if (!RECVFUNC(recv, sizeof(recv))) {
00486         return (ErrorNumber)UnexpectedReply;
00487     }
00488     if ((0xAA != recv[0]) || (0x0D != recv[1])) {
00489         return (ErrorNumber)UnexpectedReply;
00490     }
00491     return (ErrorNumber)NoError;
00492 }
00493 
00494 /**
00495  * Send ACK.
00496  *
00497  * @param commandId The command with that ID is acknowledged by this command.
00498  * @param packageId For acknowledging Data command, these two bytes represent the requested package ID. While for acknowledging other commands, these two bytes are set to 00h.
00499  */
00500 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendAck(uint8_t commandId, uint16_t packageId)
00501 {
00502     char send[COMMAND_LENGTH];
00503 
00504     send[0] = 0xAA;
00505     send[1] = 0x0E;
00506     send[2] = commandId;
00507     send[3] = 0x00;    // ACK counter is not used.
00508     send[4] = (packageId >> 0) & 0xff;
00509     send[5] = (packageId >> 8) & 0xff;
00510     if (!SENDFUNC(send, sizeof(send))) {
00511         return (ErrorNumber)SendRegisterTimeout;
00512     }
00513     return (ErrorNumber)NoError;
00514 }
00515 
00516 /**
00517  * Receive ACK or NCK.
00518  *
00519  * @return Error number.
00520  */
00521 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::recvAckOrNck()
00522 {
00523     char recv[COMMAND_LENGTH];
00524 
00525     if (!RECVFUNC(recv, sizeof(recv))) {
00526         return (ErrorNumber)UnexpectedReply;
00527     }
00528     if ((0xAA == recv[0]) && (0x0E == recv[1])) {
00529         return (ErrorNumber)NoError;
00530     }
00531     if ((0xAA == recv[0]) && (0x0F == recv[1]) && (0x00 == recv[2])) {
00532         return (ErrorNumber)NoError;
00533     }
00534     if ((0xAA == recv[0]) && (0x0F == recv[1])) {
00535         return (ErrorNumber)recv[4];
00536     }
00537     return (ErrorNumber)UnexpectedReply;
00538 }
00539 
00540 /**
00541  * Send bytes to camera module.
00542  *
00543  * @param buf Pointer to the data buffer.
00544  * @param len Length of the data buffer.
00545  *
00546  * @return True if the data sended.
00547  */
00548 bool HeptaCamera_GPS::sendBytes(char *buf, size_t len, int timeout_us)
00549 {
00550     for (uint32_t i = 0; i < (uint32_t)len; i++) {
00551         int cnt = 0;
00552         while (!serial.writeable()) {
00553             wait_us(1);
00554             cnt++;
00555             if (timeout_us < cnt) {
00556                 return false;
00557             }
00558         }
00559         serial.putc(buf[i]);
00560     }
00561     return true;
00562 }
00563 
00564 
00565 bool HeptaCamera_GPS::recvBytes(char *buf, size_t len, int timeout_us)
00566 {
00567     for (uint32_t i = 0; i < (uint32_t)len; i++) {
00568         int cnt = 0;
00569         while (!serial.readable()) {
00570             wait_us(1);
00571             cnt++;
00572             if (timeout_us < cnt) {
00573                 return false;
00574             }
00575         }
00576         buf[i] = serial.getc();
00577     }
00578     return true;
00579 }
00580 
00581 
00582 bool HeptaCamera_GPS::waitRecv()
00583 {
00584     while (!serial.readable()) {
00585     }
00586     return true;
00587 }
00588 
00589 bool HeptaCamera_GPS::waitIdle()
00590 {
00591     while (serial.readable()) {
00592         serial.getc();
00593     }
00594     return true;
00595 }
00596 
00597 void HeptaCamera_GPS::camera_setting(void)
00598 {
00599     GPS_SW = 0;
00600     CAM_SW = 1;
00601     serial.setTimeout(1);
00602     flushSerialBuffer();
00603 }
00604 
00605 void HeptaCamera_GPS::Sync(void)
00606 {
00607     camera_setting();
00608     HeptaCamera_GPS::ErrorNumber err = HeptaCamera_GPS::NoError;
00609     printf("synchro setting now\r\n");
00610     err = sync();
00611     int count = 0;
00612     int fflag = 0;
00613     while(err) {
00614         switch(count) {
00615             case 0:
00616                 printf("Connection of camera and mbed at baudrate 14400\r\n");
00617                 setmbedBaud(HeptaCamera_GPS::Baud14400);
00618                 count++;
00619                 break;
00620             case 1:
00621                 printf("Connection of camera and mbed at baudrate 115200\r\n");
00622                 setmbedBaud(HeptaCamera_GPS::Baud115200);
00623                 count++;
00624                 break;
00625             default:
00626                 count=0;
00627                 fflag = 1;
00628         }
00629         //count++;
00630         err = sync();
00631         printf("synchro setting now\r\n");
00632         if(!err) {
00633             printf("synchro setting finish\r\n");
00634         }
00635         if(fflag==1) {
00636             printf("Synchronization failed\r\n");
00637             fflag = 0;
00638             break;
00639         }
00640     }//while
00641 }
00642 
00643 void HeptaCamera_GPS::test_jpeg_snapshot_picture(const char *filename)
00644 {
00645     FILE*fp_jpeg;
00646     HeptaCamera_GPS::ErrorNumber err = HeptaCamera_GPS::NoError;
00647     fp_jpeg = fopen(filename, "w");
00648     if(fp_jpeg == NULL) {
00649         printf("Could not open file for write\r\n");
00650     } else {
00651         err = getJpegSnapshotPicture(fp_jpeg);
00652         if (HeptaCamera_GPS::NoError == err) {
00653             printf("[ OK ]:Picture taken\r\n");
00654         } else {
00655             printf("[FAIL]:Picture taken(Error=%02X)\r\n", (int)err);
00656         }
00657         fclose(fp_jpeg);
00658     }
00659 }
00660 
00661 void HeptaCamera_GPS::test_jpeg_snapshot_data(const char *filename)
00662 {
00663     FILE*fp_jpeg;
00664     HeptaCamera_GPS::ErrorNumber err = HeptaCamera_GPS::NoError;
00665     fp_jpeg = fopen(filename, "w");
00666     if(fp_jpeg == NULL) {
00667         printf("Could not open file for write\r\n");
00668     } else {
00669         err = getJpegSnapshotPicture_data(fp_jpeg);
00670 
00671         if (HeptaCamera_GPS::NoError == err) {
00672             printf("[ OK ]:Picture taken\r\n");
00673         } else {
00674             printf("[FAIL]:Picture taken(Error=%02X)\r\n", (int)err);
00675         }
00676         fclose(fp_jpeg);
00677     }
00678 }
00679 
00680 void HeptaCamera_GPS::initialize(Baud baud,JpegResolution jr)
00681 {
00682     HeptaCamera_GPS::ErrorNumber err = HeptaCamera_GPS::NoError;//ErrorNumber define
00683     err = init(baud, jr);//
00684     if (HeptaCamera_GPS::NoError == err) {
00685         printf("[ OK ]:Camera setting\r\n");
00686         setmbedBaud(baud);
00687     } else {
00688         printf("[FAIL]:Camera setting(Error=%02X)\r\n", (int)err);
00689     }
00690 
00691 }
00692 
00693 //*********************serial*********************//
00694 void HeptaCamera_GPS::gps_setting(void)
00695 {
00696     CAM_SW = 0;
00697     GPS_SW = 1;
00698     flushSerialBuffer();
00699     serial._baud(9600);
00700     serial.setTimeout(9999);
00701 }
00702 
00703 char HeptaCamera_GPS::getc()
00704 {
00705     c = serial.getc();
00706     return c;
00707 }
00708 int HeptaCamera_GPS::readable()
00709 {
00710     i = serial.readable();
00711     return i;
00712 }
00713 void HeptaCamera_GPS::flushSerialBuffer(void)
00714 {
00715     ite = 0;
00716     while (serial.readable()) {
00717         serial.getc();
00718         ite++;
00719         if(ite==100) {
00720             break;
00721         };
00722     }
00723     return;
00724 }
00725 void HeptaCamera_GPS::gga_sensing(float *time, float *latitude, char *ns, float *longitude, char *ew, int *quality, int *stnum, float *hacu, float *altitude, char *aunit, int *serial_check)
00726 {
00727     int ite = 0;
00728     while(serial.getc()!='$') {
00729         ite++;
00730         if(ite==10000) break;
00731     }
00732     for(int i=0; i<5; i++) {
00733         msg[i] = serial.getc();
00734     }
00735     if((msg[2]=='G')&(msg[3]=='G')&(msg[4]=='A')) {
00736         for(int j=0; j<6; j++) {
00737             if(j==0) {
00738                 for(int i=5; i<256; i++) {
00739                     msg[i] = serial.getc();
00740                     if(msg[i] == '\r') {
00741                         msg[i] = 0;
00742                         break;
00743                     }
00744                 }
00745             } else {
00746                 for(int i=0; i<256; i++) {
00747                     msgd[i] = serial.getc();
00748                     if(msgd[i] == '\r') {
00749                         break;
00750                     }
00751                 }
00752                 if((msgd[4]=='V')&(msgd[5]=='T')&(msgd[6]=='G')) {
00753                     break;
00754                 }
00755             }
00756         }
00757         if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d,%d,%f,%f,%c", time, latitude, ns, longitude, ew, quality, stnum, hacu, altitude, aunit) >= 1) {
00758             if(!(quality)) {
00759                 //latitude(unit transformation)
00760                 *latitude=int(*latitude/100)+(*latitude-int(*latitude/100)*100)/60;
00761                 //longitude(unit transformation)
00762                 *longitude = int(*longitude/100)+(*longitude-int(*longitude/100)*100)/60;
00763                 *serial_check = 0;
00764             } else {
00765                 //latitude(unit transformation)
00766                 *latitude=int(*latitude/100)+(*latitude-int(*latitude/100)*100)/60;
00767                 //longitude(unit transformation)
00768                 *longitude = int(*longitude/100)+(*longitude-int(*longitude/100)*100)/60;
00769                 *serial_check = 1;
00770             }
00771             if(!strcmp(ns,"S")){
00772                 *latitude = -*latitude;
00773             }
00774             if(!strcmp(ns,"W")){
00775                 *longitude = -*longitude;
00776             }
00777         } else {
00778             printf("No Data");
00779             *serial_check = 2;
00780         }
00781     } else {
00782         *serial_check = 3;
00783     }
00784 }
00785 
00786 void HeptaCamera_GPS::lat_log_sensing_u16(char *lat, char *log, char *height)
00787 {
00788     char gph1[8]= {0x00},gph2[8]= {0x00},gph3[8]= {0x00},gph4[8]= {0x00},gpt1[8]= {0x00},gpt2[8]= {0x00},gpt3[8]= {0x00},gpt4[8]= {0x00};
00789     char hei1[8]= {0x00},hei2[8]= {0x00};
00790     int i=0,j=0;
00791     while (serial.readable()) {
00792         serial.getc();
00793     }
00794 loop:
00795     while(serial.getc()!='$') {}
00796     for(j=0; j<5; j++) {
00797         gps_data[1][j]=serial.getc();
00798     }
00799     if((gps_data[1][2]==0x47)&(gps_data[1][3]==0x47)&(gps_data[1][4]==0x41)) {
00800         for(j=0; j<1; j++) {
00801             if(j==0) {
00802                 i=0;
00803                 while((gps_data[j+1][i+5] = serial.getc()) != '\r') {
00804                     //pc.putc(gps_data[j+1][i+5]);
00805                     i++;
00806                 }
00807                 gps_data[j+1][i+5]='\0';
00808                 i=0;
00809                 //pc.printf("\n\r");
00810             } else {
00811                 while(serial.getc()!='$') {}
00812                 i=0;
00813                 while((gps_data[j+1][i] = serial.getc()) != '\r') {
00814                     //pc.putc(gps_data[j+1][i]);
00815                     i++;
00816                 }
00817                 gps_data[j+1][i]='\0';
00818                 i=0;
00819                 //pc.printf("\n\r");
00820             }
00821         }
00822     } else {
00823         goto loop;
00824     }
00825     if( sscanf(gps_data[1],"GPGGA,%f,%f,%c,%f,%c,%d,%d,%f,%f,%c", &time, &hokui, &ns, &tokei, &ew, &_quality, &_stnum, &_hacu, &_altitude, &_aunit) >= 1) {
00826         //hokui
00827         d_hokui=int(hokui/100);
00828         m_hokui=(hokui-d_hokui*100);
00829         //m_hokui=(hokui-d_hokui*100)/60;
00830         g_hokui=d_hokui+(hokui-d_hokui*100)/60;
00831         //printf("%f\r\n",hokui);
00832         sprintf( gph1, "%02X", (char(d_hokui)) & 0xFF);
00833         sprintf( gph2, "%02X", (char(m_hokui)) & 0xFF);
00834         sprintf( gph3, "%02X", (char((m_hokui-char(m_hokui))*100)) & 0xFF);
00835         sprintf( gph4, "%02X", (char(((m_hokui-char(m_hokui))*100-char((m_hokui-char(m_hokui))*100))*100)) & 0xFF);
00836 
00837         //tokei
00838         d_tokei=int(tokei/100);
00839         m_tokei=(tokei-d_tokei*100);
00840         //m_tokei=(tokei-d_tokei*100)/60;
00841         g_tokei=d_tokei+(tokei-d_tokei*100)/60;
00842         //printf("%f\r\n",tokei);
00843         sprintf( gpt1, "%02X", (char(d_tokei)) & 0xFF);
00844         sprintf( gpt2, "%02X", (char(m_tokei)) & 0xFF);
00845         sprintf( gpt3, "%02X", (char((m_tokei-char(m_tokei))*100)) & 0xFF);
00846         sprintf( gpt4, "%02X", (char(((m_tokei-char(m_tokei))*100-char((m_tokei-char(m_tokei))*100))*100)) & 0xFF);
00847 
00848         m_height = int(_altitude);
00849         cm_height = int((_altitude-m_height)*100 );
00850         // printf("%f\r\n",_altitude);
00851         sprintf( hei1, "%02X", (char(m_height)) & 0xFF);
00852         sprintf( hei2, "%02X", (char(cm_height)) & 0xFF);
00853 
00854         lat[0] = gph1[0];
00855         lat[1] = gph1[1];
00856         lat[2] = gph2[0];
00857         lat[3] = gph2[1];
00858         lat[4] = gph3[0];
00859         lat[5] = gph3[1];
00860         lat[6] = gph4[0];
00861         lat[7] = gph4[1];
00862         log[0] = gpt1[0];
00863         log[1] = gpt1[1];
00864         log[2] = gpt2[0];
00865         log[3] = gpt2[1];
00866         log[4] = gpt3[0];
00867         log[5] = gpt3[1];
00868         log[6] = gpt4[0];
00869         log[7] = gpt4[1];
00870         height[0] = hei1[0];
00871         height[1] = hei1[1];
00872         height[2] = hei2[0];
00873         height[3] = hei2[1];
00874     }
00875     //*dsize1 = 8;
00876     //*dsize2 = 4;
00877 }