00001 00010 #include <stdint.h> 00011 #include "message_queue.h" 00012 #include "config_message_queue_impl.h" 00013 00015 typedef struct S_messageQueue_GlobalData { 00016 messageQueue_QueuedMessage queue[messageQueue_Size]; 00017 messageQueue_SizeType begin; 00018 messageQueue_SizeType end; 00019 } messageQueue_GlobalData; 00020 00022 static volatile messageQueue_GlobalData m_data; 00023 00029 static inline messageQueue_SizeType messageQueue_next(messageQueue_SizeType value) { 00030 value++; 00031 if(value >= messageQueue_Size) { 00032 /* messageQueue is used circular */ 00033 value= 0; 00034 } 00035 return value; 00036 } 00037 00041 void messageQueue_init(void) { 00042 m_data.begin= 0; 00043 m_data.end= 0; 00044 } 00045 00049 void messageQueue_cleanup(void) 00050 {} 00051 00056 Boolean messageQueue_isEmpty(void) { 00057 return boolean(m_data.begin == m_data.end); 00058 } 00059 00064 Boolean messageQueue_isFull(void) { 00065 return boolean(messageQueue_next(m_data.end) == m_data.begin); 00066 } 00067 00074 Boolean messageQueue_read(messageQueue_QueuedMessage* pMessage) { 00075 Boolean success= !messageQueue_isEmpty(); 00076 if(success) { 00077 *pMessage= m_data.queue[m_data.begin]; 00078 m_data.begin= messageQueue_next(m_data.begin); 00079 } 00080 return success; 00081 } 00082 00088 Boolean messageQueue_write(messageQueue_QueuedMessage message) { 00089 Boolean success= !messageQueue_isFull(); 00090 if(success) { 00091 m_data.queue[m_data.end]= message; 00092 m_data.end= messageQueue_next(m_data.end); 00093 } 00094 return success; 00095 }