Dependencies:   mbed

Committer:
mitesh2patel
Date:
Tue Dec 14 13:27:41 2010 +0000
Revision:
1:78aaadfd1ece
Parent:
0:162e214baa3d

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mitesh2patel 0:162e214baa3d 1 /**
mitesh2patel 0:162e214baa3d 2 * C328-7640 device driver class (Version 0.0.6)
mitesh2patel 0:162e214baa3d 3 * Reference documents: C328-7640 User Manual v3.0 2004.8.19
mitesh2patel 0:162e214baa3d 4 *
mitesh2patel 0:162e214baa3d 5 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
mitesh2patel 0:162e214baa3d 6 * http://shinta.main.jp/
mitesh2patel 0:162e214baa3d 7 */
mitesh2patel 0:162e214baa3d 8
mitesh2patel 0:162e214baa3d 9 #include "CameraC328.h"
mitesh2patel 0:162e214baa3d 10
mitesh2patel 0:162e214baa3d 11 #define WAITIDLE waitIdle
mitesh2patel 0:162e214baa3d 12 #define SENDFUNC sendBytes
mitesh2patel 0:162e214baa3d 13 #define RECVFUNC recvBytes
mitesh2patel 0:162e214baa3d 14 #define WAITFUNC waitRecv
mitesh2patel 0:162e214baa3d 15
mitesh2patel 0:162e214baa3d 16 /**
mitesh2patel 0:162e214baa3d 17 * Constructor.
mitesh2patel 0:162e214baa3d 18 *
mitesh2patel 0:162e214baa3d 19 * @param tx A pin for transmit.
mitesh2patel 0:162e214baa3d 20 * @param rx A pin for receive.
mitesh2patel 0:162e214baa3d 21 * @param baud Baud rate. (Default is Baud19200.)
mitesh2patel 0:162e214baa3d 22 */
mitesh2patel 0:162e214baa3d 23 CameraC328::CameraC328(PinName tx, PinName rx, Baud baud) : serial(tx, rx) {
mitesh2patel 0:162e214baa3d 24 serial.baud((int)baud);
mitesh2patel 0:162e214baa3d 25 }
mitesh2patel 0:162e214baa3d 26
mitesh2patel 0:162e214baa3d 27 /**
mitesh2patel 0:162e214baa3d 28 * Destructor.
mitesh2patel 0:162e214baa3d 29 */
mitesh2patel 0:162e214baa3d 30 CameraC328::~CameraC328() {
mitesh2patel 0:162e214baa3d 31 }
mitesh2patel 0:162e214baa3d 32
mitesh2patel 0:162e214baa3d 33 /**
mitesh2patel 0:162e214baa3d 34 * Make a sync. for baud rate.
mitesh2patel 0:162e214baa3d 35 */
mitesh2patel 0:162e214baa3d 36 CameraC328::ErrorNumber CameraC328::sync() {
mitesh2patel 0:162e214baa3d 37 WAITIDLE();
mitesh2patel 0:162e214baa3d 38
mitesh2patel 0:162e214baa3d 39 for (int i = 0; i < SYNCMAX; i++) {
mitesh2patel 0:162e214baa3d 40 if (NoError == sendSync()) {
mitesh2patel 0:162e214baa3d 41 if (NoError == recvAckOrNck()) {
mitesh2patel 0:162e214baa3d 42 if (NoError == recvSync()) {
mitesh2patel 0:162e214baa3d 43 if (NoError == sendAck(0x0D, 0x00)) {
mitesh2patel 0:162e214baa3d 44 /*
mitesh2patel 0:162e214baa3d 45 * After synchronization, the camera needs a little time for AEC and AGC to be stable.
mitesh2patel 0:162e214baa3d 46 * Users should wait for 1-2 seconds before capturing the first picture.
mitesh2patel 0:162e214baa3d 47 */
mitesh2patel 0:162e214baa3d 48 wait(2);
mitesh2patel 0:162e214baa3d 49 return NoError;
mitesh2patel 0:162e214baa3d 50 }
mitesh2patel 0:162e214baa3d 51 }
mitesh2patel 0:162e214baa3d 52 }
mitesh2patel 0:162e214baa3d 53 }
mitesh2patel 0:162e214baa3d 54 wait_ms(50);
mitesh2patel 0:162e214baa3d 55 }
mitesh2patel 0:162e214baa3d 56 return UnexpectedReply;
mitesh2patel 0:162e214baa3d 57 }
mitesh2patel 0:162e214baa3d 58
mitesh2patel 0:162e214baa3d 59 /**
mitesh2patel 0:162e214baa3d 60 * Initialize.
mitesh2patel 0:162e214baa3d 61 *
mitesh2patel 0:162e214baa3d 62 * @param ct Color type.
mitesh2patel 0:162e214baa3d 63 * @param rr Raw resolution.
mitesh2patel 0:162e214baa3d 64 * @param jr JPEG resolution.
mitesh2patel 0:162e214baa3d 65 */
mitesh2patel 0:162e214baa3d 66 CameraC328::ErrorNumber CameraC328::init(ColorType ct, RawResolution rr, JpegResolution jr) {
mitesh2patel 0:162e214baa3d 67 WAITIDLE();
mitesh2patel 0:162e214baa3d 68 ErrorNumber en;
mitesh2patel 0:162e214baa3d 69
mitesh2patel 0:162e214baa3d 70 en = sendInitial(ct, rr, jr);
mitesh2patel 0:162e214baa3d 71 if (NoError != en) {
mitesh2patel 0:162e214baa3d 72 return en;
mitesh2patel 0:162e214baa3d 73 }
mitesh2patel 0:162e214baa3d 74 WAITFUNC();
mitesh2patel 0:162e214baa3d 75 en = recvAckOrNck();
mitesh2patel 0:162e214baa3d 76 if (NoError != en) {
mitesh2patel 0:162e214baa3d 77 return en;
mitesh2patel 0:162e214baa3d 78 }
mitesh2patel 0:162e214baa3d 79
mitesh2patel 0:162e214baa3d 80 static bool alreadySetupPackageSize = false;
mitesh2patel 0:162e214baa3d 81 if (!alreadySetupPackageSize) {
mitesh2patel 0:162e214baa3d 82 en = sendSetPackageSize(packageSize);
mitesh2patel 0:162e214baa3d 83 if (NoError != en) {
mitesh2patel 0:162e214baa3d 84 return en;
mitesh2patel 0:162e214baa3d 85 }
mitesh2patel 0:162e214baa3d 86 WAITFUNC();
mitesh2patel 0:162e214baa3d 87 en = recvAckOrNck();
mitesh2patel 0:162e214baa3d 88 if (NoError != en) {
mitesh2patel 0:162e214baa3d 89 return en;
mitesh2patel 0:162e214baa3d 90 }
mitesh2patel 0:162e214baa3d 91 alreadySetupPackageSize = true;
mitesh2patel 0:162e214baa3d 92 }
mitesh2patel 0:162e214baa3d 93
mitesh2patel 0:162e214baa3d 94 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 95 }
mitesh2patel 0:162e214baa3d 96
mitesh2patel 0:162e214baa3d 97 /**
mitesh2patel 0:162e214baa3d 98 * Get uncompressed snapshot picture.
mitesh2patel 0:162e214baa3d 99 *
mitesh2patel 0:162e214baa3d 100 * @param func A pointer to a callback function.
mitesh2patel 0:162e214baa3d 101 * Please do NOT block this callback function.
mitesh2patel 0:162e214baa3d 102 * Because the camera module transmit image datas continuously.
mitesh2patel 0:162e214baa3d 103 * @return Status of the error.
mitesh2patel 0:162e214baa3d 104 */
mitesh2patel 0:162e214baa3d 105 CameraC328::ErrorNumber CameraC328::getUncompressedSnapshotPicture(void(*func)(size_t done, size_t total, char c)) {
mitesh2patel 0:162e214baa3d 106 WAITIDLE();
mitesh2patel 0:162e214baa3d 107 ErrorNumber en;
mitesh2patel 0:162e214baa3d 108
mitesh2patel 0:162e214baa3d 109 en = sendSnapshot(UncompressedPicture, 0);
mitesh2patel 0:162e214baa3d 110 if (NoError != en) {
mitesh2patel 0:162e214baa3d 111 return en;
mitesh2patel 0:162e214baa3d 112 }
mitesh2patel 0:162e214baa3d 113 WAITFUNC();
mitesh2patel 0:162e214baa3d 114 en = recvAckOrNck();
mitesh2patel 0:162e214baa3d 115 if (NoError != en) {
mitesh2patel 0:162e214baa3d 116 return en;
mitesh2patel 0:162e214baa3d 117 }
mitesh2patel 0:162e214baa3d 118
mitesh2patel 0:162e214baa3d 119 en = sendGetPicture(SnapshotPicture);
mitesh2patel 0:162e214baa3d 120 if (NoError != en) {
mitesh2patel 0:162e214baa3d 121 return en;
mitesh2patel 0:162e214baa3d 122 }
mitesh2patel 0:162e214baa3d 123 WAITFUNC();
mitesh2patel 0:162e214baa3d 124 en = recvAckOrNck();
mitesh2patel 0:162e214baa3d 125 if (NoError != en) {
mitesh2patel 0:162e214baa3d 126 return en;
mitesh2patel 0:162e214baa3d 127 }
mitesh2patel 0:162e214baa3d 128
mitesh2patel 0:162e214baa3d 129 /*
mitesh2patel 0:162e214baa3d 130 * image data
mitesh2patel 0:162e214baa3d 131 */
mitesh2patel 0:162e214baa3d 132 DataType dt;
mitesh2patel 0:162e214baa3d 133 uint32_t length = 0;
mitesh2patel 0:162e214baa3d 134 WAITFUNC();
mitesh2patel 0:162e214baa3d 135 en = recvData(&dt, &length);
mitesh2patel 0:162e214baa3d 136 if (NoError != en) {
mitesh2patel 0:162e214baa3d 137 return en;
mitesh2patel 0:162e214baa3d 138 }
mitesh2patel 0:162e214baa3d 139 size_t imgcnt = 0;
mitesh2patel 0:162e214baa3d 140 for (int i = 0; i < (int)length; i++) {
mitesh2patel 0:162e214baa3d 141 char c;
mitesh2patel 0:162e214baa3d 142 WAITFUNC();
mitesh2patel 0:162e214baa3d 143 if (!RECVFUNC(&c, 1)) {
mitesh2patel 0:162e214baa3d 144 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 145 }
mitesh2patel 0:162e214baa3d 146 imgcnt++;
mitesh2patel 0:162e214baa3d 147
mitesh2patel 0:162e214baa3d 148 /*
mitesh2patel 0:162e214baa3d 149 * Call a call back function.
mitesh2patel 0:162e214baa3d 150 * Please do not block this function.
mitesh2patel 0:162e214baa3d 151 */
mitesh2patel 0:162e214baa3d 152 func(imgcnt, length, c);
mitesh2patel 0:162e214baa3d 153 }
mitesh2patel 0:162e214baa3d 154
mitesh2patel 0:162e214baa3d 155 /*
mitesh2patel 0:162e214baa3d 156 * ACK
mitesh2patel 0:162e214baa3d 157 */
mitesh2patel 0:162e214baa3d 158 en = sendAck(0x0A, 0x00);
mitesh2patel 0:162e214baa3d 159 if (NoError != en) {
mitesh2patel 0:162e214baa3d 160 return en;
mitesh2patel 0:162e214baa3d 161 }
mitesh2patel 0:162e214baa3d 162
mitesh2patel 0:162e214baa3d 163 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 164 }
mitesh2patel 0:162e214baa3d 165
mitesh2patel 0:162e214baa3d 166 /**
mitesh2patel 0:162e214baa3d 167 * Get uncompressed preview picture.
mitesh2patel 0:162e214baa3d 168 *
mitesh2patel 0:162e214baa3d 169 * @param func A pointer to a callback function.
mitesh2patel 0:162e214baa3d 170 * Please do NOT block this callback function.
mitesh2patel 0:162e214baa3d 171 * Because the camera module transmit image datas continuously.
mitesh2patel 0:162e214baa3d 172 * @return Status of the error.
mitesh2patel 0:162e214baa3d 173 */
mitesh2patel 0:162e214baa3d 174 CameraC328::ErrorNumber CameraC328::getUncompressedPreviewPicture(void(*func)(size_t done, size_t total, char c)) {
mitesh2patel 0:162e214baa3d 175 WAITIDLE();
mitesh2patel 0:162e214baa3d 176 ErrorNumber en;
mitesh2patel 0:162e214baa3d 177
mitesh2patel 0:162e214baa3d 178 en = sendGetPicture(PreviewPicture);
mitesh2patel 0:162e214baa3d 179 if (NoError != en) {
mitesh2patel 0:162e214baa3d 180 return en;
mitesh2patel 0:162e214baa3d 181 }
mitesh2patel 0:162e214baa3d 182 WAITFUNC();
mitesh2patel 0:162e214baa3d 183 en = recvAckOrNck();
mitesh2patel 0:162e214baa3d 184 if (NoError != en) {
mitesh2patel 0:162e214baa3d 185 return en;
mitesh2patel 0:162e214baa3d 186 }
mitesh2patel 0:162e214baa3d 187
mitesh2patel 0:162e214baa3d 188 /*
mitesh2patel 0:162e214baa3d 189 * image data
mitesh2patel 0:162e214baa3d 190 */
mitesh2patel 0:162e214baa3d 191 DataType dt;
mitesh2patel 0:162e214baa3d 192 uint32_t length = 0;
mitesh2patel 0:162e214baa3d 193 WAITFUNC();
mitesh2patel 0:162e214baa3d 194 en = recvData(&dt, &length);
mitesh2patel 0:162e214baa3d 195 if (NoError != en) {
mitesh2patel 0:162e214baa3d 196 return en;
mitesh2patel 0:162e214baa3d 197 }
mitesh2patel 0:162e214baa3d 198 size_t imgcnt = 0;
mitesh2patel 0:162e214baa3d 199 for (int i = 0; i < (int)length; i++) {
mitesh2patel 0:162e214baa3d 200 char c;
mitesh2patel 0:162e214baa3d 201 WAITFUNC();
mitesh2patel 0:162e214baa3d 202 if (!RECVFUNC(&c, 1)) {
mitesh2patel 0:162e214baa3d 203 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 204 }
mitesh2patel 0:162e214baa3d 205 imgcnt++;
mitesh2patel 0:162e214baa3d 206
mitesh2patel 0:162e214baa3d 207 /*
mitesh2patel 0:162e214baa3d 208 * Call a call back function.
mitesh2patel 0:162e214baa3d 209 * Please do not block this function.
mitesh2patel 0:162e214baa3d 210 */
mitesh2patel 0:162e214baa3d 211 func(imgcnt, length, c);
mitesh2patel 0:162e214baa3d 212 }
mitesh2patel 0:162e214baa3d 213
mitesh2patel 0:162e214baa3d 214 /*
mitesh2patel 0:162e214baa3d 215 * ACK
mitesh2patel 0:162e214baa3d 216 */
mitesh2patel 0:162e214baa3d 217 en = sendAck(0x0A, 0x00);
mitesh2patel 0:162e214baa3d 218 if (NoError != en) {
mitesh2patel 0:162e214baa3d 219 return en;
mitesh2patel 0:162e214baa3d 220 }
mitesh2patel 0:162e214baa3d 221
mitesh2patel 0:162e214baa3d 222 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 223 }
mitesh2patel 0:162e214baa3d 224
mitesh2patel 0:162e214baa3d 225 /**
mitesh2patel 0:162e214baa3d 226 * Get JPEG snapshot picture.
mitesh2patel 0:162e214baa3d 227 *
mitesh2patel 0:162e214baa3d 228 * @param func A pointer to a callback function.
mitesh2patel 0:162e214baa3d 229 * You can block this function until saving the image datas.
mitesh2patel 0:162e214baa3d 230 * @return Status of the error.
mitesh2patel 0:162e214baa3d 231 */
mitesh2patel 0:162e214baa3d 232 CameraC328::ErrorNumber CameraC328::getJpegSnapshotPicture(void(*func)(char *buf, size_t siz)) {
mitesh2patel 0:162e214baa3d 233 WAITIDLE();
mitesh2patel 0:162e214baa3d 234 ErrorNumber en;
mitesh2patel 0:162e214baa3d 235
mitesh2patel 0:162e214baa3d 236 en = sendSnapshot(CompressedPicture, 1);
mitesh2patel 0:162e214baa3d 237 if (NoError != en) {
mitesh2patel 0:162e214baa3d 238 return en;
mitesh2patel 0:162e214baa3d 239 }
mitesh2patel 0:162e214baa3d 240 WAITFUNC();
mitesh2patel 0:162e214baa3d 241 en = recvAckOrNck();
mitesh2patel 0:162e214baa3d 242 if (NoError != en) {
mitesh2patel 0:162e214baa3d 243 return en;
mitesh2patel 0:162e214baa3d 244 }
mitesh2patel 0:162e214baa3d 245
mitesh2patel 0:162e214baa3d 246 en = sendGetPicture(SnapshotPicture);
mitesh2patel 0:162e214baa3d 247 if (NoError != en) {
mitesh2patel 0:162e214baa3d 248 return en;
mitesh2patel 0:162e214baa3d 249 }
mitesh2patel 0:162e214baa3d 250 WAITFUNC();
mitesh2patel 0:162e214baa3d 251 en = recvAckOrNck();
mitesh2patel 0:162e214baa3d 252 if (NoError != en) {
mitesh2patel 0:162e214baa3d 253 return en;
mitesh2patel 0:162e214baa3d 254 }
mitesh2patel 0:162e214baa3d 255
mitesh2patel 0:162e214baa3d 256 /*
mitesh2patel 0:162e214baa3d 257 * Data : snapshot picture
mitesh2patel 0:162e214baa3d 258 */
mitesh2patel 0:162e214baa3d 259 DataType dt;
mitesh2patel 0:162e214baa3d 260 uint32_t length = 0;
mitesh2patel 0:162e214baa3d 261 WAITFUNC();
mitesh2patel 0:162e214baa3d 262 en = recvData(&dt, &length);
mitesh2patel 0:162e214baa3d 263 if (NoError != en) {
mitesh2patel 0:162e214baa3d 264 return en;
mitesh2patel 0:162e214baa3d 265 }
mitesh2patel 0:162e214baa3d 266 en = sendAck(0x00, 0);
mitesh2patel 0:162e214baa3d 267 if (NoError != en) {
mitesh2patel 0:162e214baa3d 268 return en;
mitesh2patel 0:162e214baa3d 269 }
mitesh2patel 0:162e214baa3d 270
mitesh2patel 0:162e214baa3d 271 char databuf[packageSize - 6];
mitesh2patel 0:162e214baa3d 272 uint16_t pkg_total = length / (packageSize - 6);
mitesh2patel 0:162e214baa3d 273 for (int i = 0; i <= (int)pkg_total; i++) {
mitesh2patel 0:162e214baa3d 274 uint16_t checksum = 0;
mitesh2patel 0:162e214baa3d 275 // ID.
mitesh2patel 0:162e214baa3d 276 char idbuf[2];
mitesh2patel 0:162e214baa3d 277 WAITFUNC();
mitesh2patel 0:162e214baa3d 278 if (!RECVFUNC(idbuf, sizeof(idbuf))) {
mitesh2patel 0:162e214baa3d 279 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 280 }
mitesh2patel 0:162e214baa3d 281 checksum += idbuf[0];
mitesh2patel 0:162e214baa3d 282 checksum += idbuf[1];
mitesh2patel 0:162e214baa3d 283 uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
mitesh2patel 0:162e214baa3d 284 if (id != i) {
mitesh2patel 0:162e214baa3d 285 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 286 }
mitesh2patel 0:162e214baa3d 287
mitesh2patel 0:162e214baa3d 288 // Size of the data.
mitesh2patel 0:162e214baa3d 289 char dsbuf[2];
mitesh2patel 0:162e214baa3d 290 WAITFUNC();
mitesh2patel 0:162e214baa3d 291 if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
mitesh2patel 0:162e214baa3d 292 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 293 }
mitesh2patel 0:162e214baa3d 294
mitesh2patel 0:162e214baa3d 295 // Received the data.
mitesh2patel 0:162e214baa3d 296 checksum += dsbuf[0];
mitesh2patel 0:162e214baa3d 297 checksum += dsbuf[1];
mitesh2patel 0:162e214baa3d 298 uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
mitesh2patel 0:162e214baa3d 299 WAITFUNC();
mitesh2patel 0:162e214baa3d 300 if (!RECVFUNC(&databuf[0], ds)) {
mitesh2patel 0:162e214baa3d 301 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 302 }
mitesh2patel 0:162e214baa3d 303 for (int j = 0; j < ds; j++) {
mitesh2patel 0:162e214baa3d 304 checksum += databuf[j];
mitesh2patel 0:162e214baa3d 305 }
mitesh2patel 0:162e214baa3d 306
mitesh2patel 0:162e214baa3d 307 // Verify code.
mitesh2patel 0:162e214baa3d 308 char vcbuf[2];
mitesh2patel 0:162e214baa3d 309 WAITFUNC();
mitesh2patel 0:162e214baa3d 310 if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
mitesh2patel 0:162e214baa3d 311 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 312 }
mitesh2patel 0:162e214baa3d 313 uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
mitesh2patel 0:162e214baa3d 314 if (vc != (checksum & 0xff)) {
mitesh2patel 0:162e214baa3d 315 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 316 }
mitesh2patel 0:162e214baa3d 317
mitesh2patel 0:162e214baa3d 318 /*
mitesh2patel 0:162e214baa3d 319 * Call a call back function.
mitesh2patel 0:162e214baa3d 320 * You can block this function while working.
mitesh2patel 0:162e214baa3d 321 */
mitesh2patel 0:162e214baa3d 322 func(databuf, ds);
mitesh2patel 0:162e214baa3d 323
mitesh2patel 0:162e214baa3d 324 /*
mitesh2patel 0:162e214baa3d 325 * We should wait for camera working before reply a ACK.
mitesh2patel 0:162e214baa3d 326 */
mitesh2patel 0:162e214baa3d 327 wait_ms(100);
mitesh2patel 0:162e214baa3d 328 en = sendAck(0x00, 1 + i);
mitesh2patel 0:162e214baa3d 329 if (NoError != en) {
mitesh2patel 0:162e214baa3d 330 return en;
mitesh2patel 0:162e214baa3d 331 }
mitesh2patel 0:162e214baa3d 332 }
mitesh2patel 0:162e214baa3d 333
mitesh2patel 0:162e214baa3d 334 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 335 }
mitesh2patel 0:162e214baa3d 336
mitesh2patel 0:162e214baa3d 337 /**
mitesh2patel 0:162e214baa3d 338 * Get JPEG preview picture.
mitesh2patel 0:162e214baa3d 339 *
mitesh2patel 0:162e214baa3d 340 * @param func A pointer to a callback function.
mitesh2patel 0:162e214baa3d 341 * You can block this function until saving the image datas.
mitesh2patel 0:162e214baa3d 342 * @return Status of the error.
mitesh2patel 0:162e214baa3d 343 */
mitesh2patel 0:162e214baa3d 344 CameraC328::ErrorNumber CameraC328::getJpegPreviewPicture(void(*func)(char *buf, size_t siz)) {
mitesh2patel 0:162e214baa3d 345 WAITIDLE();
mitesh2patel 0:162e214baa3d 346 ErrorNumber en;
mitesh2patel 0:162e214baa3d 347
mitesh2patel 0:162e214baa3d 348 en = sendGetPicture(JpegPreviewPicture);
mitesh2patel 0:162e214baa3d 349 if (NoError != en) {
mitesh2patel 0:162e214baa3d 350 return en;
mitesh2patel 0:162e214baa3d 351 }
mitesh2patel 0:162e214baa3d 352 WAITFUNC();
mitesh2patel 0:162e214baa3d 353 en = recvAckOrNck();
mitesh2patel 0:162e214baa3d 354 if (NoError != en) {
mitesh2patel 0:162e214baa3d 355 return en;
mitesh2patel 0:162e214baa3d 356 }
mitesh2patel 0:162e214baa3d 357
mitesh2patel 0:162e214baa3d 358 /*
mitesh2patel 0:162e214baa3d 359 * Data : JPEG preview picture
mitesh2patel 0:162e214baa3d 360 */
mitesh2patel 0:162e214baa3d 361 DataType dt;
mitesh2patel 0:162e214baa3d 362 uint32_t length = 0;
mitesh2patel 0:162e214baa3d 363 WAITFUNC();
mitesh2patel 0:162e214baa3d 364 en = recvData(&dt, &length);
mitesh2patel 0:162e214baa3d 365 if (NoError != en) {
mitesh2patel 0:162e214baa3d 366 return en;
mitesh2patel 0:162e214baa3d 367 }
mitesh2patel 0:162e214baa3d 368 en = sendAck(0x00, 0);
mitesh2patel 0:162e214baa3d 369 if (NoError != en) {
mitesh2patel 0:162e214baa3d 370 return en;
mitesh2patel 0:162e214baa3d 371 }
mitesh2patel 0:162e214baa3d 372
mitesh2patel 0:162e214baa3d 373 char databuf[packageSize - 6];
mitesh2patel 0:162e214baa3d 374 uint16_t pkg_total = length / (packageSize - 6);
mitesh2patel 0:162e214baa3d 375 for (int i = 0; i <= (int)pkg_total; i++) {
mitesh2patel 0:162e214baa3d 376 uint16_t checksum = 0;
mitesh2patel 0:162e214baa3d 377 // ID.
mitesh2patel 0:162e214baa3d 378 char idbuf[2];
mitesh2patel 0:162e214baa3d 379 WAITFUNC();
mitesh2patel 0:162e214baa3d 380 if (!RECVFUNC(idbuf, sizeof(idbuf))) {
mitesh2patel 0:162e214baa3d 381 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 382 }
mitesh2patel 0:162e214baa3d 383 checksum += idbuf[0];
mitesh2patel 0:162e214baa3d 384 checksum += idbuf[1];
mitesh2patel 0:162e214baa3d 385 uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
mitesh2patel 0:162e214baa3d 386 if (id != i) {
mitesh2patel 0:162e214baa3d 387 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 388 }
mitesh2patel 0:162e214baa3d 389
mitesh2patel 0:162e214baa3d 390 // Size of the data.
mitesh2patel 0:162e214baa3d 391 char dsbuf[2];
mitesh2patel 0:162e214baa3d 392 WAITFUNC();
mitesh2patel 0:162e214baa3d 393 if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
mitesh2patel 0:162e214baa3d 394 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 395 }
mitesh2patel 0:162e214baa3d 396
mitesh2patel 0:162e214baa3d 397 // Received the data.
mitesh2patel 0:162e214baa3d 398 checksum += dsbuf[0];
mitesh2patel 0:162e214baa3d 399 checksum += dsbuf[1];
mitesh2patel 0:162e214baa3d 400 uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
mitesh2patel 0:162e214baa3d 401 WAITFUNC();
mitesh2patel 0:162e214baa3d 402 if (!RECVFUNC(&databuf[0], ds)) {
mitesh2patel 0:162e214baa3d 403 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 404 }
mitesh2patel 0:162e214baa3d 405 for (int j = 0; j < ds; j++) {
mitesh2patel 0:162e214baa3d 406 checksum += databuf[j];
mitesh2patel 0:162e214baa3d 407 }
mitesh2patel 0:162e214baa3d 408
mitesh2patel 0:162e214baa3d 409 // Verify code.
mitesh2patel 0:162e214baa3d 410 char vcbuf[2];
mitesh2patel 0:162e214baa3d 411 WAITFUNC();
mitesh2patel 0:162e214baa3d 412 if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
mitesh2patel 0:162e214baa3d 413 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 414 }
mitesh2patel 0:162e214baa3d 415 uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
mitesh2patel 0:162e214baa3d 416 if (vc != (checksum & 0xff)) {
mitesh2patel 0:162e214baa3d 417 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 418 }
mitesh2patel 0:162e214baa3d 419
mitesh2patel 0:162e214baa3d 420 /*
mitesh2patel 0:162e214baa3d 421 * Call a call back function.
mitesh2patel 0:162e214baa3d 422 * You can block this function while working.
mitesh2patel 0:162e214baa3d 423 */
mitesh2patel 0:162e214baa3d 424 func(databuf, ds);
mitesh2patel 0:162e214baa3d 425
mitesh2patel 0:162e214baa3d 426 /*
mitesh2patel 0:162e214baa3d 427 * We should wait for camera working before reply a ACK.
mitesh2patel 0:162e214baa3d 428 */
mitesh2patel 0:162e214baa3d 429 wait_ms(100);
mitesh2patel 0:162e214baa3d 430 en = sendAck(0x00, 1 + i);
mitesh2patel 0:162e214baa3d 431 if (NoError != en) {
mitesh2patel 0:162e214baa3d 432 return en;
mitesh2patel 0:162e214baa3d 433 }
mitesh2patel 0:162e214baa3d 434 }
mitesh2patel 0:162e214baa3d 435
mitesh2patel 0:162e214baa3d 436 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 437 }
mitesh2patel 0:162e214baa3d 438
mitesh2patel 0:162e214baa3d 439 CameraC328::ErrorNumber CameraC328::sendInitial(ColorType ct, RawResolution rr, JpegResolution jr) {
mitesh2patel 0:162e214baa3d 440 char send[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 441
mitesh2patel 0:162e214baa3d 442 send[0] = 0xAA;
mitesh2patel 0:162e214baa3d 443 send[1] = 0x01;
mitesh2patel 0:162e214baa3d 444 send[2] = 0x00;
mitesh2patel 0:162e214baa3d 445 send[3] = (char)ct;
mitesh2patel 0:162e214baa3d 446 send[4] = (char)rr;
mitesh2patel 0:162e214baa3d 447 send[5] = (char)jr;
mitesh2patel 0:162e214baa3d 448
mitesh2patel 0:162e214baa3d 449 if (!SENDFUNC(send, sizeof(send))) {
mitesh2patel 0:162e214baa3d 450 return (ErrorNumber)SendRegisterTimeout;
mitesh2patel 0:162e214baa3d 451 }
mitesh2patel 0:162e214baa3d 452 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 453 }
mitesh2patel 0:162e214baa3d 454
mitesh2patel 0:162e214baa3d 455 CameraC328::ErrorNumber CameraC328::sendGetPicture(PictureType pt) {
mitesh2patel 0:162e214baa3d 456 char send[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 457
mitesh2patel 0:162e214baa3d 458 send[0] = 0xAA;
mitesh2patel 0:162e214baa3d 459 send[1] = 0x04;
mitesh2patel 0:162e214baa3d 460 send[2] = (char)pt;
mitesh2patel 0:162e214baa3d 461 send[3] = 0x00;
mitesh2patel 0:162e214baa3d 462 send[4] = 0x00;
mitesh2patel 0:162e214baa3d 463 send[5] = 0x00;
mitesh2patel 0:162e214baa3d 464
mitesh2patel 0:162e214baa3d 465 if (!SENDFUNC(send, sizeof(send))) {
mitesh2patel 0:162e214baa3d 466 return (ErrorNumber)SendRegisterTimeout;
mitesh2patel 0:162e214baa3d 467 }
mitesh2patel 0:162e214baa3d 468 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 469 }
mitesh2patel 0:162e214baa3d 470
mitesh2patel 0:162e214baa3d 471 CameraC328::ErrorNumber CameraC328::sendSnapshot(SnapshotType st, uint16_t skipFrames) {
mitesh2patel 0:162e214baa3d 472 char send[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 473 send[0] = 0xAA;
mitesh2patel 0:162e214baa3d 474 send[1] = 0x05;
mitesh2patel 0:162e214baa3d 475 send[2] = (char)st;
mitesh2patel 0:162e214baa3d 476 send[3] = (skipFrames >> 0) & 0xff;
mitesh2patel 0:162e214baa3d 477 send[4] = (skipFrames >> 8) & 0xff;
mitesh2patel 0:162e214baa3d 478 send[5] = 0x00;
mitesh2patel 0:162e214baa3d 479
mitesh2patel 0:162e214baa3d 480 if (!SENDFUNC(send, sizeof(send))) {
mitesh2patel 0:162e214baa3d 481 return (ErrorNumber)SendRegisterTimeout;
mitesh2patel 0:162e214baa3d 482 }
mitesh2patel 0:162e214baa3d 483 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 484 }
mitesh2patel 0:162e214baa3d 485
mitesh2patel 0:162e214baa3d 486 CameraC328::ErrorNumber CameraC328::sendSetPackageSize(uint16_t packageSize) {
mitesh2patel 0:162e214baa3d 487 char send[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 488 send[0] = 0xAA;
mitesh2patel 0:162e214baa3d 489 send[1] = 0x06;
mitesh2patel 0:162e214baa3d 490 send[2] = 0x08;
mitesh2patel 0:162e214baa3d 491 send[3] = (packageSize >> 0) & 0xff;
mitesh2patel 0:162e214baa3d 492 send[4] = (packageSize >> 8) & 0xff;
mitesh2patel 0:162e214baa3d 493 send[5] = 0x00;
mitesh2patel 0:162e214baa3d 494
mitesh2patel 0:162e214baa3d 495 if (!SENDFUNC(send, sizeof(send))) {
mitesh2patel 0:162e214baa3d 496 return (ErrorNumber)SendRegisterTimeout;
mitesh2patel 0:162e214baa3d 497 }
mitesh2patel 0:162e214baa3d 498 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 499 }
mitesh2patel 0:162e214baa3d 500
mitesh2patel 0:162e214baa3d 501 CameraC328::ErrorNumber CameraC328::sendSetBaudrate(Baud baud) {
mitesh2patel 0:162e214baa3d 502 char send[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 503
mitesh2patel 0:162e214baa3d 504 static struct baud_list {
mitesh2patel 0:162e214baa3d 505 Baud baud;
mitesh2patel 0:162e214baa3d 506 uint8_t div1st;
mitesh2patel 0:162e214baa3d 507 uint8_t div2nd;
mitesh2patel 0:162e214baa3d 508 } baudtable [] = {
mitesh2patel 0:162e214baa3d 509 { Baud7200, 0xff, 0x01 },
mitesh2patel 0:162e214baa3d 510 { Baud9600, 0xbf, 0x01 },
mitesh2patel 0:162e214baa3d 511 { Baud14400, 0x7f, 0x01 },
mitesh2patel 0:162e214baa3d 512 { Baud19200, 0x5f, 0x01 },
mitesh2patel 0:162e214baa3d 513 { Baud28800, 0x3f, 0x01 },
mitesh2patel 0:162e214baa3d 514 { Baud38400, 0x2f, 0x01 },
mitesh2patel 0:162e214baa3d 515 { Baud57600, 0x1f, 0x01 },
mitesh2patel 0:162e214baa3d 516 { Baud115200, 0x0f, 0x01 }
mitesh2patel 0:162e214baa3d 517 };
mitesh2patel 0:162e214baa3d 518
mitesh2patel 0:162e214baa3d 519 uint8_t div1st = 0x00, div2nd = 0x00;
mitesh2patel 0:162e214baa3d 520 struct baud_list *p = &baudtable[0];
mitesh2patel 0:162e214baa3d 521 for (int i = 0; i < sizeof(baudtable) / sizeof(baudtable[0]); i++) {
mitesh2patel 0:162e214baa3d 522 if (p->baud == baud) {
mitesh2patel 0:162e214baa3d 523 div1st = p->div1st;
mitesh2patel 0:162e214baa3d 524 div2nd = p->div2nd;
mitesh2patel 0:162e214baa3d 525 }
mitesh2patel 0:162e214baa3d 526 p++;
mitesh2patel 0:162e214baa3d 527 }
mitesh2patel 0:162e214baa3d 528
mitesh2patel 0:162e214baa3d 529 send[0] = 0xAA;
mitesh2patel 0:162e214baa3d 530 send[1] = 0x07;
mitesh2patel 0:162e214baa3d 531 send[2] = div1st;
mitesh2patel 0:162e214baa3d 532 send[3] = div2nd;
mitesh2patel 0:162e214baa3d 533 send[4] = 0x00;
mitesh2patel 0:162e214baa3d 534 send[5] = 0x00;
mitesh2patel 0:162e214baa3d 535
mitesh2patel 0:162e214baa3d 536 if (!SENDFUNC(send, sizeof(send))) {
mitesh2patel 0:162e214baa3d 537 return (ErrorNumber)SendRegisterTimeout;
mitesh2patel 0:162e214baa3d 538 }
mitesh2patel 0:162e214baa3d 539
mitesh2patel 0:162e214baa3d 540 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 541 }
mitesh2patel 0:162e214baa3d 542
mitesh2patel 0:162e214baa3d 543 CameraC328::ErrorNumber CameraC328::sendReset(ResetType rt, bool specialReset) {
mitesh2patel 0:162e214baa3d 544 char send[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 545 send[0] = 0xAA;
mitesh2patel 0:162e214baa3d 546 send[1] = 0x08;
mitesh2patel 0:162e214baa3d 547 send[2] = (int)rt;
mitesh2patel 0:162e214baa3d 548 send[3] = 0x00;
mitesh2patel 0:162e214baa3d 549 send[4] = 0x00;
mitesh2patel 0:162e214baa3d 550 send[5] = specialReset ? 0xff : 0x00;
mitesh2patel 0:162e214baa3d 551 /*
mitesh2patel 0:162e214baa3d 552 * Special reset : If the parameter is 0xFF, the command is a special Reset command and the firmware responds to it immediately.
mitesh2patel 0:162e214baa3d 553 */
mitesh2patel 0:162e214baa3d 554
mitesh2patel 0:162e214baa3d 555 if (!SENDFUNC(send, sizeof(send))) {
mitesh2patel 0:162e214baa3d 556 return (ErrorNumber)SendRegisterTimeout;
mitesh2patel 0:162e214baa3d 557 }
mitesh2patel 0:162e214baa3d 558
mitesh2patel 0:162e214baa3d 559 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 560 }
mitesh2patel 0:162e214baa3d 561
mitesh2patel 0:162e214baa3d 562 CameraC328::ErrorNumber CameraC328::sendPowerOff() {
mitesh2patel 0:162e214baa3d 563 char send[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 564 send[0] = 0xAA;
mitesh2patel 0:162e214baa3d 565 send[1] = 0x09;
mitesh2patel 0:162e214baa3d 566 send[2] = 0x00;
mitesh2patel 0:162e214baa3d 567 send[3] = 0x00;
mitesh2patel 0:162e214baa3d 568 send[4] = 0x00;
mitesh2patel 0:162e214baa3d 569 send[5] = 0x00;
mitesh2patel 0:162e214baa3d 570
mitesh2patel 0:162e214baa3d 571 if (!SENDFUNC(send, sizeof(send))) {
mitesh2patel 0:162e214baa3d 572 return (ErrorNumber)SendRegisterTimeout;
mitesh2patel 0:162e214baa3d 573 }
mitesh2patel 0:162e214baa3d 574
mitesh2patel 0:162e214baa3d 575 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 576 }
mitesh2patel 0:162e214baa3d 577
mitesh2patel 0:162e214baa3d 578 CameraC328::ErrorNumber CameraC328::recvData(DataType *dt, uint32_t *length) {
mitesh2patel 0:162e214baa3d 579 char recv[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 580 if (!RECVFUNC(recv, sizeof(recv))) {
mitesh2patel 0:162e214baa3d 581 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 582 }
mitesh2patel 0:162e214baa3d 583 if ((0xAA != recv[0]) || (0x0A != recv[1])) {
mitesh2patel 0:162e214baa3d 584 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 585 }
mitesh2patel 0:162e214baa3d 586 *dt = (DataType)recv[2];
mitesh2patel 0:162e214baa3d 587 *length = (recv[5] << 16) | (recv[4] << 8) | (recv[3] << 0);
mitesh2patel 0:162e214baa3d 588 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 589 }
mitesh2patel 0:162e214baa3d 590
mitesh2patel 0:162e214baa3d 591 CameraC328::ErrorNumber CameraC328::sendSync() {
mitesh2patel 0:162e214baa3d 592 char send[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 593 send[0] = 0xAA;
mitesh2patel 0:162e214baa3d 594 send[1] = 0x0D;
mitesh2patel 0:162e214baa3d 595 send[2] = 0x00;
mitesh2patel 0:162e214baa3d 596 send[3] = 0x00;
mitesh2patel 0:162e214baa3d 597 send[4] = 0x00;
mitesh2patel 0:162e214baa3d 598 send[5] = 0x00;
mitesh2patel 0:162e214baa3d 599 if (!SENDFUNC(send, sizeof(send))) {
mitesh2patel 0:162e214baa3d 600 return (ErrorNumber)SendRegisterTimeout;
mitesh2patel 0:162e214baa3d 601 }
mitesh2patel 0:162e214baa3d 602 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 603 }
mitesh2patel 0:162e214baa3d 604
mitesh2patel 0:162e214baa3d 605 CameraC328::ErrorNumber CameraC328::recvSync() {
mitesh2patel 0:162e214baa3d 606 char recv[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 607 if (!RECVFUNC(recv, sizeof(recv))) {
mitesh2patel 0:162e214baa3d 608 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 609 }
mitesh2patel 0:162e214baa3d 610 if ((0xAA != recv[0]) || (0x0D != recv[1])) {
mitesh2patel 0:162e214baa3d 611 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 612 }
mitesh2patel 0:162e214baa3d 613 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 614 }
mitesh2patel 0:162e214baa3d 615
mitesh2patel 0:162e214baa3d 616 /**
mitesh2patel 0:162e214baa3d 617 * Send ACK.
mitesh2patel 0:162e214baa3d 618 *
mitesh2patel 0:162e214baa3d 619 * @param commandId The command with that ID is acknowledged by this command.
mitesh2patel 0:162e214baa3d 620 * @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.
mitesh2patel 0:162e214baa3d 621 */
mitesh2patel 0:162e214baa3d 622 CameraC328::ErrorNumber CameraC328::sendAck(uint8_t commandId, uint16_t packageId) {
mitesh2patel 0:162e214baa3d 623 char send[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 624 send[0] = 0xAA;
mitesh2patel 0:162e214baa3d 625 send[1] = 0x0E;
mitesh2patel 0:162e214baa3d 626 send[2] = commandId;
mitesh2patel 0:162e214baa3d 627 send[3] = 0x00; // ACK counter is not used.
mitesh2patel 0:162e214baa3d 628 send[4] = (packageId >> 0) & 0xff;
mitesh2patel 0:162e214baa3d 629 send[5] = (packageId >> 8) & 0xff;
mitesh2patel 0:162e214baa3d 630 if (!SENDFUNC(send, sizeof(send))) {
mitesh2patel 0:162e214baa3d 631 return (ErrorNumber)SendRegisterTimeout;
mitesh2patel 0:162e214baa3d 632 }
mitesh2patel 0:162e214baa3d 633 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 634 }
mitesh2patel 0:162e214baa3d 635
mitesh2patel 0:162e214baa3d 636 /**
mitesh2patel 0:162e214baa3d 637 * Receive ACK or NCK.
mitesh2patel 0:162e214baa3d 638 *
mitesh2patel 0:162e214baa3d 639 * @return Error number.
mitesh2patel 0:162e214baa3d 640 */
mitesh2patel 0:162e214baa3d 641 CameraC328::ErrorNumber CameraC328::recvAckOrNck() {
mitesh2patel 0:162e214baa3d 642 char recv[COMMAND_LENGTH];
mitesh2patel 0:162e214baa3d 643 if (!RECVFUNC(recv, sizeof(recv))) {
mitesh2patel 0:162e214baa3d 644 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 645 }
mitesh2patel 0:162e214baa3d 646 if ((0xAA == recv[0]) && (0x0E == recv[1])) {
mitesh2patel 0:162e214baa3d 647 return (ErrorNumber)NoError;
mitesh2patel 0:162e214baa3d 648 }
mitesh2patel 0:162e214baa3d 649 if ((0xAA == recv[0]) && (0x0F == recv[1])) {
mitesh2patel 0:162e214baa3d 650 return (ErrorNumber)recv[4];
mitesh2patel 0:162e214baa3d 651 }
mitesh2patel 0:162e214baa3d 652 return (ErrorNumber)UnexpectedReply;
mitesh2patel 0:162e214baa3d 653 }
mitesh2patel 0:162e214baa3d 654
mitesh2patel 0:162e214baa3d 655 /**
mitesh2patel 0:162e214baa3d 656 * Send bytes to camera module.
mitesh2patel 0:162e214baa3d 657 *
mitesh2patel 0:162e214baa3d 658 * @param buf Pointer to the data buffer.
mitesh2patel 0:162e214baa3d 659 * @param len Length of the data buffer.
mitesh2patel 0:162e214baa3d 660 *
mitesh2patel 0:162e214baa3d 661 * @return True if the data sended.
mitesh2patel 0:162e214baa3d 662 */
mitesh2patel 0:162e214baa3d 663 bool CameraC328::sendBytes(char *buf, size_t len, int timeout_us) {
mitesh2patel 0:162e214baa3d 664 for (uint32_t i = 0; i < (uint32_t)len; i++) {
mitesh2patel 0:162e214baa3d 665 int cnt = 0;
mitesh2patel 0:162e214baa3d 666 while (!serial.writeable()) {
mitesh2patel 0:162e214baa3d 667 wait_us(1);
mitesh2patel 0:162e214baa3d 668 cnt++;
mitesh2patel 0:162e214baa3d 669 if (timeout_us < cnt) {
mitesh2patel 0:162e214baa3d 670 return false;
mitesh2patel 0:162e214baa3d 671 }
mitesh2patel 0:162e214baa3d 672 }
mitesh2patel 0:162e214baa3d 673 serial.putc(buf[i]);
mitesh2patel 0:162e214baa3d 674 }
mitesh2patel 0:162e214baa3d 675 return true;
mitesh2patel 0:162e214baa3d 676 }
mitesh2patel 0:162e214baa3d 677
mitesh2patel 0:162e214baa3d 678 /**
mitesh2patel 0:162e214baa3d 679 * Receive bytes from camera module.
mitesh2patel 0:162e214baa3d 680 *
mitesh2patel 0:162e214baa3d 681 * @param buf Pointer to the data buffer.
mitesh2patel 0:162e214baa3d 682 * @param len Length of the data buffer.
mitesh2patel 0:162e214baa3d 683 *
mitesh2patel 0:162e214baa3d 684 * @return True if the data received.
mitesh2patel 0:162e214baa3d 685 */
mitesh2patel 0:162e214baa3d 686 bool CameraC328::recvBytes(char *buf, size_t len, int timeout_us) {
mitesh2patel 0:162e214baa3d 687 for (uint32_t i = 0; i < (uint32_t)len; i++) {
mitesh2patel 0:162e214baa3d 688 int cnt = 0;
mitesh2patel 0:162e214baa3d 689 while (!serial.readable()) {
mitesh2patel 0:162e214baa3d 690 wait_us(1);
mitesh2patel 0:162e214baa3d 691 cnt++;
mitesh2patel 0:162e214baa3d 692 if (timeout_us < cnt) {
mitesh2patel 0:162e214baa3d 693 return false;
mitesh2patel 0:162e214baa3d 694 }
mitesh2patel 0:162e214baa3d 695 }
mitesh2patel 0:162e214baa3d 696 buf[i] = serial.getc();
mitesh2patel 0:162e214baa3d 697 }
mitesh2patel 0:162e214baa3d 698 return true;
mitesh2patel 0:162e214baa3d 699 }
mitesh2patel 0:162e214baa3d 700
mitesh2patel 0:162e214baa3d 701 /**
mitesh2patel 0:162e214baa3d 702 * Wait received.
mitesh2patel 0:162e214baa3d 703 *
mitesh2patel 0:162e214baa3d 704 * @return True if the data received.
mitesh2patel 0:162e214baa3d 705 */
mitesh2patel 0:162e214baa3d 706 bool CameraC328::waitRecv() {
mitesh2patel 0:162e214baa3d 707 while (!serial.readable()) {
mitesh2patel 0:162e214baa3d 708 }
mitesh2patel 0:162e214baa3d 709 return true;
mitesh2patel 0:162e214baa3d 710 }
mitesh2patel 0:162e214baa3d 711
mitesh2patel 0:162e214baa3d 712 /**
mitesh2patel 0:162e214baa3d 713 * Wait idle state.
mitesh2patel 0:162e214baa3d 714 */
mitesh2patel 0:162e214baa3d 715 bool CameraC328::waitIdle() {
mitesh2patel 0:162e214baa3d 716 while (serial.readable()) {
mitesh2patel 0:162e214baa3d 717 serial.getc();
mitesh2patel 0:162e214baa3d 718 }
mitesh2patel 0:162e214baa3d 719 return true;
mitesh2patel 0:162e214baa3d 720 }