Library for LinkSprite Y201 JPEG serial camera.

Committer:
ashleymills
Date:
Tue Jul 17 16:35:35 2012 +0000
Revision:
4:6e575c19681f
Parent:
2:7d8a6087f2e5
Child:
5:df71c00b97d8
Removed printf (otherwise these get sent to the camera since Y201 extends serial)

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)) {
ashleymills 0:4c0fca059a0a 23 Thread::wait(1);
ashleymills 0:4c0fca059a0a 24 while(nread<readLen) {
ashleymills 0:4c0fca059a0a 25 if(readable()) {
ashleymills 0:4c0fca059a0a 26 uint8_t c = getc();
ashleymills 0:4c0fca059a0a 27 readBuffer[nread] = c;
ashleymills 0:4c0fca059a0a 28 nread++;
ashleymills 0:4c0fca059a0a 29 }
ashleymills 0:4c0fca059a0a 30 }
ashleymills 2:7d8a6087f2e5 31 Thread::wait(1);
ashleymills 0:4c0fca059a0a 32 } else {
ashleymills 0:4c0fca059a0a 33 return false;
ashleymills 0:4c0fca059a0a 34 }
ashleymills 0:4c0fca059a0a 35 return true;
ashleymills 0:4c0fca059a0a 36 }
ashleymills 0:4c0fca059a0a 37
ashleymills 0:4c0fca059a0a 38 bool Y201::waitFor(const int *seq, const int seqLen) {
ashleymills 0:4c0fca059a0a 39 int spos = 0;
ashleymills 0:4c0fca059a0a 40 long timeout = 100000000;
ashleymills 0:4c0fca059a0a 41 long timer = 0;
ashleymills 0:4c0fca059a0a 42 while(spos<seqLen) {
ashleymills 0:4c0fca059a0a 43 if(readable()) {
ashleymills 0:4c0fca059a0a 44 int c = getc();
ashleymills 0:4c0fca059a0a 45 if(seq[spos]==c) {
ashleymills 0:4c0fca059a0a 46 spos++;
ashleymills 0:4c0fca059a0a 47 } else {
ashleymills 0:4c0fca059a0a 48 return false;
ashleymills 0:4c0fca059a0a 49 }
ashleymills 0:4c0fca059a0a 50 } else {
ashleymills 0:4c0fca059a0a 51 if(timer<timeout) {
ashleymills 0:4c0fca059a0a 52 timer++;
ashleymills 0:4c0fca059a0a 53 } else {
ashleymills 0:4c0fca059a0a 54 return false;
ashleymills 0:4c0fca059a0a 55 }
ashleymills 0:4c0fca059a0a 56 }
ashleymills 0:4c0fca059a0a 57 }
ashleymills 0:4c0fca059a0a 58 return true;
ashleymills 0:4c0fca059a0a 59 }
ashleymills 0:4c0fca059a0a 60
ashleymills 0:4c0fca059a0a 61 bool Y201::waitForInt(int bytes, int *fileSize) {
ashleymills 0:4c0fca059a0a 62 int spos = 0;
ashleymills 1:30a6aeda21c2 63 long timeout = 1000000000;
ashleymills 0:4c0fca059a0a 64 long timer = 0;
ashleymills 0:4c0fca059a0a 65 *fileSize = 0;
ashleymills 0:4c0fca059a0a 66 while(spos<bytes) {
ashleymills 0:4c0fca059a0a 67 if(readable()) {
ashleymills 0:4c0fca059a0a 68 uint8_t val = getc();
ashleymills 0:4c0fca059a0a 69 if(spos==0) {
ashleymills 0:4c0fca059a0a 70 *fileSize += (val<<8);
ashleymills 0:4c0fca059a0a 71 } else {
ashleymills 0:4c0fca059a0a 72 *fileSize += val;
ashleymills 0:4c0fca059a0a 73 }
ashleymills 0:4c0fca059a0a 74
ashleymills 0:4c0fca059a0a 75 spos++;
ashleymills 0:4c0fca059a0a 76
ashleymills 0:4c0fca059a0a 77 } else {
ashleymills 0:4c0fca059a0a 78 if(timer<timeout) {
ashleymills 0:4c0fca059a0a 79 timer++;
ashleymills 0:4c0fca059a0a 80 } else {
ashleymills 1:30a6aeda21c2 81 return false;
ashleymills 0:4c0fca059a0a 82 }
ashleymills 0:4c0fca059a0a 83 }
ashleymills 0:4c0fca059a0a 84 }
ashleymills 0:4c0fca059a0a 85 return true;
ashleymills 0:4c0fca059a0a 86 }
ashleymills 0:4c0fca059a0a 87
ashleymills 0:4c0fca059a0a 88 void Y201::putSeq(const int *seq, int seqLen) {
ashleymills 0:4c0fca059a0a 89 while(seqLen--) {
ashleymills 0:4c0fca059a0a 90 putc(*seq++);
ashleymills 0:4c0fca059a0a 91 }
ashleymills 0:4c0fca059a0a 92 }
ashleymills 0:4c0fca059a0a 93
ashleymills 2:7d8a6087f2e5 94 Y201::Y201(PinName tx, PinName rx, const char *name) : MODSERIAL(tx,rx,name) {
ashleymills 0:4c0fca059a0a 95 baud(38400);
ashleymills 0:4c0fca059a0a 96 }
ashleymills 0:4c0fca059a0a 97
ashleymills 0:4c0fca059a0a 98 bool Y201::setImageSize(Y201ImageSize size) {
ashleymills 0:4c0fca059a0a 99 switch(size) {
ashleymills 0:4c0fca059a0a 100 case Y201::e640x480:
ashleymills 0:4c0fca059a0a 101 putSeq(set640x480,setSizeLen);
ashleymills 0:4c0fca059a0a 102 break;
ashleymills 0:4c0fca059a0a 103
ashleymills 0:4c0fca059a0a 104 case Y201::e160x120:
ashleymills 0:4c0fca059a0a 105 putSeq(set160x120,setSizeLen);
ashleymills 0:4c0fca059a0a 106 break;
ashleymills 0:4c0fca059a0a 107
ashleymills 0:4c0fca059a0a 108 case Y201::e320x240:
ashleymills 0:4c0fca059a0a 109 putSeq(set320x240,setSizeLen);
ashleymills 0:4c0fca059a0a 110 break;
ashleymills 0:4c0fca059a0a 111 }
ashleymills 0:4c0fca059a0a 112 return waitFor(setSizeAck,setSizeAckLen);
ashleymills 0:4c0fca059a0a 113 }
ashleymills 0:4c0fca059a0a 114
ashleymills 0:4c0fca059a0a 115 bool Y201::takePicture() {
ashleymills 0:4c0fca059a0a 116 putSeq(takePicSeq,takePicSeqLen);
ashleymills 0:4c0fca059a0a 117 Thread::wait(50);
ashleymills 0:4c0fca059a0a 118 return waitFor(takePicSeqAck,takePicSeqAckLen);
ashleymills 0:4c0fca059a0a 119 }
ashleymills 0:4c0fca059a0a 120
ashleymills 0:4c0fca059a0a 121 bool Y201::readImageSize(int *fileSize) {
ashleymills 0:4c0fca059a0a 122 putSeq(readFileSize,readFileSizeLen);
ashleymills 0:4c0fca059a0a 123 bool ret = waitFor(readFileSizeAck,readFileSizeAckLen);
ashleymills 0:4c0fca059a0a 124 if(!ret)
ashleymills 0:4c0fca059a0a 125 return false;
ashleymills 0:4c0fca059a0a 126 return waitForInt(2,fileSize);
ashleymills 0:4c0fca059a0a 127 }
ashleymills 0:4c0fca059a0a 128
ashleymills 0:4c0fca059a0a 129 bool Y201::reset() {
ashleymills 0:4c0fca059a0a 130 putSeq(resetSeq,resetSeqLen);
ashleymills 0:4c0fca059a0a 131 bool ret = waitFor(resetSeqAck,resetSeqAckLen);
ashleymills 0:4c0fca059a0a 132
ashleymills 0:4c0fca059a0a 133 // wait for trash
ashleymills 0:4c0fca059a0a 134 int count = 3;
ashleymills 0:4c0fca059a0a 135 while(count) {
ashleymills 0:4c0fca059a0a 136 count--;
ashleymills 0:4c0fca059a0a 137 if(readable()) {
ashleymills 0:4c0fca059a0a 138 while(readable()) {
ashleymills 0:4c0fca059a0a 139 int c = getc();
ashleymills 0:4c0fca059a0a 140 }
ashleymills 0:4c0fca059a0a 141 }
ashleymills 0:4c0fca059a0a 142 Thread::wait(1000);
ashleymills 0:4c0fca059a0a 143 }
ashleymills 0:4c0fca059a0a 144 return ret;
ashleymills 0:4c0fca059a0a 145 }