9 #define HAL_LOG_CHANNEL SCOM
10 #define HAL_LOG_SUBCHANNEL FRAME
17 #if !defined SCOM_FRAME_QUEUE_LOCK_TIMEOUT
18 #define SCOM_FRAME_QUEUE_LOCK_TIMEOUT 5000
30 frameQueue->
lock = OSMUTEX_Create();
31 if (frameQueue->
lock) {
32 if (frameQueue->
pool) {
34 for (i = 0; i < frameQueue->
size; i++) {
45 frameQueue->
head = NULL;
60 if ((frameQueue) && (frameQueue->
lock)) {
61 OSMUTEX_Destroy(frameQueue->
lock);
75 uint8_t framePriority;
77 if ((frameQueue) && (frame) && (frameQueue->
lock)) {
82 if (frameQueue->
head == NULL) {
84 frameQueue->
head = frame;
86 OSMUTEX_Give(frameQueue->
lock);
93 currentPosition = frameQueue->
head;
101 prevPosition->
next = frame;
103 frame->
next = currentPosition;
107 frameQueue->
head = frame;
109 frame->
next = currentPosition;
112 OSMUTEX_Give(frameQueue->
lock);
115 prevPosition = currentPosition;
116 currentPosition = currentPosition->
next;
118 }
while ((currentPosition) && (i));
123 prevPosition->
next = frame;
126 OSMUTEX_Give(frameQueue->
lock);
130 OSMUTEX_Give(frameQueue->
lock);
147 if ((frameQueue) && (frame) && (frameQueue->
lock) && (frameQueue->
head)) {
152 if (frameQueue->
head == frame){
157 OSMUTEX_Give(frameQueue->
lock);
161 currentPosition = frameQueue->
head;
162 i = frameQueue->
size;
165 if(currentPosition->
next == frame) {
166 currentPosition->
next = frame->
next;
169 OSMUTEX_Give(frameQueue->
lock);
172 currentPosition = currentPosition->
next;
175 OSMUTEX_Give(frameQueue->
lock);
189 if ((frameQueue) && (frame) && (frameQueue->
lock)) {
195 if(frameQueue->
head == NULL){
196 frameQueue->
head = frame;
197 OSMUTEX_Give(frameQueue->
lock);
201 while (currentPosition->
next != NULL) {
202 currentPosition = currentPosition->
next;
205 currentPosition->
next = frame;
207 OSMUTEX_Give(frameQueue->
lock);
212 OSMUTEX_Give(frameQueue->
lock);
228 result = frameQueue->
head;
229 OSMUTEX_Give(frameQueue->
lock);
243 if ((frameQueue) && (frameQueue->
lock)) {
247 if (frameQueue->
head) {
248 result = frameQueue->
head;
253 OSMUTEX_Give(frameQueue->
lock);
270 if ((frameQueue) && (frameQueue->
lock)) {
275 if (frameQueue->
pool) {
277 for(i = 0; i < frameQueue->
size; i++) {
280 result = &frameQueue->
pool[i];
287 #if !defined SCOM_DO_NOT_USE_HEAP
301 #endif // SCOM_DO_NOT_USE_HEAP
304 OSMUTEX_Give(frameQueue->
lock);
323 if (frameQueue->
pool) {
328 #if !defined SCOM_DO_NOT_USE_HEAP
330 HEAP_Free(frameQueueItem);
332 if (frameQueue->
size) {
352 if (frameQueue->
pool) {
354 for (i = 0; i < frameQueue->
size; i++) {
355 if (&(frameQueue->
pool[i].
frame) == frame) {
357 return &frameQueue->
pool[i];
375 size_t emptyFrameCounter = 0;
377 if ((frameQueue) && (frameQueue->
lock)) {
379 if (frameQueue->
pool) {
384 for(i = 0; i < frameQueue->
size; i++) {
391 OSMUTEX_Give(frameQueue->
lock);
399 return emptyFrameCounter;
SCOMFrameQueueItem * head
First item in the queue.
uint8_t sync
synchronization field: always 0xFF
SCOMFrameQueueItem * SCOMFrameQueue_PullOutFirstInQueue(SCOMFrameQueue *frameQueue)
size_t SCOMFrameQueue_GetFreeSpace(const SCOMFrameQueue *frameQueue)
Definition of a single SCOM frame queue item.
SCOMFrameQueueItem * SCOMFrameQueue_GetItemByFrame(const SCOMFrameQueue *frameQueue, const SCOMFrame *frame)
Definition of SCOM CRC functions.
size_t size
Pool size (number of managed items)
#define SCOM_SOF_CHARACTER
#define SCOM_FRAME_QUEUE_LOCK_TIMEOUT
Maximum time allowed to be spend waiting for access to the SCOM frame queue.
uint8_t size
frame type field
SCOMFrameQueueItem * next
Next item in the queue.
bool SCOMFrameQueue_Delete(SCOMFrameQueue *frameQueue, SCOMFrameQueueItem *frame)
struct SCOMFrameQueueItem SCOMFrameQueueItem
Type representing a SCOM frame queue item.
uint8_t ctrl
frame control field
SCOMFrameState state
SCOM frame state.
bool SCOMFrameQueue_Init(SCOMFrameQueue *frameQueue)
SCOMFrameQueueItem * SCOMFrameQueue_Lock(SCOMFrameQueue *frameQueue)
uint8_t SCOMFrame_GetPriority(const SCOMFrame *const frame)
bool SCOMFrameQueue_Append(SCOMFrameQueue *frameQueue, SCOMFrameQueueItem *frame)
OSMutex lock
Pool access mutex.
uint8_t sof
synchronization field: always 0xFF
SCOMFrameQueueItem *const pool
Frame pool items.
void SCOMFrameQueue_Unlock(SCOMFrameQueue *frameQueue, SCOMFrameQueueItem *frameQueueItem)
SCOMFrameQueueItem * SCOMFrameQueue_GetFirstInQueue(SCOMFrameQueue *frameQueue)
Definition of a SCOM frame queue.
SCOMFrame frame
SCOM frame.
bool SCOMFrameQueue_Insert(SCOMFrameQueue *frameQueue, SCOMFrameQueueItem *frame)
void SCOMFrameQueue_Deinit(SCOMFrameQueue *frameQueue)