NuMaker Transfer data UART to Ethernet

Fork of Serial-to-Ethernet by Morgan Du

Committer:
SHLIU1@OANBE02333.nuvoton.com
Date:
Tue Mar 02 10:09:10 2021 +0800
Revision:
6:014b1a469aed
Support the both V5.X and V6.X for mbed-os

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 1
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 2 /**
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 3 * @file Buffer.h
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 4 * @brief Software Buffer - Templated Ring Buffer for most data types
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 5 * @author sam grove
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 6 * @version 1.0
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 7 * @see
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 8 *
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 9 * Copyright (c) 2013
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 10 *
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 11 * Licensed under the Apache License, Version 2.0 (the "License");
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 12 * you may not use this file except in compliance with the License.
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 13 * You may obtain a copy of the License at
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 14 *
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 15 * http://www.apache.org/licenses/LICENSE-2.0
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 16 *
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 17 * Unless required by applicable law or agreed to in writing, software
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 18 * distributed under the License is distributed on an "AS IS" BASIS,
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 20 * See the License for the specific language governing permissions and
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 21 * limitations under the License.
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 22 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 23
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 24 #ifndef MYBUFFER_H
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 25 #define MYBUFFER_H
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 26
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 27 #include <stdint.h>
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 28 #include <string.h>
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 29
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 30 /** A templated software ring buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 31 *
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 32 * Example:
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 33 * @code
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 34 * #include "mbed.h"
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 35 * #include "MyBuffer.h"
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 36 *
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 37 * MyBuffer <char> buf;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 38 *
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 39 * int main()
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 40 * {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 41 * buf = 'a';
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 42 * buf.put('b');
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 43 * char *head = buf.head();
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 44 * puts(head);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 45 *
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 46 * char whats_in_there[2] = {0};
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 47 * int pos = 0;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 48 *
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 49 * while(buf.available())
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 50 * {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 51 * whats_in_there[pos++] = buf;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 52 * }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 53 * printf("%c %c\n", whats_in_there[0], whats_in_there[1]);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 54 * buf.clear();
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 55 * error("done\n\n\n");
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 56 * }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 57 * @endcode
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 58 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 59
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 60 template <typename T>
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 61 class MyBuffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 62 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 63 private:
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 64 T *_buf;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 65 volatile uint32_t _wloc;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 66 volatile uint32_t _rloc;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 67 uint32_t _size;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 68
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 69 public:
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 70 /** Create a Buffer and allocate memory for it
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 71 * @param size The size of the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 72 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 73 MyBuffer(uint32_t size = 0x100);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 74
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 75 /** Get the size of the ring buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 76 * @return the size of the ring buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 77 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 78 uint32_t getSize();
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 79
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 80 /** Destry a Buffer and release it's allocated memory
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 81 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 82 ~MyBuffer();
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 83
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 84 /** Add a data element into the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 85 * @param data Something to add to the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 86 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 87 void put(T data);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 88
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 89 /** Remove a data element from the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 90 * @return Pull the oldest element from the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 91 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 92 T get(void);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 93
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 94 /** Get the address to the head of the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 95 * @return The address of element 0 in the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 96 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 97 T *head(void);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 98
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 99 /** Reset the buffer to 0. Useful if using head() to parse packeted data
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 100 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 101 void clear(void);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 102
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 103 /** Determine if anything is readable in the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 104 * @return 1 if something can be read, 0 otherwise
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 105 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 106 uint32_t available(void);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 107
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 108 /** Overloaded operator for writing to the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 109 * @param data Something to put in the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 110 * @return
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 111 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 112 MyBuffer &operator= (T data)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 113 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 114 put(data);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 115 return *this;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 116 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 117
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 118 /** Overloaded operator for reading from the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 119 * @return Pull the oldest element from the buffer
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 120 */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 121 operator int(void)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 122 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 123 return get();
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 124 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 125
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 126 uint32_t peek(char c);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 127
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 128 };
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 129
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 130 template <class T>
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 131 inline void MyBuffer<T>::put(T data)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 132 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 133 _buf[_wloc++] = data;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 134 _wloc %= (_size-1);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 135
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 136 return;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 137 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 138
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 139 template <class T>
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 140 inline T MyBuffer<T>::get(void)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 141 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 142 T data_pos = _buf[_rloc++];
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 143 _rloc %= (_size-1);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 144
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 145 return data_pos;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 146 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 147
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 148 template <class T>
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 149 inline T *MyBuffer<T>::head(void)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 150 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 151 T *data_pos = &_buf[0];
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 152
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 153 return data_pos;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 154 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 155
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 156 template <class T>
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 157 inline uint32_t MyBuffer<T>::available(void)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 158 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 159 return (_wloc == _rloc) ? 0 : 1;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 160 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 161
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 162 #endif
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 163