Library for LinkSprite Y201 JPEG serial camera.
Y201.cpp@9:fbd80a803857, 2012-07-19 (annotated)
- 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?
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 | 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 | } |