Dependencies:   mbed

Committer:
mitesh2patel
Date:
Tue Dec 14 13:27:41 2010 +0000
Revision:
1:78aaadfd1ece
Parent:
0:162e214baa3d

        

Who changed what in which revision?

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