Library for LinkSprite Y201 JPEG serial camera.
Y201.cpp@4:6e575c19681f, 2012-07-17 (annotated)
- Committer:
- ashleymills
- Date:
- Tue Jul 17 16:35:35 2012 +0000
- Revision:
- 4:6e575c19681f
- Parent:
- 2:7d8a6087f2e5
- Child:
- 5:df71c00b97d8
Removed printf (otherwise these get sent to the camera since Y201 extends serial)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ashleymills | 0:4c0fca059a0a | 1 | #include "Y201.h" |
ashleymills | 0:4c0fca059a0a | 2 | #include "rtos.h" |
ashleymills | 0:4c0fca059a0a | 3 | |
ashleymills | 0:4c0fca059a0a | 4 | void Y201::trash() { |
ashleymills | 0:4c0fca059a0a | 5 | // wait for trash... |
ashleymills | 0:4c0fca059a0a | 6 | while(readable()) { |
ashleymills | 0:4c0fca059a0a | 7 | int x = getc(); |
ashleymills | 0:4c0fca059a0a | 8 | } |
ashleymills | 0:4c0fca059a0a | 9 | } |
ashleymills | 0:4c0fca059a0a | 10 | |
ashleymills | 0:4c0fca059a0a | 11 | bool Y201::readImage(int startAddress, int readLen, uint8_t *readBuffer) { |
ashleymills | 0:4c0fca059a0a | 12 | putSeq(readFileHead,readFileHeadLen); |
ashleymills | 0:4c0fca059a0a | 13 | putc(startAddress>>8); // Start Address MSB |
ashleymills | 0:4c0fca059a0a | 14 | putc(startAddress&255); // Start Address LSB |
ashleymills | 0:4c0fca059a0a | 15 | putc(0x00); |
ashleymills | 0:4c0fca059a0a | 16 | putc(0x00); |
ashleymills | 0:4c0fca059a0a | 17 | putc(readLen>>8); // Length of file MSB |
ashleymills | 0:4c0fca059a0a | 18 | putc(readLen&255); // length of file LSB |
ashleymills | 0:4c0fca059a0a | 19 | putc(0x00); // Interval MSB |
ashleymills | 0:4c0fca059a0a | 20 | putc(0x0A); // Interval LSB |
ashleymills | 0:4c0fca059a0a | 21 | int nread = 0; |
ashleymills | 0:4c0fca059a0a | 22 | if(waitFor(readFileAck,readFileAckLen)) { |
ashleymills | 0:4c0fca059a0a | 23 | Thread::wait(1); |
ashleymills | 0:4c0fca059a0a | 24 | while(nread<readLen) { |
ashleymills | 0:4c0fca059a0a | 25 | if(readable()) { |
ashleymills | 0:4c0fca059a0a | 26 | uint8_t c = getc(); |
ashleymills | 0:4c0fca059a0a | 27 | readBuffer[nread] = c; |
ashleymills | 0:4c0fca059a0a | 28 | nread++; |
ashleymills | 0:4c0fca059a0a | 29 | } |
ashleymills | 0:4c0fca059a0a | 30 | } |
ashleymills | 2:7d8a6087f2e5 | 31 | Thread::wait(1); |
ashleymills | 0:4c0fca059a0a | 32 | } else { |
ashleymills | 0:4c0fca059a0a | 33 | return false; |
ashleymills | 0:4c0fca059a0a | 34 | } |
ashleymills | 0:4c0fca059a0a | 35 | return true; |
ashleymills | 0:4c0fca059a0a | 36 | } |
ashleymills | 0:4c0fca059a0a | 37 | |
ashleymills | 0:4c0fca059a0a | 38 | bool Y201::waitFor(const int *seq, const int seqLen) { |
ashleymills | 0:4c0fca059a0a | 39 | int spos = 0; |
ashleymills | 0:4c0fca059a0a | 40 | long timeout = 100000000; |
ashleymills | 0:4c0fca059a0a | 41 | long timer = 0; |
ashleymills | 0:4c0fca059a0a | 42 | while(spos<seqLen) { |
ashleymills | 0:4c0fca059a0a | 43 | if(readable()) { |
ashleymills | 0:4c0fca059a0a | 44 | int c = getc(); |
ashleymills | 0:4c0fca059a0a | 45 | if(seq[spos]==c) { |
ashleymills | 0:4c0fca059a0a | 46 | spos++; |
ashleymills | 0:4c0fca059a0a | 47 | } else { |
ashleymills | 0:4c0fca059a0a | 48 | return false; |
ashleymills | 0:4c0fca059a0a | 49 | } |
ashleymills | 0:4c0fca059a0a | 50 | } else { |
ashleymills | 0:4c0fca059a0a | 51 | if(timer<timeout) { |
ashleymills | 0:4c0fca059a0a | 52 | timer++; |
ashleymills | 0:4c0fca059a0a | 53 | } else { |
ashleymills | 0:4c0fca059a0a | 54 | return false; |
ashleymills | 0:4c0fca059a0a | 55 | } |
ashleymills | 0:4c0fca059a0a | 56 | } |
ashleymills | 0:4c0fca059a0a | 57 | } |
ashleymills | 0:4c0fca059a0a | 58 | return true; |
ashleymills | 0:4c0fca059a0a | 59 | } |
ashleymills | 0:4c0fca059a0a | 60 | |
ashleymills | 0:4c0fca059a0a | 61 | bool Y201::waitForInt(int bytes, int *fileSize) { |
ashleymills | 0:4c0fca059a0a | 62 | int spos = 0; |
ashleymills | 1:30a6aeda21c2 | 63 | long timeout = 1000000000; |
ashleymills | 0:4c0fca059a0a | 64 | long timer = 0; |
ashleymills | 0:4c0fca059a0a | 65 | *fileSize = 0; |
ashleymills | 0:4c0fca059a0a | 66 | while(spos<bytes) { |
ashleymills | 0:4c0fca059a0a | 67 | if(readable()) { |
ashleymills | 0:4c0fca059a0a | 68 | uint8_t val = getc(); |
ashleymills | 0:4c0fca059a0a | 69 | if(spos==0) { |
ashleymills | 0:4c0fca059a0a | 70 | *fileSize += (val<<8); |
ashleymills | 0:4c0fca059a0a | 71 | } else { |
ashleymills | 0:4c0fca059a0a | 72 | *fileSize += val; |
ashleymills | 0:4c0fca059a0a | 73 | } |
ashleymills | 0:4c0fca059a0a | 74 | |
ashleymills | 0:4c0fca059a0a | 75 | spos++; |
ashleymills | 0:4c0fca059a0a | 76 | |
ashleymills | 0:4c0fca059a0a | 77 | } else { |
ashleymills | 0:4c0fca059a0a | 78 | if(timer<timeout) { |
ashleymills | 0:4c0fca059a0a | 79 | timer++; |
ashleymills | 0:4c0fca059a0a | 80 | } else { |
ashleymills | 1:30a6aeda21c2 | 81 | return false; |
ashleymills | 0:4c0fca059a0a | 82 | } |
ashleymills | 0:4c0fca059a0a | 83 | } |
ashleymills | 0:4c0fca059a0a | 84 | } |
ashleymills | 0:4c0fca059a0a | 85 | return true; |
ashleymills | 0:4c0fca059a0a | 86 | } |
ashleymills | 0:4c0fca059a0a | 87 | |
ashleymills | 0:4c0fca059a0a | 88 | void Y201::putSeq(const int *seq, int seqLen) { |
ashleymills | 0:4c0fca059a0a | 89 | while(seqLen--) { |
ashleymills | 0:4c0fca059a0a | 90 | putc(*seq++); |
ashleymills | 0:4c0fca059a0a | 91 | } |
ashleymills | 0:4c0fca059a0a | 92 | } |
ashleymills | 0:4c0fca059a0a | 93 | |
ashleymills | 2:7d8a6087f2e5 | 94 | Y201::Y201(PinName tx, PinName rx, const char *name) : MODSERIAL(tx,rx,name) { |
ashleymills | 0:4c0fca059a0a | 95 | baud(38400); |
ashleymills | 0:4c0fca059a0a | 96 | } |
ashleymills | 0:4c0fca059a0a | 97 | |
ashleymills | 0:4c0fca059a0a | 98 | bool Y201::setImageSize(Y201ImageSize size) { |
ashleymills | 0:4c0fca059a0a | 99 | switch(size) { |
ashleymills | 0:4c0fca059a0a | 100 | case Y201::e640x480: |
ashleymills | 0:4c0fca059a0a | 101 | putSeq(set640x480,setSizeLen); |
ashleymills | 0:4c0fca059a0a | 102 | break; |
ashleymills | 0:4c0fca059a0a | 103 | |
ashleymills | 0:4c0fca059a0a | 104 | case Y201::e160x120: |
ashleymills | 0:4c0fca059a0a | 105 | putSeq(set160x120,setSizeLen); |
ashleymills | 0:4c0fca059a0a | 106 | break; |
ashleymills | 0:4c0fca059a0a | 107 | |
ashleymills | 0:4c0fca059a0a | 108 | case Y201::e320x240: |
ashleymills | 0:4c0fca059a0a | 109 | putSeq(set320x240,setSizeLen); |
ashleymills | 0:4c0fca059a0a | 110 | break; |
ashleymills | 0:4c0fca059a0a | 111 | } |
ashleymills | 0:4c0fca059a0a | 112 | return waitFor(setSizeAck,setSizeAckLen); |
ashleymills | 0:4c0fca059a0a | 113 | } |
ashleymills | 0:4c0fca059a0a | 114 | |
ashleymills | 0:4c0fca059a0a | 115 | bool Y201::takePicture() { |
ashleymills | 0:4c0fca059a0a | 116 | putSeq(takePicSeq,takePicSeqLen); |
ashleymills | 0:4c0fca059a0a | 117 | Thread::wait(50); |
ashleymills | 0:4c0fca059a0a | 118 | return waitFor(takePicSeqAck,takePicSeqAckLen); |
ashleymills | 0:4c0fca059a0a | 119 | } |
ashleymills | 0:4c0fca059a0a | 120 | |
ashleymills | 0:4c0fca059a0a | 121 | bool Y201::readImageSize(int *fileSize) { |
ashleymills | 0:4c0fca059a0a | 122 | putSeq(readFileSize,readFileSizeLen); |
ashleymills | 0:4c0fca059a0a | 123 | bool ret = waitFor(readFileSizeAck,readFileSizeAckLen); |
ashleymills | 0:4c0fca059a0a | 124 | if(!ret) |
ashleymills | 0:4c0fca059a0a | 125 | return false; |
ashleymills | 0:4c0fca059a0a | 126 | return waitForInt(2,fileSize); |
ashleymills | 0:4c0fca059a0a | 127 | } |
ashleymills | 0:4c0fca059a0a | 128 | |
ashleymills | 0:4c0fca059a0a | 129 | bool Y201::reset() { |
ashleymills | 0:4c0fca059a0a | 130 | putSeq(resetSeq,resetSeqLen); |
ashleymills | 0:4c0fca059a0a | 131 | bool ret = waitFor(resetSeqAck,resetSeqAckLen); |
ashleymills | 0:4c0fca059a0a | 132 | |
ashleymills | 0:4c0fca059a0a | 133 | // wait for trash |
ashleymills | 0:4c0fca059a0a | 134 | int count = 3; |
ashleymills | 0:4c0fca059a0a | 135 | while(count) { |
ashleymills | 0:4c0fca059a0a | 136 | count--; |
ashleymills | 0:4c0fca059a0a | 137 | if(readable()) { |
ashleymills | 0:4c0fca059a0a | 138 | while(readable()) { |
ashleymills | 0:4c0fca059a0a | 139 | int c = getc(); |
ashleymills | 0:4c0fca059a0a | 140 | } |
ashleymills | 0:4c0fca059a0a | 141 | } |
ashleymills | 0:4c0fca059a0a | 142 | Thread::wait(1000); |
ashleymills | 0:4c0fca059a0a | 143 | } |
ashleymills | 0:4c0fca059a0a | 144 | return ret; |
ashleymills | 0:4c0fca059a0a | 145 | } |