CameraC328

Dependents:   CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more

Committer:
shintamainjp
Date:
Wed Oct 13 10:45:29 2010 +0000
Revision:
15:49cfda6c547f

        

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);
shintamainjp 15:49cfda6c547f 273 for (int i = 0; i <= (int)pkg_total; i++) {
shintamainjp 15:49cfda6c547f 274 uint16_t checksum = 0;
shintamainjp 15:49cfda6c547f 275 // ID.
shintamainjp 15:49cfda6c547f 276 char idbuf[2];
shintamainjp 15:49cfda6c547f 277 WAITFUNC();
shintamainjp 15:49cfda6c547f 278 if (!RECVFUNC(idbuf, sizeof(idbuf))) {
shintamainjp 15:49cfda6c547f 279 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 280 }
shintamainjp 15:49cfda6c547f 281 checksum += idbuf[0];
shintamainjp 15:49cfda6c547f 282 checksum += idbuf[1];
shintamainjp 15:49cfda6c547f 283 uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
shintamainjp 15:49cfda6c547f 284 if (id != i) {
shintamainjp 15:49cfda6c547f 285 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 286 }
shintamainjp 15:49cfda6c547f 287
shintamainjp 15:49cfda6c547f 288 // Size of the data.
shintamainjp 15:49cfda6c547f 289 char dsbuf[2];
shintamainjp 15:49cfda6c547f 290 WAITFUNC();
shintamainjp 15:49cfda6c547f 291 if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
shintamainjp 15:49cfda6c547f 292 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 293 }
shintamainjp 15:49cfda6c547f 294
shintamainjp 15:49cfda6c547f 295 // Received the data.
shintamainjp 15:49cfda6c547f 296 checksum += dsbuf[0];
shintamainjp 15:49cfda6c547f 297 checksum += dsbuf[1];
shintamainjp 15:49cfda6c547f 298 uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
shintamainjp 15:49cfda6c547f 299 WAITFUNC();
shintamainjp 15:49cfda6c547f 300 if (!RECVFUNC(&databuf[0], ds)) {
shintamainjp 15:49cfda6c547f 301 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 302 }
shintamainjp 15:49cfda6c547f 303 for (int j = 0; j < ds; j++) {
shintamainjp 15:49cfda6c547f 304 checksum += databuf[j];
shintamainjp 15:49cfda6c547f 305 }
shintamainjp 15:49cfda6c547f 306
shintamainjp 15:49cfda6c547f 307 // Verify code.
shintamainjp 15:49cfda6c547f 308 char vcbuf[2];
shintamainjp 15:49cfda6c547f 309 WAITFUNC();
shintamainjp 15:49cfda6c547f 310 if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
shintamainjp 15:49cfda6c547f 311 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 312 }
shintamainjp 15:49cfda6c547f 313 uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
shintamainjp 15:49cfda6c547f 314 if (vc != (checksum & 0xff)) {
shintamainjp 15:49cfda6c547f 315 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 316 }
shintamainjp 15:49cfda6c547f 317
shintamainjp 15:49cfda6c547f 318 /*
shintamainjp 15:49cfda6c547f 319 * Call a call back function.
shintamainjp 15:49cfda6c547f 320 * You can block this function while working.
shintamainjp 15:49cfda6c547f 321 */
shintamainjp 15:49cfda6c547f 322 func(databuf, ds);
shintamainjp 15:49cfda6c547f 323
shintamainjp 15:49cfda6c547f 324 /*
shintamainjp 15:49cfda6c547f 325 * We should wait for camera working before reply a ACK.
shintamainjp 15:49cfda6c547f 326 */
shintamainjp 15:49cfda6c547f 327 wait_ms(100);
shintamainjp 15:49cfda6c547f 328 en = sendAck(0x00, 1 + i);
shintamainjp 15:49cfda6c547f 329 if (NoError != en) {
shintamainjp 15:49cfda6c547f 330 return en;
shintamainjp 15:49cfda6c547f 331 }
shintamainjp 15:49cfda6c547f 332 }
shintamainjp 15:49cfda6c547f 333
shintamainjp 15:49cfda6c547f 334 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 335 }
shintamainjp 15:49cfda6c547f 336
shintamainjp 15:49cfda6c547f 337 /**
shintamainjp 15:49cfda6c547f 338 * Get JPEG preview picture.
shintamainjp 15:49cfda6c547f 339 *
shintamainjp 15:49cfda6c547f 340 * @param func A pointer to a callback function.
shintamainjp 15:49cfda6c547f 341 * You can block this function until saving the image datas.
shintamainjp 15:49cfda6c547f 342 * @return Status of the error.
shintamainjp 15:49cfda6c547f 343 */
shintamainjp 15:49cfda6c547f 344 CameraC328::ErrorNumber CameraC328::getJpegPreviewPicture(void(*func)(char *buf, size_t siz)) {
shintamainjp 15:49cfda6c547f 345 WAITIDLE();
shintamainjp 15:49cfda6c547f 346 ErrorNumber en;
shintamainjp 15:49cfda6c547f 347
shintamainjp 15:49cfda6c547f 348 en = sendGetPicture(JpegPreviewPicture);
shintamainjp 15:49cfda6c547f 349 if (NoError != en) {
shintamainjp 15:49cfda6c547f 350 return en;
shintamainjp 15:49cfda6c547f 351 }
shintamainjp 15:49cfda6c547f 352 WAITFUNC();
shintamainjp 15:49cfda6c547f 353 en = recvAckOrNck();
shintamainjp 15:49cfda6c547f 354 if (NoError != en) {
shintamainjp 15:49cfda6c547f 355 return en;
shintamainjp 15:49cfda6c547f 356 }
shintamainjp 15:49cfda6c547f 357
shintamainjp 15:49cfda6c547f 358 /*
shintamainjp 15:49cfda6c547f 359 * Data : JPEG preview picture
shintamainjp 15:49cfda6c547f 360 */
shintamainjp 15:49cfda6c547f 361 DataType dt;
shintamainjp 15:49cfda6c547f 362 uint32_t length = 0;
shintamainjp 15:49cfda6c547f 363 WAITFUNC();
shintamainjp 15:49cfda6c547f 364 en = recvData(&dt, &length);
shintamainjp 15:49cfda6c547f 365 if (NoError != en) {
shintamainjp 15:49cfda6c547f 366 return en;
shintamainjp 15:49cfda6c547f 367 }
shintamainjp 15:49cfda6c547f 368 en = sendAck(0x00, 0);
shintamainjp 15:49cfda6c547f 369 if (NoError != en) {
shintamainjp 15:49cfda6c547f 370 return en;
shintamainjp 15:49cfda6c547f 371 }
shintamainjp 15:49cfda6c547f 372
shintamainjp 15:49cfda6c547f 373 char databuf[packageSize - 6];
shintamainjp 15:49cfda6c547f 374 uint16_t pkg_total = length / (packageSize - 6);
shintamainjp 15:49cfda6c547f 375 for (int i = 0; i <= (int)pkg_total; i++) {
shintamainjp 15:49cfda6c547f 376 uint16_t checksum = 0;
shintamainjp 15:49cfda6c547f 377 // ID.
shintamainjp 15:49cfda6c547f 378 char idbuf[2];
shintamainjp 15:49cfda6c547f 379 WAITFUNC();
shintamainjp 15:49cfda6c547f 380 if (!RECVFUNC(idbuf, sizeof(idbuf))) {
shintamainjp 15:49cfda6c547f 381 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 382 }
shintamainjp 15:49cfda6c547f 383 checksum += idbuf[0];
shintamainjp 15:49cfda6c547f 384 checksum += idbuf[1];
shintamainjp 15:49cfda6c547f 385 uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
shintamainjp 15:49cfda6c547f 386 if (id != i) {
shintamainjp 15:49cfda6c547f 387 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 388 }
shintamainjp 15:49cfda6c547f 389
shintamainjp 15:49cfda6c547f 390 // Size of the data.
shintamainjp 15:49cfda6c547f 391 char dsbuf[2];
shintamainjp 15:49cfda6c547f 392 WAITFUNC();
shintamainjp 15:49cfda6c547f 393 if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
shintamainjp 15:49cfda6c547f 394 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 395 }
shintamainjp 15:49cfda6c547f 396
shintamainjp 15:49cfda6c547f 397 // Received the data.
shintamainjp 15:49cfda6c547f 398 checksum += dsbuf[0];
shintamainjp 15:49cfda6c547f 399 checksum += dsbuf[1];
shintamainjp 15:49cfda6c547f 400 uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
shintamainjp 15:49cfda6c547f 401 WAITFUNC();
shintamainjp 15:49cfda6c547f 402 if (!RECVFUNC(&databuf[0], ds)) {
shintamainjp 15:49cfda6c547f 403 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 404 }
shintamainjp 15:49cfda6c547f 405 for (int j = 0; j < ds; j++) {
shintamainjp 15:49cfda6c547f 406 checksum += databuf[j];
shintamainjp 15:49cfda6c547f 407 }
shintamainjp 15:49cfda6c547f 408
shintamainjp 15:49cfda6c547f 409 // Verify code.
shintamainjp 15:49cfda6c547f 410 char vcbuf[2];
shintamainjp 15:49cfda6c547f 411 WAITFUNC();
shintamainjp 15:49cfda6c547f 412 if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
shintamainjp 15:49cfda6c547f 413 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 414 }
shintamainjp 15:49cfda6c547f 415 uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
shintamainjp 15:49cfda6c547f 416 if (vc != (checksum & 0xff)) {
shintamainjp 15:49cfda6c547f 417 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 418 }
shintamainjp 15:49cfda6c547f 419
shintamainjp 15:49cfda6c547f 420 /*
shintamainjp 15:49cfda6c547f 421 * Call a call back function.
shintamainjp 15:49cfda6c547f 422 * You can block this function while working.
shintamainjp 15:49cfda6c547f 423 */
shintamainjp 15:49cfda6c547f 424 func(databuf, ds);
shintamainjp 15:49cfda6c547f 425
shintamainjp 15:49cfda6c547f 426 /*
shintamainjp 15:49cfda6c547f 427 * We should wait for camera working before reply a ACK.
shintamainjp 15:49cfda6c547f 428 */
shintamainjp 15:49cfda6c547f 429 wait_ms(100);
shintamainjp 15:49cfda6c547f 430 en = sendAck(0x00, 1 + i);
shintamainjp 15:49cfda6c547f 431 if (NoError != en) {
shintamainjp 15:49cfda6c547f 432 return en;
shintamainjp 15:49cfda6c547f 433 }
shintamainjp 15:49cfda6c547f 434 }
shintamainjp 15:49cfda6c547f 435
shintamainjp 15:49cfda6c547f 436 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 437 }
shintamainjp 15:49cfda6c547f 438
shintamainjp 15:49cfda6c547f 439 CameraC328::ErrorNumber CameraC328::sendInitial(ColorType ct, RawResolution rr, JpegResolution jr) {
shintamainjp 15:49cfda6c547f 440 char send[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 441
shintamainjp 15:49cfda6c547f 442 send[0] = 0xAA;
shintamainjp 15:49cfda6c547f 443 send[1] = 0x01;
shintamainjp 15:49cfda6c547f 444 send[2] = 0x00;
shintamainjp 15:49cfda6c547f 445 send[3] = (char)ct;
shintamainjp 15:49cfda6c547f 446 send[4] = (char)rr;
shintamainjp 15:49cfda6c547f 447 send[5] = (char)jr;
shintamainjp 15:49cfda6c547f 448
shintamainjp 15:49cfda6c547f 449 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 15:49cfda6c547f 450 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 15:49cfda6c547f 451 }
shintamainjp 15:49cfda6c547f 452 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 453 }
shintamainjp 15:49cfda6c547f 454
shintamainjp 15:49cfda6c547f 455 CameraC328::ErrorNumber CameraC328::sendGetPicture(PictureType pt) {
shintamainjp 15:49cfda6c547f 456 char send[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 457
shintamainjp 15:49cfda6c547f 458 send[0] = 0xAA;
shintamainjp 15:49cfda6c547f 459 send[1] = 0x04;
shintamainjp 15:49cfda6c547f 460 send[2] = (char)pt;
shintamainjp 15:49cfda6c547f 461 send[3] = 0x00;
shintamainjp 15:49cfda6c547f 462 send[4] = 0x00;
shintamainjp 15:49cfda6c547f 463 send[5] = 0x00;
shintamainjp 15:49cfda6c547f 464
shintamainjp 15:49cfda6c547f 465 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 15:49cfda6c547f 466 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 15:49cfda6c547f 467 }
shintamainjp 15:49cfda6c547f 468 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 469 }
shintamainjp 15:49cfda6c547f 470
shintamainjp 15:49cfda6c547f 471 CameraC328::ErrorNumber CameraC328::sendSnapshot(SnapshotType st, uint16_t skipFrames) {
shintamainjp 15:49cfda6c547f 472 char send[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 473 send[0] = 0xAA;
shintamainjp 15:49cfda6c547f 474 send[1] = 0x05;
shintamainjp 15:49cfda6c547f 475 send[2] = (char)st;
shintamainjp 15:49cfda6c547f 476 send[3] = (skipFrames >> 0) & 0xff;
shintamainjp 15:49cfda6c547f 477 send[4] = (skipFrames >> 8) & 0xff;
shintamainjp 15:49cfda6c547f 478 send[5] = 0x00;
shintamainjp 15:49cfda6c547f 479
shintamainjp 15:49cfda6c547f 480 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 15:49cfda6c547f 481 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 15:49cfda6c547f 482 }
shintamainjp 15:49cfda6c547f 483 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 484 }
shintamainjp 15:49cfda6c547f 485
shintamainjp 15:49cfda6c547f 486 CameraC328::ErrorNumber CameraC328::sendSetPackageSize(uint16_t packageSize) {
shintamainjp 15:49cfda6c547f 487 char send[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 488 send[0] = 0xAA;
shintamainjp 15:49cfda6c547f 489 send[1] = 0x06;
shintamainjp 15:49cfda6c547f 490 send[2] = 0x08;
shintamainjp 15:49cfda6c547f 491 send[3] = (packageSize >> 0) & 0xff;
shintamainjp 15:49cfda6c547f 492 send[4] = (packageSize >> 8) & 0xff;
shintamainjp 15:49cfda6c547f 493 send[5] = 0x00;
shintamainjp 15:49cfda6c547f 494
shintamainjp 15:49cfda6c547f 495 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 15:49cfda6c547f 496 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 15:49cfda6c547f 497 }
shintamainjp 15:49cfda6c547f 498 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 499 }
shintamainjp 15:49cfda6c547f 500
shintamainjp 15:49cfda6c547f 501 CameraC328::ErrorNumber CameraC328::sendSetBaudrate(Baud baud) {
shintamainjp 15:49cfda6c547f 502 char send[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 503
shintamainjp 15:49cfda6c547f 504 static struct baud_list {
shintamainjp 15:49cfda6c547f 505 Baud baud;
shintamainjp 15:49cfda6c547f 506 uint8_t div1st;
shintamainjp 15:49cfda6c547f 507 uint8_t div2nd;
shintamainjp 15:49cfda6c547f 508 } baudtable [] = {
shintamainjp 15:49cfda6c547f 509 { Baud7200, 0xff, 0x01 },
shintamainjp 15:49cfda6c547f 510 { Baud9600, 0xbf, 0x01 },
shintamainjp 15:49cfda6c547f 511 { Baud14400, 0x7f, 0x01 },
shintamainjp 15:49cfda6c547f 512 { Baud19200, 0x5f, 0x01 },
shintamainjp 15:49cfda6c547f 513 { Baud28800, 0x3f, 0x01 },
shintamainjp 15:49cfda6c547f 514 { Baud38400, 0x2f, 0x01 },
shintamainjp 15:49cfda6c547f 515 { Baud57600, 0x1f, 0x01 },
shintamainjp 15:49cfda6c547f 516 { Baud115200, 0x0f, 0x01 }
shintamainjp 15:49cfda6c547f 517 };
shintamainjp 15:49cfda6c547f 518
shintamainjp 15:49cfda6c547f 519 uint8_t div1st = 0x00, div2nd = 0x00;
shintamainjp 15:49cfda6c547f 520 struct baud_list *p = &baudtable[0];
shintamainjp 15:49cfda6c547f 521 for (int i = 0; i < sizeof(baudtable) / sizeof(baudtable[0]); i++) {
shintamainjp 15:49cfda6c547f 522 if (p->baud == baud) {
shintamainjp 15:49cfda6c547f 523 div1st = p->div1st;
shintamainjp 15:49cfda6c547f 524 div2nd = p->div2nd;
shintamainjp 15:49cfda6c547f 525 }
shintamainjp 15:49cfda6c547f 526 p++;
shintamainjp 15:49cfda6c547f 527 }
shintamainjp 15:49cfda6c547f 528
shintamainjp 15:49cfda6c547f 529 send[0] = 0xAA;
shintamainjp 15:49cfda6c547f 530 send[1] = 0x07;
shintamainjp 15:49cfda6c547f 531 send[2] = div1st;
shintamainjp 15:49cfda6c547f 532 send[3] = div2nd;
shintamainjp 15:49cfda6c547f 533 send[4] = 0x00;
shintamainjp 15:49cfda6c547f 534 send[5] = 0x00;
shintamainjp 15:49cfda6c547f 535
shintamainjp 15:49cfda6c547f 536 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 15:49cfda6c547f 537 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 15:49cfda6c547f 538 }
shintamainjp 15:49cfda6c547f 539
shintamainjp 15:49cfda6c547f 540 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 541 }
shintamainjp 15:49cfda6c547f 542
shintamainjp 15:49cfda6c547f 543 CameraC328::ErrorNumber CameraC328::sendReset(ResetType rt, bool specialReset) {
shintamainjp 15:49cfda6c547f 544 char send[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 545 send[0] = 0xAA;
shintamainjp 15:49cfda6c547f 546 send[1] = 0x08;
shintamainjp 15:49cfda6c547f 547 send[2] = (int)rt;
shintamainjp 15:49cfda6c547f 548 send[3] = 0x00;
shintamainjp 15:49cfda6c547f 549 send[4] = 0x00;
shintamainjp 15:49cfda6c547f 550 send[5] = specialReset ? 0xff : 0x00;
shintamainjp 15:49cfda6c547f 551 /*
shintamainjp 15:49cfda6c547f 552 * Special reset : If the parameter is 0xFF, the command is a special Reset command and the firmware responds to it immediately.
shintamainjp 15:49cfda6c547f 553 */
shintamainjp 15:49cfda6c547f 554
shintamainjp 15:49cfda6c547f 555 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 15:49cfda6c547f 556 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 15:49cfda6c547f 557 }
shintamainjp 15:49cfda6c547f 558
shintamainjp 15:49cfda6c547f 559 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 560 }
shintamainjp 15:49cfda6c547f 561
shintamainjp 15:49cfda6c547f 562 CameraC328::ErrorNumber CameraC328::sendPowerOff() {
shintamainjp 15:49cfda6c547f 563 char send[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 564 send[0] = 0xAA;
shintamainjp 15:49cfda6c547f 565 send[1] = 0x09;
shintamainjp 15:49cfda6c547f 566 send[2] = 0x00;
shintamainjp 15:49cfda6c547f 567 send[3] = 0x00;
shintamainjp 15:49cfda6c547f 568 send[4] = 0x00;
shintamainjp 15:49cfda6c547f 569 send[5] = 0x00;
shintamainjp 15:49cfda6c547f 570
shintamainjp 15:49cfda6c547f 571 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 15:49cfda6c547f 572 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 15:49cfda6c547f 573 }
shintamainjp 15:49cfda6c547f 574
shintamainjp 15:49cfda6c547f 575 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 576 }
shintamainjp 15:49cfda6c547f 577
shintamainjp 15:49cfda6c547f 578 CameraC328::ErrorNumber CameraC328::recvData(DataType *dt, uint32_t *length) {
shintamainjp 15:49cfda6c547f 579 char recv[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 580 if (!RECVFUNC(recv, sizeof(recv))) {
shintamainjp 15:49cfda6c547f 581 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 582 }
shintamainjp 15:49cfda6c547f 583 if ((0xAA != recv[0]) || (0x0A != recv[1])) {
shintamainjp 15:49cfda6c547f 584 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 585 }
shintamainjp 15:49cfda6c547f 586 *dt = (DataType)recv[2];
shintamainjp 15:49cfda6c547f 587 *length = (recv[5] << 16) | (recv[4] << 8) | (recv[3] << 0);
shintamainjp 15:49cfda6c547f 588 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 589 }
shintamainjp 15:49cfda6c547f 590
shintamainjp 15:49cfda6c547f 591 CameraC328::ErrorNumber CameraC328::sendSync() {
shintamainjp 15:49cfda6c547f 592 char send[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 593 send[0] = 0xAA;
shintamainjp 15:49cfda6c547f 594 send[1] = 0x0D;
shintamainjp 15:49cfda6c547f 595 send[2] = 0x00;
shintamainjp 15:49cfda6c547f 596 send[3] = 0x00;
shintamainjp 15:49cfda6c547f 597 send[4] = 0x00;
shintamainjp 15:49cfda6c547f 598 send[5] = 0x00;
shintamainjp 15:49cfda6c547f 599 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 15:49cfda6c547f 600 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 15:49cfda6c547f 601 }
shintamainjp 15:49cfda6c547f 602 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 603 }
shintamainjp 15:49cfda6c547f 604
shintamainjp 15:49cfda6c547f 605 CameraC328::ErrorNumber CameraC328::recvSync() {
shintamainjp 15:49cfda6c547f 606 char recv[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 607 if (!RECVFUNC(recv, sizeof(recv))) {
shintamainjp 15:49cfda6c547f 608 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 609 }
shintamainjp 15:49cfda6c547f 610 if ((0xAA != recv[0]) || (0x0D != recv[1])) {
shintamainjp 15:49cfda6c547f 611 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 612 }
shintamainjp 15:49cfda6c547f 613 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 614 }
shintamainjp 15:49cfda6c547f 615
shintamainjp 15:49cfda6c547f 616 /**
shintamainjp 15:49cfda6c547f 617 * Send ACK.
shintamainjp 15:49cfda6c547f 618 *
shintamainjp 15:49cfda6c547f 619 * @param commandId The command with that ID is acknowledged by this command.
shintamainjp 15:49cfda6c547f 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.
shintamainjp 15:49cfda6c547f 621 */
shintamainjp 15:49cfda6c547f 622 CameraC328::ErrorNumber CameraC328::sendAck(uint8_t commandId, uint16_t packageId) {
shintamainjp 15:49cfda6c547f 623 char send[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 624 send[0] = 0xAA;
shintamainjp 15:49cfda6c547f 625 send[1] = 0x0E;
shintamainjp 15:49cfda6c547f 626 send[2] = commandId;
shintamainjp 15:49cfda6c547f 627 send[3] = 0x00; // ACK counter is not used.
shintamainjp 15:49cfda6c547f 628 send[4] = (packageId >> 0) & 0xff;
shintamainjp 15:49cfda6c547f 629 send[5] = (packageId >> 8) & 0xff;
shintamainjp 15:49cfda6c547f 630 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 15:49cfda6c547f 631 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 15:49cfda6c547f 632 }
shintamainjp 15:49cfda6c547f 633 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 634 }
shintamainjp 15:49cfda6c547f 635
shintamainjp 15:49cfda6c547f 636 /**
shintamainjp 15:49cfda6c547f 637 * Receive ACK or NCK.
shintamainjp 15:49cfda6c547f 638 *
shintamainjp 15:49cfda6c547f 639 * @return Error number.
shintamainjp 15:49cfda6c547f 640 */
shintamainjp 15:49cfda6c547f 641 CameraC328::ErrorNumber CameraC328::recvAckOrNck() {
shintamainjp 15:49cfda6c547f 642 char recv[COMMAND_LENGTH];
shintamainjp 15:49cfda6c547f 643 if (!RECVFUNC(recv, sizeof(recv))) {
shintamainjp 15:49cfda6c547f 644 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 645 }
shintamainjp 15:49cfda6c547f 646 if ((0xAA == recv[0]) && (0x0E == recv[1])) {
shintamainjp 15:49cfda6c547f 647 return (ErrorNumber)NoError;
shintamainjp 15:49cfda6c547f 648 }
shintamainjp 15:49cfda6c547f 649 if ((0xAA == recv[0]) && (0x0F == recv[1])) {
shintamainjp 15:49cfda6c547f 650 return (ErrorNumber)recv[4];
shintamainjp 15:49cfda6c547f 651 }
shintamainjp 15:49cfda6c547f 652 return (ErrorNumber)UnexpectedReply;
shintamainjp 15:49cfda6c547f 653 }
shintamainjp 15:49cfda6c547f 654
shintamainjp 15:49cfda6c547f 655 /**
shintamainjp 15:49cfda6c547f 656 * Send bytes to camera module.
shintamainjp 15:49cfda6c547f 657 *
shintamainjp 15:49cfda6c547f 658 * @param buf Pointer to the data buffer.
shintamainjp 15:49cfda6c547f 659 * @param len Length of the data buffer.
shintamainjp 15:49cfda6c547f 660 *
shintamainjp 15:49cfda6c547f 661 * @return True if the data sended.
shintamainjp 15:49cfda6c547f 662 */
shintamainjp 15:49cfda6c547f 663 bool CameraC328::sendBytes(char *buf, size_t len, int timeout_us) {
shintamainjp 15:49cfda6c547f 664 for (uint32_t i = 0; i < (uint32_t)len; i++) {
shintamainjp 15:49cfda6c547f 665 int cnt = 0;
shintamainjp 15:49cfda6c547f 666 while (!serial.writeable()) {
shintamainjp 15:49cfda6c547f 667 wait_us(1);
shintamainjp 15:49cfda6c547f 668 cnt++;
shintamainjp 15:49cfda6c547f 669 if (timeout_us < cnt) {
shintamainjp 15:49cfda6c547f 670 return false;
shintamainjp 15:49cfda6c547f 671 }
shintamainjp 15:49cfda6c547f 672 }
shintamainjp 15:49cfda6c547f 673 serial.putc(buf[i]);
shintamainjp 15:49cfda6c547f 674 }
shintamainjp 15:49cfda6c547f 675 return true;
shintamainjp 15:49cfda6c547f 676 }
shintamainjp 15:49cfda6c547f 677
shintamainjp 15:49cfda6c547f 678 /**
shintamainjp 15:49cfda6c547f 679 * Receive bytes from camera module.
shintamainjp 15:49cfda6c547f 680 *
shintamainjp 15:49cfda6c547f 681 * @param buf Pointer to the data buffer.
shintamainjp 15:49cfda6c547f 682 * @param len Length of the data buffer.
shintamainjp 15:49cfda6c547f 683 *
shintamainjp 15:49cfda6c547f 684 * @return True if the data received.
shintamainjp 15:49cfda6c547f 685 */
shintamainjp 15:49cfda6c547f 686 bool CameraC328::recvBytes(char *buf, size_t len, int timeout_us) {
shintamainjp 15:49cfda6c547f 687 for (uint32_t i = 0; i < (uint32_t)len; i++) {
shintamainjp 15:49cfda6c547f 688 int cnt = 0;
shintamainjp 15:49cfda6c547f 689 while (!serial.readable()) {
shintamainjp 15:49cfda6c547f 690 wait_us(1);
shintamainjp 15:49cfda6c547f 691 cnt++;
shintamainjp 15:49cfda6c547f 692 if (timeout_us < cnt) {
shintamainjp 15:49cfda6c547f 693 return false;
shintamainjp 15:49cfda6c547f 694 }
shintamainjp 15:49cfda6c547f 695 }
shintamainjp 15:49cfda6c547f 696 buf[i] = serial.getc();
shintamainjp 15:49cfda6c547f 697 }
shintamainjp 15:49cfda6c547f 698 return true;
shintamainjp 15:49cfda6c547f 699 }
shintamainjp 15:49cfda6c547f 700
shintamainjp 15:49cfda6c547f 701 /**
shintamainjp 15:49cfda6c547f 702 * Wait received.
shintamainjp 15:49cfda6c547f 703 *
shintamainjp 15:49cfda6c547f 704 * @return True if the data received.
shintamainjp 15:49cfda6c547f 705 */
shintamainjp 15:49cfda6c547f 706 bool CameraC328::waitRecv() {
shintamainjp 15:49cfda6c547f 707 while (!serial.readable()) {
shintamainjp 15:49cfda6c547f 708 }
shintamainjp 15:49cfda6c547f 709 return true;
shintamainjp 15:49cfda6c547f 710 }
shintamainjp 15:49cfda6c547f 711
shintamainjp 15:49cfda6c547f 712 /**
shintamainjp 15:49cfda6c547f 713 * Wait idle state.
shintamainjp 15:49cfda6c547f 714 */
shintamainjp 15:49cfda6c547f 715 bool CameraC328::waitIdle() {
shintamainjp 15:49cfda6c547f 716 while (serial.readable()) {
shintamainjp 15:49cfda6c547f 717 serial.getc();
shintamainjp 15:49cfda6c547f 718 }
shintamainjp 15:49cfda6c547f 719 return true;
shintamainjp 15:49cfda6c547f 720 }