Library for LinkSprite Y201 JPEG serial camera.

Committer:
donatien
Date:
Wed Jul 18 11:06:49 2012 +0000
Revision:
5:df71c00b97d8
Parent:
4:6e575c19681f
Child:
7:d7ed03291f0a
Child:
9:fbd80a803857
Added real timeouts/dropped bytes detection

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashleymills 0:4c0fca059a0a 1 #include "Y201.h"
ashleymills 0:4c0fca059a0a 2 #include "rtos.h"
ashleymills 0:4c0fca059a0a 3
ashleymills 0:4c0fca059a0a 4 void Y201::trash() {
ashleymills 0:4c0fca059a0a 5 // wait for trash...
ashleymills 0:4c0fca059a0a 6 while(readable()) {
ashleymills 0:4c0fca059a0a 7 int x = getc();
ashleymills 0:4c0fca059a0a 8 }
ashleymills 0:4c0fca059a0a 9 }
ashleymills 0:4c0fca059a0a 10
ashleymills 0:4c0fca059a0a 11 bool Y201::readImage(int startAddress, int readLen, uint8_t *readBuffer) {
ashleymills 0:4c0fca059a0a 12 putSeq(readFileHead,readFileHeadLen);
ashleymills 0:4c0fca059a0a 13 putc(startAddress>>8); // Start Address MSB
ashleymills 0:4c0fca059a0a 14 putc(startAddress&255); // Start Address LSB
ashleymills 0:4c0fca059a0a 15 putc(0x00);
ashleymills 0:4c0fca059a0a 16 putc(0x00);
ashleymills 0:4c0fca059a0a 17 putc(readLen>>8); // Length of file MSB
ashleymills 0:4c0fca059a0a 18 putc(readLen&255); // length of file LSB
ashleymills 0:4c0fca059a0a 19 putc(0x00); // Interval MSB
ashleymills 0:4c0fca059a0a 20 putc(0x0A); // Interval LSB
ashleymills 0:4c0fca059a0a 21 int nread = 0;
ashleymills 0:4c0fca059a0a 22 if(waitFor(readFileAck,readFileAckLen)) {
donatien 5:df71c00b97d8 23 //Thread::wait(1);
donatien 5:df71c00b97d8 24 Timer t;
donatien 5:df71c00b97d8 25 t.start();
ashleymills 0:4c0fca059a0a 26 while(nread<readLen) {
ashleymills 0:4c0fca059a0a 27 if(readable()) {
ashleymills 0:4c0fca059a0a 28 uint8_t c = getc();
donatien 5:df71c00b97d8 29 // fprintf(stdout, "[%02x]", c);
ashleymills 0:4c0fca059a0a 30 readBuffer[nread] = c;
ashleymills 0:4c0fca059a0a 31 nread++;
donatien 5:df71c00b97d8 32 t.reset();
donatien 5:df71c00b97d8 33 }
donatien 5:df71c00b97d8 34 else
donatien 5:df71c00b97d8 35 {
donatien 5:df71c00b97d8 36 if(t.read_ms()>3000)
donatien 5:df71c00b97d8 37 {
donatien 5:df71c00b97d8 38 fprintf(stdout, "Blocked!\n Missed %d bytes over %d\nLast byte read is %02x\n", readLen - nread, readLen, readBuffer[nread-1]);
donatien 5:df71c00b97d8 39 return false;
donatien 5:df71c00b97d8 40 }
ashleymills 0:4c0fca059a0a 41 }
ashleymills 0:4c0fca059a0a 42 }
donatien 5:df71c00b97d8 43 //Thread::wait(1);
ashleymills 0:4c0fca059a0a 44 } else {
ashleymills 0:4c0fca059a0a 45 return false;
ashleymills 0:4c0fca059a0a 46 }
ashleymills 0:4c0fca059a0a 47 return true;
ashleymills 0:4c0fca059a0a 48 }
ashleymills 0:4c0fca059a0a 49
ashleymills 0:4c0fca059a0a 50 bool Y201::waitFor(const int *seq, const int seqLen) {
ashleymills 0:4c0fca059a0a 51 int spos = 0;
donatien 5:df71c00b97d8 52 long timeout = 100;
donatien 5:df71c00b97d8 53 Timer timer;
donatien 5:df71c00b97d8 54 timer.start();
ashleymills 0:4c0fca059a0a 55 while(spos<seqLen) {
ashleymills 0:4c0fca059a0a 56 if(readable()) {
ashleymills 0:4c0fca059a0a 57 int c = getc();
ashleymills 0:4c0fca059a0a 58 if(seq[spos]==c) {
ashleymills 0:4c0fca059a0a 59 spos++;
ashleymills 0:4c0fca059a0a 60 } else {
ashleymills 0:4c0fca059a0a 61 return false;
ashleymills 0:4c0fca059a0a 62 }
ashleymills 0:4c0fca059a0a 63 } else {
donatien 5:df71c00b97d8 64 if(timer.read_ms()>timeout) {
ashleymills 0:4c0fca059a0a 65 return false;
ashleymills 0:4c0fca059a0a 66 }
ashleymills 0:4c0fca059a0a 67 }
ashleymills 0:4c0fca059a0a 68 }
ashleymills 0:4c0fca059a0a 69 return true;
ashleymills 0:4c0fca059a0a 70 }
ashleymills 0:4c0fca059a0a 71
ashleymills 0:4c0fca059a0a 72 bool Y201::waitForInt(int bytes, int *fileSize) {
ashleymills 0:4c0fca059a0a 73 int spos = 0;
donatien 5:df71c00b97d8 74 long timeout = 100;
donatien 5:df71c00b97d8 75 Timer timer;
donatien 5:df71c00b97d8 76 timer.start();
ashleymills 0:4c0fca059a0a 77 *fileSize = 0;
ashleymills 0:4c0fca059a0a 78 while(spos<bytes) {
ashleymills 0:4c0fca059a0a 79 if(readable()) {
ashleymills 0:4c0fca059a0a 80 uint8_t val = getc();
ashleymills 0:4c0fca059a0a 81 if(spos==0) {
ashleymills 0:4c0fca059a0a 82 *fileSize += (val<<8);
ashleymills 0:4c0fca059a0a 83 } else {
ashleymills 0:4c0fca059a0a 84 *fileSize += val;
ashleymills 0:4c0fca059a0a 85 }
ashleymills 0:4c0fca059a0a 86
ashleymills 0:4c0fca059a0a 87 spos++;
ashleymills 0:4c0fca059a0a 88
ashleymills 0:4c0fca059a0a 89 } else {
donatien 5:df71c00b97d8 90 if(timer.read_ms()>timeout) {
ashleymills 1:30a6aeda21c2 91 return false;
ashleymills 0:4c0fca059a0a 92 }
ashleymills 0:4c0fca059a0a 93 }
ashleymills 0:4c0fca059a0a 94 }
ashleymills 0:4c0fca059a0a 95 return true;
ashleymills 0:4c0fca059a0a 96 }
ashleymills 0:4c0fca059a0a 97
ashleymills 0:4c0fca059a0a 98 void Y201::putSeq(const int *seq, int seqLen) {
ashleymills 0:4c0fca059a0a 99 while(seqLen--) {
ashleymills 0:4c0fca059a0a 100 putc(*seq++);
ashleymills 0:4c0fca059a0a 101 }
ashleymills 0:4c0fca059a0a 102 }
ashleymills 0:4c0fca059a0a 103
ashleymills 2:7d8a6087f2e5 104 Y201::Y201(PinName tx, PinName rx, const char *name) : MODSERIAL(tx,rx,name) {
ashleymills 0:4c0fca059a0a 105 baud(38400);
ashleymills 0:4c0fca059a0a 106 }
ashleymills 0:4c0fca059a0a 107
ashleymills 0:4c0fca059a0a 108 bool Y201::setImageSize(Y201ImageSize size) {
ashleymills 0:4c0fca059a0a 109 switch(size) {
ashleymills 0:4c0fca059a0a 110 case Y201::e640x480:
ashleymills 0:4c0fca059a0a 111 putSeq(set640x480,setSizeLen);
ashleymills 0:4c0fca059a0a 112 break;
ashleymills 0:4c0fca059a0a 113
ashleymills 0:4c0fca059a0a 114 case Y201::e160x120:
ashleymills 0:4c0fca059a0a 115 putSeq(set160x120,setSizeLen);
ashleymills 0:4c0fca059a0a 116 break;
ashleymills 0:4c0fca059a0a 117
ashleymills 0:4c0fca059a0a 118 case Y201::e320x240:
ashleymills 0:4c0fca059a0a 119 putSeq(set320x240,setSizeLen);
ashleymills 0:4c0fca059a0a 120 break;
ashleymills 0:4c0fca059a0a 121 }
ashleymills 0:4c0fca059a0a 122 return waitFor(setSizeAck,setSizeAckLen);
ashleymills 0:4c0fca059a0a 123 }
ashleymills 0:4c0fca059a0a 124
ashleymills 0:4c0fca059a0a 125 bool Y201::takePicture() {
ashleymills 0:4c0fca059a0a 126 putSeq(takePicSeq,takePicSeqLen);
ashleymills 0:4c0fca059a0a 127 Thread::wait(50);
ashleymills 0:4c0fca059a0a 128 return waitFor(takePicSeqAck,takePicSeqAckLen);
ashleymills 0:4c0fca059a0a 129 }
ashleymills 0:4c0fca059a0a 130
ashleymills 0:4c0fca059a0a 131 bool Y201::readImageSize(int *fileSize) {
ashleymills 0:4c0fca059a0a 132 putSeq(readFileSize,readFileSizeLen);
ashleymills 0:4c0fca059a0a 133 bool ret = waitFor(readFileSizeAck,readFileSizeAckLen);
ashleymills 0:4c0fca059a0a 134 if(!ret)
ashleymills 0:4c0fca059a0a 135 return false;
ashleymills 0:4c0fca059a0a 136 return waitForInt(2,fileSize);
ashleymills 0:4c0fca059a0a 137 }
ashleymills 0:4c0fca059a0a 138
ashleymills 0:4c0fca059a0a 139 bool Y201::reset() {
ashleymills 0:4c0fca059a0a 140 putSeq(resetSeq,resetSeqLen);
ashleymills 0:4c0fca059a0a 141 bool ret = waitFor(resetSeqAck,resetSeqAckLen);
ashleymills 0:4c0fca059a0a 142
ashleymills 0:4c0fca059a0a 143 // wait for trash
ashleymills 0:4c0fca059a0a 144 int count = 3;
ashleymills 0:4c0fca059a0a 145 while(count) {
ashleymills 0:4c0fca059a0a 146 count--;
ashleymills 0:4c0fca059a0a 147 if(readable()) {
ashleymills 0:4c0fca059a0a 148 while(readable()) {
ashleymills 0:4c0fca059a0a 149 int c = getc();
ashleymills 0:4c0fca059a0a 150 }
ashleymills 0:4c0fca059a0a 151 }
ashleymills 0:4c0fca059a0a 152 Thread::wait(1000);
ashleymills 0:4c0fca059a0a 153 }
ashleymills 0:4c0fca059a0a 154 return ret;
ashleymills 0:4c0fca059a0a 155 }