Challenge

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;

}

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.