Library for LinkSprite Y201 JPEG serial camera.
Y201.cpp@5:df71c00b97d8, 2012-07-18 (annotated)
- 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?
User | Revision | Line number | New 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 | } |