CameraC328
Dependents: CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more
Revision 1:167e51d598cf, committed 2010-06-27
- Comitter:
- shintamainjp
- Date:
- Sun Jun 27 05:04:04 2010 +0000
- Parent:
- 0:7e51c3176eb7
- Child:
- 2:6a72fcad5c0a
- Commit message:
Changed in this revision
--- 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) {