CameraC328

Dependents:   CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more

Committer:
shintamainjp
Date:
Sun Jun 27 05:04:04 2010 +0000
Revision:
1:167e51d598cf
Parent:
0:7e51c3176eb7
Child:
2:6a72fcad5c0a

        

Who changed what in which revision?

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