HeptaCamera&GPS Library

Dependents:   Lab9-01_All_transmit Lab9-03_Thermal_chamber Final_Magnetism_measurement_GPS_data_saving LaserCommProtocol_01 ... more

Fork of HeptaCamera_GPS by CLTP 8

Committer:
HEPTA
Date:
Tue Nov 05 07:08:17 2019 +0000
Revision:
27:bf29ef2b3c76
Parent:
25:402a5cd90786
Compatible with south latitude and west longitude

Who changed what in which revision?

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