#include #include #include #include #include #include "main.h" #include "file_handler.h" #include "tui.h" void uartDialog(char *uart_adress, int terminal_x, int terminal_y) { char *prompt = "Please enter UART device address for RFID reader (probably /dev/ttyUSB0): "; char *header = "Enter UART Address"; char input[51] = {"\0"}; int win_height = 8; int win_width = 80; int start_y = (terminal_y - win_height) / 2; int start_x = (terminal_x - win_width) / 2; start_color(); 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)); wattron(uartwin, A_BOLD); mvwprintw(uartwin, 0, (win_width - strlen(header)) / 2, "%s", header); wattroff(uartwin, A_BOLD); mvwprintw(uartwin, 2, (win_width - strlen(prompt)) / 2, "%s", prompt); wattroff(uartwin, COLOR_PAIR(1)); wrefresh(uartwin); char choice; int highlight = 0; int text_x = (win_width - 52) / 2; int button_x = (win_width - 7) / 2; keypad(uartwin, true); while (1) { // Input array if (highlight == 0) wattron(uartwin, COLOR_PAIR(2)); else wattron(uartwin, COLOR_PAIR(1)); mvwprintw(uartwin, 4, text_x, "[%50s]", input); if (!strcmp(input, "\0")) mvwprintw(uartwin, 4, text_x, "[__________________________________________________]"); if (highlight == 0) wattroff(uartwin, COLOR_PAIR(2)); else wattroff(uartwin, COLOR_PAIR(1)); // Enter button if (highlight == 1) wattron(uartwin, COLOR_PAIR(2)); else wattron(uartwin, COLOR_PAIR(1)); wattron(uartwin, A_BOLD); mvwprintw(uartwin, 6, button_x - 2, " %s ", ""); if (highlight == 1) wattroff(uartwin, COLOR_PAIR(2)); else wattroff(uartwin, COLOR_PAIR(1)); wattroff(uartwin, A_BOLD); wrefresh(uartwin); flushinp(); choice = wgetch(uartwin); if (choice == '\t') { highlight = !highlight; } else if (choice == '\n') { if (highlight == 0) { mvwprintw(uartwin, 4, (win_width - 52) / 2, "[__________________________________________________]"); echo(); wmove(uartwin, 4, ((win_width - 52) / 2) + 1); curs_set(1); flushinp(); wgetnstr(uartwin, input, 50); curs_set(0); noecho(); } else if (highlight == 1) { if (choice == '\n') { wclear(uartwin); wrefresh(uartwin); touchwin(stdscr); refresh(); delwin(uartwin); refresh(); strcpy(uart_adress, input); break; } } } } } void mainMenu(list_t *person_list, int terminal_x, int terminal_y) { int win_height = 10; int win_width = 50; int start_y = (terminal_y - win_height) / 2; int start_x = (terminal_x - win_width) / 2; char choices[6][30] = {"List all employees", "Find employee", "Edit database", "Save", "Export", "Exit"}; char keyboard_input; int highlight = 0; start_color(); WINDOW *mainmenu = newwin(win_height, win_width, start_y, start_x); wbkgd(mainmenu, COLOR_PAIR(1)); keypad(mainmenu, true); int text_x = (win_width - 52) / 2; wrefresh(mainmenu); while (1) { box(mainmenu, 0, 0); wattron(mainmenu, COLOR_PAIR(1)); wattron(mainmenu, A_BOLD); mvwprintw(mainmenu, 0, (win_width - strlen("Administration")) / 2, "%s", "Administration"); wattroff(mainmenu, A_BOLD); wattroff(mainmenu, COLOR_PAIR(1)); for (int i = 0; i < 6; i++) { if (i == highlight) wattron(mainmenu, COLOR_PAIR(2)); else wattron(mainmenu, COLOR_PAIR(1)); wattron(mainmenu, A_BOLD); mvwprintw(mainmenu, 2 + i, (win_width - strlen(choices[i])) / 2, "%s", choices[i]); wattroff(mainmenu, A_BOLD); if (i == highlight) wattroff(mainmenu, COLOR_PAIR(2)); else wattroff(mainmenu, COLOR_PAIR(1)); } wrefresh(mainmenu); flushinp(); keyboard_input = wgetch(mainmenu); if (keyboard_input == '\t') { if (highlight < 5) highlight++; else highlight = 0; } else if (keyboard_input == '\n') { switch (highlight) { case 0: personListing(person_list, terminal_x, terminal_y); break; case 1: personSearch(person_list, terminal_x, terminal_y); break; case 4: exportDialog(person_list, terminal_x, terminal_y); break; case 5: if (keyboard_input == '\n') { wclear(mainmenu); wrefresh(mainmenu); touchwin(stdscr); refresh(); delwin(mainmenu); refresh(); return; } break; } } } } void personListing(list_t *person_list, int terminal_x, int terminal_y) { int win_height = 20; int win_width = 76; int start_y = (terminal_y - win_height) / 2; int start_x = (terminal_x - win_width) / 2; start_color(); WINDOW *personlisting = newwin(win_height, win_width, start_y, start_x); wbkgd(personlisting, COLOR_PAIR(1)); int max_rows = win_height - 2; int total_count = 0; node_t *current = person_list->head; while (current) { total_count++; current = current->next; } int offset = 0; int highlight = 0; int keyboard_input; while (1) { box(personlisting, 0, 0); wattron(personlisting, COLOR_PAIR(1)); wattron(personlisting, A_BOLD); mvwprintw(personlisting, 0, (win_width - strlen("Filtered list")) / 2, "%s", "Filtered list"); wattroff(personlisting, A_BOLD); wattroff(personlisting, COLOR_PAIR(1)); keypad(personlisting, TRUE); werase(personlisting); box(personlisting, 0, 0); wattron(personlisting, COLOR_PAIR(1)); wattron(personlisting, A_BOLD); mvwprintw(personlisting, 0, (win_width - strlen("Filtered list")) / 2, "%s", "Filtered list"); wattroff(personlisting, A_BOLD); wattroff(personlisting, COLOR_PAIR(1)); wattron(personlisting, A_BOLD); mvwprintw(personlisting, 1, 2, "UUID Surname Name Available"); wattroff(personlisting, A_BOLD); current = person_list->head; int idx = 0, row = 2; while (current && row < win_height) { if (idx >= offset && row < win_height - 1) { if (idx == highlight) wattron(personlisting, COLOR_PAIR(2)); mvwprintw(personlisting, row, 2, "%-10hu %-20s %-20s %s", current->user.uuid, current->user.surname, current->user.name, current->user.available ? "Yes " : "No "); if (idx == highlight) wattroff(personlisting, COLOR_PAIR(2)); row++; } idx++; current = current->next; } wrefresh(personlisting); keyboard_input = wgetch(personlisting); if (keyboard_input == KEY_UP) { if (highlight > 0) { highlight--; if (highlight < offset) offset--; } } else if (keyboard_input == KEY_DOWN) { if (highlight < total_count - 1) { highlight++; if (highlight >= offset + max_rows) offset++; } } else if (keyboard_input == '\n') { int idx = 0; node_t *selected = person_list->head; while (selected && idx < highlight) { selected = selected->next; idx++; } personInfo(person_list, selected, terminal_x, terminal_y); } else if (keyboard_input == 27 || keyboard_input == 'q') { break; } } delwin(personlisting); touchwin(stdscr); refresh(); } void personSearch(list_t *person_list, int terminal_x, int terminal_y) { int win_height = 11; int win_width = 50; int start_y = (terminal_y - win_height) / 2; int start_x = (terminal_x - win_width) / 2; char buttons[2][10] = {"", ""}; char prompts[2][10] = {"Name ", "Surname "}; start_color(); WINDOW *searchdialog = newwin(win_height, win_width, start_y, start_x); wbkgd(searchdialog, COLOR_PAIR(1)); char keyboard_input; int highlight = 0; int field_y = 2; int field_x = 4; static char name[32] = ""; static char surname[32] = ""; char *fields[2] = {name, surname}; int field_lens[2] = {31, 31}; uint16_t *uuids_found; while (1) { box(searchdialog, 0, 0); wattron(searchdialog, COLOR_PAIR(1)); wattron(searchdialog, A_BOLD); mvwprintw(searchdialog, 0, (win_width - strlen("Search")) / 2, "%s", "Search"); wattroff(searchdialog, A_BOLD); wattroff(searchdialog, COLOR_PAIR(1)); keypad(searchdialog, TRUE); for (int i = 0; i < 2; i++) { if (highlight == i) wattron(searchdialog, COLOR_PAIR(2)); else wattron(searchdialog, COLOR_PAIR(1)); mvwprintw(searchdialog, field_y + i * 2, field_x, "%s ", prompts[i]); mvwprintw(searchdialog, field_y + i * 2, field_x + strlen(prompts[i]) + 3, "[%30s]", fields[i]); if (strcmp(fields[i], "\0") == 0) mvwprintw(searchdialog, field_y + i * 2, field_x + strlen(prompts[i]) + 3, "[______________________________]"); if (highlight == i) wattroff(searchdialog, COLOR_PAIR(2)); else wattroff(searchdialog, COLOR_PAIR(1)); } int button_y = field_y + 7; int button_x = field_x; for (int i = 0; i < 2; i++) { if (highlight == 2 + i) wattron(searchdialog, COLOR_PAIR(2)); else wattron(searchdialog, COLOR_PAIR(1)); wattron(searchdialog, A_BOLD); mvwprintw(searchdialog, button_y, button_x + i * 12, "%s", buttons[i]); wattroff(searchdialog, A_BOLD); if (highlight == 2 + i) wattroff(searchdialog, COLOR_PAIR(2)); else wattroff(searchdialog, COLOR_PAIR(1)); } wrefresh(searchdialog); keyboard_input = wgetch(searchdialog); if (keyboard_input == '\t') { if (highlight < 3) { highlight++; } else highlight = 0; } else if (keyboard_input == '\n') { if (highlight < 2) { echo(); curs_set(1); mvwprintw(searchdialog, field_y + highlight * 2, field_x + strlen(prompts[highlight]) + 3, "%-30s", ""); wmove(searchdialog, field_y + highlight * 2, field_x + strlen(prompts[highlight]) + 4); wgetnstr(searchdialog, fields[highlight], field_lens[highlight]); curs_set(0); noecho(); } else if (highlight == 2) { uint16_t count = searchUUIDByName(person_list, name, surname, &uuids_found); list_t found_pesons; found_pesons.head = NULL; node_t **last_ptr = &found_pesons.head; for (uint16_t i = 0; i < count; i++) { node_t *cur = person_list->head; while (cur) { if (cur->user.uuid == uuids_found[i]) { node_t *new_node = malloc(sizeof(node_t)); if (new_node) { new_node->user = cur->user; new_node->next = NULL; *last_ptr = new_node; last_ptr = &new_node->next; } break; } cur = cur->next; } } personListing(&found_pesons, terminal_x, terminal_y); } else if (highlight == 3) { delwin(searchdialog); touchwin(stdscr); refresh(); return; } } else if (keyboard_input == 27 || keyboard_input == 'q') { // ESC delwin(searchdialog); touchwin(stdscr); refresh(); return; } } } void personInfo(list_t *_list, node_t *_person, int terminal_x, int terminal_y) { int win_height = 14; int win_width = 60; int start_y = (terminal_y - win_height) / 2; int start_x = (terminal_x - win_width) / 2; start_color(); WINDOW *personinfodialog = newwin(win_height, win_width, start_y, start_x); wbkgd(personinfodialog, COLOR_PAIR(6)); int max_rows = win_height - 2; int total_count = 0; box(personinfodialog, 0, 0); wattron(personinfodialog, COLOR_PAIR(6)); wattron(personinfodialog, A_BOLD); mvwprintw(personinfodialog, 0, (win_width - strlen("Search")) / 2, "%s", "Search"); wattroff(personinfodialog, A_BOLD); wattroff(personinfodialog, COLOR_PAIR(6)); keypad(personinfodialog, TRUE); char buttons[3][20] = {"", "", ""}; char prompts[6][32] = {"Name", "Surname", "Department", "Last time event", "Total time", "Available"}; char keyboard_input; int highlight = 0; int field_y = 2; int field_x = 4; int button_y = field_y + 15; int button_x = field_x; while (1) { werase(personinfodialog); box(personinfodialog, 0, 0); wattron(personinfodialog, COLOR_PAIR(6)); wattron(personinfodialog, A_BOLD); mvwprintw(personinfodialog, 0, (win_width - strlen("Person Information")) / 2, "%s", "Person Information"); wattroff(personinfodialog, A_BOLD); char last_time_event_str[64]; printDateAndTimeInString(_person->user.last_time_event, last_time_event_str); char total_time_str[64]; printTimeInString(_person->user.total, total_time_str); mvwprintw(personinfodialog, field_y, field_x, "%s: %s", prompts[0], _person->user.name); mvwprintw(personinfodialog, field_y + 1, field_x, "%s: %s", prompts[1], _person->user.surname); mvwprintw(personinfodialog, field_y + 2, field_x, "%s: %d", prompts[2], _person->user.department); mvwprintw(personinfodialog, field_y + 4, field_x, "%s: %s", prompts[3], last_time_event_str); mvwprintw(personinfodialog, field_y + 5, field_x, "%s: %s", prompts[4], total_time_str); mvwprintw(personinfodialog, field_y + 7, field_x, "%s: %s", prompts[5], _person->user.available ? "Yes" : "No"); wattroff(personinfodialog, COLOR_PAIR(6)); wrefresh(personinfodialog); for (int i = 0; i < 3; i++) { if (highlight == i) wattron(personinfodialog, COLOR_PAIR(2)); else wattron(personinfodialog, COLOR_PAIR(6)); wattron(personinfodialog, A_BOLD); mvwprintw(personinfodialog, field_y + 10, field_x + i * 20, "%s", buttons[i]); wattroff(personinfodialog, A_BOLD); if (highlight == i) wattroff(personinfodialog, COLOR_PAIR(2)); else wattroff(personinfodialog, COLOR_PAIR(6)); } wrefresh(personinfodialog); keyboard_input = wgetch(personinfodialog); if (keyboard_input == '\t') { if (highlight != 2) highlight++; else highlight = 1; } else if (keyboard_input == '\n') { if (highlight == 0) { exportPersonInfo(_person); } else if (highlight == 1) { addTimeEvent(_person, _list); } else if (highlight == 2) { delwin(personinfodialog); touchwin(stdscr); refresh(); return; } } else if (keyboard_input == 27 || keyboard_input == 'q') { delwin(personinfodialog); touchwin(stdscr); refresh(); return; } } } void exportDialog(list_t *_list, int terminal_x, int terminal_y) { int win_height = 8; int win_width = 80; int start_y = (terminal_y - win_height) / 2; int start_x = (terminal_x - win_width) / 2; WINDOW *exportdialog = newwin(win_height, win_width, start_y, start_x); wbkgd(exportdialog, COLOR_PAIR(6)); int max_rows = win_height - 2; int total_count = 0; box(exportdialog, 0, 0); wattron(exportdialog, COLOR_PAIR(1)); wattron(exportdialog, A_BOLD); mvwprintw(exportdialog, 0, (win_width - strlen("Copy database and save")) / 2, "%s", "Copy database and save"); wattroff(exportdialog, A_BOLD); wattroff(exportdialog, COLOR_PAIR(1)); keypad(exportdialog, TRUE); wattron(exportdialog, COLOR_PAIR(1)); mvwprintw(exportdialog, 2, (win_width - strlen("Enter name of exported database")) / 2, "%s", "Enter name of exported database"); wattroff(exportdialog, COLOR_PAIR(1)); wrefresh(exportdialog); char choice; int highlight = 0; int text_x = (win_width - 52) / 2; int button_x = (win_width - 7) / 2; char filename[51]; keypad(exportdialog, true); while (1) { // Input array if (highlight == 0) wattron(exportdialog, COLOR_PAIR(2)); else wattron(exportdialog, COLOR_PAIR(1)); mvwprintw(exportdialog, 4, text_x, "[%50s]", filename); if (!strcmp(filename, "\0")) mvwprintw(exportdialog, 4, text_x, "[__________________________________________________]"); if (highlight == 0) wattroff(exportdialog, COLOR_PAIR(2)); else wattroff(exportdialog, COLOR_PAIR(1)); // Enter button if (highlight == 1) wattron(exportdialog, COLOR_PAIR(2)); else wattron(exportdialog, COLOR_PAIR(1)); wattron(exportdialog, A_BOLD); mvwprintw(exportdialog, 6, button_x - 2, " %s ", ""); if (highlight == 1) wattroff(exportdialog, COLOR_PAIR(2)); else wattroff(exportdialog, COLOR_PAIR(1)); wattroff(exportdialog, A_BOLD); wrefresh(exportdialog); flushinp(); choice = wgetch(exportdialog); if (choice == '\t') { highlight = !highlight; } else if (choice == '\n') { if (highlight == 0) { mvwprintw(exportdialog, 4, (win_width - 52) / 2, "[__________________________________________________]"); echo(); wmove(exportdialog, 4, ((win_width - 52) / 2) + 1); curs_set(1); flushinp(); wgetnstr(exportdialog, filename, 50); curs_set(0); noecho(); } else if (highlight == 1) { if (choice == '\n') { saveListToCSV(filename, _list); wclear(exportdialog); wrefresh(exportdialog); touchwin(stdscr); refresh(); delwin(exportdialog); refresh(); return; } } } } }