/* --------------------------------------------------------------------------- * MessageQueue.c - v0.1 (c) 2008 Micro-key bv * --------------------------------------------------------------------------- * Micro-key bv * Industrieweg 28, 9804 TG Noordhorn * Postbus 92, 9800 AB Zuidhorn * The Netherlands * Tel: +31 594 503020 * Fax: +31 594 505825 * Email: support@microkey.nl * Web: www.microkey.nl * --------------------------------------------------------------------------- * Description: * --------------------------------------------------------------------------- * Version(s): 0.1, Jan 29, 2008, FSc * Creation. * --------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------- * System include files * --------------------------------------------------------------------------- */ #include #include /* --------------------------------------------------------------------------- * Application include files * --------------------------------------------------------------------------- */ #include "MessageQueue.h" #include "FreeRTOS.h" #include "task.h" /* --------------------------------------------------------------------------- * Local constant and macro definitions * --------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------- * Global variable definitions * --------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------- * Local variable definitions * --------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------- * Local function definitions * --------------------------------------------------------------------------- */ t_mq_messagequeue *mqInit() { t_mq_messagequeue *newMessageQueue = (t_mq_messagequeue *)pvPortMalloc( sizeof(t_mq_messagequeue) ); newMessageQueue->count = 0; newMessageQueue->head = 0; newMessageQueue->tail = 0; return newMessageQueue; } RESULT mqAdd( t_mq_messagequeue *queue, t_bpmsg_message *message) { RESULT result = OK; taskENTER_CRITICAL(); { if(queue->count >= TX_QUEUE_SIZE) { result = ERROR; } else { memcpy( &(queue->messages[queue->tail]), message, sizeof(t_bpmsg_message) ); queue->count++; queue->tail = (queue->tail + 1) % TX_QUEUE_SIZE; } } taskEXIT_CRITICAL(); return result; } RESULT mqGet( t_mq_messagequeue *queue, t_bpmsg_message *message) { RESULT result = OK; taskENTER_CRITICAL(); { if(queue->count > 0) { memcpy( message, &(queue->messages[queue->head]), sizeof(t_bpmsg_message) ); queue->head = (queue->head + 1) % TX_QUEUE_SIZE; queue->count--; } else { result = ERROR; } } taskEXIT_CRITICAL(); return result; } BOOLEAN mqEmpty( t_mq_messagequeue *queue ) { UINT8 count; taskENTER_CRITICAL(); { count = queue->count; } taskEXIT_CRITICAL(); return ( count == 0 ? TRUE : FALSE); }