Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more
Diff: CameraC328.cpp
- Revision:
- 4:ad06342d4b84
- Parent:
- 3:6d3150d4396a
- Child:
- 7:d0d13822c37a
diff -r 6d3150d4396a -r ad06342d4b84 CameraC328.cpp
--- 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];
CameraC328