CameraC328

Dependents:   CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more

Revision:
4:ad06342d4b84
Parent:
3:6d3150d4396a
Child:
7:d0d13822c37a
--- a/CameraC328.cpp	Tue Jun 29 11:45:53 2010 +0000
+++ b/CameraC328.cpp	Tue Jun 29 22:55:35 2010 +0000
@@ -1,11 +1,8 @@
 /**
- * C328-7640 device driver class
+ * C328-7640 device driver class (Version 0.0.2)
  * Reference documents: C328-7640 User Manual v3.0 2004.8.19
  *
- * Version 0.0.1
- *
  * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
- * shinta.main.jp@gmail.com
  * http://shinta.main.jp/
  */
 
@@ -15,6 +12,8 @@
 #define RECVFUNC    recvBytes
 #define WAITFUNC    waitRecv
 
+Serial debout(USBTX, USBRX);
+
 CameraC328::CameraC328(PinName tx, PinName rx, Baud baud) : serial(tx, rx) {
     serial.baud((int)baud);
 }
@@ -56,11 +55,25 @@
         return en;
     }
 
+    static bool alreadySetupPackageSize = false;
+    if (!alreadySetupPackageSize) {
+        en = sendSetPackageSize(packageSize);
+        if (NoError != en) {
+            return en;
+        }
+        WAITFUNC();
+        en = recvAckOrNck();
+        if (NoError != en) {
+            return en;
+        }
+        alreadySetupPackageSize = true;
+    }
+
     return (ErrorNumber)NoError;
 }
 
 /**
- * Get uncompressed snapshot picture (uncompressed snapshot picture)
+ * Get uncompressed snapshot picture.
  *
  * @param func Pointer to a callback function.
  * @return Status of the error.
@@ -121,7 +134,7 @@
 }
 
 /**
- * Get uncompressed snapshot picture (uncompressed snapshot picture)
+ * Get uncompressed preview picture.
  *
  * @param func Pointer to a callback function.
  * @return Status of the error.
@@ -171,6 +184,198 @@
     return (ErrorNumber)NoError;
 }
 
+/**
+ * Get JPEG snapshot picture.
+ *
+ * @param func Pointer to a callback function.
+ * @return Status of the error.
+ */
+CameraC328::ErrorNumber CameraC328::getJpegSnapshotPicture(void(*func)(char *buf, size_t siz)) {
+
+    ErrorNumber en;
+
+    en = sendSnapshot(CompressedPicture, 1);
+    if (NoError != en) {
+        return en;
+    }
+    WAITFUNC();
+    en = recvAckOrNck();
+    if (NoError != en) {
+        return en;
+    }
+
+    en = sendGetPicture(SnapshotPicture);
+    if (NoError != en) {
+        return en;
+    }
+    WAITFUNC();
+    en = recvAckOrNck();
+    if (NoError != en) {
+        return en;
+    }
+
+    /*
+     * Data : snapshot picture
+     */
+    DataType dt;
+    uint32_t length = 0;
+    WAITFUNC();
+    en = recvData(&dt, &length);
+    if (NoError != en) {
+        return en;
+    }
+    en = sendAck(0x00, 0);
+    if (NoError != en) {
+        return en;
+    }
+
+    WAITFUNC();
+
+    char databuf[packageSize - 6];
+    uint16_t pkg_total = length / (packageSize - 6);
+    for (int i = 0; i <= (int)pkg_total; i++) {
+        uint16_t checksum = 0;
+        // ID.
+        char idbuf[2];
+        if (!RECVFUNC(idbuf, sizeof(idbuf))) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+        checksum += idbuf[0];
+        checksum += idbuf[1];
+        uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
+        if (id != i) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+
+        // Size of the data.
+        char dsbuf[2];
+        if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+
+        // Received the data.
+        checksum += dsbuf[0];
+        checksum += dsbuf[1];
+        uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
+        if (!RECVFUNC(&databuf[0], ds)) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+        for (int j = 0; j < ds; j++) {
+            checksum += databuf[j];
+        }
+
+        // Verify code.
+        char vcbuf[2];
+        if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+        uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
+        if (vc != (checksum & 0xff)) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+
+        func(databuf, ds);
+
+        en = sendAck(0x00, 1 + i);
+        if (NoError != en) {
+            return en;
+        }
+    }
+
+    return (ErrorNumber)NoError;
+}
+
+/**
+ * Get JPEG preview picture.
+ *
+ * @param func Pointer to a callback function.
+ * @return Status of the error.
+ */
+CameraC328::ErrorNumber CameraC328::getJpegPreviewPicture(void(*func)(char *buf, size_t siz)) {
+
+    ErrorNumber en;
+
+    en = sendGetPicture(JpegPreviewPicture);
+    if (NoError != en) {
+        return en;
+    }
+    WAITFUNC();
+    en = recvAckOrNck();
+    if (NoError != en) {
+        return en;
+    }
+
+    /*
+     * Data : JPEG preview picture
+     */
+    DataType dt;
+    uint32_t length = 0;
+    WAITFUNC();
+    en = recvData(&dt, &length);
+    if (NoError != en) {
+        return en;
+    }
+    en = sendAck(0x00, 0);
+    if (NoError != en) {
+        return en;
+    }
+
+    WAITFUNC();
+
+    char databuf[packageSize - 6];
+    uint16_t pkg_total = length / (packageSize - 6);
+    for (int i = 0; i <= (int)pkg_total; i++) {
+        uint16_t checksum = 0;
+        // ID.
+        char idbuf[2];
+        if (!RECVFUNC(idbuf, sizeof(idbuf))) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+        checksum += idbuf[0];
+        checksum += idbuf[1];
+        uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
+        if (id != i) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+
+        // Size of the data.
+        char dsbuf[2];
+        if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+
+        // Received the data.
+        checksum += dsbuf[0];
+        checksum += dsbuf[1];
+        uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
+        if (!RECVFUNC(&databuf[0], ds)) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+        for (int j = 0; j < ds; j++) {
+            checksum += databuf[j];
+        }
+
+        // Verify code.
+        char vcbuf[2];
+        if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+        uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
+        if (vc != (checksum & 0xff)) {
+            return (ErrorNumber)UnexpectedReply;
+        }
+
+        func(databuf, ds);
+
+        en = sendAck(0x00, 1 + i);
+        if (NoError != en) {
+            return en;
+        }
+    }
+
+    return (ErrorNumber)NoError;
+}
+
 CameraC328::ErrorNumber CameraC328::sendInitial(ColorType ct, RawResolution rr, JpegResolution jr) {
     char send[COMMAND_LENGTH];