From 03950616d35f87853d7145cae1b63b28bd5d460c Mon Sep 17 00:00:00 2001
From: "david.maul" <david.maul@informatik.hs-fulda.de>
Date: Thu, 13 Feb 2025 13:30:02 +0100
Subject: [PATCH] feat: push remaining changes to userspace components

---
 clients/cpu_temp/src/cpu_temp.c |  90 +++++++++--------
 common/include/data.h           |  24 +++++
 common/include/message.h        |  20 +++-
 common/src/message.c            |  58 +++++------
 daemon/include/send.h           |  10 +-
 daemon/src/main.c               | 170 ++++++++++++++++----------------
 daemon/src/send.c               |  20 ++--
 7 files changed, 209 insertions(+), 183 deletions(-)
 create mode 100644 common/include/data.h

diff --git a/clients/cpu_temp/src/cpu_temp.c b/clients/cpu_temp/src/cpu_temp.c
index 91d7bfe..bdb5bb9 100644
--- a/clients/cpu_temp/src/cpu_temp.c
+++ b/clients/cpu_temp/src/cpu_temp.c
@@ -1,59 +1,57 @@
+#include "../../../common/include/message.h"
+#include "../../../common/include/userspace_comm.h"
+#include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <sys/types.h>
+#include <string.h>
 #include <sys/stat.h>
-#include <fcntl.h>
+#include <sys/types.h>
 #include <unistd.h>
-#include <string.h>
-#include "../../../common/include/message.h"
-#include "../../../common/include/userspace_comm.h"
 
