CameraC328
Dependents: CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more
CameraC328.cpp
- Committer:
- shintamainjp
- Date:
- 2010-06-27
- Revision:
- 0:7e51c3176eb7
- Child:
- 1:167e51d598cf
File content as of revision 0:7e51c3176eb7:
#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; }