Library for LinkSprite Y201 JPEG serial camera.

Revision:
10:fd12c96da974
Parent:
9:fbd80a803857
--- a/Y201.cpp	Thu Jul 19 15:48:25 2012 +0000
+++ b/Y201.cpp	Fri Jul 20 08:59:03 2012 +0000
@@ -1,18 +1,24 @@
 #include "Y201.h"
 #include "rtos.h"
 
-const int Y201::resetSeq       [4] = {0x56,0x00,0x26,0x00};
-const int Y201::resetSeqAck    [4] = {0x76,0x00,0x26,0x00};
-const int Y201::takePicSeq     [5] = {0x56,0x00,0x36,0x01,0x00};
-const int Y201::takePicSeqAck  [5] = {0x76,0x00,0x36,0x00,0x00};
-const int Y201::set160x120     [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x22};
-const int Y201::set320x240     [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x11};
-const int Y201::set640x480     [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x00};
-const int Y201::setSizeAck     [5] = {0x76,0x00,0x31,0x00,0x00};
-const int Y201::readFileSize   [5] = {0x56,0x00,0x34,0x01,0x00};
-const int Y201::readFileSizeAck[7] = {0x76,0x00,0x34,0x00,0x04,0x00,0x00};
-const int Y201::readFileHead   [8] = {0x56,0x00,0x32,0x0C,0x00,0x0A,0x00,0x00};
-const int Y201::readFileAck    [5] = {0x76,0x00,0x32,0x00,0x00};
+const char Y201::resetSeq            [4] = {0x56,0x00,0x26,0x00};
+const char Y201::resetSeqAck         [4] = {0x76,0x00,0x26,0x00};
+const char Y201::takePicSeq          [5] = {0x56,0x00,0x36,0x01,0x00};
+const char Y201::takePicSeqAck       [5] = {0x76,0x00,0x36,0x00,0x00};
+const char Y201::set160x120          [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x22};
+const char Y201::set320x240          [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x11};
+const char Y201::set640x480          [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x00};
+const char Y201::setSizeAck          [5] = {0x76,0x00,0x31,0x00,0x00};
+const char Y201::readFileSize        [5] = {0x56,0x00,0x34,0x01,0x00};
+const char Y201::readFileSizeAck     [7] = {0x76,0x00,0x34,0x00,0x04,0x00,0x00};
+const char Y201::readFileHead        [8] = {0x56,0x00,0x32,0x0C,0x00,0x0A,0x00,0x00};
+const char Y201::readFileAck         [5] = {0x76,0x00,0x32,0x00,0x00};
+//const char Y201::changeBaudRateSeq   [5] = {0x56,0x00,0x24,0x03,0x01};
+//const char Y201::changeBaudRateAck   [5] = {0x76,0x00,0x24,0x00,0x00};
+const char Y201::enterPowerSavingSeq [7] = {0x56,0x00,0x3E,0x03,0x00,0x01,0x01};
+const char Y201::enterPowerSavingAck [5] = {0x76,0x00,0x3E,0x00,0x00};
+const char Y201::exitPowerSavingSeq  [7] = {0x56,0x00,0x3E,0x03,0x00,0x01,0x00};
+const char Y201::exitPowerSavingAck  [5] = {0x76,0x00,0x3E,0x00,0x00};
 
 void Y201::trash() {
     // wait for trash...
@@ -22,6 +28,8 @@
 }
 
 bool Y201::readImage(int startAddress, int readLen, uint8_t *readBuffer) {
+   trash(); // camera sends random crap after sending certain responses, so need to clear it
+   //Thread::wait(5);
    putSeq(readFileHead,readFileHeadLen);
    putc(startAddress>>8); // Start Address MSB
    putc(startAddress&255); // Start Address LSB
@@ -39,28 +47,25 @@
       while(nread<readLen) {
          if(readable()) {
             uint8_t c = getc();
-           // fprintf(stdout, "[%02x]", c);
+            // fprintf(stdout, "[%02x]", c);
             readBuffer[nread] = c;
             nread++;
             t.reset();
-         }
-         else
-         {
-           if(t.read_ms()>3000)
-           {
-             fprintf(stdout, "Blocked!\n Missed %d bytes over %d\nLast byte read is %02x\n", readLen - nread, readLen, readBuffer[nread-1]);
-             return false;
-           }
+         } else {
+            if(t.read_ms()>3000) {
+               fprintf(stdout, "Blocked!\n Missed %d bytes over %d\nLast byte read is %02x\n", readLen - nread, readLen, readBuffer[nread-1]);
+               return false;
+            }
          }
      }
      Thread::wait(1);
-  } else {
-     return false;
-  }
-  return true;
+   } else {
+      return false;
+   }
+   return true;
 }
 
-bool Y201::waitFor(const int *seq, const int seqLen) {
+bool Y201::waitFor(const char *seq, const int seqLen) {
     int spos = 0;
     long timeout = 100;
     Timer timer;
@@ -108,7 +113,7 @@
     return true;
 }
 
-void Y201::putSeq(const int *seq, int seqLen) {
+void Y201::putSeq(const char *seq, int seqLen) {
     while(seqLen--) {
         putc(*seq++);
     }
@@ -141,6 +146,16 @@
    return waitFor(takePicSeqAck,takePicSeqAckLen);
 }
 
+bool Y201::enterPowerSaving() {
+    putSeq(enterPowerSavingSeq,enterPowerSavingLen);
+    return waitFor(enterPowerSavingAck,enterPowerSavingAckLen);
+}
+
+bool Y201::exitPowerSaving() {
+    putSeq(exitPowerSavingSeq,exitPowerSavingLen);
+    return waitFor(exitPowerSavingAck,exitPowerSavingAckLen);
+}
+
 bool Y201::readImageSize(int *fileSize) {
    putSeq(readFileSize,readFileSizeLen);
    bool ret = waitFor(readFileSizeAck,readFileSizeAckLen);
@@ -166,3 +181,59 @@
   }
   return ret;
 }
+
+/*
+
+THIS SIMPLY DOESN'T WORK -- Known bug, LinkSprite quality products
+
+
+bool Y201::changeBaudRate(Y201BaudRate baudRate) {
+   // put the prefix
+   putSeq(changeBaudRateSeq,changeBaudRateSeqLen);
+   int br = 9600;
+   
+   // put the baud rate
+   switch(baudRate) {
+      case Y201::e9600:
+         putc(0xAE);
+         putc(0xC8);
+         br = 9600;
+      break;
+      
+      case Y201::e19200:
+         putc(0x56);
+         putc(0xE4);
+         br = 19200;
+      break;
+      
+      case Y201::e38400:
+         putc(0x2A);
+         putc(0xF2);
+         br = 38400;
+      break;
+      
+      case Y201::e57600:
+         putc(0x1C);
+         putc(0x4C);
+         br = 57600;
+      break;
+      
+      case Y201::e115200:
+         putc(0xAE);
+         putc(0xC8);
+         br = 115200;
+      break;
+      
+      default:
+         putc(0xAE);
+         putc(0xC8);
+         br = 9600;
+      break;
+   }
+   
+   baud(br);
+   
+   // wait for the ack
+   return waitFor(changeBaudRateAck,changeBaudRateAckLen);
+}
+*/
\ No newline at end of file