BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:55:34 2018 +0000
Revision:
2:798925c9e4a8
Parent:
1:9c5af431a1f1
bluetooth

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gustavatmel 1:9c5af431a1f1 1 /* mbed USBHost Library
gustavatmel 1:9c5af431a1f1 2 * Copyright (c) 2006-2013 ARM Limited
gustavatmel 1:9c5af431a1f1 3 *
gustavatmel 1:9c5af431a1f1 4 * Licensed under the Apache License, Version 2.0 (the "License");
gustavatmel 1:9c5af431a1f1 5 * you may not use this file except in compliance with the License.
gustavatmel 1:9c5af431a1f1 6 * You may obtain a copy of the License at
gustavatmel 1:9c5af431a1f1 7 *
gustavatmel 1:9c5af431a1f1 8 * http://www.apache.org/licenses/LICENSE-2.0
gustavatmel 1:9c5af431a1f1 9 *
gustavatmel 1:9c5af431a1f1 10 * Unless required by applicable law or agreed to in writing, software
gustavatmel 1:9c5af431a1f1 11 * distributed under the License is distributed on an "AS IS" BASIS,
gustavatmel 1:9c5af431a1f1 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
gustavatmel 1:9c5af431a1f1 13 * See the License for the specific language governing permissions and
gustavatmel 1:9c5af431a1f1 14 * limitations under the License.
gustavatmel 1:9c5af431a1f1 15 */
gustavatmel 1:9c5af431a1f1 16
gustavatmel 1:9c5af431a1f1 17 #ifndef MTXCIRCBUFFER_H
gustavatmel 1:9c5af431a1f1 18 #define MTXCIRCBUFFER_H
gustavatmel 1:9c5af431a1f1 19
gustavatmel 1:9c5af431a1f1 20 #include "stdint.h"
gustavatmel 1:9c5af431a1f1 21 #include "rtos.h"
gustavatmel 1:9c5af431a1f1 22
gustavatmel 1:9c5af431a1f1 23 //Mutex protected circular buffer
gustavatmel 1:9c5af431a1f1 24 template<typename T, int size>
gustavatmel 1:9c5af431a1f1 25 class MtxCircBuffer {
gustavatmel 1:9c5af431a1f1 26 public:
gustavatmel 1:9c5af431a1f1 27
gustavatmel 1:9c5af431a1f1 28 MtxCircBuffer() {
gustavatmel 1:9c5af431a1f1 29 write = 0;
gustavatmel 1:9c5af431a1f1 30 read = 0;
gustavatmel 1:9c5af431a1f1 31 }
gustavatmel 1:9c5af431a1f1 32
gustavatmel 1:9c5af431a1f1 33 bool isFull() {
gustavatmel 1:9c5af431a1f1 34 mtx.lock();
gustavatmel 1:9c5af431a1f1 35 bool r = (((write + 1) % size) == read);
gustavatmel 1:9c5af431a1f1 36 mtx.unlock();
gustavatmel 1:9c5af431a1f1 37 return r;
gustavatmel 1:9c5af431a1f1 38 }
gustavatmel 1:9c5af431a1f1 39
gustavatmel 1:9c5af431a1f1 40 bool isEmpty() {
gustavatmel 1:9c5af431a1f1 41 mtx.lock();
gustavatmel 1:9c5af431a1f1 42 bool r = (read == write);
gustavatmel 1:9c5af431a1f1 43 mtx.unlock();
gustavatmel 1:9c5af431a1f1 44 return r;
gustavatmel 1:9c5af431a1f1 45 }
gustavatmel 1:9c5af431a1f1 46
gustavatmel 1:9c5af431a1f1 47 void flush() {
gustavatmel 1:9c5af431a1f1 48 write = 0;
gustavatmel 1:9c5af431a1f1 49 read = 0;
gustavatmel 1:9c5af431a1f1 50 }
gustavatmel 1:9c5af431a1f1 51
gustavatmel 1:9c5af431a1f1 52 void queue(T k) {
gustavatmel 1:9c5af431a1f1 53 mtx.lock();
gustavatmel 1:9c5af431a1f1 54 while (((write + 1) % size) == read) {
gustavatmel 1:9c5af431a1f1 55 mtx.unlock();
gustavatmel 1:9c5af431a1f1 56 Thread::wait(10);
gustavatmel 1:9c5af431a1f1 57 mtx.lock();
gustavatmel 1:9c5af431a1f1 58 }
gustavatmel 1:9c5af431a1f1 59 buf[write++] = k;
gustavatmel 1:9c5af431a1f1 60 write %= size;
gustavatmel 1:9c5af431a1f1 61 mtx.unlock();
gustavatmel 1:9c5af431a1f1 62 }
gustavatmel 1:9c5af431a1f1 63
gustavatmel 1:9c5af431a1f1 64 uint16_t available() {
gustavatmel 1:9c5af431a1f1 65 mtx.lock();
gustavatmel 1:9c5af431a1f1 66 uint16_t a = (write >= read) ? (write - read) : (size - read + write);
gustavatmel 1:9c5af431a1f1 67 mtx.unlock();
gustavatmel 1:9c5af431a1f1 68 return a;
gustavatmel 1:9c5af431a1f1 69 }
gustavatmel 1:9c5af431a1f1 70
gustavatmel 1:9c5af431a1f1 71 bool dequeue(T * c) {
gustavatmel 1:9c5af431a1f1 72 mtx.lock();
gustavatmel 1:9c5af431a1f1 73 bool empty = (read == write);
gustavatmel 1:9c5af431a1f1 74 if (!empty) {
gustavatmel 1:9c5af431a1f1 75 *c = buf[read++];
gustavatmel 1:9c5af431a1f1 76 read %= size;
gustavatmel 1:9c5af431a1f1 77 }
gustavatmel 1:9c5af431a1f1 78 mtx.unlock();
gustavatmel 1:9c5af431a1f1 79 return (!empty);
gustavatmel 1:9c5af431a1f1 80 }
gustavatmel 1:9c5af431a1f1 81
gustavatmel 1:9c5af431a1f1 82 private:
gustavatmel 1:9c5af431a1f1 83 volatile uint16_t write;
gustavatmel 1:9c5af431a1f1 84 volatile uint16_t read;
gustavatmel 1:9c5af431a1f1 85 volatile T buf[size];
gustavatmel 1:9c5af431a1f1 86 Mutex mtx;
gustavatmel 1:9c5af431a1f1 87 };
gustavatmel 1:9c5af431a1f1 88
gustavatmel 1:9c5af431a1f1 89 #endif