CAN Queue mechanism permitting creation and management of CAN messages through a queueing

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CANQueue.cpp Source File

CANQueue.cpp

00001 /// @file CANQueue.h 
00002 /// The CAN Queue mechanism permits the creation and management of 
00003 /// messages through a CAN queue.
00004 ///
00005 /// @todo disable on the relevant interrupts, rather than all when protecting
00006 ///       the critical section.
00007 ///
00008 /// @note Copyright &copr; 2011 by Smartware Computing, all rights reserved.
00009 ///     Individuals may use this application for evaluation or non-commercial
00010 ///     purposes. Within this restriction, changes may be made to this application
00011 ///     as long as this copyright notice is retained. The user shall make
00012 ///     clear that their work is a derived work, and not the original.
00013 ///     Users of this application and sources accept this application "as is" and
00014 ///     shall hold harmless Smartware Computing, for any undesired results while
00015 ///     using this application - whether real or imagined.
00016 ///
00017 /// @author David Smart, Smartware Computing
00018 ///
00019 
00020 // These are needed by this file
00021 #include "CANQueue.h"
00022 //#include "CANUtilities.h"
00023 
00024 
00025 CANQueue::CANQueue(int Size)
00026 {
00027     queue = new CANmsg[Size];
00028     queueSize = Size;
00029     queueCount = 0;
00030     queueMaxCount = 0;
00031     enqueuePosition = 0;
00032     dequeuePosition = 0;
00033 }
00034 
00035 
00036 CANQueue::~CANQueue()
00037 {
00038     delete[] queue;
00039 }
00040 
00041 
00042 bool CANQueue::Enqueue(CANmsg msg)
00043 {
00044 #if 1
00045     return Enqueue(&msg);
00046 #else
00047     queue[enqueuePosition++] = msg;
00048     enqueuePosition = enqueuePosition % queueSize;
00049     queueCount++;
00050     if (queueCount > queueMaxCount) // track the max
00051         queueMaxCount = queueCount;
00052     if (queueCount > queueSize)     // just overwrote the oldest
00053     {
00054         dequeuePosition++;
00055         dequeuePosition = dequeuePosition % queueSize;
00056         queueCount = queueSize;
00057         return false;
00058     }
00059     return true;
00060 #endif
00061 }
00062 
00063 
00064 bool CANQueue::Enqueue(CANmsg *msg)
00065 {
00066     bool retval = true;
00067     
00068     __disable_irq();
00069     queue[enqueuePosition++] = *msg;
00070     enqueuePosition = enqueuePosition % queueSize;
00071     queueCount++;
00072     if (queueCount > queueMaxCount) // track the max
00073         queueMaxCount = queueCount;
00074     if (queueCount > queueSize)    // just overwrote the oldest
00075     {
00076         dequeuePosition++;
00077         dequeuePosition = dequeuePosition % queueSize;
00078         queueCount = queueSize;
00079         retval = false;
00080     }
00081     __enable_irq();
00082     return retval;
00083 }
00084 
00085 
00086 
00087 bool CANQueue::Dequeue(CANmsg *msg)
00088 {
00089     if (queueCount)
00090     {
00091         __disable_irq();
00092         *msg = queue[dequeuePosition++];
00093         dequeuePosition = dequeuePosition % queueSize;
00094         queueCount--;
00095         __enable_irq();
00096         return true;
00097     }
00098     return false;
00099 }