CameraC328

Dependents:   CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more

Committer:
shintamainjp
Date:
Fri Sep 17 11:15:37 2010 +0000
Revision:
13:17cf1e2015f7

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 13:17cf1e2015f7 1 #include "mbed.h"
shintamainjp 13:17cf1e2015f7 2 #include "SerialBuffered.h"
shintamainjp 13:17cf1e2015f7 3
shintamainjp 13:17cf1e2015f7 4 /**
shintamainjp 13:17cf1e2015f7 5 * Create a buffered serial class.
shintamainjp 13:17cf1e2015f7 6 *
shintamainjp 13:17cf1e2015f7 7 * @param tx A pin for transmit.
shintamainjp 13:17cf1e2015f7 8 * @param rx A pin for receive.
shintamainjp 13:17cf1e2015f7 9 */
shintamainjp 13:17cf1e2015f7 10 SerialBuffered::SerialBuffered(PinName tx, PinName rx) : Serial(tx, rx) {
shintamainjp 13:17cf1e2015f7 11 indexContentStart = 0;
shintamainjp 13:17cf1e2015f7 12 indexContentEnd = 0;
shintamainjp 13:17cf1e2015f7 13 timeout = 1;
shintamainjp 13:17cf1e2015f7 14 attach(this, &SerialBuffered::handleInterrupt);
shintamainjp 13:17cf1e2015f7 15 }
shintamainjp 13:17cf1e2015f7 16
shintamainjp 13:17cf1e2015f7 17 /**
shintamainjp 13:17cf1e2015f7 18 * Destroy.
shintamainjp 13:17cf1e2015f7 19 */
shintamainjp 13:17cf1e2015f7 20 SerialBuffered::~SerialBuffered() {
shintamainjp 13:17cf1e2015f7 21 }
shintamainjp 13:17cf1e2015f7 22
shintamainjp 13:17cf1e2015f7 23 /**
shintamainjp 13:17cf1e2015f7 24 * Set timeout for getc().
shintamainjp 13:17cf1e2015f7 25 *
shintamainjp 13:17cf1e2015f7 26 * @param ms milliseconds. (-1:Disable timeout)
shintamainjp 13:17cf1e2015f7 27 */
shintamainjp 13:17cf1e2015f7 28 void SerialBuffered::setTimeout(int ms) {
shintamainjp 13:17cf1e2015f7 29 timeout = ms;
shintamainjp 13:17cf1e2015f7 30 }
shintamainjp 13:17cf1e2015f7 31
shintamainjp 13:17cf1e2015f7 32 /**
shintamainjp 13:17cf1e2015f7 33 * Read requested bytes.
shintamainjp 13:17cf1e2015f7 34 *
shintamainjp 13:17cf1e2015f7 35 * @param bytes A pointer to a buffer.
shintamainjp 13:17cf1e2015f7 36 * @param requested Length.
shintamainjp 13:17cf1e2015f7 37 *
shintamainjp 13:17cf1e2015f7 38 * @return Readed byte length.
shintamainjp 13:17cf1e2015f7 39 */
shintamainjp 13:17cf1e2015f7 40 size_t SerialBuffered::readBytes(uint8_t *bytes, size_t requested) {
shintamainjp 13:17cf1e2015f7 41 int i = 0;
shintamainjp 13:17cf1e2015f7 42 while (i < requested) {
shintamainjp 13:17cf1e2015f7 43 int c = getc();
shintamainjp 13:17cf1e2015f7 44 if (c < 0) {
shintamainjp 13:17cf1e2015f7 45 break;
shintamainjp 13:17cf1e2015f7 46 }
shintamainjp 13:17cf1e2015f7 47 bytes[i] = c;
shintamainjp 13:17cf1e2015f7 48 i++;
shintamainjp 13:17cf1e2015f7 49 }
shintamainjp 13:17cf1e2015f7 50 return i;
shintamainjp 13:17cf1e2015f7 51 }
shintamainjp 13:17cf1e2015f7 52
shintamainjp 13:17cf1e2015f7 53 /**
shintamainjp 13:17cf1e2015f7 54 * Get a character.
shintamainjp 13:17cf1e2015f7 55 *
shintamainjp 13:17cf1e2015f7 56 * @return A character. (-1:timeout)
shintamainjp 13:17cf1e2015f7 57 */
shintamainjp 13:17cf1e2015f7 58 int SerialBuffered::getc() {
shintamainjp 13:17cf1e2015f7 59 timer.reset();
shintamainjp 13:17cf1e2015f7 60 timer.start();
shintamainjp 13:17cf1e2015f7 61 while (indexContentStart == indexContentEnd) {
shintamainjp 13:17cf1e2015f7 62 wait_ms(1);
shintamainjp 13:17cf1e2015f7 63 if ((timeout > 0) && (timer.read_ms() > timeout)) {
shintamainjp 13:17cf1e2015f7 64 /*
shintamainjp 13:17cf1e2015f7 65 * Timeout occured.
shintamainjp 13:17cf1e2015f7 66 */
shintamainjp 13:17cf1e2015f7 67 // printf("Timeout occured.\n");
shintamainjp 13:17cf1e2015f7 68 return EOF;
shintamainjp 13:17cf1e2015f7 69 }
shintamainjp 13:17cf1e2015f7 70 }
shintamainjp 13:17cf1e2015f7 71 timer.stop();
shintamainjp 13:17cf1e2015f7 72
shintamainjp 13:17cf1e2015f7 73 uint8_t result = buffer[indexContentStart++];
shintamainjp 13:17cf1e2015f7 74 indexContentStart = indexContentStart % BUFFERSIZE;
shintamainjp 13:17cf1e2015f7 75
shintamainjp 13:17cf1e2015f7 76 return result;
shintamainjp 13:17cf1e2015f7 77 }
shintamainjp 13:17cf1e2015f7 78
shintamainjp 13:17cf1e2015f7 79 /**
shintamainjp 13:17cf1e2015f7 80 * Returns 1 if there is a character available to read, 0 otherwise.
shintamainjp 13:17cf1e2015f7 81 */
shintamainjp 13:17cf1e2015f7 82 int SerialBuffered::readable() {
shintamainjp 13:17cf1e2015f7 83 return indexContentStart != indexContentEnd;
shintamainjp 13:17cf1e2015f7 84 }
shintamainjp 13:17cf1e2015f7 85
shintamainjp 13:17cf1e2015f7 86 void SerialBuffered::handleInterrupt() {
shintamainjp 13:17cf1e2015f7 87 while (Serial::readable()) {
shintamainjp 13:17cf1e2015f7 88 if (indexContentStart == ((indexContentEnd + 1) % BUFFERSIZE)) {
shintamainjp 13:17cf1e2015f7 89 /*
shintamainjp 13:17cf1e2015f7 90 * Buffer overrun occured.
shintamainjp 13:17cf1e2015f7 91 */
shintamainjp 13:17cf1e2015f7 92 // printf("Buffer overrun occured.\n");
shintamainjp 13:17cf1e2015f7 93 Serial::getc();
shintamainjp 13:17cf1e2015f7 94 } else {
shintamainjp 13:17cf1e2015f7 95 buffer[indexContentEnd++] = Serial::getc();
shintamainjp 13:17cf1e2015f7 96 indexContentEnd = indexContentEnd % BUFFERSIZE;
shintamainjp 13:17cf1e2015f7 97 }
shintamainjp 13:17cf1e2015f7 98 }
shintamainjp 13:17cf1e2015f7 99 }