Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Y201.cpp
00001 #include "Y201.h" 00002 #include "rtos.h" 00003 00004 const char Y201::resetSeq [4] = {0x56,0x00,0x26,0x00}; 00005 const char Y201::resetSeqAck [4] = {0x76,0x00,0x26,0x00}; 00006 const char Y201::takePicSeq [5] = {0x56,0x00,0x36,0x01,0x00}; 00007 const char Y201::takePicSeqAck [5] = {0x76,0x00,0x36,0x00,0x00}; 00008 const char Y201::set160x120 [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x22}; 00009 const char Y201::set320x240 [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x11}; 00010 const char Y201::set640x480 [9] = {0x56,0x00,0x31,0x05,0x04,0x01,0x00,0x19,0x00}; 00011 const char Y201::setSizeAck [5] = {0x76,0x00,0x31,0x00,0x00}; 00012 const char Y201::readFileSize [5] = {0x56,0x00,0x34,0x01,0x00}; 00013 const char Y201::readFileSizeAck [7] = {0x76,0x00,0x34,0x00,0x04,0x00,0x00}; 00014 const char Y201::readFileHead [8] = {0x56,0x00,0x32,0x0C,0x00,0x0A,0x00,0x00}; 00015 const char Y201::readFileAck [5] = {0x76,0x00,0x32,0x00,0x00}; 00016 //const char Y201::changeBaudRateSeq [5] = {0x56,0x00,0x24,0x03,0x01}; 00017 //const char Y201::changeBaudRateAck [5] = {0x76,0x00,0x24,0x00,0x00}; 00018 const char Y201::enterPowerSavingSeq [7] = {0x56,0x00,0x3E,0x03,0x00,0x01,0x01}; 00019 const char Y201::enterPowerSavingAck [5] = {0x76,0x00,0x3E,0x00,0x00}; 00020 const char Y201::exitPowerSavingSeq [7] = {0x56,0x00,0x3E,0x03,0x00,0x01,0x00}; 00021 const char Y201::exitPowerSavingAck [5] = {0x76,0x00,0x3E,0x00,0x00}; 00022 00023 void Y201::trash() { 00024 // wait for trash... 00025 while(readable()) { 00026 int x = getc(); 00027 } 00028 } 00029 00030 bool Y201::readImage(int startAddress, int readLen, uint8_t *readBuffer) { 00031 trash(); // camera sends random crap after sending certain responses, so need to clear it 00032 //Thread::wait(5); 00033 putSeq(readFileHead,readFileHeadLen); 00034 putc(startAddress>>8); // Start Address MSB 00035 putc(startAddress&255); // Start Address LSB 00036 putc(0x00); 00037 putc(0x00); 00038 putc(readLen>>8); // Length of file MSB 00039 putc(readLen&255); // length of file LSB 00040 putc(0x00); // Interval MSB 00041 putc(0x0A); // Interval LSB 00042 int nread = 0; 00043 if(waitFor(readFileAck,readFileAckLen)) { 00044 Thread::wait(1); 00045 Timer t; 00046 t.start(); 00047 while(nread<readLen) { 00048 if(readable()) { 00049 uint8_t c = getc(); 00050 // fprintf(stdout, "[%02x]", c); 00051 readBuffer[nread] = c; 00052 nread++; 00053 t.reset(); 00054 } else { 00055 if(t.read_ms()>3000) { 00056 fprintf(stdout, "Blocked!\n Missed %d bytes over %d\nLast byte read is %02x\n", readLen - nread, readLen, readBuffer[nread-1]); 00057 return false; 00058 } 00059 } 00060 } 00061 Thread::wait(1); 00062 } else { 00063 return false; 00064 } 00065 return true; 00066 } 00067 00068 bool Y201::waitFor(const char *seq, const int seqLen) { 00069 int spos = 0; 00070 long timeout = 100; 00071 Timer timer; 00072 timer.start(); 00073 while(spos<seqLen) { 00074 if(readable()) { 00075 int c = getc(); 00076 if(seq[spos]==c) { 00077 spos++; 00078 } else { 00079 return false; 00080 } 00081 } else { 00082 if(timer.read_ms()>timeout) { 00083 return false; 00084 } 00085 } 00086 } 00087 return true; 00088 } 00089 00090 bool Y201::waitForInt(int bytes, int *fileSize) { 00091 int spos = 0; 00092 long timeout = 100; 00093 Timer timer; 00094 timer.start(); 00095 *fileSize = 0; 00096 while(spos<bytes) { 00097 if(readable()) { 00098 uint8_t val = getc(); 00099 if(spos==0) { 00100 *fileSize += (val<<8); 00101 } else { 00102 *fileSize += val; 00103 } 00104 00105 spos++; 00106 00107 } else { 00108 if(timer.read_ms()>timeout) { 00109 return false; 00110 } 00111 } 00112 } 00113 return true; 00114 } 00115 00116 void Y201::putSeq(const char *seq, int seqLen) { 00117 while(seqLen--) { 00118 putc(*seq++); 00119 } 00120 } 00121 00122 Y201::Y201(PinName tx, PinName rx, const char *name) : MODSERIAL(tx,rx,name) { 00123 baud(38400); 00124 } 00125 00126 bool Y201::setImageSize(Y201ImageSize size) { 00127 switch(size) { 00128 case Y201::e640x480: 00129 putSeq(set640x480,setSizeLen); 00130 break; 00131 00132 case Y201::e160x120: 00133 putSeq(set160x120,setSizeLen); 00134 break; 00135 00136 case Y201::e320x240: 00137 putSeq(set320x240,setSizeLen); 00138 break; 00139 } 00140 return waitFor(setSizeAck,setSizeAckLen); 00141 } 00142 00143 bool Y201::takePicture() { 00144 putSeq(takePicSeq,takePicSeqLen); 00145 Thread::wait(50); 00146 return waitFor(takePicSeqAck,takePicSeqAckLen); 00147 } 00148 00149 bool Y201::enterPowerSaving() { 00150 putSeq(enterPowerSavingSeq,enterPowerSavingLen); 00151 return waitFor(enterPowerSavingAck,enterPowerSavingAckLen); 00152 } 00153 00154 bool Y201::exitPowerSaving() { 00155 putSeq(exitPowerSavingSeq,exitPowerSavingLen); 00156 return waitFor(exitPowerSavingAck,exitPowerSavingAckLen); 00157 } 00158 00159 bool Y201::readImageSize(int *fileSize) { 00160 putSeq(readFileSize,readFileSizeLen); 00161 bool ret = waitFor(readFileSizeAck,readFileSizeAckLen); 00162 if(!ret) 00163 return false; 00164 return waitForInt(2,fileSize); 00165 } 00166 00167 bool Y201::reset() { 00168 putSeq(resetSeq,resetSeqLen); 00169 bool ret = waitFor(resetSeqAck,resetSeqAckLen); 00170 00171 // wait for trash 00172 int count = 3; 00173 while(count) { 00174 count--; 00175 if(readable()) { 00176 while(readable()) { 00177 int c = getc(); 00178 } 00179 } 00180 Thread::wait(1000); 00181 } 00182 return ret; 00183 } 00184 00185 /* 00186 00187 THIS SIMPLY DOESN'T WORK -- Known bug, LinkSprite quality products 00188 00189 00190 bool Y201::changeBaudRate(Y201BaudRate baudRate) { 00191 // put the prefix 00192 putSeq(changeBaudRateSeq,changeBaudRateSeqLen); 00193 int br = 9600; 00194 00195 // put the baud rate 00196 switch(baudRate) { 00197 case Y201::e9600: 00198 putc(0xAE); 00199 putc(0xC8); 00200 br = 9600; 00201 break; 00202 00203 case Y201::e19200: 00204 putc(0x56); 00205 putc(0xE4); 00206 br = 19200; 00207 break; 00208 00209 case Y201::e38400: 00210 putc(0x2A); 00211 putc(0xF2); 00212 br = 38400; 00213 break; 00214 00215 case Y201::e57600: 00216 putc(0x1C); 00217 putc(0x4C); 00218 br = 57600; 00219 break; 00220 00221 case Y201::e115200: 00222 putc(0xAE); 00223 putc(0xC8); 00224 br = 115200; 00225 break; 00226 00227 default: 00228 putc(0xAE); 00229 putc(0xC8); 00230 br = 9600; 00231 break; 00232 } 00233 00234 baud(br); 00235 00236 // wait for the ack 00237 return waitFor(changeBaudRateAck,changeBaudRateAckLen); 00238 } 00239 */
Generated on Mon Jul 18 2022 22:10:58 by
1.7.2