Message queue to synchronize and share information between threads. It is a template class, so it can hold elements of different types.

Dependents:   Nucleo_modbus_protocol_test F103RB_tcp_rtu_modbus_copy_v1_0

Committer:
gabrielrivas
Date:
Mon Jan 19 03:26:04 2015 +0000
Revision:
0:faed68cc9fff
Child:
1:c5b6cfae502d
Message queue  to synchronize and share information between threads.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gabrielrivas 0:faed68cc9fff 1 #ifndef _MESSAGE_QUEUE_H_
gabrielrivas 0:faed68cc9fff 2 #define _MESSAGE_QUEUE_H_
gabrielrivas 0:faed68cc9fff 3
gabrielrivas 0:faed68cc9fff 4 #include "mbed.h"
gabrielrivas 0:faed68cc9fff 5 #include "rtos.h"
gabrielrivas 0:faed68cc9fff 6 #include <queue>
gabrielrivas 0:faed68cc9fff 7
gabrielrivas 0:faed68cc9fff 8 #define MESSAGE_QUEUE_MAX_SIZE (256)
gabrielrivas 0:faed68cc9fff 9
gabrielrivas 0:faed68cc9fff 10 template <class T>
gabrielrivas 0:faed68cc9fff 11 class MessageQueue
gabrielrivas 0:faed68cc9fff 12 {
gabrielrivas 0:faed68cc9fff 13 public:
gabrielrivas 0:faed68cc9fff 14 MessageQueue(uint32_t size);
gabrielrivas 0:faed68cc9fff 15
gabrielrivas 0:faed68cc9fff 16 public:
gabrielrivas 0:faed68cc9fff 17 void write(T data);
gabrielrivas 0:faed68cc9fff 18 T read();
gabrielrivas 0:faed68cc9fff 19 bool isFull();
gabrielrivas 0:faed68cc9fff 20 bool isEmpty();
gabrielrivas 0:faed68cc9fff 21 uint32_t getWriteIndex();
gabrielrivas 0:faed68cc9fff 22 uint32_t getReadIndex();
gabrielrivas 0:faed68cc9fff 23 void reset();
gabrielrivas 0:faed68cc9fff 24
gabrielrivas 0:faed68cc9fff 25 private:
gabrielrivas 0:faed68cc9fff 26 std::queue<T> m_queue;
gabrielrivas 0:faed68cc9fff 27 Mutex m_mutex;
gabrielrivas 0:faed68cc9fff 28 uint32_t m_size;
gabrielrivas 0:faed68cc9fff 29 bool m_full;
gabrielrivas 0:faed68cc9fff 30 bool m_empty;
gabrielrivas 0:faed68cc9fff 31 uint32_t m_readIndex;
gabrielrivas 0:faed68cc9fff 32 uint32_t m_writeIndex;
gabrielrivas 0:faed68cc9fff 33
gabrielrivas 0:faed68cc9fff 34 };
gabrielrivas 0:faed68cc9fff 35
gabrielrivas 0:faed68cc9fff 36
gabrielrivas 0:faed68cc9fff 37 template <class T>
gabrielrivas 0:faed68cc9fff 38 MessageQueue<T>::MessageQueue(uint32_t size)
gabrielrivas 0:faed68cc9fff 39 {
gabrielrivas 0:faed68cc9fff 40 // assert(size < MESSAGE_QUEUE_MAX_SIZE);
gabrielrivas 0:faed68cc9fff 41 m_size = size;
gabrielrivas 0:faed68cc9fff 42 m_full = false;
gabrielrivas 0:faed68cc9fff 43 m_empty = true;
gabrielrivas 0:faed68cc9fff 44 m_readIndex = 0;
gabrielrivas 0:faed68cc9fff 45 m_writeIndex = 0;
gabrielrivas 0:faed68cc9fff 46 }
gabrielrivas 0:faed68cc9fff 47
gabrielrivas 0:faed68cc9fff 48 template <class T>
gabrielrivas 0:faed68cc9fff 49 void MessageQueue<T>::write(T data)
gabrielrivas 0:faed68cc9fff 50 {
gabrielrivas 0:faed68cc9fff 51 m_mutex.lock();
gabrielrivas 0:faed68cc9fff 52
gabrielrivas 0:faed68cc9fff 53 if (m_writeIndex == m_size) {
gabrielrivas 0:faed68cc9fff 54 m_full = true;
gabrielrivas 0:faed68cc9fff 55 } else {
gabrielrivas 0:faed68cc9fff 56 m_queue.push(data);
gabrielrivas 0:faed68cc9fff 57 m_empty = false;
gabrielrivas 0:faed68cc9fff 58 m_writeIndex++;
gabrielrivas 0:faed68cc9fff 59 }
gabrielrivas 0:faed68cc9fff 60 m_mutex.unlock();
gabrielrivas 0:faed68cc9fff 61 }
gabrielrivas 0:faed68cc9fff 62
gabrielrivas 0:faed68cc9fff 63 template <class T>
gabrielrivas 0:faed68cc9fff 64 T MessageQueue<T>::read()
gabrielrivas 0:faed68cc9fff 65 {
gabrielrivas 0:faed68cc9fff 66 T data;
gabrielrivas 0:faed68cc9fff 67
gabrielrivas 0:faed68cc9fff 68 m_mutex.lock();
gabrielrivas 0:faed68cc9fff 69
gabrielrivas 0:faed68cc9fff 70 if (m_readIndex == m_writeIndex) {
gabrielrivas 0:faed68cc9fff 71 m_empty = true;
gabrielrivas 0:faed68cc9fff 72 } else {
gabrielrivas 0:faed68cc9fff 73 data = m_queue.front();
gabrielrivas 0:faed68cc9fff 74 m_full = false;
gabrielrivas 0:faed68cc9fff 75 m_queue.pop();
gabrielrivas 0:faed68cc9fff 76 m_readIndex++;
gabrielrivas 0:faed68cc9fff 77 }
gabrielrivas 0:faed68cc9fff 78
gabrielrivas 0:faed68cc9fff 79 m_mutex.unlock();
gabrielrivas 0:faed68cc9fff 80
gabrielrivas 0:faed68cc9fff 81 return data;
gabrielrivas 0:faed68cc9fff 82 }
gabrielrivas 0:faed68cc9fff 83
gabrielrivas 0:faed68cc9fff 84 template <class T>
gabrielrivas 0:faed68cc9fff 85 bool MessageQueue<T>::isFull()
gabrielrivas 0:faed68cc9fff 86 {
gabrielrivas 0:faed68cc9fff 87 return m_full;
gabrielrivas 0:faed68cc9fff 88 }
gabrielrivas 0:faed68cc9fff 89
gabrielrivas 0:faed68cc9fff 90 template <class T>
gabrielrivas 0:faed68cc9fff 91 bool MessageQueue<T>::isEmpty()
gabrielrivas 0:faed68cc9fff 92 {
gabrielrivas 0:faed68cc9fff 93 return m_empty;
gabrielrivas 0:faed68cc9fff 94 }
gabrielrivas 0:faed68cc9fff 95
gabrielrivas 0:faed68cc9fff 96 template <class T>
gabrielrivas 0:faed68cc9fff 97 uint32_t MessageQueue<T>::getWriteIndex()
gabrielrivas 0:faed68cc9fff 98 {
gabrielrivas 0:faed68cc9fff 99 return m_writeIndex;
gabrielrivas 0:faed68cc9fff 100 }
gabrielrivas 0:faed68cc9fff 101
gabrielrivas 0:faed68cc9fff 102 template <class T>
gabrielrivas 0:faed68cc9fff 103 uint32_t MessageQueue<T>::getReadIndex()
gabrielrivas 0:faed68cc9fff 104 {
gabrielrivas 0:faed68cc9fff 105 return m_readIndex;
gabrielrivas 0:faed68cc9fff 106 }
gabrielrivas 0:faed68cc9fff 107
gabrielrivas 0:faed68cc9fff 108 template <class T>
gabrielrivas 0:faed68cc9fff 109 void MessageQueue<T>::reset()
gabrielrivas 0:faed68cc9fff 110 {
gabrielrivas 0:faed68cc9fff 111 m_mutex.lock();
gabrielrivas 0:faed68cc9fff 112
gabrielrivas 0:faed68cc9fff 113 while(!isEmpty()) read();
gabrielrivas 0:faed68cc9fff 114 m_full = false;
gabrielrivas 0:faed68cc9fff 115 m_empty = true;
gabrielrivas 0:faed68cc9fff 116 m_readIndex = 0;
gabrielrivas 0:faed68cc9fff 117 m_writeIndex = 0;
gabrielrivas 0:faed68cc9fff 118
gabrielrivas 0:faed68cc9fff 119 m_mutex.unlock();
gabrielrivas 0:faed68cc9fff 120 }
gabrielrivas 0:faed68cc9fff 121
gabrielrivas 0:faed68cc9fff 122 #endif