From a99d8c489e81f73ee946a882cd55056877c35a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sun, 27 Jun 2021 14:21:22 +0200 Subject: [PATCH] feat: add file browser main loop --- file-browser/include/file_browser.h | 21 ++++++ file-browser/src/file_browser.c | 31 ++++++++ file-browser/src/main.c | 108 ++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 file-browser/include/file_browser.h create mode 100644 file-browser/src/file_browser.c create mode 100644 file-browser/src/main.c diff --git a/file-browser/include/file_browser.h b/file-browser/include/file_browser.h new file mode 100644 index 0000000..ac0bb8b --- /dev/null +++ b/file-browser/include/file_browser.h @@ -0,0 +1,21 @@ +#ifndef __FILE_BROWSER_H__ +#define __FILE_BROWSER_H__ + +#include "logger.h" +#include "gui.h" +#include "font.h" + +typedef struct { + logger_t *logger; + + mzapo_pheripherals_t pheripherals; + + gui_t gui; + font_t font; +} file_browser_t; + +file_browser_t file_browser_create(mzapo_pheripherals_t pheripherals, logger_t *logger, font_t font); +void file_browser_start_loop(file_browser_t *file_browser); +void file_browser_destroy(file_browser_t *file_browser); + +#endif // __FILE_BROWSER_H__ diff --git a/file-browser/src/file_browser.c b/file-browser/src/file_browser.c new file mode 100644 index 0000000..8ff63d4 --- /dev/null +++ b/file-browser/src/file_browser.c @@ -0,0 +1,31 @@ +#include "file_browser.h" +#include "gui.h" +#include "input.h" +#include "logger.h" +#include "renderer.h" +#include "window_initial.h" + +file_browser_t file_browser_create(mzapo_pheripherals_t pheripherals, + logger_t *logger, font_t font) { + file_browser_t browser = { + .font = font, + .logger = logger, + .pheripherals = pheripherals, + }; + + return browser; +} + +void file_browser_start_loop(file_browser_t *file_browser) { + command_t command_arr[100]; + commands_t commands = commands_create(command_arr, 100, *file_browser->pheripherals.knobs); + renderer_t renderer = renderer_create(file_browser->pheripherals.display); + + file_browser->gui = gui_create(file_browser->logger, &commands, &renderer, &file_browser->pheripherals); + window_initial_open(&file_browser->gui, file_browser->font); + logger_info(file_browser->logger, __FILE__, __FUNCTION__, __LINE__, "File browser loop ended"); +} + +void file_browser_destroy(file_browser_t *file_browser) { + // do nothing +} diff --git a/file-browser/src/main.c b/file-browser/src/main.c new file mode 100644 index 0000000..e962f1e --- /dev/null +++ b/file-browser/src/main.c @@ -0,0 +1,108 @@ +#include +#include + +#include "file_browser.h" +#include "logger.h" +#include "serialize_lock.h" +#include "mzapo_sdl.h" +#include "mzapo_pheripherals.h" +#include "nonblocking_io.h" +#include "font.h" + +// soubory otvírat podle mime typů - config s mime typy a přiřazeným editorem +// pokud nic nevyhovuje a je spustitelný, tak spustit +// pokud neplatí ani jedno, otevřít v text vieweru - ten schovat pod mime type text, který bude default + +// TODO: okna +// initial - lokální fs nebo nějaký unmounted +// browser - ukazuje current složku, v ní soubory a info o nich, nahoře název +// složky +// contextmenu - ukazuje info o souboru a jeho nabídku na smazání, přesunutí, +// zkopírování, zobrazení v textovém move/copy - slouží podobně jako initial a +// browser, ale k přesunutí nebo +// zkopírování objektu +// options - nastavení nabídka +// mimetypes - jaký mime type otevírá co, defaultně dát jen pár mime types s možností přidat přes stdin (příp. virtuální klávesnici, když zbude čas) + +// TODO: dokončit dokumentaci + +// options, browser, contextmenu +// spouštění souborů // 15 - 16 + +// dokončit dokumentaci a vygenerovat doxygen - 2 HOD 19 - 21 +// pátek - lazení +// sobota, neděle - zoomování fontu + +typedef enum { + ERROR_SUCCESS, + ERROR_PHERIPHERALS, +} error_t; + +int main(int argc, char *argv[]) { + #ifdef COMPUTER + mzapo_sdl_init(); + #endif + struct termios oldstdin; + + logger_t logger = + logger_create(LOG_DEBUG, stdout, stdout, stderr, stderr, NULL); + + /* Try to acquire lock the first */ + if (serialize_lock(1) <= 0) { + logger_warn(&logger, __FILE__, __FUNCTION__, __LINE__, "System is occupied"); + + if (1) { + /* Wait till application holding lock releases IT or exits */ + logger_info(&logger, __FILE__, __FUNCTION__, __LINE__, + "Waiting"); + serialize_lock(0); + } + } + + mzapo_rgb_led_t rgb_leds = mzapo_create_rgb_led(); + rgb_led_clear(&rgb_leds, LED_LEFT); + rgb_led_clear(&rgb_leds, LED_RIGHT); + + display_t display = mzapo_create_display(); + mzapo_ledstrip_t ledstrip = mzapo_create_ledstrip(); + void* knobs = mzapo_get_knobs_address(); + + // TODO: check permissions for mounted devices + + if (!mzapo_check_pheripherals(&ledstrip, &rgb_leds, &display, &knobs)) { + logger_error(&logger, __FILE__, __FUNCTION__, __LINE__, "Could not initialize some of the pheripherals."); + rgb_led_set_red(&rgb_leds, LED_LEFT); + return ERROR_PHERIPHERALS; + } + + mzapo_pheripherals_t pheripherals = mzapo_pheripherals_create(&ledstrip, &rgb_leds, &display, &knobs); + + font_t font = font_create(font_rom8x16); + font.char_spacing = 2; + + file_browser_t file_browser = file_browser_create(pheripherals, &logger, font); + + file_set_nonblocking(STDIN_FILENO, &oldstdin); + logger_info(&logger, __FILE__, __FUNCTION__, __LINE__, + "Starting file browser"); + file_browser_start_loop(&file_browser); + logger_info(&logger, __FILE__, __FUNCTION__, __LINE__, + "Closing application"); + + file_browser_destroy(&file_browser); + display_deinit(&display); + + file_set_blocking(STDIN_FILENO, &oldstdin); + + serialize_unlock(); + + logger_info(&logger, __FILE__, __FUNCTION__, __LINE__, + "Application quit"); + +#ifdef COMPUTER + mzapo_sdl_deinit(); +#endif + return ERROR_SUCCESS; + + return 0; +} -- 2.48.1