Library for LinkSprite Y201 JPEG serial camera.

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?

UserRevisionLine numberNew 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 */