CameraC328

Dependents:   CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more

Files at this revision

API Documentation at this revision

Comitter:
shintamainjp
Date:
Sun Jun 27 05:04:04 2010 +0000
Parent:
0:7e51c3176eb7
Child:
2:6a72fcad5c0a
Commit message:

Changed in this revision

CameraC328.cpp Show annotated file Show diff for this revision Revisions of this file
CameraC328.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/CameraC328.cpp	Sun Jun 27 03:36:10 2010 +0000
+++ b/CameraC328.cpp	Sun Jun 27 05:04:04 2010 +0000
@@ -1,310 +1,303 @@
-#include "CameraC328.h"
-
-Serial debout(USBTX, USBRX);
-
-#if 1
-#define SENDFUNC    sendBytesWithDebugOutput
-#define RECVFUNC    recvBytesWithDebugOutput
-#else
-#define SENDFUNC    sendBytes
-#define RECVFUNC    recvBytes
-#endif
-
-CameraC328::CameraC328(PinName tx, PinName rx) : serial(tx, rx) {
-    serial.baud(BAUD);
-}
-
-CameraC328::~CameraC328() {
-}
-
-CameraC328::ErrorNumber CameraC328::sync() {
-    char send[COMMAND_LENGTH];
-    char recv[COMMAND_LENGTH];
-    send[0] = 0xAA;
-    send[1] = 0x0D;
-    send[2] = 0;
-    send[3] = 0;
-    send[4] = 0;
-    send[5] = 0;
-    for (int i = 0; i < SYNCMAX; i++) {
-        if (SENDFUNC(send, sizeof(send))) {
-            if (RECVFUNC(recv, sizeof(recv))) {
-                if ((0xAA == recv[0]) && (0x0E == recv[1])) {
-                    if (RECVFUNC(recv, sizeof(recv))) {
-                        if ((0xAA == recv[0]) && (0x0D == recv[1])) {
-                            send[0] = 0xAA;
-                            send[1] = 0x0E;
-                            send[2] = 0x0D;
-                            send[3] = 0x00;
-                            send[4] = 0x00;
-                            send[5] = 0x00;
-                            if (SENDFUNC(send, sizeof(send))) {
-                                /*
-                                 * After synchronization, the camera needs a little time for AEC and AGC to be stable.
-                                 * Users should wait for 1-2 seconds before capturing the first picture.
-                                 */
-                                wait(1);
-                                return NoError;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        wait(0.2);
-    }
-    return UnexpectedReply;
-}
-
-CameraC328::ErrorNumber CameraC328::getPicture(PictureType pt, void(*func)(size_t done, size_t total, char c)) {
-    switch (pt) {
-        case PreviewPicture:
-            return getPreviewPicture(func);
-        case SnapshotPicture:
-            return getSnapshotPicture(func);
-    }
-    return NoError;
-}
-
-CameraC328::ErrorNumber CameraC328::init(ColorType ct, RawResolution rr, JpegResolution jr) {
-    char send[COMMAND_LENGTH];
-    char recv[COMMAND_LENGTH];
-
-    send[0] = 0xAA;
-    send[1] = 0x01;
-    send[2] = 0x00;
-    send[3] = (char)ct;
-    send[4] = (char)rr;
-    send[5] = (char)jr;
-
-    if (!SENDFUNC(send, sizeof(send))) {
-        return (ErrorNumber)SendRegisterTimeout;
-    }
-
-    if (!RECVFUNC(recv, sizeof(recv))) {
-        return (ErrorNumber)UnexpectedReply;
-    }
-
-    if ((0xAA != recv[0]) || (0x0E != recv[1])) {
-        return (ErrorNumber)recv[4];
-    }
-
-    return (ErrorNumber)NoError;
-}
-
-/*
- * Get snapshot picture (uncompressed snapshot picture)
- *
- * @param func Pointer to a callback function.
- * @return Status of the error.
- */
-CameraC328::ErrorNumber CameraC328::getSnapshotPicture(void(*func)(size_t done, size_t total, char c)) {
-
-    char send[COMMAND_LENGTH];
-    char recv[COMMAND_LENGTH];
-
-    send[0] = 0xAA;
-    send[1] = 0x05;
-    send[2] = SnapshotPicture;
-    send[3] = 0x00;
-    send[4] = 0x00;
-    send[5] = 0x00;
-
-    if (!SENDFUNC(send, sizeof(send))) {
-        return (ErrorNumber)SendRegisterTimeout;
-    }
-    if (!RECVFUNC(recv, sizeof(recv))) {
-        return (ErrorNumber)UnexpectedReply;
-    }
-    if ((0xAA != recv[0]) || (0x0E != recv[1])) {
-        return (ErrorNumber)recv[4];
-    }
-
-    send[0] = 0xAA;
-    send[1] = 0x04;
-    send[2] = SnapshotPicture;
-    send[3] = 0x00;
-    send[4] = 0x00;
-    send[5] = 0x00;
-
-    if (!SENDFUNC(send, sizeof(send))) {
-        return (ErrorNumber)SendRegisterTimeout;
-    }
-    wait(1);
-    if (!RECVFUNC(recv, sizeof(recv))) {
-        return (ErrorNumber)UnexpectedReply;
-    }
-    if ((0xAA != recv[0]) || (0x0E != recv[1])) {
-        return (ErrorNumber)recv[4];
-    }
-    wait(1);
-    if (!RECVFUNC(recv, sizeof(recv))) {
-        return (ErrorNumber)UnexpectedReply;
-    }
-    if ((0xAA != recv[0]) || (0x0A != recv[1])) {
-        return (ErrorNumber)UnexpectedReply;
-    }
-
-    size_t siz = (recv[3] << (8 * 2)) | (recv[4] << (8 * 1)) | (recv[5] << (8 * 0));
-    size_t cnt = 0;
-    for (int i = 0; i < (int)siz; i++) {
-        char c;
-        if (!RECVFUNC(&c, sizeof(c))) {
-            return (ErrorNumber)UnexpectedReply;
-        }
-        cnt++;
-        func(cnt, siz, c);
-    }
-
-    return (siz == cnt) ? (ErrorNumber)NoError : (ErrorNumber)SendPictureError;
-}
-
-/*
- * Get preview picture (uncompressed preview picture)
- *
- * @param func Pointer to a callback function.
- * @return Status of the error.
- */
-CameraC328::ErrorNumber CameraC328::getPreviewPicture(void(*func)(size_t done, size_t total, char c)) {
-
-    char send[COMMAND_LENGTH];
-    char recv[COMMAND_LENGTH];
-
-    send[0] = 0xAA;
-    send[1] = 0x04;
-    send[2] = PreviewPicture;
-    send[3] = 0x00;
-    send[4] = 0x00;
-    send[5] = 0x00;
-
-    if (!SENDFUNC(send, sizeof(send))) {
-        return (ErrorNumber)SendRegisterTimeout;
-    }
-    wait(1);
-    if (!RECVFUNC(recv, sizeof(recv))) {
-        return (ErrorNumber)UnexpectedReply;
-    }
-    if ((0xAA != recv[0]) || (0x0E != recv[1])) {
-        return (ErrorNumber)recv[4];
-    }
-    wait(1);
-    if (!RECVFUNC(recv, sizeof(recv))) {
-        return (ErrorNumber)UnexpectedReply;
-    }
-    if ((0xAA != recv[0]) || (0x0A != recv[1])) {
-        return (ErrorNumber)UnexpectedReply;
-    }
-
-    size_t siz = (recv[3] << (8 * 2)) | (recv[4] << (8 * 1)) | (recv[5] << (8 * 0));
-    size_t cnt = 0;
-    for (int i = 0; i < (int)siz; i++) {
-        char c;
-        if (!RECVFUNC(&c, sizeof(c))) {
-            return (ErrorNumber)UnexpectedReply;
-        }
-        cnt++;
-        func(cnt, siz, c);
-    }
-
-    return (siz == cnt) ? (ErrorNumber)NoError : (ErrorNumber)SendPictureError;
-}
-
-/**
- * Send bytes to camera module.
- *
- * @param buf Pointer to the data buffer.
- * @param len Length of the data buffer.
- *
- * @return True if the data sended.
- */
-bool CameraC328::sendBytes(char *buf, size_t len) {
-    for (int i = 0; i < (int)len; i++) {
-        int cnt = 0;
-        while (!serial.writeable()) {
-            wait(0.001);
-            cnt++;
-            if (TIMEOUT_MS < cnt) {
-                return false;
-            }
-        }
-        serial.putc(buf[i]);
-    }
-    return true;
-}
-
-/**
- * Receive bytes from camera module.
- *
- * @param buf Pointer to the data buffer.
- * @param len Length of the data buffer.
- *
- * @return True if the data received.
- */
-bool CameraC328::recvBytes(char *buf, size_t len) {
-    for (int i = 0; i < (int)len; i++) {
-        int cnt = 0;
-        while (!serial.readable()) {
-            wait(0.001);
-            cnt++;
-            if (TIMEOUT_MS < cnt) {
-                return false;
-            }
-        }
-        buf[i] = serial.getc();
-    }
-    return true;
-}
-
-/**
- * Send bytes to camera module.
- *
- * @param buf Pointer to the data buffer.
- * @param len Length of the data buffer.
- *
- * @return True if the data sended.
- */
-bool CameraC328::sendBytesWithDebugOutput(char *buf, size_t len) {
-    debout.printf("SEND : ");
-    for (int i = 0; i < (int)len; i++) {
-        int cnt = 0;
-        while (!serial.writeable()) {
-            wait(0.001);
-            cnt++;
-            if (TIMEOUT_MS < cnt) {
-                debout.printf(" [Timed out]\n");
-                return false;
-            }
-        }
-        serial.putc(buf[i]);
-        debout.printf(" %02X", buf[i]);
-    }
-    debout.printf(" [OK]\n");
-    return true;
-}
-
-/**
- * Receive bytes from camera module.
- *
- * @param buf Pointer to the data buffer.
- * @param len Length of the data buffer.
- *
- * @return True if the data received.
- */
-bool CameraC328::recvBytesWithDebugOutput(char *buf, size_t len) {
-    debout.printf("RECV : ");
-    for (int i = 0; i < (int)len; i++) {
-        int cnt = 0;
-        while (!serial.readable()) {
-            wait(0.001);
-            cnt++;
-            if (TIMEOUT_MS < cnt) {
-                debout.printf(" [Timed out]\n");
-                return false;
-            }
-        }
-        buf[i] = serial.getc();
-        debout.printf(" %02X", buf[i]);
-    }
-    debout.printf(" [OK]\n");
-    return true;
-}
+#include "CameraC328.h"
+
+Serial debout(USBTX, USBRX);
+
+#if 0
+#define SENDFUNC    sendBytesWithDebugOutput
+#define RECVFUNC    recvBytesWithDebugOutput
+#else
+#define SENDFUNC    sendBytes
+#define RECVFUNC    recvBytes
+#endif
+
+CameraC328::CameraC328(PinName tx, PinName rx) : serial(tx, rx) {
+    serial.baud(BAUD);
+}
+
+CameraC328::~CameraC328() {
+}
+
+CameraC328::ErrorNumber CameraC328::sync() {
+    char send[COMMAND_LENGTH];
+    char recv[COMMAND_LENGTH];
+    send[0] = 0xAA;
+    send[1] = 0x0D;
+    send[2] = 0;
+    send[3] = 0;
+    send[4] = 0;
+    send[5] = 0;
+    for (int i = 0; i < SYNCMAX; i++) {
+        if (SENDFUNC(send, sizeof(send))) {
+            if (RECVFUNC(recv, sizeof(recv))) {
+                if ((0xAA == recv[0]) && (0x0E == recv[1])) {
+                    if (RECVFUNC(recv, sizeof(recv))) {
+                        if ((0xAA == recv[0]) && (0x0D == recv[1])) {
+                            send[0] = 0xAA;
+                            send[1] = 0x0E;
+                            send[2] = 0x0D;
+                            send[3] = 0x00;
+                            send[4] = 0x00;
+                            send[5] = 0x00;
+                            if (SENDFUNC(send, sizeof(send))) {
+                                /*
+                                 * After synchronization, the camera needs a little time for AEC and AGC to be stable.
+                                 * Users should wait for 1-2 seconds before capturing the first picture.
+                                 */
+                                wait(1);
+                                return NoError;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        wait(0.2);
+    }
+    return UnexpectedReply;
+}
+
+CameraC328::ErrorNumber CameraC328::init(ColorType ct, RawResolution rr, JpegResolution jr) {
+    char send[COMMAND_LENGTH];
+    char recv[COMMAND_LENGTH];
+
+    send[0] = 0xAA;
+    send[1] = 0x01;
+    send[2] = 0x00;
+    send[3] = (char)ct;
+    send[4] = (char)rr;
+    send[5] = (char)jr;
+
+    if (!SENDFUNC(send, sizeof(send))) {
+        return (ErrorNumber)SendRegisterTimeout;
+    }
+
+    if (!RECVFUNC(recv, sizeof(recv))) {
+        return (ErrorNumber)UnexpectedReply;
+    }
+
+    if ((0xAA != recv[0]) || (0x0E != recv[1])) {
+        return (ErrorNumber)recv[4];
+    }
+
+    return (ErrorNumber)NoError;
+}
+
+/*
+ * Get JPEG snapshot picture (uncompressed snapshot picture)
+ *
+ * @param func Pointer to a callback function.
+ * @return Status of the error.
+ */
+CameraC328::ErrorNumber CameraC328::getJpegSnapshotPicture(void(*func)(size_t done, size_t total, char c)) {
+
+    char send[COMMAND_LENGTH];
+    char recv[COMMAND_LENGTH];
+
+    /*
+     * Set Package Size
+     */
+
+    size_t pkgsiz = 512;
+    send[0] = 0xAA;
+    send[1] = 0x06;
+    send[2] = 0x08;
+    send[3] = (char)(pkgsiz >> 8);
+    send[4] = (char)(pkgsiz >> 0);
+    send[5] = 0x00;
+
+    if (!SENDFUNC(send, sizeof(send))) {
+        return (ErrorNumber)SendRegisterTimeout;
+    }
+    if (!RECVFUNC(recv, sizeof(recv))) {
+        return (ErrorNumber)UnexpectedReply;
+    }
+    if ((0xAA != recv[0]) || (0x0E != recv[1])) {
+        return (ErrorNumber)recv[4];
+    }
+
+    /*
+     * Snapshot (compressed picture)
+     */
+
+    send[0] = 0xAA;
+    send[1] = 0x05;
+    send[2] = 0x00;
+    send[3] = 0x00;
+    send[4] = 0x00;
+    send[5] = 0x00;
+
+    if (!SENDFUNC(send, sizeof(send))) {
+        return (ErrorNumber)SendRegisterTimeout;
+    }
+    if (!RECVFUNC(recv, sizeof(recv))) {
+        return (ErrorNumber)UnexpectedReply;
+    }
+    if ((0xAA != recv[0]) || (0x0E != recv[1])) {
+        return (ErrorNumber)recv[4];
+    }
+
+    /*
+     * Get picture
+     */
+
+    send[0] = 0xAA;
+    send[1] = 0x04;
+    send[2] = 0x01;
+    send[3] = 0x00;
+    send[4] = 0x00;
+    send[5] = 0x00;
+
+    if (!SENDFUNC(send, sizeof(send))) {
+        return (ErrorNumber)SendRegisterTimeout;
+    }
+    if (!RECVFUNC(recv, sizeof(recv))) {
+        return (ErrorNumber)UnexpectedReply;
+    }
+    if ((0xAA != recv[0]) || (0x0E != recv[1])) {
+        return (ErrorNumber)recv[4];
+    }
+    if (!RECVFUNC(recv, sizeof(recv))) {
+        return (ErrorNumber)UnexpectedReply;
+    }
+    if ((0xAA != recv[0]) || (0x0A != recv[1])) {
+        return (ErrorNumber)UnexpectedReply;
+    }
+
+    /*
+     * ACK package ID
+     */
+    char pkghead[4];
+    char pkgtail[2];
+    size_t imgsiz = (recv[5] << (8 * 2)) | (recv[4] << (8 * 1)) | (recv[3] << (8 * 0));
+    size_t rcvcnt = 0;
+    size_t pkgcnt = 0;
+    while (rcvcnt < imgsiz) {
+        send[0] = 0xAA;
+        send[1] = 0x0E;
+        send[2] = 0x00;
+        send[3] = 0x00;
+        send[4] = (char)(pkgcnt >> 0);
+        send[5] = (char)(pkgcnt >> 8);
+        if (!SENDFUNC(send, sizeof(send))) {
+            return (ErrorNumber)SendRegisterTimeout;
+        }
+        wait(1);
+        if (!RECVFUNC(pkghead, sizeof(pkghead))) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+        int id = (pkghead[1] << 8) | (pkghead[0] << 0);
+        int sz = (pkghead[3] << 8) | (pkghead[2] << 0);
+        debout.printf("Received/Total %d/%d bytes, Current package data size is %d.\n", rcvcnt, imgsiz, sz);
+        char pkgdata[pkgsiz];
+        if (!RECVFUNC(pkgdata, sizeof(pkgdata))) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+        if (!RECVFUNC(pkgtail, sizeof(pkgtail))) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+        rcvcnt+=sz;
+        pkgcnt++;
+    }
+
+    return (ErrorNumber)NoError;
+}
+
+/**
+ * Send bytes to camera module.
+ *
+ * @param buf Pointer to the data buffer.
+ * @param len Length of the data buffer.
+ *
+ * @return True if the data sended.
+ */
+bool CameraC328::sendBytes(char *buf, size_t len) {
+    for (int i = 0; i < (int)len; i++) {
+        int cnt = 0;
+        while (!serial.writeable()) {
+            wait(0.001);
+            cnt++;
+            if (TIMEOUT_MS < cnt) {
+                return false;
+            }
+        }
+        serial.putc(buf[i]);
+    }
+    return true;
+}
+
+/**
+ * Receive bytes from camera module.
+ *
+ * @param buf Pointer to the data buffer.
+ * @param len Length of the data buffer.
+ *
+ * @return True if the data received.
+ */
+bool CameraC328::recvBytes(char *buf, size_t len) {
+    for (int i = 0; i < (int)len; i++) {
+        int cnt = 0;
+        while (!serial.readable()) {
+            wait(0.001);
+            cnt++;
+            if (TIMEOUT_MS < cnt) {
+                return false;
+            }
+        }
+        buf[i] = serial.getc();
+    }
+    return true;
+}
+
+/**
+ * Send bytes to camera module.
+ *
+ * @param buf Pointer to the data buffer.
+ * @param len Length of the data buffer.
+ *
+ * @return True if the data sended.
+ */
+bool CameraC328::sendBytesWithDebugOutput(char *buf, size_t len) {
+    debout.printf("SEND : ");
+    for (int i = 0; i < (int)len; i++) {
+        int cnt = 0;
+        while (!serial.writeable()) {
+            wait(0.001);
+            cnt++;
+            if (TIMEOUT_MS < cnt) {
+                debout.printf(" [Timed out]\n");
+                return false;
+            }
+        }
+        serial.putc(buf[i]);
+        debout.printf(" %02X", buf[i]);
+    }
+    debout.printf(" [OK]\n");
+    return true;
+}
+
+/**
+ * Receive bytes from camera module.
+ *
+ * @param buf Pointer to the data buffer.
+ * @param len Length of the data buffer.
+ *
+ * @return True if the data received.
+ */
+bool CameraC328::recvBytesWithDebugOutput(char *buf, size_t len) {
+    debout.printf("RECV : ");
+    for (int i = 0; i < (int)len; i++) {
+        int cnt = 0;
+        while (!serial.readable()) {
+            wait(0.001);
+            cnt++;
+            if (TIMEOUT_MS < cnt) {
+                debout.printf(" [Timed out]\n");
+                return false;
+            }
+        }
+        buf[i] = serial.getc();
+        debout.printf(" %02X", buf[i]);
+    }
+    debout.printf(" [OK]\n");
+    return true;
+}
--- a/CameraC328.h	Sun Jun 27 03:36:10 2010 +0000
+++ b/CameraC328.h	Sun Jun 27 05:04:04 2010 +0000
@@ -51,6 +51,11 @@
         SendPictureError = 0xf5,
         SendCommandError = 0xff
     };
+    
+    enum SnapshotType {
+        CompressedPicture = 0x00,
+        UncompressedPicture = 0x01
+    };
 
     enum PictureType {
         SnapshotPicture = 0x01,
@@ -59,8 +64,8 @@
     };
 
     ErrorNumber sync();
-    ErrorNumber getPicture(PictureType pt, void(*func)(size_t done, size_t total, char c));
     ErrorNumber init(ColorType ct, RawResolution rr, JpegResolution jr);
+    ErrorNumber getJpegSnapshotPicture(void(*func)(size_t done, size_t total, char c));
 
 private:
     Serial serial;
@@ -69,22 +74,6 @@
     static const int BAUD = 19600;
     static const int SYNCMAX = 60;
 
-    /*
-     * Get snapshot picture (uncompressed snapshot picture)
-     *
-     * @param func Pointer to a callback function.
-     * @return Status of the error.
-     */
-    ErrorNumber getSnapshotPicture(void(*func)(size_t done, size_t total, char c));
-
-    /*
-     * Get preview picture (uncompressed preview picture)
-     *
-     * @param func Pointer to a callback function.
-     * @return Status of the error.
-     */
-    ErrorNumber getPreviewPicture(void(*func)(size_t done, size_t total, char c));
-
     /**
      * Send bytes to camera module.
      *
--- a/main.cpp	Sun Jun 27 03:36:10 2010 +0000
+++ b/main.cpp	Sun Jun 27 05:04:04 2010 +0000
@@ -22,22 +22,21 @@
     if (CameraC328::NoError == err) {
         serial.printf("[ OK ] : CameraC328::sync\n");
     } else {
-        serial.printf("[FAIL] : CameraC328::sync (Error=%d)\n", (int)err);
+        serial.printf("[FAIL] : CameraC328::sync (Error=%02X)\n", (int)err);
     }
 
     err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution160x120, CameraC328::JpegResolution640x480);
     if (CameraC328::NoError == err) {
         serial.printf("[ OK ] : CameraC328::init\n");
     } else {
-        serial.printf("[FAIL] : CameraC328::init (Error=%d)\n", (int)err);
+        serial.printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
     }
 
-    // err = camera.getPicture(CameraC328::SnapshotPicture, cbfunc);
-    err = camera.getPicture(CameraC328::PreviewPicture, cbfunc);
+    err = camera.getJpegSnapshotPicture(cbfunc);
     if (CameraC328::NoError == err) {
-        serial.printf("[ OK ] : CameraC328::getPicture\n");
+        serial.printf("[ OK ] : CameraC328::getPicture(PreviewPicture)\n");
     } else {
-        serial.printf("[FAIL] : CameraC328::getPicture (Error=%d)\n", (int)err);
+        serial.printf("[FAIL] : CameraC328::getPicture(PreviewPicture) (Error=%02X)\n", (int)err);
     }
 
     while (1) {