Implement CSV loading and saving functionality; refactor user list management; update UUID generation and search functions; enhance signal handling in main application.

This commit is contained in:
2025-05-13 21:17:07 +02:00
parent 863d3e03e4
commit 2752f252ce
12 changed files with 195 additions and 34 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
"name": "Debug", "name": "Debug",
"type": "cppdbg", "type": "cppdbg",
"request": "launch", "request": "launch",
"args": [], "args": ["khkokhot.csv"],
"stopAtEntry": false, "stopAtEntry": false,
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
"environment": [], "environment": [],
+2 -1
View File
@@ -8,7 +8,8 @@
"fcntl.h": "c", "fcntl.h": "c",
"file_operations.h": "c", "file_operations.h": "c",
"string.h": "c", "string.h": "c",
"termios.h": "c" "termios.h": "c",
"typeinfo": "c"
}, },
"C_Cpp.errorSquiggles": "enabled" "C_Cpp.errorSquiggles": "enabled"
} }
+17
View File
@@ -0,0 +1,17 @@
/**
* @brief Provizorni modul pro praci se seznamy uzivatelu. Priprava pro implementaci uziti PostgreSQL
*
*/
#ifndef __DB_HANDLER_H__
#define __DB_HANDLER_H__
#include "main.h"
#include "users.h"
#include <libpq-fe.h>
int loadListFromCSV(char* _filename, list_t * _list);
int saveListToCSV(char* _filename, list_t * _list);
#endif
+1 -1
View File
@@ -13,7 +13,7 @@ typedef struct
// UART handler thread // UART handler thread
void *uartListener(void *arg); void *uartListener(void *arg);
void parseIncommingPacket(list_t *_head, BYTE *_packet); uint16_t parseIncommingPacket(BYTE *_packet);
void sendPacketToDevice(BYTE * _packet); void sendPacketToDevice(BYTE * _packet);
+3 -1
View File
@@ -5,8 +5,10 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "main.h" #include "main.h"
#include "users.h"
void uartDialog(char *uart_adress, int terminal_x, int terminal_y); void uartDialog(char *uart_adress, int terminal_x, int terminal_y);
void mainMenu(list_t * person_list, int terminal_x, int terminal_y);
#endif #endif
+9 -6
View File
@@ -45,7 +45,7 @@ typedef struct list
* @param _head Pointer to the head node of the linked list. * @param _head Pointer to the head node of the linked list.
* @return A 16-bit unsigned integer representing the generated UUID. * @return A 16-bit unsigned integer representing the generated UUID.
*/ */
uint16_t generateUUID(node_t *_head); uint16_t generateUUID(list_t *_list);
/** /**
* @brief Searches for a UUID associated with a user by their name and surname. * @brief Searches for a UUID associated with a user by their name and surname.
@@ -59,7 +59,7 @@ uint16_t generateUUID(node_t *_head);
* @param _surname Pointer to a string containing the user's surname. * @param _surname Pointer to a string containing the user's surname.
* @return Pointer to the UUID of the user if found, or 0 if no match is found. * @return Pointer to the UUID of the user if found, or 0 if no match is found.
*/ */
uint16_t *searchUUIDByName(node_t *_head, char *_name, char *_surname); uint16_t *searchUUIDByName(list_t *_list, char *_name, char *_surname);
/** /**
* @brief Searches for a person in a linked list by their UUID. * @brief Searches for a person in a linked list by their UUID.
@@ -72,7 +72,7 @@ uint16_t *searchUUIDByName(node_t *_head, char *_name, char *_surname);
* @return Pointer to the node containing the person with the matching UUID, * @return Pointer to the node containing the person with the matching UUID,
* or NULL if no such person is found. * or NULL if no such person is found.
*/ */
node_t *searchPersonByUUID(node_t *_head, uint16_t _uuid); node_t *searchPersonByUUID(list_t *_list, uint16_t _uuid);
/** /**
* @brief Adds a new person to the linked list. * @brief Adds a new person to the linked list.
@@ -101,7 +101,9 @@ node_t *searchPersonByUUID(node_t *_head, uint16_t _uuid);
* } * }
* ``` * ```
*/ */
int addPersonToList(node_t **_head, char *_name, char *_surname, uint32_t _department); int addPersonToList(list_t *_list, char *_name, char *_surname, uint32_t _department);
int loadPersonToList(list_t *_list, uint16_t _uuid, char *_name, char *_surname, uint32_t _department, time_t _last_event, time_t _total, BYTE _available);
/** /**
* @brief Adds a time event to the specified person's event list. * @brief Adds a time event to the specified person's event list.
@@ -114,7 +116,7 @@ int addPersonToList(node_t **_head, char *_name, char *_surname, uint32_t _depar
* @return An integer indicating the success or failure of the operation. * @return An integer indicating the success or failure of the operation.
* Typically, 1 for success and a 0 for failure. * Typically, 1 for success and a 0 for failure.
*/ */
int addTimeEvent(node_t *_person); int addTimeEvent(node_t *_person, list_t *_list);
/** /**
* @brief Removes a person node from a linked list. * @brief Removes a person node from a linked list.
@@ -127,5 +129,6 @@ int addTimeEvent(node_t *_person);
* @param _person Double pointer to the node representing the person to remove. * @param _person Double pointer to the node representing the person to remove.
* @return int Returns 0 on success, or a negative value on failure. * @return int Returns 0 on success, or a negative value on failure.
*/ */
int removePersonFromList(node_t **_head, node_t **_person); int removePersonFromList(list_t *_list, node_t **_person);
#endif #endif
+1
View File
@@ -0,0 +1 @@
1,Kamil,Novak,2504,0,0,0
1 1 Kamil Novak 2504 0 0 0
+27
View File
@@ -0,0 +1,27 @@
#include "db_handler.h"
int loadListFromCSV(char *_filename, list_t *_list)
{
FILE *f_in = fopen(_filename, "r");
if (f_in == NULL)
{
// doprasit
exit(-1);
}
char *buffer = NULL;
size_t buffer_size = 0;
int load_sum = 0;
char _name[128], _surname[128]; uint32_t _department; uint16_t _uuid; time_t _last_event, _total; BYTE _avail;
while (-1 != getline(&buffer, &buffer_size, f_in))
{
sscanf(buffer, "%hu,%127[^,],%127[^,],%u,%ld,%ld,%hhu", &_uuid, _name, _surname, &_department, &_last_event, &_total, &_avail);
loadPersonToList(_list, _uuid, _name, _surname, _department, _last_event, _total, _avail);
load_sum++;
}
fclose(f_in);
return load_sum;
}
+13
View File
@@ -7,14 +7,25 @@
#include <errno.h> #include <errno.h>
#include <termios.h> #include <termios.h>
#include <string.h> #include <string.h>
#include <signal.h>
#include "main.h" #include "main.h"
#include "users.h" #include "users.h"
#include "tui.h" #include "tui.h"
#include "rfid_handler.h" #include "rfid_handler.h"
#include "db_handler.h"
void handle_sigint(int sig)
{
clear();
endwin();
exit(0);
}
int main(int argc, char const **argv) int main(int argc, char const **argv)
{ {
signal(SIGINT, handle_sigint);
if (argc != 2) if (argc != 2)
{ {
printf("filename argument required\nUsage: %s [User database]\n", argv[0]); printf("filename argument required\nUsage: %s [User database]\n", argv[0]);
@@ -48,6 +59,8 @@ int main(int argc, char const **argv)
person_list.head = person_list_head; person_list.head = person_list_head;
pthread_mutex_init(&person_list.lock, NULL); pthread_mutex_init(&person_list.lock, NULL);
loadListFromCSV(argv[1], &person_list);
noecho(); noecho();
noraw(); noraw();
cbreak(); cbreak();
+5 -4
View File
@@ -16,7 +16,7 @@ void *uartListener(void *arg)
UartThreadArgs *thread_args = (UartThreadArgs *)arg; UartThreadArgs *thread_args = (UartThreadArgs *)arg;
char *uart_address = thread_args->uart_address; char *uart_address = thread_args->uart_address;
list_t *person_list_head = thread_args->person_list_head; list_t *person_list = thread_args->person_list_head;
int uart = open(uart_address, O_RDWR | O_NOCTTY | O_NDELAY); int uart = open(uart_address, O_RDWR | O_NOCTTY | O_NDELAY);
if (uart == -1) if (uart == -1)
@@ -105,7 +105,8 @@ void *uartListener(void *arg)
if (crc == packet[5]) if (crc == packet[5])
{ {
parseIncommingPacket(person_list_head, packet); uint16_t r_uuid = parseIncommingPacket(packet);
addTimeEvent(searchPersonByUUID(person_list, r_uuid), person_list);
} }
else else
{ {
@@ -121,12 +122,12 @@ void *uartListener(void *arg)
return NULL; return NULL;
} }
void parseIncommingPacket(list_t *_head, BYTE *_packet) uint16_t parseIncommingPacket(BYTE *_packet)
{ {
uint16_t r_id; uint16_t r_id;
BYTE r_event_type; BYTE r_event_type;
memcpy(&r_id, &_packet[2], 2); memcpy(&r_id, &_packet[2], 2);
memcpy(&r_event_type, &_packet[4], 1); memcpy(&r_event_type, &_packet[4], 1);
addTimeEvent(searchPersonByUUID(_head->head, r_id)); return r_id;
} }
+23 -1
View File
@@ -3,7 +3,7 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "main.h" #include "main.h"
#include "tui.h"
void uartDialog(char *uart_adress, int terminal_x, int terminal_y) void uartDialog(char *uart_adress, int terminal_x, int terminal_y)
{ {
@@ -105,3 +105,25 @@ void uartDialog(char *uart_adress, int terminal_x, int terminal_y)
} }
} }
} }
void mainMenu(list_t *person_list, int terminal_x, int terminal_y)
{
int win_height = 15;
int win_width = 80;
int start_y = (terminal_y - win_height) / 2;
int start_x = (terminal_x - win_width) / 2;
start_color();
init_pair(1, COLOR_BLACK, COLOR_WHITE);
init_pair(2, COLOR_WHITE, COLOR_RED);
WINDOW *uartwin = newwin(win_height, win_width, start_y, start_x);
wbkgd(uartwin, COLOR_PAIR(1));
box(uartwin, 0, 0);
wattron(uartwin, COLOR_PAIR(1));
wattroff(uartwin, COLOR_PAIR(1));
wrefresh(uartwin);
}
+93 -19
View File
@@ -11,17 +11,17 @@
#include <string.h> #include <string.h>
uint16_t generateUUID( uint16_t generateUUID(
node_t *_head) list_t *_list)
{ {
uint16_t uuid; uint16_t uuid;
int found; int found;
do do
{ {
found = 0; found = 0;
uuid = (uint16_t)(rand() % (UINT16_MAX + 1)); uuid = (uint16_t)(rand() % (UINT16_MAX + 1));
node_t *current = _head; pthread_mutex_lock(&_list->lock);
node_t *current = _list->head;
while (current != NULL) while (current != NULL)
{ {
if (current->user.uuid == uuid) if (current->user.uuid == uuid)
@@ -31,36 +31,42 @@ uint16_t generateUUID(
current = current->next; current = current->next;
} }
} while (found); } while (found);
pthread_mutex_unlock(&_list->lock);
return uuid; return uuid;
} }
node_t *searchPersonByUUID( node_t *searchPersonByUUID(
node_t *_head, list_t *_list,
uint16_t _uuid) uint16_t _uuid)
{ {
node_t *current = _head; pthread_mutex_lock(&_list->lock);
node_t *current = _list->head;
while (current != NULL) while (current != NULL)
{ {
if (current->user.uuid == _uuid) if (current->user.uuid == _uuid)
{ {
pthread_mutex_unlock(&_list->lock);
return current; return current;
} }
current = current->next; current = current->next;
} }
pthread_mutex_unlock(&_list->lock);
return NULL; return NULL;
} }
uint16_t *searchUUIDByName( uint16_t *searchUUIDByName(
node_t *_head, list_t *_list,
char *_name, char *_name,
char *_surname) char *_surname)
{ {
int sum = 0; int sum = 0;
uint16_t *uuids = malloc(sizeof(uint16_t)); uint16_t *uuids = malloc(sizeof(uint16_t));
node_t *current = _head; pthread_mutex_lock(&_list->lock);
node_t *current = _list->head;
if (_head == NULL) if (_list->head == NULL)
{ {
return 0; return 0;
} }
@@ -87,13 +93,16 @@ uint16_t *searchUUIDByName(
uuids[sum - 1] = current->user.uuid; uuids[sum - 1] = current->user.uuid;
} }
} }
pthread_mutex_unlock(&_list->lock);
if (sum == 0) if (sum == 0)
return NULL; return NULL;
return uuids; return uuids;
} }
int addPersonToList( int addPersonToList(
node_t **_head, list_t *_list,
char *_name, char *_name,
char *_surname, char *_surname,
uint32_t _department) uint32_t _department)
@@ -109,7 +118,7 @@ int addPersonToList(
return 0; return 0;
} }
new_node->user.uuid = generateUUID(*_head); new_node->user.uuid = generateUUID(_list);
new_node->user.name = (char *)malloc(strlen(_name) + 1); new_node->user.name = (char *)malloc(strlen(_name) + 1);
new_node->user.surname = (char *)malloc(strlen(_surname) + 1); new_node->user.surname = (char *)malloc(strlen(_surname) + 1);
@@ -130,24 +139,85 @@ int addPersonToList(
new_node->next = NULL; new_node->next = NULL;
if (*_head == NULL) pthread_mutex_lock(&_list->lock);
if (_list->head == NULL)
{ {
*_head = new_node; _list->head = new_node;
pthread_mutex_unlock(&_list->lock);
return 0; return 0;
} }
node_t *current = *_head; node_t *current = _list->head;
while (current->next != NULL) while (current->next != NULL)
{ {
current = current->next; current = current->next;
} }
current->next = new_node; current->next = new_node;
pthread_mutex_unlock(&_list->lock);
return 1;
}
int loadPersonToList(list_t *_list, uint16_t _uuid, char *_name, char *_surname, uint32_t _department, time_t _last_event, time_t _total, BYTE _available)
{
node_t *new_node = (node_t *)malloc(sizeof(node_t));
if (new_node == NULL)
return 0;
if (!strlen(_name) || !strlen(_surname))
{
free(new_node);
new_node = NULL;
return 0;
}
new_node->user.uuid = _uuid;
new_node->user.name = (char *)malloc(strlen(_name) + 1);
new_node->user.surname = (char *)malloc(strlen(_surname) + 1);
if (new_node->user.name == NULL || new_node->user.surname == NULL)
{
free(new_node->user.name);
free(new_node->user.surname);
free(new_node);
return 0;
}
strcpy(new_node->user.name, _name);
strcpy(new_node->user.surname, _surname);
new_node->user.department = _department;
new_node->user.last_time_event = _last_event;
new_node->user.total = _total;
new_node->user.available = _available;
new_node->next = NULL;
pthread_mutex_lock(&_list->lock);
if (_list->head == NULL)
{
_list->head = new_node;
pthread_mutex_unlock(&_list->lock);
return 0;
}
node_t *current = _list->head;
while (current->next != NULL)
{
current = current->next;
}
current->next = new_node;
pthread_mutex_unlock(&_list->lock);
return 1; return 1;
} }
int addTimeEvent( int addTimeEvent(
node_t *_person) node_t *_person,
list_t *_list)
{ {
time_t current_time = time(0); time_t current_time = time(0);
@@ -156,6 +226,7 @@ int addTimeEvent(
return 0; return 0;
} }
pthread_mutex_lock(&_list->lock);
if (_person->user.available) if (_person->user.available)
{ {
_person->user.total += (current_time - _person->user.last_time_event); _person->user.total += (current_time - _person->user.last_time_event);
@@ -163,16 +234,18 @@ int addTimeEvent(
_person->user.available = !_person->user.available; _person->user.available = !_person->user.available;
_person->user.last_time_event = current_time; _person->user.last_time_event = current_time;
pthread_mutex_unlock(&_list->lock);
return 1; return 1;
} }
int removePersonFromList(node_t **_head, node_t **_person) int removePersonFromList(list_t *_list, node_t **_person)
{ {
if (_head == NULL || *_head == NULL || _person == NULL || *_person == NULL) if (_list == NULL || _list->head == NULL || _person == NULL || *_person == NULL)
return 0; return 0;
node_t *current = *_head; pthread_mutex_lock(&_list->lock);
node_t *current = _list->head;
node_t *prev = NULL; node_t *prev = NULL;
while (current != NULL) while (current != NULL)
@@ -181,7 +254,7 @@ int removePersonFromList(node_t **_head, node_t **_person)
{ {
if (prev == NULL) if (prev == NULL)
{ {
*_head = current->next; _list->head = current->next;
} }
else else
{ {
@@ -196,5 +269,6 @@ int removePersonFromList(node_t **_head, node_t **_person)
prev = current; prev = current;
current = current->next; current = current->next;
} }
pthread_mutex_unlock(&_list->lock);
return 0; return 0;
} }