CameraC328

Dependents:   CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more

Committer:
shintamainjp
Date:
Sun Jun 27 03:36:10 2010 +0000
Revision:
0:7e51c3176eb7
Child:
1:167e51d598cf

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:7e51c3176eb7 1 #include "CameraC328.h"
shintamainjp 0:7e51c3176eb7 2
shintamainjp 0:7e51c3176eb7 3 Serial debout(USBTX, USBRX);
shintamainjp 0:7e51c3176eb7 4
shintamainjp 0:7e51c3176eb7 5 #if 1
shintamainjp 0:7e51c3176eb7 6 #define SENDFUNC sendBytesWithDebugOutput
shintamainjp 0:7e51c3176eb7 7 #define RECVFUNC recvBytesWithDebugOutput
shintamainjp 0:7e51c3176eb7 8 #else
shintamainjp 0:7e51c3176eb7 9 #define SENDFUNC sendBytes
shintamainjp 0:7e51c3176eb7 10 #define RECVFUNC recvBytes
shintamainjp 0:7e51c3176eb7 11 #endif
shintamainjp 0:7e51c3176eb7 12
shintamainjp 0:7e51c3176eb7 13 CameraC328::CameraC328(PinName tx, PinName rx) : serial(tx, rx) {
shintamainjp 0:7e51c3176eb7 14 serial.baud(BAUD);
shintamainjp 0:7e51c3176eb7 15 }
shintamainjp 0:7e51c3176eb7 16
shintamainjp 0:7e51c3176eb7 17 CameraC328::~CameraC328() {
shintamainjp 0:7e51c3176eb7 18 }
shintamainjp 0:7e51c3176eb7 19
shintamainjp 0:7e51c3176eb7 20 CameraC328::ErrorNumber CameraC328::sync() {
shintamainjp 0:7e51c3176eb7 21 char send[COMMAND_LENGTH];
shintamainjp 0:7e51c3176eb7 22 char recv[COMMAND_LENGTH];
shintamainjp 0:7e51c3176eb7 23 send[0] = 0xAA;
shintamainjp 0:7e51c3176eb7 24 send[1] = 0x0D;
shintamainjp 0:7e51c3176eb7 25 send[2] = 0;
shintamainjp 0:7e51c3176eb7 26 send[3] = 0;
shintamainjp 0:7e51c3176eb7 27 send[4] = 0;
shintamainjp 0:7e51c3176eb7 28 send[5] = 0;
shintamainjp 0:7e51c3176eb7 29 for (int i = 0; i < SYNCMAX; i++) {
shintamainjp 0:7e51c3176eb7 30 if (SENDFUNC(send, sizeof(send))) {
shintamainjp 0:7e51c3176eb7 31 if (RECVFUNC(recv, sizeof(recv))) {
shintamainjp 0:7e51c3176eb7 32 if ((0xAA == recv[0]) && (0x0E == recv[1])) {
shintamainjp 0:7e51c3176eb7 33 if (RECVFUNC(recv, sizeof(recv))) {
shintamainjp 0:7e51c3176eb7 34 if ((0xAA == recv[0]) && (0x0D == recv[1])) {
shintamainjp 0:7e51c3176eb7 35 send[0] = 0xAA;
shintamainjp 0:7e51c3176eb7 36 send[1] = 0x0E;
shintamainjp 0:7e51c3176eb7 37 send[2] = 0x0D;
shintamainjp 0:7e51c3176eb7 38 send[3] = 0x00;
shintamainjp 0:7e51c3176eb7 39 send[4] = 0x00;
shintamainjp 0:7e51c3176eb7 40 send[5] = 0x00;
shintamainjp 0:7e51c3176eb7 41 if (SENDFUNC(send, sizeof(send))) {
shintamainjp 0:7e51c3176eb7 42 /*
shintamainjp 0:7e51c3176eb7 43 * After synchronization, the camera needs a little time for AEC and AGC to be stable.
shintamainjp 0:7e51c3176eb7 44 * Users should wait for 1-2 seconds before capturing the first picture.
shintamainjp 0:7e51c3176eb7 45 */
shintamainjp 0:7e51c3176eb7 46 wait(1);
shintamainjp 0:7e51c3176eb7 47 return NoError;
shintamainjp 0:7e51c3176eb7 48 }
shintamainjp 0:7e51c3176eb7 49 }
shintamainjp 0:7e51c3176eb7 50 }
shintamainjp 0:7e51c3176eb7 51 }
shintamainjp 0:7e51c3176eb7 52 }
shintamainjp 0:7e51c3176eb7 53 }
shintamainjp 0:7e51c3176eb7 54 wait(0.2);
shintamainjp 0:7e51c3176eb7 55 }
shintamainjp 0:7e51c3176eb7 56 return UnexpectedReply;
shintamainjp 0:7e51c3176eb7 57 }
shintamainjp 0:7e51c3176eb7 58
shintamainjp 0:7e51c3176eb7 59 CameraC328::ErrorNumber CameraC328::getPicture(PictureType pt, void(*func)(size_t done, size_t total, char c)) {
shintamainjp 0:7e51c3176eb7 60 switch (pt) {
shintamainjp 0:7e51c3176eb7 61 case PreviewPicture:
shintamainjp 0:7e51c3176eb7 62 return getPreviewPicture(func);
shintamainjp 0:7e51c3176eb7 63 case SnapshotPicture:
shintamainjp 0:7e51c3176eb7 64 return getSnapshotPicture(func);
shintamainjp 0:7e51c3176eb7 65 }
shintamainjp 0:7e51c3176eb7 66 return NoError;
shintamainjp 0:7e51c3176eb7 67 }
shintamainjp 0:7e51c3176eb7 68
shintamainjp 0:7e51c3176eb7 69 CameraC328::ErrorNumber CameraC328::init(ColorType ct, RawResolution rr, JpegResolution jr) {
shintamainjp 0:7e51c3176eb7 70 char send[COMMAND_LENGTH];
shintamainjp 0:7e51c3176eb7 71 char recv[COMMAND_LENGTH];
shintamainjp 0:7e51c3176eb7 72
shintamainjp 0:7e51c3176eb7 73 send[0] = 0xAA;
shintamainjp 0:7e51c3176eb7 74 send[1] = 0x01;
shintamainjp 0:7e51c3176eb7 75 send[2] = 0x00;
shintamainjp 0:7e51c3176eb7 76 send[3] = (char)ct;
shintamainjp 0:7e51c3176eb7 77 send[4] = (char)rr;
shintamainjp 0:7e51c3176eb7 78 send[5] = (char)jr;
shintamainjp 0:7e51c3176eb7 79
shintamainjp 0:7e51c3176eb7 80 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 0:7e51c3176eb7 81 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 0:7e51c3176eb7 82 }
shintamainjp 0:7e51c3176eb7 83
shintamainjp 0:7e51c3176eb7 84 if (!RECVFUNC(recv, sizeof(recv))) {
shintamainjp 0:7e51c3176eb7 85 return (ErrorNumber)UnexpectedReply;
shintamainjp 0:7e51c3176eb7 86 }
shintamainjp 0:7e51c3176eb7 87
shintamainjp 0:7e51c3176eb7 88 if ((0xAA != recv[0]) || (0x0E != recv[1])) {
shintamainjp 0:7e51c3176eb7 89 return (ErrorNumber)recv[4];
shintamainjp 0:7e51c3176eb7 90 }
shintamainjp 0:7e51c3176eb7 91
shintamainjp 0:7e51c3176eb7 92 return (ErrorNumber)NoError;
shintamainjp 0:7e51c3176eb7 93 }
shintamainjp 0:7e51c3176eb7 94
shintamainjp 0:7e51c3176eb7 95 /*
shintamainjp 0:7e51c3176eb7 96 * Get snapshot picture (uncompressed snapshot picture)
shintamainjp 0:7e51c3176eb7 97 *
shintamainjp 0:7e51c3176eb7 98 * @param func Pointer to a callback function.
shintamainjp 0:7e51c3176eb7 99 * @return Status of the error.
shintamainjp 0:7e51c3176eb7 100 */
shintamainjp 0:7e51c3176eb7 101 CameraC328::ErrorNumber CameraC328::getSnapshotPicture(void(*func)(size_t done, size_t total, char c)) {
shintamainjp 0:7e51c3176eb7 102
shintamainjp 0:7e51c3176eb7 103 char send[COMMAND_LENGTH];
shintamainjp 0:7e51c3176eb7 104 char recv[COMMAND_LENGTH];
shintamainjp 0:7e51c3176eb7 105
shintamainjp 0:7e51c3176eb7 106 send[0] = 0xAA;
shintamainjp 0:7e51c3176eb7 107 send[1] = 0x05;
shintamainjp 0:7e51c3176eb7 108 send[2] = SnapshotPicture;
shintamainjp 0:7e51c3176eb7 109 send[3] = 0x00;
shintamainjp 0:7e51c3176eb7 110 send[4] = 0x00;
shintamainjp 0:7e51c3176eb7 111 send[5] = 0x00;
shintamainjp 0:7e51c3176eb7 112
shintamainjp 0:7e51c3176eb7 113 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 0:7e51c3176eb7 114 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 0:7e51c3176eb7 115 }
shintamainjp 0:7e51c3176eb7 116 if (!RECVFUNC(recv, sizeof(recv))) {
shintamainjp 0:7e51c3176eb7 117 return (ErrorNumber)UnexpectedReply;
shintamainjp 0:7e51c3176eb7 118 }
shintamainjp 0:7e51c3176eb7 119 if ((0xAA != recv[0]) || (0x0E != recv[1])) {
shintamainjp 0:7e51c3176eb7 120 return (ErrorNumber)recv[4];
shintamainjp 0:7e51c3176eb7 121 }
shintamainjp 0:7e51c3176eb7 122
shintamainjp 0:7e51c3176eb7 123 send[0] = 0xAA;
shintamainjp 0:7e51c3176eb7 124 send[1] = 0x04;
shintamainjp 0:7e51c3176eb7 125 send[2] = SnapshotPicture;
shintamainjp 0:7e51c3176eb7 126 send[3] = 0x00;
shintamainjp 0:7e51c3176eb7 127 send[4] = 0x00;
shintamainjp 0:7e51c3176eb7 128 send[5] = 0x00;
shintamainjp 0:7e51c3176eb7 129
shintamainjp 0:7e51c3176eb7 130 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 0:7e51c3176eb7 131 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 0:7e51c3176eb7 132 }
shintamainjp 0:7e51c3176eb7 133 wait(1);
shintamainjp 0:7e51c3176eb7 134 if (!RECVFUNC(recv, sizeof(recv))) {
shintamainjp 0:7e51c3176eb7 135 return (ErrorNumber)UnexpectedReply;
shintamainjp 0:7e51c3176eb7 136 }
shintamainjp 0:7e51c3176eb7 137 if ((0xAA != recv[0]) || (0x0E != recv[1])) {
shintamainjp 0:7e51c3176eb7 138 return (ErrorNumber)recv[4];
shintamainjp 0:7e51c3176eb7 139 }
shintamainjp 0:7e51c3176eb7 140 wait(1);
shintamainjp 0:7e51c3176eb7 141 if (!RECVFUNC(recv, sizeof(recv))) {
shintamainjp 0:7e51c3176eb7 142 return (ErrorNumber)UnexpectedReply;
shintamainjp 0:7e51c3176eb7 143 }
shintamainjp 0:7e51c3176eb7 144 if ((0xAA != recv[0]) || (0x0A != recv[1])) {
shintamainjp 0:7e51c3176eb7 145 return (ErrorNumber)UnexpectedReply;
shintamainjp 0:7e51c3176eb7 146 }
shintamainjp 0:7e51c3176eb7 147
shintamainjp 0:7e51c3176eb7 148 size_t siz = (recv[3] << (8 * 2)) | (recv[4] << (8 * 1)) | (recv[5] << (8 * 0));
shintamainjp 0:7e51c3176eb7 149 size_t cnt = 0;
shintamainjp 0:7e51c3176eb7 150 for (int i = 0; i < (int)siz; i++) {
shintamainjp 0:7e51c3176eb7 151 char c;
shintamainjp 0:7e51c3176eb7 152 if (!RECVFUNC(&c, sizeof(c))) {
shintamainjp 0:7e51c3176eb7 153 return (ErrorNumber)UnexpectedReply;
shintamainjp 0:7e51c3176eb7 154 }
shintamainjp 0:7e51c3176eb7 155 cnt++;
shintamainjp 0:7e51c3176eb7 156 func(cnt, siz, c);
shintamainjp 0:7e51c3176eb7 157 }
shintamainjp 0:7e51c3176eb7 158
shintamainjp 0:7e51c3176eb7 159 return (siz == cnt) ? (ErrorNumber)NoError : (ErrorNumber)SendPictureError;
shintamainjp 0:7e51c3176eb7 160 }
shintamainjp 0:7e51c3176eb7 161
shintamainjp 0:7e51c3176eb7 162 /*
shintamainjp 0:7e51c3176eb7 163 * Get preview picture (uncompressed preview picture)
shintamainjp 0:7e51c3176eb7 164 *
shintamainjp 0:7e51c3176eb7 165 * @param func Pointer to a callback function.
shintamainjp 0:7e51c3176eb7 166 * @return Status of the error.
shintamainjp 0:7e51c3176eb7 167 */
shintamainjp 0:7e51c3176eb7 168 CameraC328::ErrorNumber CameraC328::getPreviewPicture(void(*func)(size_t done, size_t total, char c)) {
shintamainjp 0:7e51c3176eb7 169
shintamainjp 0:7e51c3176eb7 170 char send[COMMAND_LENGTH];
shintamainjp 0:7e51c3176eb7 171 char recv[COMMAND_LENGTH];
shintamainjp 0:7e51c3176eb7 172
shintamainjp 0:7e51c3176eb7 173 send[0] = 0xAA;
shintamainjp 0:7e51c3176eb7 174 send[1] = 0x04;
shintamainjp 0:7e51c3176eb7 175 send[2] = PreviewPicture;
shintamainjp 0:7e51c3176eb7 176 send[3] = 0x00;
shintamainjp 0:7e51c3176eb7 177 send[4] = 0x00;
shintamainjp 0:7e51c3176eb7 178 send[5] = 0x00;
shintamainjp 0:7e51c3176eb7 179
shintamainjp 0:7e51c3176eb7 180 if (!SENDFUNC(send, sizeof(send))) {
shintamainjp 0:7e51c3176eb7 181 return (ErrorNumber)SendRegisterTimeout;
shintamainjp 0:7e51c3176eb7 182 }
shintamainjp 0:7e51c3176eb7 183 wait(1);
shintamainjp 0:7e51c3176eb7 184 if (!RECVFUNC(recv, sizeof(recv))) {
shintamainjp 0:7e51c3176eb7 185 return (ErrorNumber)UnexpectedReply;
shintamainjp 0:7e51c3176eb7 186 }
shintamainjp 0:7e51c3176eb7 187 if ((0xAA != recv[0]) || (0x0E != recv[1])) {
shintamainjp 0:7e51c3176eb7 188 return (ErrorNumber)recv[4];
shintamainjp 0:7e51c3176eb7 189 }
shintamainjp 0:7e51c3176eb7 190 wait(1);
shintamainjp 0:7e51c3176eb7 191 if (!RECVFUNC(recv, sizeof(recv))) {
shintamainjp 0:7e51c3176eb7 192 return (ErrorNumber)UnexpectedReply;
shintamainjp 0:7e51c3176eb7 193 }
shintamainjp 0:7e51c3176eb7 194 if ((0xAA != recv[0]) || (0x0A != recv[1])) {
shintamainjp 0:7e51c3176eb7 195 return (ErrorNumber)UnexpectedReply;
shintamainjp 0:7e51c3176eb7 196 }
shintamainjp 0:7e51c3176eb7 197
shintamainjp 0:7e51c3176eb7 198 size_t siz = (recv[3] << (8 * 2)) | (recv[4] << (8 * 1)) | (recv[5] << (8 * 0));
shintamainjp 0:7e51c3176eb7 199 size_t cnt = 0;
shintamainjp 0:7e51c3176eb7 200 for (int i = 0; i < (int)siz; i++) {
shintamainjp 0:7e51c3176eb7 201 char c;
shintamainjp 0:7e51c3176eb7 202 if (!RECVFUNC(&c, sizeof(c))) {
shintamainjp 0:7e51c3176eb7 203 return (ErrorNumber)UnexpectedReply;
shintamainjp 0:7e51c3176eb7 204 }
shintamainjp 0:7e51c3176eb7 205 cnt++;
shintamainjp 0:7e51c3176eb7 206 func(cnt, siz, c);
shintamainjp 0:7e51c3176eb7 207 }
shintamainjp 0:7e51c3176eb7 208
shintamainjp 0:7e51c3176eb7 209 return (siz == cnt) ? (ErrorNumber)NoError : (ErrorNumber)SendPictureError;
shintamainjp 0:7e51c3176eb7 210 }
shintamainjp 0:7e51c3176eb7 211
shintamainjp 0:7e51c3176eb7 212 /**
shintamainjp 0:7e51c3176eb7 213 * Send bytes to camera module.
shintamainjp 0:7e51c3176eb7 214 *
shintamainjp 0:7e51c3176eb7 215 * @param buf Pointer to the data buffer.
shintamainjp 0:7e51c3176eb7 216 * @param len Length of the data buffer.
shintamainjp 0:7e51c3176eb7 217 *
shintamainjp 0:7e51c3176eb7 218 * @return True if the data sended.
shintamainjp 0:7e51c3176eb7 219 */
shintamainjp 0:7e51c3176eb7 220 bool CameraC328::sendBytes(char *buf, size_t len) {
shintamainjp 0:7e51c3176eb7 221 for (int i = 0; i < (int)len; i++) {
shintamainjp 0:7e51c3176eb7 222 int cnt = 0;
shintamainjp 0:7e51c3176eb7 223 while (!serial.writeable()) {
shintamainjp 0:7e51c3176eb7 224 wait(0.001);
shintamainjp 0:7e51c3176eb7 225 cnt++;
shintamainjp 0:7e51c3176eb7 226 if (TIMEOUT_MS < cnt) {
shintamainjp 0:7e51c3176eb7 227 return false;
shintamainjp 0:7e51c3176eb7 228 }
shintamainjp 0:7e51c3176eb7 229 }
shintamainjp 0:7e51c3176eb7 230 serial.putc(buf[i]);
shintamainjp 0:7e51c3176eb7 231 }
shintamainjp 0:7e51c3176eb7 232 return true;
shintamainjp 0:7e51c3176eb7 233 }
shintamainjp 0:7e51c3176eb7 234
shintamainjp 0:7e51c3176eb7 235 /**
shintamainjp 0:7e51c3176eb7 236 * Receive bytes from camera module.
shintamainjp 0:7e51c3176eb7 237 *
shintamainjp 0:7e51c3176eb7 238 * @param buf Pointer to the data buffer.
shintamainjp 0:7e51c3176eb7 239 * @param len Length of the data buffer.
shintamainjp 0:7e51c3176eb7 240 *
shintamainjp 0:7e51c3176eb7 241 * @return True if the data received.
shintamainjp 0:7e51c3176eb7 242 */
shintamainjp 0:7e51c3176eb7 243 bool CameraC328::recvBytes(char *buf, size_t len) {
shintamainjp 0:7e51c3176eb7 244 for (int i = 0; i < (int)len; i++) {
shintamainjp 0:7e51c3176eb7 245 int cnt = 0;
shintamainjp 0:7e51c3176eb7 246 while (!serial.readable()) {
shintamainjp 0:7e51c3176eb7 247 wait(0.001);
shintamainjp 0:7e51c3176eb7 248 cnt++;
shintamainjp 0:7e51c3176eb7 249 if (TIMEOUT_MS < cnt) {
shintamainjp 0:7e51c3176eb7 250 return false;
shintamainjp 0:7e51c3176eb7 251 }
shintamainjp 0:7e51c3176eb7 252 }
shintamainjp 0:7e51c3176eb7 253 buf[i] = serial.getc();
shintamainjp 0:7e51c3176eb7 254 }
shintamainjp 0:7e51c3176eb7 255 return true;
shintamainjp 0:7e51c3176eb7 256 }
shintamainjp 0:7e51c3176eb7 257
shintamainjp 0:7e51c3176eb7 258 /**
shintamainjp 0:7e51c3176eb7 259 * Send bytes to camera module.
shintamainjp 0:7e51c3176eb7 260 *
shintamainjp 0:7e51c3176eb7 261 * @param buf Pointer to the data buffer.
shintamainjp 0:7e51c3176eb7 262 * @param len Length of the data buffer.
shintamainjp 0:7e51c3176eb7 263 *
shintamainjp 0:7e51c3176eb7 264 * @return True if the data sended.
shintamainjp 0:7e51c3176eb7 265 */
shintamainjp 0:7e51c3176eb7 266 bool CameraC328::sendBytesWithDebugOutput(char *buf, size_t len) {
shintamainjp 0:7e51c3176eb7 267 debout.printf("SEND : ");
shintamainjp 0:7e51c3176eb7 268 for (int i = 0; i < (int)len; i++) {
shintamainjp 0:7e51c3176eb7 269 int cnt = 0;
shintamainjp 0:7e51c3176eb7 270 while (!serial.writeable()) {
shintamainjp 0:7e51c3176eb7 271 wait(0.001);
shintamainjp 0:7e51c3176eb7 272 cnt++;
shintamainjp 0:7e51c3176eb7 273 if (TIMEOUT_MS < cnt) {
shintamainjp 0:7e51c3176eb7 274 debout.printf(" [Timed out]\n");
shintamainjp 0:7e51c3176eb7 275 return false;
shintamainjp 0:7e51c3176eb7 276 }
shintamainjp 0:7e51c3176eb7 277 }
shintamainjp 0:7e51c3176eb7 278 serial.putc(buf[i]);
shintamainjp 0:7e51c3176eb7 279 debout.printf(" %02X", buf[i]);
shintamainjp 0:7e51c3176eb7 280 }
shintamainjp 0:7e51c3176eb7 281 debout.printf(" [OK]\n");
shintamainjp 0:7e51c3176eb7 282 return true;
shintamainjp 0:7e51c3176eb7 283 }
shintamainjp 0:7e51c3176eb7 284
shintamainjp 0:7e51c3176eb7 285 /**
shintamainjp 0:7e51c3176eb7 286 * Receive bytes from camera module.
shintamainjp 0:7e51c3176eb7 287 *
shintamainjp 0:7e51c3176eb7 288 * @param buf Pointer to the data buffer.
shintamainjp 0:7e51c3176eb7 289 * @param len Length of the data buffer.
shintamainjp 0:7e51c3176eb7 290 *
shintamainjp 0:7e51c3176eb7 291 * @return True if the data received.
shintamainjp 0:7e51c3176eb7 292 */
shintamainjp 0:7e51c3176eb7 293 bool CameraC328::recvBytesWithDebugOutput(char *buf, size_t len) {
shintamainjp 0:7e51c3176eb7 294 debout.printf("RECV : ");
shintamainjp 0:7e51c3176eb7 295 for (int i = 0; i < (int)len; i++) {
shintamainjp 0:7e51c3176eb7 296 int cnt = 0;
shintamainjp 0:7e51c3176eb7 297 while (!serial.readable()) {
shintamainjp 0:7e51c3176eb7 298 wait(0.001);
shintamainjp 0:7e51c3176eb7 299 cnt++;
shintamainjp 0:7e51c3176eb7 300 if (TIMEOUT_MS < cnt) {
shintamainjp 0:7e51c3176eb7 301 debout.printf(" [Timed out]\n");
shintamainjp 0:7e51c3176eb7 302 return false;
shintamainjp 0:7e51c3176eb7 303 }
shintamainjp 0:7e51c3176eb7 304 }
shintamainjp 0:7e51c3176eb7 305 buf[i] = serial.getc();
shintamainjp 0:7e51c3176eb7 306 debout.printf(" %02X", buf[i]);
shintamainjp 0:7e51c3176eb7 307 }
shintamainjp 0:7e51c3176eb7 308 debout.printf(" [OK]\n");
shintamainjp 0:7e51c3176eb7 309 return true;
shintamainjp 0:7e51c3176eb7 310 }