CameraC328
Dependents: CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more
Diff: CameraC328.cpp
- 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];