Robot Agent  1.0
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
queue.c
Go to the documentation of this file.
1 
11 /* -- Includes -- */
12 /* system libraries */
13 #include <stdio.h>
14 #include <stdlib.h>
15 /* project libraries */
16 #include "queue.h"
17 #include "def.h"
18 #include "robot.h"
19 #include "pheromone.h"
20 
21 /* -- Defines -- */
22 
23 /* -- Functions -- */
24 
30 {
31  // Allocate memory for Queue structure
32  queue_t *qs = (queue_t *) malloc(sizeof(queue_t));
33 
34  // Init queue
35  qs->head = NULL;
36  qs->tail = NULL;
37  qs->count = 0;
38 
39  return qs;
40 }
41 
48 {
49  // Empty the queue
50  queue_empty(qs);
51  // Free memory
52  free(qs);
53 }
54 
62 void queue_enqueue(queue_t *qs, void *data, int data_type)
63 {
64  // Allocate memory for queue node structure
65  queue_node_t *node = (queue_node_t *) malloc(sizeof(queue_node_t));
66 
67  // Increase count of nodes in the queue
68  qs->count++;
69 
70  // Check if somebody is in the queue
71  if(qs->head == NULL)
72  {
73  // If queue is empty, place node as head and tail
74  qs->head = node;
75  qs->tail = node;
76  }
77  else
78  {
79  // If there is, then inform tail node about new node behind it.
80  qs->tail->next = node;
81  // And make new node as the tail
82  qs->tail = node;
83  }
84 
85 
86  // Init pointer to next
87  node->next = NULL;
88  // Save data type in node
89  node->data_type = data_type;
90 
91  // Allocate memory for data structure and copy data
92  switch(data_type)
93  {
94  // Robot pose
96  node->data = (void *)malloc(sizeof(robot_t));
97  *(robot_t *)node->data = *(robot_t *)data;
98  break;
99  // Victim information
101  node->data = (void *)malloc(sizeof(victim_t));
102  *(victim_t *)node->data = *(victim_t *)data;
103  break;
104  // Pheromone map
106  node->data = (void *)malloc(sizeof(pheromone_map_sector_t));
108  break;
109  // Command
111  node->data = (void *)malloc(sizeof(command_t));
112  *(command_t *)node->data = *(command_t *)data;
113  break;
115  node->data = (void *)malloc(sizeof(stream_t));
116  *(stream_t *)node->data = *(stream_t *)data;
117  // Other
118  default :
119  // Do nothing
120  break;
121  }
122 
123 }
124 
132 void queue_dequeue(queue_t *qs, void *data, int *data_type)
133 {
134  // If queue is not empty, take out node and let next be the head
135  if(qs->head != NULL)
136  {
137  // Save pointer to head node for later to be able to free the memory
138  queue_node_t *temp_head_node = qs->head;
139 
140  // Decrease count of nodes in the queue
141  qs->count--;
142 
143  // Save data type
144  *data_type = qs->head->data_type;
145  // Save data according to the data type
146  switch(*data_type)
147  {
148  // Robot pose
150  *(robot_t *)data = *(robot_t *)qs->head->data;
151  break;
152  // Victim information
154  *(victim_t *)data = *(victim_t *)qs->head->data;
155  break;
156  // Pheromone map
159  break;
160  // Command
162  *(command_t *)data = *(command_t *)qs->head->data;
163  break;
165  *(stream_t *)data = *(stream_t *)qs->head->data;
166  break;
167  // Other
168  default :
169  // Do nothing
170  break;
171  }
172 
173  // Make next node to be the head
174  qs->head = qs->head->next;
175 
176  // Free memory (data)
177  free(temp_head_node->data);
178  // Free memory (node)
179  free(temp_head_node);
180  }
181  else
182  {
183  // Otherwise tail empty
184  qs->tail = NULL;
185  }
186 }
187 
194 {
195  // Temporary pointer to head node
196  queue_node_t *temp_head_node;
197 
198  // Take nodes out untill queue is empty
199  while(qs->head != NULL)
200  {
201  // Save pointer to head node for later to be able to free the memory
202  temp_head_node = qs->head;
203  // Make next node to be the head
204  qs->head = qs->head->next;
205  // Free memory (data)
206  free(temp_head_node->data);
207  // Free memory (node)
208  free(temp_head_node);
209  }
210 
211  // Set number of nodes in the queue to zero
212  qs->count = 0;
213 
214  // Deinit tail
215  qs->tail = NULL;
216 }
#define s_DATA_STRUCT_TYPE_ROBOT
Definition: def.h:68
queue_node_t * tail
Definition: queue.h:37
queue_node_t * head
Definition: queue.h:36
Stream structure.
Definition: def.h:48
void queue_enqueue(queue_t *qs, void *data, int data_type)
Definition: queue.c:62
int count
Definition: queue.h:39
queue_t * queue_init(void)
Definition: queue.c:29
Victim structure.
Definition: def.h:28
Command structure.
Definition: def.h:39
void queue_destroy(queue_t *qs)
Definition: queue.c:47
#define s_DATA_STRUCT_TYPE_PHEROMONE
Definition: def.h:70
Robot structure.
Definition: robot.h:25
#define s_DATA_STRUCT_TYPE_STREAM
Definition: def.h:72
void queue_empty(queue_t *qs)
Definition: queue.c:193
Queue structure.
Definition: queue.h:34
struct s_QUEUE_NODE_STRUCT * next
Definition: queue.h:27
Queue node structure.
Definition: queue.h:23
#define s_DATA_STRUCT_TYPE_CMD
Definition: def.h:71
void queue_dequeue(queue_t *qs, void *data, int *data_type)
Definition: queue.c:132
#define s_DATA_STRUCT_TYPE_VICTIM
Definition: def.h:69
Pheromone Map Sector structure.
Definition: pheromone.h:58