add printf in snapshot to confirm the running

Dependents:   Camera_C328_HTTP_SDcard_file_server_WIZwiki-W7500

Fork of CameraC328 by Shinichiro Nakamura

Committer:
IOP
Date:
Wed Aug 05 23:52:09 2015 +0000
Revision:
16:483cfd88da75
Parent:
15:49cfda6c547f
add printf in snapshot to confirm the running

Who changed what in which revision?

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