SerialGPS.
Dependents: SerialGPS_TestProgram Nucleo_SerialGPS_to_PC Nucleo_SerialGPS_to_PC SensorInterface ... more
SerialBuffered.cpp@0:3d0c5d7e5d0a, 2010-09-20 (annotated)
- Committer:
- shintamainjp
- Date:
- Mon Sep 20 06:03:38 2010 +0000
- Revision:
- 0:3d0c5d7e5d0a
- Child:
- 1:a5b887e09aa4
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shintamainjp | 0:3d0c5d7e5d0a | 1 | #include "mbed.h" |
shintamainjp | 0:3d0c5d7e5d0a | 2 | #include "SerialBuffered.h" |
shintamainjp | 0:3d0c5d7e5d0a | 3 | |
shintamainjp | 0:3d0c5d7e5d0a | 4 | SerialBuffered::SerialBuffered(PinName tx, PinName rx) : Serial(tx, rx) { |
shintamainjp | 0:3d0c5d7e5d0a | 5 | indexContentStart = 0; |
shintamainjp | 0:3d0c5d7e5d0a | 6 | indexContentEnd = 0; |
shintamainjp | 0:3d0c5d7e5d0a | 7 | timeout = 1; |
shintamainjp | 0:3d0c5d7e5d0a | 8 | attach(this, &SerialBuffered::handleInterrupt); |
shintamainjp | 0:3d0c5d7e5d0a | 9 | } |
shintamainjp | 0:3d0c5d7e5d0a | 10 | |
shintamainjp | 0:3d0c5d7e5d0a | 11 | SerialBuffered::~SerialBuffered() { |
shintamainjp | 0:3d0c5d7e5d0a | 12 | } |
shintamainjp | 0:3d0c5d7e5d0a | 13 | |
shintamainjp | 0:3d0c5d7e5d0a | 14 | void SerialBuffered::setTimeout(int ms) { |
shintamainjp | 0:3d0c5d7e5d0a | 15 | timeout = ms; |
shintamainjp | 0:3d0c5d7e5d0a | 16 | } |
shintamainjp | 0:3d0c5d7e5d0a | 17 | |
shintamainjp | 0:3d0c5d7e5d0a | 18 | size_t SerialBuffered::readBytes(uint8_t *bytes, size_t requested) { |
shintamainjp | 0:3d0c5d7e5d0a | 19 | int i = 0; |
shintamainjp | 0:3d0c5d7e5d0a | 20 | while (i < requested) { |
shintamainjp | 0:3d0c5d7e5d0a | 21 | int c = getc(); |
shintamainjp | 0:3d0c5d7e5d0a | 22 | if (c < 0) { |
shintamainjp | 0:3d0c5d7e5d0a | 23 | break; |
shintamainjp | 0:3d0c5d7e5d0a | 24 | } |
shintamainjp | 0:3d0c5d7e5d0a | 25 | bytes[i] = c; |
shintamainjp | 0:3d0c5d7e5d0a | 26 | i++; |
shintamainjp | 0:3d0c5d7e5d0a | 27 | } |
shintamainjp | 0:3d0c5d7e5d0a | 28 | return i; |
shintamainjp | 0:3d0c5d7e5d0a | 29 | } |
shintamainjp | 0:3d0c5d7e5d0a | 30 | |
shintamainjp | 0:3d0c5d7e5d0a | 31 | int SerialBuffered::getc() { |
shintamainjp | 0:3d0c5d7e5d0a | 32 | timer.reset(); |
shintamainjp | 0:3d0c5d7e5d0a | 33 | timer.start(); |
shintamainjp | 0:3d0c5d7e5d0a | 34 | while (indexContentStart == indexContentEnd) { |
shintamainjp | 0:3d0c5d7e5d0a | 35 | wait_ms(1); |
shintamainjp | 0:3d0c5d7e5d0a | 36 | if ((timeout > 0) && (timer.read_ms() > timeout)) { |
shintamainjp | 0:3d0c5d7e5d0a | 37 | /* |
shintamainjp | 0:3d0c5d7e5d0a | 38 | * Timeout occured. |
shintamainjp | 0:3d0c5d7e5d0a | 39 | */ |
shintamainjp | 0:3d0c5d7e5d0a | 40 | // printf("Timeout occured.\n"); |
shintamainjp | 0:3d0c5d7e5d0a | 41 | return EOF; |
shintamainjp | 0:3d0c5d7e5d0a | 42 | } |
shintamainjp | 0:3d0c5d7e5d0a | 43 | } |
shintamainjp | 0:3d0c5d7e5d0a | 44 | timer.stop(); |
shintamainjp | 0:3d0c5d7e5d0a | 45 | |
shintamainjp | 0:3d0c5d7e5d0a | 46 | uint8_t result = buffer[indexContentStart++]; |
shintamainjp | 0:3d0c5d7e5d0a | 47 | indexContentStart = indexContentStart % BUFFERSIZE; |
shintamainjp | 0:3d0c5d7e5d0a | 48 | |
shintamainjp | 0:3d0c5d7e5d0a | 49 | return result; |
shintamainjp | 0:3d0c5d7e5d0a | 50 | } |
shintamainjp | 0:3d0c5d7e5d0a | 51 | |
shintamainjp | 0:3d0c5d7e5d0a | 52 | int SerialBuffered::readable() { |
shintamainjp | 0:3d0c5d7e5d0a | 53 | return indexContentStart != indexContentEnd; |
shintamainjp | 0:3d0c5d7e5d0a | 54 | } |
shintamainjp | 0:3d0c5d7e5d0a | 55 | |
shintamainjp | 0:3d0c5d7e5d0a | 56 | void SerialBuffered::handleInterrupt() { |
shintamainjp | 0:3d0c5d7e5d0a | 57 | while (Serial::readable()) { |
shintamainjp | 0:3d0c5d7e5d0a | 58 | if (indexContentStart == ((indexContentEnd + 1) % BUFFERSIZE)) { |
shintamainjp | 0:3d0c5d7e5d0a | 59 | /* |
shintamainjp | 0:3d0c5d7e5d0a | 60 | * Buffer overrun occured. |
shintamainjp | 0:3d0c5d7e5d0a | 61 | */ |
shintamainjp | 0:3d0c5d7e5d0a | 62 | // printf("Buffer overrun occured.\n"); |
shintamainjp | 0:3d0c5d7e5d0a | 63 | Serial::getc(); |
shintamainjp | 0:3d0c5d7e5d0a | 64 | } else { |
shintamainjp | 0:3d0c5d7e5d0a | 65 | buffer[indexContentEnd++] = Serial::getc(); |
shintamainjp | 0:3d0c5d7e5d0a | 66 | indexContentEnd = indexContentEnd % BUFFERSIZE; |
shintamainjp | 0:3d0c5d7e5d0a | 67 | } |
shintamainjp | 0:3d0c5d7e5d0a | 68 | } |
shintamainjp | 0:3d0c5d7e5d0a | 69 | } |