Library for LinkSprite Y201 JPEG serial camera.
Diff: Y201.cpp
- Revision:
- 0:4c0fca059a0a
- Child:
- 1:30a6aeda21c2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Y201.cpp Sat Jun 02 11:47:56 2012 +0000 @@ -0,0 +1,153 @@ +#include "Y201.h" +#include "rtos.h" + +void Y201::trash() { + // wait for trash... + while(readable()) { + int x = getc(); + } +} + +bool Y201::readImage(int startAddress, int readLen, uint8_t *readBuffer) { + putSeq(readFileHead,readFileHeadLen); + putc(startAddress>>8); // Start Address MSB + putc(startAddress&255); // Start Address LSB + putc(0x00); + putc(0x00); + putc(readLen>>8); // Length of file MSB + putc(readLen&255); // length of file LSB + putc(0x00); // Interval MSB + putc(0x0A); // Interval LSB + int nread = 0; + if(waitFor(readFileAck,readFileAckLen)) { + Thread::wait(1); + while(nread<readLen) { + if(readable()) { + uint8_t c = getc(); + readBuffer[nread] = c; + //printf("Read(%d): 0x%x\r\n",nread,readBuffer[nread]); + nread++; + } + } + } else { + printf("Error during file read\r\n"); + return false; + } + return true; +} + +bool Y201::waitFor(const int *seq, const int seqLen) { + int spos = 0; + long timeout = 100000000; + long timer = 0; + while(spos<seqLen) { + if(readable()) { + int c = getc(); + //printf("read %x\r\n",c); + if(seq[spos]==c) { + spos++; + } else { + return false; + } + } else { + if(timer<timeout) { + timer++; + } else { + printf("timeout\r\n"); + return false; + } + } + } + return true; +} + +bool Y201::waitForInt(int bytes, int *fileSize) { + int spos = 0; + long timeout = 100000000; + long timer = 0; + *fileSize = 0; + while(spos<bytes) { + if(readable()) { + uint8_t val = getc(); + if(spos==0) { + *fileSize += (val<<8); + } else { + *fileSize += val; + } + + spos++; + + } else { + if(timer<timeout) { + timer++; + } else { + return -1; + } + } + } + return true; +} + +void Y201::putSeq(const int *seq, int seqLen) { + while(seqLen--) { + //printf("sent %x\r\n",*seq); + putc(*seq++); + } +} + +Y201::Y201(PinName tx, PinName rx, const char *name) : Serial(tx,rx,name) { + baud(38400); +} + +bool Y201::setImageSize(Y201ImageSize size) { + switch(size) { + case Y201::e640x480: + putSeq(set640x480,setSizeLen); + break; + + case Y201::e160x120: + putSeq(set160x120,setSizeLen); + break; + + case Y201::e320x240: + putSeq(set320x240,setSizeLen); + break; + } + return waitFor(setSizeAck,setSizeAckLen); +} + +bool Y201::takePicture() { + putSeq(takePicSeq,takePicSeqLen); + Thread::wait(50); + return waitFor(takePicSeqAck,takePicSeqAckLen); +} + +bool Y201::readImageSize(int *fileSize) { + putSeq(readFileSize,readFileSizeLen); + bool ret = waitFor(readFileSizeAck,readFileSizeAckLen); + if(!ret) + return false; + return waitForInt(2,fileSize); +} + +bool Y201::reset() { + putSeq(resetSeq,resetSeqLen); + bool ret = waitFor(resetSeqAck,resetSeqAckLen); + + // wait for trash + int count = 3; + printf("Waiting "); + while(count) { + printf("%d ",count); + count--; + if(readable()) { + while(readable()) { + int c = getc(); + printf("READ %x\r\n",c); + } + } + Thread::wait(1000); + } + printf("done.\r\n"); + return ret; +}