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
MessageQueue.h@0:faed68cc9fff, 2015-01-19 (annotated)
- 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?
User | Revision | Line number | New 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 |