|
14 | 14 | #include <FreeRTOS.h>
|
15 | 15 | #include <semphr.h>
|
16 | 16 |
|
| 17 | +#include <stdlib.h> |
| 18 | +#include <string.h> |
| 19 | + |
17 | 20 | #include "msp430_uart.h"
|
18 | 21 |
|
19 | 22 | bool P4_6_LED_ON = false;
|
20 | 23 |
|
| 24 | +typedef struct cmdQueueNode |
| 25 | +{ |
| 26 | + struct cmdQueueNode* next; |
| 27 | + unsigned char cmd[2]; |
| 28 | + unsigned char* param; |
| 29 | +} cmdQueueNode; |
| 30 | + |
| 31 | +typedef struct cmdQueue |
| 32 | +{ |
| 33 | + cmdQueueNode* head; |
| 34 | + cmdQueueNode* tail; |
| 35 | + uint8_t size; |
| 36 | +} cmdQueue; |
| 37 | + |
| 38 | +void cmdQueueNodeFree( cmdQueueNode* node ); |
| 39 | +void cmdQueueInit( cmdQueue* queue ); |
| 40 | +void cmdQueueEnqueue( cmdQueue* queue, cmdQueueNode* node ); |
| 41 | +cmdQueueNode* cmdQueueDequeue( cmdQueue* queue ); |
| 42 | +void cmdQueueAddCmd( cmdQueue* queue, unsigned char cmd[], unsigned char param[], uint8_t paramSize ); |
| 43 | +void cmdQueuePopCmd( cmdQueue* queue ); |
| 44 | + |
21 | 45 | void hal_startup( void )
|
22 | 46 | {
|
23 | 47 | // Write your initialisation code, but DO NOT CALL REQUIRED INTERFACES
|
@@ -50,3 +74,76 @@ void hal_PI_set_led( const asn1SccT_Boolean *IN_val )
|
50 | 74 | }
|
51 | 75 | P4_6_LED_ON = *IN_val;
|
52 | 76 | }
|
| 77 | + |
| 78 | +void cmdQueueNodeFree( cmdQueueNode* node ) |
| 79 | +{ |
| 80 | + free(node->param); |
| 81 | + free(node); |
| 82 | +} |
| 83 | + |
| 84 | +void cmdQueueInit( cmdQueue* q ) |
| 85 | +{ |
| 86 | + q->head = NULL; |
| 87 | + q->tail = NULL; |
| 88 | + q->size = 0; |
| 89 | +} |
| 90 | + |
| 91 | +void cmdQueueEnqueue( cmdQueue* queue, cmdQueueNode* node ) |
| 92 | +{ |
| 93 | + node->next = NULL; |
| 94 | + if (queue->tail == NULL) |
| 95 | + { |
| 96 | + queue->head = node; |
| 97 | + } |
| 98 | + else |
| 99 | + { |
| 100 | + queue->tail->next = node; |
| 101 | + } |
| 102 | + queue->tail = node; |
| 103 | + queue->size++; |
| 104 | +} |
| 105 | + |
| 106 | +cmdQueueNode* cmdQueueDequeue( cmdQueue* queue ) |
| 107 | +{ |
| 108 | + if (queue->head == NULL) // underflow |
| 109 | + { |
| 110 | + return NULL; |
| 111 | + } |
| 112 | + cmdQueueNode* node = queue->head; |
| 113 | + queue->head = queue->head->next; |
| 114 | + if (queue->head == NULL) |
| 115 | + { |
| 116 | + queue->tail = NULL; |
| 117 | + } |
| 118 | + queue->size--; |
| 119 | + |
| 120 | + return node; |
| 121 | +} |
| 122 | + |
| 123 | +void cmdQueueAddCmd( cmdQueue* queue, unsigned char cmd[], unsigned char param[], uint8_t paramSize ) |
| 124 | +{ |
| 125 | + cmdQueueNode* newNode = (cmdQueueNode*)malloc(sizeof(cmdQueueNode)); |
| 126 | + if (newNode != NULL) |
| 127 | + { |
| 128 | + unsigned char* paramField = (unsigned char*)malloc(sizeof(unsigned char*)*paramSize); |
| 129 | + if (paramField == NULL) // not enought memory for newNode |
| 130 | + { |
| 131 | + free(newNode); |
| 132 | + } |
| 133 | + else |
| 134 | + { |
| 135 | + memcpy(newNode->cmd, cmd, 2); |
| 136 | + memcpy(newNode->param, param, paramSize); |
| 137 | + cmdQueueEnqueue(queue, newNode); |
| 138 | + } |
| 139 | + } |
| 140 | +} |
| 141 | + |
| 142 | +void cmdQueuePopCmd( cmdQueue* queue ) |
| 143 | +{ |
| 144 | + cmdQueueNode* popedNode = cmdQueueDequeue(queue); |
| 145 | + if (popedNode != NULL) |
| 146 | + { |
| 147 | + cmdQueueNodeFree(popedNode); |
| 148 | + } |
| 149 | +} |
0 commit comments