Infrared SoftSerial. Use CircularBuffer.

Dependencies:   SoftSerial_IR

Dependents:   Test_SoftSerial_Infrared

Committer:
kenjiArai
Date:
Fri May 15 04:12:42 2020 +0000
Revision:
13:f3f6c1bc3bd6
Infrared SoftSeral (bufferred)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 13:f3f6c1bc3bd6 1
kenjiArai 13:f3f6c1bc3bd6 2 /**
kenjiArai 13:f3f6c1bc3bd6 3 * @file BufferedSoftSerial.h
kenjiArai 13:f3f6c1bc3bd6 4 * @brief Software Buffer
kenjiArai 13:f3f6c1bc3bd6 5 * - Extends mbed Serial functionallity adding irq driven TX and RX
kenjiArai 13:f3f6c1bc3bd6 6 * @author sam grove
kenjiArai 13:f3f6c1bc3bd6 7 * @version 1.0
kenjiArai 13:f3f6c1bc3bd6 8 * @see
kenjiArai 13:f3f6c1bc3bd6 9 *
kenjiArai 13:f3f6c1bc3bd6 10 * Copyright (c) 2013
kenjiArai 13:f3f6c1bc3bd6 11 *
kenjiArai 13:f3f6c1bc3bd6 12 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 13:f3f6c1bc3bd6 13 * you may not use this file except in compliance with the License.
kenjiArai 13:f3f6c1bc3bd6 14 * You may obtain a copy of the License at
kenjiArai 13:f3f6c1bc3bd6 15 *
kenjiArai 13:f3f6c1bc3bd6 16 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 13:f3f6c1bc3bd6 17 *
kenjiArai 13:f3f6c1bc3bd6 18 * Unless required by applicable law or agreed to in writing, software
kenjiArai 13:f3f6c1bc3bd6 19 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 13:f3f6c1bc3bd6 20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 13:f3f6c1bc3bd6 21 * See the License for the specific language governing permissions and
kenjiArai 13:f3f6c1bc3bd6 22 * limitations under the License.
kenjiArai 13:f3f6c1bc3bd6 23 */
kenjiArai 13:f3f6c1bc3bd6 24
kenjiArai 13:f3f6c1bc3bd6 25 /*
kenjiArai 13:f3f6c1bc3bd6 26 Original Library by Erik-
kenjiArai 13:f3f6c1bc3bd6 27 https://os.mbed.com/users/Sissors/code/BufferedSoftSerial/
kenjiArai 13:f3f6c1bc3bd6 28
kenjiArai 13:f3f6c1bc3bd6 29 Modified by K.Arai / JH1PJL May 15th, 2020
kenjiArai 13:f3f6c1bc3bd6 30
kenjiArai 13:f3f6c1bc3bd6 31 modified parts
kenjiArai 13:f3f6c1bc3bd6 32 use CircularBuffer (mbed standard library)
kenjiArai 13:f3f6c1bc3bd6 33 */
kenjiArai 13:f3f6c1bc3bd6 34
kenjiArai 13:f3f6c1bc3bd6 35 #ifndef BUFFEREDSOFTSERIAL_H
kenjiArai 13:f3f6c1bc3bd6 36 #define BUFFEREDSOFTSERIAL_H
kenjiArai 13:f3f6c1bc3bd6 37
kenjiArai 13:f3f6c1bc3bd6 38 #include "mbed.h"
kenjiArai 13:f3f6c1bc3bd6 39 #include "SoftSerial_IR.h"
kenjiArai 13:f3f6c1bc3bd6 40
kenjiArai 13:f3f6c1bc3bd6 41 /** A serial port (UART) for communication with other serial devices
kenjiArai 13:f3f6c1bc3bd6 42 *
kenjiArai 13:f3f6c1bc3bd6 43 * Can be used for Full Duplex communication, or Simplex by specifying
kenjiArai 13:f3f6c1bc3bd6 44 * one pin as NC (Not Connected)
kenjiArai 13:f3f6c1bc3bd6 45 *
kenjiArai 13:f3f6c1bc3bd6 46 * This uses software serial emulation, regular serial pins are alot better,
kenjiArai 13:f3f6c1bc3bd6 47 * however if you don't have spare ones, you can use this. It is advicable
kenjiArai 13:f3f6c1bc3bd6 48 * to put the serial connection with highest speed to hardware serial.
kenjiArai 13:f3f6c1bc3bd6 49 *
kenjiArai 13:f3f6c1bc3bd6 50 * If you lack RAM memory you can also use SoftSerial
kenjiArai 13:f3f6c1bc3bd6 51 * without this buffer around it.
kenjiArai 13:f3f6c1bc3bd6 52 * In that case it is fully blocking.
kenjiArai 13:f3f6c1bc3bd6 53 *
kenjiArai 13:f3f6c1bc3bd6 54 * Example:
kenjiArai 13:f3f6c1bc3bd6 55 * @code
kenjiArai 13:f3f6c1bc3bd6 56 * #include "mbed.h"
kenjiArai 13:f3f6c1bc3bd6 57 * #include "BufferedSoftSerial.h"
kenjiArai 13:f3f6c1bc3bd6 58 *
kenjiArai 13:f3f6c1bc3bd6 59 * SoftSerial block(USBTX, USBRX);
kenjiArai 13:f3f6c1bc3bd6 60 * BufferedSoftSerial buf(D3, D2);
kenjiArai 13:f3f6c1bc3bd6 61 *
kenjiArai 13:f3f6c1bc3bd6 62 * int main()
kenjiArai 13:f3f6c1bc3bd6 63 * {
kenjiArai 13:f3f6c1bc3bd6 64 * while(1) {
kenjiArai 13:f3f6c1bc3bd6 65 * Timer s;
kenjiArai 13:f3f6c1bc3bd6 66 *
kenjiArai 13:f3f6c1bc3bd6 67 * s.start();
kenjiArai 13:f3f6c1bc3bd6 68 * buf.printf("Hello World - buffered\r\n");
kenjiArai 13:f3f6c1bc3bd6 69 * int buffered_time = s.read_us();
kenjiArai 13:f3f6c1bc3bd6 70 * wait(0.1f); // give time for the buffer to empty
kenjiArai 13:f3f6c1bc3bd6 71 *
kenjiArai 13:f3f6c1bc3bd6 72 * s.reset();
kenjiArai 13:f3f6c1bc3bd6 73 * block.printf("Hello World - blocking\r\n");
kenjiArai 13:f3f6c1bc3bd6 74 * int polled_time = s.read_us();
kenjiArai 13:f3f6c1bc3bd6 75 * s.stop();
kenjiArai 13:f3f6c1bc3bd6 76 * wait(0.1f); // give time for the buffer to empty
kenjiArai 13:f3f6c1bc3bd6 77 *
kenjiArai 13:f3f6c1bc3bd6 78 * buf.printf("printf buffered took %d us\r\n", buffered_time);
kenjiArai 13:f3f6c1bc3bd6 79 * buf.printf("printf blocking took %d us\r\n", polled_time);
kenjiArai 13:f3f6c1bc3bd6 80 * wait(5);
kenjiArai 13:f3f6c1bc3bd6 81 * }
kenjiArai 13:f3f6c1bc3bd6 82 * }
kenjiArai 13:f3f6c1bc3bd6 83 * @endcode
kenjiArai 13:f3f6c1bc3bd6 84 */
kenjiArai 13:f3f6c1bc3bd6 85
kenjiArai 13:f3f6c1bc3bd6 86 /**
kenjiArai 13:f3f6c1bc3bd6 87 * @class BufferedSerial
kenjiArai 13:f3f6c1bc3bd6 88 * @brief Software buffers and interrupt driven tx and rx for SoftSerial
kenjiArai 13:f3f6c1bc3bd6 89 */
kenjiArai 13:f3f6c1bc3bd6 90 class Bf_SoftSerial_IR : public SoftSerial_IR
kenjiArai 13:f3f6c1bc3bd6 91 {
kenjiArai 13:f3f6c1bc3bd6 92 private:
kenjiArai 13:f3f6c1bc3bd6 93 CircularBuffer<char, 256> _rxbuf;
kenjiArai 13:f3f6c1bc3bd6 94 CircularBuffer<char, 256> _txbuf;
kenjiArai 13:f3f6c1bc3bd6 95
kenjiArai 13:f3f6c1bc3bd6 96 void rx_Irq(void);
kenjiArai 13:f3f6c1bc3bd6 97 void tx_Irq(void);
kenjiArai 13:f3f6c1bc3bd6 98 void prime(void);
kenjiArai 13:f3f6c1bc3bd6 99
kenjiArai 13:f3f6c1bc3bd6 100 public:
kenjiArai 13:f3f6c1bc3bd6 101 /** Create a BufferedSoftSerial port,
kenjiArai 13:f3f6c1bc3bd6 102 * connected to the specified transmit and receive pins
kenjiArai 13:f3f6c1bc3bd6 103 * @param tx Transmit pin
kenjiArai 13:f3f6c1bc3bd6 104 * @param rx Receive pin
kenjiArai 13:f3f6c1bc3bd6 105 * @note Either tx or rx may be specified as NC if unused
kenjiArai 13:f3f6c1bc3bd6 106 */
kenjiArai 13:f3f6c1bc3bd6 107 Bf_SoftSerial_IR(PinName tx, PinName rx, const char* name=NULL);
kenjiArai 13:f3f6c1bc3bd6 108
kenjiArai 13:f3f6c1bc3bd6 109 /** Check on how many bytes are in the rx buffer
kenjiArai 13:f3f6c1bc3bd6 110 * @return 1 if something exists, 0 otherwise
kenjiArai 13:f3f6c1bc3bd6 111 */
kenjiArai 13:f3f6c1bc3bd6 112 virtual int readable(void);
kenjiArai 13:f3f6c1bc3bd6 113
kenjiArai 13:f3f6c1bc3bd6 114 /** Check to see if the tx buffer has room
kenjiArai 13:f3f6c1bc3bd6 115 * @return 1 always has room and can overwrite previous content
kenjiArai 13:f3f6c1bc3bd6 116 * if too small / slow
kenjiArai 13:f3f6c1bc3bd6 117 */
kenjiArai 13:f3f6c1bc3bd6 118 virtual int writeable(void);
kenjiArai 13:f3f6c1bc3bd6 119
kenjiArai 13:f3f6c1bc3bd6 120 /** Get a single byte from the BufferedSoftSerial Port.
kenjiArai 13:f3f6c1bc3bd6 121 * Should check readable() before calling this.
kenjiArai 13:f3f6c1bc3bd6 122 * @return A byte that came in on the BufferedSoftSerial Port
kenjiArai 13:f3f6c1bc3bd6 123 */
kenjiArai 13:f3f6c1bc3bd6 124 virtual int getc(void);
kenjiArai 13:f3f6c1bc3bd6 125
kenjiArai 13:f3f6c1bc3bd6 126 /** Write a single byte to the BufferedSoftSerial Port.
kenjiArai 13:f3f6c1bc3bd6 127 * @param c The byte to write to the BufferedSoftSerial Port
kenjiArai 13:f3f6c1bc3bd6 128 * @return The byte that was written to the BufferedSoftSerial Port Buffer
kenjiArai 13:f3f6c1bc3bd6 129 */
kenjiArai 13:f3f6c1bc3bd6 130 virtual int putc(int c);
kenjiArai 13:f3f6c1bc3bd6 131
kenjiArai 13:f3f6c1bc3bd6 132 /** Write a string to the BufferedSoftSerial Port. Must be NULL terminated
kenjiArai 13:f3f6c1bc3bd6 133 * @param s The string to write to the Serial Port
kenjiArai 13:f3f6c1bc3bd6 134 * @return The number of bytes written to the Serial Port Buffer
kenjiArai 13:f3f6c1bc3bd6 135 */
kenjiArai 13:f3f6c1bc3bd6 136 virtual int puts(const char *s);
kenjiArai 13:f3f6c1bc3bd6 137
kenjiArai 13:f3f6c1bc3bd6 138 /** Write a formatted string to the BufferedSoftSerial Port.
kenjiArai 13:f3f6c1bc3bd6 139 * @param format The string + format specifiers to write
kenjiArai 13:f3f6c1bc3bd6 140 * to the BufferedSoftSerial Port
kenjiArai 13:f3f6c1bc3bd6 141 * @return The number of bytes written to the Serial Port Buffer
kenjiArai 13:f3f6c1bc3bd6 142 */
kenjiArai 13:f3f6c1bc3bd6 143 virtual int printf(const char* format, ...);
kenjiArai 13:f3f6c1bc3bd6 144
kenjiArai 13:f3f6c1bc3bd6 145 /** Write data to the BufferedSoftSerial Port
kenjiArai 13:f3f6c1bc3bd6 146 * @param s A pointer to data to send
kenjiArai 13:f3f6c1bc3bd6 147 * @param length The amount of data being pointed to
kenjiArai 13:f3f6c1bc3bd6 148 * @return The number of bytes written to the Serial Port Buffer
kenjiArai 13:f3f6c1bc3bd6 149 */
kenjiArai 13:f3f6c1bc3bd6 150 virtual ssize_t write(const void *s, std::size_t length);
kenjiArai 13:f3f6c1bc3bd6 151 };
kenjiArai 13:f3f6c1bc3bd6 152
kenjiArai 13:f3f6c1bc3bd6 153 #endif