test

Dependents:   HEPTA_assembly template HEPTA_GS

Committer:
hepta2ume
Date:
Wed Jul 19 09:07:30 2017 +0000
Revision:
1:d16a4c3a272a
Parent:
0:5a6468b4164d
hepta_cam

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sunifu 0:5a6468b4164d 1 #include "CameraC1098.h"
hepta2ume 1:d16a4c3a272a 2 static FILE *fp_jpeg;
sunifu 0:5a6468b4164d 3 #define WAITIDLE waitIdle
sunifu 0:5a6468b4164d 4 #define SENDFUNC sendBytes
sunifu 0:5a6468b4164d 5 #define RECVFUNC recvBytes
sunifu 0:5a6468b4164d 6 #define WAITFUNC waitRecv
hepta2ume 1:d16a4c3a272a 7 int num=0;
sunifu 0:5a6468b4164d 8 /**
sunifu 0:5a6468b4164d 9 * Constructor.
sunifu 0:5a6468b4164d 10 *
sunifu 0:5a6468b4164d 11 * @param tx A pin for transmit.
sunifu 0:5a6468b4164d 12 * @param rx A pin for receive.
sunifu 0:5a6468b4164d 13 * @param baud Baud rate. (Default is Baud14400.)
sunifu 0:5a6468b4164d 14 */
hepta2ume 1:d16a4c3a272a 15 CameraC1098::CameraC1098(PinName tx, PinName rx, int baud) : serial(tx, rx)
hepta2ume 1:d16a4c3a272a 16 {
sunifu 0:5a6468b4164d 17 serial.baud(baud);
sunifu 0:5a6468b4164d 18 }
sunifu 0:5a6468b4164d 19
sunifu 0:5a6468b4164d 20 /**
sunifu 0:5a6468b4164d 21 * Destructor.
sunifu 0:5a6468b4164d 22 */
hepta2ume 1:d16a4c3a272a 23 CameraC1098::~CameraC1098()
hepta2ume 1:d16a4c3a272a 24 {
sunifu 0:5a6468b4164d 25 }
sunifu 0:5a6468b4164d 26
sunifu 0:5a6468b4164d 27 /**
sunifu 0:5a6468b4164d 28 * Make a sync. for baud rate.
sunifu 0:5a6468b4164d 29 */
hepta2ume 1:d16a4c3a272a 30 CameraC1098::ErrorNumber CameraC1098::sync()
hepta2ume 1:d16a4c3a272a 31 {
sunifu 0:5a6468b4164d 32 for (int i = 0; i < SYNCMAX; i++) {
sunifu 0:5a6468b4164d 33 if (NoError == sendSync()) {
sunifu 0:5a6468b4164d 34 if (NoError == recvAckOrNck()) {
sunifu 0:5a6468b4164d 35 if (NoError == recvSync()) {
sunifu 0:5a6468b4164d 36 if (NoError == sendAck(0x0D, 0x00)) {
sunifu 0:5a6468b4164d 37 /*
sunifu 0:5a6468b4164d 38 * After synchronization, the camera needs a little time for AEC and AGC to be stable.
sunifu 0:5a6468b4164d 39 * Users should wait for 1-2 seconds before capturing the first picture.
sunifu 0:5a6468b4164d 40 */
sunifu 0:5a6468b4164d 41 wait(2.0);
sunifu 0:5a6468b4164d 42 return NoError;
sunifu 0:5a6468b4164d 43 }
sunifu 0:5a6468b4164d 44 }
sunifu 0:5a6468b4164d 45 }
sunifu 0:5a6468b4164d 46 }
sunifu 0:5a6468b4164d 47 wait_ms(50);
sunifu 0:5a6468b4164d 48 }
sunifu 0:5a6468b4164d 49 return UnexpectedReply;
sunifu 0:5a6468b4164d 50 }
sunifu 0:5a6468b4164d 51
sunifu 0:5a6468b4164d 52 /**
sunifu 0:5a6468b4164d 53 * Initialize.
sunifu 0:5a6468b4164d 54 *
sunifu 0:5a6468b4164d 55 * @param baud Camera Interface Speed.
sunifu 0:5a6468b4164d 56 * @param jr JPEG resolution.
sunifu 0:5a6468b4164d 57 */
hepta2ume 1:d16a4c3a272a 58 CameraC1098::ErrorNumber CameraC1098::init(Baud baud,JpegResolution jr)
hepta2ume 1:d16a4c3a272a 59 {
sunifu 0:5a6468b4164d 60 int i ;
sunifu 0:5a6468b4164d 61 ErrorNumber en;
sunifu 0:5a6468b4164d 62 WAITIDLE();
sunifu 0:5a6468b4164d 63 setmbedBaud((Baud)(0x07)) ;
hepta2ume 1:d16a4c3a272a 64
sunifu 0:5a6468b4164d 65 for ( i = 1 ; i < 7 ; i++ ) {
sunifu 0:5a6468b4164d 66 if ( NoError == sendSync() ) {
hepta2ume 1:d16a4c3a272a 67 if ( NoError == recvAckOrNck() ) {
sunifu 0:5a6468b4164d 68 if ( NoError == recvSync() ) {
sunifu 0:5a6468b4164d 69 if ( NoError == sendAck(0x0D, 0x00) ) {
sunifu 0:5a6468b4164d 70 en = sendInitial(baud,jr);
sunifu 0:5a6468b4164d 71 if (NoError != en) {
sunifu 0:5a6468b4164d 72 return en;
hepta2ume 1:d16a4c3a272a 73 }
sunifu 0:5a6468b4164d 74 en = recvAckOrNck();
sunifu 0:5a6468b4164d 75 if (NoError != en) {
sunifu 0:5a6468b4164d 76 return en;
hepta2ume 1:d16a4c3a272a 77 }
sunifu 0:5a6468b4164d 78 wait_ms(50) ;
hepta2ume 1:d16a4c3a272a 79 setmbedBaud(baud);
hepta2ume 1:d16a4c3a272a 80 //wait_ms(50) ;
sunifu 0:5a6468b4164d 81 static bool alreadySetupPackageSize = false;
sunifu 0:5a6468b4164d 82 if (!alreadySetupPackageSize) {
sunifu 0:5a6468b4164d 83 en = sendSetPackageSize(packageSize);
sunifu 0:5a6468b4164d 84 if (NoError != en) {
sunifu 0:5a6468b4164d 85 return en;
sunifu 0:5a6468b4164d 86 }
sunifu 0:5a6468b4164d 87 WAITFUNC();
sunifu 0:5a6468b4164d 88 en = recvAckOrNck();
sunifu 0:5a6468b4164d 89 if (NoError != en) {
sunifu 0:5a6468b4164d 90 return en;
sunifu 0:5a6468b4164d 91 }
sunifu 0:5a6468b4164d 92 alreadySetupPackageSize = true;
sunifu 0:5a6468b4164d 93 }
hepta2ume 1:d16a4c3a272a 94
sunifu 0:5a6468b4164d 95 wait(2.0);
hepta2ume 1:d16a4c3a272a 96 return (ErrorNumber)NoError;
hepta2ume 1:d16a4c3a272a 97 /*
hepta2ume 1:d16a4c3a272a 98 * After synchronization, the camera needs a little time for AEC and AGC to be stable.
hepta2ume 1:d16a4c3a272a 99 * Users should wait for 1-2 seconds before capturing the first picture.
hepta2ume 1:d16a4c3a272a 100 */
sunifu 0:5a6468b4164d 101 }
hepta2ume 1:d16a4c3a272a 102 }
hepta2ume 1:d16a4c3a272a 103 } else {
hepta2ume 1:d16a4c3a272a 104 setmbedBaud((Baud)(i+1)) ;
sunifu 0:5a6468b4164d 105 }
sunifu 0:5a6468b4164d 106 }
hepta2ume 1:d16a4c3a272a 107 wait_ms(50);
hepta2ume 1:d16a4c3a272a 108 }
sunifu 0:5a6468b4164d 109 return UnexpectedReply;
sunifu 0:5a6468b4164d 110 }
sunifu 0:5a6468b4164d 111
sunifu 0:5a6468b4164d 112
sunifu 0:5a6468b4164d 113 /**
sunifu 0:5a6468b4164d 114 * Get JPEG snapshot picture.
sunifu 0:5a6468b4164d 115 *
sunifu 0:5a6468b4164d 116 * @param func A pointer to a callback function.
sunifu 0:5a6468b4164d 117 * You can block this function until saving the image datas.
sunifu 0:5a6468b4164d 118 * @return Status of the error.
sunifu 0:5a6468b4164d 119 */
hepta2ume 1:d16a4c3a272a 120 CameraC1098::ErrorNumber CameraC1098::getJpegSnapshotPicture()
hepta2ume 1:d16a4c3a272a 121 {
hepta2ume 1:d16a4c3a272a 122 WAITIDLE();
hepta2ume 1:d16a4c3a272a 123 ErrorNumber en;
hepta2ume 1:d16a4c3a272a 124
hepta2ume 1:d16a4c3a272a 125
hepta2ume 1:d16a4c3a272a 126 en = sendSnapshot();
hepta2ume 1:d16a4c3a272a 127 if (NoError != en) {
hepta2ume 1:d16a4c3a272a 128 return en;
hepta2ume 1:d16a4c3a272a 129 }
hepta2ume 1:d16a4c3a272a 130 WAITFUNC();
hepta2ume 1:d16a4c3a272a 131 en = recvAckOrNck();
hepta2ume 1:d16a4c3a272a 132 if (NoError != en) {
hepta2ume 1:d16a4c3a272a 133 return en;
hepta2ume 1:d16a4c3a272a 134 }
hepta2ume 1:d16a4c3a272a 135
hepta2ume 1:d16a4c3a272a 136 en = sendGetPicture();
hepta2ume 1:d16a4c3a272a 137 if (NoError != en) {
hepta2ume 1:d16a4c3a272a 138 return en;
hepta2ume 1:d16a4c3a272a 139 }
hepta2ume 1:d16a4c3a272a 140 WAITFUNC();
hepta2ume 1:d16a4c3a272a 141 en = recvAckOrNck();
hepta2ume 1:d16a4c3a272a 142 if (NoError != en) {
hepta2ume 1:d16a4c3a272a 143 return en;
hepta2ume 1:d16a4c3a272a 144 }
hepta2ume 1:d16a4c3a272a 145
hepta2ume 1:d16a4c3a272a 146 /*
hepta2ume 1:d16a4c3a272a 147 * Data : snapshot picture
hepta2ume 1:d16a4c3a272a 148 */
hepta2ume 1:d16a4c3a272a 149 uint32_t length = 0;
hepta2ume 1:d16a4c3a272a 150 WAITFUNC();
hepta2ume 1:d16a4c3a272a 151 en = recvData(&length);
hepta2ume 1:d16a4c3a272a 152 if (NoError != en) {
hepta2ume 1:d16a4c3a272a 153 return en;
hepta2ume 1:d16a4c3a272a 154 }
hepta2ume 1:d16a4c3a272a 155 en = sendAck(0x00, 0);
hepta2ume 1:d16a4c3a272a 156 if (NoError != en) {
hepta2ume 1:d16a4c3a272a 157 return en;
hepta2ume 1:d16a4c3a272a 158 }
hepta2ume 1:d16a4c3a272a 159
hepta2ume 1:d16a4c3a272a 160 char databuf[packageSize - 6];
hepta2ume 1:d16a4c3a272a 161 uint16_t pkg_total = length / (packageSize - 6);
hepta2ume 1:d16a4c3a272a 162 for (int i = 0; i <= (int)pkg_total; i++) {
hepta2ume 1:d16a4c3a272a 163 uint16_t checksum = 0;
hepta2ume 1:d16a4c3a272a 164 // ID.
hepta2ume 1:d16a4c3a272a 165 char idbuf[2];
hepta2ume 1:d16a4c3a272a 166 WAITFUNC();
hepta2ume 1:d16a4c3a272a 167 if (!RECVFUNC(idbuf, sizeof(idbuf))) {
hepta2ume 1:d16a4c3a272a 168 return (ErrorNumber)UnexpectedReply;
hepta2ume 1:d16a4c3a272a 169 }
hepta2ume 1:d16a4c3a272a 170 checksum += idbuf[0];
hepta2ume 1:d16a4c3a272a 171 checksum += idbuf[1];
hepta2ume 1:d16a4c3a272a 172 uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
hepta2ume 1:d16a4c3a272a 173 if (id != i) {
hepta2ume 1:d16a4c3a272a 174 return (ErrorNumber)UnexpectedReply;
hepta2ume 1:d16a4c3a272a 175 }
hepta2ume 1:d16a4c3a272a 176
hepta2ume 1:d16a4c3a272a 177 // Size of the data.
hepta2ume 1:d16a4c3a272a 178 char dsbuf[2];
hepta2ume 1:d16a4c3a272a 179 WAITFUNC();
hepta2ume 1:d16a4c3a272a 180 if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
hepta2ume 1:d16a4c3a272a 181 return (ErrorNumber)UnexpectedReply;
hepta2ume 1:d16a4c3a272a 182 }
hepta2ume 1:d16a4c3a272a 183
hepta2ume 1:d16a4c3a272a 184 // Received the data.
hepta2ume 1:d16a4c3a272a 185 checksum += dsbuf[0];
hepta2ume 1:d16a4c3a272a 186 checksum += dsbuf[1];
hepta2ume 1:d16a4c3a272a 187 uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
hepta2ume 1:d16a4c3a272a 188 WAITFUNC();
hepta2ume 1:d16a4c3a272a 189 if (!RECVFUNC(&databuf[0], ds)) {
hepta2ume 1:d16a4c3a272a 190 return (ErrorNumber)UnexpectedReply;
hepta2ume 1:d16a4c3a272a 191 }
hepta2ume 1:d16a4c3a272a 192 for (int j = 0; j < ds; j++) {
hepta2ume 1:d16a4c3a272a 193 checksum += databuf[j];
hepta2ume 1:d16a4c3a272a 194 }
hepta2ume 1:d16a4c3a272a 195
hepta2ume 1:d16a4c3a272a 196 // Verify code.
hepta2ume 1:d16a4c3a272a 197 char vcbuf[2];
hepta2ume 1:d16a4c3a272a 198 WAITFUNC();
hepta2ume 1:d16a4c3a272a 199 if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
hepta2ume 1:d16a4c3a272a 200 return (ErrorNumber)UnexpectedReply;
hepta2ume 1:d16a4c3a272a 201 }
hepta2ume 1:d16a4c3a272a 202 uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
hepta2ume 1:d16a4c3a272a 203 if (vc != (checksum & 0xff)) {
hepta2ume 1:d16a4c3a272a 204 return (ErrorNumber)UnexpectedReply;
hepta2ume 1:d16a4c3a272a 205 }
hepta2ume 1:d16a4c3a272a 206
hepta2ume 1:d16a4c3a272a 207 /*
hepta2ume 1:d16a4c3a272a 208 * Call a call back function.
hepta2ume 1:d16a4c3a272a 209 * You can block this function while working.
hepta2ume 1:d16a4c3a272a 210 */
hepta2ume 1:d16a4c3a272a 211 size_t siz = ds;
hepta2ume 1:d16a4c3a272a 212 for (int ii = 0; ii < (int)siz; ii++) {
hepta2ume 1:d16a4c3a272a 213 fprintf(fp_jpeg, "%c", databuf[ii]);
hepta2ume 1:d16a4c3a272a 214 }
hepta2ume 1:d16a4c3a272a 215 /*
hepta2ume 1:d16a4c3a272a 216 * We should wait for camera working before reply a ACK.
hepta2ume 1:d16a4c3a272a 217 */
hepta2ume 1:d16a4c3a272a 218 wait_ms(100);
hepta2ume 1:d16a4c3a272a 219 en = sendAck(0x00, 1 + i);
hepta2ume 1:d16a4c3a272a 220 if (NoError != en) {
hepta2ume 1:d16a4c3a272a 221 return en;
hepta2ume 1:d16a4c3a272a 222 }
hepta2ume 1:d16a4c3a272a 223 }
hepta2ume 1:d16a4c3a272a 224
hepta2ume 1:d16a4c3a272a 225 return (ErrorNumber)NoError;
hepta2ume 1:d16a4c3a272a 226 }
hepta2ume 1:d16a4c3a272a 227
hepta2ume 1:d16a4c3a272a 228 CameraC1098::ErrorNumber CameraC1098::getJpegSnapshotPicture_data()
hepta2ume 1:d16a4c3a272a 229 {
sunifu 0:5a6468b4164d 230 WAITIDLE();
sunifu 0:5a6468b4164d 231 ErrorNumber en;
sunifu 0:5a6468b4164d 232
sunifu 0:5a6468b4164d 233
sunifu 0:5a6468b4164d 234 en = sendSnapshot();
sunifu 0:5a6468b4164d 235 if (NoError != en) {
sunifu 0:5a6468b4164d 236 return en;
sunifu 0:5a6468b4164d 237 }
sunifu 0:5a6468b4164d 238 WAITFUNC();
sunifu 0:5a6468b4164d 239 en = recvAckOrNck();
sunifu 0:5a6468b4164d 240 if (NoError != en) {
sunifu 0:5a6468b4164d 241 return en;
sunifu 0:5a6468b4164d 242 }
sunifu 0:5a6468b4164d 243
sunifu 0:5a6468b4164d 244 en = sendGetPicture();
sunifu 0:5a6468b4164d 245 if (NoError != en) {
sunifu 0:5a6468b4164d 246 return en;
sunifu 0:5a6468b4164d 247 }
sunifu 0:5a6468b4164d 248 WAITFUNC();
sunifu 0:5a6468b4164d 249 en = recvAckOrNck();
sunifu 0:5a6468b4164d 250 if (NoError != en) {
sunifu 0:5a6468b4164d 251 return en;
sunifu 0:5a6468b4164d 252 }
sunifu 0:5a6468b4164d 253
sunifu 0:5a6468b4164d 254 /*
sunifu 0:5a6468b4164d 255 * Data : snapshot picture
sunifu 0:5a6468b4164d 256 */
sunifu 0:5a6468b4164d 257 uint32_t length = 0;
sunifu 0:5a6468b4164d 258 WAITFUNC();
sunifu 0:5a6468b4164d 259 en = recvData(&length);
sunifu 0:5a6468b4164d 260 if (NoError != en) {
sunifu 0:5a6468b4164d 261 return en;
sunifu 0:5a6468b4164d 262 }
sunifu 0:5a6468b4164d 263 en = sendAck(0x00, 0);
sunifu 0:5a6468b4164d 264 if (NoError != en) {
sunifu 0:5a6468b4164d 265 return en;
sunifu 0:5a6468b4164d 266 }
sunifu 0:5a6468b4164d 267
sunifu 0:5a6468b4164d 268 char databuf[packageSize - 6];
sunifu 0:5a6468b4164d 269 uint16_t pkg_total = length / (packageSize - 6);
sunifu 0:5a6468b4164d 270 for (int i = 0; i <= (int)pkg_total; i++) {
sunifu 0:5a6468b4164d 271 uint16_t checksum = 0;
sunifu 0:5a6468b4164d 272 // ID.
sunifu 0:5a6468b4164d 273 char idbuf[2];
sunifu 0:5a6468b4164d 274 WAITFUNC();
sunifu 0:5a6468b4164d 275 if (!RECVFUNC(idbuf, sizeof(idbuf))) {
sunifu 0:5a6468b4164d 276 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 277 }
sunifu 0:5a6468b4164d 278 checksum += idbuf[0];
sunifu 0:5a6468b4164d 279 checksum += idbuf[1];
sunifu 0:5a6468b4164d 280 uint16_t id = (idbuf[1] << 8) | (idbuf[0] << 0);
sunifu 0:5a6468b4164d 281 if (id != i) {
sunifu 0:5a6468b4164d 282 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 283 }
sunifu 0:5a6468b4164d 284
sunifu 0:5a6468b4164d 285 // Size of the data.
sunifu 0:5a6468b4164d 286 char dsbuf[2];
sunifu 0:5a6468b4164d 287 WAITFUNC();
sunifu 0:5a6468b4164d 288 if (!RECVFUNC(dsbuf, sizeof(dsbuf))) {
sunifu 0:5a6468b4164d 289 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 290 }
sunifu 0:5a6468b4164d 291
sunifu 0:5a6468b4164d 292 // Received the data.
sunifu 0:5a6468b4164d 293 checksum += dsbuf[0];
sunifu 0:5a6468b4164d 294 checksum += dsbuf[1];
sunifu 0:5a6468b4164d 295 uint16_t ds = (dsbuf[1] << 8) | (dsbuf[0] << 0);
sunifu 0:5a6468b4164d 296 WAITFUNC();
sunifu 0:5a6468b4164d 297 if (!RECVFUNC(&databuf[0], ds)) {
sunifu 0:5a6468b4164d 298 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 299 }
sunifu 0:5a6468b4164d 300 for (int j = 0; j < ds; j++) {
sunifu 0:5a6468b4164d 301 checksum += databuf[j];
sunifu 0:5a6468b4164d 302 }
sunifu 0:5a6468b4164d 303
sunifu 0:5a6468b4164d 304 // Verify code.
sunifu 0:5a6468b4164d 305 char vcbuf[2];
sunifu 0:5a6468b4164d 306 WAITFUNC();
sunifu 0:5a6468b4164d 307 if (!RECVFUNC(vcbuf, sizeof(vcbuf))) {
sunifu 0:5a6468b4164d 308 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 309 }
sunifu 0:5a6468b4164d 310 uint16_t vc = (vcbuf[1] << 8) | (vcbuf[0] << 0);
sunifu 0:5a6468b4164d 311 if (vc != (checksum & 0xff)) {
sunifu 0:5a6468b4164d 312 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 313 }
sunifu 0:5a6468b4164d 314
sunifu 0:5a6468b4164d 315 /*
sunifu 0:5a6468b4164d 316 * Call a call back function.
sunifu 0:5a6468b4164d 317 * You can block this function while working.
sunifu 0:5a6468b4164d 318 */
hepta2ume 1:d16a4c3a272a 319 size_t siz = ds;
hepta2ume 1:d16a4c3a272a 320 for (int ii = 0; ii < (int)siz; ii++) {
hepta2ume 1:d16a4c3a272a 321 fprintf(fp_jpeg, "%02X ", databuf[ii]);
hepta2ume 1:d16a4c3a272a 322 if(++num%16==0) fprintf(fp_jpeg,"\r\n");
hepta2ume 1:d16a4c3a272a 323 }
sunifu 0:5a6468b4164d 324 /*
sunifu 0:5a6468b4164d 325 * We should wait for camera working before reply a ACK.
sunifu 0:5a6468b4164d 326 */
sunifu 0:5a6468b4164d 327 wait_ms(100);
sunifu 0:5a6468b4164d 328 en = sendAck(0x00, 1 + i);
sunifu 0:5a6468b4164d 329 if (NoError != en) {
sunifu 0:5a6468b4164d 330 return en;
sunifu 0:5a6468b4164d 331 }
sunifu 0:5a6468b4164d 332 }
sunifu 0:5a6468b4164d 333
sunifu 0:5a6468b4164d 334 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 335 }
sunifu 0:5a6468b4164d 336
hepta2ume 1:d16a4c3a272a 337 CameraC1098::ErrorNumber CameraC1098::sendInitial(Baud baud, JpegResolution jr)
hepta2ume 1:d16a4c3a272a 338 {
hepta2ume 1:d16a4c3a272a 339 char send[COMMAND_LENGTH];
sunifu 0:5a6468b4164d 340
sunifu 0:5a6468b4164d 341 send[0] = 0xAA;
sunifu 0:5a6468b4164d 342 send[1] = 0x01;
sunifu 0:5a6468b4164d 343 send[2] = (char)baud;
sunifu 0:5a6468b4164d 344 send[3] = 0x07;
sunifu 0:5a6468b4164d 345 send[4] = 0x00;
sunifu 0:5a6468b4164d 346 send[5] = (char)jr;
sunifu 0:5a6468b4164d 347
sunifu 0:5a6468b4164d 348 if (!SENDFUNC(send, sizeof(send))) {
sunifu 0:5a6468b4164d 349 return (ErrorNumber)SendRegisterTimeout;
sunifu 0:5a6468b4164d 350 }
sunifu 0:5a6468b4164d 351
sunifu 0:5a6468b4164d 352 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 353 }
sunifu 0:5a6468b4164d 354
hepta2ume 1:d16a4c3a272a 355 CameraC1098::ErrorNumber CameraC1098::sendGetPicture(void)
hepta2ume 1:d16a4c3a272a 356 {
sunifu 0:5a6468b4164d 357 char send[COMMAND_LENGTH];
sunifu 0:5a6468b4164d 358
sunifu 0:5a6468b4164d 359 send[0] = 0xAA;
sunifu 0:5a6468b4164d 360 send[1] = 0x04;
sunifu 0:5a6468b4164d 361 send[2] = 0x01;
sunifu 0:5a6468b4164d 362 send[3] = 0x00;
sunifu 0:5a6468b4164d 363 send[4] = 0x00;
sunifu 0:5a6468b4164d 364 send[5] = 0x00;
sunifu 0:5a6468b4164d 365
sunifu 0:5a6468b4164d 366 if (!SENDFUNC(send, sizeof(send))) {
sunifu 0:5a6468b4164d 367 return (ErrorNumber)SendRegisterTimeout;
sunifu 0:5a6468b4164d 368 }
sunifu 0:5a6468b4164d 369 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 370 }
sunifu 0:5a6468b4164d 371
hepta2ume 1:d16a4c3a272a 372 CameraC1098::ErrorNumber CameraC1098::sendSnapshot(void)
hepta2ume 1:d16a4c3a272a 373 {
sunifu 0:5a6468b4164d 374 char send[COMMAND_LENGTH];
sunifu 0:5a6468b4164d 375 send[0] = 0xAA;
sunifu 0:5a6468b4164d 376 send[1] = 0x05;
sunifu 0:5a6468b4164d 377 send[2] = 0x00;
sunifu 0:5a6468b4164d 378 send[3] = 0x00;
sunifu 0:5a6468b4164d 379 send[4] = 0x00;
sunifu 0:5a6468b4164d 380 send[5] = 0x00;
sunifu 0:5a6468b4164d 381
sunifu 0:5a6468b4164d 382 if (!SENDFUNC(send, sizeof(send))) {
sunifu 0:5a6468b4164d 383 return (ErrorNumber)SendRegisterTimeout;
sunifu 0:5a6468b4164d 384 }
sunifu 0:5a6468b4164d 385 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 386 }
sunifu 0:5a6468b4164d 387
hepta2ume 1:d16a4c3a272a 388 CameraC1098::ErrorNumber CameraC1098::sendSetPackageSize(uint16_t packageSize)
hepta2ume 1:d16a4c3a272a 389 {
sunifu 0:5a6468b4164d 390 char send[COMMAND_LENGTH];
sunifu 0:5a6468b4164d 391 send[0] = 0xAA;
sunifu 0:5a6468b4164d 392 send[1] = 0x06;
sunifu 0:5a6468b4164d 393 send[2] = 0x08;
sunifu 0:5a6468b4164d 394 send[3] = (packageSize >> 0) & 0xff;
sunifu 0:5a6468b4164d 395 send[4] = (packageSize >> 8) & 0xff;
sunifu 0:5a6468b4164d 396 send[5] = 0x00;
sunifu 0:5a6468b4164d 397
sunifu 0:5a6468b4164d 398 if (!SENDFUNC(send, sizeof(send))) {
sunifu 0:5a6468b4164d 399 return (ErrorNumber)SendRegisterTimeout;
sunifu 0:5a6468b4164d 400 }
sunifu 0:5a6468b4164d 401 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 402 }
sunifu 0:5a6468b4164d 403
hepta2ume 1:d16a4c3a272a 404 void CameraC1098::setmbedBaud(Baud baud)
hepta2ume 1:d16a4c3a272a 405 {
hepta2ume 1:d16a4c3a272a 406 switch((int)baud) {
hepta2ume 1:d16a4c3a272a 407 case 0x02:
hepta2ume 1:d16a4c3a272a 408 serial._baud(460800);
hepta2ume 1:d16a4c3a272a 409 break;
hepta2ume 1:d16a4c3a272a 410 case 0x03:
hepta2ume 1:d16a4c3a272a 411 serial._baud(230400);
hepta2ume 1:d16a4c3a272a 412 break;
hepta2ume 1:d16a4c3a272a 413 case 0x04:
hepta2ume 1:d16a4c3a272a 414 serial._baud(115200);
hepta2ume 1:d16a4c3a272a 415 break;
hepta2ume 1:d16a4c3a272a 416 case 0x05:
hepta2ume 1:d16a4c3a272a 417 serial._baud(57600);
hepta2ume 1:d16a4c3a272a 418 break;
hepta2ume 1:d16a4c3a272a 419 case 0x06:
hepta2ume 1:d16a4c3a272a 420 serial._baud((int)28800);
hepta2ume 1:d16a4c3a272a 421 break;
hepta2ume 1:d16a4c3a272a 422 case 0x07:
hepta2ume 1:d16a4c3a272a 423 serial._baud(14400);
hepta2ume 1:d16a4c3a272a 424 break;
hepta2ume 1:d16a4c3a272a 425 default:
hepta2ume 1:d16a4c3a272a 426 serial._baud(14400);
sunifu 0:5a6468b4164d 427 }
sunifu 0:5a6468b4164d 428 }
sunifu 0:5a6468b4164d 429
sunifu 0:5a6468b4164d 430
hepta2ume 1:d16a4c3a272a 431 CameraC1098::ErrorNumber CameraC1098::sendReset(ResetType specialReset)
hepta2ume 1:d16a4c3a272a 432 {
sunifu 0:5a6468b4164d 433 char send[COMMAND_LENGTH];
sunifu 0:5a6468b4164d 434 send[0] = 0xAA;
sunifu 0:5a6468b4164d 435 send[1] = 0x08;
sunifu 0:5a6468b4164d 436 send[2] = 0x00;
sunifu 0:5a6468b4164d 437 send[3] = 0x00;
sunifu 0:5a6468b4164d 438 send[4] = 0x00;
sunifu 0:5a6468b4164d 439 send[5] = specialReset;
sunifu 0:5a6468b4164d 440 /*
sunifu 0:5a6468b4164d 441 * Special reset : If the parameter is 0xFF, the command is a special Reset command and the firmware responds to it immediately.
sunifu 0:5a6468b4164d 442 */
sunifu 0:5a6468b4164d 443
sunifu 0:5a6468b4164d 444 if (!SENDFUNC(send, sizeof(send))) {
sunifu 0:5a6468b4164d 445 return (ErrorNumber)SendRegisterTimeout;
sunifu 0:5a6468b4164d 446 }
sunifu 0:5a6468b4164d 447
sunifu 0:5a6468b4164d 448 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 449 }
sunifu 0:5a6468b4164d 450
sunifu 0:5a6468b4164d 451
hepta2ume 1:d16a4c3a272a 452 CameraC1098::ErrorNumber CameraC1098::recvData(uint32_t *length)
hepta2ume 1:d16a4c3a272a 453 {
sunifu 0:5a6468b4164d 454 char recv[COMMAND_LENGTH];
sunifu 0:5a6468b4164d 455 if (!RECVFUNC(recv, sizeof(recv))) {
sunifu 0:5a6468b4164d 456 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 457 }
sunifu 0:5a6468b4164d 458 if ((0xAA != recv[0]) || (0x0A != recv[1])) {
sunifu 0:5a6468b4164d 459 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 460 }
sunifu 0:5a6468b4164d 461 recv[2] = (char)0x01;
sunifu 0:5a6468b4164d 462 *length = (recv[5] << 16) | (recv[4] << 8) | (recv[3] << 0);
sunifu 0:5a6468b4164d 463 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 464 }
sunifu 0:5a6468b4164d 465
hepta2ume 1:d16a4c3a272a 466 CameraC1098::ErrorNumber CameraC1098::sendSync()
hepta2ume 1:d16a4c3a272a 467 {
sunifu 0:5a6468b4164d 468 char send[COMMAND_LENGTH];
sunifu 0:5a6468b4164d 469 send[0] = 0xAA;
sunifu 0:5a6468b4164d 470 send[1] = 0x0D;
sunifu 0:5a6468b4164d 471 send[2] = 0x00;
sunifu 0:5a6468b4164d 472 send[3] = 0x00;
sunifu 0:5a6468b4164d 473 send[4] = 0x00;
sunifu 0:5a6468b4164d 474 send[5] = 0x00;
hepta2ume 1:d16a4c3a272a 475
hepta2ume 1:d16a4c3a272a 476
sunifu 0:5a6468b4164d 477 if (!SENDFUNC(send, sizeof(send))) {
sunifu 0:5a6468b4164d 478 return (ErrorNumber)SendRegisterTimeout;
sunifu 0:5a6468b4164d 479 }
sunifu 0:5a6468b4164d 480 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 481 }
sunifu 0:5a6468b4164d 482
hepta2ume 1:d16a4c3a272a 483 CameraC1098::ErrorNumber CameraC1098::recvSync()
hepta2ume 1:d16a4c3a272a 484 {
sunifu 0:5a6468b4164d 485 char recv[COMMAND_LENGTH];
hepta2ume 1:d16a4c3a272a 486
sunifu 0:5a6468b4164d 487 if (!RECVFUNC(recv, sizeof(recv))) {
sunifu 0:5a6468b4164d 488 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 489 }
sunifu 0:5a6468b4164d 490 if ((0xAA != recv[0]) || (0x0D != recv[1])) {
sunifu 0:5a6468b4164d 491 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 492 }
sunifu 0:5a6468b4164d 493 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 494 }
sunifu 0:5a6468b4164d 495
sunifu 0:5a6468b4164d 496 /**
sunifu 0:5a6468b4164d 497 * Send ACK.
sunifu 0:5a6468b4164d 498 *
sunifu 0:5a6468b4164d 499 * @param commandId The command with that ID is acknowledged by this command.
sunifu 0:5a6468b4164d 500 * @param packageId For acknowledging Data command, these two bytes represent the requested package ID. While for acknowledging other commands, these two bytes are set to 00h.
sunifu 0:5a6468b4164d 501 */
hepta2ume 1:d16a4c3a272a 502 CameraC1098::ErrorNumber CameraC1098::sendAck(uint8_t commandId, uint16_t packageId)
hepta2ume 1:d16a4c3a272a 503 {
sunifu 0:5a6468b4164d 504 char send[COMMAND_LENGTH];
sunifu 0:5a6468b4164d 505
sunifu 0:5a6468b4164d 506 send[0] = 0xAA;
sunifu 0:5a6468b4164d 507 send[1] = 0x0E;
sunifu 0:5a6468b4164d 508 send[2] = commandId;
sunifu 0:5a6468b4164d 509 send[3] = 0x00; // ACK counter is not used.
sunifu 0:5a6468b4164d 510 send[4] = (packageId >> 0) & 0xff;
sunifu 0:5a6468b4164d 511 send[5] = (packageId >> 8) & 0xff;
sunifu 0:5a6468b4164d 512 if (!SENDFUNC(send, sizeof(send))) {
sunifu 0:5a6468b4164d 513 return (ErrorNumber)SendRegisterTimeout;
sunifu 0:5a6468b4164d 514 }
sunifu 0:5a6468b4164d 515 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 516 }
sunifu 0:5a6468b4164d 517
sunifu 0:5a6468b4164d 518 /**
sunifu 0:5a6468b4164d 519 * Receive ACK or NCK.
sunifu 0:5a6468b4164d 520 *
sunifu 0:5a6468b4164d 521 * @return Error number.
sunifu 0:5a6468b4164d 522 */
hepta2ume 1:d16a4c3a272a 523 CameraC1098::ErrorNumber CameraC1098::recvAckOrNck()
hepta2ume 1:d16a4c3a272a 524 {
sunifu 0:5a6468b4164d 525 char recv[COMMAND_LENGTH];
hepta2ume 1:d16a4c3a272a 526
sunifu 0:5a6468b4164d 527 if (!RECVFUNC(recv, sizeof(recv))) {
sunifu 0:5a6468b4164d 528 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 529 }
sunifu 0:5a6468b4164d 530 if ((0xAA == recv[0]) && (0x0E == recv[1])) {
sunifu 0:5a6468b4164d 531 return (ErrorNumber)NoError;
sunifu 0:5a6468b4164d 532 }
sunifu 0:5a6468b4164d 533 if ((0xAA == recv[0]) && (0x0F == recv[1]) && (0x00 == recv[2])) {
sunifu 0:5a6468b4164d 534 return (ErrorNumber)NoError;
hepta2ume 1:d16a4c3a272a 535 }
sunifu 0:5a6468b4164d 536 if ((0xAA == recv[0]) && (0x0F == recv[1])) {
sunifu 0:5a6468b4164d 537 return (ErrorNumber)recv[4];
sunifu 0:5a6468b4164d 538 }
sunifu 0:5a6468b4164d 539 return (ErrorNumber)UnexpectedReply;
sunifu 0:5a6468b4164d 540 }
sunifu 0:5a6468b4164d 541
sunifu 0:5a6468b4164d 542 /**
sunifu 0:5a6468b4164d 543 * Send bytes to camera module.
sunifu 0:5a6468b4164d 544 *
sunifu 0:5a6468b4164d 545 * @param buf Pointer to the data buffer.
sunifu 0:5a6468b4164d 546 * @param len Length of the data buffer.
sunifu 0:5a6468b4164d 547 *
sunifu 0:5a6468b4164d 548 * @return True if the data sended.
sunifu 0:5a6468b4164d 549 */
hepta2ume 1:d16a4c3a272a 550 bool CameraC1098::sendBytes(char *buf, size_t len, int timeout_us)
hepta2ume 1:d16a4c3a272a 551 {
sunifu 0:5a6468b4164d 552 for (uint32_t i = 0; i < (uint32_t)len; i++) {
sunifu 0:5a6468b4164d 553 int cnt = 0;
sunifu 0:5a6468b4164d 554 while (!serial.writeable()) {
sunifu 0:5a6468b4164d 555 wait_us(1);
sunifu 0:5a6468b4164d 556 cnt++;
sunifu 0:5a6468b4164d 557 if (timeout_us < cnt) {
sunifu 0:5a6468b4164d 558 return false;
sunifu 0:5a6468b4164d 559 }
sunifu 0:5a6468b4164d 560 }
sunifu 0:5a6468b4164d 561 serial.putc(buf[i]);
sunifu 0:5a6468b4164d 562 }
sunifu 0:5a6468b4164d 563 return true;
sunifu 0:5a6468b4164d 564 }
sunifu 0:5a6468b4164d 565
sunifu 0:5a6468b4164d 566 /**
sunifu 0:5a6468b4164d 567 * Receive bytes from camera module.
sunifu 0:5a6468b4164d 568 *
sunifu 0:5a6468b4164d 569 * @param buf Pointer to the data buffer.
sunifu 0:5a6468b4164d 570 * @param len Length of the data buffer.
sunifu 0:5a6468b4164d 571 *
sunifu 0:5a6468b4164d 572 * @return True if the data received.
sunifu 0:5a6468b4164d 573 */
hepta2ume 1:d16a4c3a272a 574 bool CameraC1098::recvBytes(char *buf, size_t len, int timeout_us)
hepta2ume 1:d16a4c3a272a 575 {
sunifu 0:5a6468b4164d 576 for (uint32_t i = 0; i < (uint32_t)len; i++) {
sunifu 0:5a6468b4164d 577 int cnt = 0;
sunifu 0:5a6468b4164d 578 while (!serial.readable()) {
sunifu 0:5a6468b4164d 579 wait_us(1);
sunifu 0:5a6468b4164d 580 cnt++;
sunifu 0:5a6468b4164d 581 if (timeout_us < cnt) {
sunifu 0:5a6468b4164d 582 return false;
sunifu 0:5a6468b4164d 583 }
sunifu 0:5a6468b4164d 584 }
sunifu 0:5a6468b4164d 585 buf[i] = serial.getc();
sunifu 0:5a6468b4164d 586 }
sunifu 0:5a6468b4164d 587 return true;
sunifu 0:5a6468b4164d 588 }
sunifu 0:5a6468b4164d 589
sunifu 0:5a6468b4164d 590 /**
sunifu 0:5a6468b4164d 591 * Wait received.
sunifu 0:5a6468b4164d 592 *
sunifu 0:5a6468b4164d 593 * @return True if the data received.
sunifu 0:5a6468b4164d 594 */
hepta2ume 1:d16a4c3a272a 595 bool CameraC1098::waitRecv()
hepta2ume 1:d16a4c3a272a 596 {
sunifu 0:5a6468b4164d 597 while (!serial.readable()) {
sunifu 0:5a6468b4164d 598 }
sunifu 0:5a6468b4164d 599 return true;
sunifu 0:5a6468b4164d 600 }
sunifu 0:5a6468b4164d 601
sunifu 0:5a6468b4164d 602 /**
sunifu 0:5a6468b4164d 603 * Wait idle state.
sunifu 0:5a6468b4164d 604 */
hepta2ume 1:d16a4c3a272a 605 bool CameraC1098::waitIdle()
hepta2ume 1:d16a4c3a272a 606 {
sunifu 0:5a6468b4164d 607 while (serial.readable()) {
sunifu 0:5a6468b4164d 608 serial.getc();
sunifu 0:5a6468b4164d 609 }
sunifu 0:5a6468b4164d 610 return true;
sunifu 0:5a6468b4164d 611 }
hepta2ume 1:d16a4c3a272a 612
hepta2ume 1:d16a4c3a272a 613 void CameraC1098::Sync(void)
hepta2ume 1:d16a4c3a272a 614 {
hepta2ume 1:d16a4c3a272a 615 CameraC1098::ErrorNumber err = CameraC1098::NoError;
hepta2ume 1:d16a4c3a272a 616 setmbedBaud(CameraC1098::Baud14400);
hepta2ume 1:d16a4c3a272a 617 err = sync();
hepta2ume 1:d16a4c3a272a 618 setmbedBaud(CameraC1098::Baud115200);
hepta2ume 1:d16a4c3a272a 619 if (CameraC1098::NoError == err) {
hepta2ume 1:d16a4c3a272a 620 printf("[ OK ] : CameraC1098::sync\r\n");
hepta2ume 1:d16a4c3a272a 621 } else {
hepta2ume 1:d16a4c3a272a 622 printf("[FAIL] : CameraC1098::sync (Error=%02X)\r\n", (int)err);
hepta2ume 1:d16a4c3a272a 623 }
hepta2ume 1:d16a4c3a272a 624 }
hepta2ume 1:d16a4c3a272a 625
hepta2ume 1:d16a4c3a272a 626 void CameraC1098::test_jpeg_snapshot_picture(void)
hepta2ume 1:d16a4c3a272a 627 {
hepta2ume 1:d16a4c3a272a 628 CameraC1098::ErrorNumber err = CameraC1098::NoError;
hepta2ume 1:d16a4c3a272a 629 for (int i = 0; i < CAPTURE_FRAMES; i++) {
hepta2ume 1:d16a4c3a272a 630 char fname[64];
hepta2ume 1:d16a4c3a272a 631 snprintf(fname, sizeof(fname), "/fs/test%d.jpg", i);
hepta2ume 1:d16a4c3a272a 632 fp_jpeg = fopen(fname, "w");
hepta2ume 1:d16a4c3a272a 633
hepta2ume 1:d16a4c3a272a 634 err = getJpegSnapshotPicture();
hepta2ume 1:d16a4c3a272a 635
hepta2ume 1:d16a4c3a272a 636 if (CameraC1098::NoError == err) {
hepta2ume 1:d16a4c3a272a 637 printf("[ OK ] : CameraC1098::getJpegSnapshotPicture\r\n");
hepta2ume 1:d16a4c3a272a 638 } else {
hepta2ume 1:d16a4c3a272a 639 printf("[FAIL] : CameraC1098::getJpegSnapshotPicture (Error=%02X)\r\n", (int)err);
hepta2ume 1:d16a4c3a272a 640 }
hepta2ume 1:d16a4c3a272a 641 fclose(fp_jpeg);
hepta2ume 1:d16a4c3a272a 642 }
hepta2ume 1:d16a4c3a272a 643 }
hepta2ume 1:d16a4c3a272a 644
hepta2ume 1:d16a4c3a272a 645 void CameraC1098::test_jpeg_snapshot_data(void)
hepta2ume 1:d16a4c3a272a 646 {
hepta2ume 1:d16a4c3a272a 647 CameraC1098::ErrorNumber err = CameraC1098::NoError;
hepta2ume 1:d16a4c3a272a 648 for (int i = 0; i < CAPTURE_FRAMES; i++) {
hepta2ume 1:d16a4c3a272a 649 char fname[64];
hepta2ume 1:d16a4c3a272a 650 snprintf(fname, sizeof(fname), "/fs/test%d.txt", i);
hepta2ume 1:d16a4c3a272a 651 fp_jpeg = fopen(fname, "w");
hepta2ume 1:d16a4c3a272a 652
hepta2ume 1:d16a4c3a272a 653 err = getJpegSnapshotPicture_data();
hepta2ume 1:d16a4c3a272a 654
hepta2ume 1:d16a4c3a272a 655 if (CameraC1098::NoError == err) {
hepta2ume 1:d16a4c3a272a 656 printf("[ OK ] : CameraC1098::getJpegSnapshotPicture\r\n");
hepta2ume 1:d16a4c3a272a 657 } else {
hepta2ume 1:d16a4c3a272a 658 printf("[FAIL] : CameraC1098::getJpegSnapshotPicture (Error=%02X)\r\n", (int)err);
hepta2ume 1:d16a4c3a272a 659 }
hepta2ume 1:d16a4c3a272a 660 fclose(fp_jpeg);
hepta2ume 1:d16a4c3a272a 661 }
hepta2ume 1:d16a4c3a272a 662 }
hepta2ume 1:d16a4c3a272a 663
hepta2ume 1:d16a4c3a272a 664 void CameraC1098::initialize(Baud baud,JpegResolution jr)
hepta2ume 1:d16a4c3a272a 665 {
hepta2ume 1:d16a4c3a272a 666 CameraC1098::ErrorNumber err = CameraC1098::NoError;//ErrorNumber define
hepta2ume 1:d16a4c3a272a 667 err = init(baud, jr);//
hepta2ume 1:d16a4c3a272a 668
hepta2ume 1:d16a4c3a272a 669 if (CameraC1098::NoError == err) {
hepta2ume 1:d16a4c3a272a 670 printf("[ OK ] : CameraC1098::init\r\n");
hepta2ume 1:d16a4c3a272a 671 } else {
hepta2ume 1:d16a4c3a272a 672 printf("[FAIL] : CameraC1098::init (Error=%02X)\r\n", (int)err);
hepta2ume 1:d16a4c3a272a 673 }
hepta2ume 1:d16a4c3a272a 674
hepta2ume 1:d16a4c3a272a 675 }