Skip to content
Snippets Groups Projects
Select Git revision
  • 03950616d35f87853d7145cae1b63b28bd5d460c
  • main default protected
2 results

main.c

Blame
  • main.c 2.93 KiB
    #include "../../common/include/message.h"
    #include "../../common/include/userspace_comm.h"
    #include "../include/receive.h"
    #include "../include/send.h"
    #include <errno.h>
    #include <fcntl.h>
    #include <signal.h>
    #include <stddef.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <unistd.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);
    }
    
    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_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);
    
      sigaction(SIGINT, &signal_action, NULL);
    
      while (1) {
        message_t *message = malloc(sizeof(message_t));
    
        if (message == NULL) {
          perror("Failed to allocate memory for message");
          return EXIT_FAILURE;
        }
    
        if (recv_userspace_message(&userspace_receive_handle, message) != 0) {
          continue;
        }
    
        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;
    }