Library for LinkSprite Y201 JPEG serial camera.
Y201.cpp@10:fd12c96da974, 2012-07-20 (annotated)
- Committer:
- ashleymills
- Date:
- Fri Jul 20 08:59:03 2012 +0000
- Revision:
- 10:fd12c96da974
- Parent:
- 9:fbd80a803857
Added change baud rate, then removed it, as this apparently reprograms the camera ROM !! Nice product linksprite
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 | 10:fd12c96da974 | 4 | const char Y201::resetSeq [4] = {0x56,0x00,0x26,0x00}; |
ashleymills | 10:fd12c96da974 | 5 | const char Y201::resetSeqAck [4] = {0x76,0x00,0x26,0x00}; |
ashleymills | 10:fd12c96da974 | 6 | const char Y201::takePicSeq [5] = {0x56,0x00,0x36,0x01,0x00}; |
ashleymills | 10:fd12c96da974 | 7 | const char Y201::takePicSeqAck [5] = {0x76,0x00,0x36,0x00,0x00}; |
ashleymills | 10:fd12c96da974 | 8 | const char Y201::set160x120 [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x22}; |
ashleymills | 10:fd12c96da974 | 9 | const char Y201::set320x240 [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x11}; |
ashleymills | 10:fd12c96da974 | 10 | const char Y201::set640x480 [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x00}; |
ashleymills | 10:fd12c96da974 | 11 | const char Y201::setSizeAck [5] = {0x76,0x00,0x31,0x00,0x00}; |
ashleymills | 10:fd12c96da974 | 12 | const char Y201::readFileSize [5] = {0x56,0x00,0x34,0x01,0x00}; |
ashleymills | 10:fd12c96da974 | 13 | const char Y201::readFileSizeAck [7] = {0x76,0x00,0x34,0x00,0x04,0x00,0x00}; |
ashleymills | 10:fd12c96da974 | 14 | const char Y201::readFileHead [8] = {0x56,0x00,0x32,0x0C,0x00,0x0A,0x00,0x00}; |
ashleymills | 10:fd12c96da974 | 15 | const char Y201::readFileAck [5] = {0x76,0x00,0x32,0x00,0x00}; |
ashleymills | 10:fd12c96da974 | 16 | //const char Y201::changeBaudRateSeq [5] = {0x56,0x00,0x24,0x03,0x01}; |
ashleymills | 10:fd12c96da974 | 17 | //const char Y201::changeBaudRateAck [5] = {0x76,0x00,0x24,0x00,0x00}; |
ashleymills | 10:fd12c96da974 | 18 | const char Y201::enterPowerSavingSeq [7] = {0x56,0x00,0x3E,0x03,0x00,0x01,0x01}; |
ashleymills | 10:fd12c96da974 | 19 | const char Y201::enterPowerSavingAck [5] = {0x76,0x00,0x3E,0x00,0x00}; |
ashleymills | 10:fd12c96da974 | 20 | const char Y201::exitPowerSavingSeq [7] = {0x56,0x00,0x3E,0x03,0x00,0x01,0x00}; |
ashleymills | 10:fd12c96da974 | 21 | const char Y201::exitPowerSavingAck [5] = {0x76,0x00,0x3E,0x00,0x00}; |
ashleymills | 9:fbd80a803857 | 22 | |
ashleymills | 0:4c0fca059a0a | 23 | void Y201::trash() { |
ashleymills | 0:4c0fca059a0a | 24 | // wait for trash... |
ashleymills | 0:4c0fca059a0a | 25 | while(readable()) { |
ashleymills | 0:4c0fca059a0a | 26 | int x = getc(); |
ashleymills | 0:4c0fca059a0a | 27 | } |
ashleymills | 0:4c0fca059a0a | 28 | } |
ashleymills | 0:4c0fca059a0a | 29 | |
ashleymills | 0:4c0fca059a0a | 30 | bool Y201::readImage(int startAddress, int readLen, uint8_t *readBuffer) { |
ashleymills | 10:fd12c96da974 | 31 | trash(); // camera sends random crap after sending certain responses, so need to clear it |
ashleymills | 10:fd12c96da974 | 32 | //Thread::wait(5); |
ashleymills | 0:4c0fca059a0a | 33 | putSeq(readFileHead,readFileHeadLen); |
ashleymills | 0:4c0fca059a0a | 34 | putc(startAddress>>8); // Start Address MSB |
ashleymills | 0:4c0fca059a0a | 35 | putc(startAddress&255); // Start Address LSB |
ashleymills | 0:4c0fca059a0a | 36 | putc(0x00); |
ashleymills | 0:4c0fca059a0a | 37 | putc(0x00); |
ashleymills | 0:4c0fca059a0a | 38 | putc(readLen>>8); // Length of file MSB |
ashleymills | 0:4c0fca059a0a | 39 | putc(readLen&255); // length of file LSB |
ashleymills | 0:4c0fca059a0a | 40 | putc(0x00); // Interval MSB |
ashleymills | 0:4c0fca059a0a | 41 | putc(0x0A); // Interval LSB |
ashleymills | 0:4c0fca059a0a | 42 | int nread = 0; |
ashleymills | 0:4c0fca059a0a | 43 | if(waitFor(readFileAck,readFileAckLen)) { |
ashleymills | 9:fbd80a803857 | 44 | Thread::wait(1); |
donatien | 5:df71c00b97d8 | 45 | Timer t; |
donatien | 5:df71c00b97d8 | 46 | t.start(); |
ashleymills | 0:4c0fca059a0a | 47 | while(nread<readLen) { |
ashleymills | 0:4c0fca059a0a | 48 | if(readable()) { |
ashleymills | 0:4c0fca059a0a | 49 | uint8_t c = getc(); |
ashleymills | 10:fd12c96da974 | 50 | // fprintf(stdout, "[%02x]", c); |
ashleymills | 0:4c0fca059a0a | 51 | readBuffer[nread] = c; |
ashleymills | 0:4c0fca059a0a | 52 | nread++; |
donatien | 5:df71c00b97d8 | 53 | t.reset(); |
ashleymills | 10:fd12c96da974 | 54 | } else { |
ashleymills | 10:fd12c96da974 | 55 | if(t.read_ms()>3000) { |
ashleymills | 10:fd12c96da974 | 56 | fprintf(stdout, "Blocked!\n Missed %d bytes over %d\nLast byte read is %02x\n", readLen - nread, readLen, readBuffer[nread-1]); |
ashleymills | 10:fd12c96da974 | 57 | return false; |
ashleymills | 10:fd12c96da974 | 58 | } |
ashleymills | 0:4c0fca059a0a | 59 | } |
ashleymills | 0:4c0fca059a0a | 60 | } |
ashleymills | 9:fbd80a803857 | 61 | Thread::wait(1); |
ashleymills | 10:fd12c96da974 | 62 | } else { |
ashleymills | 10:fd12c96da974 | 63 | return false; |
ashleymills | 10:fd12c96da974 | 64 | } |
ashleymills | 10:fd12c96da974 | 65 | return true; |
ashleymills | 0:4c0fca059a0a | 66 | } |
ashleymills | 0:4c0fca059a0a | 67 | |
ashleymills | 10:fd12c96da974 | 68 | bool Y201::waitFor(const char *seq, const int seqLen) { |
ashleymills | 0:4c0fca059a0a | 69 | int spos = 0; |
donatien | 5:df71c00b97d8 | 70 | long timeout = 100; |
donatien | 5:df71c00b97d8 | 71 | Timer timer; |
donatien | 5:df71c00b97d8 | 72 | timer.start(); |
ashleymills | 0:4c0fca059a0a | 73 | while(spos<seqLen) { |
ashleymills | 0:4c0fca059a0a | 74 | if(readable()) { |
ashleymills | 0:4c0fca059a0a | 75 | int c = getc(); |
ashleymills | 0:4c0fca059a0a | 76 | if(seq[spos]==c) { |
ashleymills | 0:4c0fca059a0a | 77 | spos++; |
ashleymills | 0:4c0fca059a0a | 78 | } else { |
ashleymills | 0:4c0fca059a0a | 79 | return false; |
ashleymills | 0:4c0fca059a0a | 80 | } |
ashleymills | 0:4c0fca059a0a | 81 | } else { |
donatien | 5:df71c00b97d8 | 82 | if(timer.read_ms()>timeout) { |
ashleymills | 0:4c0fca059a0a | 83 | return false; |
ashleymills | 0:4c0fca059a0a | 84 | } |
ashleymills | 0:4c0fca059a0a | 85 | } |
ashleymills | 0:4c0fca059a0a | 86 | } |
ashleymills | 0:4c0fca059a0a | 87 | return true; |
ashleymills | 0:4c0fca059a0a | 88 | } |
ashleymills | 0:4c0fca059a0a | 89 | |
ashleymills | 0:4c0fca059a0a | 90 | bool Y201::waitForInt(int bytes, int *fileSize) { |
ashleymills | 0:4c0fca059a0a | 91 | int spos = 0; |
donatien | 5:df71c00b97d8 | 92 | long timeout = 100; |
donatien | 5:df71c00b97d8 | 93 | Timer timer; |
donatien | 5:df71c00b97d8 | 94 | timer.start(); |
ashleymills | 0:4c0fca059a0a | 95 | *fileSize = 0; |
ashleymills | 0:4c0fca059a0a | 96 | while(spos<bytes) { |
ashleymills | 0:4c0fca059a0a | 97 | if(readable()) { |
ashleymills | 0:4c0fca059a0a | 98 | uint8_t val = getc(); |
ashleymills | 0:4c0fca059a0a | 99 | if(spos==0) { |
ashleymills | 0:4c0fca059a0a | 100 | *fileSize += (val<<8); |
ashleymills | 0:4c0fca059a0a | 101 | } else { |
ashleymills | 0:4c0fca059a0a | 102 | *fileSize += val; |
ashleymills | 0:4c0fca059a0a | 103 | } |
ashleymills | 0:4c0fca059a0a | 104 | |
ashleymills | 0:4c0fca059a0a | 105 | spos++; |
ashleymills | 0:4c0fca059a0a | 106 | |
ashleymills | 0:4c0fca059a0a | 107 | } else { |
donatien | 5:df71c00b97d8 | 108 | if(timer.read_ms()>timeout) { |
ashleymills | 1:30a6aeda21c2 | 109 | return false; |
ashleymills | 0:4c0fca059a0a | 110 | } |
ashleymills | 0:4c0fca059a0a | 111 | } |
ashleymills | 0:4c0fca059a0a | 112 | } |
ashleymills | 0:4c0fca059a0a | 113 | return true; |
ashleymills | 0:4c0fca059a0a | 114 | } |
ashleymills | 0:4c0fca059a0a | 115 | |
ashleymills | 10:fd12c96da974 | 116 | void Y201::putSeq(const char *seq, int seqLen) { |
ashleymills | 0:4c0fca059a0a | 117 | while(seqLen--) { |
ashleymills | 0:4c0fca059a0a | 118 | putc(*seq++); |
ashleymills | 0:4c0fca059a0a | 119 | } |
ashleymills | 0:4c0fca059a0a | 120 | } |
ashleymills | 0:4c0fca059a0a | 121 | |
ashleymills | 2:7d8a6087f2e5 | 122 | Y201::Y201(PinName tx, PinName rx, const char *name) : MODSERIAL(tx,rx,name) { |
ashleymills | 0:4c0fca059a0a | 123 | baud(38400); |
ashleymills | 0:4c0fca059a0a | 124 | } |
ashleymills | 0:4c0fca059a0a | 125 | |
ashleymills | 0:4c0fca059a0a | 126 | bool Y201::setImageSize(Y201ImageSize size) { |
ashleymills | 0:4c0fca059a0a | 127 | switch(size) { |
ashleymills | 0:4c0fca059a0a | 128 | case Y201::e640x480: |
ashleymills | 0:4c0fca059a0a | 129 | putSeq(set640x480,setSizeLen); |
ashleymills | 0:4c0fca059a0a | 130 | break; |
ashleymills | 0:4c0fca059a0a | 131 | |
ashleymills | 0:4c0fca059a0a | 132 | case Y201::e160x120: |
ashleymills | 0:4c0fca059a0a | 133 | putSeq(set160x120,setSizeLen); |
ashleymills | 0:4c0fca059a0a | 134 | break; |
ashleymills | 0:4c0fca059a0a | 135 | |
ashleymills | 0:4c0fca059a0a | 136 | case Y201::e320x240: |
ashleymills | 0:4c0fca059a0a | 137 | putSeq(set320x240,setSizeLen); |
ashleymills | 0:4c0fca059a0a | 138 | break; |
ashleymills | 0:4c0fca059a0a | 139 | } |
ashleymills | 0:4c0fca059a0a | 140 | return waitFor(setSizeAck,setSizeAckLen); |
ashleymills | 0:4c0fca059a0a | 141 | } |
ashleymills | 0:4c0fca059a0a | 142 | |
ashleymills | 0:4c0fca059a0a | 143 | bool Y201::takePicture() { |
ashleymills | 0:4c0fca059a0a | 144 | putSeq(takePicSeq,takePicSeqLen); |
ashleymills | 0:4c0fca059a0a | 145 | Thread::wait(50); |
ashleymills | 0:4c0fca059a0a | 146 | return waitFor(takePicSeqAck,takePicSeqAckLen); |
ashleymills | 0:4c0fca059a0a | 147 | } |
ashleymills | 0:4c0fca059a0a | 148 | |
ashleymills | 10:fd12c96da974 | 149 | bool Y201::enterPowerSaving() { |
ashleymills | 10:fd12c96da974 | 150 | putSeq(enterPowerSavingSeq,enterPowerSavingLen); |
ashleymills | 10:fd12c96da974 | 151 | return waitFor(enterPowerSavingAck,enterPowerSavingAckLen); |
ashleymills | 10:fd12c96da974 | 152 | } |
ashleymills | 10:fd12c96da974 | 153 | |
ashleymills | 10:fd12c96da974 | 154 | bool Y201::exitPowerSaving() { |
ashleymills | 10:fd12c96da974 | 155 | putSeq(exitPowerSavingSeq,exitPowerSavingLen); |
ashleymills | 10:fd12c96da974 | 156 | return waitFor(exitPowerSavingAck,exitPowerSavingAckLen); |
ashleymills | 10:fd12c96da974 | 157 | } |
ashleymills | 10:fd12c96da974 | 158 | |
ashleymills | 0:4c0fca059a0a | 159 | bool Y201::readImageSize(int *fileSize) { |
ashleymills | 0:4c0fca059a0a | 160 | putSeq(readFileSize,readFileSizeLen); |
ashleymills | 0:4c0fca059a0a | 161 | bool ret = waitFor(readFileSizeAck,readFileSizeAckLen); |
ashleymills | 0:4c0fca059a0a | 162 | if(!ret) |
ashleymills | 0:4c0fca059a0a | 163 | return false; |
ashleymills | 0:4c0fca059a0a | 164 | return waitForInt(2,fileSize); |
ashleymills | 0:4c0fca059a0a | 165 | } |
ashleymills | 0:4c0fca059a0a | 166 | |
ashleymills | 0:4c0fca059a0a | 167 | bool Y201::reset() { |
ashleymills | 0:4c0fca059a0a | 168 | putSeq(resetSeq,resetSeqLen); |
ashleymills | 0:4c0fca059a0a | 169 | bool ret = waitFor(resetSeqAck,resetSeqAckLen); |
ashleymills | 0:4c0fca059a0a | 170 | |
ashleymills | 0:4c0fca059a0a | 171 | // wait for trash |
ashleymills | 0:4c0fca059a0a | 172 | int count = 3; |
ashleymills | 0:4c0fca059a0a | 173 | while(count) { |
ashleymills | 0:4c0fca059a0a | 174 | count--; |
ashleymills | 0:4c0fca059a0a | 175 | if(readable()) { |
ashleymills | 0:4c0fca059a0a | 176 | while(readable()) { |
ashleymills | 0:4c0fca059a0a | 177 | int c = getc(); |
ashleymills | 0:4c0fca059a0a | 178 | } |
ashleymills | 0:4c0fca059a0a | 179 | } |
ashleymills | 0:4c0fca059a0a | 180 | Thread::wait(1000); |
ashleymills | 0:4c0fca059a0a | 181 | } |
ashleymills | 0:4c0fca059a0a | 182 | return ret; |
ashleymills | 0:4c0fca059a0a | 183 | } |
ashleymills | 10:fd12c96da974 | 184 | |
ashleymills | 10:fd12c96da974 | 185 | /* |
ashleymills | 10:fd12c96da974 | 186 | |
ashleymills | 10:fd12c96da974 | 187 | THIS SIMPLY DOESN'T WORK -- Known bug, LinkSprite quality products |
ashleymills | 10:fd12c96da974 | 188 | |
ashleymills | 10:fd12c96da974 | 189 | |
ashleymills | 10:fd12c96da974 | 190 | bool Y201::changeBaudRate(Y201BaudRate baudRate) { |
ashleymills | 10:fd12c96da974 | 191 | // put the prefix |
ashleymills | 10:fd12c96da974 | 192 | putSeq(changeBaudRateSeq,changeBaudRateSeqLen); |
ashleymills | 10:fd12c96da974 | 193 | int br = 9600; |
ashleymills | 10:fd12c96da974 | 194 | |
ashleymills | 10:fd12c96da974 | 195 | // put the baud rate |
ashleymills | 10:fd12c96da974 | 196 | switch(baudRate) { |
ashleymills | 10:fd12c96da974 | 197 | case Y201::e9600: |
ashleymills | 10:fd12c96da974 | 198 | putc(0xAE); |
ashleymills | 10:fd12c96da974 | 199 | putc(0xC8); |
ashleymills | 10:fd12c96da974 | 200 | br = 9600; |
ashleymills | 10:fd12c96da974 | 201 | break; |
ashleymills | 10:fd12c96da974 | 202 | |
ashleymills | 10:fd12c96da974 | 203 | case Y201::e19200: |
ashleymills | 10:fd12c96da974 | 204 | putc(0x56); |
ashleymills | 10:fd12c96da974 | 205 | putc(0xE4); |
ashleymills | 10:fd12c96da974 | 206 | br = 19200; |
ashleymills | 10:fd12c96da974 | 207 | break; |
ashleymills | 10:fd12c96da974 | 208 | |
ashleymills | 10:fd12c96da974 | 209 | case Y201::e38400: |
ashleymills | 10:fd12c96da974 | 210 | putc(0x2A); |
ashleymills | 10:fd12c96da974 | 211 | putc(0xF2); |
ashleymills | 10:fd12c96da974 | 212 | br = 38400; |
ashleymills | 10:fd12c96da974 | 213 | break; |
ashleymills | 10:fd12c96da974 | 214 | |
ashleymills | 10:fd12c96da974 | 215 | case Y201::e57600: |
ashleymills | 10:fd12c96da974 | 216 | putc(0x1C); |
ashleymills | 10:fd12c96da974 | 217 | putc(0x4C); |
ashleymills | 10:fd12c96da974 | 218 | br = 57600; |
ashleymills | 10:fd12c96da974 | 219 | break; |
ashleymills | 10:fd12c96da974 | 220 | |
ashleymills | 10:fd12c96da974 | 221 | case Y201::e115200: |
ashleymills | 10:fd12c96da974 | 222 | putc(0xAE); |
ashleymills | 10:fd12c96da974 | 223 | putc(0xC8); |
ashleymills | 10:fd12c96da974 | 224 | br = 115200; |
ashleymills | 10:fd12c96da974 | 225 | break; |
ashleymills | 10:fd12c96da974 | 226 | |
ashleymills | 10:fd12c96da974 | 227 | default: |
ashleymills | 10:fd12c96da974 | 228 | putc(0xAE); |
ashleymills | 10:fd12c96da974 | 229 | putc(0xC8); |
ashleymills | 10:fd12c96da974 | 230 | br = 9600; |
ashleymills | 10:fd12c96da974 | 231 | break; |
ashleymills | 10:fd12c96da974 | 232 | } |
ashleymills | 10:fd12c96da974 | 233 | |
ashleymills | 10:fd12c96da974 | 234 | baud(br); |
ashleymills | 10:fd12c96da974 | 235 | |
ashleymills | 10:fd12c96da974 | 236 | // wait for the ack |
ashleymills | 10:fd12c96da974 | 237 | return waitFor(changeBaudRateAck,changeBaudRateAckLen); |
ashleymills | 10:fd12c96da974 | 238 | } |
ashleymills | 10:fd12c96da974 | 239 | */ |