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;
+}



