CameraC328

Dependents:   CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more

Committer:
shintamainjp
Date:
Mon Jun 28 13:57:15 2010 +0000
Revision:
2:6a72fcad5c0a
Parent:
1:167e51d598cf
Child:
3:6d3150d4396a

        

Who changed what in which revision?

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