polytech umpc project
Fork of SerialGPS by
SerialBuffered.cpp
- Committer:
- shintamainjp
- Date:
- 2010-09-20
- Revision:
- 0:3d0c5d7e5d0a
- Child:
- 1:a5b887e09aa4
File content as of revision 0:3d0c5d7e5d0a:
#include "mbed.h" #include "SerialBuffered.h" SerialBuffered::SerialBuffered(PinName tx, PinName rx) : Serial(tx, rx) { indexContentStart = 0; indexContentEnd = 0; timeout = 1; attach(this, &SerialBuffered::handleInterrupt); } SerialBuffered::~SerialBuffered() { } void SerialBuffered::setTimeout(int ms) { timeout = ms; } size_t SerialBuffered::readBytes(uint8_t *bytes, size_t requested) { int i = 0; while (i < requested) { int c = getc(); if (c < 0) { break; } bytes[i] = c; i++; } return i; } int SerialBuffered::getc() { timer.reset(); timer.start(); while (indexContentStart == indexContentEnd) { wait_ms(1); if ((timeout > 0) && (timer.read_ms() > timeout)) { /* * Timeout occured. */ // printf("Timeout occured.\n"); return EOF; } } timer.stop(); uint8_t result = buffer[indexContentStart++]; indexContentStart = indexContentStart % BUFFERSIZE; return result; } int SerialBuffered::readable() { return indexContentStart != indexContentEnd; } void SerialBuffered::handleInterrupt() { while (Serial::readable()) { if (indexContentStart == ((indexContentEnd + 1) % BUFFERSIZE)) { /* * Buffer overrun occured. */ // printf("Buffer overrun occured.\n"); Serial::getc(); } else { buffer[indexContentEnd++] = Serial::getc(); indexContentEnd = indexContentEnd % BUFFERSIZE; } } }