Ivan Stoev / HeptaCamera_GPS

Dependents:   3daf572bcae1 Team Team01_HEPTA_Trainig

Fork of HeptaCamera_GPS by HEPTA-Sat Training 2017~2018

Committer:
tuba
Date:
Thu Oct 26 11:27:12 2017 +0000
Revision:
17:a30fa71eddb7
Parent:
16:acef3a7f9597
Child:
18:da116273b461
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
umeume 8:6d9c33df4c09 1 #include "HeptaCamera_GPS.h"
umeume 8:6d9c33df4c09 2 static FILE *fp_jpeg;
umeume 8:6d9c33df4c09 3 #define WAITIDLE waitIdle
umeume 8:6d9c33df4c09 4 #define SENDFUNC sendBytes
umeume 8:6d9c33df4c09 5 #define RECVFUNC recvBytes
umeume 8:6d9c33df4c09 6 #define WAITFUNC waitRecv
umeume 8:6d9c33df4c09 7 int num=0;
umeume 8:6d9c33df4c09 8 /**
umeume 8:6d9c33df4c09 9 * Constructor.
umeume 8:6d9c33df4c09 10 *
umeume 8:6d9c33df4c09 11 * @param tx A pin for transmit.
umeume 8:6d9c33df4c09 12 * @param rx A pin for receive.
umeume 8:6d9c33df4c09 13 * @param baud Baud rate. (Default is Baud14400.)
umeume 8:6d9c33df4c09 14 */
umeume 8:6d9c33df4c09 15 HeptaCamera_GPS::HeptaCamera_GPS(PinName tx, PinName rx, PinName CAM, PinName GPS) : serial(tx, rx), CAM_SW(CAM), GPS_SW(GPS)
umeume 8:6d9c33df4c09 16 {
umeume 8:6d9c33df4c09 17 //serial.baud(baud);
umeume 8:6d9c33df4c09 18 }
umeume 8:6d9c33df4c09 19
umeume 8:6d9c33df4c09 20 /**
umeume 8:6d9c33df4c09 21 * Destructor.
umeume 8:6d9c33df4c09 22 */
umeume 8:6d9c33df4c09 23 HeptaCamera_GPS::~HeptaCamera_GPS()
umeume 8:6d9c33df4c09 24 {
umeume 8:6d9c33df4c09 25 }
umeume 8:6d9c33df4c09 26
umeume 8:6d9c33df4c09 27 /**
umeume 8:6d9c33df4c09 28 * Make a sync. for baud rate.
umeume 8:6d9c33df4c09 29 */
umeume 8:6d9c33df4c09 30 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sync()
umeume 8:6d9c33df4c09 31 {
umeume 8:6d9c33df4c09 32 for (int i = 0; i < SYNCMAX; i++) {
umeume 8:6d9c33df4c09 33 if (NoError == sendSync()) {
umeume 8:6d9c33df4c09 34 if (NoError == recvAckOrNck()) {
umeume 8:6d9c33df4c09 35 if (NoError == recvSync()) {
umeume 8:6d9c33df4c09 36 if (NoError == sendAck(0x0D, 0x00)) {
umeume 8:6d9c33df4c09 37 /*
umeume 8:6d9c33df4c09 38 * After synchronization, the camera needs a little time for AEC and AGC to be stable.
umeume 8:6d9c33df4c09 39 * Users should wait for 1-2 seconds before capturing the first picture.
umeume 8:6d9c33df4c09 40 */
umeume 8:6d9c33df4c09 41 wait(2.0);
umeume 8:6d9c33df4c09 42 return NoError;
umeume 8:6d9c33df4c09 43 }
umeume 8:6d9c33df4c09 44 }
umeume 8:6d9c33df4c09 45 }
umeume 8:6d9c33df4c09 46 }
umeume 8:6d9c33df4c09 47 wait_ms(50);
umeume 8:6d9c33df4c09 48 }
umeume 8:6d9c33df4c09 49 return UnexpectedReply;
umeume 8:6d9c33df4c09 50 }
umeume 8:6d9c33df4c09 51
umeume 8:6d9c33df4c09 52 /**
umeume 8:6d9c33df4c09 53 * Initialize.
umeume 8:6d9c33df4c09 54 *
umeume 8:6d9c33df4c09 55 * @param baud Camera Interface Speed.
umeume 8:6d9c33df4c09 56 * @param jr JPEG resolution.
umeume 8:6d9c33df4c09 57 */
umeume 8:6d9c33df4c09 58 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::init(Baud baud,JpegResolution jr)
umeume 8:6d9c33df4c09 59 {
umeume 8:6d9c33df4c09 60 int i ;
umeume 8:6d9c33df4c09 61 ErrorNumber en;
umeume 8:6d9c33df4c09 62 WAITIDLE();
umeume 8:6d9c33df4c09 63 setmbedBaud((Baud)(0x07)) ;
umeume 8:6d9c33df4c09 64
umeume 8:6d9c33df4c09 65 for ( i = 1 ; i < 7 ; i++ ) {
umeume 8:6d9c33df4c09 66 if ( NoError == sendSync() ) {
umeume 8:6d9c33df4c09 67 if ( NoError == recvAckOrNck() ) {
umeume 8:6d9c33df4c09 68 if ( NoError == recvSync() ) {
umeume 8:6d9c33df4c09 69 if ( NoError == sendAck(0x0D, 0x00) ) {
umeume 8:6d9c33df4c09 70 en = sendInitial(baud,jr);
umeume 8:6d9c33df4c09 71 if (NoError != en) {
umeume 8:6d9c33df4c09 72 return en;
umeume 8:6d9c33df4c09 73 }
umeume 8:6d9c33df4c09 74 en = recvAckOrNck();
umeume 8:6d9c33df4c09 75 if (NoError != en) {
umeume 8:6d9c33df4c09 76 return en;
umeume 8:6d9c33df4c09 77 }
umeume 8:6d9c33df4c09 78 wait_ms(50) ;
umeume 8:6d9c33df4c09 79 setmbedBaud(baud);
umeume 8:6d9c33df4c09 80 //wait_ms(50) ;
umeume 8:6d9c33df4c09 81 static bool alreadySetupPackageSize = false;
umeume 8:6d9c33df4c09 82 if (!alreadySetupPackageSize) {
umeume 8:6d9c33df4c09 83 en = sendSetPackageSize(packageSize);
umeume 8:6d9c33df4c09 84 if (NoError != en) {
umeume 8:6d9c33df4c09 85 return en;
umeume 8:6d9c33df4c09 86 }
umeume 8:6d9c33df4c09 87 WAITFUNC();
umeume 8:6d9c33df4c09 88 en = recvAckOrNck();
umeume 8:6d9c33df4c09 89 if (NoError != en) {
umeume 8:6d9c33df4c09 90 return en;
umeume 8:6d9c33df4c09 91 }
umeume 8:6d9c33df4c09 92 alreadySetupPackageSize = true;
umeume 8:6d9c33df4c09 93 }
umeume 8:6d9c33df4c09 94
umeume 8:6d9c33df4c09 95 wait(2.0);
umeume 8:6d9c33df4c09 96 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 97 /*
umeume 8:6d9c33df4c09 98 * After synchronization, the camera needs a little time for AEC and AGC to be stable.
umeume 8:6d9c33df4c09 99 * Users should wait for 1-2 seconds before capturing the first picture.
umeume 8:6d9c33df4c09 100 */
umeume 8:6d9c33df4c09 101 }
umeume 8:6d9c33df4c09 102 }
umeume 8:6d9c33df4c09 103 } else {
umeume 8:6d9c33df4c09 104 setmbedBaud((Baud)(i+1)) ;
umeume 8:6d9c33df4c09 105 }
umeume 8:6d9c33df4c09 106 }
umeume 8:6d9c33df4c09 107 wait_ms(50);
umeume 8:6d9c33df4c09 108 }
umeume 8:6d9c33df4c09 109 return UnexpectedReply;
umeume 8:6d9c33df4c09 110 }
umeume 8:6d9c33df4c09 111
umeume 8:6d9c33df4c09 112
umeume 8:6d9c33df4c09 113 /**
umeume 8:6d9c33df4c09 114 * Get JPEG snapshot picture.
umeume 8:6d9c33df4c09 115 *
umeume 8:6d9c33df4c09 116 * @param func A pointer to a callback function.
umeume 8:6d9c33df4c09 117 * You can block this function until saving the image datas.
umeume 8:6d9c33df4c09 118 * @return Status of the error.
umeume 8:6d9c33df4c09 119 */
umeume 8:6d9c33df4c09 120 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::getJpegSnapshotPicture()
umeume 8:6d9c33df4c09 121 {
umeume 8:6d9c33df4c09 122 WAITIDLE();
umeume 8:6d9c33df4c09 123 ErrorNumber en;
umeume 8:6d9c33df4c09 124
umeume 8:6d9c33df4c09 125
umeume 8:6d9c33df4c09 126 en = sendSnapshot();
umeume 8:6d9c33df4c09 127 if (NoError != en) {
umeume 8:6d9c33df4c09 128 return en;
umeume 8:6d9c33df4c09 129 }
umeume 8:6d9c33df4c09 130 WAITFUNC();
umeume 8:6d9c33df4c09 131 en = recvAckOrNck();
umeume 8:6d9c33df4c09 132 if (NoError != en) {
umeume 8:6d9c33df4c09 133 return en;
umeume 8:6d9c33df4c09 134 }
umeume 8:6d9c33df4c09 135
umeume 8:6d9c33df4c09 136 en = sendGetPicture();
umeume 8:6d9c33df4c09 137 if (NoError != en) {
umeume 8:6d9c33df4c09 138 return en;
umeume 8:6d9c33df4c09 139 }
umeume 8:6d9c33df4c09 140 WAITFUNC();
umeume 8:6d9c33df4c09 141 en = recvAckOrNck();
umeume 8:6d9c33df4c09 142 if (NoError != en) {
umeume 8:6d9c33df4c09 143 return en;
umeume 8:6d9c33df4c09 144 }
umeume 8:6d9c33df4c09 145
umeume 8:6d9c33df4c09 146 /*
umeume 8:6d9c33df4c09 147 * Data : snapshot picture
umeume 8:6d9c33df4c09 148 */
umeume 8:6d9c33df4c09 149 uint32_t length = 0;
umeume 8:6d9c33df4c09 150 WAITFUNC();
umeume 8:6d9c33df4c09 151 en = recvData(&length);
umeume 8:6d9c33df4c09 152 if (NoError != en) {
umeume 8:6d9c33df4c09 153 return en;
umeume 8:6d9c33df4c09 154 }
umeume 8:6d9c33df4c09 155 en = sendAck(0x00, 0);
umeume 8:6d9c33df4c09 156 if (NoError != en) {
umeume 8:6d9c33df4c09 157 return en;
umeume 8:6d9c33df4c09 158 }
umeume 8:6d9c33df4c09 159
umeume 8:6d9c33df4c09 160 char databuf[packageSize - 6];
umeume 8:6d9c33df4c09 161 uint16_t pkg_total = length / (packageSize - 6);
umeume 8:6d9c33df4c09 162 for (int i = 0; i <= (int)pkg_total; i++) {
umeume 8:6d9c33df4c09 163 uint16_t checksum = 0;
umeume 8:6d9c33df4c09 164 // ID.
umeume 8:6d9c33df4c09 165 char idbuf[2];
umeume 8:6d9c33df4c09 166 WAITFUNC();
umeume 8:6d9c33df4c09 167 if (!RECVFUNC(idbuf, sizeof(idbuf))) {
umeume 8:6d9c33df4c09 168 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 169 }
umeume 8:6d9c33df4c09 170 checksum += idbuf[0];
umeume 8:6d9c33df4c09 171 checksum += idbuf[1];
umeume 8:6d9c33df4c09 172 uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
umeume 8:6d9c33df4c09 173 if (id != i) {
umeume 8:6d9c33df4c09 174 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 175 }
umeume 8:6d9c33df4c09 176
umeume 8:6d9c33df4c09 177 // Size of the data.
umeume 8:6d9c33df4c09 178 char dsbuf[2];
umeume 8:6d9c33df4c09 179 WAITFUNC();
umeume 8:6d9c33df4c09 180 if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
umeume 8:6d9c33df4c09 181 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 182 }
umeume 8:6d9c33df4c09 183
umeume 8:6d9c33df4c09 184 // Received the data.
umeume 8:6d9c33df4c09 185 checksum += dsbuf[0];
umeume 8:6d9c33df4c09 186 checksum += dsbuf[1];
umeume 8:6d9c33df4c09 187 uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
umeume 8:6d9c33df4c09 188 WAITFUNC();
umeume 8:6d9c33df4c09 189 if (!RECVFUNC(&databuf[0], ds)) {
umeume 8:6d9c33df4c09 190 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 191 }
umeume 8:6d9c33df4c09 192 for (int j = 0; j < ds; j++) {
umeume 8:6d9c33df4c09 193 checksum += databuf[j];
umeume 8:6d9c33df4c09 194 }
umeume 8:6d9c33df4c09 195
umeume 8:6d9c33df4c09 196 // Verify code.
umeume 8:6d9c33df4c09 197 char vcbuf[2];
umeume 8:6d9c33df4c09 198 WAITFUNC();
umeume 8:6d9c33df4c09 199 if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
umeume 8:6d9c33df4c09 200 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 201 }
umeume 8:6d9c33df4c09 202 uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
umeume 8:6d9c33df4c09 203 if (vc != (checksum & 0xff)) {
umeume 8:6d9c33df4c09 204 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 205 }
umeume 8:6d9c33df4c09 206
umeume 8:6d9c33df4c09 207 /*
umeume 8:6d9c33df4c09 208 * Call a call back function.
umeume 8:6d9c33df4c09 209 * You can block this function while working.
umeume 8:6d9c33df4c09 210 */
umeume 8:6d9c33df4c09 211 size_t siz = ds;
umeume 8:6d9c33df4c09 212 for (int ii = 0; ii < (int)siz; ii++) {
umeume 8:6d9c33df4c09 213 fprintf(fp_jpeg, "%c", databuf[ii]);
umeume 8:6d9c33df4c09 214 }
umeume 8:6d9c33df4c09 215 /*
umeume 8:6d9c33df4c09 216 * We should wait for camera working before reply a ACK.
umeume 8:6d9c33df4c09 217 */
umeume 8:6d9c33df4c09 218 wait_ms(100);
umeume 8:6d9c33df4c09 219 en = sendAck(0x00, 1 + i);
umeume 8:6d9c33df4c09 220 if (NoError != en) {
umeume 8:6d9c33df4c09 221 return en;
umeume 8:6d9c33df4c09 222 }
umeume 8:6d9c33df4c09 223 }
umeume 8:6d9c33df4c09 224
umeume 8:6d9c33df4c09 225 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 226 }
umeume 8:6d9c33df4c09 227
tuba 17:a30fa71eddb7 228 /**
tuba 17:a30fa71eddb7 229 * Get JPEG snapshot picture into a file.
tuba 17:a30fa71eddb7 230 *
tuba 17:a30fa71eddb7 231 * @param func A pointer to a callback function.
tuba 17:a30fa71eddb7 232 * You can block this function until saving the image datas.
tuba 17:a30fa71eddb7 233 * @return Status of the error.
tuba 17:a30fa71eddb7 234 */
tuba 17:a30fa71eddb7 235 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::getJpegSnapshotPicture(FILE *fp)
tuba 17:a30fa71eddb7 236 {
tuba 17:a30fa71eddb7 237 WAITIDLE();
tuba 17:a30fa71eddb7 238 ErrorNumber en;
tuba 17:a30fa71eddb7 239
tuba 17:a30fa71eddb7 240
tuba 17:a30fa71eddb7 241 en = sendSnapshot();
tuba 17:a30fa71eddb7 242 if (NoError != en) {
tuba 17:a30fa71eddb7 243 return en;
tuba 17:a30fa71eddb7 244 }
tuba 17:a30fa71eddb7 245 WAITFUNC();
tuba 17:a30fa71eddb7 246 en = recvAckOrNck();
tuba 17:a30fa71eddb7 247 if (NoError != en) {
tuba 17:a30fa71eddb7 248 return en;
tuba 17:a30fa71eddb7 249 }
tuba 17:a30fa71eddb7 250
tuba 17:a30fa71eddb7 251 en = sendGetPicture();
tuba 17:a30fa71eddb7 252 if (NoError != en) {
tuba 17:a30fa71eddb7 253 return en;
tuba 17:a30fa71eddb7 254 }
tuba 17:a30fa71eddb7 255 WAITFUNC();
tuba 17:a30fa71eddb7 256 en = recvAckOrNck();
tuba 17:a30fa71eddb7 257 if (NoError != en) {
tuba 17:a30fa71eddb7 258 return en;
tuba 17:a30fa71eddb7 259 }
tuba 17:a30fa71eddb7 260
tuba 17:a30fa71eddb7 261 /*
tuba 17:a30fa71eddb7 262 * Data : snapshot picture
tuba 17:a30fa71eddb7 263 */
tuba 17:a30fa71eddb7 264 uint32_t length = 0;
tuba 17:a30fa71eddb7 265 WAITFUNC();
tuba 17:a30fa71eddb7 266 en = recvData(&length);
tuba 17:a30fa71eddb7 267 if (NoError != en) {
tuba 17:a30fa71eddb7 268 return en;
tuba 17:a30fa71eddb7 269 }
tuba 17:a30fa71eddb7 270 en = sendAck(0x00, 0);
tuba 17:a30fa71eddb7 271 if (NoError != en) {
tuba 17:a30fa71eddb7 272 return en;
tuba 17:a30fa71eddb7 273 }
tuba 17:a30fa71eddb7 274
tuba 17:a30fa71eddb7 275 char databuf[packageSize - 6];
tuba 17:a30fa71eddb7 276 uint16_t pkg_total = length / (packageSize - 6);
tuba 17:a30fa71eddb7 277 for (int i = 0; i <= (int)pkg_total; i++) {
tuba 17:a30fa71eddb7 278 uint16_t checksum = 0;
tuba 17:a30fa71eddb7 279 // ID.
tuba 17:a30fa71eddb7 280 char idbuf[2];
tuba 17:a30fa71eddb7 281 WAITFUNC();
tuba 17:a30fa71eddb7 282 if (!RECVFUNC(idbuf, sizeof(idbuf))) {
tuba 17:a30fa71eddb7 283 return (ErrorNumber)UnexpectedReply;
tuba 17:a30fa71eddb7 284 }
tuba 17:a30fa71eddb7 285 checksum += idbuf[0];
tuba 17:a30fa71eddb7 286 checksum += idbuf[1];
tuba 17:a30fa71eddb7 287 uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
tuba 17:a30fa71eddb7 288 if (id != i) {
tuba 17:a30fa71eddb7 289 return (ErrorNumber)UnexpectedReply;
tuba 17:a30fa71eddb7 290 }
tuba 17:a30fa71eddb7 291
tuba 17:a30fa71eddb7 292 // Size of the data.
tuba 17:a30fa71eddb7 293 char dsbuf[2];
tuba 17:a30fa71eddb7 294 WAITFUNC();
tuba 17:a30fa71eddb7 295 if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
tuba 17:a30fa71eddb7 296 return (ErrorNumber)UnexpectedReply;
tuba 17:a30fa71eddb7 297 }
tuba 17:a30fa71eddb7 298
tuba 17:a30fa71eddb7 299 // Received the data.
tuba 17:a30fa71eddb7 300 checksum += dsbuf[0];
tuba 17:a30fa71eddb7 301 checksum += dsbuf[1];
tuba 17:a30fa71eddb7 302 uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
tuba 17:a30fa71eddb7 303 WAITFUNC();
tuba 17:a30fa71eddb7 304 if (!RECVFUNC(&databuf[0], ds)) {
tuba 17:a30fa71eddb7 305 return (ErrorNumber)UnexpectedReply;
tuba 17:a30fa71eddb7 306 }
tuba 17:a30fa71eddb7 307 for (int j = 0; j < ds; j++) {
tuba 17:a30fa71eddb7 308 checksum += databuf[j];
tuba 17:a30fa71eddb7 309 }
tuba 17:a30fa71eddb7 310
tuba 17:a30fa71eddb7 311 // Verify code.
tuba 17:a30fa71eddb7 312 char vcbuf[2];
tuba 17:a30fa71eddb7 313 WAITFUNC();
tuba 17:a30fa71eddb7 314 if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
tuba 17:a30fa71eddb7 315 return (ErrorNumber)UnexpectedReply;
tuba 17:a30fa71eddb7 316 }
tuba 17:a30fa71eddb7 317 uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
tuba 17:a30fa71eddb7 318 if (vc != (checksum & 0xff)) {
tuba 17:a30fa71eddb7 319 return (ErrorNumber)UnexpectedReply;
tuba 17:a30fa71eddb7 320 }
tuba 17:a30fa71eddb7 321
tuba 17:a30fa71eddb7 322 /*
tuba 17:a30fa71eddb7 323 * Call a call back function.
tuba 17:a30fa71eddb7 324 * You can block this function while working.
tuba 17:a30fa71eddb7 325 */
tuba 17:a30fa71eddb7 326 size_t siz = ds;
tuba 17:a30fa71eddb7 327 for (int ii = 0; ii < (int)siz; ii++) {
tuba 17:a30fa71eddb7 328 fprintf(fp, "%c", databuf[ii]);
tuba 17:a30fa71eddb7 329 }
tuba 17:a30fa71eddb7 330 /*
tuba 17:a30fa71eddb7 331 * We should wait for camera working before reply a ACK.
tuba 17:a30fa71eddb7 332 */
tuba 17:a30fa71eddb7 333 wait_ms(100);
tuba 17:a30fa71eddb7 334 en = sendAck(0x00, 1 + i);
tuba 17:a30fa71eddb7 335 if (NoError != en) {
tuba 17:a30fa71eddb7 336 return en;
tuba 17:a30fa71eddb7 337 }
tuba 17:a30fa71eddb7 338 }
tuba 17:a30fa71eddb7 339
tuba 17:a30fa71eddb7 340 return (ErrorNumber)NoError;
tuba 17:a30fa71eddb7 341 }
tuba 17:a30fa71eddb7 342
umeume 8:6d9c33df4c09 343 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::getJpegSnapshotPicture_data()
umeume 8:6d9c33df4c09 344 {
umeume 8:6d9c33df4c09 345 WAITIDLE();
umeume 8:6d9c33df4c09 346 ErrorNumber en;
umeume 8:6d9c33df4c09 347
umeume 8:6d9c33df4c09 348
umeume 8:6d9c33df4c09 349 en = sendSnapshot();
umeume 8:6d9c33df4c09 350 if (NoError != en) {
umeume 8:6d9c33df4c09 351 return en;
umeume 8:6d9c33df4c09 352 }
umeume 8:6d9c33df4c09 353 WAITFUNC();
umeume 8:6d9c33df4c09 354 en = recvAckOrNck();
umeume 8:6d9c33df4c09 355 if (NoError != en) {
umeume 8:6d9c33df4c09 356 return en;
umeume 8:6d9c33df4c09 357 }
umeume 8:6d9c33df4c09 358
umeume 8:6d9c33df4c09 359 en = sendGetPicture();
umeume 8:6d9c33df4c09 360 if (NoError != en) {
umeume 8:6d9c33df4c09 361 return en;
umeume 8:6d9c33df4c09 362 }
umeume 8:6d9c33df4c09 363 WAITFUNC();
umeume 8:6d9c33df4c09 364 en = recvAckOrNck();
umeume 8:6d9c33df4c09 365 if (NoError != en) {
umeume 8:6d9c33df4c09 366 return en;
umeume 8:6d9c33df4c09 367 }
umeume 8:6d9c33df4c09 368
umeume 8:6d9c33df4c09 369 /*
umeume 8:6d9c33df4c09 370 * Data : snapshot picture
umeume 8:6d9c33df4c09 371 */
umeume 8:6d9c33df4c09 372 uint32_t length = 0;
umeume 8:6d9c33df4c09 373 WAITFUNC();
umeume 8:6d9c33df4c09 374 en = recvData(&length);
umeume 8:6d9c33df4c09 375 if (NoError != en) {
umeume 8:6d9c33df4c09 376 return en;
umeume 8:6d9c33df4c09 377 }
umeume 8:6d9c33df4c09 378 en = sendAck(0x00, 0);
umeume 8:6d9c33df4c09 379 if (NoError != en) {
umeume 8:6d9c33df4c09 380 return en;
umeume 8:6d9c33df4c09 381 }
umeume 8:6d9c33df4c09 382
umeume 8:6d9c33df4c09 383 char databuf[packageSize - 6];
umeume 8:6d9c33df4c09 384 uint16_t pkg_total = length / (packageSize - 6);
umeume 8:6d9c33df4c09 385 for (int i = 0; i <= (int)pkg_total; i++) {
umeume 8:6d9c33df4c09 386 uint16_t checksum = 0;
umeume 8:6d9c33df4c09 387 // ID.
umeume 8:6d9c33df4c09 388 char idbuf[2];
umeume 8:6d9c33df4c09 389 WAITFUNC();
umeume 8:6d9c33df4c09 390 if (!RECVFUNC(idbuf, sizeof(idbuf))) {
umeume 8:6d9c33df4c09 391 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 392 }
umeume 8:6d9c33df4c09 393 checksum += idbuf[0];
umeume 8:6d9c33df4c09 394 checksum += idbuf[1];
umeume 8:6d9c33df4c09 395 uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
umeume 8:6d9c33df4c09 396 if (id != i) {
umeume 8:6d9c33df4c09 397 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 398 }
umeume 8:6d9c33df4c09 399
umeume 8:6d9c33df4c09 400 // Size of the data.
umeume 8:6d9c33df4c09 401 char dsbuf[2];
umeume 8:6d9c33df4c09 402 WAITFUNC();
umeume 8:6d9c33df4c09 403 if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
umeume 8:6d9c33df4c09 404 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 405 }
umeume 8:6d9c33df4c09 406
umeume 8:6d9c33df4c09 407 // Received the data.
umeume 8:6d9c33df4c09 408 checksum += dsbuf[0];
umeume 8:6d9c33df4c09 409 checksum += dsbuf[1];
umeume 8:6d9c33df4c09 410 uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
umeume 8:6d9c33df4c09 411 WAITFUNC();
umeume 8:6d9c33df4c09 412 if (!RECVFUNC(&databuf[0], ds)) {
umeume 8:6d9c33df4c09 413 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 414 }
umeume 8:6d9c33df4c09 415 for (int j = 0; j < ds; j++) {
umeume 8:6d9c33df4c09 416 checksum += databuf[j];
umeume 8:6d9c33df4c09 417 }
umeume 8:6d9c33df4c09 418
umeume 8:6d9c33df4c09 419 // Verify code.
umeume 8:6d9c33df4c09 420 char vcbuf[2];
umeume 8:6d9c33df4c09 421 WAITFUNC();
umeume 8:6d9c33df4c09 422 if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
umeume 8:6d9c33df4c09 423 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 424 }
umeume 8:6d9c33df4c09 425 uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
umeume 8:6d9c33df4c09 426 if (vc != (checksum & 0xff)) {
umeume 8:6d9c33df4c09 427 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 428 }
umeume 8:6d9c33df4c09 429
umeume 8:6d9c33df4c09 430 /*
umeume 8:6d9c33df4c09 431 * Call a call back function.
umeume 8:6d9c33df4c09 432 * You can block this function while working.
umeume 8:6d9c33df4c09 433 */
umeume 8:6d9c33df4c09 434 size_t siz = ds;
umeume 8:6d9c33df4c09 435 for (int ii = 0; ii < (int)siz; ii++) {
umeume 8:6d9c33df4c09 436 fprintf(fp_jpeg, "%02X ", databuf[ii]);
umeume 8:6d9c33df4c09 437 if(++num%16==0) fprintf(fp_jpeg,"\r\n");
umeume 8:6d9c33df4c09 438 }
umeume 8:6d9c33df4c09 439 /*
umeume 8:6d9c33df4c09 440 * We should wait for camera working before reply a ACK.
umeume 8:6d9c33df4c09 441 */
umeume 8:6d9c33df4c09 442 wait_ms(100);
umeume 8:6d9c33df4c09 443 en = sendAck(0x00, 1 + i);
umeume 8:6d9c33df4c09 444 if (NoError != en) {
umeume 8:6d9c33df4c09 445 return en;
umeume 8:6d9c33df4c09 446 }
umeume 8:6d9c33df4c09 447 }
umeume 8:6d9c33df4c09 448
umeume 8:6d9c33df4c09 449 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 450 }
umeume 8:6d9c33df4c09 451
tuba 17:a30fa71eddb7 452
tuba 17:a30fa71eddb7 453
umeume 8:6d9c33df4c09 454 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendInitial(Baud baud, JpegResolution jr)
umeume 8:6d9c33df4c09 455 {
umeume 8:6d9c33df4c09 456 char send[COMMAND_LENGTH];
umeume 8:6d9c33df4c09 457
umeume 8:6d9c33df4c09 458 send[0] = 0xAA;
umeume 8:6d9c33df4c09 459 send[1] = 0x01;
umeume 8:6d9c33df4c09 460 send[2] = (char)baud;
umeume 8:6d9c33df4c09 461 send[3] = 0x07;
umeume 8:6d9c33df4c09 462 send[4] = 0x00;
umeume 8:6d9c33df4c09 463 send[5] = (char)jr;
umeume 8:6d9c33df4c09 464
umeume 8:6d9c33df4c09 465 if (!SENDFUNC(send, sizeof(send))) {
umeume 8:6d9c33df4c09 466 return (ErrorNumber)SendRegisterTimeout;
umeume 8:6d9c33df4c09 467 }
umeume 8:6d9c33df4c09 468
umeume 8:6d9c33df4c09 469 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 470 }
umeume 8:6d9c33df4c09 471
umeume 8:6d9c33df4c09 472 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendGetPicture(void)
umeume 8:6d9c33df4c09 473 {
umeume 8:6d9c33df4c09 474 char send[COMMAND_LENGTH];
umeume 8:6d9c33df4c09 475
umeume 8:6d9c33df4c09 476 send[0] = 0xAA;
umeume 8:6d9c33df4c09 477 send[1] = 0x04;
umeume 8:6d9c33df4c09 478 send[2] = 0x01;
umeume 8:6d9c33df4c09 479 send[3] = 0x00;
umeume 8:6d9c33df4c09 480 send[4] = 0x00;
umeume 8:6d9c33df4c09 481 send[5] = 0x00;
umeume 8:6d9c33df4c09 482
umeume 8:6d9c33df4c09 483 if (!SENDFUNC(send, sizeof(send))) {
umeume 8:6d9c33df4c09 484 return (ErrorNumber)SendRegisterTimeout;
umeume 8:6d9c33df4c09 485 }
umeume 8:6d9c33df4c09 486 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 487 }
umeume 8:6d9c33df4c09 488
umeume 8:6d9c33df4c09 489 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendSnapshot(void)
umeume 8:6d9c33df4c09 490 {
umeume 8:6d9c33df4c09 491 char send[COMMAND_LENGTH];
umeume 8:6d9c33df4c09 492 send[0] = 0xAA;
umeume 8:6d9c33df4c09 493 send[1] = 0x05;
umeume 8:6d9c33df4c09 494 send[2] = 0x00;
umeume 8:6d9c33df4c09 495 send[3] = 0x00;
umeume 8:6d9c33df4c09 496 send[4] = 0x00;
umeume 8:6d9c33df4c09 497 send[5] = 0x00;
umeume 8:6d9c33df4c09 498
umeume 8:6d9c33df4c09 499 if (!SENDFUNC(send, sizeof(send))) {
umeume 8:6d9c33df4c09 500 return (ErrorNumber)SendRegisterTimeout;
umeume 8:6d9c33df4c09 501 }
umeume 8:6d9c33df4c09 502 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 503 }
umeume 8:6d9c33df4c09 504
umeume 8:6d9c33df4c09 505 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendSetPackageSize(uint16_t packageSize)
umeume 8:6d9c33df4c09 506 {
umeume 8:6d9c33df4c09 507 char send[COMMAND_LENGTH];
umeume 8:6d9c33df4c09 508 send[0] = 0xAA;
umeume 8:6d9c33df4c09 509 send[1] = 0x06;
umeume 8:6d9c33df4c09 510 send[2] = 0x08;
umeume 8:6d9c33df4c09 511 send[3] = (packageSize >> 0) & 0xff;
umeume 8:6d9c33df4c09 512 send[4] = (packageSize >> 8) & 0xff;
umeume 8:6d9c33df4c09 513 send[5] = 0x00;
umeume 8:6d9c33df4c09 514
umeume 8:6d9c33df4c09 515 if (!SENDFUNC(send, sizeof(send))) {
umeume 8:6d9c33df4c09 516 return (ErrorNumber)SendRegisterTimeout;
umeume 8:6d9c33df4c09 517 }
umeume 8:6d9c33df4c09 518 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 519 }
umeume 8:6d9c33df4c09 520
umeume 8:6d9c33df4c09 521 void HeptaCamera_GPS::setmbedBaud(Baud baud)
umeume 8:6d9c33df4c09 522 {
umeume 8:6d9c33df4c09 523 switch((int)baud) {
umeume 8:6d9c33df4c09 524 case 0x02:
umeume 8:6d9c33df4c09 525 serial._baud(460800);
umeume 8:6d9c33df4c09 526 break;
umeume 8:6d9c33df4c09 527 case 0x03:
umeume 8:6d9c33df4c09 528 serial._baud(230400);
umeume 8:6d9c33df4c09 529 break;
umeume 8:6d9c33df4c09 530 case 0x04:
umeume 8:6d9c33df4c09 531 serial._baud(115200);
umeume 8:6d9c33df4c09 532 break;
umeume 8:6d9c33df4c09 533 case 0x05:
umeume 8:6d9c33df4c09 534 serial._baud(57600);
umeume 8:6d9c33df4c09 535 break;
umeume 8:6d9c33df4c09 536 case 0x06:
umeume 8:6d9c33df4c09 537 serial._baud((int)28800);
umeume 8:6d9c33df4c09 538 break;
umeume 8:6d9c33df4c09 539 case 0x07:
umeume 8:6d9c33df4c09 540 serial._baud(14400);
umeume 8:6d9c33df4c09 541 break;
umeume 8:6d9c33df4c09 542 default:
umeume 8:6d9c33df4c09 543 serial._baud(14400);
umeume 8:6d9c33df4c09 544 }
umeume 8:6d9c33df4c09 545 }
umeume 8:6d9c33df4c09 546
umeume 8:6d9c33df4c09 547
umeume 8:6d9c33df4c09 548 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendReset(ResetType specialReset)
umeume 8:6d9c33df4c09 549 {
umeume 8:6d9c33df4c09 550 char send[COMMAND_LENGTH];
umeume 8:6d9c33df4c09 551 send[0] = 0xAA;
umeume 8:6d9c33df4c09 552 send[1] = 0x08;
umeume 8:6d9c33df4c09 553 send[2] = 0x00;
umeume 8:6d9c33df4c09 554 send[3] = 0x00;
umeume 8:6d9c33df4c09 555 send[4] = 0x00;
umeume 8:6d9c33df4c09 556 send[5] = specialReset;
umeume 8:6d9c33df4c09 557 /*
umeume 8:6d9c33df4c09 558 * Special reset : If the parameter is 0xFF, the command is a special Reset command and the firmware responds to it immediately.
umeume 8:6d9c33df4c09 559 */
umeume 8:6d9c33df4c09 560
umeume 8:6d9c33df4c09 561 if (!SENDFUNC(send, sizeof(send))) {
umeume 8:6d9c33df4c09 562 return (ErrorNumber)SendRegisterTimeout;
umeume 8:6d9c33df4c09 563 }
umeume 8:6d9c33df4c09 564
umeume 8:6d9c33df4c09 565 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 566 }
umeume 8:6d9c33df4c09 567
umeume 8:6d9c33df4c09 568
umeume 8:6d9c33df4c09 569 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::recvData(uint32_t *length)
umeume 8:6d9c33df4c09 570 {
umeume 8:6d9c33df4c09 571 char recv[COMMAND_LENGTH];
umeume 8:6d9c33df4c09 572 if (!RECVFUNC(recv, sizeof(recv))) {
umeume 8:6d9c33df4c09 573 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 574 }
umeume 8:6d9c33df4c09 575 if ((0xAA != recv[0]) || (0x0A != recv[1])) {
umeume 8:6d9c33df4c09 576 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 577 }
umeume 8:6d9c33df4c09 578 recv[2] = (char)0x01;
umeume 8:6d9c33df4c09 579 *length = (recv[5] << 16) | (recv[4] << 8) | (recv[3] << 0);
umeume 8:6d9c33df4c09 580 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 581 }
umeume 8:6d9c33df4c09 582
umeume 8:6d9c33df4c09 583 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendSync()
umeume 8:6d9c33df4c09 584 {
umeume 8:6d9c33df4c09 585 char send[COMMAND_LENGTH];
umeume 8:6d9c33df4c09 586 send[0] = 0xAA;
umeume 8:6d9c33df4c09 587 send[1] = 0x0D;
umeume 8:6d9c33df4c09 588 send[2] = 0x00;
umeume 8:6d9c33df4c09 589 send[3] = 0x00;
umeume 8:6d9c33df4c09 590 send[4] = 0x00;
umeume 8:6d9c33df4c09 591 send[5] = 0x00;
umeume 8:6d9c33df4c09 592
umeume 8:6d9c33df4c09 593
umeume 8:6d9c33df4c09 594 if (!SENDFUNC(send, sizeof(send))) {
umeume 8:6d9c33df4c09 595 return (ErrorNumber)SendRegisterTimeout;
umeume 8:6d9c33df4c09 596 }
umeume 8:6d9c33df4c09 597 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 598 }
umeume 8:6d9c33df4c09 599
umeume 8:6d9c33df4c09 600 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::recvSync()
umeume 8:6d9c33df4c09 601 {
umeume 8:6d9c33df4c09 602 char recv[COMMAND_LENGTH];
umeume 8:6d9c33df4c09 603
umeume 8:6d9c33df4c09 604 if (!RECVFUNC(recv, sizeof(recv))) {
umeume 8:6d9c33df4c09 605 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 606 }
umeume 8:6d9c33df4c09 607 if ((0xAA != recv[0]) || (0x0D != recv[1])) {
umeume 8:6d9c33df4c09 608 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 609 }
umeume 8:6d9c33df4c09 610 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 611 }
umeume 8:6d9c33df4c09 612
umeume 8:6d9c33df4c09 613 /**
umeume 8:6d9c33df4c09 614 * Send ACK.
umeume 8:6d9c33df4c09 615 *
umeume 8:6d9c33df4c09 616 * @param commandId The command with that ID is acknowledged by this command.
umeume 8:6d9c33df4c09 617 * @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.
umeume 8:6d9c33df4c09 618 */
umeume 8:6d9c33df4c09 619 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::sendAck(uint8_t commandId, uint16_t packageId)
umeume 8:6d9c33df4c09 620 {
umeume 8:6d9c33df4c09 621 char send[COMMAND_LENGTH];
umeume 8:6d9c33df4c09 622
umeume 8:6d9c33df4c09 623 send[0] = 0xAA;
umeume 8:6d9c33df4c09 624 send[1] = 0x0E;
umeume 8:6d9c33df4c09 625 send[2] = commandId;
umeume 8:6d9c33df4c09 626 send[3] = 0x00; // ACK counter is not used.
umeume 8:6d9c33df4c09 627 send[4] = (packageId >> 0) & 0xff;
umeume 8:6d9c33df4c09 628 send[5] = (packageId >> 8) & 0xff;
umeume 8:6d9c33df4c09 629 if (!SENDFUNC(send, sizeof(send))) {
umeume 8:6d9c33df4c09 630 return (ErrorNumber)SendRegisterTimeout;
umeume 8:6d9c33df4c09 631 }
umeume 8:6d9c33df4c09 632 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 633 }
umeume 8:6d9c33df4c09 634
umeume 8:6d9c33df4c09 635 /**
umeume 8:6d9c33df4c09 636 * Receive ACK or NCK.
umeume 8:6d9c33df4c09 637 *
umeume 8:6d9c33df4c09 638 * @return Error number.
umeume 8:6d9c33df4c09 639 */
umeume 8:6d9c33df4c09 640 HeptaCamera_GPS::ErrorNumber HeptaCamera_GPS::recvAckOrNck()
umeume 8:6d9c33df4c09 641 {
umeume 8:6d9c33df4c09 642 char recv[COMMAND_LENGTH];
umeume 8:6d9c33df4c09 643
umeume 8:6d9c33df4c09 644 if (!RECVFUNC(recv, sizeof(recv))) {
umeume 8:6d9c33df4c09 645 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 646 }
umeume 8:6d9c33df4c09 647 if ((0xAA == recv[0]) && (0x0E == recv[1])) {
umeume 8:6d9c33df4c09 648 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 649 }
umeume 8:6d9c33df4c09 650 if ((0xAA == recv[0]) && (0x0F == recv[1]) && (0x00 == recv[2])) {
umeume 8:6d9c33df4c09 651 return (ErrorNumber)NoError;
umeume 8:6d9c33df4c09 652 }
umeume 8:6d9c33df4c09 653 if ((0xAA == recv[0]) && (0x0F == recv[1])) {
umeume 8:6d9c33df4c09 654 return (ErrorNumber)recv[4];
umeume 8:6d9c33df4c09 655 }
umeume 8:6d9c33df4c09 656 return (ErrorNumber)UnexpectedReply;
umeume 8:6d9c33df4c09 657 }
umeume 8:6d9c33df4c09 658
umeume 8:6d9c33df4c09 659 /**
umeume 8:6d9c33df4c09 660 * Send bytes to camera module.
umeume 8:6d9c33df4c09 661 *
umeume 8:6d9c33df4c09 662 * @param buf Pointer to the data buffer.
umeume 8:6d9c33df4c09 663 * @param len Length of the data buffer.
umeume 8:6d9c33df4c09 664 *
umeume 8:6d9c33df4c09 665 * @return True if the data sended.
umeume 8:6d9c33df4c09 666 */
umeume 8:6d9c33df4c09 667 bool HeptaCamera_GPS::sendBytes(char *buf, size_t len, int timeout_us)
umeume 8:6d9c33df4c09 668 {
umeume 8:6d9c33df4c09 669 for (uint32_t i = 0; i < (uint32_t)len; i++) {
umeume 8:6d9c33df4c09 670 int cnt = 0;
umeume 8:6d9c33df4c09 671 while (!serial.writeable()) {
umeume 8:6d9c33df4c09 672 wait_us(1);
umeume 8:6d9c33df4c09 673 cnt++;
umeume 8:6d9c33df4c09 674 if (timeout_us < cnt) {
umeume 8:6d9c33df4c09 675 return false;
umeume 8:6d9c33df4c09 676 }
umeume 8:6d9c33df4c09 677 }
umeume 8:6d9c33df4c09 678 serial.putc(buf[i]);
umeume 8:6d9c33df4c09 679 }
umeume 8:6d9c33df4c09 680 return true;
umeume 8:6d9c33df4c09 681 }
umeume 8:6d9c33df4c09 682
umeume 8:6d9c33df4c09 683
umeume 8:6d9c33df4c09 684 bool HeptaCamera_GPS::recvBytes(char *buf, size_t len, int timeout_us)
umeume 8:6d9c33df4c09 685 {
umeume 8:6d9c33df4c09 686 for (uint32_t i = 0; i < (uint32_t)len; i++) {
umeume 8:6d9c33df4c09 687 int cnt = 0;
umeume 8:6d9c33df4c09 688 while (!serial.readable()) {
umeume 8:6d9c33df4c09 689 wait_us(1);
umeume 8:6d9c33df4c09 690 cnt++;
umeume 8:6d9c33df4c09 691 if (timeout_us < cnt) {
umeume 8:6d9c33df4c09 692 return false;
umeume 8:6d9c33df4c09 693 }
umeume 8:6d9c33df4c09 694 }
umeume 8:6d9c33df4c09 695 buf[i] = serial.getc();
umeume 8:6d9c33df4c09 696 }
umeume 8:6d9c33df4c09 697 return true;
umeume 8:6d9c33df4c09 698 }
umeume 8:6d9c33df4c09 699
umeume 8:6d9c33df4c09 700
umeume 8:6d9c33df4c09 701 bool HeptaCamera_GPS::waitRecv()
umeume 8:6d9c33df4c09 702 {
umeume 8:6d9c33df4c09 703 while (!serial.readable()) {
umeume 8:6d9c33df4c09 704 }
umeume 8:6d9c33df4c09 705 return true;
umeume 8:6d9c33df4c09 706 }
umeume 8:6d9c33df4c09 707
umeume 8:6d9c33df4c09 708 bool HeptaCamera_GPS::waitIdle()
umeume 8:6d9c33df4c09 709 {
umeume 8:6d9c33df4c09 710 while (serial.readable()) {
umeume 8:6d9c33df4c09 711 serial.getc();
umeume 8:6d9c33df4c09 712 }
umeume 8:6d9c33df4c09 713 return true;
umeume 8:6d9c33df4c09 714 }
umeume 8:6d9c33df4c09 715
umeume 8:6d9c33df4c09 716 void HeptaCamera_GPS::camera_setting(void)
umeume 8:6d9c33df4c09 717 {
umeume 8:6d9c33df4c09 718 GPS_SW = 0;
umeume 8:6d9c33df4c09 719 CAM_SW = 1;
umeume 8:6d9c33df4c09 720 serial.setTimeout(1);
umeume 8:6d9c33df4c09 721 flushSerialBuffer();
umeume 8:6d9c33df4c09 722 }
umeume 8:6d9c33df4c09 723
umeume 8:6d9c33df4c09 724 void HeptaCamera_GPS::Sync(void)
umeume 8:6d9c33df4c09 725 {
umeume 8:6d9c33df4c09 726 camera_setting();
umeume 8:6d9c33df4c09 727 HeptaCamera_GPS::ErrorNumber err = HeptaCamera_GPS::NoError;
umeume 8:6d9c33df4c09 728 printf("synchro setting now\r\n");
umeume 8:6d9c33df4c09 729 err = sync();
HEPTA 16:acef3a7f9597 730 int count = 0;
umeume 8:6d9c33df4c09 731 while(err) {
umeume 8:6d9c33df4c09 732 switch(count) {
umeume 8:6d9c33df4c09 733 case 0:
umeume 8:6d9c33df4c09 734 printf("Connection of camera and mbed at baudrate 14400\r\n");
umeume 8:6d9c33df4c09 735 setmbedBaud(HeptaCamera_GPS::Baud14400);
HEPTA 16:acef3a7f9597 736 count++;
umeume 8:6d9c33df4c09 737 break;
umeume 8:6d9c33df4c09 738 case 1:
umeume 8:6d9c33df4c09 739 printf("Connection of camera and mbed at baudrate 115200\r\n");
umeume 8:6d9c33df4c09 740 setmbedBaud(HeptaCamera_GPS::Baud115200);
HEPTA 16:acef3a7f9597 741 count++;
umeume 8:6d9c33df4c09 742 break;
umeume 8:6d9c33df4c09 743 default:
umeume 8:6d9c33df4c09 744 count=0;
umeume 8:6d9c33df4c09 745 }
HEPTA 16:acef3a7f9597 746 //count++;
umeume 8:6d9c33df4c09 747 err = sync();
umeume 8:6d9c33df4c09 748 printf("synchro setting now\r\n");
umeume 8:6d9c33df4c09 749 if(!err) {
umeume 8:6d9c33df4c09 750 printf("synchro setting finish\r\n");
umeume 8:6d9c33df4c09 751 }
umeume 8:6d9c33df4c09 752 }
umeume 8:6d9c33df4c09 753 }
umeume 8:6d9c33df4c09 754
umeume 8:6d9c33df4c09 755 void HeptaCamera_GPS::test_jpeg_snapshot_picture(int CAPTURE_FRAMES)
umeume 8:6d9c33df4c09 756 {
umeume 8:6d9c33df4c09 757 HeptaCamera_GPS::ErrorNumber err = HeptaCamera_GPS::NoError;
umeume 8:6d9c33df4c09 758 for (int i = 0; i < CAPTURE_FRAMES; i++) {
umeume 8:6d9c33df4c09 759 char fname[64];
HEPTA 14:d6974c59be00 760 snprintf(fname, sizeof(fname), "/sd/test%d.jpg",i);
umeume 8:6d9c33df4c09 761 fp_jpeg = fopen(fname, "w");
umeume 8:6d9c33df4c09 762
umeume 8:6d9c33df4c09 763 err = getJpegSnapshotPicture();
umeume 8:6d9c33df4c09 764
umeume 8:6d9c33df4c09 765 if (HeptaCamera_GPS::NoError == err) {
umeume 8:6d9c33df4c09 766 printf("[ OK ] : Camera::getJpegSnapshotPicture\r\n");
umeume 8:6d9c33df4c09 767 } else {
umeume 8:6d9c33df4c09 768 printf("[FAIL] : Camera::getJpegSnapshotPicture (Error=%02X)\r\n", (int)err);
umeume 8:6d9c33df4c09 769 }
umeume 8:6d9c33df4c09 770 fclose(fp_jpeg);
umeume 8:6d9c33df4c09 771 }
umeume 8:6d9c33df4c09 772 }
umeume 8:6d9c33df4c09 773
umeume 8:6d9c33df4c09 774 void HeptaCamera_GPS::test_jpeg_snapshot_data(int CAPTURE_FRAMES)
umeume 8:6d9c33df4c09 775 {
umeume 8:6d9c33df4c09 776 HeptaCamera_GPS::ErrorNumber err = HeptaCamera_GPS::NoError;
umeume 8:6d9c33df4c09 777 for (int i = 0; i < CAPTURE_FRAMES; i++) {
umeume 8:6d9c33df4c09 778 char fname[64];
HEPTA 15:6e8a1e65ac52 779 snprintf(fname, sizeof(fname), "/sd/test%d.txt",i);
umeume 8:6d9c33df4c09 780 fp_jpeg = fopen(fname, "w");
umeume 8:6d9c33df4c09 781
umeume 8:6d9c33df4c09 782 err = getJpegSnapshotPicture_data();
umeume 8:6d9c33df4c09 783
umeume 8:6d9c33df4c09 784 if (HeptaCamera_GPS::NoError == err) {
umeume 8:6d9c33df4c09 785 printf("[ OK ] : Camera::getJpegSnapshotPicture\r\n");
umeume 8:6d9c33df4c09 786 } else {
umeume 8:6d9c33df4c09 787 printf("[FAIL] : Camera::getJpegSnapshotPicture (Error=%02X)\r\n", (int)err);
umeume 8:6d9c33df4c09 788 }
umeume 8:6d9c33df4c09 789 fclose(fp_jpeg);
umeume 8:6d9c33df4c09 790 }
umeume 8:6d9c33df4c09 791 }
umeume 8:6d9c33df4c09 792
umeume 8:6d9c33df4c09 793 void HeptaCamera_GPS::initialize(Baud baud,JpegResolution jr)
umeume 8:6d9c33df4c09 794 {
umeume 8:6d9c33df4c09 795 HeptaCamera_GPS::ErrorNumber err = HeptaCamera_GPS::NoError;//ErrorNumber define
umeume 8:6d9c33df4c09 796 err = init(baud, jr);//
umeume 8:6d9c33df4c09 797 if (HeptaCamera_GPS::NoError == err) {
umeume 8:6d9c33df4c09 798 printf("[ OK ] : Camera::init\r\n");
umeume 8:6d9c33df4c09 799 setmbedBaud(baud);
umeume 8:6d9c33df4c09 800 } else {
umeume 8:6d9c33df4c09 801 printf("[FAIL] : Camera::init (Error=%02X)\r\n", (int)err);
umeume 8:6d9c33df4c09 802 }
umeume 8:6d9c33df4c09 803
umeume 8:6d9c33df4c09 804 }
umeume 8:6d9c33df4c09 805
umeume 8:6d9c33df4c09 806 //*********************serial*********************//
umeume 8:6d9c33df4c09 807 void HeptaCamera_GPS::gps_setting(void)
umeume 8:6d9c33df4c09 808 {
umeume 8:6d9c33df4c09 809 CAM_SW = 0;
umeume 8:6d9c33df4c09 810 GPS_SW = 1;
HEPTA 10:d4ecef9ef8fd 811 flushSerialBuffer();
umeume 8:6d9c33df4c09 812 serial._baud(9600);
umeume 8:6d9c33df4c09 813 serial.setTimeout(9999);
umeume 8:6d9c33df4c09 814 }
umeume 8:6d9c33df4c09 815
umeume 8:6d9c33df4c09 816
umeume 8:6d9c33df4c09 817 char HeptaCamera_GPS::getc()
umeume 8:6d9c33df4c09 818 {
umeume 8:6d9c33df4c09 819 c = serial.getc();
umeume 8:6d9c33df4c09 820 return c;
umeume 8:6d9c33df4c09 821 }
umeume 8:6d9c33df4c09 822 int HeptaCamera_GPS::readable()
umeume 8:6d9c33df4c09 823 {
umeume 8:6d9c33df4c09 824 i = serial.readable();
umeume 8:6d9c33df4c09 825 return i;
umeume 8:6d9c33df4c09 826 }
umeume 8:6d9c33df4c09 827 void HeptaCamera_GPS::flushSerialBuffer(void)
umeume 8:6d9c33df4c09 828 {
umeume 8:6d9c33df4c09 829 ite = 0;
umeume 8:6d9c33df4c09 830 while (serial.readable()) {
umeume 8:6d9c33df4c09 831 serial.getc();
umeume 8:6d9c33df4c09 832 ite++;
umeume 8:6d9c33df4c09 833 if(ite==100) {
umeume 8:6d9c33df4c09 834 break;
umeume 8:6d9c33df4c09 835 };
umeume 8:6d9c33df4c09 836 }
umeume 8:6d9c33df4c09 837 return;
umeume 8:6d9c33df4c09 838 }
umeume 8:6d9c33df4c09 839 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)
umeume 8:6d9c33df4c09 840 {
umeume 8:6d9c33df4c09 841 int ite = 0;
umeume 8:6d9c33df4c09 842 while(serial.getc()!='$') {
umeume 8:6d9c33df4c09 843 ite++;
umeume 8:6d9c33df4c09 844 if(ite==10000) break;
umeume 8:6d9c33df4c09 845 }
umeume 8:6d9c33df4c09 846 for(int i=0; i<5; i++) {
umeume 8:6d9c33df4c09 847 msg[i] = serial.getc();
umeume 8:6d9c33df4c09 848 }
umeume 8:6d9c33df4c09 849 if((msg[2]=='G')&(msg[3]=='G')&(msg[4]=='A')) {
umeume 8:6d9c33df4c09 850 for(int j=0; j<6; j++) {
umeume 8:6d9c33df4c09 851 if(j==0) {
umeume 8:6d9c33df4c09 852 for(int i=5; i<256; i++) {
umeume 8:6d9c33df4c09 853 msg[i] = serial.getc();
umeume 8:6d9c33df4c09 854 if(msg[i] == '\r') {
umeume 8:6d9c33df4c09 855 msg[i] = 0;
umeume 8:6d9c33df4c09 856 break;
umeume 8:6d9c33df4c09 857 }
umeume 8:6d9c33df4c09 858 }
umeume 8:6d9c33df4c09 859 } else {
umeume 8:6d9c33df4c09 860 for(int i=0; i<256; i++) {
umeume 8:6d9c33df4c09 861 msgd[i] = serial.getc();
umeume 8:6d9c33df4c09 862 if(msgd[i] == '\r') {
umeume 8:6d9c33df4c09 863 break;
umeume 8:6d9c33df4c09 864 }
umeume 8:6d9c33df4c09 865 }
umeume 8:6d9c33df4c09 866 if((msgd[4]=='V')&(msgd[5]=='T')&(msgd[6]=='G')) {
umeume 8:6d9c33df4c09 867 break;
umeume 8:6d9c33df4c09 868 }
umeume 8:6d9c33df4c09 869 }
umeume 8:6d9c33df4c09 870 }
umeume 8:6d9c33df4c09 871 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) {
umeume 8:6d9c33df4c09 872 if(!(quality)) {
umeume 8:6d9c33df4c09 873 //latitude(unit transformation)
umeume 8:6d9c33df4c09 874 *latitude=int(*latitude/100)+(*latitude-int(*latitude/100)*100)/60;
umeume 8:6d9c33df4c09 875 //longitude(unit transformation)
umeume 8:6d9c33df4c09 876 *longitude = int(*longitude/100)+(*longitude-int(*longitude/100)*100)/60;
umeume 8:6d9c33df4c09 877 *serial_check = 0;
umeume 8:6d9c33df4c09 878 } else {
umeume 8:6d9c33df4c09 879 //latitude(unit transformation)
umeume 8:6d9c33df4c09 880 *latitude=int(*latitude/100)+(*latitude-int(*latitude/100)*100)/60;
umeume 8:6d9c33df4c09 881 //longitude(unit transformation)
umeume 8:6d9c33df4c09 882 *longitude = int(*longitude/100)+(*longitude-int(*longitude/100)*100)/60;
umeume 8:6d9c33df4c09 883 *serial_check = 1;
umeume 8:6d9c33df4c09 884 }
umeume 8:6d9c33df4c09 885 } else {
umeume 8:6d9c33df4c09 886 printf("No Data");
umeume 8:6d9c33df4c09 887 *serial_check = 2;
umeume 8:6d9c33df4c09 888 }
umeume 8:6d9c33df4c09 889 } else {
umeume 8:6d9c33df4c09 890 *serial_check = 3;
umeume 8:6d9c33df4c09 891 }
umeume 8:6d9c33df4c09 892 }
umeume 8:6d9c33df4c09 893
umeume 8:6d9c33df4c09 894 void HeptaCamera_GPS::lat_log_sensing_u16(char *lat, char *log, char *height, int *dsize1, int *dsize2)
umeume 8:6d9c33df4c09 895 {
umeume 8:6d9c33df4c09 896 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};
umeume 8:6d9c33df4c09 897 char hei1[8]= {0x00},hei2[8]= {0x00};
umeume 8:6d9c33df4c09 898 int i=0,j=0;
umeume 8:6d9c33df4c09 899 while (serial.readable()) {
umeume 8:6d9c33df4c09 900 serial.getc();
umeume 8:6d9c33df4c09 901 }
umeume 8:6d9c33df4c09 902 loop:
umeume 8:6d9c33df4c09 903 while(serial.getc()!='$') {}
umeume 8:6d9c33df4c09 904 for(j=0; j<5; j++) {
umeume 8:6d9c33df4c09 905 gps_data[1][j]=serial.getc();
umeume 8:6d9c33df4c09 906 }
umeume 8:6d9c33df4c09 907 if((gps_data[1][2]==0x47)&(gps_data[1][3]==0x47)&(gps_data[1][4]==0x41)) {
umeume 8:6d9c33df4c09 908 for(j=0; j<1; j++) {
umeume 8:6d9c33df4c09 909 if(j==0) {
umeume 8:6d9c33df4c09 910 i=0;
umeume 8:6d9c33df4c09 911 while((gps_data[j+1][i+5] = serial.getc()) != '\r') {
umeume 8:6d9c33df4c09 912 //pc.putc(gps_data[j+1][i+5]);
umeume 8:6d9c33df4c09 913 i++;
umeume 8:6d9c33df4c09 914 }
umeume 8:6d9c33df4c09 915 gps_data[j+1][i+5]='\0';
umeume 8:6d9c33df4c09 916 i=0;
umeume 8:6d9c33df4c09 917 //pc.printf("\n\r");
umeume 8:6d9c33df4c09 918 } else {
umeume 8:6d9c33df4c09 919 while(serial.getc()!='$') {}
umeume 8:6d9c33df4c09 920 i=0;
umeume 8:6d9c33df4c09 921 while((gps_data[j+1][i] = serial.getc()) != '\r') {
umeume 8:6d9c33df4c09 922 //pc.putc(gps_data[j+1][i]);
umeume 8:6d9c33df4c09 923 i++;
umeume 8:6d9c33df4c09 924 }
umeume 8:6d9c33df4c09 925 gps_data[j+1][i]='\0';
umeume 8:6d9c33df4c09 926 i=0;
umeume 8:6d9c33df4c09 927 //pc.printf("\n\r");
umeume 8:6d9c33df4c09 928 }
umeume 8:6d9c33df4c09 929 }
umeume 8:6d9c33df4c09 930 } else {
umeume 8:6d9c33df4c09 931 goto loop;
umeume 8:6d9c33df4c09 932 }
umeume 8:6d9c33df4c09 933 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) {
umeume 8:6d9c33df4c09 934 //hokui
umeume 8:6d9c33df4c09 935 d_hokui=int(hokui/100);
umeume 8:6d9c33df4c09 936 m_hokui=(hokui-d_hokui*100);
umeume 8:6d9c33df4c09 937 //m_hokui=(hokui-d_hokui*100)/60;
umeume 8:6d9c33df4c09 938 g_hokui=d_hokui+(hokui-d_hokui*100)/60;
umeume 8:6d9c33df4c09 939 //printf("%f\r\n",hokui);
umeume 8:6d9c33df4c09 940 sprintf( gph1, "%02X", (char(d_hokui)) & 0xFF);
umeume 8:6d9c33df4c09 941 sprintf( gph2, "%02X", (char(m_hokui)) & 0xFF);
umeume 8:6d9c33df4c09 942 sprintf( gph3, "%02X", (char((m_hokui-char(m_hokui))*100)) & 0xFF);
umeume 8:6d9c33df4c09 943 sprintf( gph4, "%02X", (char(((m_hokui-char(m_hokui))*100-char((m_hokui-char(m_hokui))*100))*100)) & 0xFF);
umeume 8:6d9c33df4c09 944
umeume 8:6d9c33df4c09 945 //tokei
umeume 8:6d9c33df4c09 946 d_tokei=int(tokei/100);
umeume 8:6d9c33df4c09 947 m_tokei=(tokei-d_tokei*100);
umeume 8:6d9c33df4c09 948 //m_tokei=(tokei-d_tokei*100)/60;
umeume 8:6d9c33df4c09 949 g_tokei=d_tokei+(tokei-d_tokei*100)/60;
umeume 8:6d9c33df4c09 950 //printf("%f\r\n",tokei);
umeume 8:6d9c33df4c09 951 sprintf( gpt1, "%02X", (char(d_tokei)) & 0xFF);
umeume 8:6d9c33df4c09 952 sprintf( gpt2, "%02X", (char(m_tokei)) & 0xFF);
umeume 8:6d9c33df4c09 953 sprintf( gpt3, "%02X", (char((m_tokei-char(m_tokei))*100)) & 0xFF);
umeume 8:6d9c33df4c09 954 sprintf( gpt4, "%02X", (char(((m_tokei-char(m_tokei))*100-char((m_tokei-char(m_tokei))*100))*100)) & 0xFF);
umeume 8:6d9c33df4c09 955
umeume 8:6d9c33df4c09 956 m_height = int(_altitude);
HEPTA 9:591580af98be 957 cm_height = int((_altitude-m_height)*100 );
umeume 8:6d9c33df4c09 958 // printf("%f\r\n",_altitude);
umeume 8:6d9c33df4c09 959 sprintf( hei1, "%02X", (char(m_height)) & 0xFF);
umeume 8:6d9c33df4c09 960 sprintf( hei2, "%02X", (char(cm_height)) & 0xFF);
umeume 8:6d9c33df4c09 961
umeume 8:6d9c33df4c09 962 lat[0] = gph1[0];
umeume 8:6d9c33df4c09 963 lat[1] = gph1[1];
umeume 8:6d9c33df4c09 964 lat[2] = gph2[0];
umeume 8:6d9c33df4c09 965 lat[3] = gph2[1];
umeume 8:6d9c33df4c09 966 lat[4] = gph3[0];
umeume 8:6d9c33df4c09 967 lat[5] = gph3[1];
umeume 8:6d9c33df4c09 968 lat[6] = gph4[0];
umeume 8:6d9c33df4c09 969 lat[7] = gph4[1];
umeume 8:6d9c33df4c09 970 log[0] = gpt1[0];
umeume 8:6d9c33df4c09 971 log[1] = gpt1[1];
umeume 8:6d9c33df4c09 972 log[2] = gpt2[0];
umeume 8:6d9c33df4c09 973 log[3] = gpt2[1];
umeume 8:6d9c33df4c09 974 log[4] = gpt3[0];
umeume 8:6d9c33df4c09 975 log[5] = gpt3[1];
umeume 8:6d9c33df4c09 976 log[6] = gpt4[0];
umeume 8:6d9c33df4c09 977 log[7] = gpt4[1];
umeume 8:6d9c33df4c09 978 height[0] = hei1[0];
umeume 8:6d9c33df4c09 979 height[1] = hei1[1];
umeume 8:6d9c33df4c09 980 height[2] = hei2[0];
umeume 8:6d9c33df4c09 981 height[3] = hei2[1];
umeume 8:6d9c33df4c09 982 }
umeume 8:6d9c33df4c09 983 *dsize1 = 8;
umeume 8:6d9c33df4c09 984 *dsize2 = 4;
umeume 8:6d9c33df4c09 985 }