diff --git a/clients/cpu_temp/src/cpu_temp.c b/clients/cpu_temp/src/cpu_temp.c index 91d7bfe4f95a5320197eb101780fe5829d2f6c04..bdb5bb93d3ca9c1dffc76806b451de52bb29e6cb 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 0000000000000000000000000000000000000000..628067d99ebd4ca66e82841a8c903fcabba2e074 --- /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 4805ababde0951ed21f970ab4af2c2dbf4c5bfae..e1e7d26a2a19edb3b71f6b0469da652841026e7c 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 dd72492686881c68c8389ce3bebc7c48d765c3c8..51c8d94fbce77a00c4511aed1640dc8eb0cb43ac 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 e70aabc7fce80aff5da8dfa30837fd91b6248663..ebdc9213ae08d4200813551440aff8a8acfaf00d 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 6c9187b41595f7d6eddc04c7d772b9d66fffedd1..2ad6a1b75b55d9c99f79aa2f7c09bd8352782a1e 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 d104e82c0b27f188c6de462cbd693ef268334314..9ed81e705277862a8a67095ea69aa2dde003d6f8 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)); }