CAN Queue mechanism permitting creation and management of CAN messages through a queueing
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Wed Jul 13 2022 01:23:29 by 1.7.2