Library for LinkSprite Y201 JPEG serial camera.

Committer:
ashleymills
Date:
Thu Jul 19 15:48:25 2012 +0000
Revision:
9:fbd80a803857
Parent:
5:df71c00b97d8
Child:
10:fd12c96da974
Added back in microsecond waits according to camera.

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