-int main(int argc, char* argv[]) {
-    if (argc < 3 || argc > 3) {
-        printf("Invalid arguments provided");
-        return EXIT_FAILURE;
+int main(int argc, char *argv[]) {
+  if (argc < 3 || argc > 3) {
+    printf("Invalid arguments provided");
+    return EXIT_FAILURE;
+  }
+
+  userspace_send_handle_t userspace_send_handle;
+  if (create_userspace_send_handle(&userspace_send_handle) == -1) {
+    perror("Failed to open message queue");
+    return EXIT_FAILURE;
+  }
+
+  int file_fd = open("/sys/class/thermal/thermal_zone0/temp", O_RDONLY);
+  if (file_fd == -1) {
+    perror("Failed to open file");
+    return EXIT_FAILURE;
+  }
+
+  double cpu_temp;
+  char buffer[6];
+
+  int sleep_ms = atoi(argv[2]);
+
+  while (1) {
+    if (pread(file_fd, buffer, sizeof(buffer), 0) == -1) {
+      perror("Failed to read file");
+      continue;
     }
 
-    userspace_send_handle_t userspace_send_handle;
-    if (create_userspace_send_handle(&userspace_send_handle) == -1) {
-        perror("Failed to open message queue");
-        return EXIT_FAILURE;
-    }
-
-    int file_fd = open("/sys/class/thermal/thermal_zone0/temp", O_RDONLY);
-    if (file_fd == -1) {
-        perror("Failed to open file");
-        return EXIT_FAILURE;
-    }
-
-    double cpu_temp;
-    char buffer[6];
-
-    int sleep_ms = atoi(argv[2]);
+    cpu_temp = (double)atoi(buffer) / 1000;
 
-    while (1) {
-        if (pread(file_fd, buffer, sizeof(buffer), 0) == -1) {
-            perror("Failed to read file");
-            continue;
-        }
+    message_t message = {
+        .measurement_id = atoi(argv[1]),
+        .datatype = FLOAT64,
+        .data.float64 = cpu_temp,
+    };
 
-        cpu_temp = (double)atoi(buffer) / 1000;
+    send_userspace_message(&userspace_send_handle, message);
 
-        message_t message = {
-            .measurement_id=atoi(argv[1]),
-            .datatype=FLOAT64,
-            .length=sizeof(cpu_temp)
-        };
-
-        memcpy(&message.data, &cpu_temp, sizeof(cpu_temp));
-
-        send_userspace_message(&userspace_send_handle, message);
-
-        usleep(sleep_ms * 1000);
-    }
+    usleep(sleep_ms * 1000);
+  }
 
-    destroy_userspace_send_handle(&userspace_send_handle);
-    close(file_fd);
+  destroy_userspace_send_handle(&userspace_send_handle);
+  close(file_fd);
 
-    return EXIT_SUCCESS;
+  return EXIT_SUCCESS;
 }
diff --git a/common/include/data.h b/common/include/data.h
new file mode 100644
index 0000000..628067d
--- /dev/null
+++ b/common/include/data.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "message.h"
+
+#if defined(__KERNEL__)
+#include <linux/types.h>
+typedef u8 uint8_t;
+typedef u16 uint16_t;
+typedef u32 uint32_t;
+typedef u64 uint64_t;
+typedef s8 int8_t;
+typedef s16 int16_t;
+typedef s32 int32_t;
+typedef s64 int64_t;
+#else
+#include <stddef.h>
+#include <stdint.h>
+#endif
+
+typedef struct data {
+  uint8_t sensor_id;
+  uint8_t count;
+  message_t *values;
+} data_t;
diff --git a/common/include/message.h b/common/include/message.h
index 4805aba..e1e7d26 100644
--- a/common/include/message.h
+++ b/common/include/message.h
@@ -15,8 +15,6 @@ typedef s64 int64_t;
 #include <stdint.h>
 #endif
 
-#define MAX_MESSAGE_DATA_SIZE 8
-
 enum message_data_type {
   INT8,
   UINT8,
@@ -31,6 +29,19 @@ enum message_data_type {
 };
 typedef uint32_t message_data_type_t;
 
+typedef union message_data {
+  int8_t int8;
+  uint8_t uint8;
+  int16_t int16;
+  uint16_t uint16;
+  int32_t int32;
+  uint32_t uint32;
+  int64_t int64;
+  uint64_t uint64;
+  float float32;
+  double float64;
+} message_data_t;
+
 /**
  * typedef message_t - Structure to hold a message with a measurement.
  * @measurement_id: The id of the measurement. Every sender should have a unique
@@ -43,10 +54,9 @@ typedef uint32_t message_data_type_t;
  * @data: The measurement data.
  */
 typedef struct message {
-  uint8_t measurement_id;
+  message_data_t data;
   message_data_type_t datatype;
-  uint16_t length;
-  uint8_t data[MAX_MESSAGE_DATA_SIZE];
+  uint8_t measurement_id;
 } message_t;
 
 /**
diff --git a/common/src/message.c b/common/src/message.c
index dd72492..51c8d94 100644
--- a/common/src/message.c
+++ b/common/src/message.c
@@ -1,38 +1,28 @@
 #include "../include/message.h"
 
 size_t message_data_type_size(message_data_type_t type) {
-    switch(type) {
-        case INT8:
-            return sizeof(int8_t);
-        case UINT8:
-            return sizeof(uint8_t);
-        case INT16:
-            return sizeof(int16_t);
-        case UINT16:
-            return sizeof(uint16_t);
-        case INT32:
-            return sizeof(int32_t);
-        case UINT32:
-            return sizeof(uint32_t);
-        case INT64:
-            return sizeof(int64_t);
-        case UINT64:
-            return sizeof(uint64_t);
-        case FLOAT32:
-            return sizeof(float);
-        case FLOAT64:
-            return sizeof(double);
-        default:
-            return 0;
-    }
-}
-
-int message_check(message_t* message) {
-    int data_type_size = message_data_type_size(message->datatype);
-
-    if (data_type_size * message->length > MAX_MESSAGE_DATA_SIZE) {
-        return -1;
-    }
-
+  switch (type) {
+  case INT8:
+    return sizeof(int8_t);
+  case UINT8:
+    return sizeof(uint8_t);
+  case INT16:
+    return sizeof(int16_t);
+  case UINT16:
+    return sizeof(uint16_t);
+  case INT32:
+    return sizeof(int32_t);
+  case UINT32:
+    return sizeof(uint32_t);
+  case INT64:
+    return sizeof(int64_t);
+  case UINT64:
+    return sizeof(uint64_t);
+  case FLOAT32:
+    return sizeof(float);
+  case FLOAT64:
+    return sizeof(double);
+  default:
     return 0;
-}
+  }
+}
\ No newline at end of file
diff --git a/daemon/include/send.h b/daemon/include/send.h
index e70aabc..ebdc921 100644
--- a/daemon/include/send.h
+++ b/daemon/include/send.h
@@ -1,13 +1,13 @@
 #pragma once
-
+#include "../../common/include/data.h"
 #include "../../common/include/message.h"
 
 #define KERNEL_DEVICE_PATH "/dev/amogus"
 
 typedef struct {
-    int fd;
+  int fd;
 } kernel_send_handle_t;
 
-int create_kernel_send_handle(kernel_send_handle_t* handle);
-int send_kernel_message(kernel_send_handle_t* handle, message_t* message);
-int destroy_kernel_send_handle(kernel_send_handle_t* handle);
+int create_kernel_send_handle(kernel_send_handle_t *handle);
+int send_kernel_message(kernel_send_handle_t *handle, data_t *data);
+int destroy_kernel_send_handle(kernel_send_handle_t *handle);
diff --git a/daemon/src/main.c b/daemon/src/main.c
index 6c9187b..2ad6a1b 100644
--- a/daemon/src/main.c
+++ b/daemon/src/main.c
@@ -3,112 +3,116 @@
 #include "../include/receive.h"
 #include "../include/send.h"
 #include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
 #include <stddef.h>
-#include <string.h>
 #include <stdint.h>
-#include <stdlib.h>
 #include <stdio.h>
-#include <fcntl.h>
-#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
 #include <sys/stat.h>
+#include <sys/types.h>
 #include <unistd.h>
-#include <signal.h>
 
 userspace_receive_handle_t userspace_receive_handle;
 kernel_send_handle_t kernel_send_handle;
 
 void signal_handler(int sig) {
-    destroy_userspace_receive_handle(&userspace_receive_handle);
-    destroy_kernel_send_handle(&kernel_send_handle);
-    exit(1);
+  destroy_userspace_receive_handle(&userspace_receive_handle);
+  destroy_kernel_send_handle(&kernel_send_handle);
+  exit(1);
 }
 
-void print_message_data(message_t* message) {
-    int data_type_size = message_data_type_size(message->datatype);
-    for (int i = 0; i < data_type_size / message->length; i++) {
-        uint8_t buf[data_type_size];
-        for (int j = 0; j < data_type_size; j++) {
-            buf[j] = message->data[(i * data_type_size) + j];
-        }
-
-        switch (message->datatype) {
-            case INT8:
-                printf("%d", *(int8_t*)buf);
-                break;
-            case UINT8:
-                printf("%d", *(uint8_t*)buf);
-                break;
-            case INT16:
-                printf("%d", *(int16_t*)buf);
-                break;
-            case UINT16:
-                printf("%d", *(uint16_t*)buf);
-                break;
-            case INT32:
-                printf("%d", *(int32_t*)buf);
-                break;
-            case UINT32:
-                printf("%d", *(uint32_t*)buf);
-                break;
-            case INT64:
-                printf("%ld", *(int64_t*)buf);
-                break;
-            case UINT64:
-                printf("%ld", *(uint64_t*)buf);
-                break;
-            case FLOAT32:
-                printf("%f", *(float*)buf);
-                break;
-            case FLOAT64:
-                printf("%f", *(double*)buf);
-                break;
-        }
-
-        if (i != message->length - 1) {
-            printf(" ");
-        }
-    }
+void print_message_data(message_t *message) {
+  int data_type_size = message_data_type_size(message->datatype);
+  switch (message->datatype) {
+  case INT8:
+    printf("%d", message->data.int8);
+    break;
+  case UINT8:
+    printf("%d", message->data.uint8);
+    break;
+  case INT16:
+    printf("%d", message->data.int16);
+    break;
+  case UINT16:
+    printf("%d", message->data.uint16);
+    break;
+  case INT32:
+    printf("%d", message->data.int32);
+    break;
+  case UINT32:
+    printf("%d", message->data.uint32);
+    break;
+  case INT64:
+    printf("%ld", message->data.int64);
+    break;
+  case UINT64:
+    printf("%ld", message->data.uint64);
+    break;
+  case FLOAT32:
+    printf("%f", message->data.float32);
+    break;
+  case FLOAT64:
+    printf("%f", message->data.float64);
+    break;
+  }
 }
 
 int main() {
-    if (create_userspace_receive_handle(&userspace_receive_handle) != 0) {
-        if (errno == EEXIST) {
-            fprintf(stderr, "Failed to create message queue (file '%s' exists, has another process already created the message queue?): %s\n", MSG_QUEUE_KEY, strerror(errno));
-        } else {
-            perror("Failed to create message queue");
-        }
-        return EXIT_FAILURE;
+  if (create_userspace_receive_handle(&userspace_receive_handle) != 0) {
+    if (errno == EEXIST) {
+      fprintf(stderr,
+              "Failed to create message queue (file '%s' exists, has another "
+              "process already created the message queue?): %s\n",
+              MSG_QUEUE_KEY, strerror(errno));
+    } else {
+      perror("Failed to create message queue");
     }
+    return EXIT_FAILURE;
+  }
 
-    if (create_kernel_send_handle(&kernel_send_handle) != 0) {
-        destroy_userspace_receive_handle(&userspace_receive_handle);
-        perror("Failed to create kernel connection (is the kernel module loaded?)");
-        return EXIT_FAILURE;
-    }
+  if (create_kernel_send_handle(&kernel_send_handle) != 0) {
+    destroy_userspace_receive_handle(&userspace_receive_handle);
+    perror("Failed to create kernel connection (is the kernel module loaded?)");
+    return EXIT_FAILURE;
+  }
 
-    struct sigaction signal_action;
-    signal_action.sa_handler = signal_handler;
-    signal_action.sa_flags = 0;
-    sigemptyset(&signal_action.sa_mask);
+  struct sigaction signal_action;
+  signal_action.sa_handler = signal_handler;
+  signal_action.sa_flags = 0;
+  sigemptyset(&signal_action.sa_mask);
 
-    sigaction(SIGINT, &signal_action, NULL);
+  sigaction(SIGINT, &signal_action, NULL);
 
-    while (1) {
-        message_t message;
+  while (1) {
+    message_t *message = malloc(sizeof(message_t));
 
-        if (recv_userspace_message(&userspace_receive_handle, &message) != 0) {
-            continue;
-        }
+    if (message == NULL) {
+      perror("Failed to allocate memory for message");
+      return EXIT_FAILURE;
+    }
 
-        printf("Received data from %d with length %d: ", message.measurement_id, message.length);
-        print_message_data(&message);
-        if (send_kernel_message(&kernel_send_handle, &message) == -1) {
-            printf(" (failed to send to kernel)");
-        }
-        printf("\n");
+    if (recv_userspace_message(&userspace_receive_handle, message) != 0) {
+      continue;
     }
 
-    destroy_userspace_receive_handle(&userspace_receive_handle);
+    printf("Received data from %d: ", message->measurement_id);
+    print_message_data(message);
+
+    data_t data = {
+        .values = message,
+        .sensor_id = 0x7C,
+        .count = 1,
+    };
+
+    if (send_kernel_message(&kernel_send_handle, &data) == -1) {
+      printf(" (failed to send to kernel)");
+    }
+    printf("\n");
+  }
+
+  destroy_userspace_receive_handle(&userspace_receive_handle);
 
-    return EXIT_SUCCESS;
+  return EXIT_SUCCESS;
 }
diff --git a/daemon/src/send.c b/daemon/src/send.c
index d104e82..9ed81e7 100644
--- a/daemon/src/send.c
+++ b/daemon/src/send.c
@@ -2,18 +2,18 @@
 #include <fcntl.h>
 #include <unistd.h>
 
-int create_kernel_send_handle(kernel_send_handle_t* handle) {
-    handle->fd = open(KERNEL_DEVICE_PATH, O_WRONLY);
-    if (handle->fd < 0) {
-        return -1;
-    }
-    return 0;
+int create_kernel_send_handle(kernel_send_handle_t *handle) {
+  handle->fd = open(KERNEL_DEVICE_PATH, O_WRONLY);
+  if (handle->fd < 0) {
+    return -1;
+  }
+  return 0;
 }
 
-int destroy_kernel_send_handle(kernel_send_handle_t* handle) {
-    return close(handle->fd);
+int destroy_kernel_send_handle(kernel_send_handle_t *handle) {
+  return close(handle->fd);
 }
 
-int send_kernel_message(kernel_send_handle_t* handle, message_t* message) {
-    return write(handle->fd, message, sizeof(message_t));
+int send_kernel_message(kernel_send_handle_t *handle, data_t *data) {
+  return write(handle->fd, data, sizeof(data_t));
 }
-- 
GitLab