B15F Board 15 Famulus Edition

cli.cpp
1 #define B15F_CLI_DEBUG
2
3 #include <stdio.h>
4 #include <ncurses.h> // sudo apt-get install libncurses5-dev
5 #include <vector>
6 #include <string>
7 #include <iostream>
8 #include <signal.h>
9 #include <sys/ioctl.h>
10 #include <unistd.h>
11 #include <signal.h>
12 #include <future>
13 #include <thread>
14 #include <chrono>
15 #include "drv/b15f.h"
16 #include "ui/ui.h"
17 #include "ui/view_selection.h"
18 #include "ui/view_info.h"
19 #include "ui/view_monitor.h"
20 #include "ui/view_promt.h"
21
22 volatile int win_changed_cooldown = 0;
23 volatile bool t_refresh_active = false;
24
25 void signal_handler(int signal)
26 {
27 if(signal == SIGWINCH)
28 {
29 win_changed_cooldown = 10; // 100ms
30
31 if (!t_refresh_active)
32 {
33 if(t_refresh.joinable())
34 t_refresh.join();
35 t_refresh_active = true;
36 t_refresh = std::thread([]()
37 {
38
39 while(win_changed_cooldown--)
40 std::this_thread::sleep_for(std::chrono::milliseconds(10));
41
42 t_refresh_active = false;
43
44 if(win_stack.size())
45 win_stack.back()->repaint();
46
47 });
48 }
49
50 }
51 else if(signal == SIGINT)
52 {
53 cleanup();
54 std::cout << "SIGINT - Abbruch." << std::endl;
55 exit(EXIT_FAILURE);
56 }
57 }
58
59 void abort_handler(std::exception& ex)
60 {
61 ViewInfo* view = new ViewInfo();
62 view->setTitle("Fehler");
63 std::string msg(ex.what());
64 msg += "\n\nBeende in 5 Sekunden.";
65 view->setText(msg.c_str());
66 view->setLabelClose("");
67 view->repaint();
68
69 std::this_thread::sleep_for(std::chrono::milliseconds(5000));
70
71 cleanup();
72 std::cerr << std::endl << "*** EXCEPTION ***" << std::endl << ex.what() << std::endl;
73 exit(EXIT_FAILURE);
74 }
75
76 void init()
77 {
78 // init b15 driver
79 B15F::getInstance();
80 #ifndef B15F_CLI_DEBUG
81 std::cout << std::endl << "Starte in 3s ..." << std::endl;
82 sleep(3);
83 #endif
84 B15F::setAbortHandler(&abort_handler);
85
86 // init all ncurses stuff
87 initscr();
88 start_color();
89 curs_set(0); // 0: invisible, 1: normal, 2: very visible
90 clear();
91 noecho();
92 cbreak(); // Line buffering disabled. pass on everything
93 mousemask(ALL_MOUSE_EVENTS, NULL);
94
95 // connect signals to handler
96 signal(SIGWINCH, signal_handler);
97 signal(SIGINT, signal_handler);
98
99 // set view context
100 View::setWinContext(newwin(25, 85, 0, 0));
101 }
102
103
104 int main()
105 {
106 init();
107
108 int exit_code = EXIT_SUCCESS;
109
110 show_main(0);
111
112 cleanup();
113
114 return exit_code;
115 }
ViewInfo
Definition: view_info.h:8
B15F::getInstance
static B15F & getInstance(void)
Definition: b15f.cpp:432
B15F::setAbortHandler
static void setAbortHandler(errorhandler_t func)
Definition: b15f.cpp:475