From 58c97e32576a034a3ad686df21b61fc21357fe01 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 5 Apr 2019 12:07:26 +0200 Subject: [PATCH] digital ausgabe + warning cleanup --- driver/Makefile | 2 +- driver/cli | Bin 102216 -> 111704 bytes driver/cli.cpp | 92 +++++++++++++++++++++++++++--- driver/ui/view_info.cpp | 3 +- driver/ui/view_monitor.cpp | 3 +- driver/ui/view_promt.cpp | 114 +++++++++++++++++++++++++++++++++++++ driver/ui/view_promt.h | 32 +++++++++++ 7 files changed, 234 insertions(+), 12 deletions(-) create mode 100644 driver/ui/view_promt.cpp create mode 100644 driver/ui/view_promt.h diff --git a/driver/Makefile b/driver/Makefile index 723f21f..b34ad06 100644 --- a/driver/Makefile +++ b/driver/Makefile @@ -14,7 +14,7 @@ OBJ_CLI = cli.o CFLAGS = -std=c++14 -O3 -Wall -Wextra LDFLAGS = -lcurses -lpthread OBJECTS_DRV = drv/usart.o drv/b15f.o drv/plottyfile.o drv/dot.o -OBJECTS_UI = ui/view.o ui/view_selection.o ui/view_info.o ui/view_monitor.o +OBJECTS_UI = ui/view.o ui/view_selection.o ui/view_promt.o ui/view_info.o ui/view_monitor.o COMPILE = $(COMPILER_PATH) $(CFLAGS) diff --git a/driver/cli b/driver/cli index 8b7669f754a25d6ca2e366c07f209085f8463f38..282399b312f87a0ed91169cab7169da1f648dd3f 100755 GIT binary patch delta 46852 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 delta 37901 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 diff --git a/driver/cli.cpp b/driver/cli.cpp index 357946a..114efd6 100644 --- a/driver/cli.cpp +++ b/driver/cli.cpp @@ -17,6 +17,7 @@ #include "ui/view_selection.h" #include "ui/view_info.h" #include "ui/view_monitor.h" +#include "ui/view_promt.h" #include "drv/b15f.h" // global error message @@ -81,6 +82,13 @@ void finish(int) exit(EXIT_SUCCESS); } +void view_back(int) +{ + win_stack.pop_back(); + if(win_stack.size()) + win_stack.back()->repaint(); +} + void input(int) { std::function nextCall; @@ -88,20 +96,16 @@ void input(int) do { key = wgetch(View::getWinContext()); + win_stack.back()->repaint(); nextCall = win_stack.back()->keypress(key); if(key == -1) - { - win_stack.pop_back(); - if(win_stack.size()) - win_stack.back()->repaint(); - return; - } + view_back(key); if(nextCall) nextCall(key); } - while(!false); + while(win_stack.size()); } void show_info(int) @@ -128,13 +132,83 @@ void show_monitor(int) input(0); } +void show_invalid_port_input(int) +{ + ViewInfo* view = new ViewInfo(); + view->setTitle("Falsche Eingabe"); + view->setText("Bitte geben Sie einen Wert aus dem Intervall [00, FF] an."); + view->setLabelClose("[ Schliessen ]"); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void write_digital_output0(int) +{ + try + { + uint8_t port = std::stoi(static_cast(win_stack.back())->getInput(), 0, 16); + + B15F& drv = B15F::getInstance(); + drv.digitalWrite0(port); + view_back(0); + } + catch(std::invalid_argument& ex) + { + show_invalid_port_input(0); + } +} + +void write_digital_output1(int) +{ + try + { + uint8_t port = std::stoi(static_cast(win_stack.back())->getInput(), 0, 16); + + B15F& drv = B15F::getInstance(); + drv.digitalWrite1(port); + view_back(0); + } + catch(std::invalid_argument& ex) + { + show_invalid_port_input(0); + } +} + +void show_digital_output0(int) +{ + ViewPromt* view = new ViewPromt(); + view->setTitle("Digitale Ausgabe BE0"); + view->setMessage("\nEingabe Port-Wert (hex): 0x"); + view->setCancel("[ Zurueck ]", true); + view->setConfirm("[ OK ]", &write_digital_output0); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void show_digital_output1(int) +{ + ViewPromt* view = new ViewPromt(); + view->setTitle("Digitale Ausgabe BE1"); + view->setMessage("\nEingabe Port-Wert (hex): 0x"); + view->setCancel("[ Zurueck ]", true); + view->setConfirm("[ OK ]", &write_digital_output1); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + void show_main(int) { ViewSelection* view = new ViewSelection(); view->setTitle("B15F - Command Line Interface"); view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor); - view->addChoice("[ Digitale Ausgabe BE0 ]", &show_monitor); - view->addChoice("[ Digitale Ausgabe BE1 ]", &show_monitor); + view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0); + view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1); view->addChoice("[ Analoge Ausgabe AA0 ]", &show_monitor); view->addChoice("[ Analoge Ausgabe AA1 ]", &show_monitor); view->addChoice("[ Informationen ]", &show_info); diff --git a/driver/ui/view_info.cpp b/driver/ui/view_info.cpp index b94ff4e..0528d45 100644 --- a/driver/ui/view_info.cpp +++ b/driver/ui/view_info.cpp @@ -47,7 +47,8 @@ std::function ViewInfo::keypress(int& key) { size_t column = start_x + close_offset_x; size_t row = start_y + close_offset_y; - if(event.y == row && event.x >= column && event.x < column + label_close.length()) + size_t mouse_x = event.x, mouse_y = event.y; + if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length()) key = -1; // do return from view } break; diff --git a/driver/ui/view_monitor.cpp b/driver/ui/view_monitor.cpp index 12880ca..8f32b61 100644 --- a/driver/ui/view_monitor.cpp +++ b/driver/ui/view_monitor.cpp @@ -18,7 +18,8 @@ std::function ViewMonitor::keypress(int& key) { size_t column = start_x + close_offset_x; size_t row = start_y + close_offset_y; - if(event.y == row && event.x >= column && event.x < column + label_close.length()) + size_t mouse_x = event.x, mouse_y = event.y; + if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length()) hit = true; } if(!hit) diff --git a/driver/ui/view_promt.cpp b/driver/ui/view_promt.cpp new file mode 100644 index 0000000..80e2f24 --- /dev/null +++ b/driver/ui/view_promt.cpp @@ -0,0 +1,114 @@ +#include "view_promt.h" + +void ViewPromt::draw() +{ + int li = text_offset_y; + for(std::string line : str_split(message + input, "\n")) + mvwprintw(win, li++, text_offset_x, "%s", line.c_str()); + + button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2; + button_offset_y = height - text_offset_y + 1; + + if(selection == 0) + { + wattron(win, A_REVERSE); + mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str()); + wattroff(win, A_REVERSE); + mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str()); + mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str()); + } + else + { + mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str()); + mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str()); + wattron(win, A_REVERSE); + mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str()); + wattroff(win, A_REVERSE); + } +} + +void ViewPromt::setMessage(std::string message) +{ + this->message = message; +} + +void ViewPromt::setConfirm(std::string name, std::function call) +{ + label_confirm = name; + call_confirm = call; +} + +void ViewPromt::setCancel(std::string name, bool cancelable) +{ + label_cancel = name; + this->cancelable = cancelable; +} + +std::string ViewPromt::getInput() +{ + return input; +} + +std::function ViewPromt::keypress(int& key) +{ + std::function ret = nullptr; + switch(key) + { + case KEY_BACKSPACE: + if(input.length()) + input.pop_back(); + break; + case KEY_LEFT: + selection = (selection + 1 ) % 2; + break; + case KEY_RIGHT: + selection = (selection + 1 ) % 2; + break; + case KEY_MOUSE: + { + // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml + MEVENT event; + bool hit = false; + if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED)) + { + size_t column_start = start_x + button_offset_x; + size_t row_start = start_y + button_offset_y; + size_t mouse_x = event.x, mouse_y = event.y; + if(mouse_y == row_start) + { + if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length()) + { + if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED) + hit = true; + selection = 0; + } + if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length()) + { + if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED) + hit = true; + selection = 1; + } + } + } + if(!hit) + break; + + // fall through to next case + __attribute__ ((fallthrough)); + } + case KEY_ENT: + if(selection == 0) // exit + key = -1; // do return from view + else + ret = call_confirm; + break; + default: + break; + } + + if(key >= ' ' && key <= '~') + input += (char) key; + + repaint(); + return ret; +} diff --git a/driver/ui/view_promt.h b/driver/ui/view_promt.h new file mode 100644 index 0000000..d48be9c --- /dev/null +++ b/driver/ui/view_promt.h @@ -0,0 +1,32 @@ +#ifndef VIEW_PROMT_H +#define VIEW_PROMT_H + +#include +#include +#include "view.h" + +class ViewPromt : public View +{ +public: + virtual void draw(void) override; + virtual void setMessage(std::string message); + virtual void setConfirm(std::string name, std::function call); + virtual void setCancel(std::string name, bool cancelable); + virtual std::string getInput(void); + virtual std::function keypress(int& key) override; + +protected: + size_t selection = 1; + std::string input; + std::string message = "Input"; + std::string label_confirm = "[ OK ]"; + std::string sep = " "; + std::string label_cancel = "[ Cancel ]"; + std::function call_confirm = nullptr; + bool cancelable = true; + int button_offset_x = 0, button_offset_y = 0; + constexpr static int text_offset_x = 2; + constexpr static int text_offset_y = 3; +}; + +#endif // VIEW_PROMT_H