Project 1 - Implement a fully functional Queue in C language using Linked lists
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
// Define structure for sensor data
typedef struct {
char sensor_type[20];
float sensor_data;
} SensorData;
// Define queue structure
typedef struct {
SensorData *data;
int size;
int capacity;
int front;
int rear;
pthread_mutex_t lock;
pthread_cond_t not_empty;
pthread_cond_t not_full;
} Queue;
// Initialize queue
Queue* initQueue(int capacity) {
Queue* queue = (Queue*)malloc(sizeof(Queue));
queue->data = (SensorData*)malloc(capacity * sizeof(SensorData));
queue->size = 0;
queue->capacity = capacity;
queue->front = 0;
queue->rear = -1;
pthread_mutex_init(&queue->lock, NULL);
pthread_cond_init(&queue->not_empty, NULL);
pthread_cond_init(&queue->not_full, NULL);
return queue;
}
// Enqueue data
void enqueue(Queue* queue, SensorData data) {
pthread_mutex_lock(&queue->lock);
while (queue->size == queue->capacity) {
pthread_cond_wait(&queue->not_full, &queue->lock);
}
queue->rear = (queue->rear + 1) % queue->capacity;
queue->data[queue->rear] = data;
queue->size++;
pthread_cond_signal(&queue->not_empty);
pthread_mutex_unlock(&queue->lock);
}
// Dequeue data
SensorData dequeue(Queue* queue) {
pthread_mutex_lock(&queue->lock);
while (queue->size == 0) {
pthread_cond_wait(&queue->not_empty, &queue->lock);
}
SensorData data = queue->data[queue->front];
queue->front = (queue->front + 1) % queue->capacity;
queue->size--;
pthread_cond_signal(&queue->not_full);
pthread_mutex_unlock(&queue->lock);
return data;
}
// IMU thread function
void* imuThread(void* arg) {
Queue* accelerometerQueue = (Queue*)arg;
while (1) {
// Simulate reading data from accelerometer
SensorData accelerometerData;
accelerometerData.sensor_data = 1.23; // Sample data
snprintf(accelerometerData.sensor_type, sizeof(accelerometerData.sensor_type), "Accelerometer");
enqueue(accelerometerQueue, accelerometerData);
sleep(1); // Simulate sampling interval
}
return NULL;
}
// UART thread function
void* uartThread(void* arg) {
Queue* queue = (Queue*)arg;
while (1) {
SensorData data = dequeue(queue);
printf("Sending %s data: %f\n", data.sensor_type, data.sensor_data);
// Send data via UART
// Example: uart_send(data);
sleep(1); // Simulate UART transmission time
}
return NULL;
}
int main() {
// Create queues
Queue* accelerometerQueue = initQueue(10);
Queue* gyroscopeQueue = initQueue(10);
// Create IMU thread
pthread_t imu_tid;
pthread_create(&imu_tid, NULL, imuThread, (void*)accelerometerQueue);
// Create UART threads
pthread_t uart1_tid, uart2_tid;
pthread_create(&uart1_tid, NULL, uartThread, (void*)accelerometerQueue);
pthread_create(&uart2_tid, NULL, uartThread, (void*)gyroscopeQueue);
// Join threads (not reached in this example)
pthread_join(imu_tid, NULL);
pthread_join(uart1_tid, NULL);
pthread_join(uart2_tid, NULL);
// Free queue memory
free(accelerometerQueue->data);
free(accelerometerQueue);
free(gyroscopeQueue->data);
free(gyroscopeQueue);
return 0;
}