Skip to content

Commit afc0870

Browse files
committed
Command queue API
Write C code in HAL: - handling the allocation and deallocation of nodes memory - add and pop command API ref #10
1 parent daefb66 commit afc0870

File tree

2 files changed

+100
-3
lines changed

2 files changed

+100
-3
lines changed

obc-firmware/interfaceview.ui.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
<UI version="1.0" ><Entity id="{4c76f858-03de-4264-8ff7-1b3a466f1eb8}"><Taste RootCoordinates="-64100 -31300 141600 72600" coordinates="6000 7000 111400 47800">
1+
<UI version="1.0" ><Entity id="{79126f59-8bdb-46a9-87c3-e562c108e91d}"><Taste coordinates="5400 -11300 46700 4300">
2+
</Taste>
3+
</Entity><Entity id="{4c76f858-03de-4264-8ff7-1b3a466f1eb8}"><Taste RootCoordinates="-64100 -31300 141600 72600" coordinates="6000 7000 111400 47800">
24
</Taste>
35
</Entity><Entity id="{972e8e24-275f-4a0e-b469-39f22bf2547f}"><Taste RootCoordinates="-62600 -26600 62600 26600" coordinates="-50800 52600 131900 67400">
46
</Taste>
57
</Entity><Entity id="{bb72fda3-b26b-440a-8320-300a1328ce27}"><Taste coordinates="-50800 57500">
68
</Taste>
79
</Entity><Entity id="{51d88f2f-533a-4b8b-bf54-9b00b639836e}"><Taste coordinates="-46500 52600">
810
</Taste>
9-
</Entity><Entity id="{79126f59-8bdb-46a9-87c3-e562c108e91d}"><Taste coordinates="5400 -11300 46700 4300">
10-
</Taste>
1111
</Entity>
1212
</UI>

obc-firmware/work/hal/implem/msp430/C/src/hal.c

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,34 @@
1414
#include <FreeRTOS.h>
1515
#include <semphr.h>
1616

17+
#include <stdlib.h>
18+
#include <string.h>
19+
1720
#include "msp430_uart.h"
1821

1922
bool P4_6_LED_ON = false;
2023

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+
2145
void hal_startup( void )
2246
{
2347
// Write your initialisation code, but DO NOT CALL REQUIRED INTERFACES
@@ -50,3 +74,76 @@ void hal_PI_set_led( const asn1SccT_Boolean *IN_val )
5074
}
5175
P4_6_LED_ON = *IN_val;
5276
}
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

Comments
 (0)