SerialGPS.

Dependents:   SerialGPS_TestProgram Nucleo_SerialGPS_to_PC Nucleo_SerialGPS_to_PC SensorInterface ... more

Committer:
shintamainjp
Date:
Mon Sep 20 06:03:38 2010 +0000
Revision:
0:3d0c5d7e5d0a
Child:
1:a5b887e09aa4

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }