Tadao Iida / Mbed 2 deprecated miconcarctrl

Dependencies:   TextLCD mbed

Committer:
sunifu
Date:
Mon May 07 05:57:12 2012 +0000
Revision:
4:887ced27d5d6
Parent:
SerialBuffered.cpp@0:6eaa311b9d3b
Child:
5:7f85cf99d0f6
0.0.1

Who changed what in which revision?

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