From 4088eda3badf294be7e6f4384c31e0cec8087d7d Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Wed, 22 May 2019 11:01:48 +0200 Subject: [PATCH 01/35] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c938911 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Tristan Krause + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 16b1e101adb8ae5d5a6722732f9be287d6992ca3 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Wed, 22 May 2019 11:03:52 +0200 Subject: [PATCH 02/35] readme update --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ef5f130..30e4496 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,16 @@ # B15F - Board 15 Famulus Edition +**Hinweis:** +Die Projekt-Dokumentation befindet sich unter [github pages](https://devfix.github.io/b15f/). + ## TODO / Ideen - [X] CLI: Exception catchen, set global error message, raise SIGINT --> ncurses wird richtig beendet - [ ] Monitor: Refresh visualisieren, z.B. - / - \ | - [ ] Main Menu: Informationen ergänzen - [X] Selbsttest bei discard richtig beenden (momentan wird wahrscheinlich WDT angeschmissen, besser global bool für selbsttest-loop) - [ ] Lizenz -- [ ] gitignore checken -- [ ] readme schreiben +- [x] gitignore checken +- [x] readme schreiben - [ ] CLI: Farbe? - [ ] globale strings / msg klasse für treiber, ui (z.B. B15F info) - [ ] drv: requests als array organisieren From 90e62b739bfa5d3caf68b07b6fc9badc06655ca3 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Thu, 23 May 2019 12:55:56 +0200 Subject: [PATCH 03/35] tmp cli renamed --- README.md | 2 +- control/bin/b15fcli | Bin 0 -> 89776 bytes control/src/Makefile | 6 +++--- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100755 control/bin/b15fcli diff --git a/README.md b/README.md index 30e4496..2f0f2b5 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Die Projekt-Dokumentation befindet sich unter [github pages](https://devfix.gith - [ ] Monitor: Refresh visualisieren, z.B. - / - \ | - [ ] Main Menu: Informationen ergänzen - [X] Selbsttest bei discard richtig beenden (momentan wird wahrscheinlich WDT angeschmissen, besser global bool für selbsttest-loop) -- [ ] Lizenz +- [x] Lizenz - [x] gitignore checken - [x] readme schreiben - [ ] CLI: Farbe? diff --git a/control/bin/b15fcli b/control/bin/b15fcli new file mode 100755 index 0000000000000000000000000000000000000000..864a09cf34677967f19d0897dcce89ccb8ca853f GIT binary patch literal 89776 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 Date: Thu, 23 May 2019 15:08:54 +0200 Subject: [PATCH 04/35] doc update --- control/bin/b15fcli | Bin 89776 -> 0 bytes control/examples/pegel/main.cpp | 12 +- control/src/Makefile | 10 +- control/src/cli.cpp | 145 ++-- control/src/doxygen-cfg | 4 +- control/src/drv/b15f.cpp | 473 +++++------ control/src/drv/b15f.h | 396 ++++----- control/src/drv/dot.cpp | 10 +- control/src/drv/dot.h | 34 +- control/src/drv/driverexception.h | 30 +- control/src/drv/plottyfile.cpp | 166 ++-- control/src/drv/plottyfile.h | 245 ++++-- control/src/drv/timeoutexception.h | 36 +- control/src/drv/usart.cpp | 511 ++++++------ control/src/drv/usart.h | 256 +++--- control/src/drv/usartexception.h | 30 +- control/src/ui/ui.cpp | 394 ++++----- control/src/ui/view.cpp | 64 +- control/src/ui/view.h | 46 +- control/src/ui/view_info.cpp | 76 +- control/src/ui/view_info.h | 26 +- control/src/ui/view_monitor.cpp | 238 +++--- control/src/ui/view_monitor.h | 20 +- control/src/ui/view_promt.cpp | 192 ++--- control/src/ui/view_promt.h | 36 +- control/src/ui/view_selection.cpp | 126 +-- control/src/ui/view_selection.h | 20 +- docs/html/annotated.html | 2 +- docs/html/b15f_8cpp_source.html | 51 +- docs/html/b15f_8h_source.html | 47 +- docs/html/classB15F-members.html | 20 +- docs/html/classB15F.html | 84 +- docs/html/classDot-members.html | 10 +- docs/html/classDot.html | 125 ++- docs/html/classDriverException-members.html | 2 +- docs/html/classDriverException.html | 17 +- docs/html/classPlottyFile-members.html | 58 +- docs/html/classPlottyFile.html | 788 ++++++++++++++++-- docs/html/classTimeoutException-members.html | 2 +- docs/html/classTimeoutException.html | 17 +- docs/html/classUSART-members.html | 2 +- docs/html/classUSART.html | 21 +- docs/html/classUSARTException-members.html | 2 +- docs/html/classUSARTException.html | 17 +- docs/html/classView-members.html | 2 +- docs/html/classView.html | 17 +- docs/html/classViewInfo-members.html | 2 +- docs/html/classViewInfo.html | 17 +- docs/html/classViewMonitor-members.html | 2 +- docs/html/classViewMonitor.html | 17 +- docs/html/classViewPromt-members.html | 2 +- docs/html/classViewPromt.html | 17 +- docs/html/classViewSelection-members.html | 2 +- docs/html/classViewSelection.html | 17 +- docs/html/classes.html | 2 +- docs/html/cli_8cpp_source.html | 10 +- .../dir_1788f8309b1a812dcb800a185471cf6c.html | 2 +- .../dir_587c94d866dbb2f408f78cf41f9b2f8d.html | 2 +- docs/html/dot_8cpp_source.html | 8 +- docs/html/dot_8h_source.html | 10 +- docs/html/driverexception_8h_source.html | 6 +- docs/html/files.html | 2 +- docs/html/functions.html | 128 ++- docs/html/functions_func.html | 99 ++- docs/html/functions_vars.html | 96 +++ docs/html/hierarchy.html | 2 +- docs/html/index.html | 2 +- docs/html/menudata.js | 5 +- docs/html/plottyfile_8cpp_source.html | 33 +- docs/html/plottyfile_8h_source.html | 35 +- docs/html/search/all_0.js | 5 +- docs/html/search/all_1.js | 3 +- docs/html/search/all_3.js | 2 +- docs/html/search/all_6.js | 17 +- docs/html/search/all_7.js | 3 +- docs/html/search/all_8.js | 3 +- docs/html/search/all_9.js | 7 +- docs/html/search/all_a.js | 9 +- docs/html/search/all_b.js | 19 +- docs/html/search/all_c.js | 5 +- docs/html/search/all_d.js | 7 +- docs/html/search/all_e.js | 7 +- docs/html/search/all_f.html | 30 + docs/html/search/all_f.js | 7 + docs/html/search/functions_0.js | 5 +- docs/html/search/functions_2.js | 3 +- docs/html/search/functions_5.js | 17 +- docs/html/search/functions_9.js | 15 +- docs/html/search/functions_b.js | 3 +- docs/html/search/searchdata.js | 11 +- docs/html/search/variables_0.html | 30 + docs/html/search/variables_0.js | 4 + docs/html/search/variables_1.html | 30 + docs/html/search/variables_1.js | 5 + docs/html/search/variables_2.html | 30 + docs/html/search/variables_2.js | 4 + docs/html/search/variables_3.html | 30 + docs/html/search/variables_3.js | 5 + docs/html/search/variables_4.html | 30 + docs/html/search/variables_4.js | 4 + docs/html/timeoutexception_8h_source.html | 6 +- docs/html/ui_8cpp_source.html | 29 +- docs/html/ui_8h_source.html | 2 +- docs/html/usart_8cpp_source.html | 20 +- docs/html/usart_8h_source.html | 18 +- docs/html/usartexception_8h_source.html | 6 +- docs/html/view_8cpp_source.html | 6 +- docs/html/view_8h_source.html | 6 +- docs/html/view__info_8cpp_source.html | 4 +- docs/html/view__info_8h_source.html | 8 +- docs/html/view__monitor_8cpp_source.html | 24 +- docs/html/view__monitor_8h_source.html | 8 +- docs/html/view__promt_8cpp_source.html | 4 +- docs/html/view__promt_8h_source.html | 8 +- docs/html/view__selection_8cpp_source.html | 4 +- docs/html/view__selection_8h_source.html | 8 +- docs/index.html | 6 +- 117 files changed, 3780 insertions(+), 2135 deletions(-) delete mode 100755 control/bin/b15fcli create mode 100644 docs/html/functions_vars.html create mode 100644 docs/html/search/all_f.html create mode 100644 docs/html/search/all_f.js create mode 100644 docs/html/search/variables_0.html create mode 100644 docs/html/search/variables_0.js create mode 100644 docs/html/search/variables_1.html create mode 100644 docs/html/search/variables_1.js create mode 100644 docs/html/search/variables_2.html create mode 100644 docs/html/search/variables_2.js create mode 100644 docs/html/search/variables_3.html create mode 100644 docs/html/search/variables_3.js create mode 100644 docs/html/search/variables_4.html create mode 100644 docs/html/search/variables_4.js diff --git a/control/bin/b15fcli b/control/bin/b15fcli deleted file mode 100755 index 864a09cf34677967f19d0897dcce89ccb8ca853f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89776 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 2>&1 1>&3) 2>/dev/null | wc -l` + +style: + @echo "Formatting source code with astyle..." + astyle --recursive --style=allman *.cpp,*.h,*.c,*.hpp install: @echo "Installing driver..." @@ -78,6 +83,7 @@ clean: @echo "Cleaning..." rm -f $(OBJECTS_DRV) $(OBJECTS_CLI) $(OUT_TMP_CLI) $(OUT_TMP_DRV) rm -rf $(OUT_DOC) + find . -type f -name '*.orig' -delete .cpp.o: $(PATH_COMPILER) $(CFLAGS) -c $< -o $@ diff --git a/control/src/cli.cpp b/control/src/cli.cpp index aa57de7..5f76d3c 100644 --- a/control/src/cli.cpp +++ b/control/src/cli.cpp @@ -24,91 +24,92 @@ volatile bool t_refresh_active = false; void signal_handler(int signal) { - if(signal == SIGWINCH) - { - win_changed_cooldown = 10; // 100ms - - if (!t_refresh_active) - { - if(t_refresh.joinable()) - t_refresh.join(); - t_refresh_active = true; - t_refresh = std::thread([](){ - - while(win_changed_cooldown--) - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - - t_refresh_active = false; - - if(win_stack.size()) - win_stack.back()->repaint(); - - }); - } - - } - else if(signal == SIGINT) - { - cleanup(); - std::cout << "SIGINT - Abbruch." << std::endl; - exit(EXIT_FAILURE); - } + if(signal == SIGWINCH) + { + win_changed_cooldown = 10; // 100ms + + if (!t_refresh_active) + { + if(t_refresh.joinable()) + t_refresh.join(); + t_refresh_active = true; + t_refresh = std::thread([]() + { + + while(win_changed_cooldown--) + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + + t_refresh_active = false; + + if(win_stack.size()) + win_stack.back()->repaint(); + + }); + } + + } + else if(signal == SIGINT) + { + cleanup(); + std::cout << "SIGINT - Abbruch." << std::endl; + exit(EXIT_FAILURE); + } } void abort_handler(std::exception& ex) { - ViewInfo* view = new ViewInfo(); - view->setTitle("Fehler"); - std::string msg(ex.what()); - msg += "\n\nBeende in 5 Sekunden."; - view->setText(msg.c_str()); - view->setLabelClose(""); - view->repaint(); - - std::this_thread::sleep_for(std::chrono::milliseconds(5000)); - - cleanup(); - std::cerr << std::endl << "*** EXCEPTION ***" << std::endl << ex.what() << std::endl; - exit(EXIT_FAILURE); + ViewInfo* view = new ViewInfo(); + view->setTitle("Fehler"); + std::string msg(ex.what()); + msg += "\n\nBeende in 5 Sekunden."; + view->setText(msg.c_str()); + view->setLabelClose(""); + view->repaint(); + + std::this_thread::sleep_for(std::chrono::milliseconds(5000)); + + cleanup(); + std::cerr << std::endl << "*** EXCEPTION ***" << std::endl << ex.what() << std::endl; + exit(EXIT_FAILURE); } void init() { - // init b15 driver - B15F::getInstance(); + // init b15 driver + B15F::getInstance(); #ifndef B15F_CLI_DEBUG - std::cout << std::endl << "Starte in 3s ..." << std::endl; - sleep(3); + std::cout << std::endl << "Starte in 3s ..." << std::endl; + sleep(3); #endif - B15F::setAbortHandler(&abort_handler); - - // init all ncurses stuff - initscr(); - start_color(); - curs_set(0); // 0: invisible, 1: normal, 2: very visible - clear(); - noecho(); - cbreak(); // Line buffering disabled. pass on everything - mousemask(ALL_MOUSE_EVENTS, NULL); - - // connect signals to handler - signal(SIGWINCH, signal_handler); - signal(SIGINT, signal_handler); - - // set view context - View::setWinContext(newwin(25, 85, 0, 0)); + B15F::setAbortHandler(&abort_handler); + + // init all ncurses stuff + initscr(); + start_color(); + curs_set(0); // 0: invisible, 1: normal, 2: very visible + clear(); + noecho(); + cbreak(); // Line buffering disabled. pass on everything + mousemask(ALL_MOUSE_EVENTS, NULL); + + // connect signals to handler + signal(SIGWINCH, signal_handler); + signal(SIGINT, signal_handler); + + // set view context + View::setWinContext(newwin(25, 85, 0, 0)); } int main() { - init(); - - int exit_code = EXIT_SUCCESS; - - show_main(0); - - cleanup(); - - return exit_code; + init(); + + int exit_code = EXIT_SUCCESS; + + show_main(0); + + cleanup(); + + return exit_code; } diff --git a/control/src/doxygen-cfg b/control/src/doxygen-cfg index 7093299..a4533e1 100644 --- a/control/src/doxygen-cfg +++ b/control/src/doxygen-cfg @@ -1260,7 +1260,7 @@ HTML_COLORSTYLE_GAMMA = 80 # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_TIMESTAMP = NO +HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that @@ -1279,7 +1279,7 @@ HTML_DYNAMIC_MENUS = YES # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_DYNAMIC_SECTIONS = NO +HTML_DYNAMIC_SECTIONS = YES # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index 17114b6..0204cc6 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -5,315 +5,320 @@ errorhandler_t B15F::errorhandler = nullptr; B15F::B15F() { - init(); + init(); } void B15F::init() { - - std::string device = exec("bash -c 'ls /dev/ttyUSB*'"); - while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos) - device.pop_back(); - - if(device.length() == 0) - abort("Adapter nicht gefunden"); - - std::cout << PRE << "Verwende Adapter: " << device << std::endl; - - - - std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush; - usart.setBaudrate(BAUDRATE); - usart.openDevice(device); - std::cout << "OK" << std::endl; - - - std::cout << PRE << "Teste Verbindung... " << std::flush; - uint8_t tries = 3; - while(tries--) - { - // verwerfe Daten, die µC noch hat - //discard(); - - if(!testConnection()) - continue; - - if(!testIntConv()) - continue; - - break; - } - if(tries == 0) - abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?"); - std::cout << "OK" << std::endl; - - - // Gib board info aus - std::vector info = getBoardInfo(); - std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl; + std::string device = exec("bash -c 'ls /dev/ttyUSB*'"); + while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos) + device.pop_back(); + + if(device.length() == 0) + abort("Adapter nicht gefunden"); + + std::cout << PRE << "Verwende Adapter: " << device << std::endl; + + + + std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush; + usart.setBaudrate(BAUDRATE); + usart.openDevice(device); + std::cout << "OK" << std::endl; + + + + std::cout << PRE << "Teste Verbindung... " << std::flush; + uint8_t tries = 3; + while(tries--) + { + // verwerfe Daten, die µC noch hat + //discard(); + + if(!testConnection()) + continue; + + if(!testIntConv()) + continue; + + break; + } + if(tries == 0) + abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?"); + std::cout << "OK" << std::endl; + + + // Gib board info aus + std::vector info = getBoardInfo(); + std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl; } void B15F::reconnect() { - uint8_t tries = RECONNECT_TRIES; - while(tries--) - { - delay_ms(RECONNECT_TIMEOUT); - discard(); - - if(testConnection()) - return; - } - - abort("Verbindung kann nicht repariert werden"); + uint8_t tries = RECONNECT_TRIES; + while(tries--) + { + delay_ms(RECONNECT_TIMEOUT); + discard(); + + if(testConnection()) + return; + } + + abort("Verbindung kann nicht repariert werden"); } void B15F::discard(void) { - try - { - usart.clearOutputBuffer(); - for(uint8_t i = 0; i < 16; i++) - { - usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input) - delay_ms(4); - } - usart.clearInputBuffer(); - } - catch(std::exception& ex) - { - abort(ex); - } + try + { + usart.clearOutputBuffer(); + for(uint8_t i = 0; i < 16; i++) + { + usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input) + delay_ms(4); + } + usart.clearInputBuffer(); + } + catch(std::exception& ex) + { + abort(ex); + } } bool B15F::testConnection() { - // erzeuge zufälliges Byte - srand(time(NULL)); - uint8_t dummy = rand() % 256; - - usart.writeByte(RQ_TEST); - usart.writeByte(dummy); - - uint8_t aw = usart.readByte(); - uint8_t mirror = usart.readByte(); - - return aw == MSG_OK && mirror == dummy; + // erzeuge zufälliges Byte + srand(time(NULL)); + uint8_t dummy = rand() % 256; + + usart.writeByte(RQ_TEST); + usart.writeByte(dummy); + + uint8_t aw = usart.readByte(); + uint8_t mirror = usart.readByte(); + + return aw == MSG_OK && mirror == dummy; } bool B15F::testIntConv() { - srand(time(NULL)); - uint16_t dummy = rand() % (0xFFFF / 3); - - usart.writeByte(RQ_INT); - usart.writeInt(dummy); - - uint16_t aw = usart.readInt(); - return aw == dummy * 3; + srand(time(NULL)); + uint16_t dummy = rand() % (0xFFFF / 3); + + usart.writeByte(RQ_INT); + usart.writeInt(dummy); + + uint16_t aw = usart.readInt(); + return aw == dummy * 3; } std::vector B15F::getBoardInfo(void) { - std::vector info; - - usart.writeByte(RQ_INFO); - - uint8_t n = usart.readByte(); - while(n--) - { - uint8_t len = usart.readByte(); - std::string str; - - while(len--) { - str += static_cast(usart.readByte()); - } - - info.push_back(str); - } - - uint8_t aw = usart.readByte(); - if(aw != MSG_OK) - abort("Board Info fehlerhalft: code " + std::to_string((int) aw)); - - return info; + std::vector info; + + usart.writeByte(RQ_INFO); + + uint8_t n = usart.readByte(); + while(n--) + { + uint8_t len = usart.readByte(); + std::string str; + + while(len--) + { + str += static_cast(usart.readByte()); + } + + info.push_back(str); + } + + uint8_t aw = usart.readByte(); + if(aw != MSG_OK) + abort("Board Info fehlerhalft: code " + std::to_string((int) aw)); + + return info; } bool B15F::activateSelfTestMode() { - usart.writeByte(RQ_ST); - - uint8_t aw = usart.readByte(); - return aw == MSG_OK; + usart.writeByte(RQ_ST); + + uint8_t aw = usart.readByte(); + return aw == MSG_OK; } bool B15F::digitalWrite0(uint8_t port) { - usart.writeByte(RQ_BA0); - usart.writeByte(port); - - uint8_t aw = usart.readByte(); - delay_us(10); - return aw == MSG_OK; + usart.writeByte(RQ_BA0); + usart.writeByte(port); + + uint8_t aw = usart.readByte(); + delay_us(10); + return aw == MSG_OK; } bool B15F::digitalWrite1(uint8_t port) { - usart.writeByte(RQ_BA1); - usart.writeByte(port); - - uint8_t aw = usart.readByte(); - delay_us(10); - return aw == MSG_OK; + usart.writeByte(RQ_BA1); + usart.writeByte(port); + + uint8_t aw = usart.readByte(); + delay_us(10); + return aw == MSG_OK; } uint8_t B15F::digitalRead0() { - usart.clearInputBuffer(); - usart.writeByte(RQ_BE0); - uint8_t byte = usart.readByte(); - delay_us(10); - return byte; + usart.clearInputBuffer(); + usart.writeByte(RQ_BE0); + uint8_t byte = usart.readByte(); + delay_us(10); + return byte; } uint8_t B15F::digitalRead1() { - usart.clearInputBuffer(); - usart.writeByte(RQ_BE1); - uint8_t byte = usart.readByte(); - delay_us(10); - return byte; + usart.clearInputBuffer(); + usart.writeByte(RQ_BE1); + uint8_t byte = usart.readByte(); + delay_us(10); + return byte; } uint8_t B15F::readDipSwitch() { - usart.clearInputBuffer(); - usart.writeByte(RQ_DSW); - uint8_t byte = usart.readByte(); - delay_us(10); - return byte; + usart.clearInputBuffer(); + usart.writeByte(RQ_DSW); + uint8_t byte = usart.readByte(); + delay_us(10); + return byte; } bool B15F::analogWrite0(uint16_t value) { - usart.writeByte(RQ_AA0); - usart.writeInt(value); - - uint8_t aw = usart.readByte(); - delay_us(10); - return aw == MSG_OK; + usart.writeByte(RQ_AA0); + usart.writeInt(value); + + uint8_t aw = usart.readByte(); + delay_us(10); + return aw == MSG_OK; } bool B15F::analogWrite1(uint16_t value) { - usart.writeByte(RQ_AA1); - usart.writeInt(value); - - uint8_t aw = usart.readByte(); - delay_us(10); - return aw == MSG_OK; + usart.writeByte(RQ_AA1); + usart.writeInt(value); + + uint8_t aw = usart.readByte(); + delay_us(10); + return aw == MSG_OK; } uint16_t B15F::analogRead(uint8_t channel) { - usart.clearInputBuffer(); - if(channel > 7) - abort("Bad ADC channel: " + std::to_string(channel)); - - uint8_t rq[] = { - RQ_ADC, - channel - }; - - int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000); - if(n_sent != sizeof(rq)) - abort("Sent failed"); - - uint16_t adc = usart.readInt(); - - if(adc > 1023) - abort("Bad ADC data detected (1)"); - return adc; + usart.clearInputBuffer(); + if(channel > 7) + abort("Bad ADC channel: " + std::to_string(channel)); + + uint8_t rq[] = + { + RQ_ADC, + channel + }; + + int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000); + if(n_sent != sizeof(rq)) + abort("Sent failed"); + + uint16_t adc = usart.readInt(); + + if(adc > 1023) + abort("Bad ADC data detected (1)"); + return adc; } void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count) { - // check pointers - buffer_a += offset_a; - buffer_b += offset_b; - - - usart.clearInputBuffer(); - usart.writeByte(RQ_ADC_DAC_STROKE); - usart.writeByte(channel_a); - usart.writeByte(channel_b); - usart.writeInt(start); - usart.writeInt(static_cast(delta)); - usart.writeInt(count); - - for(uint16_t i = 0; i < count; i++) - { - if(buffer_a) - { - buffer_a[i] = usart.readInt(); - - if(buffer_a[i] > 1023) // check for broken usart connection - abort("Bad ADC data detected (2)"); - } - else - { - usart.readInt(); - } - - if(buffer_b) - { - buffer_b[i] = usart.readInt(); - - if(buffer_b[i] > 1023) // check for broken usart connection - abort("Bad ADC data detected (3)"); - } - else - { - usart.readInt(); - } - } - - uint8_t aw = usart.readByte(); - if(aw != MSG_OK) - abort("Sequenz unterbrochen"); - - delay_us(10); + // check pointers + buffer_a += offset_a; + buffer_b += offset_b; + + + usart.clearInputBuffer(); + usart.writeByte(RQ_ADC_DAC_STROKE); + usart.writeByte(channel_a); + usart.writeByte(channel_b); + usart.writeInt(start); + usart.writeInt(static_cast(delta)); + usart.writeInt(count); + + for(uint16_t i = 0; i < count; i++) + { + if(buffer_a) + { + buffer_a[i] = usart.readInt(); + + if(buffer_a[i] > 1023) // check for broken usart connection + abort("Bad ADC data detected (2)"); + } + else + { + usart.readInt(); + } + + if(buffer_b) + { + buffer_b[i] = usart.readInt(); + + if(buffer_b[i] > 1023) // check for broken usart connection + abort("Bad ADC data detected (3)"); + } + else + { + usart.readInt(); + } + } + + uint8_t aw = usart.readByte(); + if(aw != MSG_OK) + abort("Sequenz unterbrochen"); + + delay_us(10); } void B15F::delay_ms(uint16_t ms) { - std::this_thread::sleep_for(std::chrono::milliseconds(ms)); + std::this_thread::sleep_for(std::chrono::milliseconds(ms)); } void B15F::delay_us(uint16_t us) { - std::this_thread::sleep_for(std::chrono::microseconds(us)); + std::this_thread::sleep_for(std::chrono::microseconds(us)); } - + B15F& B15F::getInstance(void) { - if(!instance) - instance = new B15F(); + if(!instance) + instance = new B15F(); - return *instance; + return *instance; } // https://stackoverflow.com/a/478960 -std::string B15F::exec(std::string cmd) { +std::string B15F::exec(std::string cmd) +{ std::array buffer; std::string result; std::unique_ptr pipe(popen(cmd.c_str(), "r"), pclose); - if (!pipe) { + if (!pipe) + { throw std::runtime_error("popen() failed!"); } - while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) { + while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) + { result += buffer.data(); } return result; @@ -321,22 +326,22 @@ std::string B15F::exec(std::string cmd) { void B15F::abort(std::string msg) { - DriverException ex(msg); - abort(ex); + DriverException ex(msg); + abort(ex); } void B15F::abort(std::exception& ex) { - if(errorhandler) - errorhandler(ex); - else - { - std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl; - std::cout << ex.what() << std::endl; - throw DriverException(ex.what()); - } + if(errorhandler) + errorhandler(ex); + else + { + std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl; + std::cout << ex.what() << std::endl; + throw DriverException(ex.what()); + } } void B15F::setAbortHandler(errorhandler_t func) { - errorhandler = func; + errorhandler = func; } diff --git a/control/src/drv/b15f.h b/control/src/drv/b15f.h index dc06e43..88172ba 100644 --- a/control/src/drv/b15f.h +++ b/control/src/drv/b15f.h @@ -21,216 +21,218 @@ typedef std::function errorhandler_t; +/*! main driver class */ + class B15F { private: - // privater Konstruktor - B15F(void); + // privater Konstruktor + B15F(void); public: - - /************************************* - * Grundfunktionen des B15F Treibers * - *************************************/ - - /** - * Versucht die Verbindung zum B15 wiederherzustellen - * \throws DriverException - */ - void reconnect(void); - - /** - * Verwirft Daten im USART Puffer auf dieser Maschine und B15 - * \throws DriverException - */ - void discard(void); - - /** - * Testet die USART Verbindung auf Funktion - * \throws DriverException - */ - bool testConnection(void); - - /** - * Testet die Integer Konvertierung der USART Verbindung - * \throws DriverException - */ - bool testIntConv(void); - - /** - * Liefert Informationen zur aktuellen Firmware des B15 - * \throws DriverException - */ - std::vector getBoardInfo(void); - - /** - * Lässt den Treiber für eine angegebene Zeit pausieren - * \param ms Verzögerung in Millisekunden - */ - void delay_ms(uint16_t ms); - - /** - * Lässt den Treiber für eine angegebene Zeit pausieren - * \param us Verzögerung in Microsekunden - */ - void delay_us(uint16_t us); - - /** - * Liefert eine Referenz zur aktuellen Treiber-Instanz - * @throws DriverException - */ - static B15F& getInstance(void); - - /** - * Führt ein Befehl auf dieser Maschine aus und liefert stdout zurück - * \param cmd Der Befehl - */ - static std::string exec(std::string cmd); - /** - * Multithread sicherer Abbruch des B15F-Treibers - * \param msg Beschreibung der Abbruchursache - */ - static void abort(std::string msg); + /************************************* + * Grundfunktionen des B15F Treibers * + *************************************/ - /** - * Multithread sicherer Abbruch des B15F-Treibers - * \param ex Exception als Abbruchursache - */ - static void abort(std::exception& ex); + /** + * Versucht die Verbindung zum B15 wiederherzustellen + * \throws DriverException + */ + void reconnect(void); - /** - * Setzt eine Fehlerbehandlungsroutine für den Treiberabbruch (abort) - * \param func Funktion, die Exception als Parameter bekommt - */ - static void setAbortHandler(errorhandler_t func); + /** + * Verwirft Daten im USART Puffer auf dieser Maschine und B15 + * \throws DriverException + */ + void discard(void); - /*************************************/ - - - - /************************* - * Steuerbefehle für B15 * - *************************/ - - /** - * Versetzt das Board in den Selbsttest-Modus - * WICHTIG: Es darf dabei nichts an den Klemmen angeschlossen sein! - * \throws DriverException - */ - bool activateSelfTestMode(void); - - /** - * Setzt den Wert des digitalen Ausgabeports 0 - * \param port Wert für gesamten Port - * \throws DriverException - */ - bool digitalWrite0(uint8_t); - - /** - * Setzt den Wert des digitalen Ausgabeports 1 - * \param port Wert für gesamten Port - * \throws DriverException - */ - bool digitalWrite1(uint8_t); - - /** - * Liest den Wert des digitalen Eingabeports 0 - * \return Wert für gesamten Port - * \throws DriverException - */ - uint8_t digitalRead0(void); - - /** - * Liest den Wert des digitalen Eingabeports 1 - * \return Wert für gesamten Port - * \throws DriverException - */ - uint8_t digitalRead1(void); - - /** - * Liest den Wert des digitalen Eingabeports, an dem der DIP-switch angeschlossen ist (S7) - * \return Wert für gesamten Port - * \throws DriverException - */ - uint8_t readDipSwitch(void); - - /** - * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 0 - * \param port 10-Bit Wert - * \throws DriverException - */ - bool analogWrite0(uint16_t); - - /** - * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 1 - * \param port 10-Bit Wert - * \throws DriverException - */ - bool analogWrite1(uint16_t); - - /** - * Liest den Wert des Analog-Digital-Converters (ADC / ADU) - * \param channel Kanalwahl von 0 - 7 - * \throws DriverException - */ - uint16_t analogRead(uint8_t channel); - - /** - * DAC 0 wird auf den Startwert gesetzt und dann schrittweise um Delta inkrementiert. - * Für jeden eingestelleten DAC-Wert werden zwei ADCs (channel_a und channel_b) angesprochen und die Werte übermittelt. - * Die Werte werden in buffer_a für Kanal a und buffer_b für Kanal b gespeichert. - * \param channel_a Auswahl des ADC a, von 0 - 7 - * \param buffer_a Speichertort für Werte des Kanals a - * \param offset_a Anzahl an Werten des Kanals a, die im Speicher übersprungen werden sollen - * \param channel_b Auswahl des ADC b, von 0 - 7 - * \param buffer_b Speichertort für Werte des Kanals b - * \param offset_b Anzahl an Werten des Kanals b, die im Speicher übersprungen werden - * \param start Startwert des DACs - * \param delta Schrittweite, mit welcher der DAC inkrementiert wird - * \param count Anzahl an Inkrementierungen - * \throws DriverException - */ - void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count); - - /*************************/ + /** + * Testet die USART Verbindung auf Funktion + * \throws DriverException + */ + bool testConnection(void); + + /** + * Testet die Integer Konvertierung der USART Verbindung + * \throws DriverException + */ + bool testIntConv(void); + + /** + * Liefert Informationen zur aktuellen Firmware des B15 + * \throws DriverException + */ + std::vector getBoardInfo(void); + + /** + * Lässt den Treiber für eine angegebene Zeit pausieren + * \param ms Verzögerung in Millisekunden + */ + void delay_ms(uint16_t ms); + + /** + * Lässt den Treiber für eine angegebene Zeit pausieren + * \param us Verzögerung in Microsekunden + */ + void delay_us(uint16_t us); + + /** + * Liefert eine Referenz zur aktuellen Treiber-Instanz + * @throws DriverException + */ + static B15F& getInstance(void); + + /** + * Führt ein Befehl auf dieser Maschine aus und liefert stdout zurück + * \param cmd Der Befehl + */ + static std::string exec(std::string cmd); + + /** + * Multithread sicherer Abbruch des B15F-Treibers + * \param msg Beschreibung der Abbruchursache + */ + static void abort(std::string msg); + + /** + * Multithread sicherer Abbruch des B15F-Treibers + * \param ex Exception als Abbruchursache + */ + static void abort(std::exception& ex); + + /** + * Setzt eine Fehlerbehandlungsroutine für den Treiberabbruch (abort) + * \param func Funktion, die Exception als Parameter bekommt + */ + static void setAbortHandler(errorhandler_t func); + + /*************************************/ - // CONSTANTS - const std::string PRE = "[B15F] "; - constexpr static uint8_t MSG_OK = 0xFF; - constexpr static uint8_t MSG_FAIL = 0xFE; - constexpr static uint16_t RECONNECT_TIMEOUT = 64; // ms - constexpr static uint16_t WDT_TIMEOUT = 15; // ms - constexpr static uint8_t RECONNECT_TRIES = 3; - constexpr static uint32_t BAUDRATE = 57600; + + /************************* + * Steuerbefehle für B15 * + *************************/ + + /** + * Versetzt das Board in den Selbsttest-Modus + * WICHTIG: Es darf dabei nichts an den Klemmen angeschlossen sein! + * \throws DriverException + */ + bool activateSelfTestMode(void); + + /** + * Setzt den Wert des digitalen Ausgabeports 0 + * \param port Wert für gesamten Port + * \throws DriverException + */ + bool digitalWrite0(uint8_t); + + /** + * Setzt den Wert des digitalen Ausgabeports 1 + * \param port Wert für gesamten Port + * \throws DriverException + */ + bool digitalWrite1(uint8_t); + + /** + * Liest den Wert des digitalen Eingabeports 0 + * \return Wert für gesamten Port + * \throws DriverException + */ + uint8_t digitalRead0(void); + + /** + * Liest den Wert des digitalen Eingabeports 1 + * \return Wert für gesamten Port + * \throws DriverException + */ + uint8_t digitalRead1(void); + + /** + * Liest den Wert des digitalen Eingabeports, an dem der DIP-switch angeschlossen ist (S7) + * \return Wert für gesamten Port + * \throws DriverException + */ + uint8_t readDipSwitch(void); + + /** + * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 0 + * \param port 10-Bit Wert + * \throws DriverException + */ + bool analogWrite0(uint16_t port); + + /** + * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 1 + * \param port 10-Bit Wert + * \throws DriverException + */ + bool analogWrite1(uint16_t port); + + /** + * Liest den Wert des Analog-Digital-Converters (ADC / ADU) + * \param channel Kanalwahl von 0 - 7 + * \throws DriverException + */ + uint16_t analogRead(uint8_t channel); + + /** + * DAC 0 wird auf den Startwert gesetzt und dann schrittweise um Delta inkrementiert. + * Für jeden eingestelleten DAC-Wert werden zwei ADCs (channel_a und channel_b) angesprochen und die Werte übermittelt. + * Die Werte werden in buffer_a für Kanal a und buffer_b für Kanal b gespeichert. + * \param channel_a Auswahl des ADC a, von 0 - 7 + * \param buffer_a Speichertort für Werte des Kanals a + * \param offset_a Anzahl an Werten des Kanals a, die im Speicher übersprungen werden sollen + * \param channel_b Auswahl des ADC b, von 0 - 7 + * \param buffer_b Speichertort für Werte des Kanals b + * \param offset_b Anzahl an Werten des Kanals b, die im Speicher übersprungen werden + * \param start Startwert des DACs + * \param delta Schrittweite, mit welcher der DAC inkrementiert wird + * \param count Anzahl an Inkrementierungen + * \throws DriverException + */ + void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count); + + /*************************/ + + + // CONSTANTS + const std::string PRE = "[B15F] "; //!< B15F stdout prefix + constexpr static uint8_t MSG_OK = 0xFF; //!< Value to acknowledge a received command + constexpr static uint8_t MSG_FAIL = 0xFE; //!< Value to reject a received command + constexpr static uint16_t RECONNECT_TIMEOUT = 64; //!< Time in ms after which a reconnect attempt aborts + constexpr static uint16_t WDT_TIMEOUT = 15; //!< Time in ms after which the watch dog timer resets the MCU + constexpr static uint8_t RECONNECT_TRIES = 3; //!< Maximum count of reconnect attempts after which the driver stops + constexpr static uint32_t BAUDRATE = 57600; //!< USART baudrate for communication with the MCU private: - - /** - * Initialisiert und testet die Verbindung zum B15 - * \throws DriverException - */ - void init(void); - USART usart; - static B15F* instance; - static errorhandler_t errorhandler; - - // REQUESTS - constexpr static uint8_t RQ_DISC = 0; - constexpr static uint8_t RQ_TEST = 1; - constexpr static uint8_t RQ_INFO = 2; - constexpr static uint8_t RQ_INT = 3; - constexpr static uint8_t RQ_ST = 4; - constexpr static uint8_t RQ_BA0 = 5; - constexpr static uint8_t RQ_BA1 = 6; - constexpr static uint8_t RQ_BE0 = 7; - constexpr static uint8_t RQ_BE1 = 8; - constexpr static uint8_t RQ_DSW = 9; - constexpr static uint8_t RQ_AA0 = 10; - constexpr static uint8_t RQ_AA1 = 11; - constexpr static uint8_t RQ_ADC = 12; - constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; + /** + * Initialisiert und testet die Verbindung zum B15 + * \throws DriverException + */ + void init(void); + + USART usart; + static B15F* instance; + static errorhandler_t errorhandler; + + // REQUESTS + constexpr static uint8_t RQ_DISC = 0; + constexpr static uint8_t RQ_TEST = 1; + constexpr static uint8_t RQ_INFO = 2; + constexpr static uint8_t RQ_INT = 3; + constexpr static uint8_t RQ_ST = 4; + constexpr static uint8_t RQ_BA0 = 5; + constexpr static uint8_t RQ_BA1 = 6; + constexpr static uint8_t RQ_BE0 = 7; + constexpr static uint8_t RQ_BE1 = 8; + constexpr static uint8_t RQ_DSW = 9; + constexpr static uint8_t RQ_AA0 = 10; + constexpr static uint8_t RQ_AA1 = 11; + constexpr static uint8_t RQ_ADC = 12; + constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; }; #endif // B15F_H diff --git a/control/src/drv/dot.cpp b/control/src/drv/dot.cpp index 29e80fd..0edb0b4 100644 --- a/control/src/drv/dot.cpp +++ b/control/src/drv/dot.cpp @@ -2,21 +2,21 @@ Dot::Dot(uint16_t x, uint16_t y, uint8_t curve) : x(x), y(y), curve(curve) { - if(curve >= 64) - throw std::range_error("Kurvenindex muss im Bereich [0, 63] liegen"); + if(curve >= 64) + throw std::range_error("Kurvenindex muss im Bereich [0, 63] liegen"); } uint16_t Dot::getX() const { - return x; + return x; } uint16_t Dot::getY() const { - return y; + return y; } uint8_t Dot::getCurve(void) const { - return curve; + return curve; } diff --git a/control/src/drv/dot.h b/control/src/drv/dot.h index 3f2b7f0..48f3493 100644 --- a/control/src/drv/dot.h +++ b/control/src/drv/dot.h @@ -4,17 +4,37 @@ #include #include +/** + * Immutable dot class with x and y coordinate and curve index. + * Dots with the same curve index get the same color by plotty. + */ + class Dot { public: - Dot(uint16_t x, uint16_t y, uint8_t curve); - uint16_t getX(void) const; - uint16_t getY(void) const; - uint8_t getCurve(void) const; - + /** + * Constructor with x and y coordinate and curve index. + */ + Dot(uint16_t x, uint16_t y, uint8_t curve); + + /** + * Returns the x coordinate. + */ + uint16_t getX(void) const; + + /** + * Returns the y coordinate. + */ + uint16_t getY(void) const; + + /** + * Returns the curve index. + */ + uint8_t getCurve(void) const; + private: - uint16_t x, y; - uint8_t curve; + uint16_t x, y; + uint8_t curve; }; diff --git a/control/src/drv/driverexception.h b/control/src/drv/driverexception.h index 18a88a9..cc6764b 100644 --- a/control/src/drv/driverexception.h +++ b/control/src/drv/driverexception.h @@ -5,28 +5,30 @@ // SOURCE: https://stackoverflow.com/a/8152888 +/*! Exception driver problems, for instance incompatible firmware version. */ + class DriverException: public std::exception { public: - explicit DriverException(const char* message) : msg_(message) - { - } + explicit DriverException(const char* message) : msg_(message) + { + } - explicit DriverException(const std::string& message) : msg_(message) - { - } + explicit DriverException(const std::string& message) : msg_(message) + { + } - virtual ~DriverException() throw () - { - } + virtual ~DriverException() throw () + { + } - virtual const char* what() const throw () - { - return msg_.c_str(); - } + virtual const char* what() const throw () + { + return msg_.c_str(); + } protected: - std::string msg_; + std::string msg_; }; #endif // DRIVEREXCEPTION_H diff --git a/control/src/drv/plottyfile.cpp b/control/src/drv/plottyfile.cpp index 1f2b955..c236531 100644 --- a/control/src/drv/plottyfile.cpp +++ b/control/src/drv/plottyfile.cpp @@ -2,197 +2,197 @@ void PlottyFile::addDot(Dot& dot) { - dots.push_back(dot); + dots.push_back(dot); } void PlottyFile::addDot(Dot dot) { - dots.push_back(dot); + dots.push_back(dot); } void PlottyFile::setFunctionType(FunctionType function_type) { - this->function_type = function_type; + this->function_type = function_type; } void PlottyFile::setQuadrant(uint8_t quadrant) { - if(quadrant < 1 || quadrant > 4) - throw std::range_error("Ungueltiger Quadrant"); - this->quadrant = quadrant; + if(quadrant < 1 || quadrant > 4) + throw std::range_error("Ungueltiger Quadrant"); + this->quadrant = quadrant; } void PlottyFile::setRefX(uint16_t ref_x) { - this->ref_x = ref_x; + this->ref_x = ref_x; } void PlottyFile::setRefY(uint16_t ref_y) { - this->ref_y = ref_y; + this->ref_y = ref_y; } void PlottyFile::setParaFirstCurve(uint16_t para_first) { - this->para_first = para_first; + this->para_first = para_first; } void PlottyFile::setParaStepWidth(uint16_t para_stepwidth) { - this->para_stepwidth = para_stepwidth; + this->para_stepwidth = para_stepwidth; } void PlottyFile::setUnitX(std::string unit_x) { - this->unit_x = unit_x; + this->unit_x = unit_x; } void PlottyFile::setDescX(std::string desc_x) { - this->desc_x = desc_x; + this->desc_x = desc_x; } void PlottyFile::setUnitY(std::string unit_y) { - this->unit_y = unit_y; + this->unit_y = unit_y; } void PlottyFile::setDescY(std::string desc_y) { - this->desc_y = desc_y; + this->desc_y = desc_y; } void PlottyFile::setUnitPara(std::string unit_para) { - this->unit_para = unit_para; + this->unit_para = unit_para; } void PlottyFile::setDescPara(std::string desc_para) { - this->desc_para = desc_para; + this->desc_para = desc_para; } - + FunctionType PlottyFile::getFunctionType() const { - return function_type; + return function_type; } uint8_t PlottyFile::getQuadrant() const { - return quadrant; + return quadrant; } uint16_t PlottyFile::getRefX() const { - return ref_x; + return ref_x; } uint16_t PlottyFile::getRefY() const { - return ref_y; + return ref_y; } uint16_t PlottyFile::getParaFirstCurve() const { - return para_first; + return para_first; } uint16_t PlottyFile::getParaStepWidth() const { - return para_stepwidth; + return para_stepwidth; } std::string PlottyFile::getUnitX() const { - return unit_x; + return unit_x; } std::string PlottyFile::getDescX() const { - return desc_x; + return desc_x; } std::string PlottyFile::getUnitY() const { - return unit_y; + return unit_y; } std::string PlottyFile::getDescY() const { - return desc_y; + return desc_y; } std::string PlottyFile::getUnitPara() const { - return unit_para; + return unit_para; } std::string PlottyFile::getDescPara() const { - return desc_para; + return desc_para; } void PlottyFile::prepStr(std::string& str, uint8_t len) { - if(str.length() > len) - throw std::runtime_error("Zu grosser String."); - - if(str.length() != len) - str += '\n'; - - while(str.length() < len) - str += '\0'; + if(str.length() > len) + throw std::runtime_error("Zu grosser String."); + + if(str.length() != len) + str += '\n'; + + while(str.length() < len) + str += '\0'; } void PlottyFile::writeToFile(std::string filename) -{ - prepStr(unit_x, STR_LEN_SHORT); - prepStr(desc_x, STR_LEN_LARGE); - prepStr(unit_y, STR_LEN_SHORT); - prepStr(desc_y, STR_LEN_LARGE); - prepStr(unit_para, STR_LEN_SHORT); - prepStr(desc_para, STR_LEN_LARGE); - - std::ofstream file(filename); - - // write file header - file.write(reinterpret_cast(&command), 1); - file.write(head.c_str(), head.length()); - file.write(filetype.c_str(), filetype.length()); - file.write(reinterpret_cast(&version), 2); - file.write(reinterpret_cast(&subversion), 2); - file.put(static_cast(function_type)); - file.write(reinterpret_cast(&quadrant), 1); - file.write(reinterpret_cast(&ref_x), 2); - file.write(reinterpret_cast(&ref_y), 2); - file.write(reinterpret_cast(¶_first), 2); - file.write(reinterpret_cast(¶_stepwidth), 2); - file.write(unit_x.c_str(), unit_x.length()); - file.write(desc_x.c_str(), desc_x.length()); - file.write(unit_y.c_str(), unit_y.length()); - file.write(desc_y.c_str(), desc_y.length()); - file.write(unit_para.c_str(), unit_para.length()); - file.write(desc_para.c_str(), desc_para.length()); - file.write(reinterpret_cast(&eof), 1); - - // make sure header size is 256 Byte - while(file.tellp() < 256) - file.put(0); - - for(Dot& dot : dots) - { - file.put((dot.getX() >> 8) | (static_cast(dot.getCurve()) << 2)); - file.put(dot.getX() & 0xFF); - file.put(dot.getY() >> 8); - file.put(dot.getY() & 0xFF); - } - - file.close(); +{ + prepStr(unit_x, STR_LEN_SHORT); + prepStr(desc_x, STR_LEN_LARGE); + prepStr(unit_y, STR_LEN_SHORT); + prepStr(desc_y, STR_LEN_LARGE); + prepStr(unit_para, STR_LEN_SHORT); + prepStr(desc_para, STR_LEN_LARGE); + + std::ofstream file(filename); + + // write file header + file.write(reinterpret_cast(&command), 1); + file.write(head.c_str(), head.length()); + file.write(filetype.c_str(), filetype.length()); + file.write(reinterpret_cast(&version), 2); + file.write(reinterpret_cast(&subversion), 2); + file.put(static_cast(function_type)); + file.write(reinterpret_cast(&quadrant), 1); + file.write(reinterpret_cast(&ref_x), 2); + file.write(reinterpret_cast(&ref_y), 2); + file.write(reinterpret_cast(¶_first), 2); + file.write(reinterpret_cast(¶_stepwidth), 2); + file.write(unit_x.c_str(), unit_x.length()); + file.write(desc_x.c_str(), desc_x.length()); + file.write(unit_y.c_str(), unit_y.length()); + file.write(desc_y.c_str(), desc_y.length()); + file.write(unit_para.c_str(), unit_para.length()); + file.write(desc_para.c_str(), desc_para.length()); + file.write(reinterpret_cast(&eof), 1); + + // make sure header size is 256 Byte + while(file.tellp() < 256) + file.put(0); + + for(Dot& dot : dots) + { + file.put((dot.getX() >> 8) | (static_cast(dot.getCurve()) << 2)); + file.put(dot.getX() & 0xFF); + file.put(dot.getY() >> 8); + file.put(dot.getY() & 0xFF); + } + + file.close(); } void PlottyFile::startPlotty(std::string filename) { - int code = system(("plotty --in " + filename).c_str()); - if(code) - throw std::runtime_error("Fehler beim Aufruf von plotty"); + int code = system(("plotty --in " + filename).c_str()); + if(code) + throw std::runtime_error("Fehler beim Aufruf von plotty"); } diff --git a/control/src/drv/plottyfile.h b/control/src/drv/plottyfile.h index 17b02eb..6197bf2 100644 --- a/control/src/drv/plottyfile.h +++ b/control/src/drv/plottyfile.h @@ -9,71 +9,200 @@ enum FunctionType { - CurveFamily = 'S', - Curve = 'C', - Level = 'P' -}; + CurveFamily = 'S', + Curve = 'C', + Level = 'P' +}; + +/*! Wrapper class for convenient plot file creation, needed to display graphs using plotty. */ class PlottyFile { public: - void addDot(Dot& dot); - void addDot(Dot dot); - - void setFunctionType(FunctionType); - void setQuadrant(uint8_t); - void setRefX(uint16_t); - void setRefY(uint16_t); - void setParaFirstCurve(uint16_t); - void setParaStepWidth(uint16_t); - void setUnitX(std::string); - void setDescX(std::string); - void setUnitY(std::string); - void setDescY(std::string); - void setUnitPara(std::string); - void setDescPara(std::string); - - FunctionType getFunctionType(void) const; - uint8_t getQuadrant(void) const; - uint16_t getRefX(void) const; - uint16_t getRefY(void) const; - uint16_t getParaFirstCurve(void) const; - uint16_t getParaStepWidth(void) const; - std::string getUnitX(void) const; - std::string getDescX(void) const; - std::string getUnitY(void) const; - std::string getDescY(void) const; - std::string getUnitPara(void) const; - std::string getDescPara(void) const; - - void writeToFile(std::string filename); - void startPlotty(std::string filename); + /** + * Adds a dot to the plotty file. + * \param dot the dot + */ + void addDot(Dot& dot); + + /** + * Adds a dot by reference to the plotty file. + * \param dot the dot + */ + void addDot(Dot dot); + + /** + * Sets the FunctionType of this plotty file. + * \param function_type enum value + */ + void setFunctionType(FunctionType function_type); + + /** + * Sets the quadrant of this plot. + * \param quadrant quadrant number (1..4) + */ + void setQuadrant(uint8_t quadrant); + + /** + * Sets reference (max) value of the x axis + * \param ref_x reference value + */ + void setRefX(uint16_t ref_x); + + /** + * Sets reference (max) value of the y axis + * \param ref_y reference value + */ + void setRefY(uint16_t ref_y); + + /** + * Sets initial value of the parameter. + * Gets used together with the stepwith to label the curves. + * \param para_first initial parameter value + */ + void setParaFirstCurve(uint16_t para_first); + + /** + * Sets the stepwith the parameter got increased with each curve. + * \param para_first parameter stepwith + */ + void setParaStepWidth(uint16_t para_stepwidth); + + /** + * Sets the unit of the x axis. + * \param para_first unit + */ + void setUnitX(std::string unit_x); + + /** + * Sets the description of the x axis. + * \param para_first description + */ + void setDescX(std::string desc_x); + + /** + * Sets the unit of the y axis. + * \param para_first unit + */ + void setUnitY(std::string unit_y); + + /** + * Sets the description of the y axis. + * \param para_first description + */ + void setDescY(std::string desc_y); + + /** + * Sets the unit of the parameter. + * \param para_first unit + */ + void setUnitPara(std::string unit_para); + /** + * Sets the description of the parameter. + * \param para_first description + */ + void setDescPara(std::string desc_para); + + + + /** + * \return the FunctionType + */ + FunctionType getFunctionType(void) const; + + /** + * \return the quadrant + */ + uint8_t getQuadrant(void) const; + + /** + * \return x reference (max) value + */ + uint16_t getRefX(void) const; + + /** + * \return y reference (max) value + */ + uint16_t getRefY(void) const; + + /** + * \return initial parameter value + */ + uint16_t getParaFirstCurve(void) const; + + /** + * \return parameter stepwith + */ + uint16_t getParaStepWidth(void) const; + + /** + * \return unit of x axis + */ + std::string getUnitX(void) const; + + /** + * \return description of x axis + */ + std::string getDescX(void) const; + + /** + * \return unit of y axis + */ + std::string getUnitY(void) const; + + /** + * \return description of y axis + */ + std::string getDescY(void) const; + + /** + * \return unit of parameter + */ + std::string getUnitPara(void) const; + + /** + * \return description of parameter + */ + std::string getDescPara(void) const; + + + /** + * Saves the PlottyFile in a binary format, ready to open with plotty. + * \param filename desired plot path + */ + void writeToFile(std::string filename); + + /** + * Starts plotty with a plot file. + * \param filename plot path + */ + void startPlotty(std::string filename); private: - void prepStr(std::string& str, uint8_t len); + void prepStr(std::string& str, uint8_t len); - std::vector dots; + std::vector dots; - int8_t command = 0x1D; - const std::string head = "HTWK-HWLab"; - const std::string filetype = "MD"; - int16_t version = 1; - int16_t subversion = 0; - FunctionType function_type = FunctionType::Curve; - uint8_t quadrant = 1; - uint16_t ref_x = 1023; - uint16_t ref_y = 1023; - uint16_t para_first = 1; - uint16_t para_stepwidth = 1; - std::string unit_x; - std::string desc_x; - std::string unit_y; - std::string desc_y; - std::string unit_para; - std::string desc_para; - const uint8_t eof = 0xD; - - constexpr static uint8_t STR_LEN_SHORT = 10; - constexpr static uint8_t STR_LEN_LARGE = 20; + int8_t command = 0x1D; + const std::string head = "HTWK-HWLab"; + const std::string filetype = "MD"; + int16_t version = 1; + int16_t subversion = 0; + FunctionType function_type = FunctionType::Curve; + uint8_t quadrant = 1; + uint16_t ref_x = 1023; + uint16_t ref_y = 1023; + uint16_t para_first = 1; + uint16_t para_stepwidth = 1; + std::string unit_x; + std::string desc_x; + std::string unit_y; + std::string desc_y; + std::string unit_para; + std::string desc_para; + const uint8_t eof = 0xD; + + constexpr static uint8_t STR_LEN_SHORT = 10; + constexpr static uint8_t STR_LEN_LARGE = 20; }; #endif // PLOTTYFILE_H diff --git a/control/src/drv/timeoutexception.h b/control/src/drv/timeoutexception.h index 159ec7b..a0be40f 100644 --- a/control/src/drv/timeoutexception.h +++ b/control/src/drv/timeoutexception.h @@ -5,31 +5,33 @@ // SOURCE: https://stackoverflow.com/a/8152888 +/*! Exception for USART related timeouts. */ + class TimeoutException: public std::exception { public: - explicit TimeoutException(const char* message, int timeout) : TimeoutException(std::string(message), timeout) - { - } + explicit TimeoutException(const char* message, int timeout) : TimeoutException(std::string(message), timeout) + { + } - explicit TimeoutException(const std::string& message, int timeout) : msg(message), m_timeout(timeout) - { - if(!msg.length()) - msg = "Timeout reached (" + std::to_string(m_timeout) + ")"; - } + explicit TimeoutException(const std::string& message, int timeout) : msg(message), m_timeout(timeout) + { + if(!msg.length()) + msg = "Timeout reached (" + std::to_string(m_timeout) + ")"; + } - virtual ~TimeoutException() throw () - { - } + virtual ~TimeoutException() throw () + { + } - virtual const char* what() const throw () - { - return msg.c_str(); - } + virtual const char* what() const throw () + { + return msg.c_str(); + } protected: - std::string msg; - int m_timeout; + std::string msg; + int m_timeout; }; #endif // TIMEOUTEXCEPTION_H diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index a18de62..dcc7dd9 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -2,323 +2,324 @@ void USART::openDevice(std::string device) { - file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY /* | O_NONBLOCK*/); - if(file_desc <= 0) - throw USARTException("Fehler beim Öffnen des Gerätes"); - - struct termios options; - int code = tcgetattr(file_desc, &options); - if(code) - throw USARTException("Fehler beim Lesen der Geräteparameter"); - - options.c_cflag = CS8 | CLOCAL | CREAD; - options.c_iflag = IGNPAR; - options.c_oflag = 0; - options.c_lflag = 0; - options.c_cc[VMIN] = 0; // #bytes read returns at least - options.c_cc[VTIME] = timeout; + file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY /* | O_NONBLOCK*/); + if(file_desc <= 0) + throw USARTException("Fehler beim Öffnen des Gerätes"); + + struct termios options; + int code = tcgetattr(file_desc, &options); + if(code) + throw USARTException("Fehler beim Lesen der Geräteparameter"); + + options.c_cflag = CS8 | CLOCAL | CREAD; + options.c_iflag = IGNPAR; + options.c_oflag = 0; + options.c_lflag = 0; + options.c_cc[VMIN] = 0; // #bytes read returns at least + options.c_cc[VTIME] = timeout; code = cfsetspeed(&options, baudrate); - if(code) - throw USARTException("Fehler beim Setzen der Baudrate"); - - code = tcsetattr(file_desc, TCSANOW, &options); - if(code) - throw USARTException("Fehler beim Setzen der Geräteparameter"); - - clearOutputBuffer(); - clearInputBuffer(); + if(code) + throw USARTException("Fehler beim Setzen der Baudrate"); + + code = tcsetattr(file_desc, TCSANOW, &options); + if(code) + throw USARTException("Fehler beim Setzen der Geräteparameter"); + + clearOutputBuffer(); + clearInputBuffer(); } - + void USART::closeDevice() { - int code = close(file_desc); - if(code) - throw USARTException("Fehler beim Schließen des Gerätes"); + int code = close(file_desc); + if(code) + throw USARTException("Fehler beim Schließen des Gerätes"); } - + void USART::clearInputBuffer() { - int code = tcflush(file_desc, TCIFLUSH); - if(code) - throw USARTException("Fehler beim Leeren des Eingangspuffers"); + int code = tcflush(file_desc, TCIFLUSH); + if(code) + throw USARTException("Fehler beim Leeren des Eingangspuffers"); } - + void USART::clearOutputBuffer() { - int code = tcflush(file_desc, TCOFLUSH); - if(code) - throw USARTException("Fehler beim Leeren des Ausgangspuffers"); + int code = tcflush(file_desc, TCOFLUSH); + if(code) + throw USARTException("Fehler beim Leeren des Ausgangspuffers"); } - + void USART::flushOutputBuffer() { - int code = tcdrain(file_desc); - if(code) - throw USARTException("Fehler beim Versenden des Ausgangspuffers"); + int code = tcdrain(file_desc); + if(code) + throw USARTException("Fehler beim Versenden des Ausgangspuffers"); } void USART::printStatistics() { - double pz = 1e2 * n_blocks_failed / n_blocks_total; - pz = std::round(pz * 1e2) / 1e2; - std::cout << "blocks total: " << n_blocks_total << " ok: " << (n_blocks_total - n_blocks_failed) << " failed: " << n_blocks_failed << " (" << pz << "%)" << std::endl; + double pz = 1e2 * n_blocks_failed / n_blocks_total; + pz = std::round(pz * 1e2) / 1e2; + std::cout << "blocks total: " << n_blocks_total << " ok: " << (n_blocks_total - n_blocks_failed) << " failed: " << n_blocks_failed << " (" << pz << "%)" << std::endl; } void USART::writeByte(uint8_t b) { - int sent = write(file_desc, &b, 1); - if(sent != 1) - { - std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl; - usleep(100000); - sent = write(file_desc, &b, 1); - if(sent != 1) - throw USARTException("Fehler beim Senden: writeByte()"); - } - + int sent = write(file_desc, &b, 1); + if(sent != 1) + { + std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl; + usleep(100000); + sent = write(file_desc, &b, 1); + if(sent != 1) + throw USARTException("Fehler beim Senden: writeByte()"); + } + } - + void USART::writeInt(uint16_t d) { - int sent = write(file_desc, reinterpret_cast(&d), 2); - if(sent != 2) - throw USARTException("Fehler beim Senden: writeInt()"); + int sent = write(file_desc, reinterpret_cast(&d), 2); + if(sent != 2) + throw USARTException("Fehler beim Senden: writeInt()"); } int USART::read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout) { - uint32_t elapsed = 0; - int n_read = -1; - auto start = std::chrono::steady_clock::now(); - auto end = start; - while(elapsed < timeout) - { - n_read = read(file_desc, buffer + offset, len); - if (n_read == len) - return n_read; - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - - return 0; + uint32_t elapsed = 0; + int n_read = -1; + auto start = std::chrono::steady_clock::now(); + auto end = start; + while(elapsed < timeout) + { + n_read = read(file_desc, buffer + offset, len); + if (n_read == len) + return n_read; + + end = std::chrono::steady_clock::now(); + elapsed = std::chrono::duration_cast(end - start).count(); + } + + return 0; } int USART::write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout) { - uint32_t elapsed = 0; - int n_sent = -1; - auto start = std::chrono::steady_clock::now(); - auto end = start; - while(elapsed < timeout) - { - n_sent = write(file_desc, buffer + offset, len); - flushOutputBuffer(); - if (n_sent == len) - return n_sent; - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - - return n_sent; + uint32_t elapsed = 0; + int n_sent = -1; + auto start = std::chrono::steady_clock::now(); + auto end = start; + while(elapsed < timeout) + { + n_sent = write(file_desc, buffer + offset, len); + flushOutputBuffer(); + if (n_sent == len) + return n_sent; + + end = std::chrono::steady_clock::now(); + elapsed = std::chrono::duration_cast(end - start).count(); + } + + return n_sent; } void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len) { - uint8_t crc; - uint8_t aw; - const uint16_t us_per_bit = (1000000 / baudrate) * 16; - const uint16_t n_total = len + 3; - - n_blocks_total++; - bool failed = false; - - do - { - // calc crc - crc = 0; - for(uint8_t i = 0; i < len; i++) - { - crc ^= buffer[i]; - for (uint8_t k = 0; k < 8; k++) - { - if (crc & 1) - crc ^= CRC7_POLY; - crc >>= 1; - } - } - - // construct block - block_buffer[0] = len; - std::memcpy(&block_buffer[1], buffer + offset, len); - block_buffer[len + 1] = crc; - block_buffer[len + 2] = BLOCK_END; - - // send block - clearOutputBuffer(); - clearInputBuffer(); - int n_sent = write_timeout(&block_buffer[0], 0, len + 3, us_per_bit * n_total); - if(n_sent != n_total) - throw std::runtime_error("fatal (send): " + std::to_string(n_sent)); - - /*for(uint8_t i = 0; i < len + 3; i++) - { - write_timeout(&block_buffer[i], 0, 1, us_per_bit * n_total); - //tcdrain(file_desc); - //usleep(1000); - }*/ - - // flush output data - tcdrain(file_desc); - - //usleep(us_per_bit * n_total * 10); - - // check response - int n_read = read_timeout(&aw, 0, 1, us_per_bit * n_blocks_total * 10); - for(uint16_t i = 0; i < 255 && n_read != 1; i++) - { - writeByte(0x80); // Stoppzeichen für Block - if(tcdrain(file_desc)) - { - std::cout << "drain failed" << std::endl; - } - std::cout << "WARNING: read error (" << n_read << "), retry #" << (int) i << std::endl; - usleep(us_per_bit*100); - n_read = read_timeout(&aw, 0, 1, us_per_bit); - } - - if(n_read != 1) - throw std::runtime_error("fatal: " + std::to_string(n_read)); - - //clearInputBuffer(); - - if(aw != 0xFF) { - if(!failed) - n_blocks_failed++; - failed = true; - std::cout << "block failed, retry" << std::endl; - } - } - while(aw != 0xFF); - - //std::cout << "OK" << std::endl; + uint8_t crc; + uint8_t aw; + const uint16_t us_per_bit = (1000000 / baudrate) * 16; + const uint16_t n_total = len + 3; + + n_blocks_total++; + bool failed = false; + + do + { + // calc crc + crc = 0; + for(uint8_t i = 0; i < len; i++) + { + crc ^= buffer[i]; + for (uint8_t k = 0; k < 8; k++) + { + if (crc & 1) + crc ^= CRC7_POLY; + crc >>= 1; + } + } + + // construct block + block_buffer[0] = len; + std::memcpy(&block_buffer[1], buffer + offset, len); + block_buffer[len + 1] = crc; + block_buffer[len + 2] = BLOCK_END; + + // send block + clearOutputBuffer(); + clearInputBuffer(); + int n_sent = write_timeout(&block_buffer[0], 0, len + 3, us_per_bit * n_total); + if(n_sent != n_total) + throw std::runtime_error("fatal (send): " + std::to_string(n_sent)); + + /*for(uint8_t i = 0; i < len + 3; i++) + { + write_timeout(&block_buffer[i], 0, 1, us_per_bit * n_total); + //tcdrain(file_desc); + //usleep(1000); + }*/ + + // flush output data + tcdrain(file_desc); + + //usleep(us_per_bit * n_total * 10); + + // check response + int n_read = read_timeout(&aw, 0, 1, us_per_bit * n_blocks_total * 10); + for(uint16_t i = 0; i < 255 && n_read != 1; i++) + { + writeByte(0x80); // Stoppzeichen für Block + if(tcdrain(file_desc)) + { + std::cout << "drain failed" << std::endl; + } + std::cout << "WARNING: read error (" << n_read << "), retry #" << (int) i << std::endl; + usleep(us_per_bit*100); + n_read = read_timeout(&aw, 0, 1, us_per_bit); + } + + if(n_read != 1) + throw std::runtime_error("fatal: " + std::to_string(n_read)); + + //clearInputBuffer(); + + if(aw != 0xFF) + { + if(!failed) + n_blocks_failed++; + failed = true; + std::cout << "block failed, retry" << std::endl; + } + } + while(aw != 0xFF); + + //std::cout << "OK" << std::endl; } - + uint8_t USART::readByte(void) { - char b; - auto start = std::chrono::steady_clock::now(); - auto end = start; - uint16_t elapsed = 0; - while(elapsed < timeout * 100) - { - int code = read(file_desc, &b, 1); - if (code > 0) - return static_cast(b); - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - - throw TimeoutException("Verbindung unterbrochen.", timeout); + char b; + auto start = std::chrono::steady_clock::now(); + auto end = start; + uint16_t elapsed = 0; + while(elapsed < timeout * 100) + { + int code = read(file_desc, &b, 1); + if (code > 0) + return static_cast(b); + + end = std::chrono::steady_clock::now(); + elapsed = std::chrono::duration_cast(end - start).count(); + } + + throw TimeoutException("Verbindung unterbrochen.", timeout); } uint16_t USART::readInt(void) { - return readByte() | readByte() << 8; + return readByte() | readByte() << 8; } bool USART::readBlock(uint8_t* buffer, uint16_t offset) { - uint8_t len = readByte(); - uint8_t crc = 0; - buffer += offset; - - uint32_t block_timeout = timeout / 10; - - // wait for block - int n_ready; - uint16_t elapsed = 0; - auto start = std::chrono::steady_clock::now(); - auto end = start; - while(elapsed < block_timeout) - { - int code = ioctl(file_desc, FIONREAD, &n_ready); - if(code != 0) - { - std::cout << "n_ready code: " << code << std::endl; - return false; - } - - if(n_ready >= len + 1) - break; - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - if(elapsed >= timeout) - { - std::cout << "block timeout: " << std::endl; - return false; - } - - while(len--) - { - *buffer = readByte(); - - crc ^= *buffer++; - for (uint8_t i = 0; i < 8; i++) - { - if (crc & 1) - crc ^= CRC7_POLY; - crc >>= 1; - } - } - - crc ^= readByte(); - for (uint8_t i = 0; i < 8; i++) - { - if (crc & 1) - crc ^= CRC7_POLY; - crc >>= 1; - } - - if(TEST == 1) - crc = 1; - if(TEST > 100) - TEST = 0; - - if (crc == 0) - { - writeByte(0xFF); - return true; - } - else - { - writeByte(0xFE); - return false; - } + uint8_t len = readByte(); + uint8_t crc = 0; + buffer += offset; + + uint32_t block_timeout = timeout / 10; + + // wait for block + int n_ready; + uint16_t elapsed = 0; + auto start = std::chrono::steady_clock::now(); + auto end = start; + while(elapsed < block_timeout) + { + int code = ioctl(file_desc, FIONREAD, &n_ready); + if(code != 0) + { + std::cout << "n_ready code: " << code << std::endl; + return false; + } + + if(n_ready >= len + 1) + break; + + end = std::chrono::steady_clock::now(); + elapsed = std::chrono::duration_cast(end - start).count(); + } + if(elapsed >= timeout) + { + std::cout << "block timeout: " << std::endl; + return false; + } + + while(len--) + { + *buffer = readByte(); + + crc ^= *buffer++; + for (uint8_t i = 0; i < 8; i++) + { + if (crc & 1) + crc ^= CRC7_POLY; + crc >>= 1; + } + } + + crc ^= readByte(); + for (uint8_t i = 0; i < 8; i++) + { + if (crc & 1) + crc ^= CRC7_POLY; + crc >>= 1; + } + + if(TEST == 1) + crc = 1; + if(TEST > 100) + TEST = 0; + + if (crc == 0) + { + writeByte(0xFF); + return true; + } + else + { + writeByte(0xFE); + return false; + } } uint32_t USART::getBaudrate() { - return baudrate; + return baudrate; } uint8_t USART::getTimeout() { - return timeout; + return timeout; } - + void USART::setBaudrate(uint32_t baudrate) { - this->baudrate = baudrate; + this->baudrate = baudrate; } void USART::setTimeout(uint8_t timeout) { - this->timeout = timeout; + this->timeout = timeout; } diff --git a/control/src/drv/usart.h b/control/src/drv/usart.h index b33019a..de2719f 100644 --- a/control/src/drv/usart.h +++ b/control/src/drv/usart.h @@ -13,137 +13,139 @@ #include "usartexception.h" #include "timeoutexception.h" +/*! C++ Wrapper class for termios usart library. */ + class USART { public: - - /************************************************* - * Methoden für die Verwaltung der Schnittstelle * - *************************************************/ - - /** - * Öffnet die USART Schnittstelle - * \param device Linux-Gerätepfad - * \throws USARTException - */ - void openDevice(std::string device); - - /** - * Schließt die USART Schnittstelle - * \throws USARTException - */ - void closeDevice(void); - - /** - * Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gelesen wurden - * \throws USARTException - */ - void clearInputBuffer(void); - - /** - * Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden - * \throws USARTException - */ - void clearOutputBuffer(void); - - /** - * Schreibt Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden - * \throws USARTException - */ - void flushOutputBuffer(void); - - /** - * Gibt Anzahl an erfolgreichen und fehlgeschlagenen Block-Übertragungen an - */ - void printStatistics(void); - - /*************************************************/ - - - - /************************************* - * Methoden für die Datenübertragung * - *************************************/ - - /** - * Sendet ein Byte über die USART Schnittstelle - * \param b das zu sendende Byte - * \throws USARTException - */ - void writeByte(uint8_t b); - - /** - * Sendet ein Integer über die USART Schnittstelle - * \param b das zu sendende Byte - * \throws USARTException - */ - void writeInt(uint16_t d); - - /** - * Empfängt ein Byte über die USART Schnittstelle - * \throws USARTException - */ - uint8_t readByte(void); - - /** - * Empfängt ein Integer über die USART Schnittstelle - * \throws USARTException - */ - uint16_t readInt(void); - - int read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout); - int write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout); - void writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len); - bool readBlock(uint8_t* buffer, uint16_t offset); - - /*************************************/ - - - - /*************************************** - * Methoden für einstellbare Parameter * - ***************************************/ - - /** - * Liefert die eingestellte Baudrate - * Änderungen werden erst nach einem open() wirksam - */ - uint32_t getBaudrate(void); - - /** - * Liefert den eingestellten Timeout (in Dezisekunden) - * Änderungen werden erst nach einem open() wirksam - */ - uint8_t getTimeout(void); - - /** - * Setzt die Baudrate - * Änderungen werden erst nach einem open() wirksam - */ - void setBaudrate(uint32_t baudrate); - - /** - * Setzt den Timeout (in Dezisekunden) - * Änderungen werden erst nach einem open() wirksam - */ - void setTimeout(uint8_t timeout); - - /***************************************/ - - constexpr static uint8_t CRC7_POLY = 0x91; - constexpr static uint8_t MAX_BLOCK_SIZE = 64; - constexpr static uint8_t BLOCK_END = 0x80; + + /************************************************* + * Methoden für die Verwaltung der Schnittstelle * + *************************************************/ + + /** + * Öffnet die USART Schnittstelle + * \param device Linux-Gerätepfad + * \throws USARTException + */ + void openDevice(std::string device); + + /** + * Schließt die USART Schnittstelle + * \throws USARTException + */ + void closeDevice(void); + + /** + * Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gelesen wurden + * \throws USARTException + */ + void clearInputBuffer(void); + + /** + * Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden + * \throws USARTException + */ + void clearOutputBuffer(void); + + /** + * Schreibt Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden + * \throws USARTException + */ + void flushOutputBuffer(void); + + /** + * Gibt Anzahl an erfolgreichen und fehlgeschlagenen Block-Übertragungen an + */ + void printStatistics(void); + + /*************************************************/ + + + + /************************************* + * Methoden für die Datenübertragung * + *************************************/ + + /** + * Sendet ein Byte über die USART Schnittstelle + * \param b das zu sendende Byte + * \throws USARTException + */ + void writeByte(uint8_t b); + + /** + * Sendet ein Integer über die USART Schnittstelle + * \param b das zu sendende Byte + * \throws USARTException + */ + void writeInt(uint16_t d); + + /** + * Empfängt ein Byte über die USART Schnittstelle + * \throws USARTException + */ + uint8_t readByte(void); + + /** + * Empfängt ein Integer über die USART Schnittstelle + * \throws USARTException + */ + uint16_t readInt(void); + + int read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout); + int write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout); + void writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len); + bool readBlock(uint8_t* buffer, uint16_t offset); + + /*************************************/ + + + + /*************************************** + * Methoden für einstellbare Parameter * + ***************************************/ + + /** + * Liefert die eingestellte Baudrate + * Änderungen werden erst nach einem open() wirksam + */ + uint32_t getBaudrate(void); + + /** + * Liefert den eingestellten Timeout (in Dezisekunden) + * Änderungen werden erst nach einem open() wirksam + */ + uint8_t getTimeout(void); + + /** + * Setzt die Baudrate + * Änderungen werden erst nach einem open() wirksam + */ + void setBaudrate(uint32_t baudrate); + + /** + * Setzt den Timeout (in Dezisekunden) + * Änderungen werden erst nach einem open() wirksam + */ + void setTimeout(uint8_t timeout); + + /***************************************/ + + constexpr static uint8_t CRC7_POLY = 0x91; + constexpr static uint8_t MAX_BLOCK_SIZE = 64; + constexpr static uint8_t BLOCK_END = 0x80; private: - - int file_desc = -1; // Linux Dateideskriptor - uint32_t baudrate = 9600; // Standard-Baudrate, sollte mit setBaudrate() überschrieben werden! - int TEST = 0; - uint8_t timeout = 10; // in Dezisekunden - uint8_t block_buffer[MAX_BLOCK_SIZE + 3]; - - // debug statistics - uint32_t n_blocks_total = 0; - uint32_t n_blocks_failed = 0; + + int file_desc = -1; // Linux Dateideskriptor + uint32_t baudrate = 9600; // Standard-Baudrate, sollte mit setBaudrate() überschrieben werden! + int TEST = 0; + uint8_t timeout = 10; // in Dezisekunden + uint8_t block_buffer[MAX_BLOCK_SIZE + 3]; + + // debug statistics + uint32_t n_blocks_total = 0; + uint32_t n_blocks_failed = 0; }; diff --git a/control/src/drv/usartexception.h b/control/src/drv/usartexception.h index 840ce6c..a8ba5c7 100644 --- a/control/src/drv/usartexception.h +++ b/control/src/drv/usartexception.h @@ -6,28 +6,30 @@ // SOURCE: https://stackoverflow.com/a/8152888 +/*! Exception for USART problems, for instance buffer overflow. */ + class USARTException: public std::exception { public: - explicit USARTException(const char* message) : msg(message) - { - } + explicit USARTException(const char* message) : msg(message) + { + } - explicit USARTException(const std::string& message) : msg(message) - { - } + explicit USARTException(const std::string& message) : msg(message) + { + } - virtual ~USARTException() throw () - { - } + virtual ~USARTException() throw () + { + } - virtual const char* what() const throw () - { - return msg.c_str(); - } + virtual const char* what() const throw () + { + return msg.c_str(); + } protected: - std::string msg; + std::string msg; }; #endif // USARTEXCEPTION_H diff --git a/control/src/ui/ui.cpp b/control/src/ui/ui.cpp index f1c1556..cb2198c 100644 --- a/control/src/ui/ui.cpp +++ b/control/src/ui/ui.cpp @@ -6,277 +6,277 @@ std::thread t_refresh; 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_digital_output0); - view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1); - view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0); - view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1); - view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info); - view->addChoice("[ Informationen ]", &show_info); - view->addChoice("", nullptr); - view->addChoice("[ Beenden ]", &finish); - view->repaint(); - - win_stack.push_back(view); - input(0); + ViewSelection* view = new ViewSelection(); + view->setTitle("B15F - Command Line Interface"); + view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor); + view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0); + view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1); + view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0); + view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1); + view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info); + view->addChoice("[ Informationen ]", &show_info); + view->addChoice("", nullptr); + view->addChoice("[ Beenden ]", &finish); + view->repaint(); + + win_stack.push_back(view); + input(0); } void input(int) { - call_t nextCall; - int key; - do - { - key = wgetch(View::getWinContext()); - win_stack.back()->repaint(); - nextCall = win_stack.back()->keypress(key); - - if(key == -1) - view_back(key); - - if(nextCall) - nextCall(key); - } - while(win_stack.size()); + call_t nextCall; + int key; + do + { + key = wgetch(View::getWinContext()); + win_stack.back()->repaint(); + nextCall = win_stack.back()->keypress(key); + + if(key == -1) + view_back(key); + + if(nextCall) + nextCall(key); + } + while(win_stack.size()); } void view_back(int) { - if(win_stack.size()) - { - delete win_stack.back(); - win_stack.pop_back(); - } - if(win_stack.size()) - win_stack.back()->repaint(); + if(win_stack.size()) + { + delete win_stack.back(); + win_stack.pop_back(); + } + if(win_stack.size()) + win_stack.back()->repaint(); } void finish(int) { - cleanup(); - exit(EXIT_SUCCESS); + cleanup(); + exit(EXIT_SUCCESS); } void cleanup() { - if(t_refresh.joinable()) - t_refresh.join(); - clrtoeol(); - refresh(); - endwin(); + if(t_refresh.joinable()) + t_refresh.join(); + clrtoeol(); + refresh(); + endwin(); } void show_info(int) { - ViewInfo* view = new ViewInfo(); - view->setTitle("Info"); - view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal..."); - view->setLabelClose("[ Zurueck ]"); - view->repaint(); - - win_stack.push_back(view); - input(0); + ViewInfo* view = new ViewInfo(); + view->setTitle("Info"); + view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal..."); + view->setLabelClose("[ Zurueck ]"); + view->repaint(); + + win_stack.push_back(view); + input(0); } void show_monitor(int) { - ViewMonitor* view = new ViewMonitor(); - view->setTitle("Monitor"); - view->setText("\nErfasse Messwerte..."); - view->setLabelClose("[ Zurueck ]"); - view->repaint(); - - win_stack.push_back(view); - input(0); + ViewMonitor* view = new ViewMonitor(); + view->setTitle("Monitor"); + view->setText("\nErfasse Messwerte..."); + view->setLabelClose("[ Zurueck ]"); + view->repaint(); + + win_stack.push_back(view); + 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 [0, FF] an."); - view->setLabelClose("[ Schliessen ]"); - view->repaint(); - - win_stack.push_back(view); - input(0); + ViewInfo* view = new ViewInfo(); + view->setTitle("Falsche Eingabe"); + view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an."); + view->setLabelClose("[ Schliessen ]"); + view->repaint(); + + win_stack.push_back(view); + input(0); } void show_invalid_dac_input(int) { - ViewInfo* view = new ViewInfo(); - view->setTitle("Falsche Eingabe"); - view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an."); - view->setLabelClose("[ Schliessen ]"); - view->repaint(); - - win_stack.push_back(view); - input(0); + ViewInfo* view = new ViewInfo(); + view->setTitle("Falsche Eingabe"); + view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an."); + view->setLabelClose("[ Schliessen ]"); + view->repaint(); + + win_stack.push_back(view); + input(0); } void write_digital_output0(int) { - try - { - int d = std::stoi(static_cast(win_stack.back())->getInput(), 0, 16); - if(d > 255 || 0 > d) - throw std::invalid_argument("bad value"); - uint8_t port = static_cast(d); - - B15F& drv = B15F::getInstance(); - drv.digitalWrite0(port); - view_back(0); - } - catch(std::invalid_argument& ex) - { - show_invalid_port_input(0); - } + try + { + int d = std::stoi(static_cast(win_stack.back())->getInput(), 0, 16); + if(d > 255 || 0 > d) + throw std::invalid_argument("bad value"); + uint8_t port = static_cast(d); + + 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 - { - int d = std::stoi(static_cast(win_stack.back())->getInput(), 0, 16); - if(d > 255 || 0 > d) - throw std::invalid_argument("bad value"); - uint8_t port = static_cast(d); - - B15F& drv = B15F::getInstance(); - drv.digitalWrite1(port); - view_back(0); - } - catch(std::invalid_argument& ex) - { - show_invalid_port_input(0); - } + try + { + int d = std::stoi(static_cast(win_stack.back())->getInput(), 0, 16); + if(d > 255 || 0 > d) + throw std::invalid_argument("bad value"); + uint8_t port = static_cast(d); + + B15F& drv = B15F::getInstance(); + drv.digitalWrite1(port); + view_back(0); + } + catch(std::invalid_argument& ex) + { + show_invalid_port_input(0); + } } void write_analog_output0(int) { - try - { - uint16_t port = std::stoi(static_cast(win_stack.back())->getInput()); - if(port > 1023) - throw std::invalid_argument("bad value"); - - B15F& drv = B15F::getInstance(); - drv.analogWrite0(port); - view_back(0); - } - catch(std::invalid_argument& ex) - { - show_invalid_dac_input(0); - } + try + { + uint16_t port = std::stoi(static_cast(win_stack.back())->getInput()); + if(port > 1023) + throw std::invalid_argument("bad value"); + + B15F& drv = B15F::getInstance(); + drv.analogWrite0(port); + view_back(0); + } + catch(std::invalid_argument& ex) + { + show_invalid_dac_input(0); + } } void write_analog_output1(int) { - try - { - uint16_t port = std::stoi(static_cast(win_stack.back())->getInput()); - if(port > 1023) - throw std::invalid_argument("bad value"); - - B15F& drv = B15F::getInstance(); - drv.analogWrite1(port); - view_back(0); - } - catch(std::invalid_argument& ex) - { - show_invalid_dac_input(0); - } + try + { + uint16_t port = std::stoi(static_cast(win_stack.back())->getInput()); + if(port > 1023) + throw std::invalid_argument("bad value"); + + B15F& drv = B15F::getInstance(); + drv.analogWrite1(port); + view_back(0); + } + catch(std::invalid_argument& ex) + { + show_invalid_dac_input(0); + } } void show_digital_output0(int) { - ViewPromt* view = new ViewPromt(); - view->setTitle("Digitale Ausgabe BE0"); - view->setMessage("\nAusgabe Port-Wert (hex): 0x"); - view->setCancel("[ Zurueck ]", true); - view->setConfirm("[ OK ]", &write_digital_output0); - view->repaint(); - - win_stack.push_back(view); - input(0); + ViewPromt* view = new ViewPromt(); + view->setTitle("Digitale Ausgabe BE0"); + view->setMessage("\nAusgabe 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("\nAusgabe Port-Wert (hex): 0x"); - view->setCancel("[ Zurueck ]", true); - view->setConfirm("[ OK ]", &write_digital_output1); - view->repaint(); - - win_stack.push_back(view); - input(0); + ViewPromt* view = new ViewPromt(); + view->setTitle("Digitale Ausgabe BE1"); + view->setMessage("\nAusgabe 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_analog_output0(int) { - ViewPromt* view = new ViewPromt(); - view->setTitle("Analoge Ausgabe AA0"); - view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): "); - view->setCancel("[ Zurueck ]", true); - view->setConfirm("[ OK ]", &write_analog_output0); - view->repaint(); - - win_stack.push_back(view); - input(0); + ViewPromt* view = new ViewPromt(); + view->setTitle("Analoge Ausgabe AA0"); + view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): "); + view->setCancel("[ Zurueck ]", true); + view->setConfirm("[ OK ]", &write_analog_output0); + view->repaint(); + + win_stack.push_back(view); + input(0); } void show_analog_output1(int) { - ViewPromt* view = new ViewPromt(); - view->setTitle("Analoge Ausgabe AA1"); - view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): "); - view->setCancel("[ Zurueck ]", true); - view->setConfirm("[ OK ]", &write_analog_output1); - view->repaint(); - - win_stack.push_back(view); - input(0); + ViewPromt* view = new ViewPromt(); + view->setTitle("Analoge Ausgabe AA1"); + view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): "); + view->setCancel("[ Zurueck ]", true); + view->setConfirm("[ OK ]", &write_analog_output1); + view->repaint(); + + win_stack.push_back(view); + input(0); } void start_selftest(int) { - B15F& drv = B15F::getInstance(); - drv.activateSelfTestMode(); - - ViewInfo* view = new ViewInfo(); - view->setTitle("Selbsttest aktiv"); - view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1"); - view->setLabelClose("[ Selbsttest Beenden ]"); - view->setCall(&stop_selftest); - view->repaint(); - - win_stack.push_back(view); - input(0); + B15F& drv = B15F::getInstance(); + drv.activateSelfTestMode(); + + ViewInfo* view = new ViewInfo(); + view->setTitle("Selbsttest aktiv"); + view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1"); + view->setLabelClose("[ Selbsttest Beenden ]"); + view->setCall(&stop_selftest); + view->repaint(); + + win_stack.push_back(view); + input(0); } void stop_selftest(int) { - B15F& drv = B15F::getInstance(); - drv.discard(); - drv.delay_ms(B15F::WDT_TIMEOUT); - drv.reconnect(); - drv.digitalWrite0(0); - drv.digitalWrite1(0); + B15F& drv = B15F::getInstance(); + drv.discard(); + drv.delay_ms(B15F::WDT_TIMEOUT); + drv.reconnect(); + drv.digitalWrite0(0); + drv.digitalWrite1(0); } void show_selftest_info(int) { - ViewInfo* view = new ViewInfo(); - view->setTitle("Selbsttest"); - view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter."); - view->setLabelClose("[ Weiter ]"); - view->setCall(&start_selftest); - view->repaint(); - - win_stack.push_back(view); - input(0); + ViewInfo* view = new ViewInfo(); + view->setTitle("Selbsttest"); + view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter."); + view->setLabelClose("[ Weiter ]"); + view->setCall(&start_selftest); + view->repaint(); + + win_stack.push_back(view); + input(0); } diff --git a/control/src/ui/view.cpp b/control/src/ui/view.cpp index af3e590..8154379 100644 --- a/control/src/ui/view.cpp +++ b/control/src/ui/view.cpp @@ -4,12 +4,12 @@ WINDOW* View::win = nullptr; View::View() { - if(!win) - { - B15F::abort("View::win not initialized, missing context"); - } - getmaxyx(win, height, width); // init width and height - keypad(win, TRUE); + if(!win) + { + B15F::abort("View::win not initialized, missing context"); + } + getmaxyx(win, height, width); // init width and height + keypad(win, TRUE); } View::~View() @@ -18,12 +18,12 @@ View::~View() void View::setWinContext(WINDOW* win) { - View::win = win; + View::win = win; } WINDOW* View::getWinContext() { - return win; + return win; } // from: https://stackoverflow.com/a/37454181 @@ -46,33 +46,33 @@ std::vector View::str_split(const std::string& str, const std::stri void View::setTitle(std::string title) { - this->title = title; + this->title = title; } void View::repaint() { - // get screen size - struct winsize size; - if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0) - throw std::runtime_error("TIOCGWINSZ error"); - - - start_x = floor((size.ws_col - width) / 2.); - start_y = floor((size.ws_row - height) / 2.); - - curs_set(0); // hide cursor - mvwin(win, start_y, start_x); - clear(); - wclear(win); - - // generic draw - box(win, 0, 0); - int offset_x = (width - title.length()) / 2; - mvwprintw(win, 1, offset_x, "%s", title.c_str()); - - // specific draw - draw(); + // get screen size + struct winsize size; + if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0) + throw std::runtime_error("TIOCGWINSZ error"); - refresh(); - wrefresh(win); + + start_x = floor((size.ws_col - width) / 2.); + start_y = floor((size.ws_row - height) / 2.); + + curs_set(0); // hide cursor + mvwin(win, start_y, start_x); + clear(); + wclear(win); + + // generic draw + box(win, 0, 0); + int offset_x = (width - title.length()) / 2; + mvwprintw(win, 1, offset_x, "%s", title.c_str()); + + // specific draw + draw(); + + refresh(); + wrefresh(win); } diff --git a/control/src/ui/view.h b/control/src/ui/view.h index 1445035..a63043b 100644 --- a/control/src/ui/view.h +++ b/control/src/ui/view.h @@ -14,32 +14,34 @@ extern std::string ERR_MSG; typedef std::function call_t; +/*! Base class for multiple views with the ncurses user interface. */ + class View { public: - View(void); - virtual ~View(void); - - static void setWinContext(WINDOW* win); - static WINDOW* getWinContext(void); - static std::vector str_split(const std::string& str, const std::string delim); - - virtual void setTitle(std::string title); - - virtual void repaint(void); - - virtual void draw(void) = 0; - virtual call_t keypress(int& key) = 0; - - + View(void); + virtual ~View(void); + + static void setWinContext(WINDOW* win); + static WINDOW* getWinContext(void); + static std::vector str_split(const std::string& str, const std::string delim); + + virtual void setTitle(std::string title); + + virtual void repaint(void); + + virtual void draw(void) = 0; + virtual call_t keypress(int& key) = 0; + + protected: - int width, height; - int start_x = 0, start_y = 0; - std::string title; - std::vector calls; - - static WINDOW* win; - constexpr static int KEY_ENT = 10; + int width, height; + int start_x = 0, start_y = 0; + std::string title; + std::vector calls; + + static WINDOW* win; + constexpr static int KEY_ENT = 10; }; #endif // VIEW_H diff --git a/control/src/ui/view_info.cpp b/control/src/ui/view_info.cpp index 056ef0f..5adabbc 100644 --- a/control/src/ui/view_info.cpp +++ b/control/src/ui/view_info.cpp @@ -2,62 +2,62 @@ ViewInfo::ViewInfo() { - calls.push_back(nullptr); + calls.push_back(nullptr); } void ViewInfo::setText(std::string text) { - this->text = text; + this->text = text; } void ViewInfo::setLabelClose(std::string label) { - this->label_close = label; + this->label_close = label; } void ViewInfo::setCall(call_t call) { - calls[0] = call; + calls[0] = call; } void ViewInfo::draw() { - int li = 0; - for(std::string line : str_split(text, "\n")) - mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str()); - - close_offset_x = (width - label_close.length()) / 2; - close_offset_y = height - 2; - - wattron(win, A_REVERSE); - mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str()); - wattroff(win, A_REVERSE); + int li = 0; + for(std::string line : str_split(text, "\n")) + mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str()); + + close_offset_x = (width - label_close.length()) / 2; + close_offset_y = height - 2; + + wattron(win, A_REVERSE); + mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str()); + wattroff(win, A_REVERSE); } call_t ViewInfo::keypress(int& key) { - switch(key) - { - - case KEY_MOUSE: - { - // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml - MEVENT event; - if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED)) - { - size_t column = start_x + close_offset_x; - size_t row = start_y + close_offset_y; - 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; - } - case KEY_ENT: - key = -1; // do return from view - break; - default: - break; - } - return calls[0]; + switch(key) + { + + case KEY_MOUSE: + { + // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml + MEVENT event; + if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED)) + { + size_t column = start_x + close_offset_x; + size_t row = start_y + close_offset_y; + 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; + } + case KEY_ENT: + key = -1; // do return from view + break; + default: + break; + } + return calls[0]; } diff --git a/control/src/ui/view_info.h b/control/src/ui/view_info.h index be5cbf4..7a3eb4b 100644 --- a/control/src/ui/view_info.h +++ b/control/src/ui/view_info.h @@ -3,23 +3,25 @@ #include "view.h" +/*! View for simple text message output. */ + class ViewInfo : public View { public: - ViewInfo(void); - virtual void setText(std::string text); - virtual void setLabelClose(std::string label);; - virtual void setCall(call_t call); - virtual void draw(void) override; - virtual call_t keypress(int& key) override; + ViewInfo(void); + virtual void setText(std::string text); + virtual void setLabelClose(std::string label);; + virtual void setCall(call_t call); + virtual void draw(void) override; + virtual call_t keypress(int& key) override; protected: - std::string text; - std::string label_close; - int close_offset_x = 0; - int close_offset_y = 0; - constexpr static int text_offset_x = 2; - constexpr static int text_offset_y = 3; + std::string text; + std::string label_close; + int close_offset_x = 0; + int close_offset_y = 0; + constexpr static int text_offset_x = 2; + constexpr static int text_offset_y = 3; }; #endif // VIEW_INFO diff --git a/control/src/ui/view_monitor.cpp b/control/src/ui/view_monitor.cpp index 8697eef..f309b6f 100644 --- a/control/src/ui/view_monitor.cpp +++ b/control/src/ui/view_monitor.cpp @@ -1,139 +1,139 @@ #include "view_monitor.h" ViewMonitor::ViewMonitor() : t_worker(&ViewMonitor::worker, this) -{ +{ } call_t ViewMonitor::keypress(int& key) { - switch(key) - { - - 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_x + close_offset_x; - size_t row = start_y + close_offset_y; - 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) - break; - - // fall through to next case - [[fallthrough]]; - } - case KEY_ENT: - run_worker = false; - key = -1; // do return from view - wclear(win); - wrefresh(win); - t_worker.join(); - break; - default: - break; - } - return calls[0]; + switch(key) + { + + 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_x + close_offset_x; + size_t row = start_y + close_offset_y; + 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) + break; + + // fall through to next case + [[fallthrough]]; + } + case KEY_ENT: + run_worker = false; + key = -1; // do return from view + wclear(win); + wrefresh(win); + t_worker.join(); + break; + default: + break; + } + return calls[0]; } std::string ViewMonitor::fancyDigitalString(uint8_t& b) { - std::stringstream str; - str << std::bitset<8>(b).to_string(); - str << " "; - str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec; - return str.str(); + std::stringstream str; + str << std::bitset<8>(b).to_string(); + str << " "; + str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec; + return str.str(); } std::string ViewMonitor::fancyAnalogString(uint16_t& v) { - std::stringstream str; - double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0; - - str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V "; - - str << "["; - uint8_t p = round(v * 40.0 / 1023.0); - for(uint8_t i = 0; i < p; i++) - str << "X"; - for(uint8_t i = 0; i < 40 - p; i++) - str << " "; - str << "]" << std::endl; - - return str.str(); + std::stringstream str; + double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0; + + str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V "; + + str << "["; + uint8_t p = round(v * 40.0 / 1023.0); + for(uint8_t i = 0; i < p; i++) + str << "X"; + for(uint8_t i = 0; i < 40 - p; i++) + str << " "; + str << "]" << std::endl; + + return str.str(); } void ViewMonitor::worker() { - B15F& drv = B15F::getInstance(); - while(run_worker) - { - try - { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - - uint8_t be0 = drv.digitalRead0(); - uint8_t be1 = drv.digitalRead1(); - uint8_t dsw = drv.readDipSwitch(); - uint16_t adc[8]; - for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++) - adc[i] = drv.analogRead(i); - - - std::stringstream str; - - // hline - for(uint8_t i = 0; i < width - 2 * text_offset_x; i++) - if(i % 2 == 0) - str << "-"; - else - str << " "; - str << std::endl; - - str << "Digitale Enigaenge:" << std::endl; - str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl; - str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl; - str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl; - - // hline - for(uint8_t i = 0; i < width - 2 * text_offset_x; i++) - if(i % 2 == 0) - str << "-"; - else - str << " "; - str << std::endl; - - str << "Analoge Eingaenge:" << std::endl; - for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++) - { - str << "Kanal " << std::to_string((int) i) << ": "; - str << fancyAnalogString(adc[i]) << std::endl; - } - - text = str.str(); - repaint(); - } - catch(DriverException& ex) - { - std::cout << "DriverException: " << ex.what() << std::endl; - drv.delay_ms(1000); - } - catch(...) - { - try - { - drv.reconnect(); - } - catch(...) - { - B15F::abort("yoho meine dudes"); - return; - } - } - } + B15F& drv = B15F::getInstance(); + while(run_worker) + { + try + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + uint8_t be0 = drv.digitalRead0(); + uint8_t be1 = drv.digitalRead1(); + uint8_t dsw = drv.readDipSwitch(); + uint16_t adc[8]; + for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++) + adc[i] = drv.analogRead(i); + + + std::stringstream str; + + // hline + for(uint8_t i = 0; i < width - 2 * text_offset_x; i++) + if(i % 2 == 0) + str << "-"; + else + str << " "; + str << std::endl; + + str << "Digitale Enigaenge:" << std::endl; + str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl; + str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl; + str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl; + + // hline + for(uint8_t i = 0; i < width - 2 * text_offset_x; i++) + if(i % 2 == 0) + str << "-"; + else + str << " "; + str << std::endl; + + str << "Analoge Eingaenge:" << std::endl; + for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++) + { + str << "Kanal " << std::to_string((int) i) << ": "; + str << fancyAnalogString(adc[i]) << std::endl; + } + + text = str.str(); + repaint(); + } + catch(DriverException& ex) + { + std::cout << "DriverException: " << ex.what() << std::endl; + drv.delay_ms(1000); + } + catch(...) + { + try + { + drv.reconnect(); + } + catch(...) + { + B15F::abort("yoho meine dudes"); + return; + } + } + } } diff --git a/control/src/ui/view_monitor.h b/control/src/ui/view_monitor.h index 33552bf..9ab39b5 100644 --- a/control/src/ui/view_monitor.h +++ b/control/src/ui/view_monitor.h @@ -8,22 +8,24 @@ #include "view_info.h" #include "../drv/b15f.h" +/*! View to display all B15 inputs. */ + class ViewMonitor : public ViewInfo { - + public: - ViewMonitor(void); - virtual call_t keypress(int& key) override; + ViewMonitor(void); + virtual call_t keypress(int& key) override; private: - std::string fancyDigitalString(uint8_t& b); - std::string fancyAnalogString(uint16_t& v); + std::string fancyDigitalString(uint8_t& b); + std::string fancyAnalogString(uint16_t& v); protected: - virtual void worker(void); - volatile bool run_worker = true; - std::thread t_worker; - + virtual void worker(void); + volatile bool run_worker = true; + std::thread t_worker; + }; #endif // VIEW_MONITOR_H diff --git a/control/src/ui/view_promt.cpp b/control/src/ui/view_promt.cpp index bd57829..3705aaf 100644 --- a/control/src/ui/view_promt.cpp +++ b/control/src/ui/view_promt.cpp @@ -2,120 +2,120 @@ void ViewPromt::draw() { - curs_set(1); // show cursor - - int li = text_offset_y; - int ci = 0; - for(std::string line : str_split(message + input, "\n")) - { - mvwprintw(win, ++li, text_offset_x, "%s", line.c_str()); - ci = line.length() + text_offset_x; - } - - button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2; - button_offset_y = height - text_offset_y; - - 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); - } - wmove(win, li, ci); + curs_set(1); // show cursor + + int li = text_offset_y; + int ci = 0; + for(std::string line : str_split(message + input, "\n")) + { + mvwprintw(win, ++li, text_offset_x, "%s", line.c_str()); + ci = line.length() + text_offset_x; + } + + button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2; + button_offset_y = height - text_offset_y; + + 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); + } + wmove(win, li, ci); } void ViewPromt::setMessage(std::string message) { - this->message = message; + this->message = message; } void ViewPromt::setConfirm(std::string name, std::function call) { - label_confirm = name; - call_confirm = call; + label_confirm = name; + call_confirm = call; } void ViewPromt::setCancel(std::string name, bool cancelable) { - label_cancel = name; - this->cancelable = cancelable; + label_cancel = name; + this->cancelable = cancelable; } std::string ViewPromt::getInput() { - return input; + 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 '\t': - case KEY_LEFT: - 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 - [[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; - - if(key != KEY_ENT) +{ + std::function ret = nullptr; + switch(key) + { + case KEY_BACKSPACE: + if(input.length()) + input.pop_back(); + break; + case '\t': + case KEY_LEFT: + 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 + [[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; + + if(key != KEY_ENT) repaint(); - return ret; + return ret; } diff --git a/control/src/ui/view_promt.h b/control/src/ui/view_promt.h index fb74100..a43ae5b 100644 --- a/control/src/ui/view_promt.h +++ b/control/src/ui/view_promt.h @@ -5,28 +5,30 @@ #include #include "view.h" +/*! View for basic user text input. */ + class ViewPromt : public View { public: - virtual void draw(void) override; - virtual void setMessage(std::string message); - virtual void setConfirm(std::string name, call_t call); - virtual void setCancel(std::string name, bool cancelable); - virtual std::string getInput(void); - virtual call_t keypress(int& key) override; + virtual void draw(void) override; + virtual void setMessage(std::string message); + virtual void setConfirm(std::string name, call_t call); + virtual void setCancel(std::string name, bool cancelable); + virtual std::string getInput(void); + virtual call_t 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 ]"; - call_t 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 = 2; + size_t selection = 1; + std::string input; + std::string message = "Input"; + std::string label_confirm = "[ OK ]"; + std::string sep = " "; + std::string label_cancel = "[ Cancel ]"; + call_t 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 = 2; }; #endif // VIEW_PROMT_H diff --git a/control/src/ui/view_selection.cpp b/control/src/ui/view_selection.cpp index 454c3ab..e0899cd 100644 --- a/control/src/ui/view_selection.cpp +++ b/control/src/ui/view_selection.cpp @@ -2,75 +2,75 @@ void ViewSelection::draw() { - //curs_set(0); // hide cursor - for(size_t i = 0; i < choices.size(); i++) - { - if(selection == i) - wattron(win, A_REVERSE); - mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str()); - if(selection == i) - wattroff(win, A_REVERSE); - } + //curs_set(0); // hide cursor + for(size_t i = 0; i < choices.size(); i++) + { + if(selection == i) + wattron(win, A_REVERSE); + mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str()); + if(selection == i) + wattroff(win, A_REVERSE); + } } void ViewSelection::addChoice(std::string name, call_t call) { - choices.push_back(name); - calls.push_back(call); + choices.push_back(name); + calls.push_back(call); } call_t ViewSelection::keypress(int& key) { - call_t ret = nullptr; - switch(key) - { - case KEY_UP: - do - selection = (selection - 1 + choices.size()) % choices.size(); - while(!choices[selection].length() && choices.size()); - break; - - case '\t': - case KEY_DOWN: - do - selection = (selection + 1) % choices.size(); - while(!choices[selection].length() && choices.size()); - 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 + choice_offset_x; - size_t row_start = start_y + choice_offset_y; - size_t mouse_x = event.x, mouse_y = event.y; - for(size_t i = 0; i < choices.size(); i++) - if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length()) - { - if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED) - hit = true; - selection = i; - } - } - if(!hit) - break; - - // fall through to next case - [[fallthrough]]; - } - - case KEY_ENT: - if(selection == choices.size() - 1) // exit - key = -1; // do return from view - else - ret = calls[selection]; - break; - default: - break; - } - repaint(); - return ret; + call_t ret = nullptr; + switch(key) + { + case KEY_UP: + do + selection = (selection - 1 + choices.size()) % choices.size(); + while(!choices[selection].length() && choices.size()); + break; + + case '\t': + case KEY_DOWN: + do + selection = (selection + 1) % choices.size(); + while(!choices[selection].length() && choices.size()); + 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 + choice_offset_x; + size_t row_start = start_y + choice_offset_y; + size_t mouse_x = event.x, mouse_y = event.y; + for(size_t i = 0; i < choices.size(); i++) + if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length()) + { + if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED) + hit = true; + selection = i; + } + } + if(!hit) + break; + + // fall through to next case + [[fallthrough]]; + } + + case KEY_ENT: + if(selection == choices.size() - 1) // exit + key = -1; // do return from view + else + ret = calls[selection]; + break; + default: + break; + } + repaint(); + return ret; } diff --git a/control/src/ui/view_selection.h b/control/src/ui/view_selection.h index 4963f73..d97e062 100644 --- a/control/src/ui/view_selection.h +++ b/control/src/ui/view_selection.h @@ -5,20 +5,22 @@ #include #include "view.h" +/*! View for user selection input. */ + class ViewSelection : public View { public: - virtual void draw(void) override; - virtual void addChoice(std::string name, call_t call); - virtual call_t keypress(int& key) override; - + virtual void draw(void) override; + virtual void addChoice(std::string name, call_t call); + virtual call_t keypress(int& key) override; + protected: - size_t selection = 0; - std::vector choices; - - constexpr static int choice_offset_x = 2; - constexpr static int choice_offset_y = 3; + size_t selection = 0; + std::vector choices; + + constexpr static int choice_offset_x = 2; + constexpr static int choice_offset_y = 3; }; #endif // VIEW_SELECTION_H diff --git a/docs/html/annotated.html b/docs/html/annotated.html index 06ae8d2..e8fa8b6 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -85,7 +85,7 @@ $(function() { diff --git a/docs/html/b15f_8cpp_source.html b/docs/html/b15f_8cpp_source.html index a12e858..5efca6f 100644 --- a/docs/html/b15f_8cpp_source.html +++ b/docs/html/b15f_8cpp_source.html @@ -70,41 +70,46 @@ $(function() {
b15f.cpp
-
1 #include "b15f.h"
2 
3 B15F* B15F::instance = nullptr;
4 errorhandler_t B15F::errorhandler = nullptr;
5 
6 B15F::B15F()
7 {
8  init();
9 }
10 
11 void B15F::init()
12 {
13 
14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
15  while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos)
16  device.pop_back();
17 
18  if(device.length() == 0)
19  abort("Adapter nicht gefunden");
20 
21  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
22 
23 
24 
25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
26  usart.setBaudrate(BAUDRATE);
27  usart.openDevice(device);
28  std::cout << "OK" << std::endl;
29 
30 
31 
32  std::cout << PRE << "Teste Verbindung... " << std::flush;
33  uint8_t tries = 3;
34  while(tries--)
35  {
36  // verwerfe Daten, die µC noch hat
37  //discard();
38 
39  if(!testConnection())
40  continue;
41 
42  if(!testIntConv())
43  continue;
44 
45  break;
46  }
47  if(tries == 0)
48  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
49  std::cout << "OK" << std::endl;
50 
51 
52  // Gib board info aus
53  std::vector<std::string> info = getBoardInfo();
54  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl;
55 }
56 
58 {
59  uint8_t tries = RECONNECT_TRIES;
60  while(tries--)
61  {
62  delay_ms(RECONNECT_TIMEOUT);
63  discard();
64 
65  if(testConnection())
66  return;
67  }
68 
69  abort("Verbindung kann nicht repariert werden");
70 }
71 
72 void B15F::discard(void)
73 {
74  try
75  {
76  usart.clearOutputBuffer();
77  for(uint8_t i = 0; i < 16; i++)
78  {
79  usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input)
80  delay_ms(4);
81  }
82  usart.clearInputBuffer();
83  }
84  catch(std::exception& ex)
85  {
86  abort(ex);
87  }
88 }
89 
91 {
92  // erzeuge zufälliges Byte
93  srand(time(NULL));
94  uint8_t dummy = rand() % 256;
95 
96  usart.writeByte(RQ_TEST);
97  usart.writeByte(dummy);
98 
99  uint8_t aw = usart.readByte();
100  uint8_t mirror = usart.readByte();
101 
102  return aw == MSG_OK && mirror == dummy;
103 }
104 
106 {
107  srand(time(NULL));
108  uint16_t dummy = rand() % (0xFFFF / 3);
109 
110  usart.writeByte(RQ_INT);
111  usart.writeInt(dummy);
112 
113  uint16_t aw = usart.readInt();
114  return aw == dummy * 3;
115 }
116 
117 
118 std::vector<std::string> B15F::getBoardInfo(void)
119 {
120  std::vector<std::string> info;
121 
122  usart.writeByte(RQ_INFO);
123 
124  uint8_t n = usart.readByte();
125  while(n--)
126  {
127  uint8_t len = usart.readByte();
128  std::string str;
129 
130  while(len--) {
131  str += static_cast<char>(usart.readByte());
132  }
133 
134  info.push_back(str);
135  }
136 
137  uint8_t aw = usart.readByte();
138  if(aw != MSG_OK)
139  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
140 
141  return info;
142 }
143 
145 {
146  usart.writeByte(RQ_ST);
147 
148  uint8_t aw = usart.readByte();
149  return aw == MSG_OK;
150 }
151 
152 bool B15F::digitalWrite0(uint8_t port)
153 {
154  usart.writeByte(RQ_BA0);
155  usart.writeByte(port);
156 
157  uint8_t aw = usart.readByte();
158  delay_us(10);
159  return aw == MSG_OK;
160 }
161 
162 bool B15F::digitalWrite1(uint8_t port)
163 {
164  usart.writeByte(RQ_BA1);
165  usart.writeByte(port);
166 
167  uint8_t aw = usart.readByte();
168  delay_us(10);
169  return aw == MSG_OK;
170 }
171 
173 {
174  usart.clearInputBuffer();
175  usart.writeByte(RQ_BE0);
176  uint8_t byte = usart.readByte();
177  delay_us(10);
178  return byte;
179 }
180 
182 {
183  usart.clearInputBuffer();
184  usart.writeByte(RQ_BE1);
185  uint8_t byte = usart.readByte();
186  delay_us(10);
187  return byte;
188 }
189 
191 {
192  usart.clearInputBuffer();
193  usart.writeByte(RQ_DSW);
194  uint8_t byte = usart.readByte();
195  delay_us(10);
196  return byte;
197 }
198 
199 bool B15F::analogWrite0(uint16_t value)
200 {
201  usart.writeByte(RQ_AA0);
202  usart.writeInt(value);
203 
204  uint8_t aw = usart.readByte();
205  delay_us(10);
206  return aw == MSG_OK;
207 }
208 
209 bool B15F::analogWrite1(uint16_t value)
210 {
211  usart.writeByte(RQ_AA1);
212  usart.writeInt(value);
213 
214  uint8_t aw = usart.readByte();
215  delay_us(10);
216  return aw == MSG_OK;
217 }
218 
219 uint16_t B15F::analogRead(uint8_t channel)
220 {
221  usart.clearInputBuffer();
222  if(channel > 7)
223  abort("Bad ADC channel: " + std::to_string(channel));
224 
225  uint8_t rq[] = {
226  RQ_ADC,
227  channel
228  };
229 
230  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
231  if(n_sent != sizeof(rq))
232  abort("Sent failed");
233 
234  uint16_t adc = usart.readInt();
235 
236  if(adc > 1023)
237  abort("Bad ADC data detected (1)");
238  return adc;
239 }
240 
241 void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
242 {
243  // check pointers
244  buffer_a += offset_a;
245  buffer_b += offset_b;
246 
247 
248  usart.clearInputBuffer();
249  usart.writeByte(RQ_ADC_DAC_STROKE);
250  usart.writeByte(channel_a);
251  usart.writeByte(channel_b);
252  usart.writeInt(start);
253  usart.writeInt(static_cast<uint16_t>(delta));
254  usart.writeInt(count);
255 
256  for(uint16_t i = 0; i < count; i++)
257  {
258  if(buffer_a)
259  {
260  buffer_a[i] = usart.readInt();
261 
262  if(buffer_a[i] > 1023) // check for broken usart connection
263  abort("Bad ADC data detected (2)");
264  }
265  else
266  {
267  usart.readInt();
268  }
269 
270  if(buffer_b)
271  {
272  buffer_b[i] = usart.readInt();
273 
274  if(buffer_b[i] > 1023) // check for broken usart connection
275  abort("Bad ADC data detected (3)");
276  }
277  else
278  {
279  usart.readInt();
280  }
281  }
282 
283  uint8_t aw = usart.readByte();
284  if(aw != MSG_OK)
285  abort("Sequenz unterbrochen");
286 
287  delay_us(10);
288 }
289 
290 void B15F::delay_ms(uint16_t ms)
291 {
292  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
293 }
294 
295 void B15F::delay_us(uint16_t us)
296 {
297  std::this_thread::sleep_for(std::chrono::microseconds(us));
298 }
299 
301 {
302  if(!instance)
303  instance = new B15F();
304 
305  return *instance;
306 }
307 
308 // https://stackoverflow.com/a/478960
309 std::string B15F::exec(std::string cmd) {
310  std::array<char, 128> buffer;
311  std::string result;
312  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
313  if (!pipe) {
314  throw std::runtime_error("popen() failed!");
315  }
316  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
317  result += buffer.data();
318  }
319  return result;
320 }
321 
322 void B15F::abort(std::string msg)
323 {
324  DriverException ex(msg);
325  abort(ex);
326 }
327 void B15F::abort(std::exception& ex)
328 {
329  if(errorhandler)
330  errorhandler(ex);
331  else
332  {
333  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
334  std::cout << ex.what() << std::endl;
335  throw DriverException(ex.what());
336  }
337 }
338 
339 void B15F::setAbortHandler(errorhandler_t func)
340 {
341  errorhandler = func;
342 }
-
static std::string exec(std::string cmd)
Definition: b15f.cpp:309
-
uint8_t readByte(void)
Definition: usart.cpp:210
-
void delay_us(uint16_t us)
Definition: b15f.cpp:295
-
uint8_t digitalRead0(void)
Definition: b15f.cpp:172
-
void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
Definition: b15f.cpp:241
+
1 #include "b15f.h"
2 
3 B15F* B15F::instance = nullptr;
4 errorhandler_t B15F::errorhandler = nullptr;
5 
6 B15F::B15F()
7 {
8  init();
9 }
10 
11 void B15F::init()
12 {
13 
14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
15  while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos)
16  device.pop_back();
17 
18  if(device.length() == 0)
19  abort("Adapter nicht gefunden");
20 
21  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
22 
23 
24 
25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
26  usart.setBaudrate(BAUDRATE);
27  usart.openDevice(device);
28  std::cout << "OK" << std::endl;
29 
30 
31 
32  std::cout << PRE << "Teste Verbindung... " << std::flush;
33  uint8_t tries = 3;
34  while(tries--)
35  {
36  // verwerfe Daten, die µC noch hat
37  //discard();
38 
39  if(!testConnection())
40  continue;
41 
42  if(!testIntConv())
43  continue;
44 
45  break;
46  }
47  if(tries == 0)
48  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
49  std::cout << "OK" << std::endl;
50 
51 
52  // Gib board info aus
53  std::vector<std::string> info = getBoardInfo();
54  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl;
55 }
56 
58 {
59  uint8_t tries = RECONNECT_TRIES;
60  while(tries--)
61  {
63  discard();
64 
65  if(testConnection())
66  return;
67  }
68 
69  abort("Verbindung kann nicht repariert werden");
70 }
71 
72 void B15F::discard(void)
73 {
74  try
75  {
76  usart.clearOutputBuffer();
77  for(uint8_t i = 0; i < 16; i++)
78  {
79  usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input)
80  delay_ms(4);
81  }
82  usart.clearInputBuffer();
83  }
84  catch(std::exception& ex)
85  {
86  abort(ex);
87  }
88 }
89 
91 {
92  // erzeuge zufälliges Byte
93  srand(time(NULL));
94  uint8_t dummy = rand() % 256;
95 
96  usart.writeByte(RQ_TEST);
97  usart.writeByte(dummy);
98 
99  uint8_t aw = usart.readByte();
100  uint8_t mirror = usart.readByte();
101 
102  return aw == MSG_OK && mirror == dummy;
103 }
104 
106 {
107  srand(time(NULL));
108  uint16_t dummy = rand() % (0xFFFF / 3);
109 
110  usart.writeByte(RQ_INT);
111  usart.writeInt(dummy);
112 
113  uint16_t aw = usart.readInt();
114  return aw == dummy * 3;
115 }
116 
117 
118 std::vector<std::string> B15F::getBoardInfo(void)
119 {
120  std::vector<std::string> info;
121 
122  usart.writeByte(RQ_INFO);
123 
124  uint8_t n = usart.readByte();
125  while(n--)
126  {
127  uint8_t len = usart.readByte();
128  std::string str;
129 
130  while(len--)
131  {
132  str += static_cast<char>(usart.readByte());
133  }
134 
135  info.push_back(str);
136  }
137 
138  uint8_t aw = usart.readByte();
139  if(aw != MSG_OK)
140  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
141 
142  return info;
143 }
144 
146 {
147  usart.writeByte(RQ_ST);
148 
149  uint8_t aw = usart.readByte();
150  return aw == MSG_OK;
151 }
152 
153 bool B15F::digitalWrite0(uint8_t port)
154 {
155  usart.writeByte(RQ_BA0);
156  usart.writeByte(port);
157 
158  uint8_t aw = usart.readByte();
159  delay_us(10);
160  return aw == MSG_OK;
161 }
162 
163 bool B15F::digitalWrite1(uint8_t port)
164 {
165  usart.writeByte(RQ_BA1);
166  usart.writeByte(port);
167 
168  uint8_t aw = usart.readByte();
169  delay_us(10);
170  return aw == MSG_OK;
171 }
172 
174 {
175  usart.clearInputBuffer();
176  usart.writeByte(RQ_BE0);
177  uint8_t byte = usart.readByte();
178  delay_us(10);
179  return byte;
180 }
181 
183 {
184  usart.clearInputBuffer();
185  usart.writeByte(RQ_BE1);
186  uint8_t byte = usart.readByte();
187  delay_us(10);
188  return byte;
189 }
190 
192 {
193  usart.clearInputBuffer();
194  usart.writeByte(RQ_DSW);
195  uint8_t byte = usart.readByte();
196  delay_us(10);
197  return byte;
198 }
199 
200 bool B15F::analogWrite0(uint16_t value)
201 {
202  usart.writeByte(RQ_AA0);
203  usart.writeInt(value);
204 
205  uint8_t aw = usart.readByte();
206  delay_us(10);
207  return aw == MSG_OK;
208 }
209 
210 bool B15F::analogWrite1(uint16_t value)
211 {
212  usart.writeByte(RQ_AA1);
213  usart.writeInt(value);
214 
215  uint8_t aw = usart.readByte();
216  delay_us(10);
217  return aw == MSG_OK;
218 }
219 
220 uint16_t B15F::analogRead(uint8_t channel)
221 {
222  usart.clearInputBuffer();
223  if(channel > 7)
224  abort("Bad ADC channel: " + std::to_string(channel));
225 
226  uint8_t rq[] =
227  {
228  RQ_ADC,
229  channel
230  };
231 
232  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
233  if(n_sent != sizeof(rq))
234  abort("Sent failed");
235 
236  uint16_t adc = usart.readInt();
237 
238  if(adc > 1023)
239  abort("Bad ADC data detected (1)");
240  return adc;
241 }
242 
243 void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
244 {
245  // check pointers
246  buffer_a += offset_a;
247  buffer_b += offset_b;
248 
249 
250  usart.clearInputBuffer();
251  usart.writeByte(RQ_ADC_DAC_STROKE);
252  usart.writeByte(channel_a);
253  usart.writeByte(channel_b);
254  usart.writeInt(start);
255  usart.writeInt(static_cast<uint16_t>(delta));
256  usart.writeInt(count);
257 
258  for(uint16_t i = 0; i < count; i++)
259  {
260  if(buffer_a)
261  {
262  buffer_a[i] = usart.readInt();
263 
264  if(buffer_a[i] > 1023) // check for broken usart connection
265  abort("Bad ADC data detected (2)");
266  }
267  else
268  {
269  usart.readInt();
270  }
271 
272  if(buffer_b)
273  {
274  buffer_b[i] = usart.readInt();
275 
276  if(buffer_b[i] > 1023) // check for broken usart connection
277  abort("Bad ADC data detected (3)");
278  }
279  else
280  {
281  usart.readInt();
282  }
283  }
284 
285  uint8_t aw = usart.readByte();
286  if(aw != MSG_OK)
287  abort("Sequenz unterbrochen");
288 
289  delay_us(10);
290 }
291 
292 void B15F::delay_ms(uint16_t ms)
293 {
294  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
295 }
296 
297 void B15F::delay_us(uint16_t us)
298 {
299  std::this_thread::sleep_for(std::chrono::microseconds(us));
300 }
301 
303 {
304  if(!instance)
305  instance = new B15F();
306 
307  return *instance;
308 }
309 
310 // https://stackoverflow.com/a/478960
311 std::string B15F::exec(std::string cmd)
312 {
313  std::array<char, 128> buffer;
314  std::string result;
315  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
316  if (!pipe)
317  {
318  throw std::runtime_error("popen() failed!");
319  }
320  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
321  {
322  result += buffer.data();
323  }
324  return result;
325 }
326 
327 void B15F::abort(std::string msg)
328 {
329  DriverException ex(msg);
330  abort(ex);
331 }
332 void B15F::abort(std::exception& ex)
333 {
334  if(errorhandler)
335  errorhandler(ex);
336  else
337  {
338  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
339  std::cout << ex.what() << std::endl;
340  throw DriverException(ex.what());
341  }
342 }
343 
344 void B15F::setAbortHandler(errorhandler_t func)
345 {
346  errorhandler = func;
347 }
+
static std::string exec(std::string cmd)
Definition: b15f.cpp:311
+
uint8_t readByte(void)
Definition: usart.cpp:211
+
void delay_us(uint16_t us)
Definition: b15f.cpp:297
+
uint8_t digitalRead0(void)
Definition: b15f.cpp:173
+
void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
Definition: b15f.cpp:243
bool testConnection(void)
Definition: b15f.cpp:90
-
uint8_t readDipSwitch(void)
Definition: b15f.cpp:190
-
void delay_ms(uint16_t ms)
Definition: b15f.cpp:290
-
bool analogWrite1(uint16_t)
Definition: b15f.cpp:209
-
static B15F & getInstance(void)
Definition: b15f.cpp:300
-
Definition: b15f.h:24
-
static void abort(std::string msg)
Definition: b15f.cpp:322
+
uint8_t readDipSwitch(void)
Definition: b15f.cpp:191
+
void delay_ms(uint16_t ms)
Definition: b15f.cpp:292
+
static B15F & getInstance(void)
Definition: b15f.cpp:302
+
Definition: b15f.h:26
+
static void abort(std::string msg)
Definition: b15f.cpp:327
void clearInputBuffer(void)
Definition: usart.cpp:39
void clearOutputBuffer(void)
Definition: usart.cpp:46
-
uint16_t analogRead(uint8_t channel)
Definition: b15f.cpp:219
-
bool digitalWrite0(uint8_t)
Definition: b15f.cpp:152
-
void setBaudrate(uint32_t baudrate)
Definition: usart.cpp:316
-
bool activateSelfTestMode(void)
Definition: b15f.cpp:144
+
uint16_t analogRead(uint8_t channel)
Definition: b15f.cpp:220
+
bool digitalWrite0(uint8_t)
Definition: b15f.cpp:153
+
const std::string PRE
B15F stdout prefix.
Definition: b15f.h:199
+
void setBaudrate(uint32_t baudrate)
Definition: usart.cpp:317
+
bool activateSelfTestMode(void)
Definition: b15f.cpp:145
std::vector< std::string > getBoardInfo(void)
Definition: b15f.cpp:118
+
constexpr static uint16_t RECONNECT_TIMEOUT
Time in ms after which a reconnect attempt aborts.
Definition: b15f.h:202
+
bool analogWrite1(uint16_t port)
Definition: b15f.cpp:210
void writeByte(uint8_t b)
Definition: usart.cpp:67
-
bool digitalWrite1(uint8_t)
Definition: b15f.cpp:162
+
bool digitalWrite1(uint8_t)
Definition: b15f.cpp:163
void discard(void)
Definition: b15f.cpp:72
-
bool analogWrite0(uint16_t)
Definition: b15f.cpp:199
+
constexpr static uint8_t MSG_OK
Value to acknowledge a received command.
Definition: b15f.h:200
void openDevice(std::string device)
Definition: usart.cpp:3
-
uint16_t readInt(void)
Definition: usart.cpp:229
-
uint8_t digitalRead1(void)
Definition: b15f.cpp:181
+
uint16_t readInt(void)
Definition: usart.cpp:230
+
uint8_t digitalRead1(void)
Definition: b15f.cpp:182
void reconnect(void)
Definition: b15f.cpp:57
-
static void setAbortHandler(errorhandler_t func)
Definition: b15f.cpp:339
+
constexpr static uint32_t BAUDRATE
USART baudrate for communication with the MCU.
Definition: b15f.h:205
+
static void setAbortHandler(errorhandler_t func)
Definition: b15f.cpp:344
+
bool analogWrite0(uint16_t port)
Definition: b15f.cpp:200
+
constexpr static uint8_t RECONNECT_TRIES
Maximum count of reconnect attempts after which the driver stops.
Definition: b15f.h:204
void writeInt(uint16_t d)
Definition: usart.cpp:81
bool testIntConv(void)
Definition: b15f.cpp:105
- + diff --git a/docs/html/b15f_8h_source.html b/docs/html/b15f_8h_source.html index 030198d..0f9eff8 100644 --- a/docs/html/b15f_8h_source.html +++ b/docs/html/b15f_8h_source.html @@ -70,33 +70,40 @@ $(function() {
b15f.h
-
1 #ifndef B15F_H
2 #define B15F_H
3 
4 #include <iostream>
5 #include <bits/stdc++.h>
6 #include <string>
7 #include <fstream>
8 #include <cstdlib>
9 #include <chrono>
10 #include <cstdint>
11 #include <vector>
12 
13 #include <unistd.h>
14 #include <fcntl.h>
15 #include <sys/ioctl.h>
16 #include <termios.h>
17 #include "usart.h"
18 #include "driverexception.h"
19 #include "timeoutexception.h"
20 
21 typedef std::function<void(std::exception&)> errorhandler_t;
22 
23 
24 class B15F
25 {
26 private:
27  // privater Konstruktor
28  B15F(void);
29 public:
30 
31  /*************************************
32  * Grundfunktionen des B15F Treibers *
33  *************************************/
34 
39  void reconnect(void);
40 
45  void discard(void);
46 
51  bool testConnection(void);
52 
57  bool testIntConv(void);
58 
63  std::vector<std::string> getBoardInfo(void);
64 
69  void delay_ms(uint16_t ms);
70 
75  void delay_us(uint16_t us);
76 
81  static B15F& getInstance(void);
82 
87  static std::string exec(std::string cmd);
88 
93  static void abort(std::string msg);
94 
99  static void abort(std::exception& ex);
100 
105  static void setAbortHandler(errorhandler_t func);
106 
107  /*************************************/
108 
109 
110 
111  /*************************
112  * Steuerbefehle für B15 *
113  *************************/
114 
120  bool activateSelfTestMode(void);
121 
127  bool digitalWrite0(uint8_t);
128 
134  bool digitalWrite1(uint8_t);
135 
141  uint8_t digitalRead0(void);
142 
148  uint8_t digitalRead1(void);
149 
155  uint8_t readDipSwitch(void);
156 
162  bool analogWrite0(uint16_t);
163 
169  bool analogWrite1(uint16_t);
170 
176  uint16_t analogRead(uint8_t channel);
177 
193  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
194 
195  /*************************/
196 
197 
198  // CONSTANTS
199  const std::string PRE = "[B15F] ";
200  constexpr static uint8_t MSG_OK = 0xFF;
201  constexpr static uint8_t MSG_FAIL = 0xFE;
202  constexpr static uint16_t RECONNECT_TIMEOUT = 64; // ms
203  constexpr static uint16_t WDT_TIMEOUT = 15; // ms
204  constexpr static uint8_t RECONNECT_TRIES = 3;
205  constexpr static uint32_t BAUDRATE = 57600;
206 
207 private:
208 
213  void init(void);
214 
215  USART usart;
216  static B15F* instance;
217  static errorhandler_t errorhandler;
218 
219  // REQUESTS
220  constexpr static uint8_t RQ_DISC = 0;
221  constexpr static uint8_t RQ_TEST = 1;
222  constexpr static uint8_t RQ_INFO = 2;
223  constexpr static uint8_t RQ_INT = 3;
224  constexpr static uint8_t RQ_ST = 4;
225  constexpr static uint8_t RQ_BA0 = 5;
226  constexpr static uint8_t RQ_BA1 = 6;
227  constexpr static uint8_t RQ_BE0 = 7;
228  constexpr static uint8_t RQ_BE1 = 8;
229  constexpr static uint8_t RQ_DSW = 9;
230  constexpr static uint8_t RQ_AA0 = 10;
231  constexpr static uint8_t RQ_AA1 = 11;
232  constexpr static uint8_t RQ_ADC = 12;
233  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
234 };
235 
236 #endif // B15F_H
-
static std::string exec(std::string cmd)
Definition: b15f.cpp:309
-
void delay_us(uint16_t us)
Definition: b15f.cpp:295
-
uint8_t digitalRead0(void)
Definition: b15f.cpp:172
-
void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
Definition: b15f.cpp:241
+
1 #ifndef B15F_H
2 #define B15F_H
3 
4 #include <iostream>
5 #include <bits/stdc++.h>
6 #include <string>
7 #include <fstream>
8 #include <cstdlib>
9 #include <chrono>
10 #include <cstdint>
11 #include <vector>
12 
13 #include <unistd.h>
14 #include <fcntl.h>
15 #include <sys/ioctl.h>
16 #include <termios.h>
17 #include "usart.h"
18 #include "driverexception.h"
19 #include "timeoutexception.h"
20 
21 typedef std::function<void(std::exception&)> errorhandler_t;
22 
23 
26 class B15F
27 {
28 private:
29  // privater Konstruktor
30  B15F(void);
31 public:
32 
33  /*************************************
34  * Grundfunktionen des B15F Treibers *
35  *************************************/
36 
41  void reconnect(void);
42 
47  void discard(void);
48 
53  bool testConnection(void);
54 
59  bool testIntConv(void);
60 
65  std::vector<std::string> getBoardInfo(void);
66 
71  void delay_ms(uint16_t ms);
72 
77  void delay_us(uint16_t us);
78 
83  static B15F& getInstance(void);
84 
89  static std::string exec(std::string cmd);
90 
95  static void abort(std::string msg);
96 
101  static void abort(std::exception& ex);
102 
107  static void setAbortHandler(errorhandler_t func);
108 
109  /*************************************/
110 
111 
112 
113  /*************************
114  * Steuerbefehle für B15 *
115  *************************/
116 
122  bool activateSelfTestMode(void);
123 
129  bool digitalWrite0(uint8_t);
130 
136  bool digitalWrite1(uint8_t);
137 
143  uint8_t digitalRead0(void);
144 
150  uint8_t digitalRead1(void);
151 
157  uint8_t readDipSwitch(void);
158 
164  bool analogWrite0(uint16_t port);
165 
171  bool analogWrite1(uint16_t port);
172 
178  uint16_t analogRead(uint8_t channel);
179 
195  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
196 
197  /*************************/
198 
199 
200  // CONSTANTS
201  const std::string PRE = "[B15F] ";
202  constexpr static uint8_t MSG_OK = 0xFF;
203  constexpr static uint8_t MSG_FAIL = 0xFE;
204  constexpr static uint16_t RECONNECT_TIMEOUT = 64;
205  constexpr static uint16_t WDT_TIMEOUT = 15;
206  constexpr static uint8_t RECONNECT_TRIES = 3;
207  constexpr static uint32_t BAUDRATE = 57600;
208 
209 private:
210 
215  void init(void);
216 
217  USART usart;
218  static B15F* instance;
219  static errorhandler_t errorhandler;
220 
221  // REQUESTS
222  constexpr static uint8_t RQ_DISC = 0;
223  constexpr static uint8_t RQ_TEST = 1;
224  constexpr static uint8_t RQ_INFO = 2;
225  constexpr static uint8_t RQ_INT = 3;
226  constexpr static uint8_t RQ_ST = 4;
227  constexpr static uint8_t RQ_BA0 = 5;
228  constexpr static uint8_t RQ_BA1 = 6;
229  constexpr static uint8_t RQ_BE0 = 7;
230  constexpr static uint8_t RQ_BE1 = 8;
231  constexpr static uint8_t RQ_DSW = 9;
232  constexpr static uint8_t RQ_AA0 = 10;
233  constexpr static uint8_t RQ_AA1 = 11;
234  constexpr static uint8_t RQ_ADC = 12;
235  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
236 };
237 
238 #endif // B15F_H
+
static std::string exec(std::string cmd)
Definition: b15f.cpp:311
+
constexpr static uint8_t MSG_FAIL
Value to reject a received command.
Definition: b15f.h:201
+
void delay_us(uint16_t us)
Definition: b15f.cpp:297
+
uint8_t digitalRead0(void)
Definition: b15f.cpp:173
+
void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
Definition: b15f.cpp:243
bool testConnection(void)
Definition: b15f.cpp:90
-
uint8_t readDipSwitch(void)
Definition: b15f.cpp:190
-
void delay_ms(uint16_t ms)
Definition: b15f.cpp:290
-
bool analogWrite1(uint16_t)
Definition: b15f.cpp:209
-
static B15F & getInstance(void)
Definition: b15f.cpp:300
-
Definition: b15f.h:24
-
static void abort(std::string msg)
Definition: b15f.cpp:322
-
Definition: usart.h:16
-
uint16_t analogRead(uint8_t channel)
Definition: b15f.cpp:219
-
bool digitalWrite0(uint8_t)
Definition: b15f.cpp:152
-
bool activateSelfTestMode(void)
Definition: b15f.cpp:144
+
uint8_t readDipSwitch(void)
Definition: b15f.cpp:191
+
void delay_ms(uint16_t ms)
Definition: b15f.cpp:292
+
static B15F & getInstance(void)
Definition: b15f.cpp:302
+
Definition: b15f.h:26
+
static void abort(std::string msg)
Definition: b15f.cpp:327
+
Definition: usart.h:18
+
uint16_t analogRead(uint8_t channel)
Definition: b15f.cpp:220
+
bool digitalWrite0(uint8_t)
Definition: b15f.cpp:153
+
const std::string PRE
B15F stdout prefix.
Definition: b15f.h:199
+
bool activateSelfTestMode(void)
Definition: b15f.cpp:145
std::vector< std::string > getBoardInfo(void)
Definition: b15f.cpp:118
-
bool digitalWrite1(uint8_t)
Definition: b15f.cpp:162
+
constexpr static uint16_t RECONNECT_TIMEOUT
Time in ms after which a reconnect attempt aborts.
Definition: b15f.h:202
+
bool analogWrite1(uint16_t port)
Definition: b15f.cpp:210
+
bool digitalWrite1(uint8_t)
Definition: b15f.cpp:163
void discard(void)
Definition: b15f.cpp:72
-
bool analogWrite0(uint16_t)
Definition: b15f.cpp:199
-
uint8_t digitalRead1(void)
Definition: b15f.cpp:181
+
constexpr static uint8_t MSG_OK
Value to acknowledge a received command.
Definition: b15f.h:200
+
uint8_t digitalRead1(void)
Definition: b15f.cpp:182
+
constexpr static uint16_t WDT_TIMEOUT
Time in ms after which the watch dog timer resets the MCU.
Definition: b15f.h:203
void reconnect(void)
Definition: b15f.cpp:57
-
static void setAbortHandler(errorhandler_t func)
Definition: b15f.cpp:339
+
constexpr static uint32_t BAUDRATE
USART baudrate for communication with the MCU.
Definition: b15f.h:205
+
static void setAbortHandler(errorhandler_t func)
Definition: b15f.cpp:344
+
bool analogWrite0(uint16_t port)
Definition: b15f.cpp:200
+
constexpr static uint8_t RECONNECT_TRIES
Maximum count of reconnect attempts after which the driver stops.
Definition: b15f.h:204
bool testIntConv(void)
Definition: b15f.cpp:105
diff --git a/docs/html/classB15F-members.html b/docs/html/classB15F-members.html index 6ad79a3..1c32f74 100644 --- a/docs/html/classB15F-members.html +++ b/docs/html/classB15F-members.html @@ -74,9 +74,9 @@ $(function() { activateSelfTestMode(void)B15F analogRead(uint8_t channel)B15F analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)B15F - analogWrite0(uint16_t)B15F - analogWrite1(uint16_t)B15F - BAUDRATE (defined in B15F)B15Fstatic + analogWrite0(uint16_t port)B15F + analogWrite1(uint16_t port)B15F + BAUDRATEB15Fstatic delay_ms(uint16_t ms)B15F delay_us(uint16_t us)B15F digitalRead0(void)B15F @@ -87,21 +87,21 @@ $(function() { exec(std::string cmd)B15Fstatic getBoardInfo(void)B15F getInstance(void)B15Fstatic - MSG_FAIL (defined in B15F)B15Fstatic - MSG_OK (defined in B15F)B15Fstatic - PRE (defined in B15F)B15F + MSG_FAILB15Fstatic + MSG_OKB15Fstatic + PREB15F readDipSwitch(void)B15F reconnect(void)B15F - RECONNECT_TIMEOUT (defined in B15F)B15Fstatic - RECONNECT_TRIES (defined in B15F)B15Fstatic + RECONNECT_TIMEOUTB15Fstatic + RECONNECT_TRIESB15Fstatic setAbortHandler(errorhandler_t func)B15Fstatic testConnection(void)B15F testIntConv(void)B15F - WDT_TIMEOUT (defined in B15F)B15Fstatic + WDT_TIMEOUTB15Fstatic diff --git a/docs/html/classB15F.html b/docs/html/classB15F.html index d2c9e9b..7271305 100644 --- a/docs/html/classB15F.html +++ b/docs/html/classB15F.html @@ -72,6 +72,8 @@ $(function() {
B15F Class Reference
+ +

#include <b15f.h>

@@ -101,10 +103,10 @@ Public Member Functions - - - - + + + + @@ -126,33 +128,41 @@ Static Public Member Functions +const std::string  +

Public Member Functions

 
uint8_t readDipSwitch (void)
 
bool analogWrite0 (uint16_t)
 
bool analogWrite1 (uint16_t)
 
bool analogWrite0 (uint16_t port)
 
bool analogWrite1 (uint16_t port)
 
uint16_t analogRead (uint8_t channel)
 
void analogSequence (uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)

Public Attributes

-const std::string PRE = "[B15F] "
PRE = "[B15F] "
 B15F stdout prefix.
 
+constexpr static uint8_t  + +constexpr static uint8_t  + +constexpr static uint16_t  + +constexpr static uint16_t  + +constexpr static uint8_t  + +constexpr static uint32_t  +

Static Public Attributes

-constexpr static uint8_t MSG_OK = 0xFF
MSG_OK = 0xFF
 Value to acknowledge a received command.
 
-constexpr static uint8_t MSG_FAIL = 0xFE
MSG_FAIL = 0xFE
 Value to reject a received command.
 
-constexpr static uint16_t RECONNECT_TIMEOUT = 64
RECONNECT_TIMEOUT = 64
 Time in ms after which a reconnect attempt aborts.
 
-constexpr static uint16_t WDT_TIMEOUT = 15
WDT_TIMEOUT = 15
 Time in ms after which the watch dog timer resets the MCU.
 
-constexpr static uint8_t RECONNECT_TRIES = 3
RECONNECT_TRIES = 3
 Maximum count of reconnect attempts after which the driver stops.
 
-constexpr static uint32_t BAUDRATE = 57600
BAUDRATE = 57600
 USART baudrate for communication with the MCU.
 

Detailed Description

-
-

Definition at line 24 of file b15f.h.

+

main driver class

+ +

Definition at line 26 of file b15f.h.

Member Function Documentation

◆ abort() [1/2]

@@ -184,7 +194,7 @@ constexpr static uint32_t  -

Definition at line 327 of file b15f.cpp.

+

Definition at line 332 of file b15f.cpp.

@@ -218,7 +228,7 @@ constexpr static uint32_t  -

Definition at line 322 of file b15f.cpp.

+

Definition at line 327 of file b15f.cpp.

@@ -244,7 +254,7 @@ constexpr static uint32_t  -

Definition at line 144 of file b15f.cpp.

+

Definition at line 145 of file b15f.cpp.

@@ -276,7 +286,7 @@ constexpr static uint32_t  -

Definition at line 219 of file b15f.cpp.

+

Definition at line 220 of file b15f.cpp.

@@ -368,12 +378,12 @@ constexpr static uint32_t  -

Definition at line 241 of file b15f.cpp.

+

Definition at line 243 of file b15f.cpp.

- -

◆ analogWrite0()

+ +

◆ analogWrite0()

@@ -382,7 +392,7 @@ constexpr static uint32_t  bool B15F::analogWrite0 ( uint16_t  - value) + port) @@ -400,12 +410,12 @@ constexpr static uint32_t  -

Definition at line 199 of file b15f.cpp.

+

Definition at line 200 of file b15f.cpp.

- -

◆ analogWrite1()

+ +

◆ analogWrite1()

@@ -414,7 +424,7 @@ constexpr static uint32_t  bool B15F::analogWrite1 ( uint16_t  - value) + port) @@ -432,7 +442,7 @@ constexpr static uint32_t  -

Definition at line 209 of file b15f.cpp.

+

Definition at line 210 of file b15f.cpp.

@@ -458,7 +468,7 @@ constexpr static uint32_t  -

Definition at line 290 of file b15f.cpp.

+

Definition at line 292 of file b15f.cpp.

@@ -484,7 +494,7 @@ constexpr static uint32_t  -

Definition at line 295 of file b15f.cpp.

+

Definition at line 297 of file b15f.cpp.

@@ -511,7 +521,7 @@ constexpr static uint32_t  -

Definition at line 172 of file b15f.cpp.

+

Definition at line 173 of file b15f.cpp.

@@ -538,7 +548,7 @@ constexpr static uint32_t  -

Definition at line 181 of file b15f.cpp.

+

Definition at line 182 of file b15f.cpp.

@@ -570,7 +580,7 @@ constexpr static uint32_t  -

Definition at line 152 of file b15f.cpp.

+

Definition at line 153 of file b15f.cpp.

@@ -602,7 +612,7 @@ constexpr static uint32_t  -

Definition at line 162 of file b15f.cpp.

+

Definition at line 163 of file b15f.cpp.

@@ -662,7 +672,7 @@ constexpr static uint32_t  -

Definition at line 309 of file b15f.cpp.

+

Definition at line 311 of file b15f.cpp.

@@ -722,7 +732,7 @@ constexpr static uint32_t  -

Definition at line 300 of file b15f.cpp.

+

Definition at line 302 of file b15f.cpp.

@@ -749,7 +759,7 @@ constexpr static uint32_t  -

Definition at line 190 of file b15f.cpp.

+

Definition at line 191 of file b15f.cpp.

@@ -809,7 +819,7 @@ constexpr static uint32_t  -

Definition at line 339 of file b15f.cpp.

+

Definition at line 344 of file b15f.cpp.

@@ -872,7 +882,7 @@ constexpr static uint32_t  diff --git a/docs/html/classDot-members.html b/docs/html/classDot-members.html index 414ff4f..c1464ba 100644 --- a/docs/html/classDot-members.html +++ b/docs/html/classDot-members.html @@ -69,14 +69,14 @@ $(function() {

This is the complete list of members for Dot, including all inherited members.

- - - - + + + +
Dot(uint16_t x, uint16_t y, uint8_t curve) (defined in Dot)Dot
getCurve(void) const (defined in Dot)Dot
getX(void) const (defined in Dot)Dot
getY(void) const (defined in Dot)Dot
Dot(uint16_t x, uint16_t y, uint8_t curve)Dot
getCurve(void) constDot
getX(void) constDot
getY(void) constDot
diff --git a/docs/html/classDot.html b/docs/html/classDot.html index 537f60a..318fa5d 100644 --- a/docs/html/classDot.html +++ b/docs/html/classDot.html @@ -69,33 +69,134 @@ $(function() {
Dot Class Reference
+ +

#include <dot.h>

- + - + - + - +

Public Member Functions

Dot (uint16_t x, uint16_t y, uint8_t curve)
 Dot (uint16_t x, uint16_t y, uint8_t curve)
 
-uint16_t getX (void) const
uint16_t getX (void) const
 
-uint16_t getY (void) const
uint16_t getY (void) const
 
-uint8_t getCurve (void) const
uint8_t getCurve (void) const
 

Detailed Description

-
-

Definition at line 7 of file dot.h.

-

The documentation for this class was generated from the following files:
    +

    Immutable dot class with x and y coordinate and curve index. Dots with the same curve index get the same color by plotty.

    + +

    Definition at line 12 of file dot.h.

    +

    Constructor & Destructor Documentation

    + +

    ◆ Dot()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Dot::Dot (uint16_t x,
    uint16_t y,
    uint8_t curve 
    )
    +
    +

    Constructor with x and y coordinate and curve index.

    + +

    Definition at line 3 of file dot.cpp.

    + +
    +
    +

    Member Function Documentation

    + +

    ◆ getCurve()

    + +
    +
    + + + + + + + + +
    uint8_t Dot::getCurve (void ) const
    +
    +

    Returns the curve index.

    + +

    Definition at line 19 of file dot.cpp.

    + +
    +
    + +

    ◆ getX()

    + +
    +
    + + + + + + + + +
    uint16_t Dot::getX (void ) const
    +
    +

    Returns the x coordinate.

    + +

    Definition at line 9 of file dot.cpp.

    + +
    +
    + +

    ◆ getY()

    + +
    +
    + + + + + + + + +
    uint16_t Dot::getY (void ) const
    +
    +

    Returns the y coordinate.

    + +

    Definition at line 14 of file dot.cpp.

    + +
    +
    +
    The documentation for this class was generated from the following files:
diff --git a/docs/html/classDriverException-members.html b/docs/html/classDriverException-members.html index d4c2560..848c1ce 100644 --- a/docs/html/classDriverException-members.html +++ b/docs/html/classDriverException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classDriverException.html b/docs/html/classDriverException.html index 1f469b3..5df8380 100644 --- a/docs/html/classDriverException.html +++ b/docs/html/classDriverException.html @@ -70,9 +70,13 @@ $(function() {
DriverException Class Reference
-
-Inheritance diagram for DriverException:
-
+ +

#include <driverexception.h>

+
+ + Inheritance diagram for DriverException:
+
+
+ @@ -96,15 +100,16 @@ std::string msg_<  

Detailed Description

-
-

Definition at line 8 of file driverexception.h.

+

Exception driver problems, for instance incompatible firmware version.

+ +

Definition at line 10 of file driverexception.h.


The documentation for this class was generated from the following file:
diff --git a/docs/html/classPlottyFile-members.html b/docs/html/classPlottyFile-members.html index 2486957..3e7bb5c 100644 --- a/docs/html/classPlottyFile-members.html +++ b/docs/html/classPlottyFile-members.html @@ -69,38 +69,38 @@ $(function() {

This is the complete list of members for PlottyFile, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
addDot(Dot &dot) (defined in PlottyFile)PlottyFile
addDot(Dot dot) (defined in PlottyFile)PlottyFile
getDescPara(void) const (defined in PlottyFile)PlottyFile
getDescX(void) const (defined in PlottyFile)PlottyFile
getDescY(void) const (defined in PlottyFile)PlottyFile
getFunctionType(void) const (defined in PlottyFile)PlottyFile
getParaFirstCurve(void) const (defined in PlottyFile)PlottyFile
getParaStepWidth(void) const (defined in PlottyFile)PlottyFile
getQuadrant(void) const (defined in PlottyFile)PlottyFile
getRefX(void) const (defined in PlottyFile)PlottyFile
getRefY(void) const (defined in PlottyFile)PlottyFile
getUnitPara(void) const (defined in PlottyFile)PlottyFile
getUnitX(void) const (defined in PlottyFile)PlottyFile
getUnitY(void) const (defined in PlottyFile)PlottyFile
setDescPara(std::string) (defined in PlottyFile)PlottyFile
setDescX(std::string) (defined in PlottyFile)PlottyFile
setDescY(std::string) (defined in PlottyFile)PlottyFile
setFunctionType(FunctionType) (defined in PlottyFile)PlottyFile
setParaFirstCurve(uint16_t) (defined in PlottyFile)PlottyFile
setParaStepWidth(uint16_t) (defined in PlottyFile)PlottyFile
setQuadrant(uint8_t) (defined in PlottyFile)PlottyFile
setRefX(uint16_t) (defined in PlottyFile)PlottyFile
setRefY(uint16_t) (defined in PlottyFile)PlottyFile
setUnitPara(std::string) (defined in PlottyFile)PlottyFile
setUnitX(std::string) (defined in PlottyFile)PlottyFile
setUnitY(std::string) (defined in PlottyFile)PlottyFile
startPlotty(std::string filename) (defined in PlottyFile)PlottyFile
writeToFile(std::string filename) (defined in PlottyFile)PlottyFile
addDot(Dot &dot)PlottyFile
addDot(Dot dot)PlottyFile
getDescPara(void) constPlottyFile
getDescX(void) constPlottyFile
getDescY(void) constPlottyFile
getFunctionType(void) constPlottyFile
getParaFirstCurve(void) constPlottyFile
getParaStepWidth(void) constPlottyFile
getQuadrant(void) constPlottyFile
getRefX(void) constPlottyFile
getRefY(void) constPlottyFile
getUnitPara(void) constPlottyFile
getUnitX(void) constPlottyFile
getUnitY(void) constPlottyFile
setDescPara(std::string desc_para)PlottyFile
setDescX(std::string desc_x)PlottyFile
setDescY(std::string desc_y)PlottyFile
setFunctionType(FunctionType function_type)PlottyFile
setParaFirstCurve(uint16_t para_first)PlottyFile
setParaStepWidth(uint16_t para_stepwidth)PlottyFile
setQuadrant(uint8_t quadrant)PlottyFile
setRefX(uint16_t ref_x)PlottyFile
setRefY(uint16_t ref_y)PlottyFile
setUnitPara(std::string unit_para)PlottyFile
setUnitX(std::string unit_x)PlottyFile
setUnitY(std::string unit_y)PlottyFile
startPlotty(std::string filename)PlottyFile
writeToFile(std::string filename)PlottyFile
diff --git a/docs/html/classPlottyFile.html b/docs/html/classPlottyFile.html index e3e9672..d68ad8e 100644 --- a/docs/html/classPlottyFile.html +++ b/docs/html/classPlottyFile.html @@ -69,105 +69,749 @@ $(function() {
PlottyFile Class Reference
+ +

#include <plottyfile.h>

- + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

-void addDot (Dot &dot)
void addDot (Dot &dot)
 
-void addDot (Dot dot)
void addDot (Dot dot)
 
-void setFunctionType (FunctionType)
 
-void setQuadrant (uint8_t)
 
-void setRefX (uint16_t)
 
-void setRefY (uint16_t)
 
-void setParaFirstCurve (uint16_t)
 
-void setParaStepWidth (uint16_t)
 
-void setUnitX (std::string)
 
-void setDescX (std::string)
 
-void setUnitY (std::string)
 
-void setDescY (std::string)
 
-void setUnitPara (std::string)
 
-void setDescPara (std::string)
 
-FunctionType getFunctionType (void) const
void setFunctionType (FunctionType function_type)
 
void setQuadrant (uint8_t quadrant)
 
void setRefX (uint16_t ref_x)
 
void setRefY (uint16_t ref_y)
 
void setParaFirstCurve (uint16_t para_first)
 
void setParaStepWidth (uint16_t para_stepwidth)
 
void setUnitX (std::string unit_x)
 
void setDescX (std::string desc_x)
 
void setUnitY (std::string unit_y)
 
void setDescY (std::string desc_y)
 
void setUnitPara (std::string unit_para)
 
void setDescPara (std::string desc_para)
 
FunctionType getFunctionType (void) const
 
-uint8_t getQuadrant (void) const
uint8_t getQuadrant (void) const
 
-uint16_t getRefX (void) const
uint16_t getRefX (void) const
 
-uint16_t getRefY (void) const
uint16_t getRefY (void) const
 
-uint16_t getParaFirstCurve (void) const
uint16_t getParaFirstCurve (void) const
 
-uint16_t getParaStepWidth (void) const
uint16_t getParaStepWidth (void) const
 
-std::string getUnitX (void) const
std::string getUnitX (void) const
 
-std::string getDescX (void) const
std::string getDescX (void) const
 
-std::string getUnitY (void) const
std::string getUnitY (void) const
 
-std::string getDescY (void) const
std::string getDescY (void) const
 
-std::string getUnitPara (void) const
std::string getUnitPara (void) const
 
-std::string getDescPara (void) const
std::string getDescPara (void) const
 
-void writeToFile (std::string filename)
void writeToFile (std::string filename)
 
-void startPlotty (std::string filename)
void startPlotty (std::string filename)
 

Detailed Description

-
-

Definition at line 17 of file plottyfile.h.

-

The documentation for this class was generated from the following files:
    +

    Wrapper class for convenient plot file creation, needed to display graphs using plotty.

    + +

    Definition at line 19 of file plottyfile.h.

    +

    Member Function Documentation

    + +

    ◆ addDot() [1/2]

    + +
    +
    + + + + + + + + +
    void PlottyFile::addDot (Dotdot)
    +
    +

    Adds a dot to the plotty file.

    Parameters
    + + +
    dotthe dot
    +
    +
    + +

    Definition at line 3 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ addDot() [2/2]

    + +
    +
    + + + + + + + + +
    void PlottyFile::addDot (Dot dot)
    +
    +

    Adds a dot by reference to the plotty file.

    Parameters
    + + +
    dotthe dot
    +
    +
    + +

    Definition at line 8 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getDescPara()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getDescPara (void ) const
    +
    +
    Returns
    description of parameter
    + +

    Definition at line 130 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getDescX()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getDescX (void ) const
    +
    +
    Returns
    description of x axis
    + +

    Definition at line 110 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getDescY()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getDescY (void ) const
    +
    +
    Returns
    description of y axis
    + +

    Definition at line 120 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getFunctionType()

    + +
    +
    + + + + + + + + +
    FunctionType PlottyFile::getFunctionType (void ) const
    +
    +
    Returns
    the FunctionType
    + +

    Definition at line 75 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getParaFirstCurve()

    + +
    +
    + + + + + + + + +
    uint16_t PlottyFile::getParaFirstCurve (void ) const
    +
    +
    Returns
    initial parameter value
    + +

    Definition at line 95 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getParaStepWidth()

    + +
    +
    + + + + + + + + +
    uint16_t PlottyFile::getParaStepWidth (void ) const
    +
    +
    Returns
    parameter stepwith
    + +

    Definition at line 100 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getQuadrant()

    + +
    +
    + + + + + + + + +
    uint8_t PlottyFile::getQuadrant (void ) const
    +
    +
    Returns
    the quadrant
    + +

    Definition at line 80 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getRefX()

    + +
    +
    + + + + + + + + +
    uint16_t PlottyFile::getRefX (void ) const
    +
    +
    Returns
    x reference (max) value
    + +

    Definition at line 85 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getRefY()

    + +
    +
    + + + + + + + + +
    uint16_t PlottyFile::getRefY (void ) const
    +
    +
    Returns
    y reference (max) value
    + +

    Definition at line 90 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getUnitPara()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getUnitPara (void ) const
    +
    +
    Returns
    unit of parameter
    + +

    Definition at line 125 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getUnitX()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getUnitX (void ) const
    +
    +
    Returns
    unit of x axis
    + +

    Definition at line 105 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getUnitY()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getUnitY (void ) const
    +
    +
    Returns
    unit of y axis
    + +

    Definition at line 115 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setDescPara()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setDescPara (std::string desc_para)
    +
    +

    Sets the description of the parameter.

    Parameters
    + + +
    para_firstdescription
    +
    +
    + +

    Definition at line 70 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setDescX()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setDescX (std::string desc_x)
    +
    +

    Sets the description of the x axis.

    Parameters
    + + +
    para_firstdescription
    +
    +
    + +

    Definition at line 50 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setDescY()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setDescY (std::string desc_y)
    +
    +

    Sets the description of the y axis.

    Parameters
    + + +
    para_firstdescription
    +
    +
    + +

    Definition at line 60 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setFunctionType()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setFunctionType (FunctionType function_type)
    +
    +

    Sets the FunctionType of this plotty file.

    Parameters
    + + +
    function_typeenum value
    +
    +
    + +

    Definition at line 13 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setParaFirstCurve()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setParaFirstCurve (uint16_t para_first)
    +
    +

    Sets initial value of the parameter. Gets used together with the stepwith to label the curves.

    Parameters
    + + +
    para_firstinitial parameter value
    +
    +
    + +

    Definition at line 35 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setParaStepWidth()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setParaStepWidth (uint16_t para_stepwidth)
    +
    +

    Sets the stepwith the parameter got increased with each curve.

    Parameters
    + + +
    para_firstparameter stepwith
    +
    +
    + +

    Definition at line 40 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setQuadrant()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setQuadrant (uint8_t quadrant)
    +
    +

    Sets the quadrant of this plot.

    Parameters
    + + +
    quadrantquadrant number (1..4)
    +
    +
    + +

    Definition at line 18 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setRefX()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setRefX (uint16_t ref_x)
    +
    +

    Sets reference (max) value of the x axis

    Parameters
    + + +
    ref_xreference value
    +
    +
    + +

    Definition at line 25 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setRefY()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setRefY (uint16_t ref_y)
    +
    +

    Sets reference (max) value of the y axis

    Parameters
    + + +
    ref_yreference value
    +
    +
    + +

    Definition at line 30 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setUnitPara()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setUnitPara (std::string unit_para)
    +
    +

    Sets the unit of the parameter.

    Parameters
    + + +
    para_firstunit
    +
    +
    + +

    Definition at line 65 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setUnitX()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setUnitX (std::string unit_x)
    +
    +

    Sets the unit of the x axis.

    Parameters
    + + +
    para_firstunit
    +
    +
    + +

    Definition at line 45 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setUnitY()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setUnitY (std::string unit_y)
    +
    +

    Sets the unit of the y axis.

    Parameters
    + + +
    para_firstunit
    +
    +
    + +

    Definition at line 55 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ startPlotty()

    + +
    +
    + + + + + + + + +
    void PlottyFile::startPlotty (std::string filename)
    +
    +

    Starts plotty with a plot file.

    Parameters
    + + +
    filenameplot path
    +
    +
    + +

    Definition at line 193 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ writeToFile()

    + +
    +
    + + + + + + + + +
    void PlottyFile::writeToFile (std::string filename)
    +
    +

    Saves the PlottyFile in a binary format, ready to open with plotty.

    Parameters
    + + +
    filenamedesired plot path
    +
    +
    + +

    Definition at line 147 of file plottyfile.cpp.

    + +
    +
    +
    The documentation for this class was generated from the following files:
diff --git a/docs/html/classTimeoutException-members.html b/docs/html/classTimeoutException-members.html index 511f555..a656c56 100644 --- a/docs/html/classTimeoutException-members.html +++ b/docs/html/classTimeoutException-members.html @@ -78,7 +78,7 @@ $(function() { diff --git a/docs/html/classTimeoutException.html b/docs/html/classTimeoutException.html index 8419517..77727db 100644 --- a/docs/html/classTimeoutException.html +++ b/docs/html/classTimeoutException.html @@ -70,9 +70,13 @@ $(function() {
TimeoutException Class Reference
-
-Inheritance diagram for TimeoutException:
-
+ +

#include <timeoutexception.h>

+
+ + Inheritance diagram for TimeoutException:
+
+
+ @@ -99,15 +103,16 @@ int m_timeout 

Detailed Description

-
-

Definition at line 8 of file timeoutexception.h.

+

Exception for USART related timeouts.

+ +

Definition at line 10 of file timeoutexception.h.


The documentation for this class was generated from the following file:
diff --git a/docs/html/classUSART-members.html b/docs/html/classUSART-members.html index b80ed02..4dc25df 100644 --- a/docs/html/classUSART-members.html +++ b/docs/html/classUSART-members.html @@ -93,7 +93,7 @@ $(function() {
diff --git a/docs/html/classUSART.html b/docs/html/classUSART.html index 965f784..89274cc 100644 --- a/docs/html/classUSART.html +++ b/docs/html/classUSART.html @@ -70,6 +70,8 @@ $(function() {
USART Class Reference
+ +

#include <usart.h>

@@ -127,8 +129,9 @@ constexpr static uint8_t 

Public Member Functions

B
 

Detailed Description

-
-

Definition at line 16 of file usart.h.

+

C++ Wrapper class for termios usart library.

+ +

Definition at line 18 of file usart.h.

Member Function Documentation

◆ clearInputBuffer()

@@ -251,7 +254,7 @@ constexpr static uint8_t B

Liefert die eingestellte Baudrate Änderungen werden erst nach einem open() wirksam

-

Definition at line 306 of file usart.cpp.

+

Definition at line 307 of file usart.cpp.

@@ -272,7 +275,7 @@ constexpr static uint8_t B

Liefert den eingestellten Timeout (in Dezisekunden) Änderungen werden erst nach einem open() wirksam

-

Definition at line 311 of file usart.cpp.

+

Definition at line 312 of file usart.cpp.

@@ -351,7 +354,7 @@ constexpr static uint8_t B -

Definition at line 210 of file usart.cpp.

+

Definition at line 211 of file usart.cpp.

@@ -377,7 +380,7 @@ constexpr static uint8_t B -

Definition at line 229 of file usart.cpp.

+

Definition at line 230 of file usart.cpp.

@@ -398,7 +401,7 @@ constexpr static uint8_t B

Setzt die Baudrate Änderungen werden erst nach einem open() wirksam

-

Definition at line 316 of file usart.cpp.

+

Definition at line 317 of file usart.cpp.

@@ -419,7 +422,7 @@ constexpr static uint8_t B

Setzt den Timeout (in Dezisekunden) Änderungen werden erst nach einem open() wirksam

-

Definition at line 321 of file usart.cpp.

+

Definition at line 322 of file usart.cpp.

@@ -494,7 +497,7 @@ constexpr static uint8_t B diff --git a/docs/html/classUSARTException-members.html b/docs/html/classUSARTException-members.html index 2ec12b3..03df1bd 100644 --- a/docs/html/classUSARTException-members.html +++ b/docs/html/classUSARTException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classUSARTException.html b/docs/html/classUSARTException.html index 956a359..4b9bc80 100644 --- a/docs/html/classUSARTException.html +++ b/docs/html/classUSARTException.html @@ -70,9 +70,13 @@ $(function() {
USARTException Class Reference
-
-Inheritance diagram for USARTException:
-
+ +

#include <usartexception.h>

+
+ + Inheritance diagram for USARTException:
+
+
+ @@ -96,15 +100,16 @@ std::string msg 

Detailed Description

-
-

Definition at line 9 of file usartexception.h.

+

Exception for USART problems, for instance buffer overflow.

+ +

Definition at line 11 of file usartexception.h.


The documentation for this class was generated from the following file:
diff --git a/docs/html/classView-members.html b/docs/html/classView-members.html index 2ce3664..94750c9 100644 --- a/docs/html/classView-members.html +++ b/docs/html/classView-members.html @@ -89,7 +89,7 @@ $(function() {
diff --git a/docs/html/classView.html b/docs/html/classView.html index cdc2f42..5c420fa 100644 --- a/docs/html/classView.html +++ b/docs/html/classView.html @@ -72,9 +72,13 @@ $(function() {
View Class Referenceabstract
-
-Inheritance diagram for View:
-
+ +

#include <view.h>

+
+ + Inheritance diagram for View:
+
+
+
-
-Inheritance diagram for ViewInfo:
-
+ +

#include <view_info.h>

+
+ + Inheritance diagram for ViewInfo:
+
+
+
-
-Inheritance diagram for ViewMonitor:
-
+ +

#include <view_monitor.h>

+
+ + Inheritance diagram for ViewMonitor:
+
+
+
-
-Inheritance diagram for ViewPromt:
-
+ +

#include <view_promt.h>

+
+ + Inheritance diagram for ViewPromt:
+
+
+
-
-Inheritance diagram for ViewSelection:
-
+ +

#include <view_selection.h>

+
+ + Inheritance diagram for ViewSelection:
+
+
+
-
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  while(win_changed_cooldown--)
39  std::this_thread::sleep_for(std::chrono::milliseconds(10));
40 
41  t_refresh_active = false;
42 
43  if(win_stack.size())
44  win_stack.back()->repaint();
45 
46  });
47  }
48 
49  }
50  else if(signal == SIGINT)
51  {
52  cleanup();
53  std::cout << "SIGINT - Abbruch." << std::endl;
54  exit(EXIT_FAILURE);
55  }
56 }
57 
58 void abort_handler(std::exception& ex)
59 {
60  ViewInfo* view = new ViewInfo();
61  view->setTitle("Fehler");
62  std::string msg(ex.what());
63  msg += "\n\nBeende in 5 Sekunden.";
64  view->setText(msg.c_str());
65  view->setLabelClose("");
66  view->repaint();
67 
68  std::this_thread::sleep_for(std::chrono::milliseconds(5000));
69 
70  cleanup();
71  std::cerr << std::endl << "*** EXCEPTION ***" << std::endl << ex.what() << std::endl;
72  exit(EXIT_FAILURE);
73 }
74 
75 void init()
76 {
77  // init b15 driver
79 #ifndef B15F_CLI_DEBUG
80  std::cout << std::endl << "Starte in 3s ..." << std::endl;
81  sleep(3);
82 #endif
83  B15F::setAbortHandler(&abort_handler);
84 
85  // init all ncurses stuff
86  initscr();
87  start_color();
88  curs_set(0); // 0: invisible, 1: normal, 2: very visible
89  clear();
90  noecho();
91  cbreak(); // Line buffering disabled. pass on everything
92  mousemask(ALL_MOUSE_EVENTS, NULL);
93 
94  // connect signals to handler
95  signal(SIGWINCH, signal_handler);
96  signal(SIGINT, signal_handler);
97 
98  // set view context
99  View::setWinContext(newwin(25, 85, 0, 0));
100 }
101 
102 
103 int main()
104 {
105  init();
106 
107  int exit_code = EXIT_SUCCESS;
108 
109  show_main(0);
110 
111  cleanup();
112 
113  return exit_code;
114 }
- -
static B15F & getInstance(void)
Definition: b15f.cpp:300
-
static void setAbortHandler(errorhandler_t func)
Definition: b15f.cpp:339
+
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
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 }
+ +
static B15F & getInstance(void)
Definition: b15f.cpp:302
+
static void setAbortHandler(errorhandler_t func)
Definition: b15f.cpp:344
diff --git a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html index f35095c..bebf28d 100644 --- a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html +++ b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html @@ -73,7 +73,7 @@ $(function() {
diff --git a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html index 10f6872..52fcf49 100644 --- a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html +++ b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html @@ -73,7 +73,7 @@ $(function() {
diff --git a/docs/html/dot_8cpp_source.html b/docs/html/dot_8cpp_source.html index b5442fc..853835b 100644 --- a/docs/html/dot_8cpp_source.html +++ b/docs/html/dot_8cpp_source.html @@ -70,10 +70,14 @@ $(function() {
dot.cpp
-
1 #include "dot.h"
2 
3 Dot::Dot(uint16_t x, uint16_t y, uint8_t curve) : x(x), y(y), curve(curve)
4 {
5  if(curve >= 64)
6  throw std::range_error("Kurvenindex muss im Bereich [0, 63] liegen");
7 }
8 
9 uint16_t Dot::getX() const
10 {
11  return x;
12 }
13 
14 uint16_t Dot::getY() const
15 {
16  return y;
17 }
18 
19 uint8_t Dot::getCurve(void) const
20 {
21  return curve;
22 }
+
1 #include "dot.h"
2 
3 Dot::Dot(uint16_t x, uint16_t y, uint8_t curve) : x(x), y(y), curve(curve)
4 {
5  if(curve >= 64)
6  throw std::range_error("Kurvenindex muss im Bereich [0, 63] liegen");
7 }
8 
9 uint16_t Dot::getX() const
10 {
11  return x;
12 }
13 
14 uint16_t Dot::getY() const
15 {
16  return y;
17 }
18 
19 uint8_t Dot::getCurve(void) const
20 {
21  return curve;
22 }
+
uint16_t getX(void) const
Definition: dot.cpp:9
+
uint16_t getY(void) const
Definition: dot.cpp:14
+
uint8_t getCurve(void) const
Definition: dot.cpp:19
+
Dot(uint16_t x, uint16_t y, uint8_t curve)
Definition: dot.cpp:3
diff --git a/docs/html/dot_8h_source.html b/docs/html/dot_8h_source.html index 695f88e..46b7ae7 100644 --- a/docs/html/dot_8h_source.html +++ b/docs/html/dot_8h_source.html @@ -70,11 +70,15 @@ $(function() {
dot.h
-
1 #ifndef DOT_H
2 #define DOT_H
3 
4 #include <cstdint>
5 #include <stdexcept>
6 
7 class Dot
8 {
9 public:
10  Dot(uint16_t x, uint16_t y, uint8_t curve);
11  uint16_t getX(void) const;
12  uint16_t getY(void) const;
13  uint8_t getCurve(void) const;
14 
15 private:
16  uint16_t x, y;
17  uint8_t curve;
18 };
19 
20 
21 #endif // DOT_H
-
Definition: dot.h:7
+
1 #ifndef DOT_H
2 #define DOT_H
3 
4 #include <cstdint>
5 #include <stdexcept>
6 
12 class Dot
13 {
14 public:
18  Dot(uint16_t x, uint16_t y, uint8_t curve);
19 
23  uint16_t getX(void) const;
24 
28  uint16_t getY(void) const;
29 
33  uint8_t getCurve(void) const;
34 
35 private:
36  uint16_t x, y;
37  uint8_t curve;
38 };
39 
40 
41 #endif // DOT_H
+
uint16_t getX(void) const
Definition: dot.cpp:9
+
Definition: dot.h:12
+
uint16_t getY(void) const
Definition: dot.cpp:14
+
uint8_t getCurve(void) const
Definition: dot.cpp:19
+
Dot(uint16_t x, uint16_t y, uint8_t curve)
Definition: dot.cpp:3
diff --git a/docs/html/driverexception_8h_source.html b/docs/html/driverexception_8h_source.html index a9c7385..25897b6 100644 --- a/docs/html/driverexception_8h_source.html +++ b/docs/html/driverexception_8h_source.html @@ -70,11 +70,11 @@ $(function() {
driverexception.h
-
1 #ifndef DRIVEREXCEPTION_H
2 #define DRIVEREXCEPTION_H
3 
4 #include <exception>
5 
6 // SOURCE: https://stackoverflow.com/a/8152888
7 
8 class DriverException: public std::exception
9 {
10 public:
11  explicit DriverException(const char* message) : msg_(message)
12  {
13  }
14 
15  explicit DriverException(const std::string& message) : msg_(message)
16  {
17  }
18 
19  virtual ~DriverException() throw ()
20  {
21  }
22 
23  virtual const char* what() const throw ()
24  {
25  return msg_.c_str();
26  }
27 
28 protected:
29  std::string msg_;
30 };
31 
32 #endif // DRIVEREXCEPTION_H
33 
- +
1 #ifndef DRIVEREXCEPTION_H
2 #define DRIVEREXCEPTION_H
3 
4 #include <exception>
5 
6 // SOURCE: https://stackoverflow.com/a/8152888
7 
10 class DriverException: public std::exception
11 {
12 public:
13  explicit DriverException(const char* message) : msg_(message)
14  {
15  }
16 
17  explicit DriverException(const std::string& message) : msg_(message)
18  {
19  }
20 
21  virtual ~DriverException() throw ()
22  {
23  }
24 
25  virtual const char* what() const throw ()
26  {
27  return msg_.c_str();
28  }
29 
30 protected:
31  std::string msg_;
32 };
33 
34 #endif // DRIVEREXCEPTION_H
35 
+ diff --git a/docs/html/files.html b/docs/html/files.html index e4b7368..92b9ab6 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -99,7 +99,7 @@ $(function() { diff --git a/docs/html/functions.html b/docs/html/functions.html index 1c5c177..1df7c12 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -71,6 +71,9 @@ $(function() {
  • activateSelfTestMode() : B15F
  • +
  • addDot() +: PlottyFile +
  • analogRead() : B15F
  • @@ -78,10 +81,17 @@ $(function() { : B15F
  • analogWrite0() -: B15F +: B15F
  • analogWrite1() -: B15F +: B15F +
  • + + + +

    - b -

    @@ -121,6 +131,9 @@ $(function() {
  • discard() : B15F
  • +
  • Dot() +: Dot +
  • @@ -145,12 +158,67 @@ $(function() {
  • getBoardInfo() : B15F
  • +
  • getCurve() +: Dot +
  • +
  • getDescPara() +: PlottyFile +
  • +
  • getDescX() +: PlottyFile +
  • +
  • getDescY() +: PlottyFile +
  • +
  • getFunctionType() +: PlottyFile +
  • getInstance() : B15F
  • +
  • getParaFirstCurve() +: PlottyFile +
  • +
  • getParaStepWidth() +: PlottyFile +
  • +
  • getQuadrant() +: PlottyFile +
  • +
  • getRefX() +: PlottyFile +
  • +
  • getRefY() +: PlottyFile +
  • getTimeout() : USART
  • +
  • getUnitPara() +: PlottyFile +
  • +
  • getUnitX() +: PlottyFile +
  • +
  • getUnitY() +: PlottyFile +
  • +
  • getX() +: Dot +
  • +
  • getY() +: Dot +
  • + + + +

    - m -

    @@ -162,6 +230,9 @@ $(function() {

    - p -

      +
    • PRE +: B15F +
    • printStatistics() : USART
    • @@ -181,6 +252,12 @@ $(function() {
    • reconnect() : B15F
    • +
    • RECONNECT_TIMEOUT +: B15F +
    • +
    • RECONNECT_TRIES +: B15F +
    @@ -191,9 +268,48 @@ $(function() {
  • setBaudrate() : USART
  • +
  • setDescPara() +: PlottyFile +
  • +
  • setDescX() +: PlottyFile +
  • +
  • setDescY() +: PlottyFile +
  • +
  • setFunctionType() +: PlottyFile +
  • +
  • setParaFirstCurve() +: PlottyFile +
  • +
  • setParaStepWidth() +: PlottyFile +
  • +
  • setQuadrant() +: PlottyFile +
  • +
  • setRefX() +: PlottyFile +
  • +
  • setRefY() +: PlottyFile +
  • setTimeout() : USART
  • +
  • setUnitPara() +: PlottyFile +
  • +
  • setUnitX() +: PlottyFile +
  • +
  • setUnitY() +: PlottyFile +
  • +
  • startPlotty() +: PlottyFile +
  • @@ -208,17 +324,23 @@ $(function() {

    - w -

    diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html index 0a45dfa..4fbff3f 100644 --- a/docs/html/functions_func.html +++ b/docs/html/functions_func.html @@ -71,6 +71,9 @@ $(function() {
  • activateSelfTestMode() : B15F
  • +
  • addDot() +: PlottyFile +
  • analogRead() : B15F
  • @@ -78,10 +81,10 @@ $(function() { : B15F
  • analogWrite0() -: B15F +: B15F
  • analogWrite1() -: B15F +: B15F
  • @@ -121,6 +124,9 @@ $(function() {
  • discard() : B15F
  • +
  • Dot() +: Dot +
  • @@ -145,12 +151,57 @@ $(function() {
  • getBoardInfo() : B15F
  • +
  • getCurve() +: Dot +
  • +
  • getDescPara() +: PlottyFile +
  • +
  • getDescX() +: PlottyFile +
  • +
  • getDescY() +: PlottyFile +
  • +
  • getFunctionType() +: PlottyFile +
  • getInstance() : B15F
  • +
  • getParaFirstCurve() +: PlottyFile +
  • +
  • getParaStepWidth() +: PlottyFile +
  • +
  • getQuadrant() +: PlottyFile +
  • +
  • getRefX() +: PlottyFile +
  • +
  • getRefY() +: PlottyFile +
  • getTimeout() : USART
  • +
  • getUnitPara() +: PlottyFile +
  • +
  • getUnitX() +: PlottyFile +
  • +
  • getUnitY() +: PlottyFile +
  • +
  • getX() +: Dot +
  • +
  • getY() +: Dot +
  • @@ -191,9 +242,48 @@ $(function() {
  • setBaudrate() : USART
  • +
  • setDescPara() +: PlottyFile +
  • +
  • setDescX() +: PlottyFile +
  • +
  • setDescY() +: PlottyFile +
  • +
  • setFunctionType() +: PlottyFile +
  • +
  • setParaFirstCurve() +: PlottyFile +
  • +
  • setParaStepWidth() +: PlottyFile +
  • +
  • setQuadrant() +: PlottyFile +
  • +
  • setRefX() +: PlottyFile +
  • +
  • setRefY() +: PlottyFile +
  • setTimeout() : USART
  • +
  • setUnitPara() +: PlottyFile +
  • +
  • setUnitX() +: PlottyFile +
  • +
  • setUnitY() +: PlottyFile +
  • +
  • startPlotty() +: PlottyFile +
  • @@ -214,11 +304,14 @@ $(function() {
  • writeInt() : USART
  • +
  • writeToFile() +: PlottyFile +
  • diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html new file mode 100644 index 0000000..c646f33 --- /dev/null +++ b/docs/html/functions_vars.html @@ -0,0 +1,96 @@ + + + + + + + +B15F: Class Members - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
      +
    • BAUDRATE +: B15F +
    • +
    • MSG_FAIL +: B15F +
    • +
    • MSG_OK +: B15F +
    • +
    • PRE +: B15F +
    • +
    • RECONNECT_TIMEOUT +: B15F +
    • +
    • RECONNECT_TRIES +: B15F +
    • +
    • WDT_TIMEOUT +: B15F +
    • +
    +
    + + + + diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html index 5c42834..c8df567 100644 --- a/docs/html/hierarchy.html +++ b/docs/html/hierarchy.html @@ -86,7 +86,7 @@ $(function() { diff --git a/docs/html/index.html b/docs/html/index.html index 39eaa17..aa89bbd 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -72,7 +72,7 @@ Dort befindet sich auch eine Übersicht der verfügbaren Befehle.

    diff --git a/docs/html/menudata.js b/docs/html/menudata.js index 3c52b9d..311e0c2 100644 --- a/docs/html/menudata.js +++ b/docs/html/menudata.js @@ -29,11 +29,13 @@ var menudata={children:[ {text:"Class Members",url:"functions.html",children:[ {text:"All",url:"functions.html",children:[ {text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, {text:"c",url:"functions.html#index_c"}, {text:"d",url:"functions.html#index_d"}, {text:"e",url:"functions.html#index_e"}, {text:"f",url:"functions.html#index_f"}, {text:"g",url:"functions.html#index_g"}, +{text:"m",url:"functions.html#index_m"}, {text:"o",url:"functions.html#index_o"}, {text:"p",url:"functions.html#index_p"}, {text:"r",url:"functions.html#index_r"}, @@ -52,6 +54,7 @@ var menudata={children:[ {text:"r",url:"functions_func.html#index_r"}, {text:"s",url:"functions_func.html#index_s"}, {text:"t",url:"functions_func.html#index_t"}, -{text:"w",url:"functions_func.html#index_w"}]}]}]}, +{text:"w",url:"functions_func.html#index_w"}]}, +{text:"Variables",url:"functions_vars.html"}]}]}, {text:"Files",url:"files.html",children:[ {text:"File List",url:"files.html"}]}]} diff --git a/docs/html/plottyfile_8cpp_source.html b/docs/html/plottyfile_8cpp_source.html index 75db2c6..c31ae5e 100644 --- a/docs/html/plottyfile_8cpp_source.html +++ b/docs/html/plottyfile_8cpp_source.html @@ -70,11 +70,38 @@ $(function() {
    plottyfile.cpp
    -
    1 #include "plottyfile.h"
    2 
    3 void PlottyFile::addDot(Dot& dot)
    4 {
    5  dots.push_back(dot);
    6 }
    7 
    8 void PlottyFile::addDot(Dot dot)
    9 {
    10  dots.push_back(dot);
    11 }
    12 
    13 void PlottyFile::setFunctionType(FunctionType function_type)
    14 {
    15  this->function_type = function_type;
    16 }
    17 
    18 void PlottyFile::setQuadrant(uint8_t quadrant)
    19 {
    20  if(quadrant < 1 || quadrant > 4)
    21  throw std::range_error("Ungueltiger Quadrant");
    22  this->quadrant = quadrant;
    23 }
    24 
    25 void PlottyFile::setRefX(uint16_t ref_x)
    26 {
    27  this->ref_x = ref_x;
    28 }
    29 
    30 void PlottyFile::setRefY(uint16_t ref_y)
    31 {
    32  this->ref_y = ref_y;
    33 }
    34 
    35 void PlottyFile::setParaFirstCurve(uint16_t para_first)
    36 {
    37  this->para_first = para_first;
    38 }
    39 
    40 void PlottyFile::setParaStepWidth(uint16_t para_stepwidth)
    41 {
    42  this->para_stepwidth = para_stepwidth;
    43 }
    44 
    45 void PlottyFile::setUnitX(std::string unit_x)
    46 {
    47  this->unit_x = unit_x;
    48 }
    49 
    50 void PlottyFile::setDescX(std::string desc_x)
    51 {
    52  this->desc_x = desc_x;
    53 }
    54 
    55 void PlottyFile::setUnitY(std::string unit_y)
    56 {
    57  this->unit_y = unit_y;
    58 }
    59 
    60 void PlottyFile::setDescY(std::string desc_y)
    61 {
    62  this->desc_y = desc_y;
    63 }
    64 
    65 void PlottyFile::setUnitPara(std::string unit_para)
    66 {
    67  this->unit_para = unit_para;
    68 }
    69 
    70 void PlottyFile::setDescPara(std::string desc_para)
    71 {
    72  this->desc_para = desc_para;
    73 }
    74 
    75 FunctionType PlottyFile::getFunctionType() const
    76 {
    77  return function_type;
    78 }
    79 
    80 uint8_t PlottyFile::getQuadrant() const
    81 {
    82  return quadrant;
    83 }
    84 
    85 uint16_t PlottyFile::getRefX() const
    86 {
    87  return ref_x;
    88 }
    89 
    90 uint16_t PlottyFile::getRefY() const
    91 {
    92  return ref_y;
    93 }
    94 
    95 uint16_t PlottyFile::getParaFirstCurve() const
    96 {
    97  return para_first;
    98 }
    99 
    100 uint16_t PlottyFile::getParaStepWidth() const
    101 {
    102  return para_stepwidth;
    103 }
    104 
    105 std::string PlottyFile::getUnitX() const
    106 {
    107  return unit_x;
    108 }
    109 
    110 std::string PlottyFile::getDescX() const
    111 {
    112  return desc_x;
    113 }
    114 
    115 std::string PlottyFile::getUnitY() const
    116 {
    117  return unit_y;
    118 }
    119 
    120 std::string PlottyFile::getDescY() const
    121 {
    122  return desc_y;
    123 }
    124 
    125 std::string PlottyFile::getUnitPara() const
    126 {
    127  return unit_para;
    128 }
    129 
    130 std::string PlottyFile::getDescPara() const
    131 {
    132  return desc_para;
    133 }
    134 
    135 void PlottyFile::prepStr(std::string& str, uint8_t len)
    136 {
    137  if(str.length() > len)
    138  throw std::runtime_error("Zu grosser String.");
    139 
    140  if(str.length() != len)
    141  str += '\n';
    142 
    143  while(str.length() < len)
    144  str += '\0';
    145 }
    146 
    147 void PlottyFile::writeToFile(std::string filename)
    148 {
    149  prepStr(unit_x, STR_LEN_SHORT);
    150  prepStr(desc_x, STR_LEN_LARGE);
    151  prepStr(unit_y, STR_LEN_SHORT);
    152  prepStr(desc_y, STR_LEN_LARGE);
    153  prepStr(unit_para, STR_LEN_SHORT);
    154  prepStr(desc_para, STR_LEN_LARGE);
    155 
    156  std::ofstream file(filename);
    157 
    158  // write file header
    159  file.write(reinterpret_cast<char*>(&command), 1);
    160  file.write(head.c_str(), head.length());
    161  file.write(filetype.c_str(), filetype.length());
    162  file.write(reinterpret_cast<char*>(&version), 2);
    163  file.write(reinterpret_cast<char*>(&subversion), 2);
    164  file.put(static_cast<uint8_t>(function_type));
    165  file.write(reinterpret_cast<char*>(&quadrant), 1);
    166  file.write(reinterpret_cast<char*>(&ref_x), 2);
    167  file.write(reinterpret_cast<char*>(&ref_y), 2);
    168  file.write(reinterpret_cast<char*>(&para_first), 2);
    169  file.write(reinterpret_cast<char*>(&para_stepwidth), 2);
    170  file.write(unit_x.c_str(), unit_x.length());
    171  file.write(desc_x.c_str(), desc_x.length());
    172  file.write(unit_y.c_str(), unit_y.length());
    173  file.write(desc_y.c_str(), desc_y.length());
    174  file.write(unit_para.c_str(), unit_para.length());
    175  file.write(desc_para.c_str(), desc_para.length());
    176  file.write(reinterpret_cast<const char*>(&eof), 1);
    177 
    178  // make sure header size is 256 Byte
    179  while(file.tellp() < 256)
    180  file.put(0);
    181 
    182  for(Dot& dot : dots)
    183  {
    184  file.put((dot.getX() >> 8) | (static_cast<uint8_t>(dot.getCurve()) << 2));
    185  file.put(dot.getX() & 0xFF);
    186  file.put(dot.getY() >> 8);
    187  file.put(dot.getY() & 0xFF);
    188  }
    189 
    190  file.close();
    191 }
    192 
    193 void PlottyFile::startPlotty(std::string filename)
    194 {
    195  int code = system(("plotty --in " + filename).c_str());
    196  if(code)
    197  throw std::runtime_error("Fehler beim Aufruf von plotty");
    198 }
    -
    Definition: dot.h:7
    +
    1 #include "plottyfile.h"
    2 
    4 {
    5  dots.push_back(dot);
    6 }
    7 
    9 {
    10  dots.push_back(dot);
    11 }
    12 
    13 void PlottyFile::setFunctionType(FunctionType function_type)
    14 {
    15  this->function_type = function_type;
    16 }
    17 
    18 void PlottyFile::setQuadrant(uint8_t quadrant)
    19 {
    20  if(quadrant < 1 || quadrant > 4)
    21  throw std::range_error("Ungueltiger Quadrant");
    22  this->quadrant = quadrant;
    23 }
    24 
    25 void PlottyFile::setRefX(uint16_t ref_x)
    26 {
    27  this->ref_x = ref_x;
    28 }
    29 
    30 void PlottyFile::setRefY(uint16_t ref_y)
    31 {
    32  this->ref_y = ref_y;
    33 }
    34 
    35 void PlottyFile::setParaFirstCurve(uint16_t para_first)
    36 {
    37  this->para_first = para_first;
    38 }
    39 
    40 void PlottyFile::setParaStepWidth(uint16_t para_stepwidth)
    41 {
    42  this->para_stepwidth = para_stepwidth;
    43 }
    44 
    45 void PlottyFile::setUnitX(std::string unit_x)
    46 {
    47  this->unit_x = unit_x;
    48 }
    49 
    50 void PlottyFile::setDescX(std::string desc_x)
    51 {
    52  this->desc_x = desc_x;
    53 }
    54 
    55 void PlottyFile::setUnitY(std::string unit_y)
    56 {
    57  this->unit_y = unit_y;
    58 }
    59 
    60 void PlottyFile::setDescY(std::string desc_y)
    61 {
    62  this->desc_y = desc_y;
    63 }
    64 
    65 void PlottyFile::setUnitPara(std::string unit_para)
    66 {
    67  this->unit_para = unit_para;
    68 }
    69 
    70 void PlottyFile::setDescPara(std::string desc_para)
    71 {
    72  this->desc_para = desc_para;
    73 }
    74 
    75 FunctionType PlottyFile::getFunctionType() const
    76 {
    77  return function_type;
    78 }
    79 
    80 uint8_t PlottyFile::getQuadrant() const
    81 {
    82  return quadrant;
    83 }
    84 
    85 uint16_t PlottyFile::getRefX() const
    86 {
    87  return ref_x;
    88 }
    89 
    90 uint16_t PlottyFile::getRefY() const
    91 {
    92  return ref_y;
    93 }
    94 
    96 {
    97  return para_first;
    98 }
    99 
    101 {
    102  return para_stepwidth;
    103 }
    104 
    105 std::string PlottyFile::getUnitX() const
    106 {
    107  return unit_x;
    108 }
    109 
    110 std::string PlottyFile::getDescX() const
    111 {
    112  return desc_x;
    113 }
    114 
    115 std::string PlottyFile::getUnitY() const
    116 {
    117  return unit_y;
    118 }
    119 
    120 std::string PlottyFile::getDescY() const
    121 {
    122  return desc_y;
    123 }
    124 
    125 std::string PlottyFile::getUnitPara() const
    126 {
    127  return unit_para;
    128 }
    129 
    130 std::string PlottyFile::getDescPara() const
    131 {
    132  return desc_para;
    133 }
    134 
    135 void PlottyFile::prepStr(std::string& str, uint8_t len)
    136 {
    137  if(str.length() > len)
    138  throw std::runtime_error("Zu grosser String.");
    139 
    140  if(str.length() != len)
    141  str += '\n';
    142 
    143  while(str.length() < len)
    144  str += '\0';
    145 }
    146 
    147 void PlottyFile::writeToFile(std::string filename)
    148 {
    149  prepStr(unit_x, STR_LEN_SHORT);
    150  prepStr(desc_x, STR_LEN_LARGE);
    151  prepStr(unit_y, STR_LEN_SHORT);
    152  prepStr(desc_y, STR_LEN_LARGE);
    153  prepStr(unit_para, STR_LEN_SHORT);
    154  prepStr(desc_para, STR_LEN_LARGE);
    155 
    156  std::ofstream file(filename);
    157 
    158  // write file header
    159  file.write(reinterpret_cast<char*>(&command), 1);
    160  file.write(head.c_str(), head.length());
    161  file.write(filetype.c_str(), filetype.length());
    162  file.write(reinterpret_cast<char*>(&version), 2);
    163  file.write(reinterpret_cast<char*>(&subversion), 2);
    164  file.put(static_cast<uint8_t>(function_type));
    165  file.write(reinterpret_cast<char*>(&quadrant), 1);
    166  file.write(reinterpret_cast<char*>(&ref_x), 2);
    167  file.write(reinterpret_cast<char*>(&ref_y), 2);
    168  file.write(reinterpret_cast<char*>(&para_first), 2);
    169  file.write(reinterpret_cast<char*>(&para_stepwidth), 2);
    170  file.write(unit_x.c_str(), unit_x.length());
    171  file.write(desc_x.c_str(), desc_x.length());
    172  file.write(unit_y.c_str(), unit_y.length());
    173  file.write(desc_y.c_str(), desc_y.length());
    174  file.write(unit_para.c_str(), unit_para.length());
    175  file.write(desc_para.c_str(), desc_para.length());
    176  file.write(reinterpret_cast<const char*>(&eof), 1);
    177 
    178  // make sure header size is 256 Byte
    179  while(file.tellp() < 256)
    180  file.put(0);
    181 
    182  for(Dot& dot : dots)
    183  {
    184  file.put((dot.getX() >> 8) | (static_cast<uint8_t>(dot.getCurve()) << 2));
    185  file.put(dot.getX() & 0xFF);
    186  file.put(dot.getY() >> 8);
    187  file.put(dot.getY() & 0xFF);
    188  }
    189 
    190  file.close();
    191 }
    192 
    193 void PlottyFile::startPlotty(std::string filename)
    194 {
    195  int code = system(("plotty --in " + filename).c_str());
    196  if(code)
    197  throw std::runtime_error("Fehler beim Aufruf von plotty");
    198 }
    +
    void setParaStepWidth(uint16_t para_stepwidth)
    Definition: plottyfile.cpp:40
    +
    uint8_t getQuadrant(void) const
    Definition: plottyfile.cpp:80
    +
    void startPlotty(std::string filename)
    Definition: plottyfile.cpp:193
    +
    void writeToFile(std::string filename)
    Definition: plottyfile.cpp:147
    +
    void setUnitX(std::string unit_x)
    Definition: plottyfile.cpp:45
    +
    void setUnitPara(std::string unit_para)
    Definition: plottyfile.cpp:65
    +
    void setDescY(std::string desc_y)
    Definition: plottyfile.cpp:60
    +
    void setQuadrant(uint8_t quadrant)
    Definition: plottyfile.cpp:18
    +
    std::string getDescY(void) const
    Definition: plottyfile.cpp:120
    +
    void setRefY(uint16_t ref_y)
    Definition: plottyfile.cpp:30
    +
    std::string getDescX(void) const
    Definition: plottyfile.cpp:110
    +
    void setFunctionType(FunctionType function_type)
    Definition: plottyfile.cpp:13
    +
    void setDescX(std::string desc_x)
    Definition: plottyfile.cpp:50
    +
    Definition: dot.h:12
    +
    void setRefX(uint16_t ref_x)
    Definition: plottyfile.cpp:25
    +
    void setUnitY(std::string unit_y)
    Definition: plottyfile.cpp:55
    +
    void addDot(Dot &dot)
    Definition: plottyfile.cpp:3
    +
    void setDescPara(std::string desc_para)
    Definition: plottyfile.cpp:70
    +
    uint16_t getParaStepWidth(void) const
    Definition: plottyfile.cpp:100
    +
    std::string getDescPara(void) const
    Definition: plottyfile.cpp:130
    +
    void setParaFirstCurve(uint16_t para_first)
    Definition: plottyfile.cpp:35
    +
    std::string getUnitY(void) const
    Definition: plottyfile.cpp:115
    +
    uint16_t getParaFirstCurve(void) const
    Definition: plottyfile.cpp:95
    +
    uint16_t getRefX(void) const
    Definition: plottyfile.cpp:85
    +
    std::string getUnitPara(void) const
    Definition: plottyfile.cpp:125
    +
    FunctionType getFunctionType(void) const
    Definition: plottyfile.cpp:75
    +
    uint16_t getRefY(void) const
    Definition: plottyfile.cpp:90
    +
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    diff --git a/docs/html/plottyfile_8h_source.html b/docs/html/plottyfile_8h_source.html index a263325..4fdc771 100644 --- a/docs/html/plottyfile_8h_source.html +++ b/docs/html/plottyfile_8h_source.html @@ -70,12 +70,39 @@ $(function() {
    plottyfile.h
    -
    1 #ifndef PLOTTYFILE_H
    2 #define PLOTTYFILE_H
    3 
    4 #include <iostream>
    5 #include <fstream>
    6 #include <exception>
    7 #include <vector>
    8 #include "dot.h"
    9 
    10 enum FunctionType
    11 {
    12  CurveFamily = 'S',
    13  Curve = 'C',
    14  Level = 'P'
    15 };
    16 
    18 {
    19 public:
    20  void addDot(Dot& dot);
    21  void addDot(Dot dot);
    22 
    23  void setFunctionType(FunctionType);
    24  void setQuadrant(uint8_t);
    25  void setRefX(uint16_t);
    26  void setRefY(uint16_t);
    27  void setParaFirstCurve(uint16_t);
    28  void setParaStepWidth(uint16_t);
    29  void setUnitX(std::string);
    30  void setDescX(std::string);
    31  void setUnitY(std::string);
    32  void setDescY(std::string);
    33  void setUnitPara(std::string);
    34  void setDescPara(std::string);
    35 
    36  FunctionType getFunctionType(void) const;
    37  uint8_t getQuadrant(void) const;
    38  uint16_t getRefX(void) const;
    39  uint16_t getRefY(void) const;
    40  uint16_t getParaFirstCurve(void) const;
    41  uint16_t getParaStepWidth(void) const;
    42  std::string getUnitX(void) const;
    43  std::string getDescX(void) const;
    44  std::string getUnitY(void) const;
    45  std::string getDescY(void) const;
    46  std::string getUnitPara(void) const;
    47  std::string getDescPara(void) const;
    48 
    49  void writeToFile(std::string filename);
    50  void startPlotty(std::string filename);
    51 private:
    52  void prepStr(std::string& str, uint8_t len);
    53 
    54  std::vector<Dot> dots;
    55 
    56  int8_t command = 0x1D;
    57  const std::string head = "HTWK-HWLab";
    58  const std::string filetype = "MD";
    59  int16_t version = 1;
    60  int16_t subversion = 0;
    61  FunctionType function_type = FunctionType::Curve;
    62  uint8_t quadrant = 1;
    63  uint16_t ref_x = 1023;
    64  uint16_t ref_y = 1023;
    65  uint16_t para_first = 1;
    66  uint16_t para_stepwidth = 1;
    67  std::string unit_x;
    68  std::string desc_x;
    69  std::string unit_y;
    70  std::string desc_y;
    71  std::string unit_para;
    72  std::string desc_para;
    73  const uint8_t eof = 0xD;
    74 
    75  constexpr static uint8_t STR_LEN_SHORT = 10;
    76  constexpr static uint8_t STR_LEN_LARGE = 20;
    77 };
    78 
    79 #endif // PLOTTYFILE_H
    - -
    Definition: dot.h:7
    +
    1 #ifndef PLOTTYFILE_H
    2 #define PLOTTYFILE_H
    3 
    4 #include <iostream>
    5 #include <fstream>
    6 #include <exception>
    7 #include <vector>
    8 #include "dot.h"
    9 
    10 enum FunctionType
    11 {
    12  CurveFamily = 'S',
    13  Curve = 'C',
    14  Level = 'P'
    15 };
    16 
    20 {
    21 public:
    26  void addDot(Dot& dot);
    27 
    32  void addDot(Dot dot);
    33 
    38  void setFunctionType(FunctionType function_type);
    39 
    44  void setQuadrant(uint8_t quadrant);
    45 
    50  void setRefX(uint16_t ref_x);
    51 
    56  void setRefY(uint16_t ref_y);
    57 
    63  void setParaFirstCurve(uint16_t para_first);
    64 
    69  void setParaStepWidth(uint16_t para_stepwidth);
    70 
    75  void setUnitX(std::string unit_x);
    76 
    81  void setDescX(std::string desc_x);
    82 
    87  void setUnitY(std::string unit_y);
    88 
    93  void setDescY(std::string desc_y);
    94 
    99  void setUnitPara(std::string unit_para);
    104  void setDescPara(std::string desc_para);
    105 
    106 
    107 
    111  FunctionType getFunctionType(void) const;
    112 
    116  uint8_t getQuadrant(void) const;
    117 
    121  uint16_t getRefX(void) const;
    122 
    126  uint16_t getRefY(void) const;
    127 
    131  uint16_t getParaFirstCurve(void) const;
    132 
    136  uint16_t getParaStepWidth(void) const;
    137 
    141  std::string getUnitX(void) const;
    142 
    146  std::string getDescX(void) const;
    147 
    151  std::string getUnitY(void) const;
    152 
    156  std::string getDescY(void) const;
    157 
    161  std::string getUnitPara(void) const;
    162 
    166  std::string getDescPara(void) const;
    167 
    168 
    173  void writeToFile(std::string filename);
    174 
    179  void startPlotty(std::string filename);
    180 private:
    181  void prepStr(std::string& str, uint8_t len);
    182 
    183  std::vector<Dot> dots;
    184 
    185  int8_t command = 0x1D;
    186  const std::string head = "HTWK-HWLab";
    187  const std::string filetype = "MD";
    188  int16_t version = 1;
    189  int16_t subversion = 0;
    190  FunctionType function_type = FunctionType::Curve;
    191  uint8_t quadrant = 1;
    192  uint16_t ref_x = 1023;
    193  uint16_t ref_y = 1023;
    194  uint16_t para_first = 1;
    195  uint16_t para_stepwidth = 1;
    196  std::string unit_x;
    197  std::string desc_x;
    198  std::string unit_y;
    199  std::string desc_y;
    200  std::string unit_para;
    201  std::string desc_para;
    202  const uint8_t eof = 0xD;
    203 
    204  constexpr static uint8_t STR_LEN_SHORT = 10;
    205  constexpr static uint8_t STR_LEN_LARGE = 20;
    206 };
    207 
    208 #endif // PLOTTYFILE_H
    +
    void setParaStepWidth(uint16_t para_stepwidth)
    Definition: plottyfile.cpp:40
    +
    uint8_t getQuadrant(void) const
    Definition: plottyfile.cpp:80
    +
    void startPlotty(std::string filename)
    Definition: plottyfile.cpp:193
    +
    void writeToFile(std::string filename)
    Definition: plottyfile.cpp:147
    +
    void setUnitX(std::string unit_x)
    Definition: plottyfile.cpp:45
    +
    void setUnitPara(std::string unit_para)
    Definition: plottyfile.cpp:65
    +
    void setDescY(std::string desc_y)
    Definition: plottyfile.cpp:60
    +
    void setQuadrant(uint8_t quadrant)
    Definition: plottyfile.cpp:18
    +
    std::string getDescY(void) const
    Definition: plottyfile.cpp:120
    + +
    void setRefY(uint16_t ref_y)
    Definition: plottyfile.cpp:30
    +
    std::string getDescX(void) const
    Definition: plottyfile.cpp:110
    +
    void setFunctionType(FunctionType function_type)
    Definition: plottyfile.cpp:13
    +
    void setDescX(std::string desc_x)
    Definition: plottyfile.cpp:50
    +
    Definition: dot.h:12
    +
    void setRefX(uint16_t ref_x)
    Definition: plottyfile.cpp:25
    +
    void setUnitY(std::string unit_y)
    Definition: plottyfile.cpp:55
    +
    void addDot(Dot &dot)
    Definition: plottyfile.cpp:3
    +
    void setDescPara(std::string desc_para)
    Definition: plottyfile.cpp:70
    +
    uint16_t getParaStepWidth(void) const
    Definition: plottyfile.cpp:100
    +
    std::string getDescPara(void) const
    Definition: plottyfile.cpp:130
    +
    void setParaFirstCurve(uint16_t para_first)
    Definition: plottyfile.cpp:35
    +
    std::string getUnitY(void) const
    Definition: plottyfile.cpp:115
    +
    uint16_t getParaFirstCurve(void) const
    Definition: plottyfile.cpp:95
    +
    uint16_t getRefX(void) const
    Definition: plottyfile.cpp:85
    +
    std::string getUnitPara(void) const
    Definition: plottyfile.cpp:125
    +
    FunctionType getFunctionType(void) const
    Definition: plottyfile.cpp:75
    +
    uint16_t getRefY(void) const
    Definition: plottyfile.cpp:90
    +
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js index ebee3d5..c4bd927 100644 --- a/docs/html/search/all_0.js +++ b/docs/html/search/all_0.js @@ -2,8 +2,9 @@ var searchData= [ ['abort',['abort',['../classB15F.html#a3f09a418f9e3be5d1d750e4515c96f1e',1,'B15F::abort(std::string msg)'],['../classB15F.html#ac962a6a49bddd0e261a8c7d3aded23f8',1,'B15F::abort(std::exception &ex)']]], ['activateselftestmode',['activateSelfTestMode',['../classB15F.html#ad9bf80ee2485fb5aac9926c6ef0731f1',1,'B15F']]], + ['adddot',['addDot',['../classPlottyFile.html#ae091e6eaaca16302f17572ac7dec6f7c',1,'PlottyFile::addDot(Dot &dot)'],['../classPlottyFile.html#a80e4b45219b4e9571992edfc28a28568',1,'PlottyFile::addDot(Dot dot)']]], ['analogread',['analogRead',['../classB15F.html#ae0bd1f69751e2dc3c462db9213fc4627',1,'B15F']]], ['analogsequence',['analogSequence',['../classB15F.html#ab82a324426c3063318c6cafb3089ae02',1,'B15F']]], - ['analogwrite0',['analogWrite0',['../classB15F.html#a5c5583d591afdd3f9501856c6b0ba3e3',1,'B15F']]], - ['analogwrite1',['analogWrite1',['../classB15F.html#a63d67795879cdc0b035c9c970e7d6fc3',1,'B15F']]] + ['analogwrite0',['analogWrite0',['../classB15F.html#afc55fd590c7fa5c942d100cb60c4b0d3',1,'B15F']]], + ['analogwrite1',['analogWrite1',['../classB15F.html#a7f1becceac744f5cd2ad529748fd836f',1,'B15F']]] ]; diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js index 7622f87..4a50fd7 100644 --- a/docs/html/search/all_1.js +++ b/docs/html/search/all_1.js @@ -1,4 +1,5 @@ var searchData= [ - ['b15f',['B15F',['../classB15F.html',1,'']]] + ['b15f',['B15F',['../classB15F.html',1,'']]], + ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]] ]; diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js index 196425e..08afc23 100644 --- a/docs/html/search/all_3.js +++ b/docs/html/search/all_3.js @@ -7,6 +7,6 @@ var searchData= ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], - ['dot',['Dot',['../classDot.html',1,'']]], + ['dot',['Dot',['../classDot.html',1,'Dot'],['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot::Dot()']]], ['driverexception',['DriverException',['../classDriverException.html',1,'']]] ]; diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js index fc75b8c..c269a53 100644 --- a/docs/html/search/all_6.js +++ b/docs/html/search/all_6.js @@ -2,6 +2,21 @@ var searchData= [ ['getbaudrate',['getBaudrate',['../classUSART.html#a4918672d8069df205378a528b1892db3',1,'USART']]], ['getboardinfo',['getBoardInfo',['../classB15F.html#a4f01677e73d6d172a2c1cae9427a591b',1,'B15F']]], + ['getcurve',['getCurve',['../classDot.html#ad0ae7dc1a9be3d8d985affc089b34396',1,'Dot']]], + ['getdescpara',['getDescPara',['../classPlottyFile.html#a536967daae3b382a5d6575f55450e198',1,'PlottyFile']]], + ['getdescx',['getDescX',['../classPlottyFile.html#a9cf7baa569be308c2cf6e07cadded09d',1,'PlottyFile']]], + ['getdescy',['getDescY',['../classPlottyFile.html#ab4a847fd71a804182f211233e194df45',1,'PlottyFile']]], + ['getfunctiontype',['getFunctionType',['../classPlottyFile.html#a88bb7d8350ed5fbc7a40e8d903c94bdb',1,'PlottyFile']]], ['getinstance',['getInstance',['../classB15F.html#a8b4533d232c55ef2aa967e39e2d23380',1,'B15F']]], - ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]] + ['getparafirstcurve',['getParaFirstCurve',['../classPlottyFile.html#a40828c93d66fe80166c4f603d5bdfa48',1,'PlottyFile']]], + ['getparastepwidth',['getParaStepWidth',['../classPlottyFile.html#a9da23f2bb8e6eb1837fc992ffd4057db',1,'PlottyFile']]], + ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], + ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], + ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], + ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], + ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], + ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], + ['getunity',['getUnitY',['../classPlottyFile.html#a746b96036872dbece204e9739f3413b6',1,'PlottyFile']]], + ['getx',['getX',['../classDot.html#a029f0cc99c474122b77a708a317e7f77',1,'Dot']]], + ['gety',['getY',['../classDot.html#a8fcb987e6308d8184d1a2c8692227e58',1,'Dot']]] ]; diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js index bd75d34..fd5dff3 100644 --- a/docs/html/search/all_7.js +++ b/docs/html/search/all_7.js @@ -1,4 +1,5 @@ var searchData= [ - ['opendevice',['openDevice',['../classUSART.html#a5f7e2abda2ec4a68a5fdb8ee2f8a940a',1,'USART']]] + ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], + ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] ]; diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js index 8232ab7..bd75d34 100644 --- a/docs/html/search/all_8.js +++ b/docs/html/search/all_8.js @@ -1,5 +1,4 @@ var searchData= [ - ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]], - ['printstatistics',['printStatistics',['../classUSART.html#a33559bb8f0eda33a489d47b9c9227b59',1,'USART']]] + ['opendevice',['openDevice',['../classUSART.html#a5f7e2abda2ec4a68a5fdb8ee2f8a940a',1,'USART']]] ]; diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js index 5d35f1d..b1c5b0a 100644 --- a/docs/html/search/all_9.js +++ b/docs/html/search/all_9.js @@ -1,7 +1,6 @@ var searchData= [ - ['readbyte',['readByte',['../classUSART.html#a8f54b98b26bfe084359a5604bda82562',1,'USART']]], - ['readdipswitch',['readDipSwitch',['../classB15F.html#a6f858f21ea81d491b5031b3644a2239a',1,'B15F']]], - ['readint',['readInt',['../classUSART.html#a1534c229db71a375e556cf1e7d0b8119',1,'USART']]], - ['reconnect',['reconnect',['../classB15F.html#a52557b375443c180a044e7d4e80a1ae7',1,'B15F']]] + ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]], + ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]], + ['printstatistics',['printStatistics',['../classUSART.html#a33559bb8f0eda33a489d47b9c9227b59',1,'USART']]] ]; diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js index 4f4d28c..9759958 100644 --- a/docs/html/search/all_a.js +++ b/docs/html/search/all_a.js @@ -1,6 +1,9 @@ var searchData= [ - ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], - ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], - ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]] + ['readbyte',['readByte',['../classUSART.html#a8f54b98b26bfe084359a5604bda82562',1,'USART']]], + ['readdipswitch',['readDipSwitch',['../classB15F.html#a6f858f21ea81d491b5031b3644a2239a',1,'B15F']]], + ['readint',['readInt',['../classUSART.html#a1534c229db71a375e556cf1e7d0b8119',1,'USART']]], + ['reconnect',['reconnect',['../classB15F.html#a52557b375443c180a044e7d4e80a1ae7',1,'B15F']]], + ['reconnect_5ftimeout',['RECONNECT_TIMEOUT',['../classB15F.html#a040951746fbfd632e12bd1ad14578816',1,'B15F']]], + ['reconnect_5ftries',['RECONNECT_TRIES',['../classB15F.html#a6c4895bdbcd71ff6743becf97985c2dc',1,'B15F']]] ]; diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js index 57a58a5..588c06f 100644 --- a/docs/html/search/all_b.js +++ b/docs/html/search/all_b.js @@ -1,6 +1,19 @@ var searchData= [ - ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], - ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], - ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'']]] + ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], + ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], + ['setdescpara',['setDescPara',['../classPlottyFile.html#a431904143c3c1164a2e8b8cfec3c77ab',1,'PlottyFile']]], + ['setdescx',['setDescX',['../classPlottyFile.html#aa0449c290265d55d6223b19cf0a88b0a',1,'PlottyFile']]], + ['setdescy',['setDescY',['../classPlottyFile.html#a38a3a4dfc76bc70523727584bf01d590',1,'PlottyFile']]], + ['setfunctiontype',['setFunctionType',['../classPlottyFile.html#a4e5ab1ebb012a5cc1a3d6458a4cd512f',1,'PlottyFile']]], + ['setparafirstcurve',['setParaFirstCurve',['../classPlottyFile.html#aa676414793becb975506f48d6e949dd0',1,'PlottyFile']]], + ['setparastepwidth',['setParaStepWidth',['../classPlottyFile.html#a6caebd31e04e2e7081cc007047350355',1,'PlottyFile']]], + ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], + ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], + ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], + ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], + ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], + ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], + ['setunity',['setUnitY',['../classPlottyFile.html#abb18c814f435926f741f7ceb310f3059',1,'PlottyFile']]], + ['startplotty',['startPlotty',['../classPlottyFile.html#a08a115ef10458cadfe76077d623313df',1,'PlottyFile']]] ]; diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js index c030e1b..57a58a5 100644 --- a/docs/html/search/all_c.js +++ b/docs/html/search/all_c.js @@ -1,5 +1,6 @@ var searchData= [ - ['usart',['USART',['../classUSART.html',1,'']]], - ['usartexception',['USARTException',['../classUSARTException.html',1,'']]] + ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], + ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], + ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'']]] ]; diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js index 27f785f..c030e1b 100644 --- a/docs/html/search/all_d.js +++ b/docs/html/search/all_d.js @@ -1,8 +1,5 @@ var searchData= [ - ['view',['View',['../classView.html',1,'']]], - ['viewinfo',['ViewInfo',['../classViewInfo.html',1,'']]], - ['viewmonitor',['ViewMonitor',['../classViewMonitor.html',1,'']]], - ['viewpromt',['ViewPromt',['../classViewPromt.html',1,'']]], - ['viewselection',['ViewSelection',['../classViewSelection.html',1,'']]] + ['usart',['USART',['../classUSART.html',1,'']]], + ['usartexception',['USARTException',['../classUSARTException.html',1,'']]] ]; diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js index 88b07d9..27f785f 100644 --- a/docs/html/search/all_e.js +++ b/docs/html/search/all_e.js @@ -1,5 +1,8 @@ var searchData= [ - ['writebyte',['writeByte',['../classUSART.html#a60eadbe9956bab8144ee96d89eacd9f5',1,'USART']]], - ['writeint',['writeInt',['../classUSART.html#a78b30d9aa863f38745e982860392599a',1,'USART']]] + ['view',['View',['../classView.html',1,'']]], + ['viewinfo',['ViewInfo',['../classViewInfo.html',1,'']]], + ['viewmonitor',['ViewMonitor',['../classViewMonitor.html',1,'']]], + ['viewpromt',['ViewPromt',['../classViewPromt.html',1,'']]], + ['viewselection',['ViewSelection',['../classViewSelection.html',1,'']]] ]; diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html new file mode 100644 index 0000000..ca42a52 --- /dev/null +++ b/docs/html/search/all_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js new file mode 100644 index 0000000..021aad6 --- /dev/null +++ b/docs/html/search/all_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]], + ['writebyte',['writeByte',['../classUSART.html#a60eadbe9956bab8144ee96d89eacd9f5',1,'USART']]], + ['writeint',['writeInt',['../classUSART.html#a78b30d9aa863f38745e982860392599a',1,'USART']]], + ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] +]; diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js index ebee3d5..c4bd927 100644 --- a/docs/html/search/functions_0.js +++ b/docs/html/search/functions_0.js @@ -2,8 +2,9 @@ var searchData= [ ['abort',['abort',['../classB15F.html#a3f09a418f9e3be5d1d750e4515c96f1e',1,'B15F::abort(std::string msg)'],['../classB15F.html#ac962a6a49bddd0e261a8c7d3aded23f8',1,'B15F::abort(std::exception &ex)']]], ['activateselftestmode',['activateSelfTestMode',['../classB15F.html#ad9bf80ee2485fb5aac9926c6ef0731f1',1,'B15F']]], + ['adddot',['addDot',['../classPlottyFile.html#ae091e6eaaca16302f17572ac7dec6f7c',1,'PlottyFile::addDot(Dot &dot)'],['../classPlottyFile.html#a80e4b45219b4e9571992edfc28a28568',1,'PlottyFile::addDot(Dot dot)']]], ['analogread',['analogRead',['../classB15F.html#ae0bd1f69751e2dc3c462db9213fc4627',1,'B15F']]], ['analogsequence',['analogSequence',['../classB15F.html#ab82a324426c3063318c6cafb3089ae02',1,'B15F']]], - ['analogwrite0',['analogWrite0',['../classB15F.html#a5c5583d591afdd3f9501856c6b0ba3e3',1,'B15F']]], - ['analogwrite1',['analogWrite1',['../classB15F.html#a63d67795879cdc0b035c9c970e7d6fc3',1,'B15F']]] + ['analogwrite0',['analogWrite0',['../classB15F.html#afc55fd590c7fa5c942d100cb60c4b0d3',1,'B15F']]], + ['analogwrite1',['analogWrite1',['../classB15F.html#a7f1becceac744f5cd2ad529748fd836f',1,'B15F']]] ]; diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js index 970150a..7c01e06 100644 --- a/docs/html/search/functions_2.js +++ b/docs/html/search/functions_2.js @@ -6,5 +6,6 @@ var searchData= ['digitalread1',['digitalRead1',['../classB15F.html#afc76b612dd4faeee0ac02a66b65af5f2',1,'B15F']]], ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], - ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]] + ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], + ['dot',['Dot',['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot']]] ]; diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js index fc75b8c..c269a53 100644 --- a/docs/html/search/functions_5.js +++ b/docs/html/search/functions_5.js @@ -2,6 +2,21 @@ var searchData= [ ['getbaudrate',['getBaudrate',['../classUSART.html#a4918672d8069df205378a528b1892db3',1,'USART']]], ['getboardinfo',['getBoardInfo',['../classB15F.html#a4f01677e73d6d172a2c1cae9427a591b',1,'B15F']]], + ['getcurve',['getCurve',['../classDot.html#ad0ae7dc1a9be3d8d985affc089b34396',1,'Dot']]], + ['getdescpara',['getDescPara',['../classPlottyFile.html#a536967daae3b382a5d6575f55450e198',1,'PlottyFile']]], + ['getdescx',['getDescX',['../classPlottyFile.html#a9cf7baa569be308c2cf6e07cadded09d',1,'PlottyFile']]], + ['getdescy',['getDescY',['../classPlottyFile.html#ab4a847fd71a804182f211233e194df45',1,'PlottyFile']]], + ['getfunctiontype',['getFunctionType',['../classPlottyFile.html#a88bb7d8350ed5fbc7a40e8d903c94bdb',1,'PlottyFile']]], ['getinstance',['getInstance',['../classB15F.html#a8b4533d232c55ef2aa967e39e2d23380',1,'B15F']]], - ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]] + ['getparafirstcurve',['getParaFirstCurve',['../classPlottyFile.html#a40828c93d66fe80166c4f603d5bdfa48',1,'PlottyFile']]], + ['getparastepwidth',['getParaStepWidth',['../classPlottyFile.html#a9da23f2bb8e6eb1837fc992ffd4057db',1,'PlottyFile']]], + ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], + ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], + ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], + ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], + ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], + ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], + ['getunity',['getUnitY',['../classPlottyFile.html#a746b96036872dbece204e9739f3413b6',1,'PlottyFile']]], + ['getx',['getX',['../classDot.html#a029f0cc99c474122b77a708a317e7f77',1,'Dot']]], + ['gety',['getY',['../classDot.html#a8fcb987e6308d8184d1a2c8692227e58',1,'Dot']]] ]; diff --git a/docs/html/search/functions_9.js b/docs/html/search/functions_9.js index 4f4d28c..588c06f 100644 --- a/docs/html/search/functions_9.js +++ b/docs/html/search/functions_9.js @@ -2,5 +2,18 @@ var searchData= [ ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], - ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]] + ['setdescpara',['setDescPara',['../classPlottyFile.html#a431904143c3c1164a2e8b8cfec3c77ab',1,'PlottyFile']]], + ['setdescx',['setDescX',['../classPlottyFile.html#aa0449c290265d55d6223b19cf0a88b0a',1,'PlottyFile']]], + ['setdescy',['setDescY',['../classPlottyFile.html#a38a3a4dfc76bc70523727584bf01d590',1,'PlottyFile']]], + ['setfunctiontype',['setFunctionType',['../classPlottyFile.html#a4e5ab1ebb012a5cc1a3d6458a4cd512f',1,'PlottyFile']]], + ['setparafirstcurve',['setParaFirstCurve',['../classPlottyFile.html#aa676414793becb975506f48d6e949dd0',1,'PlottyFile']]], + ['setparastepwidth',['setParaStepWidth',['../classPlottyFile.html#a6caebd31e04e2e7081cc007047350355',1,'PlottyFile']]], + ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], + ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], + ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], + ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], + ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], + ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], + ['setunity',['setUnitY',['../classPlottyFile.html#abb18c814f435926f741f7ceb310f3059',1,'PlottyFile']]], + ['startplotty',['startPlotty',['../classPlottyFile.html#a08a115ef10458cadfe76077d623313df',1,'PlottyFile']]] ]; diff --git a/docs/html/search/functions_b.js b/docs/html/search/functions_b.js index 88b07d9..cbf06ef 100644 --- a/docs/html/search/functions_b.js +++ b/docs/html/search/functions_b.js @@ -1,5 +1,6 @@ var searchData= [ ['writebyte',['writeByte',['../classUSART.html#a60eadbe9956bab8144ee96d89eacd9f5',1,'USART']]], - ['writeint',['writeInt',['../classUSART.html#a78b30d9aa863f38745e982860392599a',1,'USART']]] + ['writeint',['writeInt',['../classUSART.html#a78b30d9aa863f38745e982860392599a',1,'USART']]], + ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] ]; diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js index 522aa5c..c99c8bb 100644 --- a/docs/html/search/searchdata.js +++ b/docs/html/search/searchdata.js @@ -1,9 +1,10 @@ var indexSectionsWithContent = { - 0: "abcdefgoprstuvw", + 0: "abcdefgmoprstuvw", 1: "bdptuv", 2: "acdefgoprstw", - 3: "e" + 3: "bmprw", + 4: "e" }; var indexSectionNames = @@ -11,7 +12,8 @@ var indexSectionNames = 0: "all", 1: "classes", 2: "functions", - 3: "pages" + 3: "variables", + 4: "pages" }; var indexSectionLabels = @@ -19,6 +21,7 @@ var indexSectionLabels = 0: "All", 1: "Classes", 2: "Functions", - 3: "Pages" + 3: "Variables", + 4: "Pages" }; diff --git a/docs/html/search/variables_0.html b/docs/html/search/variables_0.html new file mode 100644 index 0000000..a2a3ae6 --- /dev/null +++ b/docs/html/search/variables_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js new file mode 100644 index 0000000..d1fd2cf --- /dev/null +++ b/docs/html/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]] +]; diff --git a/docs/html/search/variables_1.html b/docs/html/search/variables_1.html new file mode 100644 index 0000000..b243c42 --- /dev/null +++ b/docs/html/search/variables_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js new file mode 100644 index 0000000..fd5dff3 --- /dev/null +++ b/docs/html/search/variables_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], + ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] +]; diff --git a/docs/html/search/variables_2.html b/docs/html/search/variables_2.html new file mode 100644 index 0000000..647df20 --- /dev/null +++ b/docs/html/search/variables_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js new file mode 100644 index 0000000..570beea --- /dev/null +++ b/docs/html/search/variables_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]] +]; diff --git a/docs/html/search/variables_3.html b/docs/html/search/variables_3.html new file mode 100644 index 0000000..9dc9b89 --- /dev/null +++ b/docs/html/search/variables_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js new file mode 100644 index 0000000..fbf0a47 --- /dev/null +++ b/docs/html/search/variables_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['reconnect_5ftimeout',['RECONNECT_TIMEOUT',['../classB15F.html#a040951746fbfd632e12bd1ad14578816',1,'B15F']]], + ['reconnect_5ftries',['RECONNECT_TRIES',['../classB15F.html#a6c4895bdbcd71ff6743becf97985c2dc',1,'B15F']]] +]; diff --git a/docs/html/search/variables_4.html b/docs/html/search/variables_4.html new file mode 100644 index 0000000..78cc2c7 --- /dev/null +++ b/docs/html/search/variables_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js new file mode 100644 index 0000000..9a9c561 --- /dev/null +++ b/docs/html/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]] +]; diff --git a/docs/html/timeoutexception_8h_source.html b/docs/html/timeoutexception_8h_source.html index cfb9642..84fffd2 100644 --- a/docs/html/timeoutexception_8h_source.html +++ b/docs/html/timeoutexception_8h_source.html @@ -70,11 +70,11 @@ $(function() {
    timeoutexception.h
    -
    1 #ifndef TIMEOUTEXCEPTION_H
    2 #define TIMEOUTEXCEPTION_H
    3 
    4 #include <exception>
    5 
    6 // SOURCE: https://stackoverflow.com/a/8152888
    7 
    8 class TimeoutException: public std::exception
    9 {
    10 public:
    11  explicit TimeoutException(const char* message, int timeout) : TimeoutException(std::string(message), timeout)
    12  {
    13  }
    14 
    15  explicit TimeoutException(const std::string& message, int timeout) : msg(message), m_timeout(timeout)
    16  {
    17  if(!msg.length())
    18  msg = "Timeout reached (" + std::to_string(m_timeout) + ")";
    19  }
    20 
    21  virtual ~TimeoutException() throw ()
    22  {
    23  }
    24 
    25  virtual const char* what() const throw ()
    26  {
    27  return msg.c_str();
    28  }
    29 
    30 protected:
    31  std::string msg;
    32  int m_timeout;
    33 };
    34 
    35 #endif // TIMEOUTEXCEPTION_H
    - +
    1 #ifndef TIMEOUTEXCEPTION_H
    2 #define TIMEOUTEXCEPTION_H
    3 
    4 #include <exception>
    5 
    6 // SOURCE: https://stackoverflow.com/a/8152888
    7 
    10 class TimeoutException: public std::exception
    11 {
    12 public:
    13  explicit TimeoutException(const char* message, int timeout) : TimeoutException(std::string(message), timeout)
    14  {
    15  }
    16 
    17  explicit TimeoutException(const std::string& message, int timeout) : msg(message), m_timeout(timeout)
    18  {
    19  if(!msg.length())
    20  msg = "Timeout reached (" + std::to_string(m_timeout) + ")";
    21  }
    22 
    23  virtual ~TimeoutException() throw ()
    24  {
    25  }
    26 
    27  virtual const char* what() const throw ()
    28  {
    29  return msg.c_str();
    30  }
    31 
    32 protected:
    33  std::string msg;
    34  int m_timeout;
    35 };
    36 
    37 #endif // TIMEOUTEXCEPTION_H
    + diff --git a/docs/html/ui_8cpp_source.html b/docs/html/ui_8cpp_source.html index 07d853b..760c88e 100644 --- a/docs/html/ui_8cpp_source.html +++ b/docs/html/ui_8cpp_source.html @@ -70,24 +70,25 @@ $(function() {
    ui.cpp
    -
    1 #include "ui.h"
    2 #include "../drv/b15f.h"
    3 
    4 std::vector<View*> win_stack;
    5 std::thread t_refresh;
    6 
    7 void show_main(int)
    8 {
    9  ViewSelection* view = new ViewSelection();
    10  view->setTitle("B15F - Command Line Interface");
    11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
    12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
    13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
    14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
    15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
    16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
    17  view->addChoice("[ Informationen ]", &show_info);
    18  view->addChoice("", nullptr);
    19  view->addChoice("[ Beenden ]", &finish);
    20  view->repaint();
    21 
    22  win_stack.push_back(view);
    23  input(0);
    24 }
    25 
    26 void input(int)
    27 {
    28  call_t nextCall;
    29  int key;
    30  do
    31  {
    32  key = wgetch(View::getWinContext());
    33  win_stack.back()->repaint();
    34  nextCall = win_stack.back()->keypress(key);
    35 
    36  if(key == -1)
    37  view_back(key);
    38 
    39  if(nextCall)
    40  nextCall(key);
    41  }
    42  while(win_stack.size());
    43 }
    44 
    45 void view_back(int)
    46 {
    47  if(win_stack.size())
    48  {
    49  delete win_stack.back();
    50  win_stack.pop_back();
    51  }
    52  if(win_stack.size())
    53  win_stack.back()->repaint();
    54 }
    55 
    56 void finish(int)
    57 {
    58  cleanup();
    59  exit(EXIT_SUCCESS);
    60 }
    61 
    62 void cleanup()
    63 {
    64  if(t_refresh.joinable())
    65  t_refresh.join();
    66  clrtoeol();
    67  refresh();
    68  endwin();
    69 }
    70 
    71 void show_info(int)
    72 {
    73  ViewInfo* view = new ViewInfo();
    74  view->setTitle("Info");
    75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
    76  view->setLabelClose("[ Zurueck ]");
    77  view->repaint();
    78 
    79  win_stack.push_back(view);
    80  input(0);
    81 }
    82 
    83 void show_monitor(int)
    84 {
    85  ViewMonitor* view = new ViewMonitor();
    86  view->setTitle("Monitor");
    87  view->setText("\nErfasse Messwerte...");
    88  view->setLabelClose("[ Zurueck ]");
    89  view->repaint();
    90 
    91  win_stack.push_back(view);
    92  input(0);
    93 }
    94 
    95 void show_invalid_port_input(int)
    96 {
    97  ViewInfo* view = new ViewInfo();
    98  view->setTitle("Falsche Eingabe");
    99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
    100  view->setLabelClose("[ Schliessen ]");
    101  view->repaint();
    102 
    103  win_stack.push_back(view);
    104  input(0);
    105 }
    106 
    107 void show_invalid_dac_input(int)
    108 {
    109  ViewInfo* view = new ViewInfo();
    110  view->setTitle("Falsche Eingabe");
    111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
    112  view->setLabelClose("[ Schliessen ]");
    113  view->repaint();
    114 
    115  win_stack.push_back(view);
    116  input(0);
    117 }
    118 
    119 void write_digital_output0(int)
    120 {
    121  try
    122  {
    123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    124  if(d > 255 || 0 > d)
    125  throw std::invalid_argument("bad value");
    126  uint8_t port = static_cast<uint8_t>(d);
    127 
    128  B15F& drv = B15F::getInstance();
    129  drv.digitalWrite0(port);
    130  view_back(0);
    131  }
    132  catch(std::invalid_argument& ex)
    133  {
    134  show_invalid_port_input(0);
    135  }
    136 }
    137 
    138 void write_digital_output1(int)
    139 {
    140  try
    141  {
    142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    143  if(d > 255 || 0 > d)
    144  throw std::invalid_argument("bad value");
    145  uint8_t port = static_cast<uint8_t>(d);
    146 
    147  B15F& drv = B15F::getInstance();
    148  drv.digitalWrite1(port);
    149  view_back(0);
    150  }
    151  catch(std::invalid_argument& ex)
    152  {
    153  show_invalid_port_input(0);
    154  }
    155 }
    156 
    157 void write_analog_output0(int)
    158 {
    159  try
    160  {
    161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    162  if(port > 1023)
    163  throw std::invalid_argument("bad value");
    164 
    165  B15F& drv = B15F::getInstance();
    166  drv.analogWrite0(port);
    167  view_back(0);
    168  }
    169  catch(std::invalid_argument& ex)
    170  {
    171  show_invalid_dac_input(0);
    172  }
    173 }
    174 
    175 void write_analog_output1(int)
    176 {
    177  try
    178  {
    179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    180  if(port > 1023)
    181  throw std::invalid_argument("bad value");
    182 
    183  B15F& drv = B15F::getInstance();
    184  drv.analogWrite1(port);
    185  view_back(0);
    186  }
    187  catch(std::invalid_argument& ex)
    188  {
    189  show_invalid_dac_input(0);
    190  }
    191 }
    192 
    193 void show_digital_output0(int)
    194 {
    195  ViewPromt* view = new ViewPromt();
    196  view->setTitle("Digitale Ausgabe BE0");
    197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    198  view->setCancel("[ Zurueck ]", true);
    199  view->setConfirm("[ OK ]", &write_digital_output0);
    200  view->repaint();
    201 
    202  win_stack.push_back(view);
    203  input(0);
    204 }
    205 
    206 void show_digital_output1(int)
    207 {
    208  ViewPromt* view = new ViewPromt();
    209  view->setTitle("Digitale Ausgabe BE1");
    210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    211  view->setCancel("[ Zurueck ]", true);
    212  view->setConfirm("[ OK ]", &write_digital_output1);
    213  view->repaint();
    214 
    215  win_stack.push_back(view);
    216  input(0);
    217 }
    218 
    219 void show_analog_output0(int)
    220 {
    221  ViewPromt* view = new ViewPromt();
    222  view->setTitle("Analoge Ausgabe AA0");
    223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    224  view->setCancel("[ Zurueck ]", true);
    225  view->setConfirm("[ OK ]", &write_analog_output0);
    226  view->repaint();
    227 
    228  win_stack.push_back(view);
    229  input(0);
    230 }
    231 
    232 void show_analog_output1(int)
    233 {
    234  ViewPromt* view = new ViewPromt();
    235  view->setTitle("Analoge Ausgabe AA1");
    236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    237  view->setCancel("[ Zurueck ]", true);
    238  view->setConfirm("[ OK ]", &write_analog_output1);
    239  view->repaint();
    240 
    241  win_stack.push_back(view);
    242  input(0);
    243 }
    244 
    245 void start_selftest(int)
    246 {
    247  B15F& drv = B15F::getInstance();
    248  drv.activateSelfTestMode();
    249 
    250  ViewInfo* view = new ViewInfo();
    251  view->setTitle("Selbsttest aktiv");
    252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
    253  view->setLabelClose("[ Selbsttest Beenden ]");
    254  view->setCall(&stop_selftest);
    255  view->repaint();
    256 
    257  win_stack.push_back(view);
    258  input(0);
    259 }
    260 
    261 void stop_selftest(int)
    262 {
    263  B15F& drv = B15F::getInstance();
    264  drv.discard();
    265  drv.delay_ms(B15F::WDT_TIMEOUT);
    266  drv.reconnect();
    267  drv.digitalWrite0(0);
    268  drv.digitalWrite1(0);
    269 }
    270 
    271 void show_selftest_info(int)
    272 {
    273  ViewInfo* view = new ViewInfo();
    274  view->setTitle("Selbsttest");
    275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
    276  view->setLabelClose("[ Weiter ]");
    277  view->setCall(&start_selftest);
    278  view->repaint();
    279 
    280  win_stack.push_back(view);
    281  input(0);
    282 }
    - - -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:290
    -
    bool analogWrite1(uint16_t)
    Definition: b15f.cpp:209
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:300
    -
    Definition: b15f.h:24
    -
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:152
    -
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:144
    - - -
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:162
    +
    1 #include "ui.h"
    2 #include "../drv/b15f.h"
    3 
    4 std::vector<View*> win_stack;
    5 std::thread t_refresh;
    6 
    7 void show_main(int)
    8 {
    9  ViewSelection* view = new ViewSelection();
    10  view->setTitle("B15F - Command Line Interface");
    11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
    12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
    13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
    14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
    15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
    16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
    17  view->addChoice("[ Informationen ]", &show_info);
    18  view->addChoice("", nullptr);
    19  view->addChoice("[ Beenden ]", &finish);
    20  view->repaint();
    21 
    22  win_stack.push_back(view);
    23  input(0);
    24 }
    25 
    26 void input(int)
    27 {
    28  call_t nextCall;
    29  int key;
    30  do
    31  {
    32  key = wgetch(View::getWinContext());
    33  win_stack.back()->repaint();
    34  nextCall = win_stack.back()->keypress(key);
    35 
    36  if(key == -1)
    37  view_back(key);
    38 
    39  if(nextCall)
    40  nextCall(key);
    41  }
    42  while(win_stack.size());
    43 }
    44 
    45 void view_back(int)
    46 {
    47  if(win_stack.size())
    48  {
    49  delete win_stack.back();
    50  win_stack.pop_back();
    51  }
    52  if(win_stack.size())
    53  win_stack.back()->repaint();
    54 }
    55 
    56 void finish(int)
    57 {
    58  cleanup();
    59  exit(EXIT_SUCCESS);
    60 }
    61 
    62 void cleanup()
    63 {
    64  if(t_refresh.joinable())
    65  t_refresh.join();
    66  clrtoeol();
    67  refresh();
    68  endwin();
    69 }
    70 
    71 void show_info(int)
    72 {
    73  ViewInfo* view = new ViewInfo();
    74  view->setTitle("Info");
    75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
    76  view->setLabelClose("[ Zurueck ]");
    77  view->repaint();
    78 
    79  win_stack.push_back(view);
    80  input(0);
    81 }
    82 
    83 void show_monitor(int)
    84 {
    85  ViewMonitor* view = new ViewMonitor();
    86  view->setTitle("Monitor");
    87  view->setText("\nErfasse Messwerte...");
    88  view->setLabelClose("[ Zurueck ]");
    89  view->repaint();
    90 
    91  win_stack.push_back(view);
    92  input(0);
    93 }
    94 
    95 void show_invalid_port_input(int)
    96 {
    97  ViewInfo* view = new ViewInfo();
    98  view->setTitle("Falsche Eingabe");
    99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
    100  view->setLabelClose("[ Schliessen ]");
    101  view->repaint();
    102 
    103  win_stack.push_back(view);
    104  input(0);
    105 }
    106 
    107 void show_invalid_dac_input(int)
    108 {
    109  ViewInfo* view = new ViewInfo();
    110  view->setTitle("Falsche Eingabe");
    111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
    112  view->setLabelClose("[ Schliessen ]");
    113  view->repaint();
    114 
    115  win_stack.push_back(view);
    116  input(0);
    117 }
    118 
    119 void write_digital_output0(int)
    120 {
    121  try
    122  {
    123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    124  if(d > 255 || 0 > d)
    125  throw std::invalid_argument("bad value");
    126  uint8_t port = static_cast<uint8_t>(d);
    127 
    128  B15F& drv = B15F::getInstance();
    129  drv.digitalWrite0(port);
    130  view_back(0);
    131  }
    132  catch(std::invalid_argument& ex)
    133  {
    134  show_invalid_port_input(0);
    135  }
    136 }
    137 
    138 void write_digital_output1(int)
    139 {
    140  try
    141  {
    142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    143  if(d > 255 || 0 > d)
    144  throw std::invalid_argument("bad value");
    145  uint8_t port = static_cast<uint8_t>(d);
    146 
    147  B15F& drv = B15F::getInstance();
    148  drv.digitalWrite1(port);
    149  view_back(0);
    150  }
    151  catch(std::invalid_argument& ex)
    152  {
    153  show_invalid_port_input(0);
    154  }
    155 }
    156 
    157 void write_analog_output0(int)
    158 {
    159  try
    160  {
    161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    162  if(port > 1023)
    163  throw std::invalid_argument("bad value");
    164 
    165  B15F& drv = B15F::getInstance();
    166  drv.analogWrite0(port);
    167  view_back(0);
    168  }
    169  catch(std::invalid_argument& ex)
    170  {
    171  show_invalid_dac_input(0);
    172  }
    173 }
    174 
    175 void write_analog_output1(int)
    176 {
    177  try
    178  {
    179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    180  if(port > 1023)
    181  throw std::invalid_argument("bad value");
    182 
    183  B15F& drv = B15F::getInstance();
    184  drv.analogWrite1(port);
    185  view_back(0);
    186  }
    187  catch(std::invalid_argument& ex)
    188  {
    189  show_invalid_dac_input(0);
    190  }
    191 }
    192 
    193 void show_digital_output0(int)
    194 {
    195  ViewPromt* view = new ViewPromt();
    196  view->setTitle("Digitale Ausgabe BE0");
    197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    198  view->setCancel("[ Zurueck ]", true);
    199  view->setConfirm("[ OK ]", &write_digital_output0);
    200  view->repaint();
    201 
    202  win_stack.push_back(view);
    203  input(0);
    204 }
    205 
    206 void show_digital_output1(int)
    207 {
    208  ViewPromt* view = new ViewPromt();
    209  view->setTitle("Digitale Ausgabe BE1");
    210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    211  view->setCancel("[ Zurueck ]", true);
    212  view->setConfirm("[ OK ]", &write_digital_output1);
    213  view->repaint();
    214 
    215  win_stack.push_back(view);
    216  input(0);
    217 }
    218 
    219 void show_analog_output0(int)
    220 {
    221  ViewPromt* view = new ViewPromt();
    222  view->setTitle("Analoge Ausgabe AA0");
    223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    224  view->setCancel("[ Zurueck ]", true);
    225  view->setConfirm("[ OK ]", &write_analog_output0);
    226  view->repaint();
    227 
    228  win_stack.push_back(view);
    229  input(0);
    230 }
    231 
    232 void show_analog_output1(int)
    233 {
    234  ViewPromt* view = new ViewPromt();
    235  view->setTitle("Analoge Ausgabe AA1");
    236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    237  view->setCancel("[ Zurueck ]", true);
    238  view->setConfirm("[ OK ]", &write_analog_output1);
    239  view->repaint();
    240 
    241  win_stack.push_back(view);
    242  input(0);
    243 }
    244 
    245 void start_selftest(int)
    246 {
    247  B15F& drv = B15F::getInstance();
    248  drv.activateSelfTestMode();
    249 
    250  ViewInfo* view = new ViewInfo();
    251  view->setTitle("Selbsttest aktiv");
    252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
    253  view->setLabelClose("[ Selbsttest Beenden ]");
    254  view->setCall(&stop_selftest);
    255  view->repaint();
    256 
    257  win_stack.push_back(view);
    258  input(0);
    259 }
    260 
    261 void stop_selftest(int)
    262 {
    263  B15F& drv = B15F::getInstance();
    264  drv.discard();
    266  drv.reconnect();
    267  drv.digitalWrite0(0);
    268  drv.digitalWrite1(0);
    269 }
    270 
    271 void show_selftest_info(int)
    272 {
    273  ViewInfo* view = new ViewInfo();
    274  view->setTitle("Selbsttest");
    275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
    276  view->setLabelClose("[ Weiter ]");
    277  view->setCall(&start_selftest);
    278  view->repaint();
    279 
    280  win_stack.push_back(view);
    281  input(0);
    282 }
    + + +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:292
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:302
    +
    Definition: b15f.h:26
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    + +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    + +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    void discard(void)
    Definition: b15f.cpp:72
    -
    bool analogWrite0(uint16_t)
    Definition: b15f.cpp:199
    +
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:203
    void reconnect(void)
    Definition: b15f.cpp:57
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    diff --git a/docs/html/ui_8h_source.html b/docs/html/ui_8h_source.html index 4edb2a9..6b5ee6b 100644 --- a/docs/html/ui_8h_source.html +++ b/docs/html/ui_8h_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #ifndef UI_H
    2 #define UI_H
    3 
    4 #include <vector>
    5 #include "view_selection.h"
    6 #include "view_info.h"
    7 #include "view_monitor.h"
    8 #include "view_promt.h"
    9 
    10 void show_main(int);
    11 void input(int);
    12 void view_back(int);
    13 void finish(int);
    14 void cleanup();
    15 
    16 void show_info(int);
    17 void show_monitor(int);
    18 void show_invalid_port_input(int);
    19 void show_invalid_dac_input(int);
    20 void write_digital_output0(int);
    21 void write_digital_output1(int);
    22 void write_analog_output0(int);
    23 void write_analog_output1(int);
    24 void show_digital_output0(int);
    25 void show_digital_output1(int);
    26 void show_analog_output0(int);
    27 void show_analog_output1(int);
    28 
    29 // selftest group
    30 void show_selftest_info(int);
    31 void start_selftest(int);
    32 void stop_selftest(int);
    33 
    34 
    35 extern std::vector<View*> win_stack;
    36 extern std::thread t_refresh;
    37 
    38 #endif // UI_H
    diff --git a/docs/html/usart_8cpp_source.html b/docs/html/usart_8cpp_source.html index 87f2c09..5456252 100644 --- a/docs/html/usart_8cpp_source.html +++ b/docs/html/usart_8cpp_source.html @@ -70,26 +70,26 @@ $(function() {
    usart.cpp
    -
    1 #include "usart.h"
    2 
    3 void USART::openDevice(std::string device)
    4 {
    5  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY /* | O_NONBLOCK*/);
    6  if(file_desc <= 0)
    7  throw USARTException("Fehler beim Öffnen des Gerätes");
    8 
    9  struct termios options;
    10  int code = tcgetattr(file_desc, &options);
    11  if(code)
    12  throw USARTException("Fehler beim Lesen der Geräteparameter");
    13 
    14  options.c_cflag = CS8 | CLOCAL | CREAD;
    15  options.c_iflag = IGNPAR;
    16  options.c_oflag = 0;
    17  options.c_lflag = 0;
    18  options.c_cc[VMIN] = 0; // #bytes read returns at least
    19  options.c_cc[VTIME] = timeout;
    20  code = cfsetspeed(&options, baudrate);
    21  if(code)
    22  throw USARTException("Fehler beim Setzen der Baudrate");
    23 
    24  code = tcsetattr(file_desc, TCSANOW, &options);
    25  if(code)
    26  throw USARTException("Fehler beim Setzen der Geräteparameter");
    27 
    30 }
    31 
    33 {
    34  int code = close(file_desc);
    35  if(code)
    36  throw USARTException("Fehler beim Schließen des Gerätes");
    37 }
    38 
    40 {
    41  int code = tcflush(file_desc, TCIFLUSH);
    42  if(code)
    43  throw USARTException("Fehler beim Leeren des Eingangspuffers");
    44 }
    45 
    47 {
    48  int code = tcflush(file_desc, TCOFLUSH);
    49  if(code)
    50  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
    51 }
    52 
    54 {
    55  int code = tcdrain(file_desc);
    56  if(code)
    57  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
    58 }
    59 
    61 {
    62  double pz = 1e2 * n_blocks_failed / n_blocks_total;
    63  pz = std::round(pz * 1e2) / 1e2;
    64  std::cout << "blocks total: " << n_blocks_total << " ok: " << (n_blocks_total - n_blocks_failed) << " failed: " << n_blocks_failed << " (" << pz << "%)" << std::endl;
    65 }
    66 
    67 void USART::writeByte(uint8_t b)
    68 {
    69  int sent = write(file_desc, &b, 1);
    70  if(sent != 1)
    71  {
    72  std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl;
    73  usleep(100000);
    74  sent = write(file_desc, &b, 1);
    75  if(sent != 1)
    76  throw USARTException("Fehler beim Senden: writeByte()");
    77  }
    78 
    79 }
    80 
    81 void USART::writeInt(uint16_t d)
    82 {
    83  int sent = write(file_desc, reinterpret_cast<char*>(&d), 2);
    84  if(sent != 2)
    85  throw USARTException("Fehler beim Senden: writeInt()");
    86 }
    87 
    88 
    89 
    90 int USART::read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout)
    91 {
    92  uint32_t elapsed = 0;
    93  int n_read = -1;
    94  auto start = std::chrono::steady_clock::now();
    95  auto end = start;
    96  while(elapsed < timeout)
    97  {
    98  n_read = read(file_desc, buffer + offset, len);
    99  if (n_read == len)
    100  return n_read;
    101 
    102  end = std::chrono::steady_clock::now();
    103  elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    104  }
    105 
    106  return 0;
    107 }
    108 
    109 int USART::write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout)
    110 {
    111  uint32_t elapsed = 0;
    112  int n_sent = -1;
    113  auto start = std::chrono::steady_clock::now();
    114  auto end = start;
    115  while(elapsed < timeout)
    116  {
    117  n_sent = write(file_desc, buffer + offset, len);
    119  if (n_sent == len)
    120  return n_sent;
    121 
    122  end = std::chrono::steady_clock::now();
    123  elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    124  }
    125 
    126  return n_sent;
    127 }
    128 
    129 void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len)
    130 {
    131  uint8_t crc;
    132  uint8_t aw;
    133  const uint16_t us_per_bit = (1000000 / baudrate) * 16;
    134  const uint16_t n_total = len + 3;
    135 
    136  n_blocks_total++;
    137  bool failed = false;
    138 
    139  do
    140  {
    141  // calc crc
    142  crc = 0;
    143  for(uint8_t i = 0; i < len; i++)
    144  {
    145  crc ^= buffer[i];
    146  for (uint8_t k = 0; k < 8; k++)
    147  {
    148  if (crc & 1)
    149  crc ^= CRC7_POLY;
    150  crc >>= 1;
    151  }
    152  }
    153 
    154  // construct block
    155  block_buffer[0] = len;
    156  std::memcpy(&block_buffer[1], buffer + offset, len);
    157  block_buffer[len + 1] = crc;
    158  block_buffer[len + 2] = BLOCK_END;
    159 
    160  // send block
    163  int n_sent = write_timeout(&block_buffer[0], 0, len + 3, us_per_bit * n_total);
    164  if(n_sent != n_total)
    165  throw std::runtime_error("fatal (send): " + std::to_string(n_sent));
    166 
    167  /*for(uint8_t i = 0; i < len + 3; i++)
    168  {
    169  write_timeout(&block_buffer[i], 0, 1, us_per_bit * n_total);
    170  //tcdrain(file_desc);
    171  //usleep(1000);
    172  }*/
    173 
    174  // flush output data
    175  tcdrain(file_desc);
    176 
    177  //usleep(us_per_bit * n_total * 10);
    178 
    179  // check response
    180  int n_read = read_timeout(&aw, 0, 1, us_per_bit * n_blocks_total * 10);
    181  for(uint16_t i = 0; i < 255 && n_read != 1; i++)
    182  {
    183  writeByte(0x80); // Stoppzeichen für Block
    184  if(tcdrain(file_desc))
    185  {
    186  std::cout << "drain failed" << std::endl;
    187  }
    188  std::cout << "WARNING: read error (" << n_read << "), retry #" << (int) i << std::endl;
    189  usleep(us_per_bit*100);
    190  n_read = read_timeout(&aw, 0, 1, us_per_bit);
    191  }
    192 
    193  if(n_read != 1)
    194  throw std::runtime_error("fatal: " + std::to_string(n_read));
    195 
    196  //clearInputBuffer();
    197 
    198  if(aw != 0xFF) {
    199  if(!failed)
    200  n_blocks_failed++;
    201  failed = true;
    202  std::cout << "block failed, retry" << std::endl;
    203  }
    204  }
    205  while(aw != 0xFF);
    206 
    207  //std::cout << "OK" << std::endl;
    208 }
    209 
    210 uint8_t USART::readByte(void)
    211 {
    212  char b;
    213  auto start = std::chrono::steady_clock::now();
    214  auto end = start;
    215  uint16_t elapsed = 0;
    216  while(elapsed < timeout * 100)
    217  {
    218  int code = read(file_desc, &b, 1);
    219  if (code > 0)
    220  return static_cast<uint8_t>(b);
    221 
    222  end = std::chrono::steady_clock::now();
    223  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    224  }
    225 
    226  throw TimeoutException("Verbindung unterbrochen.", timeout);
    227 }
    228 
    229 uint16_t USART::readInt(void)
    230 {
    231  return readByte() | readByte() << 8;
    232 }
    233 
    234 bool USART::readBlock(uint8_t* buffer, uint16_t offset)
    235 {
    236  uint8_t len = readByte();
    237  uint8_t crc = 0;
    238  buffer += offset;
    239 
    240  uint32_t block_timeout = timeout / 10;
    241 
    242  // wait for block
    243  int n_ready;
    244  uint16_t elapsed = 0;
    245  auto start = std::chrono::steady_clock::now();
    246  auto end = start;
    247  while(elapsed < block_timeout)
    248  {
    249  int code = ioctl(file_desc, FIONREAD, &n_ready);
    250  if(code != 0)
    251  {
    252  std::cout << "n_ready code: " << code << std::endl;
    253  return false;
    254  }
    255 
    256  if(n_ready >= len + 1)
    257  break;
    258 
    259  end = std::chrono::steady_clock::now();
    260  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    261  }
    262  if(elapsed >= timeout)
    263  {
    264  std::cout << "block timeout: " << std::endl;
    265  return false;
    266  }
    267 
    268  while(len--)
    269  {
    270  *buffer = readByte();
    271 
    272  crc ^= *buffer++;
    273  for (uint8_t i = 0; i < 8; i++)
    274  {
    275  if (crc & 1)
    276  crc ^= CRC7_POLY;
    277  crc >>= 1;
    278  }
    279  }
    280 
    281  crc ^= readByte();
    282  for (uint8_t i = 0; i < 8; i++)
    283  {
    284  if (crc & 1)
    285  crc ^= CRC7_POLY;
    286  crc >>= 1;
    287  }
    288 
    289  if(TEST == 1)
    290  crc = 1;
    291  if(TEST > 100)
    292  TEST = 0;
    293 
    294  if (crc == 0)
    295  {
    296  writeByte(0xFF);
    297  return true;
    298  }
    299  else
    300  {
    301  writeByte(0xFE);
    302  return false;
    303  }
    304 }
    305 
    307 {
    308  return baudrate;
    309 }
    310 
    312 {
    313  return timeout;
    314 }
    315 
    316 void USART::setBaudrate(uint32_t baudrate)
    317 {
    318  this->baudrate = baudrate;
    319 }
    320 
    321 void USART::setTimeout(uint8_t timeout)
    322 {
    323  this->timeout = timeout;
    324 }
    -
    uint32_t getBaudrate(void)
    Definition: usart.cpp:306
    -
    uint8_t readByte(void)
    Definition: usart.cpp:210
    - +
    1 #include "usart.h"
    2 
    3 void USART::openDevice(std::string device)
    4 {
    5  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY /* | O_NONBLOCK*/);
    6  if(file_desc <= 0)
    7  throw USARTException("Fehler beim Öffnen des Gerätes");
    8 
    9  struct termios options;
    10  int code = tcgetattr(file_desc, &options);
    11  if(code)
    12  throw USARTException("Fehler beim Lesen der Geräteparameter");
    13 
    14  options.c_cflag = CS8 | CLOCAL | CREAD;
    15  options.c_iflag = IGNPAR;
    16  options.c_oflag = 0;
    17  options.c_lflag = 0;
    18  options.c_cc[VMIN] = 0; // #bytes read returns at least
    19  options.c_cc[VTIME] = timeout;
    20  code = cfsetspeed(&options, baudrate);
    21  if(code)
    22  throw USARTException("Fehler beim Setzen der Baudrate");
    23 
    24  code = tcsetattr(file_desc, TCSANOW, &options);
    25  if(code)
    26  throw USARTException("Fehler beim Setzen der Geräteparameter");
    27 
    30 }
    31 
    33 {
    34  int code = close(file_desc);
    35  if(code)
    36  throw USARTException("Fehler beim Schließen des Gerätes");
    37 }
    38 
    40 {
    41  int code = tcflush(file_desc, TCIFLUSH);
    42  if(code)
    43  throw USARTException("Fehler beim Leeren des Eingangspuffers");
    44 }
    45 
    47 {
    48  int code = tcflush(file_desc, TCOFLUSH);
    49  if(code)
    50  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
    51 }
    52 
    54 {
    55  int code = tcdrain(file_desc);
    56  if(code)
    57  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
    58 }
    59 
    61 {
    62  double pz = 1e2 * n_blocks_failed / n_blocks_total;
    63  pz = std::round(pz * 1e2) / 1e2;
    64  std::cout << "blocks total: " << n_blocks_total << " ok: " << (n_blocks_total - n_blocks_failed) << " failed: " << n_blocks_failed << " (" << pz << "%)" << std::endl;
    65 }
    66 
    67 void USART::writeByte(uint8_t b)
    68 {
    69  int sent = write(file_desc, &b, 1);
    70  if(sent != 1)
    71  {
    72  std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl;
    73  usleep(100000);
    74  sent = write(file_desc, &b, 1);
    75  if(sent != 1)
    76  throw USARTException("Fehler beim Senden: writeByte()");
    77  }
    78 
    79 }
    80 
    81 void USART::writeInt(uint16_t d)
    82 {
    83  int sent = write(file_desc, reinterpret_cast<char*>(&d), 2);
    84  if(sent != 2)
    85  throw USARTException("Fehler beim Senden: writeInt()");
    86 }
    87 
    88 
    89 
    90 int USART::read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout)
    91 {
    92  uint32_t elapsed = 0;
    93  int n_read = -1;
    94  auto start = std::chrono::steady_clock::now();
    95  auto end = start;
    96  while(elapsed < timeout)
    97  {
    98  n_read = read(file_desc, buffer + offset, len);
    99  if (n_read == len)
    100  return n_read;
    101 
    102  end = std::chrono::steady_clock::now();
    103  elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    104  }
    105 
    106  return 0;
    107 }
    108 
    109 int USART::write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout)
    110 {
    111  uint32_t elapsed = 0;
    112  int n_sent = -1;
    113  auto start = std::chrono::steady_clock::now();
    114  auto end = start;
    115  while(elapsed < timeout)
    116  {
    117  n_sent = write(file_desc, buffer + offset, len);
    119  if (n_sent == len)
    120  return n_sent;
    121 
    122  end = std::chrono::steady_clock::now();
    123  elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    124  }
    125 
    126  return n_sent;
    127 }
    128 
    129 void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len)
    130 {
    131  uint8_t crc;
    132  uint8_t aw;
    133  const uint16_t us_per_bit = (1000000 / baudrate) * 16;
    134  const uint16_t n_total = len + 3;
    135 
    136  n_blocks_total++;
    137  bool failed = false;
    138 
    139  do
    140  {
    141  // calc crc
    142  crc = 0;
    143  for(uint8_t i = 0; i < len; i++)
    144  {
    145  crc ^= buffer[i];
    146  for (uint8_t k = 0; k < 8; k++)
    147  {
    148  if (crc & 1)
    149  crc ^= CRC7_POLY;
    150  crc >>= 1;
    151  }
    152  }
    153 
    154  // construct block
    155  block_buffer[0] = len;
    156  std::memcpy(&block_buffer[1], buffer + offset, len);
    157  block_buffer[len + 1] = crc;
    158  block_buffer[len + 2] = BLOCK_END;
    159 
    160  // send block
    163  int n_sent = write_timeout(&block_buffer[0], 0, len + 3, us_per_bit * n_total);
    164  if(n_sent != n_total)
    165  throw std::runtime_error("fatal (send): " + std::to_string(n_sent));
    166 
    167  /*for(uint8_t i = 0; i < len + 3; i++)
    168  {
    169  write_timeout(&block_buffer[i], 0, 1, us_per_bit * n_total);
    170  //tcdrain(file_desc);
    171  //usleep(1000);
    172  }*/
    173 
    174  // flush output data
    175  tcdrain(file_desc);
    176 
    177  //usleep(us_per_bit * n_total * 10);
    178 
    179  // check response
    180  int n_read = read_timeout(&aw, 0, 1, us_per_bit * n_blocks_total * 10);
    181  for(uint16_t i = 0; i < 255 && n_read != 1; i++)
    182  {
    183  writeByte(0x80); // Stoppzeichen für Block
    184  if(tcdrain(file_desc))
    185  {
    186  std::cout << "drain failed" << std::endl;
    187  }
    188  std::cout << "WARNING: read error (" << n_read << "), retry #" << (int) i << std::endl;
    189  usleep(us_per_bit*100);
    190  n_read = read_timeout(&aw, 0, 1, us_per_bit);
    191  }
    192 
    193  if(n_read != 1)
    194  throw std::runtime_error("fatal: " + std::to_string(n_read));
    195 
    196  //clearInputBuffer();
    197 
    198  if(aw != 0xFF)
    199  {
    200  if(!failed)
    201  n_blocks_failed++;
    202  failed = true;
    203  std::cout << "block failed, retry" << std::endl;
    204  }
    205  }
    206  while(aw != 0xFF);
    207 
    208  //std::cout << "OK" << std::endl;
    209 }
    210 
    211 uint8_t USART::readByte(void)
    212 {
    213  char b;
    214  auto start = std::chrono::steady_clock::now();
    215  auto end = start;
    216  uint16_t elapsed = 0;
    217  while(elapsed < timeout * 100)
    218  {
    219  int code = read(file_desc, &b, 1);
    220  if (code > 0)
    221  return static_cast<uint8_t>(b);
    222 
    223  end = std::chrono::steady_clock::now();
    224  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    225  }
    226 
    227  throw TimeoutException("Verbindung unterbrochen.", timeout);
    228 }
    229 
    230 uint16_t USART::readInt(void)
    231 {
    232  return readByte() | readByte() << 8;
    233 }
    234 
    235 bool USART::readBlock(uint8_t* buffer, uint16_t offset)
    236 {
    237  uint8_t len = readByte();
    238  uint8_t crc = 0;
    239  buffer += offset;
    240 
    241  uint32_t block_timeout = timeout / 10;
    242 
    243  // wait for block
    244  int n_ready;
    245  uint16_t elapsed = 0;
    246  auto start = std::chrono::steady_clock::now();
    247  auto end = start;
    248  while(elapsed < block_timeout)
    249  {
    250  int code = ioctl(file_desc, FIONREAD, &n_ready);
    251  if(code != 0)
    252  {
    253  std::cout << "n_ready code: " << code << std::endl;
    254  return false;
    255  }
    256 
    257  if(n_ready >= len + 1)
    258  break;
    259 
    260  end = std::chrono::steady_clock::now();
    261  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    262  }
    263  if(elapsed >= timeout)
    264  {
    265  std::cout << "block timeout: " << std::endl;
    266  return false;
    267  }
    268 
    269  while(len--)
    270  {
    271  *buffer = readByte();
    272 
    273  crc ^= *buffer++;
    274  for (uint8_t i = 0; i < 8; i++)
    275  {
    276  if (crc & 1)
    277  crc ^= CRC7_POLY;
    278  crc >>= 1;
    279  }
    280  }
    281 
    282  crc ^= readByte();
    283  for (uint8_t i = 0; i < 8; i++)
    284  {
    285  if (crc & 1)
    286  crc ^= CRC7_POLY;
    287  crc >>= 1;
    288  }
    289 
    290  if(TEST == 1)
    291  crc = 1;
    292  if(TEST > 100)
    293  TEST = 0;
    294 
    295  if (crc == 0)
    296  {
    297  writeByte(0xFF);
    298  return true;
    299  }
    300  else
    301  {
    302  writeByte(0xFE);
    303  return false;
    304  }
    305 }
    306 
    308 {
    309  return baudrate;
    310 }
    311 
    313 {
    314  return timeout;
    315 }
    316 
    317 void USART::setBaudrate(uint32_t baudrate)
    318 {
    319  this->baudrate = baudrate;
    320 }
    321 
    322 void USART::setTimeout(uint8_t timeout)
    323 {
    324  this->timeout = timeout;
    325 }
    +
    uint32_t getBaudrate(void)
    Definition: usart.cpp:307
    +
    uint8_t readByte(void)
    Definition: usart.cpp:211
    +
    void printStatistics(void)
    Definition: usart.cpp:60
    void closeDevice(void)
    Definition: usart.cpp:32
    void clearInputBuffer(void)
    Definition: usart.cpp:39
    -
    uint8_t getTimeout(void)
    Definition: usart.cpp:311
    +
    uint8_t getTimeout(void)
    Definition: usart.cpp:312
    void clearOutputBuffer(void)
    Definition: usart.cpp:46
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:316
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:317
    void writeByte(uint8_t b)
    Definition: usart.cpp:67
    void openDevice(std::string device)
    Definition: usart.cpp:3
    -
    uint16_t readInt(void)
    Definition: usart.cpp:229
    -
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:321
    +
    uint16_t readInt(void)
    Definition: usart.cpp:230
    +
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:322
    void flushOutputBuffer(void)
    Definition: usart.cpp:53
    - +
    void writeInt(uint16_t d)
    Definition: usart.cpp:81
    diff --git a/docs/html/usart_8h_source.html b/docs/html/usart_8h_source.html index 7c8572b..31b8729 100644 --- a/docs/html/usart_8h_source.html +++ b/docs/html/usart_8h_source.html @@ -70,25 +70,25 @@ $(function() {
    usart.h
    -
    1 #ifndef USART_H
    2 #define USART_H
    3 
    4 #include <iostream>
    5 #include <cstdint>
    6 #include <chrono>
    7 #include <unistd.h>
    8 #include <cstring>
    9 #include <fcntl.h>
    10 #include <sys/ioctl.h>
    11 #include <termios.h>
    12 #include <cmath>
    13 #include "usartexception.h"
    14 #include "timeoutexception.h"
    15 
    16 class USART
    17 {
    18 public:
    19 
    20  /*************************************************
    21  * Methoden für die Verwaltung der Schnittstelle *
    22  *************************************************/
    23 
    29  void openDevice(std::string device);
    30 
    35  void closeDevice(void);
    36 
    41  void clearInputBuffer(void);
    42 
    47  void clearOutputBuffer(void);
    48 
    53  void flushOutputBuffer(void);
    54 
    58  void printStatistics(void);
    59 
    60  /*************************************************/
    61 
    62 
    63 
    64  /*************************************
    65  * Methoden für die Datenübertragung *
    66  *************************************/
    67 
    73  void writeByte(uint8_t b);
    74 
    80  void writeInt(uint16_t d);
    81 
    86  uint8_t readByte(void);
    87 
    92  uint16_t readInt(void);
    93 
    94  int read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
    95  int write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
    96  void writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len);
    97  bool readBlock(uint8_t* buffer, uint16_t offset);
    98 
    99  /*************************************/
    100 
    101 
    102 
    103  /***************************************
    104  * Methoden für einstellbare Parameter *
    105  ***************************************/
    106 
    111  uint32_t getBaudrate(void);
    112 
    117  uint8_t getTimeout(void);
    118 
    123  void setBaudrate(uint32_t baudrate);
    124 
    129  void setTimeout(uint8_t timeout);
    130 
    131  /***************************************/
    132 
    133  constexpr static uint8_t CRC7_POLY = 0x91;
    134  constexpr static uint8_t MAX_BLOCK_SIZE = 64;
    135  constexpr static uint8_t BLOCK_END = 0x80;
    136 private:
    137 
    138  int file_desc = -1; // Linux Dateideskriptor
    139  uint32_t baudrate = 9600; // Standard-Baudrate, sollte mit setBaudrate() überschrieben werden!
    140  int TEST = 0;
    141  uint8_t timeout = 10; // in Dezisekunden
    142  uint8_t block_buffer[MAX_BLOCK_SIZE + 3];
    143 
    144  // debug statistics
    145  uint32_t n_blocks_total = 0;
    146  uint32_t n_blocks_failed = 0;
    147 };
    148 
    149 
    150 #endif // USART_H
    -
    uint32_t getBaudrate(void)
    Definition: usart.cpp:306
    -
    uint8_t readByte(void)
    Definition: usart.cpp:210
    +
    1 #ifndef USART_H
    2 #define USART_H
    3 
    4 #include <iostream>
    5 #include <cstdint>
    6 #include <chrono>
    7 #include <unistd.h>
    8 #include <cstring>
    9 #include <fcntl.h>
    10 #include <sys/ioctl.h>
    11 #include <termios.h>
    12 #include <cmath>
    13 #include "usartexception.h"
    14 #include "timeoutexception.h"
    15 
    18 class USART
    19 {
    20 public:
    21 
    22  /*************************************************
    23  * Methoden für die Verwaltung der Schnittstelle *
    24  *************************************************/
    25 
    31  void openDevice(std::string device);
    32 
    37  void closeDevice(void);
    38 
    43  void clearInputBuffer(void);
    44 
    49  void clearOutputBuffer(void);
    50 
    55  void flushOutputBuffer(void);
    56 
    60  void printStatistics(void);
    61 
    62  /*************************************************/
    63 
    64 
    65 
    66  /*************************************
    67  * Methoden für die Datenübertragung *
    68  *************************************/
    69 
    75  void writeByte(uint8_t b);
    76 
    82  void writeInt(uint16_t d);
    83 
    88  uint8_t readByte(void);
    89 
    94  uint16_t readInt(void);
    95 
    96  int read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
    97  int write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
    98  void writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len);
    99  bool readBlock(uint8_t* buffer, uint16_t offset);
    100 
    101  /*************************************/
    102 
    103 
    104 
    105  /***************************************
    106  * Methoden für einstellbare Parameter *
    107  ***************************************/
    108 
    113  uint32_t getBaudrate(void);
    114 
    119  uint8_t getTimeout(void);
    120 
    125  void setBaudrate(uint32_t baudrate);
    126 
    131  void setTimeout(uint8_t timeout);
    132 
    133  /***************************************/
    134 
    135  constexpr static uint8_t CRC7_POLY = 0x91;
    136  constexpr static uint8_t MAX_BLOCK_SIZE = 64;
    137  constexpr static uint8_t BLOCK_END = 0x80;
    138 private:
    139 
    140  int file_desc = -1; // Linux Dateideskriptor
    141  uint32_t baudrate = 9600; // Standard-Baudrate, sollte mit setBaudrate() überschrieben werden!
    142  int TEST = 0;
    143  uint8_t timeout = 10; // in Dezisekunden
    144  uint8_t block_buffer[MAX_BLOCK_SIZE + 3];
    145 
    146  // debug statistics
    147  uint32_t n_blocks_total = 0;
    148  uint32_t n_blocks_failed = 0;
    149 };
    150 
    151 
    152 #endif // USART_H
    +
    uint32_t getBaudrate(void)
    Definition: usart.cpp:307
    +
    uint8_t readByte(void)
    Definition: usart.cpp:211
    void printStatistics(void)
    Definition: usart.cpp:60
    void closeDevice(void)
    Definition: usart.cpp:32
    void clearInputBuffer(void)
    Definition: usart.cpp:39
    -
    uint8_t getTimeout(void)
    Definition: usart.cpp:311
    -
    Definition: usart.h:16
    +
    uint8_t getTimeout(void)
    Definition: usart.cpp:312
    +
    Definition: usart.h:18
    void clearOutputBuffer(void)
    Definition: usart.cpp:46
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:316
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:317
    void writeByte(uint8_t b)
    Definition: usart.cpp:67
    void openDevice(std::string device)
    Definition: usart.cpp:3
    -
    uint16_t readInt(void)
    Definition: usart.cpp:229
    -
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:321
    +
    uint16_t readInt(void)
    Definition: usart.cpp:230
    +
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:322
    void flushOutputBuffer(void)
    Definition: usart.cpp:53
    void writeInt(uint16_t d)
    Definition: usart.cpp:81
    diff --git a/docs/html/usartexception_8h_source.html b/docs/html/usartexception_8h_source.html index aa66137..c067c44 100644 --- a/docs/html/usartexception_8h_source.html +++ b/docs/html/usartexception_8h_source.html @@ -70,11 +70,11 @@ $(function() {
    usartexception.h
    -
    1 #ifndef USARTEXCEPTION_H
    2 #define USARTEXCEPTION_H
    3 
    4 #include <exception>
    5 #include <string>
    6 
    7 // SOURCE: https://stackoverflow.com/a/8152888
    8 
    9 class USARTException: public std::exception
    10 {
    11 public:
    12  explicit USARTException(const char* message) : msg(message)
    13  {
    14  }
    15 
    16  explicit USARTException(const std::string& message) : msg(message)
    17  {
    18  }
    19 
    20  virtual ~USARTException() throw ()
    21  {
    22  }
    23 
    24  virtual const char* what() const throw ()
    25  {
    26  return msg.c_str();
    27  }
    28 
    29 protected:
    30  std::string msg;
    31 };
    32 
    33 #endif // USARTEXCEPTION_H
    - +
    1 #ifndef USARTEXCEPTION_H
    2 #define USARTEXCEPTION_H
    3 
    4 #include <exception>
    5 #include <string>
    6 
    7 // SOURCE: https://stackoverflow.com/a/8152888
    8 
    11 class USARTException: public std::exception
    12 {
    13 public:
    14  explicit USARTException(const char* message) : msg(message)
    15  {
    16  }
    17 
    18  explicit USARTException(const std::string& message) : msg(message)
    19  {
    20  }
    21 
    22  virtual ~USARTException() throw ()
    23  {
    24  }
    25 
    26  virtual const char* what() const throw ()
    27  {
    28  return msg.c_str();
    29  }
    30 
    31 protected:
    32  std::string msg;
    33 };
    34 
    35 #endif // USARTEXCEPTION_H
    + diff --git a/docs/html/view_8cpp_source.html b/docs/html/view_8cpp_source.html index bb203a4..0de8167 100644 --- a/docs/html/view_8cpp_source.html +++ b/docs/html/view_8cpp_source.html @@ -70,11 +70,11 @@ $(function() {
    view.cpp
    -
    1 #include "view.h"
    2 
    3 WINDOW* View::win = nullptr;
    4 
    5 View::View()
    6 {
    7  if(!win)
    8  {
    9  B15F::abort("View::win not initialized, missing context");
    10  }
    11  getmaxyx(win, height, width); // init width and height
    12  keypad(win, TRUE);
    13 }
    14 
    15 View::~View()
    16 {
    17 }
    18 
    19 void View::setWinContext(WINDOW* win)
    20 {
    21  View::win = win;
    22 }
    23 
    24 WINDOW* View::getWinContext()
    25 {
    26  return win;
    27 }
    28 
    29 // from: https://stackoverflow.com/a/37454181
    30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
    31 {
    32  std::vector<std::string> tokens;
    33  size_t prev = 0, pos = 0;
    34  do
    35  {
    36  pos = str.find(delim, prev);
    37  if (pos == std::string::npos) pos = str.length();
    38  std::string token = str.substr(prev, pos-prev);
    39  if (!token.empty()) tokens.push_back(token);
    40  prev = pos + delim.length();
    41  }
    42  while (pos < str.length() && prev < str.length());
    43  return tokens;
    44 }
    45 
    46 
    47 void View::setTitle(std::string title)
    48 {
    49  this->title = title;
    50 }
    51 
    52 void View::repaint()
    53 {
    54  // get screen size
    55  struct winsize size;
    56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
    57  throw std::runtime_error("TIOCGWINSZ error");
    58 
    59 
    60  start_x = floor((size.ws_col - width) / 2.);
    61  start_y = floor((size.ws_row - height) / 2.);
    62 
    63  curs_set(0); // hide cursor
    64  mvwin(win, start_y, start_x);
    65  clear();
    66  wclear(win);
    67 
    68  // generic draw
    69  box(win, 0, 0);
    70  int offset_x = (width - title.length()) / 2;
    71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
    72 
    73  // specific draw
    74  draw();
    75 
    76  refresh();
    77  wrefresh(win);
    78 }
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:322
    +
    1 #include "view.h"
    2 
    3 WINDOW* View::win = nullptr;
    4 
    5 View::View()
    6 {
    7  if(!win)
    8  {
    9  B15F::abort("View::win not initialized, missing context");
    10  }
    11  getmaxyx(win, height, width); // init width and height
    12  keypad(win, TRUE);
    13 }
    14 
    15 View::~View()
    16 {
    17 }
    18 
    19 void View::setWinContext(WINDOW* win)
    20 {
    21  View::win = win;
    22 }
    23 
    24 WINDOW* View::getWinContext()
    25 {
    26  return win;
    27 }
    28 
    29 // from: https://stackoverflow.com/a/37454181
    30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
    31 {
    32  std::vector<std::string> tokens;
    33  size_t prev = 0, pos = 0;
    34  do
    35  {
    36  pos = str.find(delim, prev);
    37  if (pos == std::string::npos) pos = str.length();
    38  std::string token = str.substr(prev, pos-prev);
    39  if (!token.empty()) tokens.push_back(token);
    40  prev = pos + delim.length();
    41  }
    42  while (pos < str.length() && prev < str.length());
    43  return tokens;
    44 }
    45 
    46 
    47 void View::setTitle(std::string title)
    48 {
    49  this->title = title;
    50 }
    51 
    52 void View::repaint()
    53 {
    54  // get screen size
    55  struct winsize size;
    56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
    57  throw std::runtime_error("TIOCGWINSZ error");
    58 
    59 
    60  start_x = floor((size.ws_col - width) / 2.);
    61  start_y = floor((size.ws_row - height) / 2.);
    62 
    63  curs_set(0); // hide cursor
    64  mvwin(win, start_y, start_x);
    65  clear();
    66  wclear(win);
    67 
    68  // generic draw
    69  box(win, 0, 0);
    70  int offset_x = (width - title.length()) / 2;
    71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
    72 
    73  // specific draw
    74  draw();
    75 
    76  refresh();
    77  wrefresh(win);
    78 }
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:327
    diff --git a/docs/html/view_8h_source.html b/docs/html/view_8h_source.html index 0cdb246..92e566e 100644 --- a/docs/html/view_8h_source.html +++ b/docs/html/view_8h_source.html @@ -70,11 +70,11 @@ $(function() {
    view.h
    -
    1 #ifndef VIEW_H
    2 #define VIEW_H
    3 
    4 #include <iostream>
    5 #include <cmath>
    6 #include <vector>
    7 #include <functional>
    8 #include <ncurses.h> // sudo apt-get install libncurses5-dev
    9 #include <sys/ioctl.h>
    10 #include <unistd.h>
    11 #include <signal.h>
    12 #include "../drv/b15f.h"
    13 
    14 extern std::string ERR_MSG;
    15 typedef std::function<void(int)> call_t;
    16 
    17 class View
    18 {
    19 public:
    20  View(void);
    21  virtual ~View(void);
    22 
    23  static void setWinContext(WINDOW* win);
    24  static WINDOW* getWinContext(void);
    25  static std::vector<std::string> str_split(const std::string& str, const std::string delim);
    26 
    27  virtual void setTitle(std::string title);
    28 
    29  virtual void repaint(void);
    30 
    31  virtual void draw(void) = 0;
    32  virtual call_t keypress(int& key) = 0;
    33 
    34 
    35 protected:
    36  int width, height;
    37  int start_x = 0, start_y = 0;
    38  std::string title;
    39  std::vector<call_t> calls;
    40 
    41  static WINDOW* win;
    42  constexpr static int KEY_ENT = 10;
    43 };
    44 
    45 #endif // VIEW_H
    -
    Definition: view.h:17
    +
    1 #ifndef VIEW_H
    2 #define VIEW_H
    3 
    4 #include <iostream>
    5 #include <cmath>
    6 #include <vector>
    7 #include <functional>
    8 #include <ncurses.h> // sudo apt-get install libncurses5-dev
    9 #include <sys/ioctl.h>
    10 #include <unistd.h>
    11 #include <signal.h>
    12 #include "../drv/b15f.h"
    13 
    14 extern std::string ERR_MSG;
    15 typedef std::function<void(int)> call_t;
    16 
    19 class View
    20 {
    21 public:
    22  View(void);
    23  virtual ~View(void);
    24 
    25  static void setWinContext(WINDOW* win);
    26  static WINDOW* getWinContext(void);
    27  static std::vector<std::string> str_split(const std::string& str, const std::string delim);
    28 
    29  virtual void setTitle(std::string title);
    30 
    31  virtual void repaint(void);
    32 
    33  virtual void draw(void) = 0;
    34  virtual call_t keypress(int& key) = 0;
    35 
    36 
    37 protected:
    38  int width, height;
    39  int start_x = 0, start_y = 0;
    40  std::string title;
    41  std::vector<call_t> calls;
    42 
    43  static WINDOW* win;
    44  constexpr static int KEY_ENT = 10;
    45 };
    46 
    47 #endif // VIEW_H
    +
    Definition: view.h:19
    diff --git a/docs/html/view__info_8cpp_source.html b/docs/html/view__info_8cpp_source.html index aaf6b4c..2370daf 100644 --- a/docs/html/view__info_8cpp_source.html +++ b/docs/html/view__info_8cpp_source.html @@ -70,10 +70,10 @@ $(function() {
    view_info.cpp
    -
    1 #include "view_info.h"
    2 
    3 ViewInfo::ViewInfo()
    4 {
    5  calls.push_back(nullptr);
    6 }
    7 
    8 void ViewInfo::setText(std::string text)
    9 {
    10  this->text = text;
    11 }
    12 
    13 void ViewInfo::setLabelClose(std::string label)
    14 {
    15  this->label_close = label;
    16 }
    17 
    18 void ViewInfo::setCall(call_t call)
    19 {
    20  calls[0] = call;
    21 }
    22 
    23 void ViewInfo::draw()
    24 {
    25  int li = 0;
    26  for(std::string line : str_split(text, "\n"))
    27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
    28 
    29  close_offset_x = (width - label_close.length()) / 2;
    30  close_offset_y = height - 2;
    31 
    32  wattron(win, A_REVERSE);
    33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
    34  wattroff(win, A_REVERSE);
    35 }
    36 
    37 call_t ViewInfo::keypress(int& key)
    38 {
    39  switch(key)
    40  {
    41 
    42  case KEY_MOUSE:
    43  {
    44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    45  MEVENT event;
    46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    47  {
    48  size_t column = start_x + close_offset_x;
    49  size_t row = start_y + close_offset_y;
    50  size_t mouse_x = event.x, mouse_y = event.y;
    51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    52  key = -1; // do return from view
    53  }
    54  break;
    55  }
    56  case KEY_ENT:
    57  key = -1; // do return from view
    58  break;
    59  default:
    60  break;
    61  }
    62  return calls[0];
    63 }
    +
    1 #include "view_info.h"
    2 
    3 ViewInfo::ViewInfo()
    4 {
    5  calls.push_back(nullptr);
    6 }
    7 
    8 void ViewInfo::setText(std::string text)
    9 {
    10  this->text = text;
    11 }
    12 
    13 void ViewInfo::setLabelClose(std::string label)
    14 {
    15  this->label_close = label;
    16 }
    17 
    18 void ViewInfo::setCall(call_t call)
    19 {
    20  calls[0] = call;
    21 }
    22 
    23 void ViewInfo::draw()
    24 {
    25  int li = 0;
    26  for(std::string line : str_split(text, "\n"))
    27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
    28 
    29  close_offset_x = (width - label_close.length()) / 2;
    30  close_offset_y = height - 2;
    31 
    32  wattron(win, A_REVERSE);
    33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
    34  wattroff(win, A_REVERSE);
    35 }
    36 
    37 call_t ViewInfo::keypress(int& key)
    38 {
    39  switch(key)
    40  {
    41 
    42  case KEY_MOUSE:
    43  {
    44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    45  MEVENT event;
    46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    47  {
    48  size_t column = start_x + close_offset_x;
    49  size_t row = start_y + close_offset_y;
    50  size_t mouse_x = event.x, mouse_y = event.y;
    51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    52  key = -1; // do return from view
    53  }
    54  break;
    55  }
    56  case KEY_ENT:
    57  key = -1; // do return from view
    58  break;
    59  default:
    60  break;
    61  }
    62  return calls[0];
    63 }
    diff --git a/docs/html/view__info_8h_source.html b/docs/html/view__info_8h_source.html index 0cdd6e1..992f9d7 100644 --- a/docs/html/view__info_8h_source.html +++ b/docs/html/view__info_8h_source.html @@ -70,12 +70,12 @@ $(function() {
    view_info.h
    -
    1 #ifndef VIEW_INFO
    2 #define VIEW_INFO
    3 
    4 #include "view.h"
    5 
    6 class ViewInfo : public View
    7 {
    8 public:
    9  ViewInfo(void);
    10  virtual void setText(std::string text);
    11  virtual void setLabelClose(std::string label);;
    12  virtual void setCall(call_t call);
    13  virtual void draw(void) override;
    14  virtual call_t keypress(int& key) override;
    15 
    16 protected:
    17  std::string text;
    18  std::string label_close;
    19  int close_offset_x = 0;
    20  int close_offset_y = 0;
    21  constexpr static int text_offset_x = 2;
    22  constexpr static int text_offset_y = 3;
    23 };
    24 
    25 #endif // VIEW_INFO
    - -
    Definition: view.h:17
    +
    1 #ifndef VIEW_INFO
    2 #define VIEW_INFO
    3 
    4 #include "view.h"
    5 
    8 class ViewInfo : public View
    9 {
    10 public:
    11  ViewInfo(void);
    12  virtual void setText(std::string text);
    13  virtual void setLabelClose(std::string label);;
    14  virtual void setCall(call_t call);
    15  virtual void draw(void) override;
    16  virtual call_t keypress(int& key) override;
    17 
    18 protected:
    19  std::string text;
    20  std::string label_close;
    21  int close_offset_x = 0;
    22  int close_offset_y = 0;
    23  constexpr static int text_offset_x = 2;
    24  constexpr static int text_offset_y = 3;
    25 };
    26 
    27 #endif // VIEW_INFO
    + +
    Definition: view.h:19
    diff --git a/docs/html/view__monitor_8cpp_source.html b/docs/html/view__monitor_8cpp_source.html index 4513007..5c600ac 100644 --- a/docs/html/view__monitor_8cpp_source.html +++ b/docs/html/view__monitor_8cpp_source.html @@ -70,21 +70,21 @@ $(function() {
    view_monitor.cpp
    -
    1 #include "view_monitor.h"
    2 
    3 ViewMonitor::ViewMonitor() : t_worker(&ViewMonitor::worker, this)
    4 {
    5 }
    6 
    7 call_t ViewMonitor::keypress(int& key)
    8 {
    9  switch(key)
    10  {
    11 
    12  case KEY_MOUSE:
    13  {
    14  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    15  MEVENT event;
    16  bool hit = false;
    17  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    18  {
    19  size_t column = start_x + close_offset_x;
    20  size_t row = start_y + close_offset_y;
    21  size_t mouse_x = event.x, mouse_y = event.y;
    22  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    23  hit = true;
    24  }
    25  if(!hit)
    26  break;
    27 
    28  // fall through to next case
    29  [[fallthrough]];
    30  }
    31  case KEY_ENT:
    32  run_worker = false;
    33  key = -1; // do return from view
    34  wclear(win);
    35  wrefresh(win);
    36  t_worker.join();
    37  break;
    38  default:
    39  break;
    40  }
    41  return calls[0];
    42 }
    43 
    44 std::string ViewMonitor::fancyDigitalString(uint8_t& b)
    45 {
    46  std::stringstream str;
    47  str << std::bitset<8>(b).to_string();
    48  str << " ";
    49  str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec;
    50  return str.str();
    51 }
    52 
    53 std::string ViewMonitor::fancyAnalogString(uint16_t& v)
    54 {
    55  std::stringstream str;
    56  double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0;
    57 
    58  str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V ";
    59 
    60  str << "[";
    61  uint8_t p = round(v * 40.0 / 1023.0);
    62  for(uint8_t i = 0; i < p; i++)
    63  str << "X";
    64  for(uint8_t i = 0; i < 40 - p; i++)
    65  str << " ";
    66  str << "]" << std::endl;
    67 
    68  return str.str();
    69 }
    70 
    71 void ViewMonitor::worker()
    72 {
    73  B15F& drv = B15F::getInstance();
    74  while(run_worker)
    75  {
    76  try
    77  {
    78  std::this_thread::sleep_for(std::chrono::milliseconds(100));
    79 
    80  uint8_t be0 = drv.digitalRead0();
    81  uint8_t be1 = drv.digitalRead1();
    82  uint8_t dsw = drv.readDipSwitch();
    83  uint16_t adc[8];
    84  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    85  adc[i] = drv.analogRead(i);
    86 
    87 
    88  std::stringstream str;
    89 
    90  // hline
    91  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    92  if(i % 2 == 0)
    93  str << "-";
    94  else
    95  str << " ";
    96  str << std::endl;
    97 
    98  str << "Digitale Enigaenge:" << std::endl;
    99  str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl;
    100  str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl;
    101  str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl;
    102 
    103  // hline
    104  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    105  if(i % 2 == 0)
    106  str << "-";
    107  else
    108  str << " ";
    109  str << std::endl;
    110 
    111  str << "Analoge Eingaenge:" << std::endl;
    112  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    113  {
    114  str << "Kanal " << std::to_string((int) i) << ": ";
    115  str << fancyAnalogString(adc[i]) << std::endl;
    116  }
    117 
    118  text = str.str();
    119  repaint();
    120  }
    121  catch(DriverException& ex)
    122  {
    123  std::cout << "DriverException: " << ex.what() << std::endl;
    124  drv.delay_ms(1000);
    125  }
    126  catch(...)
    127  {
    128  try
    129  {
    130  drv.reconnect();
    131  }
    132  catch(...)
    133  {
    134  B15F::abort("yoho meine dudes");
    135  return;
    136  }
    137  }
    138  }
    139 }
    - -
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:172
    -
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:190
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:290
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:300
    -
    Definition: b15f.h:24
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:322
    -
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:219
    -
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:181
    +
    1 #include "view_monitor.h"
    2 
    3 ViewMonitor::ViewMonitor() : t_worker(&ViewMonitor::worker, this)
    4 {
    5 }
    6 
    7 call_t ViewMonitor::keypress(int& key)
    8 {
    9  switch(key)
    10  {
    11 
    12  case KEY_MOUSE:
    13  {
    14  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    15  MEVENT event;
    16  bool hit = false;
    17  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    18  {
    19  size_t column = start_x + close_offset_x;
    20  size_t row = start_y + close_offset_y;
    21  size_t mouse_x = event.x, mouse_y = event.y;
    22  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    23  hit = true;
    24  }
    25  if(!hit)
    26  break;
    27 
    28  // fall through to next case
    29  [[fallthrough]];
    30  }
    31  case KEY_ENT:
    32  run_worker = false;
    33  key = -1; // do return from view
    34  wclear(win);
    35  wrefresh(win);
    36  t_worker.join();
    37  break;
    38  default:
    39  break;
    40  }
    41  return calls[0];
    42 }
    43 
    44 std::string ViewMonitor::fancyDigitalString(uint8_t& b)
    45 {
    46  std::stringstream str;
    47  str << std::bitset<8>(b).to_string();
    48  str << " ";
    49  str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec;
    50  return str.str();
    51 }
    52 
    53 std::string ViewMonitor::fancyAnalogString(uint16_t& v)
    54 {
    55  std::stringstream str;
    56  double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0;
    57 
    58  str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V ";
    59 
    60  str << "[";
    61  uint8_t p = round(v * 40.0 / 1023.0);
    62  for(uint8_t i = 0; i < p; i++)
    63  str << "X";
    64  for(uint8_t i = 0; i < 40 - p; i++)
    65  str << " ";
    66  str << "]" << std::endl;
    67 
    68  return str.str();
    69 }
    70 
    71 void ViewMonitor::worker()
    72 {
    73  B15F& drv = B15F::getInstance();
    74  while(run_worker)
    75  {
    76  try
    77  {
    78  std::this_thread::sleep_for(std::chrono::milliseconds(100));
    79 
    80  uint8_t be0 = drv.digitalRead0();
    81  uint8_t be1 = drv.digitalRead1();
    82  uint8_t dsw = drv.readDipSwitch();
    83  uint16_t adc[8];
    84  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    85  adc[i] = drv.analogRead(i);
    86 
    87 
    88  std::stringstream str;
    89 
    90  // hline
    91  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    92  if(i % 2 == 0)
    93  str << "-";
    94  else
    95  str << " ";
    96  str << std::endl;
    97 
    98  str << "Digitale Enigaenge:" << std::endl;
    99  str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl;
    100  str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl;
    101  str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl;
    102 
    103  // hline
    104  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    105  if(i % 2 == 0)
    106  str << "-";
    107  else
    108  str << " ";
    109  str << std::endl;
    110 
    111  str << "Analoge Eingaenge:" << std::endl;
    112  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    113  {
    114  str << "Kanal " << std::to_string((int) i) << ": ";
    115  str << fancyAnalogString(adc[i]) << std::endl;
    116  }
    117 
    118  text = str.str();
    119  repaint();
    120  }
    121  catch(DriverException& ex)
    122  {
    123  std::cout << "DriverException: " << ex.what() << std::endl;
    124  drv.delay_ms(1000);
    125  }
    126  catch(...)
    127  {
    128  try
    129  {
    130  drv.reconnect();
    131  }
    132  catch(...)
    133  {
    134  B15F::abort("yoho meine dudes");
    135  return;
    136  }
    137  }
    138  }
    139 }
    + +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:292
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:302
    +
    Definition: b15f.h:26
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:327
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    void reconnect(void)
    Definition: b15f.cpp:57
    - + diff --git a/docs/html/view__monitor_8h_source.html b/docs/html/view__monitor_8h_source.html index e224df6..0c48289 100644 --- a/docs/html/view__monitor_8h_source.html +++ b/docs/html/view__monitor_8h_source.html @@ -70,12 +70,12 @@ $(function() {
    view_monitor.h
    -
    1 #ifndef VIEW_MONITOR_H
    2 #define VIEW_MONITOR_H
    3 
    4 #include <thread>
    5 #include <chrono>
    6 #include <sstream>
    7 #include <bitset>
    8 #include "view_info.h"
    9 #include "../drv/b15f.h"
    10 
    11 class ViewMonitor : public ViewInfo
    12 {
    13 
    14 public:
    15  ViewMonitor(void);
    16  virtual call_t keypress(int& key) override;
    17 
    18 private:
    19  std::string fancyDigitalString(uint8_t& b);
    20  std::string fancyAnalogString(uint16_t& v);
    21 
    22 protected:
    23  virtual void worker(void);
    24  volatile bool run_worker = true;
    25  std::thread t_worker;
    26 
    27 };
    28 
    29 #endif // VIEW_MONITOR_H
    - - +
    1 #ifndef VIEW_MONITOR_H
    2 #define VIEW_MONITOR_H
    3 
    4 #include <thread>
    5 #include <chrono>
    6 #include <sstream>
    7 #include <bitset>
    8 #include "view_info.h"
    9 #include "../drv/b15f.h"
    10 
    13 class ViewMonitor : public ViewInfo
    14 {
    15 
    16 public:
    17  ViewMonitor(void);
    18  virtual call_t keypress(int& key) override;
    19 
    20 private:
    21  std::string fancyDigitalString(uint8_t& b);
    22  std::string fancyAnalogString(uint16_t& v);
    23 
    24 protected:
    25  virtual void worker(void);
    26  volatile bool run_worker = true;
    27  std::thread t_worker;
    28 
    29 };
    30 
    31 #endif // VIEW_MONITOR_H
    + + diff --git a/docs/html/view__promt_8cpp_source.html b/docs/html/view__promt_8cpp_source.html index ce44e4d..cef242a 100644 --- a/docs/html/view__promt_8cpp_source.html +++ b/docs/html/view__promt_8cpp_source.html @@ -70,10 +70,10 @@ $(function() {
    view_promt.cpp
    -
    1 #include "view_promt.h"
    2 
    3 void ViewPromt::draw()
    4 {
    5  curs_set(1); // show cursor
    6 
    7  int li = text_offset_y;
    8  int ci = 0;
    9  for(std::string line : str_split(message + input, "\n"))
    10  {
    11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
    12  ci = line.length() + text_offset_x;
    13  }
    14 
    15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
    16  button_offset_y = height - text_offset_y;
    17 
    18  if(selection == 0)
    19  {
    20  wattron(win, A_REVERSE);
    21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    22  wattroff(win, A_REVERSE);
    23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    25  }
    26  else
    27  {
    28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    30  wattron(win, A_REVERSE);
    31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    32  wattroff(win, A_REVERSE);
    33  }
    34  wmove(win, li, ci);
    35 }
    36 
    37 void ViewPromt::setMessage(std::string message)
    38 {
    39  this->message = message;
    40 }
    41 
    42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
    43 {
    44  label_confirm = name;
    45  call_confirm = call;
    46 }
    47 
    48 void ViewPromt::setCancel(std::string name, bool cancelable)
    49 {
    50  label_cancel = name;
    51  this->cancelable = cancelable;
    52 }
    53 
    54 std::string ViewPromt::getInput()
    55 {
    56  return input;
    57 }
    58 
    59 std::function<void(int)> ViewPromt::keypress(int& key)
    60 {
    61  std::function<void(int)> ret = nullptr;
    62  switch(key)
    63  {
    64  case KEY_BACKSPACE:
    65  if(input.length())
    66  input.pop_back();
    67  break;
    68  case '\t':
    69  case KEY_LEFT:
    70  case KEY_RIGHT:
    71  selection = (selection + 1 ) % 2;
    72  break;
    73  case KEY_MOUSE:
    74  {
    75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    76  MEVENT event;
    77  bool hit = false;
    78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    79  {
    80  size_t column_start = start_x + button_offset_x;
    81  size_t row_start = start_y + button_offset_y;
    82  size_t mouse_x = event.x, mouse_y = event.y;
    83  if(mouse_y == row_start)
    84  {
    85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
    86  {
    87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    88  hit = true;
    89  selection = 0;
    90  }
    91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
    92  {
    93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    94  hit = true;
    95  selection = 1;
    96  }
    97  }
    98  }
    99  if(!hit)
    100  break;
    101 
    102  // fall through to next case
    103  [[fallthrough]];
    104  }
    105  case KEY_ENT:
    106  if(selection == 0) // exit
    107  key = -1; // do return from view
    108  else
    109  ret = call_confirm;
    110  break;
    111  default:
    112  break;
    113  }
    114 
    115  if(key >= ' ' && key <= '~')
    116  input += (char) key;
    117 
    118  if(key != KEY_ENT)
    119  repaint();
    120  return ret;
    121 }
    +
    1 #include "view_promt.h"
    2 
    3 void ViewPromt::draw()
    4 {
    5  curs_set(1); // show cursor
    6 
    7  int li = text_offset_y;
    8  int ci = 0;
    9  for(std::string line : str_split(message + input, "\n"))
    10  {
    11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
    12  ci = line.length() + text_offset_x;
    13  }
    14 
    15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
    16  button_offset_y = height - text_offset_y;
    17 
    18  if(selection == 0)
    19  {
    20  wattron(win, A_REVERSE);
    21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    22  wattroff(win, A_REVERSE);
    23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    25  }
    26  else
    27  {
    28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    30  wattron(win, A_REVERSE);
    31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    32  wattroff(win, A_REVERSE);
    33  }
    34  wmove(win, li, ci);
    35 }
    36 
    37 void ViewPromt::setMessage(std::string message)
    38 {
    39  this->message = message;
    40 }
    41 
    42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
    43 {
    44  label_confirm = name;
    45  call_confirm = call;
    46 }
    47 
    48 void ViewPromt::setCancel(std::string name, bool cancelable)
    49 {
    50  label_cancel = name;
    51  this->cancelable = cancelable;
    52 }
    53 
    54 std::string ViewPromt::getInput()
    55 {
    56  return input;
    57 }
    58 
    59 std::function<void(int)> ViewPromt::keypress(int& key)
    60 {
    61  std::function<void(int)> ret = nullptr;
    62  switch(key)
    63  {
    64  case KEY_BACKSPACE:
    65  if(input.length())
    66  input.pop_back();
    67  break;
    68  case '\t':
    69  case KEY_LEFT:
    70  case KEY_RIGHT:
    71  selection = (selection + 1 ) % 2;
    72  break;
    73  case KEY_MOUSE:
    74  {
    75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    76  MEVENT event;
    77  bool hit = false;
    78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    79  {
    80  size_t column_start = start_x + button_offset_x;
    81  size_t row_start = start_y + button_offset_y;
    82  size_t mouse_x = event.x, mouse_y = event.y;
    83  if(mouse_y == row_start)
    84  {
    85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
    86  {
    87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    88  hit = true;
    89  selection = 0;
    90  }
    91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
    92  {
    93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    94  hit = true;
    95  selection = 1;
    96  }
    97  }
    98  }
    99  if(!hit)
    100  break;
    101 
    102  // fall through to next case
    103  [[fallthrough]];
    104  }
    105  case KEY_ENT:
    106  if(selection == 0) // exit
    107  key = -1; // do return from view
    108  else
    109  ret = call_confirm;
    110  break;
    111  default:
    112  break;
    113  }
    114 
    115  if(key >= ' ' && key <= '~')
    116  input += (char) key;
    117 
    118  if(key != KEY_ENT)
    119  repaint();
    120  return ret;
    121 }
    diff --git a/docs/html/view__promt_8h_source.html b/docs/html/view__promt_8h_source.html index f09c0c1..df2d726 100644 --- a/docs/html/view__promt_8h_source.html +++ b/docs/html/view__promt_8h_source.html @@ -70,12 +70,12 @@ $(function() {
    view_promt.h
    -
    1 #ifndef VIEW_PROMT_H
    2 #define VIEW_PROMT_H
    3 
    4 #include <vector>
    5 #include <string>
    6 #include "view.h"
    7 
    8 class ViewPromt : public View
    9 {
    10 public:
    11  virtual void draw(void) override;
    12  virtual void setMessage(std::string message);
    13  virtual void setConfirm(std::string name, call_t call);
    14  virtual void setCancel(std::string name, bool cancelable);
    15  virtual std::string getInput(void);
    16  virtual call_t keypress(int& key) override;
    17 
    18 protected:
    19  size_t selection = 1;
    20  std::string input;
    21  std::string message = "Input";
    22  std::string label_confirm = "[ OK ]";
    23  std::string sep = " ";
    24  std::string label_cancel = "[ Cancel ]";
    25  call_t call_confirm = nullptr;
    26  bool cancelable = true;
    27  int button_offset_x = 0, button_offset_y = 0;
    28  constexpr static int text_offset_x = 2;
    29  constexpr static int text_offset_y = 2;
    30 };
    31 
    32 #endif // VIEW_PROMT_H
    -
    Definition: view.h:17
    - +
    1 #ifndef VIEW_PROMT_H
    2 #define VIEW_PROMT_H
    3 
    4 #include <vector>
    5 #include <string>
    6 #include "view.h"
    7 
    10 class ViewPromt : public View
    11 {
    12 public:
    13  virtual void draw(void) override;
    14  virtual void setMessage(std::string message);
    15  virtual void setConfirm(std::string name, call_t call);
    16  virtual void setCancel(std::string name, bool cancelable);
    17  virtual std::string getInput(void);
    18  virtual call_t keypress(int& key) override;
    19 
    20 protected:
    21  size_t selection = 1;
    22  std::string input;
    23  std::string message = "Input";
    24  std::string label_confirm = "[ OK ]";
    25  std::string sep = " ";
    26  std::string label_cancel = "[ Cancel ]";
    27  call_t call_confirm = nullptr;
    28  bool cancelable = true;
    29  int button_offset_x = 0, button_offset_y = 0;
    30  constexpr static int text_offset_x = 2;
    31  constexpr static int text_offset_y = 2;
    32 };
    33 
    34 #endif // VIEW_PROMT_H
    +
    Definition: view.h:19
    + diff --git a/docs/html/view__selection_8cpp_source.html b/docs/html/view__selection_8cpp_source.html index 4a45641..bd16c53 100644 --- a/docs/html/view__selection_8cpp_source.html +++ b/docs/html/view__selection_8cpp_source.html @@ -70,10 +70,10 @@ $(function() {
    view_selection.cpp
    -
    1 #include "view_selection.h"
    2 
    3 void ViewSelection::draw()
    4 {
    5  //curs_set(0); // hide cursor
    6  for(size_t i = 0; i < choices.size(); i++)
    7  {
    8  if(selection == i)
    9  wattron(win, A_REVERSE);
    10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
    11  if(selection == i)
    12  wattroff(win, A_REVERSE);
    13  }
    14 }
    15 
    16 void ViewSelection::addChoice(std::string name, call_t call)
    17 {
    18  choices.push_back(name);
    19  calls.push_back(call);
    20 }
    21 
    22 call_t ViewSelection::keypress(int& key)
    23 {
    24  call_t ret = nullptr;
    25  switch(key)
    26  {
    27  case KEY_UP:
    28  do
    29  selection = (selection - 1 + choices.size()) % choices.size();
    30  while(!choices[selection].length() && choices.size());
    31  break;
    32 
    33  case '\t':
    34  case KEY_DOWN:
    35  do
    36  selection = (selection + 1) % choices.size();
    37  while(!choices[selection].length() && choices.size());
    38  break;
    39 
    40  case KEY_MOUSE:
    41  {
    42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    43  MEVENT event;
    44  bool hit = false;
    45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    46  {
    47  size_t column_start = start_x + choice_offset_x;
    48  size_t row_start = start_y + choice_offset_y;
    49  size_t mouse_x = event.x, mouse_y = event.y;
    50  for(size_t i = 0; i < choices.size(); i++)
    51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
    52  {
    53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
    54  hit = true;
    55  selection = i;
    56  }
    57  }
    58  if(!hit)
    59  break;
    60 
    61  // fall through to next case
    62  [[fallthrough]];
    63  }
    64 
    65  case KEY_ENT:
    66  if(selection == choices.size() - 1) // exit
    67  key = -1; // do return from view
    68  else
    69  ret = calls[selection];
    70  break;
    71  default:
    72  break;
    73  }
    74  repaint();
    75  return ret;
    76 }
    +
    1 #include "view_selection.h"
    2 
    3 void ViewSelection::draw()
    4 {
    5  //curs_set(0); // hide cursor
    6  for(size_t i = 0; i < choices.size(); i++)
    7  {
    8  if(selection == i)
    9  wattron(win, A_REVERSE);
    10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
    11  if(selection == i)
    12  wattroff(win, A_REVERSE);
    13  }
    14 }
    15 
    16 void ViewSelection::addChoice(std::string name, call_t call)
    17 {
    18  choices.push_back(name);
    19  calls.push_back(call);
    20 }
    21 
    22 call_t ViewSelection::keypress(int& key)
    23 {
    24  call_t ret = nullptr;
    25  switch(key)
    26  {
    27  case KEY_UP:
    28  do
    29  selection = (selection - 1 + choices.size()) % choices.size();
    30  while(!choices[selection].length() && choices.size());
    31  break;
    32 
    33  case '\t':
    34  case KEY_DOWN:
    35  do
    36  selection = (selection + 1) % choices.size();
    37  while(!choices[selection].length() && choices.size());
    38  break;
    39 
    40  case KEY_MOUSE:
    41  {
    42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    43  MEVENT event;
    44  bool hit = false;
    45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    46  {
    47  size_t column_start = start_x + choice_offset_x;
    48  size_t row_start = start_y + choice_offset_y;
    49  size_t mouse_x = event.x, mouse_y = event.y;
    50  for(size_t i = 0; i < choices.size(); i++)
    51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
    52  {
    53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
    54  hit = true;
    55  selection = i;
    56  }
    57  }
    58  if(!hit)
    59  break;
    60 
    61  // fall through to next case
    62  [[fallthrough]];
    63  }
    64 
    65  case KEY_ENT:
    66  if(selection == choices.size() - 1) // exit
    67  key = -1; // do return from view
    68  else
    69  ret = calls[selection];
    70  break;
    71  default:
    72  break;
    73  }
    74  repaint();
    75  return ret;
    76 }
    diff --git a/docs/html/view__selection_8h_source.html b/docs/html/view__selection_8h_source.html index 9cfd46e..ece3b9c 100644 --- a/docs/html/view__selection_8h_source.html +++ b/docs/html/view__selection_8h_source.html @@ -70,12 +70,12 @@ $(function() {
    view_selection.h
    -
    1 #ifndef VIEW_SELECTION_H
    2 #define VIEW_SELECTION_H
    3 
    4 #include <vector>
    5 #include <string>
    6 #include "view.h"
    7 
    8 class ViewSelection : public View
    9 {
    10 public:
    11  virtual void draw(void) override;
    12  virtual void addChoice(std::string name, call_t call);
    13  virtual call_t keypress(int& key) override;
    14 
    15 
    16 protected:
    17  size_t selection = 0;
    18  std::vector<std::string> choices;
    19 
    20  constexpr static int choice_offset_x = 2;
    21  constexpr static int choice_offset_y = 3;
    22 };
    23 
    24 #endif // VIEW_SELECTION_H
    -
    Definition: view.h:17
    - +
    1 #ifndef VIEW_SELECTION_H
    2 #define VIEW_SELECTION_H
    3 
    4 #include <vector>
    5 #include <string>
    6 #include "view.h"
    7 
    10 class ViewSelection : public View
    11 {
    12 public:
    13  virtual void draw(void) override;
    14  virtual void addChoice(std::string name, call_t call);
    15  virtual call_t keypress(int& key) override;
    16 
    17 
    18 protected:
    19  size_t selection = 0;
    20  std::vector<std::string> choices;
    21 
    22  constexpr static int choice_offset_x = 2;
    23  constexpr static int choice_offset_y = 3;
    24 };
    25 
    26 #endif // VIEW_SELECTION_H
    +
    Definition: view.h:19
    + diff --git a/docs/index.html b/docs/index.html index 1324b98..f4f7ec6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,14 +2,14 @@ - + Page Redirection - If you are not redirected automatically, follow this link to example. + If you are not redirected automatically, follow this link to example. From 1f53117577988ee9131fa9a0c99c668123dc3e1b Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Tue, 28 May 2019 11:12:58 +0200 Subject: [PATCH 05/35] pwm in MCU added --- firmware/Makefile | 2 +- firmware/MakefileWindoofs | 36 ------------------------------------ firmware/main.cpp | 3 +-- firmware/pwm.cpp | 18 ++++++++++++++++++ firmware/pwm.h | 13 +++++++++++++ firmware/requests.cpp | 10 ++++++++++ firmware/requests.h | 6 +++++- 7 files changed, 48 insertions(+), 40 deletions(-) delete mode 100644 firmware/MakefileWindoofs create mode 100644 firmware/pwm.cpp create mode 100644 firmware/pwm.h diff --git a/firmware/Makefile b/firmware/Makefile index 15d169e..b4a8479 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -21,7 +21,7 @@ HEX = b15f.hex MCU = atmega1284p CFLAGS = -Wall -Wextra -std=c++14 -O3 -mmcu=$(MCU) -DF_CPU=$(F_CPU) $(DEBUG) LDFLAGS = -OBJECTS = main.o spi.o mcp23s17.o tlc5615.o adu.o selftest.o global_vars.o usart.o requests.o interrupts.o +OBJECTS = main.o spi.o mcp23s17.o tlc5615.o adu.o selftest.o global_vars.o usart.o requests.o interrupts.o pwm.o COMPILE = $(COMPILER_PATH) $(CFLAGS) diff --git a/firmware/MakefileWindoofs b/firmware/MakefileWindoofs deleted file mode 100644 index 7846f59..0000000 --- a/firmware/MakefileWindoofs +++ /dev/null @@ -1,36 +0,0 @@ -# Name: Makefile -# Project: B15F (board15 Famulus Edition) -# Author: Tristan Krause -# Creation Date: 2019-03-22 - -# Umgebungseinstellungen -COMPILER_PATH = C:\avr8-gnu-toolchain-win32_x86\bin\avr-g++.exe -OBJCOPY_PATH = C:\avr8-gnu-toolchain-win32_x86\bin\avr-objcopy.exe - - -OUTPUT = B15F.elf -HEX = B15F.hex -CFLAGS = -Wall -Wextra -std=c++14 -O3 -mmcu=atmega1284 -DF_CPU=20000000 -LDFLAGS = -OBJECTS = main.o spi.o mcp23s17.o tlc5615.o adu.o selftest.o global_vars.o usart.o requests.o - - -COMPILE = $(COMPILER_PATH) $(CFLAGS) - -B15F: $(OBJECTS) - @echo "Linking..." - $(COMPILE) $(OBJECTS) -o $(OUTPUT) $(LDFLAGS) - - $(OBJCOPY_PATH) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $(OUTPUT) $(HEX) - -help: - @echo "This Makefile has the following rules:" - @echo "make B15F .... to compile (default)" - @echo "make clean ... to delete objects, elf and hex file" - -clean: - @echo "Cleaning..." - rm -f $(OBJECTS) $(OUTPUT) $(HEX) - -.cpp.o: - $(COMPILE) -c $< -o $@ diff --git a/firmware/main.cpp b/firmware/main.cpp index 6d9c5be..59cd64b 100644 --- a/firmware/main.cpp +++ b/firmware/main.cpp @@ -6,6 +6,7 @@ #include "selftest.h" #include "requests.h" + int main() { // deactivate WDT ENTIRELY! @@ -28,8 +29,6 @@ int main() usart.init(); usart.initRX(); - - // Hauptschleife, Verarbeitung der Requests while(1) { diff --git a/firmware/pwm.cpp b/firmware/pwm.cpp new file mode 100644 index 0000000..0716236 --- /dev/null +++ b/firmware/pwm.cpp @@ -0,0 +1,18 @@ +#include "pwm.h" + +void pwmSetFrequency(uint32_t freq) +{ + TCCR0A = _BV(COM0B1) | _BV(WGM00) | _BV(WGM01); + DDRB |= _BV(PB4); + + uint16_t p_ideal = ceil(float(F_CPU) / (freq * 0x100)); + for(int8_t i = PWM_PRESCALER_COUNT - 1; i >= 0 && PWM_PRESCALERS[i] >= p_ideal; i--) + TCCR0B = _BV(WGM02) | i; // set prescaler + if(p_ideal) + OCR0A = (uint8_t) (float(F_CPU) / (freq * PWM_PRESCALERS[TCCR0B & 0x07])); +} + +void pwmSetValue(uint8_t value) +{ + OCR0B = value; +} diff --git a/firmware/pwm.h b/firmware/pwm.h new file mode 100644 index 0000000..a42e11b --- /dev/null +++ b/firmware/pwm.h @@ -0,0 +1,13 @@ +#ifndef PWM_H +#define PWM_H + +#include +#include + +const uint16_t PWM_PRESCALERS[] = {0, 1, 8, 64, 256, 1024}; +const uint8_t PWM_PRESCALER_COUNT = sizeof(PWM_PRESCALERS) / sizeof(uint16_t); + +void pwmSetFrequency(uint32_t); +void pwmSetValue(uint8_t); + +#endif // PWM_H diff --git a/firmware/requests.cpp b/firmware/requests.cpp index a44eb73..0d11d3f 100644 --- a/firmware/requests.cpp +++ b/firmware/requests.cpp @@ -216,3 +216,13 @@ void rqAdcDacStroke() usart.writeByte(USART::MSG_OK); usart.flush(); } + +void rqSetPwm() +{ + usart.initTX(); + uint16_t value = usart.readByte(); + OCR0A = value; + + usart.writeByte(USART::MSG_OK); + usart.flush(); +} diff --git a/firmware/requests.h b/firmware/requests.h index 3910388..6fd3012 100644 --- a/firmware/requests.h +++ b/firmware/requests.h @@ -5,6 +5,7 @@ #include "global_vars.h" #include "selftest.h" #include "boardinfo.h" +#include "pwm.h" constexpr static uint8_t RQ_DISC = 0; constexpr static uint8_t RQ_TEST = 1; @@ -20,6 +21,7 @@ constexpr static uint8_t RQ_AA0 = 10; constexpr static uint8_t RQ_AA1 = 11; constexpr static uint8_t RQ_ADC = 12; constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; +constexpr static uint8_t RQ_SET_PWM = 14; uint8_t const rq_len[] = { /* RQ_DISC */ 1, @@ -35,7 +37,8 @@ uint8_t const rq_len[] = { /* RQ_AA0 */ 3, /* RQ_AA1 */ 3, /* RQ_ADC */ 2, - /* RQ_ADC_DAC_STROKE */ 9 + /* RQ_ADC_DAC_STROKE */ 9, + /* RQ_SET_PWM */ 2 }; /** @@ -58,5 +61,6 @@ void rqAnalogWrite0(void); void rqAnalogWrite1(void); void rqAnalogRead(void); void rqAdcDacStroke(void); +void rqSetPwm(void); #endif // REQUESTS_H From 2c47159df3dd33d3d1a423b902227b7bec26ac5a Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Tue, 28 May 2019 12:32:31 +0200 Subject: [PATCH 06/35] PWM ansteuerbar und TOP wird returned --- control/bin/b15fcli | Bin 0 -> 89776 bytes control/examples/pwm/Makefile | 30 +++++++ control/examples/pwm/main.cpp | 14 +++ control/src/drv/b15f.cpp | 41 +++++++++ control/src/drv/b15f.h | 18 ++++ control/src/drv/usart.cpp | 7 +- control/src/drv/usart.h | 9 +- docs/html/annotated.html | 2 +- docs/html/b15f_8cpp_source.html | 34 +++---- docs/html/b15f_8h_source.html | 32 +++---- docs/html/classB15F-members.html | 4 +- docs/html/classB15F.html | 85 ++++++++++++++++-- docs/html/classDot-members.html | 2 +- docs/html/classDot.html | 2 +- docs/html/classDriverException-members.html | 2 +- docs/html/classDriverException.html | 2 +- docs/html/classPlottyFile-members.html | 2 +- docs/html/classPlottyFile.html | 2 +- docs/html/classTimeoutException-members.html | 2 +- docs/html/classTimeoutException.html | 2 +- docs/html/classUSART-members.html | 3 +- docs/html/classUSART.html | 50 +++++++++-- docs/html/classUSARTException-members.html | 2 +- docs/html/classUSARTException.html | 2 +- docs/html/classView-members.html | 2 +- docs/html/classView.html | 2 +- docs/html/classViewInfo-members.html | 2 +- docs/html/classViewInfo.html | 2 +- docs/html/classViewMonitor-members.html | 2 +- docs/html/classViewMonitor.html | 2 +- docs/html/classViewPromt-members.html | 2 +- docs/html/classViewPromt.html | 2 +- docs/html/classViewSelection-members.html | 2 +- docs/html/classViewSelection.html | 2 +- docs/html/classes.html | 2 +- docs/html/cli_8cpp_source.html | 6 +- .../dir_1788f8309b1a812dcb800a185471cf6c.html | 2 +- .../dir_587c94d866dbb2f408f78cf41f9b2f8d.html | 2 +- docs/html/dot_8cpp_source.html | 2 +- docs/html/dot_8h_source.html | 2 +- docs/html/driverexception_8h_source.html | 2 +- docs/html/files.html | 2 +- docs/html/functions.html | 11 ++- docs/html/functions_func.html | 11 ++- docs/html/functions_vars.html | 2 +- docs/html/hierarchy.html | 2 +- docs/html/index.html | 2 +- docs/html/plottyfile_8cpp_source.html | 2 +- docs/html/plottyfile_8h_source.html | 2 +- docs/html/search/all_9.js | 4 +- docs/html/search/all_f.js | 3 +- docs/html/search/functions_7.js | 4 +- docs/html/search/functions_b.js | 3 +- docs/html/timeoutexception_8h_source.html | 2 +- docs/html/ui_8cpp_source.html | 8 +- docs/html/ui_8h_source.html | 2 +- docs/html/usart_8cpp_source.html | 17 ++-- docs/html/usart_8h_source.html | 17 ++-- docs/html/usartexception_8h_source.html | 2 +- docs/html/view_8cpp_source.html | 4 +- docs/html/view_8h_source.html | 2 +- docs/html/view__info_8cpp_source.html | 2 +- docs/html/view__info_8h_source.html | 2 +- docs/html/view__monitor_8cpp_source.html | 8 +- docs/html/view__monitor_8h_source.html | 2 +- docs/html/view__promt_8cpp_source.html | 2 +- docs/html/view__promt_8h_source.html | 2 +- docs/html/view__selection_8cpp_source.html | 2 +- docs/html/view__selection_8h_source.html | 2 +- firmware/global_vars.cpp | 1 + firmware/global_vars.h | 2 + firmware/main.cpp | 2 + firmware/pwm.cpp | 30 +++++-- firmware/pwm.h | 17 ++-- firmware/requests.cpp | 22 ++++- firmware/requests.h | 9 +- firmware/usart.cpp | 7 ++ firmware/usart.h | 6 ++ 78 files changed, 459 insertions(+), 148 deletions(-) create mode 100755 control/bin/b15fcli create mode 100644 control/examples/pwm/Makefile create mode 100644 control/examples/pwm/main.cpp diff --git a/control/bin/b15fcli b/control/bin/b15fcli new file mode 100755 index 0000000000000000000000000000000000000000..864a09cf34677967f19d0897dcce89ccb8ca853f GIT binary patch literal 89776 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 +#include +#include +#include + +const char PLOT_FILE[] = "plot.bin"; + +int main() +{ + + B15F& drv = B15F::getInstance(); + std::cout << "TOP: " << (int) drv.pwmSetFrequency(100000) << std::endl; + drv.pwmSetValue(40); +} diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index 0204cc6..56cb2ed 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -289,6 +289,47 @@ void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset delay_us(10); } +uint8_t B15F::pwmSetFrequency(uint32_t freq) +{ + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_PWM_SET_FREQ, + static_cast((freq >> 0) & 0xFF), + static_cast((freq >> 8) & 0xFF), + static_cast((freq >> 16) & 0xFF), + static_cast((freq >> 24) & 0xFF) + }; + + int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000); + if(n_sent != sizeof(rq)) + abort("Sent failed"); + + uint8_t byte = usart.readByte(); + delay_us(10); + return byte; +} + +bool B15F::pwmSetValue(uint8_t value) +{ + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_PWM_SET_VALUE, + value + }; + + int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000); + if(n_sent != sizeof(rq)) + abort("Sent failed"); + + uint8_t aw = usart.readByte(); + delay_us(10); + return aw == MSG_OK; +} + void B15F::delay_ms(uint16_t ms) { std::this_thread::sleep_for(std::chrono::milliseconds(ms)); diff --git a/control/src/drv/b15f.h b/control/src/drv/b15f.h index 88172ba..1b011ea 100644 --- a/control/src/drv/b15f.h +++ b/control/src/drv/b15f.h @@ -194,6 +194,22 @@ public: */ void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count); + /** + * Setzt die Register so, dass näherungsweise die gewünschte Frequenz erzeugt wird. + * Ist freq == 0 wird PWM deaktiviert. + * \param freq PWM Frequenz + * \return Top Wert des PWM Value für die gesetzte Frequenz + * \throws DriverException + */ + uint8_t pwmSetFrequency(uint32_t freq); + + /** + * Setzt den PWM Wert. + * \param value PWM Wert [0..0xFF] + * \throws DriverException + */ + bool pwmSetValue(uint8_t value); + /*************************/ @@ -233,6 +249,8 @@ private: constexpr static uint8_t RQ_AA1 = 11; constexpr static uint8_t RQ_ADC = 12; constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; + constexpr static uint8_t RQ_PWM_SET_FREQ = 14; + constexpr static uint8_t RQ_PWM_SET_VALUE = 15; }; #endif // B15F_H diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index dcc7dd9..0717d41 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -85,7 +85,12 @@ void USART::writeInt(uint16_t d) throw USARTException("Fehler beim Senden: writeInt()"); } - +void USART::writeU32(uint32_t w) +{ + int sent = write(file_desc, reinterpret_cast(&w), 4); + if(sent != 4) + throw USARTException("Fehler beim Senden: writeU32()"); +} int USART::read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout) { diff --git a/control/src/drv/usart.h b/control/src/drv/usart.h index de2719f..762bed6 100644 --- a/control/src/drv/usart.h +++ b/control/src/drv/usart.h @@ -76,11 +76,18 @@ public: /** * Sendet ein Integer über die USART Schnittstelle - * \param b das zu sendende Byte + * \param b das zu sendende Int * \throws USARTException */ void writeInt(uint16_t d); + /** + * Sendet ein uint32_t über die USART Schnittstelle + * \param b das zu sendende uint32_t + * \throws USARTException + */ + void writeU32(uint32_t d); + /** * Empfängt ein Byte über die USART Schnittstelle * \throws USARTException diff --git a/docs/html/annotated.html b/docs/html/annotated.html index e8fa8b6..709b184 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -85,7 +85,7 @@ $(function() { diff --git a/docs/html/b15f_8cpp_source.html b/docs/html/b15f_8cpp_source.html index 5efca6f..dd5733f 100644 --- a/docs/html/b15f_8cpp_source.html +++ b/docs/html/b15f_8cpp_source.html @@ -70,46 +70,48 @@ $(function() {
    b15f.cpp
    -
    1 #include "b15f.h"
    2 
    3 B15F* B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos)
    16  device.pop_back();
    17 
    18  if(device.length() == 0)
    19  abort("Adapter nicht gefunden");
    20 
    21  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    22 
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31 
    32  std::cout << PRE << "Teste Verbindung... " << std::flush;
    33  uint8_t tries = 3;
    34  while(tries--)
    35  {
    36  // verwerfe Daten, die µC noch hat
    37  //discard();
    38 
    39  if(!testConnection())
    40  continue;
    41 
    42  if(!testIntConv())
    43  continue;
    44 
    45  break;
    46  }
    47  if(tries == 0)
    48  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    49  std::cout << "OK" << std::endl;
    50 
    51 
    52  // Gib board info aus
    53  std::vector<std::string> info = getBoardInfo();
    54  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while(tries--)
    61  {
    63  discard();
    64 
    65  if(testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  usart.clearOutputBuffer();
    77  for(uint8_t i = 0; i < 16; i++)
    78  {
    79  usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input)
    80  delay_ms(4);
    81  }
    82  usart.clearInputBuffer();
    83  }
    84  catch(std::exception& ex)
    85  {
    86  abort(ex);
    87  }
    88 }
    89 
    91 {
    92  // erzeuge zufälliges Byte
    93  srand(time(NULL));
    94  uint8_t dummy = rand() % 256;
    95 
    96  usart.writeByte(RQ_TEST);
    97  usart.writeByte(dummy);
    98 
    99  uint8_t aw = usart.readByte();
    100  uint8_t mirror = usart.readByte();
    101 
    102  return aw == MSG_OK && mirror == dummy;
    103 }
    104 
    106 {
    107  srand(time(NULL));
    108  uint16_t dummy = rand() % (0xFFFF / 3);
    109 
    110  usart.writeByte(RQ_INT);
    111  usart.writeInt(dummy);
    112 
    113  uint16_t aw = usart.readInt();
    114  return aw == dummy * 3;
    115 }
    116 
    117 
    118 std::vector<std::string> B15F::getBoardInfo(void)
    119 {
    120  std::vector<std::string> info;
    121 
    122  usart.writeByte(RQ_INFO);
    123 
    124  uint8_t n = usart.readByte();
    125  while(n--)
    126  {
    127  uint8_t len = usart.readByte();
    128  std::string str;
    129 
    130  while(len--)
    131  {
    132  str += static_cast<char>(usart.readByte());
    133  }
    134 
    135  info.push_back(str);
    136  }
    137 
    138  uint8_t aw = usart.readByte();
    139  if(aw != MSG_OK)
    140  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    141 
    142  return info;
    143 }
    144 
    146 {
    147  usart.writeByte(RQ_ST);
    148 
    149  uint8_t aw = usart.readByte();
    150  return aw == MSG_OK;
    151 }
    152 
    153 bool B15F::digitalWrite0(uint8_t port)
    154 {
    155  usart.writeByte(RQ_BA0);
    156  usart.writeByte(port);
    157 
    158  uint8_t aw = usart.readByte();
    159  delay_us(10);
    160  return aw == MSG_OK;
    161 }
    162 
    163 bool B15F::digitalWrite1(uint8_t port)
    164 {
    165  usart.writeByte(RQ_BA1);
    166  usart.writeByte(port);
    167 
    168  uint8_t aw = usart.readByte();
    169  delay_us(10);
    170  return aw == MSG_OK;
    171 }
    172 
    174 {
    175  usart.clearInputBuffer();
    176  usart.writeByte(RQ_BE0);
    177  uint8_t byte = usart.readByte();
    178  delay_us(10);
    179  return byte;
    180 }
    181 
    183 {
    184  usart.clearInputBuffer();
    185  usart.writeByte(RQ_BE1);
    186  uint8_t byte = usart.readByte();
    187  delay_us(10);
    188  return byte;
    189 }
    190 
    192 {
    193  usart.clearInputBuffer();
    194  usart.writeByte(RQ_DSW);
    195  uint8_t byte = usart.readByte();
    196  delay_us(10);
    197  return byte;
    198 }
    199 
    200 bool B15F::analogWrite0(uint16_t value)
    201 {
    202  usart.writeByte(RQ_AA0);
    203  usart.writeInt(value);
    204 
    205  uint8_t aw = usart.readByte();
    206  delay_us(10);
    207  return aw == MSG_OK;
    208 }
    209 
    210 bool B15F::analogWrite1(uint16_t value)
    211 {
    212  usart.writeByte(RQ_AA1);
    213  usart.writeInt(value);
    214 
    215  uint8_t aw = usart.readByte();
    216  delay_us(10);
    217  return aw == MSG_OK;
    218 }
    219 
    220 uint16_t B15F::analogRead(uint8_t channel)
    221 {
    222  usart.clearInputBuffer();
    223  if(channel > 7)
    224  abort("Bad ADC channel: " + std::to_string(channel));
    225 
    226  uint8_t rq[] =
    227  {
    228  RQ_ADC,
    229  channel
    230  };
    231 
    232  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    233  if(n_sent != sizeof(rq))
    234  abort("Sent failed");
    235 
    236  uint16_t adc = usart.readInt();
    237 
    238  if(adc > 1023)
    239  abort("Bad ADC data detected (1)");
    240  return adc;
    241 }
    242 
    243 void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    244 {
    245  // check pointers
    246  buffer_a += offset_a;
    247  buffer_b += offset_b;
    248 
    249 
    250  usart.clearInputBuffer();
    251  usart.writeByte(RQ_ADC_DAC_STROKE);
    252  usart.writeByte(channel_a);
    253  usart.writeByte(channel_b);
    254  usart.writeInt(start);
    255  usart.writeInt(static_cast<uint16_t>(delta));
    256  usart.writeInt(count);
    257 
    258  for(uint16_t i = 0; i < count; i++)
    259  {
    260  if(buffer_a)
    261  {
    262  buffer_a[i] = usart.readInt();
    263 
    264  if(buffer_a[i] > 1023) // check for broken usart connection
    265  abort("Bad ADC data detected (2)");
    266  }
    267  else
    268  {
    269  usart.readInt();
    270  }
    271 
    272  if(buffer_b)
    273  {
    274  buffer_b[i] = usart.readInt();
    275 
    276  if(buffer_b[i] > 1023) // check for broken usart connection
    277  abort("Bad ADC data detected (3)");
    278  }
    279  else
    280  {
    281  usart.readInt();
    282  }
    283  }
    284 
    285  uint8_t aw = usart.readByte();
    286  if(aw != MSG_OK)
    287  abort("Sequenz unterbrochen");
    288 
    289  delay_us(10);
    290 }
    291 
    292 void B15F::delay_ms(uint16_t ms)
    293 {
    294  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    295 }
    296 
    297 void B15F::delay_us(uint16_t us)
    298 {
    299  std::this_thread::sleep_for(std::chrono::microseconds(us));
    300 }
    301 
    303 {
    304  if(!instance)
    305  instance = new B15F();
    306 
    307  return *instance;
    308 }
    309 
    310 // https://stackoverflow.com/a/478960
    311 std::string B15F::exec(std::string cmd)
    312 {
    313  std::array<char, 128> buffer;
    314  std::string result;
    315  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    316  if (!pipe)
    317  {
    318  throw std::runtime_error("popen() failed!");
    319  }
    320  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    321  {
    322  result += buffer.data();
    323  }
    324  return result;
    325 }
    326 
    327 void B15F::abort(std::string msg)
    328 {
    329  DriverException ex(msg);
    330  abort(ex);
    331 }
    332 void B15F::abort(std::exception& ex)
    333 {
    334  if(errorhandler)
    335  errorhandler(ex);
    336  else
    337  {
    338  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    339  std::cout << ex.what() << std::endl;
    340  throw DriverException(ex.what());
    341  }
    342 }
    343 
    344 void B15F::setAbortHandler(errorhandler_t func)
    345 {
    346  errorhandler = func;
    347 }
    -
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:311
    -
    uint8_t readByte(void)
    Definition: usart.cpp:211
    -
    void delay_us(uint16_t us)
    Definition: b15f.cpp:297
    +
    1 #include "b15f.h"
    2 
    3 B15F* B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos)
    16  device.pop_back();
    17 
    18  if(device.length() == 0)
    19  abort("Adapter nicht gefunden");
    20 
    21  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    22 
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31 
    32  std::cout << PRE << "Teste Verbindung... " << std::flush;
    33  uint8_t tries = 3;
    34  while(tries--)
    35  {
    36  // verwerfe Daten, die µC noch hat
    37  //discard();
    38 
    39  if(!testConnection())
    40  continue;
    41 
    42  if(!testIntConv())
    43  continue;
    44 
    45  break;
    46  }
    47  if(tries == 0)
    48  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    49  std::cout << "OK" << std::endl;
    50 
    51 
    52  // Gib board info aus
    53  std::vector<std::string> info = getBoardInfo();
    54  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while(tries--)
    61  {
    63  discard();
    64 
    65  if(testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  usart.clearOutputBuffer();
    77  for(uint8_t i = 0; i < 16; i++)
    78  {
    79  usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input)
    80  delay_ms(4);
    81  }
    82  usart.clearInputBuffer();
    83  }
    84  catch(std::exception& ex)
    85  {
    86  abort(ex);
    87  }
    88 }
    89 
    91 {
    92  // erzeuge zufälliges Byte
    93  srand(time(NULL));
    94  uint8_t dummy = rand() % 256;
    95 
    96  usart.writeByte(RQ_TEST);
    97  usart.writeByte(dummy);
    98 
    99  uint8_t aw = usart.readByte();
    100  uint8_t mirror = usart.readByte();
    101 
    102  return aw == MSG_OK && mirror == dummy;
    103 }
    104 
    106 {
    107  srand(time(NULL));
    108  uint16_t dummy = rand() % (0xFFFF / 3);
    109 
    110  usart.writeByte(RQ_INT);
    111  usart.writeInt(dummy);
    112 
    113  uint16_t aw = usart.readInt();
    114  return aw == dummy * 3;
    115 }
    116 
    117 
    118 std::vector<std::string> B15F::getBoardInfo(void)
    119 {
    120  std::vector<std::string> info;
    121 
    122  usart.writeByte(RQ_INFO);
    123 
    124  uint8_t n = usart.readByte();
    125  while(n--)
    126  {
    127  uint8_t len = usart.readByte();
    128  std::string str;
    129 
    130  while(len--)
    131  {
    132  str += static_cast<char>(usart.readByte());
    133  }
    134 
    135  info.push_back(str);
    136  }
    137 
    138  uint8_t aw = usart.readByte();
    139  if(aw != MSG_OK)
    140  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    141 
    142  return info;
    143 }
    144 
    146 {
    147  usart.writeByte(RQ_ST);
    148 
    149  uint8_t aw = usart.readByte();
    150  return aw == MSG_OK;
    151 }
    152 
    153 bool B15F::digitalWrite0(uint8_t port)
    154 {
    155  usart.writeByte(RQ_BA0);
    156  usart.writeByte(port);
    157 
    158  uint8_t aw = usart.readByte();
    159  delay_us(10);
    160  return aw == MSG_OK;
    161 }
    162 
    163 bool B15F::digitalWrite1(uint8_t port)
    164 {
    165  usart.writeByte(RQ_BA1);
    166  usart.writeByte(port);
    167 
    168  uint8_t aw = usart.readByte();
    169  delay_us(10);
    170  return aw == MSG_OK;
    171 }
    172 
    174 {
    175  usart.clearInputBuffer();
    176  usart.writeByte(RQ_BE0);
    177  uint8_t byte = usart.readByte();
    178  delay_us(10);
    179  return byte;
    180 }
    181 
    183 {
    184  usart.clearInputBuffer();
    185  usart.writeByte(RQ_BE1);
    186  uint8_t byte = usart.readByte();
    187  delay_us(10);
    188  return byte;
    189 }
    190 
    192 {
    193  usart.clearInputBuffer();
    194  usart.writeByte(RQ_DSW);
    195  uint8_t byte = usart.readByte();
    196  delay_us(10);
    197  return byte;
    198 }
    199 
    200 bool B15F::analogWrite0(uint16_t value)
    201 {
    202  usart.writeByte(RQ_AA0);
    203  usart.writeInt(value);
    204 
    205  uint8_t aw = usart.readByte();
    206  delay_us(10);
    207  return aw == MSG_OK;
    208 }
    209 
    210 bool B15F::analogWrite1(uint16_t value)
    211 {
    212  usart.writeByte(RQ_AA1);
    213  usart.writeInt(value);
    214 
    215  uint8_t aw = usart.readByte();
    216  delay_us(10);
    217  return aw == MSG_OK;
    218 }
    219 
    220 uint16_t B15F::analogRead(uint8_t channel)
    221 {
    222  usart.clearInputBuffer();
    223  if(channel > 7)
    224  abort("Bad ADC channel: " + std::to_string(channel));
    225 
    226  uint8_t rq[] =
    227  {
    228  RQ_ADC,
    229  channel
    230  };
    231 
    232  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    233  if(n_sent != sizeof(rq))
    234  abort("Sent failed");
    235 
    236  uint16_t adc = usart.readInt();
    237 
    238  if(adc > 1023)
    239  abort("Bad ADC data detected (1)");
    240  return adc;
    241 }
    242 
    243 void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    244 {
    245  // check pointers
    246  buffer_a += offset_a;
    247  buffer_b += offset_b;
    248 
    249 
    250  usart.clearInputBuffer();
    251  usart.writeByte(RQ_ADC_DAC_STROKE);
    252  usart.writeByte(channel_a);
    253  usart.writeByte(channel_b);
    254  usart.writeInt(start);
    255  usart.writeInt(static_cast<uint16_t>(delta));
    256  usart.writeInt(count);
    257 
    258  for(uint16_t i = 0; i < count; i++)
    259  {
    260  if(buffer_a)
    261  {
    262  buffer_a[i] = usart.readInt();
    263 
    264  if(buffer_a[i] > 1023) // check for broken usart connection
    265  abort("Bad ADC data detected (2)");
    266  }
    267  else
    268  {
    269  usart.readInt();
    270  }
    271 
    272  if(buffer_b)
    273  {
    274  buffer_b[i] = usart.readInt();
    275 
    276  if(buffer_b[i] > 1023) // check for broken usart connection
    277  abort("Bad ADC data detected (3)");
    278  }
    279  else
    280  {
    281  usart.readInt();
    282  }
    283  }
    284 
    285  uint8_t aw = usart.readByte();
    286  if(aw != MSG_OK)
    287  abort("Sequenz unterbrochen");
    288 
    289  delay_us(10);
    290 }
    291 
    292 uint8_t B15F::pwmSetFrequency(uint32_t freq)
    293 {
    294  usart.clearInputBuffer();
    295 
    296  uint8_t rq[] =
    297  {
    298  RQ_PWM_SET_FREQ,
    299  static_cast<uint8_t>((freq >> 0) & 0xFF),
    300  static_cast<uint8_t>((freq >> 8) & 0xFF),
    301  static_cast<uint8_t>((freq >> 16) & 0xFF),
    302  static_cast<uint8_t>((freq >> 24) & 0xFF)
    303  };
    304 
    305  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    306  if(n_sent != sizeof(rq))
    307  abort("Sent failed");
    308 
    309  uint8_t byte = usart.readByte();
    310  delay_us(10);
    311  return byte;
    312 }
    313 
    314 bool B15F::pwmSetValue(uint8_t value)
    315 {
    316  usart.clearInputBuffer();
    317 
    318  uint8_t rq[] =
    319  {
    320  RQ_PWM_SET_VALUE,
    321  value
    322  };
    323 
    324  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    325  if(n_sent != sizeof(rq))
    326  abort("Sent failed");
    327 
    328  uint8_t aw = usart.readByte();
    329  delay_us(10);
    330  return aw == MSG_OK;
    331 }
    332 
    333 void B15F::delay_ms(uint16_t ms)
    334 {
    335  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    336 }
    337 
    338 void B15F::delay_us(uint16_t us)
    339 {
    340  std::this_thread::sleep_for(std::chrono::microseconds(us));
    341 }
    342 
    344 {
    345  if(!instance)
    346  instance = new B15F();
    347 
    348  return *instance;
    349 }
    350 
    351 // https://stackoverflow.com/a/478960
    352 std::string B15F::exec(std::string cmd)
    353 {
    354  std::array<char, 128> buffer;
    355  std::string result;
    356  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    357  if (!pipe)
    358  {
    359  throw std::runtime_error("popen() failed!");
    360  }
    361  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    362  {
    363  result += buffer.data();
    364  }
    365  return result;
    366 }
    367 
    368 void B15F::abort(std::string msg)
    369 {
    370  DriverException ex(msg);
    371  abort(ex);
    372 }
    373 void B15F::abort(std::exception& ex)
    374 {
    375  if(errorhandler)
    376  errorhandler(ex);
    377  else
    378  {
    379  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    380  std::cout << ex.what() << std::endl;
    381  throw DriverException(ex.what());
    382  }
    383 }
    384 
    385 void B15F::setAbortHandler(errorhandler_t func)
    386 {
    387  errorhandler = func;
    388 }
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:352
    +
    uint8_t readByte(void)
    Definition: usart.cpp:216
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:338
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    +
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:292
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:243
    bool testConnection(void)
    Definition: b15f.cpp:90
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:292
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:302
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:333
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:343
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:327
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:368
    void clearInputBuffer(void)
    Definition: usart.cpp:39
    void clearOutputBuffer(void)
    Definition: usart.cpp:46
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    -
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:199
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:317
    +
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:215
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:322
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:118
    -
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:202
    +
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:218
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    void writeByte(uint8_t b)
    Definition: usart.cpp:67
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    +
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:314
    void discard(void)
    Definition: b15f.cpp:72
    -
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:200
    +
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:216
    void openDevice(std::string device)
    Definition: usart.cpp:3
    -
    uint16_t readInt(void)
    Definition: usart.cpp:230
    +
    uint16_t readInt(void)
    Definition: usart.cpp:235
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    void reconnect(void)
    Definition: b15f.cpp:57
    -
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:205
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:344
    +
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:221
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:385
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    -
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:204
    +
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:220
    void writeInt(uint16_t d)
    Definition: usart.cpp:81
    bool testIntConv(void)
    Definition: b15f.cpp:105
    diff --git a/docs/html/b15f_8h_source.html b/docs/html/b15f_8h_source.html index 0f9eff8..346c23c 100644 --- a/docs/html/b15f_8h_source.html +++ b/docs/html/b15f_8h_source.html @@ -70,40 +70,42 @@ $(function() {
    b15f.h
    -
    1 #ifndef B15F_H
    2 #define B15F_H
    3 
    4 #include <iostream>
    5 #include <bits/stdc++.h>
    6 #include <string>
    7 #include <fstream>
    8 #include <cstdlib>
    9 #include <chrono>
    10 #include <cstdint>
    11 #include <vector>
    12 
    13 #include <unistd.h>
    14 #include <fcntl.h>
    15 #include <sys/ioctl.h>
    16 #include <termios.h>
    17 #include "usart.h"
    18 #include "driverexception.h"
    19 #include "timeoutexception.h"
    20 
    21 typedef std::function<void(std::exception&)> errorhandler_t;
    22 
    23 
    26 class B15F
    27 {
    28 private:
    29  // privater Konstruktor
    30  B15F(void);
    31 public:
    32 
    33  /*************************************
    34  * Grundfunktionen des B15F Treibers *
    35  *************************************/
    36 
    41  void reconnect(void);
    42 
    47  void discard(void);
    48 
    53  bool testConnection(void);
    54 
    59  bool testIntConv(void);
    60 
    65  std::vector<std::string> getBoardInfo(void);
    66 
    71  void delay_ms(uint16_t ms);
    72 
    77  void delay_us(uint16_t us);
    78 
    83  static B15F& getInstance(void);
    84 
    89  static std::string exec(std::string cmd);
    90 
    95  static void abort(std::string msg);
    96 
    101  static void abort(std::exception& ex);
    102 
    107  static void setAbortHandler(errorhandler_t func);
    108 
    109  /*************************************/
    110 
    111 
    112 
    113  /*************************
    114  * Steuerbefehle für B15 *
    115  *************************/
    116 
    122  bool activateSelfTestMode(void);
    123 
    129  bool digitalWrite0(uint8_t);
    130 
    136  bool digitalWrite1(uint8_t);
    137 
    143  uint8_t digitalRead0(void);
    144 
    150  uint8_t digitalRead1(void);
    151 
    157  uint8_t readDipSwitch(void);
    158 
    164  bool analogWrite0(uint16_t port);
    165 
    171  bool analogWrite1(uint16_t port);
    172 
    178  uint16_t analogRead(uint8_t channel);
    179 
    195  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
    196 
    197  /*************************/
    198 
    199 
    200  // CONSTANTS
    201  const std::string PRE = "[B15F] ";
    202  constexpr static uint8_t MSG_OK = 0xFF;
    203  constexpr static uint8_t MSG_FAIL = 0xFE;
    204  constexpr static uint16_t RECONNECT_TIMEOUT = 64;
    205  constexpr static uint16_t WDT_TIMEOUT = 15;
    206  constexpr static uint8_t RECONNECT_TRIES = 3;
    207  constexpr static uint32_t BAUDRATE = 57600;
    208 
    209 private:
    210 
    215  void init(void);
    216 
    217  USART usart;
    218  static B15F* instance;
    219  static errorhandler_t errorhandler;
    220 
    221  // REQUESTS
    222  constexpr static uint8_t RQ_DISC = 0;
    223  constexpr static uint8_t RQ_TEST = 1;
    224  constexpr static uint8_t RQ_INFO = 2;
    225  constexpr static uint8_t RQ_INT = 3;
    226  constexpr static uint8_t RQ_ST = 4;
    227  constexpr static uint8_t RQ_BA0 = 5;
    228  constexpr static uint8_t RQ_BA1 = 6;
    229  constexpr static uint8_t RQ_BE0 = 7;
    230  constexpr static uint8_t RQ_BE1 = 8;
    231  constexpr static uint8_t RQ_DSW = 9;
    232  constexpr static uint8_t RQ_AA0 = 10;
    233  constexpr static uint8_t RQ_AA1 = 11;
    234  constexpr static uint8_t RQ_ADC = 12;
    235  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
    236 };
    237 
    238 #endif // B15F_H
    -
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:311
    -
    constexpr static uint8_t MSG_FAIL
    Value to reject a received command.
    Definition: b15f.h:201
    -
    void delay_us(uint16_t us)
    Definition: b15f.cpp:297
    +
    1 #ifndef B15F_H
    2 #define B15F_H
    3 
    4 #include <iostream>
    5 #include <bits/stdc++.h>
    6 #include <string>
    7 #include <fstream>
    8 #include <cstdlib>
    9 #include <chrono>
    10 #include <cstdint>
    11 #include <vector>
    12 
    13 #include <unistd.h>
    14 #include <fcntl.h>
    15 #include <sys/ioctl.h>
    16 #include <termios.h>
    17 #include "usart.h"
    18 #include "driverexception.h"
    19 #include "timeoutexception.h"
    20 
    21 typedef std::function<void(std::exception&)> errorhandler_t;
    22 
    23 
    26 class B15F
    27 {
    28 private:
    29  // privater Konstruktor
    30  B15F(void);
    31 public:
    32 
    33  /*************************************
    34  * Grundfunktionen des B15F Treibers *
    35  *************************************/
    36 
    41  void reconnect(void);
    42 
    47  void discard(void);
    48 
    53  bool testConnection(void);
    54 
    59  bool testIntConv(void);
    60 
    65  std::vector<std::string> getBoardInfo(void);
    66 
    71  void delay_ms(uint16_t ms);
    72 
    77  void delay_us(uint16_t us);
    78 
    83  static B15F& getInstance(void);
    84 
    89  static std::string exec(std::string cmd);
    90 
    95  static void abort(std::string msg);
    96 
    101  static void abort(std::exception& ex);
    102 
    107  static void setAbortHandler(errorhandler_t func);
    108 
    109  /*************************************/
    110 
    111 
    112 
    113  /*************************
    114  * Steuerbefehle für B15 *
    115  *************************/
    116 
    122  bool activateSelfTestMode(void);
    123 
    129  bool digitalWrite0(uint8_t);
    130 
    136  bool digitalWrite1(uint8_t);
    137 
    143  uint8_t digitalRead0(void);
    144 
    150  uint8_t digitalRead1(void);
    151 
    157  uint8_t readDipSwitch(void);
    158 
    164  bool analogWrite0(uint16_t port);
    165 
    171  bool analogWrite1(uint16_t port);
    172 
    178  uint16_t analogRead(uint8_t channel);
    179 
    195  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
    196 
    204  uint8_t pwmSetFrequency(uint32_t freq);
    205 
    211  bool pwmSetValue(uint8_t value);
    212 
    213  /*************************/
    214 
    215 
    216  // CONSTANTS
    217  const std::string PRE = "[B15F] ";
    218  constexpr static uint8_t MSG_OK = 0xFF;
    219  constexpr static uint8_t MSG_FAIL = 0xFE;
    220  constexpr static uint16_t RECONNECT_TIMEOUT = 64;
    221  constexpr static uint16_t WDT_TIMEOUT = 15;
    222  constexpr static uint8_t RECONNECT_TRIES = 3;
    223  constexpr static uint32_t BAUDRATE = 57600;
    224 
    225 private:
    226 
    231  void init(void);
    232 
    233  USART usart;
    234  static B15F* instance;
    235  static errorhandler_t errorhandler;
    236 
    237  // REQUESTS
    238  constexpr static uint8_t RQ_DISC = 0;
    239  constexpr static uint8_t RQ_TEST = 1;
    240  constexpr static uint8_t RQ_INFO = 2;
    241  constexpr static uint8_t RQ_INT = 3;
    242  constexpr static uint8_t RQ_ST = 4;
    243  constexpr static uint8_t RQ_BA0 = 5;
    244  constexpr static uint8_t RQ_BA1 = 6;
    245  constexpr static uint8_t RQ_BE0 = 7;
    246  constexpr static uint8_t RQ_BE1 = 8;
    247  constexpr static uint8_t RQ_DSW = 9;
    248  constexpr static uint8_t RQ_AA0 = 10;
    249  constexpr static uint8_t RQ_AA1 = 11;
    250  constexpr static uint8_t RQ_ADC = 12;
    251  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
    252  constexpr static uint8_t RQ_PWM_SET_FREQ = 14;
    253  constexpr static uint8_t RQ_PWM_SET_VALUE = 15;
    254 };
    255 
    256 #endif // B15F_H
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:352
    +
    constexpr static uint8_t MSG_FAIL
    Value to reject a received command.
    Definition: b15f.h:217
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:338
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    +
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:292
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:243
    bool testConnection(void)
    Definition: b15f.cpp:90
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:292
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:302
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:333
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:343
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:327
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:368
    Definition: usart.h:18
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    -
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:199
    +
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:215
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:118
    -
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:202
    +
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:218
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    +
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:314
    void discard(void)
    Definition: b15f.cpp:72
    -
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:200
    +
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:216
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    -
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:203
    +
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:219
    void reconnect(void)
    Definition: b15f.cpp:57
    -
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:205
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:344
    +
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:221
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:385
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    -
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:204
    +
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:220
    bool testIntConv(void)
    Definition: b15f.cpp:105
    diff --git a/docs/html/classB15F-members.html b/docs/html/classB15F-members.html index 1c32f74..119895f 100644 --- a/docs/html/classB15F-members.html +++ b/docs/html/classB15F-members.html @@ -90,6 +90,8 @@ $(function() { MSG_FAILB15Fstatic MSG_OKB15Fstatic PREB15F + pwmSetFrequency(uint32_t freq)B15F + pwmSetValue(uint8_t value)B15F readDipSwitch(void)B15F reconnect(void)B15F RECONNECT_TIMEOUTB15Fstatic @@ -101,7 +103,7 @@ $(function() { diff --git a/docs/html/classB15F.html b/docs/html/classB15F.html index 7271305..f22425d 100644 --- a/docs/html/classB15F.html +++ b/docs/html/classB15F.html @@ -111,6 +111,10 @@ Public Member Functions   void analogSequence (uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)   +uint8_t pwmSetFrequency (uint32_t freq) +  +bool pwmSetValue (uint8_t value) +  @@ -194,7 +198,7 @@ constexpr static uint32_t 

    Static Public Member Functions

    -

    Definition at line 332 of file b15f.cpp.

    +

    Definition at line 373 of file b15f.cpp.

    @@ -228,7 +232,7 @@ constexpr static uint32_t 
    -

    Definition at line 327 of file b15f.cpp.

    +

    Definition at line 368 of file b15f.cpp.

    @@ -468,7 +472,7 @@ constexpr static uint32_t 
    -

    Definition at line 292 of file b15f.cpp.

    +

    Definition at line 333 of file b15f.cpp.

    @@ -494,7 +498,7 @@ constexpr static uint32_t 
    -

    Definition at line 297 of file b15f.cpp.

    +

    Definition at line 338 of file b15f.cpp.

    @@ -672,7 +676,7 @@ constexpr static uint32_t 
    -

    Definition at line 311 of file b15f.cpp.

    +

    Definition at line 352 of file b15f.cpp.

    @@ -732,7 +736,72 @@ constexpr static uint32_t 
    -

    Definition at line 302 of file b15f.cpp.

    +

    Definition at line 343 of file b15f.cpp.

    + + + + +

    ◆ pwmSetFrequency()

    + +
    +
    + + + + + + + + +
    uint8_t B15F::pwmSetFrequency (uint32_t freq)
    +
    +

    Setzt die Register so, dass näherungsweise die gewünschte Frequenz erzeugt wird. Ist freq == 0 wird PWM deaktiviert.

    Parameters
    + + +
    freqPWM Frequenz
    +
    +
    +
    Returns
    Top Wert des PWM Value für die gesetzte Frequenz
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 292 of file b15f.cpp.

    + +
    +
    + +

    ◆ pwmSetValue()

    + +
    +
    + + + + + + + + +
    bool B15F::pwmSetValue (uint8_t value)
    +
    +

    Setzt den PWM Wert.

    Parameters
    + + +
    valuePWM Wert [0..0xFF]
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 314 of file b15f.cpp.

    @@ -819,7 +888,7 @@ constexpr static uint32_t 
    -

    Definition at line 344 of file b15f.cpp.

    +

    Definition at line 385 of file b15f.cpp.

    @@ -882,7 +951,7 @@ constexpr static uint32_t 
    diff --git a/docs/html/classDot-members.html b/docs/html/classDot-members.html index c1464ba..fafd43d 100644 --- a/docs/html/classDot-members.html +++ b/docs/html/classDot-members.html @@ -76,7 +76,7 @@ $(function() {
    diff --git a/docs/html/classDot.html b/docs/html/classDot.html index 318fa5d..b05a9bc 100644 --- a/docs/html/classDot.html +++ b/docs/html/classDot.html @@ -196,7 +196,7 @@ Public Member Functions diff --git a/docs/html/classDriverException-members.html b/docs/html/classDriverException-members.html index 848c1ce..5f85cd6 100644 --- a/docs/html/classDriverException-members.html +++ b/docs/html/classDriverException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classDriverException.html b/docs/html/classDriverException.html index 5df8380..95ed51e 100644 --- a/docs/html/classDriverException.html +++ b/docs/html/classDriverException.html @@ -109,7 +109,7 @@ std::string msg_< diff --git a/docs/html/classPlottyFile-members.html b/docs/html/classPlottyFile-members.html index 3e7bb5c..b38eece 100644 --- a/docs/html/classPlottyFile-members.html +++ b/docs/html/classPlottyFile-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/docs/html/classPlottyFile.html b/docs/html/classPlottyFile.html index d68ad8e..de9db48 100644 --- a/docs/html/classPlottyFile.html +++ b/docs/html/classPlottyFile.html @@ -811,7 +811,7 @@ Public Member Functions diff --git a/docs/html/classTimeoutException-members.html b/docs/html/classTimeoutException-members.html index a656c56..8c3285a 100644 --- a/docs/html/classTimeoutException-members.html +++ b/docs/html/classTimeoutException-members.html @@ -78,7 +78,7 @@ $(function() { diff --git a/docs/html/classTimeoutException.html b/docs/html/classTimeoutException.html index 77727db..6aa40b1 100644 --- a/docs/html/classTimeoutException.html +++ b/docs/html/classTimeoutException.html @@ -112,7 +112,7 @@ int m_timeout diff --git a/docs/html/classUSART-members.html b/docs/html/classUSART-members.html index 4dc25df..8d603c6 100644 --- a/docs/html/classUSART-members.html +++ b/docs/html/classUSART-members.html @@ -90,10 +90,11 @@ $(function() { writeBlock(uint8_t *buffer, uint16_t offset, uint8_t len) (defined in USART)USART writeByte(uint8_t b)USART writeInt(uint16_t d)USART + writeU32(uint32_t d)USART diff --git a/docs/html/classUSART.html b/docs/html/classUSART.html index 89274cc..aa16cc1 100644 --- a/docs/html/classUSART.html +++ b/docs/html/classUSART.html @@ -91,6 +91,8 @@ Public Member Functions   void writeInt (uint16_t d)   +void writeU32 (uint32_t d) +  uint8_t readByte (void)   uint16_t readInt (void) @@ -254,7 +256,7 @@ constexpr static uint8_t B

    Liefert die eingestellte Baudrate Änderungen werden erst nach einem open() wirksam

    -

    Definition at line 307 of file usart.cpp.

    +

    Definition at line 312 of file usart.cpp.

    @@ -275,7 +277,7 @@ constexpr static uint8_t B

    Liefert den eingestellten Timeout (in Dezisekunden) Änderungen werden erst nach einem open() wirksam

    -

    Definition at line 312 of file usart.cpp.

    +

    Definition at line 317 of file usart.cpp.

    @@ -354,7 +356,7 @@ constexpr static uint8_t B -

    Definition at line 211 of file usart.cpp.

    +

    Definition at line 216 of file usart.cpp.

    @@ -380,7 +382,7 @@ constexpr static uint8_t B -

    Definition at line 230 of file usart.cpp.

    +

    Definition at line 235 of file usart.cpp.

    @@ -401,7 +403,7 @@ constexpr static uint8_t B

    Setzt die Baudrate Änderungen werden erst nach einem open() wirksam

    -

    Definition at line 317 of file usart.cpp.

    +

    Definition at line 322 of file usart.cpp.

    @@ -422,7 +424,7 @@ constexpr static uint8_t B

    Setzt den Timeout (in Dezisekunden) Änderungen werden erst nach einem open() wirksam

    -

    Definition at line 322 of file usart.cpp.

    +

    Definition at line 327 of file usart.cpp.

    @@ -475,7 +477,7 @@ constexpr static uint8_t B

    Sendet ein Integer über die USART Schnittstelle

    Parameters
    - +
    bdas zu sendende Byte
    bdas zu sendende Int
    @@ -488,6 +490,38 @@ constexpr static uint8_t B

    Definition at line 81 of file usart.cpp.

    +
    + + +

    ◆ writeU32()

    + +
    +
    + + + + + + + + +
    void USART::writeU32 (uint32_t d)
    +
    +

    Sendet ein uint32_t über die USART Schnittstelle

    Parameters
    + + +
    bdas zu sendende uint32_t
    +
    +
    +
    Exceptions
    + + +
    USARTException
    +
    +
    + +

    Definition at line 88 of file usart.cpp.

    +

    The documentation for this class was generated from the following files:
      @@ -497,7 +531,7 @@ constexpr static uint8_t B diff --git a/docs/html/classUSARTException-members.html b/docs/html/classUSARTException-members.html index 03df1bd..fb0f7cc 100644 --- a/docs/html/classUSARTException-members.html +++ b/docs/html/classUSARTException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classUSARTException.html b/docs/html/classUSARTException.html index 4b9bc80..96d050d 100644 --- a/docs/html/classUSARTException.html +++ b/docs/html/classUSARTException.html @@ -109,7 +109,7 @@ std::string msg diff --git a/docs/html/classView-members.html b/docs/html/classView-members.html index 94750c9..0816e70 100644 --- a/docs/html/classView-members.html +++ b/docs/html/classView-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/docs/html/classView.html b/docs/html/classView.html index 5c420fa..ba64d4a 100644 --- a/docs/html/classView.html +++ b/docs/html/classView.html @@ -157,7 +157,7 @@ constexpr static int KEY_E diff --git a/docs/html/classViewInfo-members.html b/docs/html/classViewInfo-members.html index 62d2103..11fecf3 100644 --- a/docs/html/classViewInfo-members.html +++ b/docs/html/classViewInfo-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/docs/html/classViewInfo.html b/docs/html/classViewInfo.html index c78f59d..090a6da 100644 --- a/docs/html/classViewInfo.html +++ b/docs/html/classViewInfo.html @@ -185,7 +185,7 @@ static std::vector< std::string >  diff --git a/docs/html/classViewMonitor-members.html b/docs/html/classViewMonitor-members.html index c2f4e01..f8b0248 100644 --- a/docs/html/classViewMonitor-members.html +++ b/docs/html/classViewMonitor-members.html @@ -103,7 +103,7 @@ $(function() { diff --git a/docs/html/classViewMonitor.html b/docs/html/classViewMonitor.html index 9c59752..7566433 100644 --- a/docs/html/classViewMonitor.html +++ b/docs/html/classViewMonitor.html @@ -197,7 +197,7 @@ constexpr static int KEY_E diff --git a/docs/html/classViewPromt-members.html b/docs/html/classViewPromt-members.html index b0cafed..0620da4 100644 --- a/docs/html/classViewPromt-members.html +++ b/docs/html/classViewPromt-members.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/classViewPromt.html b/docs/html/classViewPromt.html index 22b82ad..e4f148d 100644 --- a/docs/html/classViewPromt.html +++ b/docs/html/classViewPromt.html @@ -205,7 +205,7 @@ static std::vector< std::string >  diff --git a/docs/html/classViewSelection-members.html b/docs/html/classViewSelection-members.html index 595ba75..7eb9d49 100644 --- a/docs/html/classViewSelection-members.html +++ b/docs/html/classViewSelection-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/docs/html/classViewSelection.html b/docs/html/classViewSelection.html index e92f205..3983a76 100644 --- a/docs/html/classViewSelection.html +++ b/docs/html/classViewSelection.html @@ -172,7 +172,7 @@ static std::vector< std::string >  diff --git a/docs/html/classes.html b/docs/html/classes.html index 8d0d0f8..54bd780 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/cli_8cpp_source.html b/docs/html/cli_8cpp_source.html index 801fcb9..941591f 100644 --- a/docs/html/cli_8cpp_source.html +++ b/docs/html/cli_8cpp_source.html @@ -68,11 +68,11 @@ $(function() {
      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
      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 }
      -
      static B15F & getInstance(void)
      Definition: b15f.cpp:302
      -
      static void setAbortHandler(errorhandler_t func)
      Definition: b15f.cpp:344
      +
      static B15F & getInstance(void)
      Definition: b15f.cpp:343
      +
      static void setAbortHandler(errorhandler_t func)
      Definition: b15f.cpp:385
      diff --git a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html index bebf28d..bd969af 100644 --- a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html +++ b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html index 52fcf49..9d8eb0a 100644 --- a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html +++ b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dot_8cpp_source.html b/docs/html/dot_8cpp_source.html index 853835b..dd83450 100644 --- a/docs/html/dot_8cpp_source.html +++ b/docs/html/dot_8cpp_source.html @@ -77,7 +77,7 @@ $(function() {
      Dot(uint16_t x, uint16_t y, uint8_t curve)
      Definition: dot.cpp:3
      diff --git a/docs/html/dot_8h_source.html b/docs/html/dot_8h_source.html index 46b7ae7..9c0bd19 100644 --- a/docs/html/dot_8h_source.html +++ b/docs/html/dot_8h_source.html @@ -78,7 +78,7 @@ $(function() {
      Dot(uint16_t x, uint16_t y, uint8_t curve)
      Definition: dot.cpp:3
      diff --git a/docs/html/driverexception_8h_source.html b/docs/html/driverexception_8h_source.html index 25897b6..015c2ad 100644 --- a/docs/html/driverexception_8h_source.html +++ b/docs/html/driverexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/files.html b/docs/html/files.html index 92b9ab6..e880b89 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -99,7 +99,7 @@ $(function() { diff --git a/docs/html/functions.html b/docs/html/functions.html index 1df7c12..26bae8d 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -236,6 +236,12 @@ $(function() {
    • printStatistics() : USART
    • +
    • pwmSetFrequency() +: B15F +
    • +
    • pwmSetValue() +: B15F +
    @@ -336,11 +342,14 @@ $(function() {
  • writeToFile() : PlottyFile
  • +
  • writeU32() +: USART +
  • diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html index 4fbff3f..1c2fd52 100644 --- a/docs/html/functions_func.html +++ b/docs/html/functions_func.html @@ -216,6 +216,12 @@ $(function() {
  • printStatistics() : USART
  • +
  • pwmSetFrequency() +: B15F +
  • +
  • pwmSetValue() +: B15F +
  • @@ -307,11 +313,14 @@ $(function() {
  • writeToFile() : PlottyFile
  • +
  • writeU32() +: USART +
  • diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index c646f33..3172ad7 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -88,7 +88,7 @@ $(function() { diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html index c8df567..bf24851 100644 --- a/docs/html/hierarchy.html +++ b/docs/html/hierarchy.html @@ -86,7 +86,7 @@ $(function() { diff --git a/docs/html/index.html b/docs/html/index.html index aa89bbd..50426bf 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -72,7 +72,7 @@ Dort befindet sich auch eine Übersicht der verfügbaren Befehle.

    diff --git a/docs/html/plottyfile_8cpp_source.html b/docs/html/plottyfile_8cpp_source.html index c31ae5e..abd1e0b 100644 --- a/docs/html/plottyfile_8cpp_source.html +++ b/docs/html/plottyfile_8cpp_source.html @@ -101,7 +101,7 @@ $(function() {
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    diff --git a/docs/html/plottyfile_8h_source.html b/docs/html/plottyfile_8h_source.html index 4fdc771..dd26e80 100644 --- a/docs/html/plottyfile_8h_source.html +++ b/docs/html/plottyfile_8h_source.html @@ -102,7 +102,7 @@ $(function() {
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js index b1c5b0a..c3ed16c 100644 --- a/docs/html/search/all_9.js +++ b/docs/html/search/all_9.js @@ -2,5 +2,7 @@ var searchData= [ ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]], ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]], - ['printstatistics',['printStatistics',['../classUSART.html#a33559bb8f0eda33a489d47b9c9227b59',1,'USART']]] + ['printstatistics',['printStatistics',['../classUSART.html#a33559bb8f0eda33a489d47b9c9227b59',1,'USART']]], + ['pwmsetfrequency',['pwmSetFrequency',['../classB15F.html#ac6f6532bb9550a0632c28b98c157d0a1',1,'B15F']]], + ['pwmsetvalue',['pwmSetValue',['../classB15F.html#af9aad3c0db5d5a8b37219d713e1977ee',1,'B15F']]] ]; diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js index 021aad6..6a81098 100644 --- a/docs/html/search/all_f.js +++ b/docs/html/search/all_f.js @@ -3,5 +3,6 @@ var searchData= ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]], ['writebyte',['writeByte',['../classUSART.html#a60eadbe9956bab8144ee96d89eacd9f5',1,'USART']]], ['writeint',['writeInt',['../classUSART.html#a78b30d9aa863f38745e982860392599a',1,'USART']]], - ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] + ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]], + ['writeu32',['writeU32',['../classUSART.html#a68c2d1cb7172813ae8ed61360fad47f6',1,'USART']]] ]; diff --git a/docs/html/search/functions_7.js b/docs/html/search/functions_7.js index cfb7a36..939b6a3 100644 --- a/docs/html/search/functions_7.js +++ b/docs/html/search/functions_7.js @@ -1,4 +1,6 @@ var searchData= [ - ['printstatistics',['printStatistics',['../classUSART.html#a33559bb8f0eda33a489d47b9c9227b59',1,'USART']]] + ['printstatistics',['printStatistics',['../classUSART.html#a33559bb8f0eda33a489d47b9c9227b59',1,'USART']]], + ['pwmsetfrequency',['pwmSetFrequency',['../classB15F.html#ac6f6532bb9550a0632c28b98c157d0a1',1,'B15F']]], + ['pwmsetvalue',['pwmSetValue',['../classB15F.html#af9aad3c0db5d5a8b37219d713e1977ee',1,'B15F']]] ]; diff --git a/docs/html/search/functions_b.js b/docs/html/search/functions_b.js index cbf06ef..59b6148 100644 --- a/docs/html/search/functions_b.js +++ b/docs/html/search/functions_b.js @@ -2,5 +2,6 @@ var searchData= [ ['writebyte',['writeByte',['../classUSART.html#a60eadbe9956bab8144ee96d89eacd9f5',1,'USART']]], ['writeint',['writeInt',['../classUSART.html#a78b30d9aa863f38745e982860392599a',1,'USART']]], - ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] + ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]], + ['writeu32',['writeU32',['../classUSART.html#a68c2d1cb7172813ae8ed61360fad47f6',1,'USART']]] ]; diff --git a/docs/html/timeoutexception_8h_source.html b/docs/html/timeoutexception_8h_source.html index 84fffd2..9351c47 100644 --- a/docs/html/timeoutexception_8h_source.html +++ b/docs/html/timeoutexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/ui_8cpp_source.html b/docs/html/ui_8cpp_source.html index 760c88e..2012b32 100644 --- a/docs/html/ui_8cpp_source.html +++ b/docs/html/ui_8cpp_source.html @@ -73,8 +73,8 @@ $(function() {
    1 #include "ui.h"
    2 #include "../drv/b15f.h"
    3 
    4 std::vector<View*> win_stack;
    5 std::thread t_refresh;
    6 
    7 void show_main(int)
    8 {
    9  ViewSelection* view = new ViewSelection();
    10  view->setTitle("B15F - Command Line Interface");
    11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
    12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
    13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
    14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
    15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
    16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
    17  view->addChoice("[ Informationen ]", &show_info);
    18  view->addChoice("", nullptr);
    19  view->addChoice("[ Beenden ]", &finish);
    20  view->repaint();
    21 
    22  win_stack.push_back(view);
    23  input(0);
    24 }
    25 
    26 void input(int)
    27 {
    28  call_t nextCall;
    29  int key;
    30  do
    31  {
    32  key = wgetch(View::getWinContext());
    33  win_stack.back()->repaint();
    34  nextCall = win_stack.back()->keypress(key);
    35 
    36  if(key == -1)
    37  view_back(key);
    38 
    39  if(nextCall)
    40  nextCall(key);
    41  }
    42  while(win_stack.size());
    43 }
    44 
    45 void view_back(int)
    46 {
    47  if(win_stack.size())
    48  {
    49  delete win_stack.back();
    50  win_stack.pop_back();
    51  }
    52  if(win_stack.size())
    53  win_stack.back()->repaint();
    54 }
    55 
    56 void finish(int)
    57 {
    58  cleanup();
    59  exit(EXIT_SUCCESS);
    60 }
    61 
    62 void cleanup()
    63 {
    64  if(t_refresh.joinable())
    65  t_refresh.join();
    66  clrtoeol();
    67  refresh();
    68  endwin();
    69 }
    70 
    71 void show_info(int)
    72 {
    73  ViewInfo* view = new ViewInfo();
    74  view->setTitle("Info");
    75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
    76  view->setLabelClose("[ Zurueck ]");
    77  view->repaint();
    78 
    79  win_stack.push_back(view);
    80  input(0);
    81 }
    82 
    83 void show_monitor(int)
    84 {
    85  ViewMonitor* view = new ViewMonitor();
    86  view->setTitle("Monitor");
    87  view->setText("\nErfasse Messwerte...");
    88  view->setLabelClose("[ Zurueck ]");
    89  view->repaint();
    90 
    91  win_stack.push_back(view);
    92  input(0);
    93 }
    94 
    95 void show_invalid_port_input(int)
    96 {
    97  ViewInfo* view = new ViewInfo();
    98  view->setTitle("Falsche Eingabe");
    99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
    100  view->setLabelClose("[ Schliessen ]");
    101  view->repaint();
    102 
    103  win_stack.push_back(view);
    104  input(0);
    105 }
    106 
    107 void show_invalid_dac_input(int)
    108 {
    109  ViewInfo* view = new ViewInfo();
    110  view->setTitle("Falsche Eingabe");
    111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
    112  view->setLabelClose("[ Schliessen ]");
    113  view->repaint();
    114 
    115  win_stack.push_back(view);
    116  input(0);
    117 }
    118 
    119 void write_digital_output0(int)
    120 {
    121  try
    122  {
    123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    124  if(d > 255 || 0 > d)
    125  throw std::invalid_argument("bad value");
    126  uint8_t port = static_cast<uint8_t>(d);
    127 
    128  B15F& drv = B15F::getInstance();
    129  drv.digitalWrite0(port);
    130  view_back(0);
    131  }
    132  catch(std::invalid_argument& ex)
    133  {
    134  show_invalid_port_input(0);
    135  }
    136 }
    137 
    138 void write_digital_output1(int)
    139 {
    140  try
    141  {
    142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    143  if(d > 255 || 0 > d)
    144  throw std::invalid_argument("bad value");
    145  uint8_t port = static_cast<uint8_t>(d);
    146 
    147  B15F& drv = B15F::getInstance();
    148  drv.digitalWrite1(port);
    149  view_back(0);
    150  }
    151  catch(std::invalid_argument& ex)
    152  {
    153  show_invalid_port_input(0);
    154  }
    155 }
    156 
    157 void write_analog_output0(int)
    158 {
    159  try
    160  {
    161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    162  if(port > 1023)
    163  throw std::invalid_argument("bad value");
    164 
    165  B15F& drv = B15F::getInstance();
    166  drv.analogWrite0(port);
    167  view_back(0);
    168  }
    169  catch(std::invalid_argument& ex)
    170  {
    171  show_invalid_dac_input(0);
    172  }
    173 }
    174 
    175 void write_analog_output1(int)
    176 {
    177  try
    178  {
    179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    180  if(port > 1023)
    181  throw std::invalid_argument("bad value");
    182 
    183  B15F& drv = B15F::getInstance();
    184  drv.analogWrite1(port);
    185  view_back(0);
    186  }
    187  catch(std::invalid_argument& ex)
    188  {
    189  show_invalid_dac_input(0);
    190  }
    191 }
    192 
    193 void show_digital_output0(int)
    194 {
    195  ViewPromt* view = new ViewPromt();
    196  view->setTitle("Digitale Ausgabe BE0");
    197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    198  view->setCancel("[ Zurueck ]", true);
    199  view->setConfirm("[ OK ]", &write_digital_output0);
    200  view->repaint();
    201 
    202  win_stack.push_back(view);
    203  input(0);
    204 }
    205 
    206 void show_digital_output1(int)
    207 {
    208  ViewPromt* view = new ViewPromt();
    209  view->setTitle("Digitale Ausgabe BE1");
    210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    211  view->setCancel("[ Zurueck ]", true);
    212  view->setConfirm("[ OK ]", &write_digital_output1);
    213  view->repaint();
    214 
    215  win_stack.push_back(view);
    216  input(0);
    217 }
    218 
    219 void show_analog_output0(int)
    220 {
    221  ViewPromt* view = new ViewPromt();
    222  view->setTitle("Analoge Ausgabe AA0");
    223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    224  view->setCancel("[ Zurueck ]", true);
    225  view->setConfirm("[ OK ]", &write_analog_output0);
    226  view->repaint();
    227 
    228  win_stack.push_back(view);
    229  input(0);
    230 }
    231 
    232 void show_analog_output1(int)
    233 {
    234  ViewPromt* view = new ViewPromt();
    235  view->setTitle("Analoge Ausgabe AA1");
    236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    237  view->setCancel("[ Zurueck ]", true);
    238  view->setConfirm("[ OK ]", &write_analog_output1);
    239  view->repaint();
    240 
    241  win_stack.push_back(view);
    242  input(0);
    243 }
    244 
    245 void start_selftest(int)
    246 {
    247  B15F& drv = B15F::getInstance();
    248  drv.activateSelfTestMode();
    249 
    250  ViewInfo* view = new ViewInfo();
    251  view->setTitle("Selbsttest aktiv");
    252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
    253  view->setLabelClose("[ Selbsttest Beenden ]");
    254  view->setCall(&stop_selftest);
    255  view->repaint();
    256 
    257  win_stack.push_back(view);
    258  input(0);
    259 }
    260 
    261 void stop_selftest(int)
    262 {
    263  B15F& drv = B15F::getInstance();
    264  drv.discard();
    266  drv.reconnect();
    267  drv.digitalWrite0(0);
    268  drv.digitalWrite1(0);
    269 }
    270 
    271 void show_selftest_info(int)
    272 {
    273  ViewInfo* view = new ViewInfo();
    274  view->setTitle("Selbsttest");
    275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
    276  view->setLabelClose("[ Weiter ]");
    277  view->setCall(&start_selftest);
    278  view->repaint();
    279 
    280  win_stack.push_back(view);
    281  input(0);
    282 }
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:292
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:302
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:333
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:343
    Definition: b15f.h:26
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    @@ -83,12 +83,12 @@ $(function() {
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    void discard(void)
    Definition: b15f.cpp:72
    -
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:203
    +
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:219
    void reconnect(void)
    Definition: b15f.cpp:57
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    diff --git a/docs/html/ui_8h_source.html b/docs/html/ui_8h_source.html index 6b5ee6b..545b5cb 100644 --- a/docs/html/ui_8h_source.html +++ b/docs/html/ui_8h_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #ifndef UI_H
    2 #define UI_H
    3 
    4 #include <vector>
    5 #include "view_selection.h"
    6 #include "view_info.h"
    7 #include "view_monitor.h"
    8 #include "view_promt.h"
    9 
    10 void show_main(int);
    11 void input(int);
    12 void view_back(int);
    13 void finish(int);
    14 void cleanup();
    15 
    16 void show_info(int);
    17 void show_monitor(int);
    18 void show_invalid_port_input(int);
    19 void show_invalid_dac_input(int);
    20 void write_digital_output0(int);
    21 void write_digital_output1(int);
    22 void write_analog_output0(int);
    23 void write_analog_output1(int);
    24 void show_digital_output0(int);
    25 void show_digital_output1(int);
    26 void show_analog_output0(int);
    27 void show_analog_output1(int);
    28 
    29 // selftest group
    30 void show_selftest_info(int);
    31 void start_selftest(int);
    32 void stop_selftest(int);
    33 
    34 
    35 extern std::vector<View*> win_stack;
    36 extern std::thread t_refresh;
    37 
    38 #endif // UI_H
    diff --git a/docs/html/usart_8cpp_source.html b/docs/html/usart_8cpp_source.html index 5456252..70b7d23 100644 --- a/docs/html/usart_8cpp_source.html +++ b/docs/html/usart_8cpp_source.html @@ -70,26 +70,27 @@ $(function() {
    usart.cpp
    -
    1 #include "usart.h"
    2 
    3 void USART::openDevice(std::string device)
    4 {
    5  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY /* | O_NONBLOCK*/);
    6  if(file_desc <= 0)
    7  throw USARTException("Fehler beim Öffnen des Gerätes");
    8 
    9  struct termios options;
    10  int code = tcgetattr(file_desc, &options);
    11  if(code)
    12  throw USARTException("Fehler beim Lesen der Geräteparameter");
    13 
    14  options.c_cflag = CS8 | CLOCAL | CREAD;
    15  options.c_iflag = IGNPAR;
    16  options.c_oflag = 0;
    17  options.c_lflag = 0;
    18  options.c_cc[VMIN] = 0; // #bytes read returns at least
    19  options.c_cc[VTIME] = timeout;
    20  code = cfsetspeed(&options, baudrate);
    21  if(code)
    22  throw USARTException("Fehler beim Setzen der Baudrate");
    23 
    24  code = tcsetattr(file_desc, TCSANOW, &options);
    25  if(code)
    26  throw USARTException("Fehler beim Setzen der Geräteparameter");
    27 
    30 }
    31 
    33 {
    34  int code = close(file_desc);
    35  if(code)
    36  throw USARTException("Fehler beim Schließen des Gerätes");
    37 }
    38 
    40 {
    41  int code = tcflush(file_desc, TCIFLUSH);
    42  if(code)
    43  throw USARTException("Fehler beim Leeren des Eingangspuffers");
    44 }
    45 
    47 {
    48  int code = tcflush(file_desc, TCOFLUSH);
    49  if(code)
    50  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
    51 }
    52 
    54 {
    55  int code = tcdrain(file_desc);
    56  if(code)
    57  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
    58 }
    59 
    61 {
    62  double pz = 1e2 * n_blocks_failed / n_blocks_total;
    63  pz = std::round(pz * 1e2) / 1e2;
    64  std::cout << "blocks total: " << n_blocks_total << " ok: " << (n_blocks_total - n_blocks_failed) << " failed: " << n_blocks_failed << " (" << pz << "%)" << std::endl;
    65 }
    66 
    67 void USART::writeByte(uint8_t b)
    68 {
    69  int sent = write(file_desc, &b, 1);
    70  if(sent != 1)
    71  {
    72  std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl;
    73  usleep(100000);
    74  sent = write(file_desc, &b, 1);
    75  if(sent != 1)
    76  throw USARTException("Fehler beim Senden: writeByte()");
    77  }
    78 
    79 }
    80 
    81 void USART::writeInt(uint16_t d)
    82 {
    83  int sent = write(file_desc, reinterpret_cast<char*>(&d), 2);
    84  if(sent != 2)
    85  throw USARTException("Fehler beim Senden: writeInt()");
    86 }
    87 
    88 
    89 
    90 int USART::read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout)
    91 {
    92  uint32_t elapsed = 0;
    93  int n_read = -1;
    94  auto start = std::chrono::steady_clock::now();
    95  auto end = start;
    96  while(elapsed < timeout)
    97  {
    98  n_read = read(file_desc, buffer + offset, len);
    99  if (n_read == len)
    100  return n_read;
    101 
    102  end = std::chrono::steady_clock::now();
    103  elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    104  }
    105 
    106  return 0;
    107 }
    108 
    109 int USART::write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout)
    110 {
    111  uint32_t elapsed = 0;
    112  int n_sent = -1;
    113  auto start = std::chrono::steady_clock::now();
    114  auto end = start;
    115  while(elapsed < timeout)
    116  {
    117  n_sent = write(file_desc, buffer + offset, len);
    119  if (n_sent == len)
    120  return n_sent;
    121 
    122  end = std::chrono::steady_clock::now();
    123  elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    124  }
    125 
    126  return n_sent;
    127 }
    128 
    129 void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len)
    130 {
    131  uint8_t crc;
    132  uint8_t aw;
    133  const uint16_t us_per_bit = (1000000 / baudrate) * 16;
    134  const uint16_t n_total = len + 3;
    135 
    136  n_blocks_total++;
    137  bool failed = false;
    138 
    139  do
    140  {
    141  // calc crc
    142  crc = 0;
    143  for(uint8_t i = 0; i < len; i++)
    144  {
    145  crc ^= buffer[i];
    146  for (uint8_t k = 0; k < 8; k++)
    147  {
    148  if (crc & 1)
    149  crc ^= CRC7_POLY;
    150  crc >>= 1;
    151  }
    152  }
    153 
    154  // construct block
    155  block_buffer[0] = len;
    156  std::memcpy(&block_buffer[1], buffer + offset, len);
    157  block_buffer[len + 1] = crc;
    158  block_buffer[len + 2] = BLOCK_END;
    159 
    160  // send block
    163  int n_sent = write_timeout(&block_buffer[0], 0, len + 3, us_per_bit * n_total);
    164  if(n_sent != n_total)
    165  throw std::runtime_error("fatal (send): " + std::to_string(n_sent));
    166 
    167  /*for(uint8_t i = 0; i < len + 3; i++)
    168  {
    169  write_timeout(&block_buffer[i], 0, 1, us_per_bit * n_total);
    170  //tcdrain(file_desc);
    171  //usleep(1000);
    172  }*/
    173 
    174  // flush output data
    175  tcdrain(file_desc);
    176 
    177  //usleep(us_per_bit * n_total * 10);
    178 
    179  // check response
    180  int n_read = read_timeout(&aw, 0, 1, us_per_bit * n_blocks_total * 10);
    181  for(uint16_t i = 0; i < 255 && n_read != 1; i++)
    182  {
    183  writeByte(0x80); // Stoppzeichen für Block
    184  if(tcdrain(file_desc))
    185  {
    186  std::cout << "drain failed" << std::endl;
    187  }
    188  std::cout << "WARNING: read error (" << n_read << "), retry #" << (int) i << std::endl;
    189  usleep(us_per_bit*100);
    190  n_read = read_timeout(&aw, 0, 1, us_per_bit);
    191  }
    192 
    193  if(n_read != 1)
    194  throw std::runtime_error("fatal: " + std::to_string(n_read));
    195 
    196  //clearInputBuffer();
    197 
    198  if(aw != 0xFF)
    199  {
    200  if(!failed)
    201  n_blocks_failed++;
    202  failed = true;
    203  std::cout << "block failed, retry" << std::endl;
    204  }
    205  }
    206  while(aw != 0xFF);
    207 
    208  //std::cout << "OK" << std::endl;
    209 }
    210 
    211 uint8_t USART::readByte(void)
    212 {
    213  char b;
    214  auto start = std::chrono::steady_clock::now();
    215  auto end = start;
    216  uint16_t elapsed = 0;
    217  while(elapsed < timeout * 100)
    218  {
    219  int code = read(file_desc, &b, 1);
    220  if (code > 0)
    221  return static_cast<uint8_t>(b);
    222 
    223  end = std::chrono::steady_clock::now();
    224  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    225  }
    226 
    227  throw TimeoutException("Verbindung unterbrochen.", timeout);
    228 }
    229 
    230 uint16_t USART::readInt(void)
    231 {
    232  return readByte() | readByte() << 8;
    233 }
    234 
    235 bool USART::readBlock(uint8_t* buffer, uint16_t offset)
    236 {
    237  uint8_t len = readByte();
    238  uint8_t crc = 0;
    239  buffer += offset;
    240 
    241  uint32_t block_timeout = timeout / 10;
    242 
    243  // wait for block
    244  int n_ready;
    245  uint16_t elapsed = 0;
    246  auto start = std::chrono::steady_clock::now();
    247  auto end = start;
    248  while(elapsed < block_timeout)
    249  {
    250  int code = ioctl(file_desc, FIONREAD, &n_ready);
    251  if(code != 0)
    252  {
    253  std::cout << "n_ready code: " << code << std::endl;
    254  return false;
    255  }
    256 
    257  if(n_ready >= len + 1)
    258  break;
    259 
    260  end = std::chrono::steady_clock::now();
    261  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    262  }
    263  if(elapsed >= timeout)
    264  {
    265  std::cout << "block timeout: " << std::endl;
    266  return false;
    267  }
    268 
    269  while(len--)
    270  {
    271  *buffer = readByte();
    272 
    273  crc ^= *buffer++;
    274  for (uint8_t i = 0; i < 8; i++)
    275  {
    276  if (crc & 1)
    277  crc ^= CRC7_POLY;
    278  crc >>= 1;
    279  }
    280  }
    281 
    282  crc ^= readByte();
    283  for (uint8_t i = 0; i < 8; i++)
    284  {
    285  if (crc & 1)
    286  crc ^= CRC7_POLY;
    287  crc >>= 1;
    288  }
    289 
    290  if(TEST == 1)
    291  crc = 1;
    292  if(TEST > 100)
    293  TEST = 0;
    294 
    295  if (crc == 0)
    296  {
    297  writeByte(0xFF);
    298  return true;
    299  }
    300  else
    301  {
    302  writeByte(0xFE);
    303  return false;
    304  }
    305 }
    306 
    308 {
    309  return baudrate;
    310 }
    311 
    313 {
    314  return timeout;
    315 }
    316 
    317 void USART::setBaudrate(uint32_t baudrate)
    318 {
    319  this->baudrate = baudrate;
    320 }
    321 
    322 void USART::setTimeout(uint8_t timeout)
    323 {
    324  this->timeout = timeout;
    325 }
    -
    uint32_t getBaudrate(void)
    Definition: usart.cpp:307
    -
    uint8_t readByte(void)
    Definition: usart.cpp:211
    +
    1 #include "usart.h"
    2 
    3 void USART::openDevice(std::string device)
    4 {
    5  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY /* | O_NONBLOCK*/);
    6  if(file_desc <= 0)
    7  throw USARTException("Fehler beim Öffnen des Gerätes");
    8 
    9  struct termios options;
    10  int code = tcgetattr(file_desc, &options);
    11  if(code)
    12  throw USARTException("Fehler beim Lesen der Geräteparameter");
    13 
    14  options.c_cflag = CS8 | CLOCAL | CREAD;
    15  options.c_iflag = IGNPAR;
    16  options.c_oflag = 0;
    17  options.c_lflag = 0;
    18  options.c_cc[VMIN] = 0; // #bytes read returns at least
    19  options.c_cc[VTIME] = timeout;
    20  code = cfsetspeed(&options, baudrate);
    21  if(code)
    22  throw USARTException("Fehler beim Setzen der Baudrate");
    23 
    24  code = tcsetattr(file_desc, TCSANOW, &options);
    25  if(code)
    26  throw USARTException("Fehler beim Setzen der Geräteparameter");
    27 
    30 }
    31 
    33 {
    34  int code = close(file_desc);
    35  if(code)
    36  throw USARTException("Fehler beim Schließen des Gerätes");
    37 }
    38 
    40 {
    41  int code = tcflush(file_desc, TCIFLUSH);
    42  if(code)
    43  throw USARTException("Fehler beim Leeren des Eingangspuffers");
    44 }
    45 
    47 {
    48  int code = tcflush(file_desc, TCOFLUSH);
    49  if(code)
    50  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
    51 }
    52 
    54 {
    55  int code = tcdrain(file_desc);
    56  if(code)
    57  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
    58 }
    59 
    61 {
    62  double pz = 1e2 * n_blocks_failed / n_blocks_total;
    63  pz = std::round(pz * 1e2) / 1e2;
    64  std::cout << "blocks total: " << n_blocks_total << " ok: " << (n_blocks_total - n_blocks_failed) << " failed: " << n_blocks_failed << " (" << pz << "%)" << std::endl;
    65 }
    66 
    67 void USART::writeByte(uint8_t b)
    68 {
    69  int sent = write(file_desc, &b, 1);
    70  if(sent != 1)
    71  {
    72  std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl;
    73  usleep(100000);
    74  sent = write(file_desc, &b, 1);
    75  if(sent != 1)
    76  throw USARTException("Fehler beim Senden: writeByte()");
    77  }
    78 
    79 }
    80 
    81 void USART::writeInt(uint16_t d)
    82 {
    83  int sent = write(file_desc, reinterpret_cast<char*>(&d), 2);
    84  if(sent != 2)
    85  throw USARTException("Fehler beim Senden: writeInt()");
    86 }
    87 
    88 void USART::writeU32(uint32_t w)
    89 {
    90  int sent = write(file_desc, reinterpret_cast<char*>(&w), 4);
    91  if(sent != 4)
    92  throw USARTException("Fehler beim Senden: writeU32()");
    93 }
    94 
    95 int USART::read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout)
    96 {
    97  uint32_t elapsed = 0;
    98  int n_read = -1;
    99  auto start = std::chrono::steady_clock::now();
    100  auto end = start;
    101  while(elapsed < timeout)
    102  {
    103  n_read = read(file_desc, buffer + offset, len);
    104  if (n_read == len)
    105  return n_read;
    106 
    107  end = std::chrono::steady_clock::now();
    108  elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    109  }
    110 
    111  return 0;
    112 }
    113 
    114 int USART::write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout)
    115 {
    116  uint32_t elapsed = 0;
    117  int n_sent = -1;
    118  auto start = std::chrono::steady_clock::now();
    119  auto end = start;
    120  while(elapsed < timeout)
    121  {
    122  n_sent = write(file_desc, buffer + offset, len);
    124  if (n_sent == len)
    125  return n_sent;
    126 
    127  end = std::chrono::steady_clock::now();
    128  elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    129  }
    130 
    131  return n_sent;
    132 }
    133 
    134 void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len)
    135 {
    136  uint8_t crc;
    137  uint8_t aw;
    138  const uint16_t us_per_bit = (1000000 / baudrate) * 16;
    139  const uint16_t n_total = len + 3;
    140 
    141  n_blocks_total++;
    142  bool failed = false;
    143 
    144  do
    145  {
    146  // calc crc
    147  crc = 0;
    148  for(uint8_t i = 0; i < len; i++)
    149  {
    150  crc ^= buffer[i];
    151  for (uint8_t k = 0; k < 8; k++)
    152  {
    153  if (crc & 1)
    154  crc ^= CRC7_POLY;
    155  crc >>= 1;
    156  }
    157  }
    158 
    159  // construct block
    160  block_buffer[0] = len;
    161  std::memcpy(&block_buffer[1], buffer + offset, len);
    162  block_buffer[len + 1] = crc;
    163  block_buffer[len + 2] = BLOCK_END;
    164 
    165  // send block
    168  int n_sent = write_timeout(&block_buffer[0], 0, len + 3, us_per_bit * n_total);
    169  if(n_sent != n_total)
    170  throw std::runtime_error("fatal (send): " + std::to_string(n_sent));
    171 
    172  /*for(uint8_t i = 0; i < len + 3; i++)
    173  {
    174  write_timeout(&block_buffer[i], 0, 1, us_per_bit * n_total);
    175  //tcdrain(file_desc);
    176  //usleep(1000);
    177  }*/
    178 
    179  // flush output data
    180  tcdrain(file_desc);
    181 
    182  //usleep(us_per_bit * n_total * 10);
    183 
    184  // check response
    185  int n_read = read_timeout(&aw, 0, 1, us_per_bit * n_blocks_total * 10);
    186  for(uint16_t i = 0; i < 255 && n_read != 1; i++)
    187  {
    188  writeByte(0x80); // Stoppzeichen für Block
    189  if(tcdrain(file_desc))
    190  {
    191  std::cout << "drain failed" << std::endl;
    192  }
    193  std::cout << "WARNING: read error (" << n_read << "), retry #" << (int) i << std::endl;
    194  usleep(us_per_bit*100);
    195  n_read = read_timeout(&aw, 0, 1, us_per_bit);
    196  }
    197 
    198  if(n_read != 1)
    199  throw std::runtime_error("fatal: " + std::to_string(n_read));
    200 
    201  //clearInputBuffer();
    202 
    203  if(aw != 0xFF)
    204  {
    205  if(!failed)
    206  n_blocks_failed++;
    207  failed = true;
    208  std::cout << "block failed, retry" << std::endl;
    209  }
    210  }
    211  while(aw != 0xFF);
    212 
    213  //std::cout << "OK" << std::endl;
    214 }
    215 
    216 uint8_t USART::readByte(void)
    217 {
    218  char b;
    219  auto start = std::chrono::steady_clock::now();
    220  auto end = start;
    221  uint16_t elapsed = 0;
    222  while(elapsed < timeout * 100)
    223  {
    224  int code = read(file_desc, &b, 1);
    225  if (code > 0)
    226  return static_cast<uint8_t>(b);
    227 
    228  end = std::chrono::steady_clock::now();
    229  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    230  }
    231 
    232  throw TimeoutException("Verbindung unterbrochen.", timeout);
    233 }
    234 
    235 uint16_t USART::readInt(void)
    236 {
    237  return readByte() | readByte() << 8;
    238 }
    239 
    240 bool USART::readBlock(uint8_t* buffer, uint16_t offset)
    241 {
    242  uint8_t len = readByte();
    243  uint8_t crc = 0;
    244  buffer += offset;
    245 
    246  uint32_t block_timeout = timeout / 10;
    247 
    248  // wait for block
    249  int n_ready;
    250  uint16_t elapsed = 0;
    251  auto start = std::chrono::steady_clock::now();
    252  auto end = start;
    253  while(elapsed < block_timeout)
    254  {
    255  int code = ioctl(file_desc, FIONREAD, &n_ready);
    256  if(code != 0)
    257  {
    258  std::cout << "n_ready code: " << code << std::endl;
    259  return false;
    260  }
    261 
    262  if(n_ready >= len + 1)
    263  break;
    264 
    265  end = std::chrono::steady_clock::now();
    266  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    267  }
    268  if(elapsed >= timeout)
    269  {
    270  std::cout << "block timeout: " << std::endl;
    271  return false;
    272  }
    273 
    274  while(len--)
    275  {
    276  *buffer = readByte();
    277 
    278  crc ^= *buffer++;
    279  for (uint8_t i = 0; i < 8; i++)
    280  {
    281  if (crc & 1)
    282  crc ^= CRC7_POLY;
    283  crc >>= 1;
    284  }
    285  }
    286 
    287  crc ^= readByte();
    288  for (uint8_t i = 0; i < 8; i++)
    289  {
    290  if (crc & 1)
    291  crc ^= CRC7_POLY;
    292  crc >>= 1;
    293  }
    294 
    295  if(TEST == 1)
    296  crc = 1;
    297  if(TEST > 100)
    298  TEST = 0;
    299 
    300  if (crc == 0)
    301  {
    302  writeByte(0xFF);
    303  return true;
    304  }
    305  else
    306  {
    307  writeByte(0xFE);
    308  return false;
    309  }
    310 }
    311 
    313 {
    314  return baudrate;
    315 }
    316 
    318 {
    319  return timeout;
    320 }
    321 
    322 void USART::setBaudrate(uint32_t baudrate)
    323 {
    324  this->baudrate = baudrate;
    325 }
    326 
    327 void USART::setTimeout(uint8_t timeout)
    328 {
    329  this->timeout = timeout;
    330 }
    +
    void writeU32(uint32_t d)
    Definition: usart.cpp:88
    +
    uint32_t getBaudrate(void)
    Definition: usart.cpp:312
    +
    uint8_t readByte(void)
    Definition: usart.cpp:216
    void printStatistics(void)
    Definition: usart.cpp:60
    void closeDevice(void)
    Definition: usart.cpp:32
    void clearInputBuffer(void)
    Definition: usart.cpp:39
    -
    uint8_t getTimeout(void)
    Definition: usart.cpp:312
    +
    uint8_t getTimeout(void)
    Definition: usart.cpp:317
    void clearOutputBuffer(void)
    Definition: usart.cpp:46
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:317
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:322
    void writeByte(uint8_t b)
    Definition: usart.cpp:67
    void openDevice(std::string device)
    Definition: usart.cpp:3
    -
    uint16_t readInt(void)
    Definition: usart.cpp:230
    -
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:322
    +
    uint16_t readInt(void)
    Definition: usart.cpp:235
    +
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:327
    void flushOutputBuffer(void)
    Definition: usart.cpp:53
    void writeInt(uint16_t d)
    Definition: usart.cpp:81
    diff --git a/docs/html/usart_8h_source.html b/docs/html/usart_8h_source.html index 31b8729..25eac7a 100644 --- a/docs/html/usart_8h_source.html +++ b/docs/html/usart_8h_source.html @@ -70,25 +70,26 @@ $(function() {
    usart.h
    -
    1 #ifndef USART_H
    2 #define USART_H
    3 
    4 #include <iostream>
    5 #include <cstdint>
    6 #include <chrono>
    7 #include <unistd.h>
    8 #include <cstring>
    9 #include <fcntl.h>
    10 #include <sys/ioctl.h>
    11 #include <termios.h>
    12 #include <cmath>
    13 #include "usartexception.h"
    14 #include "timeoutexception.h"
    15 
    18 class USART
    19 {
    20 public:
    21 
    22  /*************************************************
    23  * Methoden für die Verwaltung der Schnittstelle *
    24  *************************************************/
    25 
    31  void openDevice(std::string device);
    32 
    37  void closeDevice(void);
    38 
    43  void clearInputBuffer(void);
    44 
    49  void clearOutputBuffer(void);
    50 
    55  void flushOutputBuffer(void);
    56 
    60  void printStatistics(void);
    61 
    62  /*************************************************/
    63 
    64 
    65 
    66  /*************************************
    67  * Methoden für die Datenübertragung *
    68  *************************************/
    69 
    75  void writeByte(uint8_t b);
    76 
    82  void writeInt(uint16_t d);
    83 
    88  uint8_t readByte(void);
    89 
    94  uint16_t readInt(void);
    95 
    96  int read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
    97  int write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
    98  void writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len);
    99  bool readBlock(uint8_t* buffer, uint16_t offset);
    100 
    101  /*************************************/
    102 
    103 
    104 
    105  /***************************************
    106  * Methoden für einstellbare Parameter *
    107  ***************************************/
    108 
    113  uint32_t getBaudrate(void);
    114 
    119  uint8_t getTimeout(void);
    120 
    125  void setBaudrate(uint32_t baudrate);
    126 
    131  void setTimeout(uint8_t timeout);
    132 
    133  /***************************************/
    134 
    135  constexpr static uint8_t CRC7_POLY = 0x91;
    136  constexpr static uint8_t MAX_BLOCK_SIZE = 64;
    137  constexpr static uint8_t BLOCK_END = 0x80;
    138 private:
    139 
    140  int file_desc = -1; // Linux Dateideskriptor
    141  uint32_t baudrate = 9600; // Standard-Baudrate, sollte mit setBaudrate() überschrieben werden!
    142  int TEST = 0;
    143  uint8_t timeout = 10; // in Dezisekunden
    144  uint8_t block_buffer[MAX_BLOCK_SIZE + 3];
    145 
    146  // debug statistics
    147  uint32_t n_blocks_total = 0;
    148  uint32_t n_blocks_failed = 0;
    149 };
    150 
    151 
    152 #endif // USART_H
    -
    uint32_t getBaudrate(void)
    Definition: usart.cpp:307
    -
    uint8_t readByte(void)
    Definition: usart.cpp:211
    +
    1 #ifndef USART_H
    2 #define USART_H
    3 
    4 #include <iostream>
    5 #include <cstdint>
    6 #include <chrono>
    7 #include <unistd.h>
    8 #include <cstring>
    9 #include <fcntl.h>
    10 #include <sys/ioctl.h>
    11 #include <termios.h>
    12 #include <cmath>
    13 #include "usartexception.h"
    14 #include "timeoutexception.h"
    15 
    18 class USART
    19 {
    20 public:
    21 
    22  /*************************************************
    23  * Methoden für die Verwaltung der Schnittstelle *
    24  *************************************************/
    25 
    31  void openDevice(std::string device);
    32 
    37  void closeDevice(void);
    38 
    43  void clearInputBuffer(void);
    44 
    49  void clearOutputBuffer(void);
    50 
    55  void flushOutputBuffer(void);
    56 
    60  void printStatistics(void);
    61 
    62  /*************************************************/
    63 
    64 
    65 
    66  /*************************************
    67  * Methoden für die Datenübertragung *
    68  *************************************/
    69 
    75  void writeByte(uint8_t b);
    76 
    82  void writeInt(uint16_t d);
    83 
    89  void writeU32(uint32_t d);
    90 
    95  uint8_t readByte(void);
    96 
    101  uint16_t readInt(void);
    102 
    103  int read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
    104  int write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
    105  void writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len);
    106  bool readBlock(uint8_t* buffer, uint16_t offset);
    107 
    108  /*************************************/
    109 
    110 
    111 
    112  /***************************************
    113  * Methoden für einstellbare Parameter *
    114  ***************************************/
    115 
    120  uint32_t getBaudrate(void);
    121 
    126  uint8_t getTimeout(void);
    127 
    132  void setBaudrate(uint32_t baudrate);
    133 
    138  void setTimeout(uint8_t timeout);
    139 
    140  /***************************************/
    141 
    142  constexpr static uint8_t CRC7_POLY = 0x91;
    143  constexpr static uint8_t MAX_BLOCK_SIZE = 64;
    144  constexpr static uint8_t BLOCK_END = 0x80;
    145 private:
    146 
    147  int file_desc = -1; // Linux Dateideskriptor
    148  uint32_t baudrate = 9600; // Standard-Baudrate, sollte mit setBaudrate() überschrieben werden!
    149  int TEST = 0;
    150  uint8_t timeout = 10; // in Dezisekunden
    151  uint8_t block_buffer[MAX_BLOCK_SIZE + 3];
    152 
    153  // debug statistics
    154  uint32_t n_blocks_total = 0;
    155  uint32_t n_blocks_failed = 0;
    156 };
    157 
    158 
    159 #endif // USART_H
    +
    void writeU32(uint32_t d)
    Definition: usart.cpp:88
    +
    uint32_t getBaudrate(void)
    Definition: usart.cpp:312
    +
    uint8_t readByte(void)
    Definition: usart.cpp:216
    void printStatistics(void)
    Definition: usart.cpp:60
    void closeDevice(void)
    Definition: usart.cpp:32
    void clearInputBuffer(void)
    Definition: usart.cpp:39
    -
    uint8_t getTimeout(void)
    Definition: usart.cpp:312
    +
    uint8_t getTimeout(void)
    Definition: usart.cpp:317
    Definition: usart.h:18
    void clearOutputBuffer(void)
    Definition: usart.cpp:46
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:317
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:322
    void writeByte(uint8_t b)
    Definition: usart.cpp:67
    void openDevice(std::string device)
    Definition: usart.cpp:3
    -
    uint16_t readInt(void)
    Definition: usart.cpp:230
    -
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:322
    +
    uint16_t readInt(void)
    Definition: usart.cpp:235
    +
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:327
    void flushOutputBuffer(void)
    Definition: usart.cpp:53
    void writeInt(uint16_t d)
    Definition: usart.cpp:81
    diff --git a/docs/html/usartexception_8h_source.html b/docs/html/usartexception_8h_source.html index c067c44..d037b79 100644 --- a/docs/html/usartexception_8h_source.html +++ b/docs/html/usartexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/view_8cpp_source.html b/docs/html/view_8cpp_source.html index 0de8167..030d2a5 100644 --- a/docs/html/view_8cpp_source.html +++ b/docs/html/view_8cpp_source.html @@ -71,10 +71,10 @@ $(function() {
    1 #include "view.h"
    2 
    3 WINDOW* View::win = nullptr;
    4 
    5 View::View()
    6 {
    7  if(!win)
    8  {
    9  B15F::abort("View::win not initialized, missing context");
    10  }
    11  getmaxyx(win, height, width); // init width and height
    12  keypad(win, TRUE);
    13 }
    14 
    15 View::~View()
    16 {
    17 }
    18 
    19 void View::setWinContext(WINDOW* win)
    20 {
    21  View::win = win;
    22 }
    23 
    24 WINDOW* View::getWinContext()
    25 {
    26  return win;
    27 }
    28 
    29 // from: https://stackoverflow.com/a/37454181
    30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
    31 {
    32  std::vector<std::string> tokens;
    33  size_t prev = 0, pos = 0;
    34  do
    35  {
    36  pos = str.find(delim, prev);
    37  if (pos == std::string::npos) pos = str.length();
    38  std::string token = str.substr(prev, pos-prev);
    39  if (!token.empty()) tokens.push_back(token);
    40  prev = pos + delim.length();
    41  }
    42  while (pos < str.length() && prev < str.length());
    43  return tokens;
    44 }
    45 
    46 
    47 void View::setTitle(std::string title)
    48 {
    49  this->title = title;
    50 }
    51 
    52 void View::repaint()
    53 {
    54  // get screen size
    55  struct winsize size;
    56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
    57  throw std::runtime_error("TIOCGWINSZ error");
    58 
    59 
    60  start_x = floor((size.ws_col - width) / 2.);
    61  start_y = floor((size.ws_row - height) / 2.);
    62 
    63  curs_set(0); // hide cursor
    64  mvwin(win, start_y, start_x);
    65  clear();
    66  wclear(win);
    67 
    68  // generic draw
    69  box(win, 0, 0);
    70  int offset_x = (width - title.length()) / 2;
    71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
    72 
    73  // specific draw
    74  draw();
    75 
    76  refresh();
    77  wrefresh(win);
    78 }
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:327
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:368
    diff --git a/docs/html/view_8h_source.html b/docs/html/view_8h_source.html index 92e566e..8978a3e 100644 --- a/docs/html/view_8h_source.html +++ b/docs/html/view_8h_source.html @@ -74,7 +74,7 @@ $(function() {
    Definition: view.h:19
    diff --git a/docs/html/view__info_8cpp_source.html b/docs/html/view__info_8cpp_source.html index 2370daf..c9d1a98 100644 --- a/docs/html/view__info_8cpp_source.html +++ b/docs/html/view__info_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_info.h"
    2 
    3 ViewInfo::ViewInfo()
    4 {
    5  calls.push_back(nullptr);
    6 }
    7 
    8 void ViewInfo::setText(std::string text)
    9 {
    10  this->text = text;
    11 }
    12 
    13 void ViewInfo::setLabelClose(std::string label)
    14 {
    15  this->label_close = label;
    16 }
    17 
    18 void ViewInfo::setCall(call_t call)
    19 {
    20  calls[0] = call;
    21 }
    22 
    23 void ViewInfo::draw()
    24 {
    25  int li = 0;
    26  for(std::string line : str_split(text, "\n"))
    27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
    28 
    29  close_offset_x = (width - label_close.length()) / 2;
    30  close_offset_y = height - 2;
    31 
    32  wattron(win, A_REVERSE);
    33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
    34  wattroff(win, A_REVERSE);
    35 }
    36 
    37 call_t ViewInfo::keypress(int& key)
    38 {
    39  switch(key)
    40  {
    41 
    42  case KEY_MOUSE:
    43  {
    44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    45  MEVENT event;
    46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    47  {
    48  size_t column = start_x + close_offset_x;
    49  size_t row = start_y + close_offset_y;
    50  size_t mouse_x = event.x, mouse_y = event.y;
    51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    52  key = -1; // do return from view
    53  }
    54  break;
    55  }
    56  case KEY_ENT:
    57  key = -1; // do return from view
    58  break;
    59  default:
    60  break;
    61  }
    62  return calls[0];
    63 }
    diff --git a/docs/html/view__info_8h_source.html b/docs/html/view__info_8h_source.html index 992f9d7..4aaf34e 100644 --- a/docs/html/view__info_8h_source.html +++ b/docs/html/view__info_8h_source.html @@ -75,7 +75,7 @@ $(function() {
    Definition: view.h:19
    diff --git a/docs/html/view__monitor_8cpp_source.html b/docs/html/view__monitor_8cpp_source.html index 5c600ac..fa3a723 100644 --- a/docs/html/view__monitor_8cpp_source.html +++ b/docs/html/view__monitor_8cpp_source.html @@ -74,17 +74,17 @@ $(function() {
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:292
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:302
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:333
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:343
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:327
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:368
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    void reconnect(void)
    Definition: b15f.cpp:57
    diff --git a/docs/html/view__monitor_8h_source.html b/docs/html/view__monitor_8h_source.html index 0c48289..c050394 100644 --- a/docs/html/view__monitor_8h_source.html +++ b/docs/html/view__monitor_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/view__promt_8cpp_source.html b/docs/html/view__promt_8cpp_source.html index cef242a..0e91d6e 100644 --- a/docs/html/view__promt_8cpp_source.html +++ b/docs/html/view__promt_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_promt.h"
    2 
    3 void ViewPromt::draw()
    4 {
    5  curs_set(1); // show cursor
    6 
    7  int li = text_offset_y;
    8  int ci = 0;
    9  for(std::string line : str_split(message + input, "\n"))
    10  {
    11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
    12  ci = line.length() + text_offset_x;
    13  }
    14 
    15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
    16  button_offset_y = height - text_offset_y;
    17 
    18  if(selection == 0)
    19  {
    20  wattron(win, A_REVERSE);
    21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    22  wattroff(win, A_REVERSE);
    23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    25  }
    26  else
    27  {
    28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    30  wattron(win, A_REVERSE);
    31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    32  wattroff(win, A_REVERSE);
    33  }
    34  wmove(win, li, ci);
    35 }
    36 
    37 void ViewPromt::setMessage(std::string message)
    38 {
    39  this->message = message;
    40 }
    41 
    42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
    43 {
    44  label_confirm = name;
    45  call_confirm = call;
    46 }
    47 
    48 void ViewPromt::setCancel(std::string name, bool cancelable)
    49 {
    50  label_cancel = name;
    51  this->cancelable = cancelable;
    52 }
    53 
    54 std::string ViewPromt::getInput()
    55 {
    56  return input;
    57 }
    58 
    59 std::function<void(int)> ViewPromt::keypress(int& key)
    60 {
    61  std::function<void(int)> ret = nullptr;
    62  switch(key)
    63  {
    64  case KEY_BACKSPACE:
    65  if(input.length())
    66  input.pop_back();
    67  break;
    68  case '\t':
    69  case KEY_LEFT:
    70  case KEY_RIGHT:
    71  selection = (selection + 1 ) % 2;
    72  break;
    73  case KEY_MOUSE:
    74  {
    75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    76  MEVENT event;
    77  bool hit = false;
    78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    79  {
    80  size_t column_start = start_x + button_offset_x;
    81  size_t row_start = start_y + button_offset_y;
    82  size_t mouse_x = event.x, mouse_y = event.y;
    83  if(mouse_y == row_start)
    84  {
    85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
    86  {
    87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    88  hit = true;
    89  selection = 0;
    90  }
    91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
    92  {
    93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    94  hit = true;
    95  selection = 1;
    96  }
    97  }
    98  }
    99  if(!hit)
    100  break;
    101 
    102  // fall through to next case
    103  [[fallthrough]];
    104  }
    105  case KEY_ENT:
    106  if(selection == 0) // exit
    107  key = -1; // do return from view
    108  else
    109  ret = call_confirm;
    110  break;
    111  default:
    112  break;
    113  }
    114 
    115  if(key >= ' ' && key <= '~')
    116  input += (char) key;
    117 
    118  if(key != KEY_ENT)
    119  repaint();
    120  return ret;
    121 }
    diff --git a/docs/html/view__promt_8h_source.html b/docs/html/view__promt_8h_source.html index df2d726..6acbb7b 100644 --- a/docs/html/view__promt_8h_source.html +++ b/docs/html/view__promt_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/view__selection_8cpp_source.html b/docs/html/view__selection_8cpp_source.html index bd16c53..d78a6f9 100644 --- a/docs/html/view__selection_8cpp_source.html +++ b/docs/html/view__selection_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_selection.h"
    2 
    3 void ViewSelection::draw()
    4 {
    5  //curs_set(0); // hide cursor
    6  for(size_t i = 0; i < choices.size(); i++)
    7  {
    8  if(selection == i)
    9  wattron(win, A_REVERSE);
    10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
    11  if(selection == i)
    12  wattroff(win, A_REVERSE);
    13  }
    14 }
    15 
    16 void ViewSelection::addChoice(std::string name, call_t call)
    17 {
    18  choices.push_back(name);
    19  calls.push_back(call);
    20 }
    21 
    22 call_t ViewSelection::keypress(int& key)
    23 {
    24  call_t ret = nullptr;
    25  switch(key)
    26  {
    27  case KEY_UP:
    28  do
    29  selection = (selection - 1 + choices.size()) % choices.size();
    30  while(!choices[selection].length() && choices.size());
    31  break;
    32 
    33  case '\t':
    34  case KEY_DOWN:
    35  do
    36  selection = (selection + 1) % choices.size();
    37  while(!choices[selection].length() && choices.size());
    38  break;
    39 
    40  case KEY_MOUSE:
    41  {
    42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    43  MEVENT event;
    44  bool hit = false;
    45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    46  {
    47  size_t column_start = start_x + choice_offset_x;
    48  size_t row_start = start_y + choice_offset_y;
    49  size_t mouse_x = event.x, mouse_y = event.y;
    50  for(size_t i = 0; i < choices.size(); i++)
    51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
    52  {
    53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
    54  hit = true;
    55  selection = i;
    56  }
    57  }
    58  if(!hit)
    59  break;
    60 
    61  // fall through to next case
    62  [[fallthrough]];
    63  }
    64 
    65  case KEY_ENT:
    66  if(selection == choices.size() - 1) // exit
    67  key = -1; // do return from view
    68  else
    69  ret = calls[selection];
    70  break;
    71  default:
    72  break;
    73  }
    74  repaint();
    75  return ret;
    76 }
    diff --git a/docs/html/view__selection_8h_source.html b/docs/html/view__selection_8h_source.html index ece3b9c..19bac8c 100644 --- a/docs/html/view__selection_8h_source.html +++ b/docs/html/view__selection_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/firmware/global_vars.cpp b/firmware/global_vars.cpp index 1359c7e..7297949 100644 --- a/firmware/global_vars.cpp +++ b/firmware/global_vars.cpp @@ -8,4 +8,5 @@ volatile TLC5615 dac0(spi, SPIADR::AA0); volatile TLC5615 dac1(spi, SPIADR::AA1); volatile ADU adu; volatile USART usart; +volatile PWM pwm; volatile bool nextRequest = false; diff --git a/firmware/global_vars.h b/firmware/global_vars.h index 749948c..218f50e 100644 --- a/firmware/global_vars.h +++ b/firmware/global_vars.h @@ -5,6 +5,7 @@ #include "tlc5615.h" #include "adu.h" #include "usart.h" +#include "pwm.h" #define WDT_TIMEOUT WDTO_15MS @@ -17,6 +18,7 @@ extern volatile TLC5615 dac0; extern volatile TLC5615 dac1; extern volatile ADU adu; extern volatile USART usart; +extern volatile PWM pwm; extern volatile bool nextRequest; #endif // GLOBAL_VARS_H diff --git a/firmware/main.cpp b/firmware/main.cpp index 59cd64b..96f004f 100644 --- a/firmware/main.cpp +++ b/firmware/main.cpp @@ -28,6 +28,8 @@ int main() usart.init(); usart.initRX(); + + pwm.init(); // Hauptschleife, Verarbeitung der Requests while(1) diff --git a/firmware/pwm.cpp b/firmware/pwm.cpp index 0716236..f747725 100644 --- a/firmware/pwm.cpp +++ b/firmware/pwm.cpp @@ -1,18 +1,32 @@ #include "pwm.h" +const uint16_t PWM::PRESCALERS[] = {0, 1, 8, 64, 256, 1024}; +const uint8_t PWM::PRESCALER_COUNT = sizeof(PRESCALERS) / sizeof(uint16_t); -void pwmSetFrequency(uint32_t freq) +void PWM::init() const volatile { + // fast pwm mode, top = OCR0A, non inverting mode TCCR0A = _BV(COM0B1) | _BV(WGM00) | _BV(WGM01); - DDRB |= _BV(PB4); + TCCR0B = _BV(WGM02); - uint16_t p_ideal = ceil(float(F_CPU) / (freq * 0x100)); - for(int8_t i = PWM_PRESCALER_COUNT - 1; i >= 0 && PWM_PRESCALERS[i] >= p_ideal; i--) - TCCR0B = _BV(WGM02) | i; // set prescaler - if(p_ideal) - OCR0A = (uint8_t) (float(F_CPU) / (freq * PWM_PRESCALERS[TCCR0B & 0x07])); + // output signal on PB4 + DDRB |= _BV(PB4); } -void pwmSetValue(uint8_t value) +void PWM::setFrequency(uint32_t freq) const volatile +{ + uint16_t p_ideal = ceil(float(F_CPU) / (freq * 0x100)); + for(int8_t i = PRESCALER_COUNT - 1; i >= 0 && PRESCALERS[i] >= p_ideal; i--) + TCCR0B = (TCCR0B & 0xF8) | i; // set prescaler + if(p_ideal) + OCR0A = (uint8_t) (float(F_CPU) / (freq * PRESCALERS[TCCR0B & 0x07])); +} + +void PWM::setValue(uint8_t value) const volatile { OCR0B = value; } + +uint8_t PWM::getTop() const volatile +{ + return OCR0A; +} diff --git a/firmware/pwm.h b/firmware/pwm.h index a42e11b..dcf0d63 100644 --- a/firmware/pwm.h +++ b/firmware/pwm.h @@ -4,10 +4,17 @@ #include #include -const uint16_t PWM_PRESCALERS[] = {0, 1, 8, 64, 256, 1024}; -const uint8_t PWM_PRESCALER_COUNT = sizeof(PWM_PRESCALERS) / sizeof(uint16_t); - -void pwmSetFrequency(uint32_t); -void pwmSetValue(uint8_t); +class PWM +{ +public: + void init(void) const volatile; + void setFrequency(uint32_t) const volatile; + void setValue(uint8_t) const volatile; + uint8_t getTop(void) const volatile; + +private: + const static uint16_t PRESCALERS[]; + const static uint8_t PRESCALER_COUNT; +}; #endif // PWM_H diff --git a/firmware/requests.cpp b/firmware/requests.cpp index 0d11d3f..55f5cf6 100644 --- a/firmware/requests.cpp +++ b/firmware/requests.cpp @@ -62,6 +62,14 @@ void handleRequest() case RQ_ADC_DAC_STROKE: rqAdcDacStroke(); break; + + case RQ_PWM_SET_FREQ: + rqPwmSetFreq(); + break; + + case RQ_PWM_SET_VALUE: + rqPwmSetValue(); + break; default: break; @@ -217,11 +225,21 @@ void rqAdcDacStroke() usart.flush(); } -void rqSetPwm() +void rqPwmSetFreq() +{ + usart.initTX(); + uint32_t freq = usart.readU32(); + pwm.setFrequency(freq); + + usart.writeByte(pwm.getTop()); + usart.flush(); +} + +void rqPwmSetValue() { usart.initTX(); uint16_t value = usart.readByte(); - OCR0A = value; + pwm.setValue(value); usart.writeByte(USART::MSG_OK); usart.flush(); diff --git a/firmware/requests.h b/firmware/requests.h index 6fd3012..418b003 100644 --- a/firmware/requests.h +++ b/firmware/requests.h @@ -21,7 +21,8 @@ constexpr static uint8_t RQ_AA0 = 10; constexpr static uint8_t RQ_AA1 = 11; constexpr static uint8_t RQ_ADC = 12; constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; -constexpr static uint8_t RQ_SET_PWM = 14; +constexpr static uint8_t RQ_PWM_SET_FREQ = 14; +constexpr static uint8_t RQ_PWM_SET_VALUE = 15; uint8_t const rq_len[] = { /* RQ_DISC */ 1, @@ -38,7 +39,8 @@ uint8_t const rq_len[] = { /* RQ_AA1 */ 3, /* RQ_ADC */ 2, /* RQ_ADC_DAC_STROKE */ 9, - /* RQ_SET_PWM */ 2 + /* RQ_PWM_SET_FREQ */ 5, + /* RQ_PWM_SET_VALUE */ 2 }; /** @@ -61,6 +63,7 @@ void rqAnalogWrite0(void); void rqAnalogWrite1(void); void rqAnalogRead(void); void rqAdcDacStroke(void); -void rqSetPwm(void); +void rqPwmSetFreq(void); +void rqPwmSetValue(void); #endif // REQUESTS_H diff --git a/firmware/usart.cpp b/firmware/usart.cpp index d039fcf..8be2392 100644 --- a/firmware/usart.cpp +++ b/firmware/usart.cpp @@ -130,3 +130,10 @@ uint16_t USART::readInt() volatile v |= readByte() << 8; return v; } + +uint32_t USART::readU32() volatile +{ + uint32_t v = readInt(); + v |= ((uint32_t) readInt()) << 16; + return v; +} diff --git a/firmware/usart.h b/firmware/usart.h index 5505a1b..a6cd610 100644 --- a/firmware/usart.h +++ b/firmware/usart.h @@ -102,6 +102,12 @@ public: * \return gelesenes Integer */ uint16_t readInt(void) volatile; + + /** + * Liest ein uint32_t aus dem Eingangspuffer + * \return gelesenes uint32_t + */ + uint32_t readU32(void) volatile; /**********************/ From 2e88b9c9806ba44b0ec58449e2c91cba9ebb60b9 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Wed, 29 May 2019 10:13:36 +0200 Subject: [PATCH 07/35] remote set and get register by address --- control/examples/register/Makefile | 30 + control/examples/register/main.cpp | 35 + control/src/drv/b15f.cpp | 40 + control/src/drv/b15f.h | 24 +- docs/atmegaiom1284p.h | 1219 +++++++++++++++++ docs/html/annotated.html | 2 +- docs/html/b15f_8cpp_source.html | 28 +- docs/html/b15f_8h_source.html | 32 +- docs/html/classB15F-members.html | 24 +- docs/html/classB15F.html | 95 +- docs/html/classDot-members.html | 2 +- docs/html/classDot.html | 2 +- docs/html/classDriverException-members.html | 2 +- docs/html/classDriverException.html | 2 +- docs/html/classPlottyFile-members.html | 2 +- docs/html/classPlottyFile.html | 2 +- docs/html/classTimeoutException-members.html | 2 +- docs/html/classTimeoutException.html | 2 +- docs/html/classUSART-members.html | 2 +- docs/html/classUSART.html | 2 +- docs/html/classUSARTException-members.html | 2 +- docs/html/classUSARTException.html | 2 +- docs/html/classView-members.html | 2 +- docs/html/classView.html | 2 +- docs/html/classViewInfo-members.html | 2 +- docs/html/classViewInfo.html | 2 +- docs/html/classViewMonitor-members.html | 2 +- docs/html/classViewMonitor.html | 2 +- docs/html/classViewPromt-members.html | 2 +- docs/html/classViewPromt.html | 2 +- docs/html/classViewSelection-members.html | 2 +- docs/html/classViewSelection.html | 2 +- docs/html/classes.html | 2 +- docs/html/cli_8cpp_source.html | 6 +- .../dir_1788f8309b1a812dcb800a185471cf6c.html | 2 +- .../dir_587c94d866dbb2f408f78cf41f9b2f8d.html | 2 +- docs/html/dot_8cpp_source.html | 2 +- docs/html/dot_8h_source.html | 2 +- docs/html/driverexception_8h_source.html | 2 +- docs/html/files.html | 2 +- docs/html/functions.html | 8 +- docs/html/functions_func.html | 8 +- docs/html/functions_vars.html | 2 +- docs/html/hierarchy.html | 2 +- docs/html/index.html | 2 +- docs/html/plottyfile_8cpp_source.html | 2 +- docs/html/plottyfile_8h_source.html | 2 +- docs/html/search/all_6.js | 1 + docs/html/search/all_b.js | 1 + docs/html/search/functions_5.js | 1 + docs/html/search/functions_9.js | 1 + docs/html/timeoutexception_8h_source.html | 2 +- docs/html/ui_8cpp_source.html | 8 +- docs/html/ui_8h_source.html | 2 +- docs/html/usart_8cpp_source.html | 2 +- docs/html/usart_8h_source.html | 2 +- docs/html/usartexception_8h_source.html | 2 +- docs/html/view_8cpp_source.html | 4 +- docs/html/view_8h_source.html | 2 +- docs/html/view__info_8cpp_source.html | 2 +- docs/html/view__info_8h_source.html | 2 +- docs/html/view__monitor_8cpp_source.html | 8 +- docs/html/view__monitor_8h_source.html | 2 +- docs/html/view__promt_8cpp_source.html | 2 +- docs/html/view__promt_8h_source.html | 2 +- docs/html/view__selection_8cpp_source.html | 2 +- docs/html/view__selection_8h_source.html | 2 +- firmware/requests.cpp | 29 + firmware/requests.h | 14 +- 69 files changed, 1595 insertions(+), 117 deletions(-) create mode 100644 control/examples/register/Makefile create mode 100644 control/examples/register/main.cpp create mode 100644 docs/atmegaiom1284p.h diff --git a/control/examples/register/Makefile b/control/examples/register/Makefile new file mode 100644 index 0000000..8000d6e --- /dev/null +++ b/control/examples/register/Makefile @@ -0,0 +1,30 @@ +# Name: Makefile +# Project: B15F (board15 Famulus Edition) +# Author: Tristan Krause +# Creation Date: 2019-05-15 + +# Environment +COMPILER_PATH = g++ + +# Options +CFLAGS = -std=c++17 -O3 -Wall -Wextra +LDFLAGS = -lb15fdrv +OBJECTS = main.o +OUT = main.elf + +COMPILE = $(COMPILER_PATH) $(CFLAGS) + +main: $(OBJECTS) + $(COMPILE) $(OBJECTS) -o $(OUT) $(LDFLAGS) + +help: + @echo "This Makefile has the following targets:" + @echo "make main .... to compile" + @echo "make clean ... to delete objects and executables" + +clean: + @echo "Cleaning..." + rm -f $(OBJECTS) $(OUT) *.bin gnuplotscript.gp + +.cpp.o: + $(COMPILE) -c $< -o $@ diff --git a/control/examples/register/main.cpp b/control/examples/register/main.cpp new file mode 100644 index 0000000..27a15ba --- /dev/null +++ b/control/examples/register/main.cpp @@ -0,0 +1,35 @@ +#include +#include +#include +#include + +const char PLOT_FILE[] = "plot.bin"; + +constexpr uint8_t SFR_OFFSET = 0x20; +constexpr uint8_t SFR_DDRB = 0x04; +constexpr uint8_t SFR_WDTCSR = 0x60; +constexpr uint8_t SFR_PORTB = 0x05; + +/* + * Dieses Beispiel erzeugt einen 300ms langen Impuls an PB0. + * + */ +int main() +{ + uint8_t DDRB, PORTB; + B15F& drv = B15F::getInstance(); + + DDRB = drv.getRegister(SFR_DDRB + SFR_OFFSET); + DDRB |= (1<<0); + drv.setRegister(SFR_DDRB + SFR_OFFSET, DDRB); + + PORTB = drv.getRegister(SFR_PORTB + SFR_OFFSET); + PORTB |= (1<<0); + drv.setRegister(SFR_PORTB + SFR_OFFSET, PORTB); + + drv.delay_ms(300); + + PORTB = drv.getRegister(SFR_PORTB + SFR_OFFSET); + PORTB &= ~(1<<0); + drv.setRegister(SFR_PORTB + SFR_OFFSET, PORTB); +} diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index 56cb2ed..0c1f736 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -330,6 +330,46 @@ bool B15F::pwmSetValue(uint8_t value) return aw == MSG_OK; } +bool B15F::setRegister(uint8_t adr, uint8_t val) +{ + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_SET_REG, + adr, + val + }; + + int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000); + if(n_sent != sizeof(rq)) + abort("Sent failed"); + + uint8_t byte = usart.readByte(); + delay_us(10); + return byte == val; +} + +uint8_t B15F::getRegister(uint8_t adr) +{ + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_GET_REG, + adr + }; + + int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000); + if(n_sent != sizeof(rq)) + abort("Sent failed"); + + uint8_t aw = usart.readByte(); + delay_us(10); + return aw; +} + + void B15F::delay_ms(uint16_t ms) { std::this_thread::sleep_for(std::chrono::milliseconds(ms)); diff --git a/control/src/drv/b15f.h b/control/src/drv/b15f.h index 1b011ea..bedca64 100644 --- a/control/src/drv/b15f.h +++ b/control/src/drv/b15f.h @@ -210,6 +210,22 @@ public: */ bool pwmSetValue(uint8_t value); + /** + * Setzt direkt den Wert eines MCU Registers. + * *Wichtig:* bei einer falschen Adresse kann das Board 15 ernsthaften Schaden nehmen! + * \param adr Speicheradresse des Registers + * \param val Neuer Wert für das Register + * \throws DriverException + */ + bool setRegister(uint8_t adr, uint8_t val); + + /** + * Liefert den Wert eines MCU Registers. + * \param adr Speicheradresse des Registers + * \throws DriverException + */ + uint8_t getRegister(uint8_t adr); + /*************************/ @@ -248,9 +264,11 @@ private: constexpr static uint8_t RQ_AA0 = 10; constexpr static uint8_t RQ_AA1 = 11; constexpr static uint8_t RQ_ADC = 12; - constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; - constexpr static uint8_t RQ_PWM_SET_FREQ = 14; - constexpr static uint8_t RQ_PWM_SET_VALUE = 15; + constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; + constexpr static uint8_t RQ_PWM_SET_FREQ = 14; + constexpr static uint8_t RQ_PWM_SET_VALUE = 15; + constexpr static uint8_t RQ_SET_REG = 16; + constexpr static uint8_t RQ_GET_REG = 17; }; #endif // B15F_H diff --git a/docs/atmegaiom1284p.h b/docs/atmegaiom1284p.h new file mode 100644 index 0000000..905029d --- /dev/null +++ b/docs/atmegaiom1284p.h @@ -0,0 +1,1219 @@ +/* Copyright (c) 2007 Atmel Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* $Id: iom1284p.h 2225 2011-03-02 16:27:26Z arcanum $ */ + +/* avr/iom1284p.h - definitions for ATmega1284P. */ + +/* This file should only be included from , never directly. */ + +#ifndef _AVR_IO_H_ +# error "Include instead of this file." +#endif + +#ifndef _AVR_IOXXX_H_ +# define _AVR_IOXXX_H_ "iom1284p.h" +#else +# error "Attempt to include more than one file." +#endif + + +#ifndef _AVR_IOM1284P_H_ +#define _AVR_IOM1284P_H_ 1 + + +/* Registers and associated bit numbers */ + +#define PINA _SFR_IO8(0x00) +#define PINA0 0 +#define PINA1 1 +#define PINA2 2 +#define PINA3 3 +#define PINA4 4 +#define PINA5 5 +#define PINA6 6 +#define PINA7 7 + +#define DDRA _SFR_IO8(0x01) +#define DDA0 0 +#define DDA1 1 +#define DDA2 2 +#define DDA3 3 +#define DDA4 4 +#define DDA5 5 +#define DDA6 6 +#define DDA7 7 + +#define PORTA _SFR_IO8(0x02) +#define PORTA0 0 +#define PORTA1 1 +#define PORTA2 2 +#define PORTA3 3 +#define PORTA4 4 +#define PORTA5 5 +#define PORTA6 6 +#define PORTA7 7 + +#define PINB _SFR_IO8(0x03) +#define PINB0 0 +#define PINB1 1 +#define PINB2 2 +#define PINB3 3 +#define PINB4 4 +#define PINB5 5 +#define PINB6 6 +#define PINB7 7 + +#define DDRB _SFR_IO8(0x04) +#define DDB0 0 +#define DDB1 1 +#define DDB2 2 +#define DDB3 3 +#define DDB4 4 +#define DDB5 5 +#define DDB6 6 +#define DDB7 7 + +#define PORTB _SFR_IO8(0x05) +#define PORTB0 0 +#define PORTB1 1 +#define PORTB2 2 +#define PORTB3 3 +#define PORTB4 4 +#define PORTB5 5 +#define PORTB6 6 +#define PORTB7 7 + +#define PINC _SFR_IO8(0x06) +#define PINC0 0 +#define PINC1 1 +#define PINC2 2 +#define PINC3 3 +#define PINC4 4 +#define PINC5 5 +#define PINC6 6 +#define PINC7 7 + +#define DDRC _SFR_IO8(0x07) +#define DDC0 0 +#define DDC1 1 +#define DDC2 2 +#define DDC3 3 +#define DDC4 4 +#define DDC5 5 +#define DDC6 6 +#define DDC7 7 + +#define PORTC _SFR_IO8(0x08) +#define PORTC0 0 +#define PORTC1 1 +#define PORTC2 2 +#define PORTC3 3 +#define PORTC4 4 +#define PORTC5 5 +#define PORTC6 6 +#define PORTC7 7 + +#define PIND _SFR_IO8(0x09) +#define PIND0 0 +#define PIND1 1 +#define PIND2 2 +#define PIND3 3 +#define PIND4 4 +#define PIND5 5 +#define PIND6 6 +#define PIND7 7 + +#define DDRD _SFR_IO8(0x0A) +#define DDD0 0 +#define DDD1 1 +#define DDD2 2 +#define DDD3 3 +#define DDD4 4 +#define DDD5 5 +#define DDD6 6 +#define DDD7 7 + +#define PORTD _SFR_IO8(0x0B) +#define PORTD0 0 +#define PORTD1 1 +#define PORTD2 2 +#define PORTD3 3 +#define PORTD4 4 +#define PORTD5 5 +#define PORTD6 6 +#define PORTD7 7 + +#define TIFR0 _SFR_IO8(0x15) +#define TOV0 0 +#define OCF0A 1 +#define OCF0B 2 + +#define TIFR1 _SFR_IO8(0x16) +#define TOV1 0 +#define OCF1A 1 +#define OCF1B 2 +#define ICF1 5 + +#define TIFR2 _SFR_IO8(0x17) +#define TOV2 0 +#define OCF2A 1 +#define OCF2B 2 + +#define TIFR3 _SFR_IO8(0x18) +#define TOV3 0 +#define OCF3A 1 +#define OCF3B 2 +#define ICF3 5 + +#define PCIFR _SFR_IO8(0x1B) +#define PCIF0 0 +#define PCIF1 1 +#define PCIF2 2 +#define PCIF3 3 + +#define EIFR _SFR_IO8(0x1C) +#define INTF0 0 +#define INTF1 1 +#define INTF2 2 + +#define EIMSK _SFR_IO8(0x1D) +#define INT0 0 +#define INT1 1 +#define INT2 2 + +#define GPIOR0 _SFR_IO8(0x1E) +#define GPIOR00 0 +#define GPIOR01 1 +#define GPIOR02 2 +#define GPIOR03 3 +#define GPIOR04 4 +#define GPIOR05 5 +#define GPIOR06 6 +#define GPIOR07 7 + +#define EECR _SFR_IO8(0x1F) +#define EERE 0 +#define EEPE 1 +#define EEMPE 2 +#define EERIE 3 +#define EEPM0 4 +#define EEPM1 5 + +#define EEDR _SFR_IO8(0x20) +#define EEDR0 0 +#define EEDR1 1 +#define EEDR2 2 +#define EEDR3 3 +#define EEDR4 4 +#define EEDR5 5 +#define EEDR6 6 +#define EEDR7 7 + +#define EEAR _SFR_IO16(0x21) + +#define EEARL _SFR_IO8(0x21) +#define EEAR0 0 +#define EEAR1 1 +#define EEAR2 2 +#define EEAR3 3 +#define EEAR4 4 +#define EEAR5 5 +#define EEAR6 6 +#define EEAR7 7 + +#define EEARH _SFR_IO8(0x22) +#define EEAR8 0 +#define EEAR9 1 +#define EEAR10 2 +#define EEAR11 3 + +#define GTCCR _SFR_IO8(0x23) +#define PSRSYNC 0 +#define PSRASY 1 +#define TSM 7 + +#define TCCR0A _SFR_IO8(0x24) +#define WGM00 0 +#define WGM01 1 +#define COM0B0 4 +#define COM0B1 5 +#define COM0A0 6 +#define COM0A1 7 + +#define TCCR0B _SFR_IO8(0x25) +#define CS00 0 +#define CS01 1 +#define CS02 2 +#define WGM02 3 +#define FOC0B 6 +#define FOC0A 7 + +#define TCNT0 _SFR_IO8(0x26) +#define TCNT0_0 0 +#define TCNT0_1 1 +#define TCNT0_2 2 +#define TCNT0_3 3 +#define TCNT0_4 4 +#define TCNT0_5 5 +#define TCNT0_6 6 +#define TCNT0_7 7 + +#define OCR0A _SFR_IO8(0x27) +#define OCR0A_0 0 +#define OCR0A_1 1 +#define OCR0A_2 2 +#define OCR0A_3 3 +#define OCR0A_4 4 +#define OCR0A_5 5 +#define OCR0A_6 6 +#define OCR0A_7 7 + +#define OCR0B _SFR_IO8(0x28) +#define OCR0B_0 0 +#define OCR0B_1 1 +#define OCR0B_2 2 +#define OCR0B_3 3 +#define OCR0B_4 4 +#define OCR0B_5 5 +#define OCR0B_6 6 +#define OCR0B_7 7 + +#define GPIOR1 _SFR_IO8(0x2A) +#define GPIOR10 0 +#define GPIOR11 1 +#define GPIOR12 2 +#define GPIOR13 3 +#define GPIOR14 4 +#define GPIOR15 5 +#define GPIOR16 6 +#define GPIOR17 7 + +#define GPIOR2 _SFR_IO8(0x2B) +#define GPIOR20 0 +#define GPIOR21 1 +#define GPIOR22 2 +#define GPIOR23 3 +#define GPIOR24 4 +#define GPIOR25 5 +#define GPIOR26 6 +#define GPIOR27 7 + +#define SPCR _SFR_IO8(0x2C) +#define SPR0 0 +#define SPR1 1 +#define CPHA 2 +#define CPOL 3 +#define MSTR 4 +#define DORD 5 +#define SPE 6 +#define SPIE 7 + +#define SPSR _SFR_IO8(0x2D) +#define SPI2X 0 +#define WCOL 6 +#define SPIF 7 + +#define SPDR _SFR_IO8(0x2E) +#define SPDR0 0 +#define SPDR1 1 +#define SPDR2 2 +#define SPDR3 3 +#define SPDR4 4 +#define SPDR5 5 +#define SPDR6 6 +#define SPDR7 7 + +#define ACSR _SFR_IO8(0x30) +#define ACIS0 0 +#define ACIS1 1 +#define ACIC 2 +#define ACIE 3 +#define ACI 4 +#define ACO 5 +#define ACBG 6 +#define ACD 7 + +#define OCDR _SFR_IO8(0x31) +#define OCDR0 0 +#define OCDR1 1 +#define OCDR2 2 +#define OCDR3 3 +#define OCDR4 4 +#define OCDR5 5 +#define OCDR6 6 +#define OCDR7 7 + +#define SMCR _SFR_IO8(0x33) +#define SE 0 +#define SM0 1 +#define SM1 2 +#define SM2 3 + +#define MCUSR _SFR_IO8(0x34) +#define PORF 0 +#define EXTRF 1 +#define BORF 2 +#define WDRF 3 +#define JTRF 4 + +#define MCUCR _SFR_IO8(0x35) +#define IVCE 0 +#define IVSEL 1 +#define PUD 4 +#define BODSE 5 +#define BODS 6 +#define JTD 7 + +#define SPMCSR _SFR_IO8(0x37) +#define SPMEN 0 +#define PGERS 1 +#define PGWRT 2 +#define BLBSET 3 +#define RWWSRE 4 +#define SIGRD 5 +#define RWWSB 6 +#define SPMIE 7 + +#define RAMPZ _SFR_IO8(0x3B) +#define RAMPZ0 0 + +#define WDTCSR _SFR_MEM8(0x60) +#define WDP0 0 +#define WDP1 1 +#define WDP2 2 +#define WDE 3 +#define WDCE 4 +#define WDP3 5 +#define WDIE 6 +#define WDIF 7 + +#define CLKPR _SFR_MEM8(0x61) +#define CLKPS0 0 +#define CLKPS1 1 +#define CLKPS2 2 +#define CLKPS3 3 +#define CLKPCE 7 + +#define PRR0 _SFR_MEM8(0x64) +#define PRADC 0 +#define PRUSART0 1 +#define PRSPI 2 +#define PRTIM1 3 +#define PRUSART1 4 +#define PRTIM0 5 +#define PRTIM2 6 +#define PRTWI 7 + +#define __AVR_HAVE_PRR0 ((1< diff --git a/docs/html/b15f_8cpp_source.html b/docs/html/b15f_8cpp_source.html index dd5733f..a76179c 100644 --- a/docs/html/b15f_8cpp_source.html +++ b/docs/html/b15f_8cpp_source.html @@ -70,48 +70,50 @@ $(function() {
    b15f.cpp
    -
    1 #include "b15f.h"
    2 
    3 B15F* B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos)
    16  device.pop_back();
    17 
    18  if(device.length() == 0)
    19  abort("Adapter nicht gefunden");
    20 
    21  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    22 
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31 
    32  std::cout << PRE << "Teste Verbindung... " << std::flush;
    33  uint8_t tries = 3;
    34  while(tries--)
    35  {
    36  // verwerfe Daten, die µC noch hat
    37  //discard();
    38 
    39  if(!testConnection())
    40  continue;
    41 
    42  if(!testIntConv())
    43  continue;
    44 
    45  break;
    46  }
    47  if(tries == 0)
    48  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    49  std::cout << "OK" << std::endl;
    50 
    51 
    52  // Gib board info aus
    53  std::vector<std::string> info = getBoardInfo();
    54  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while(tries--)
    61  {
    63  discard();
    64 
    65  if(testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  usart.clearOutputBuffer();
    77  for(uint8_t i = 0; i < 16; i++)
    78  {
    79  usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input)
    80  delay_ms(4);
    81  }
    82  usart.clearInputBuffer();
    83  }
    84  catch(std::exception& ex)
    85  {
    86  abort(ex);
    87  }
    88 }
    89 
    91 {
    92  // erzeuge zufälliges Byte
    93  srand(time(NULL));
    94  uint8_t dummy = rand() % 256;
    95 
    96  usart.writeByte(RQ_TEST);
    97  usart.writeByte(dummy);
    98 
    99  uint8_t aw = usart.readByte();
    100  uint8_t mirror = usart.readByte();
    101 
    102  return aw == MSG_OK && mirror == dummy;
    103 }
    104 
    106 {
    107  srand(time(NULL));
    108  uint16_t dummy = rand() % (0xFFFF / 3);
    109 
    110  usart.writeByte(RQ_INT);
    111  usart.writeInt(dummy);
    112 
    113  uint16_t aw = usart.readInt();
    114  return aw == dummy * 3;
    115 }
    116 
    117 
    118 std::vector<std::string> B15F::getBoardInfo(void)
    119 {
    120  std::vector<std::string> info;
    121 
    122  usart.writeByte(RQ_INFO);
    123 
    124  uint8_t n = usart.readByte();
    125  while(n--)
    126  {
    127  uint8_t len = usart.readByte();
    128  std::string str;
    129 
    130  while(len--)
    131  {
    132  str += static_cast<char>(usart.readByte());
    133  }
    134 
    135  info.push_back(str);
    136  }
    137 
    138  uint8_t aw = usart.readByte();
    139  if(aw != MSG_OK)
    140  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    141 
    142  return info;
    143 }
    144 
    146 {
    147  usart.writeByte(RQ_ST);
    148 
    149  uint8_t aw = usart.readByte();
    150  return aw == MSG_OK;
    151 }
    152 
    153 bool B15F::digitalWrite0(uint8_t port)
    154 {
    155  usart.writeByte(RQ_BA0);
    156  usart.writeByte(port);
    157 
    158  uint8_t aw = usart.readByte();
    159  delay_us(10);
    160  return aw == MSG_OK;
    161 }
    162 
    163 bool B15F::digitalWrite1(uint8_t port)
    164 {
    165  usart.writeByte(RQ_BA1);
    166  usart.writeByte(port);
    167 
    168  uint8_t aw = usart.readByte();
    169  delay_us(10);
    170  return aw == MSG_OK;
    171 }
    172 
    174 {
    175  usart.clearInputBuffer();
    176  usart.writeByte(RQ_BE0);
    177  uint8_t byte = usart.readByte();
    178  delay_us(10);
    179  return byte;
    180 }
    181 
    183 {
    184  usart.clearInputBuffer();
    185  usart.writeByte(RQ_BE1);
    186  uint8_t byte = usart.readByte();
    187  delay_us(10);
    188  return byte;
    189 }
    190 
    192 {
    193  usart.clearInputBuffer();
    194  usart.writeByte(RQ_DSW);
    195  uint8_t byte = usart.readByte();
    196  delay_us(10);
    197  return byte;
    198 }
    199 
    200 bool B15F::analogWrite0(uint16_t value)
    201 {
    202  usart.writeByte(RQ_AA0);
    203  usart.writeInt(value);
    204 
    205  uint8_t aw = usart.readByte();
    206  delay_us(10);
    207  return aw == MSG_OK;
    208 }
    209 
    210 bool B15F::analogWrite1(uint16_t value)
    211 {
    212  usart.writeByte(RQ_AA1);
    213  usart.writeInt(value);
    214 
    215  uint8_t aw = usart.readByte();
    216  delay_us(10);
    217  return aw == MSG_OK;
    218 }
    219 
    220 uint16_t B15F::analogRead(uint8_t channel)
    221 {
    222  usart.clearInputBuffer();
    223  if(channel > 7)
    224  abort("Bad ADC channel: " + std::to_string(channel));
    225 
    226  uint8_t rq[] =
    227  {
    228  RQ_ADC,
    229  channel
    230  };
    231 
    232  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    233  if(n_sent != sizeof(rq))
    234  abort("Sent failed");
    235 
    236  uint16_t adc = usart.readInt();
    237 
    238  if(adc > 1023)
    239  abort("Bad ADC data detected (1)");
    240  return adc;
    241 }
    242 
    243 void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    244 {
    245  // check pointers
    246  buffer_a += offset_a;
    247  buffer_b += offset_b;
    248 
    249 
    250  usart.clearInputBuffer();
    251  usart.writeByte(RQ_ADC_DAC_STROKE);
    252  usart.writeByte(channel_a);
    253  usart.writeByte(channel_b);
    254  usart.writeInt(start);
    255  usart.writeInt(static_cast<uint16_t>(delta));
    256  usart.writeInt(count);
    257 
    258  for(uint16_t i = 0; i < count; i++)
    259  {
    260  if(buffer_a)
    261  {
    262  buffer_a[i] = usart.readInt();
    263 
    264  if(buffer_a[i] > 1023) // check for broken usart connection
    265  abort("Bad ADC data detected (2)");
    266  }
    267  else
    268  {
    269  usart.readInt();
    270  }
    271 
    272  if(buffer_b)
    273  {
    274  buffer_b[i] = usart.readInt();
    275 
    276  if(buffer_b[i] > 1023) // check for broken usart connection
    277  abort("Bad ADC data detected (3)");
    278  }
    279  else
    280  {
    281  usart.readInt();
    282  }
    283  }
    284 
    285  uint8_t aw = usart.readByte();
    286  if(aw != MSG_OK)
    287  abort("Sequenz unterbrochen");
    288 
    289  delay_us(10);
    290 }
    291 
    292 uint8_t B15F::pwmSetFrequency(uint32_t freq)
    293 {
    294  usart.clearInputBuffer();
    295 
    296  uint8_t rq[] =
    297  {
    298  RQ_PWM_SET_FREQ,
    299  static_cast<uint8_t>((freq >> 0) & 0xFF),
    300  static_cast<uint8_t>((freq >> 8) & 0xFF),
    301  static_cast<uint8_t>((freq >> 16) & 0xFF),
    302  static_cast<uint8_t>((freq >> 24) & 0xFF)
    303  };
    304 
    305  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    306  if(n_sent != sizeof(rq))
    307  abort("Sent failed");
    308 
    309  uint8_t byte = usart.readByte();
    310  delay_us(10);
    311  return byte;
    312 }
    313 
    314 bool B15F::pwmSetValue(uint8_t value)
    315 {
    316  usart.clearInputBuffer();
    317 
    318  uint8_t rq[] =
    319  {
    320  RQ_PWM_SET_VALUE,
    321  value
    322  };
    323 
    324  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    325  if(n_sent != sizeof(rq))
    326  abort("Sent failed");
    327 
    328  uint8_t aw = usart.readByte();
    329  delay_us(10);
    330  return aw == MSG_OK;
    331 }
    332 
    333 void B15F::delay_ms(uint16_t ms)
    334 {
    335  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    336 }
    337 
    338 void B15F::delay_us(uint16_t us)
    339 {
    340  std::this_thread::sleep_for(std::chrono::microseconds(us));
    341 }
    342 
    344 {
    345  if(!instance)
    346  instance = new B15F();
    347 
    348  return *instance;
    349 }
    350 
    351 // https://stackoverflow.com/a/478960
    352 std::string B15F::exec(std::string cmd)
    353 {
    354  std::array<char, 128> buffer;
    355  std::string result;
    356  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    357  if (!pipe)
    358  {
    359  throw std::runtime_error("popen() failed!");
    360  }
    361  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    362  {
    363  result += buffer.data();
    364  }
    365  return result;
    366 }
    367 
    368 void B15F::abort(std::string msg)
    369 {
    370  DriverException ex(msg);
    371  abort(ex);
    372 }
    373 void B15F::abort(std::exception& ex)
    374 {
    375  if(errorhandler)
    376  errorhandler(ex);
    377  else
    378  {
    379  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    380  std::cout << ex.what() << std::endl;
    381  throw DriverException(ex.what());
    382  }
    383 }
    384 
    385 void B15F::setAbortHandler(errorhandler_t func)
    386 {
    387  errorhandler = func;
    388 }
    -
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:352
    +
    1 #include "b15f.h"
    2 
    3 B15F* B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos)
    16  device.pop_back();
    17 
    18  if(device.length() == 0)
    19  abort("Adapter nicht gefunden");
    20 
    21  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    22 
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31 
    32  std::cout << PRE << "Teste Verbindung... " << std::flush;
    33  uint8_t tries = 3;
    34  while(tries--)
    35  {
    36  // verwerfe Daten, die µC noch hat
    37  //discard();
    38 
    39  if(!testConnection())
    40  continue;
    41 
    42  if(!testIntConv())
    43  continue;
    44 
    45  break;
    46  }
    47  if(tries == 0)
    48  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    49  std::cout << "OK" << std::endl;
    50 
    51 
    52  // Gib board info aus
    53  std::vector<std::string> info = getBoardInfo();
    54  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while(tries--)
    61  {
    63  discard();
    64 
    65  if(testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  usart.clearOutputBuffer();
    77  for(uint8_t i = 0; i < 16; i++)
    78  {
    79  usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input)
    80  delay_ms(4);
    81  }
    82  usart.clearInputBuffer();
    83  }
    84  catch(std::exception& ex)
    85  {
    86  abort(ex);
    87  }
    88 }
    89 
    91 {
    92  // erzeuge zufälliges Byte
    93  srand(time(NULL));
    94  uint8_t dummy = rand() % 256;
    95 
    96  usart.writeByte(RQ_TEST);
    97  usart.writeByte(dummy);
    98 
    99  uint8_t aw = usart.readByte();
    100  uint8_t mirror = usart.readByte();
    101 
    102  return aw == MSG_OK && mirror == dummy;
    103 }
    104 
    106 {
    107  srand(time(NULL));
    108  uint16_t dummy = rand() % (0xFFFF / 3);
    109 
    110  usart.writeByte(RQ_INT);
    111  usart.writeInt(dummy);
    112 
    113  uint16_t aw = usart.readInt();
    114  return aw == dummy * 3;
    115 }
    116 
    117 
    118 std::vector<std::string> B15F::getBoardInfo(void)
    119 {
    120  std::vector<std::string> info;
    121 
    122  usart.writeByte(RQ_INFO);
    123 
    124  uint8_t n = usart.readByte();
    125  while(n--)
    126  {
    127  uint8_t len = usart.readByte();
    128  std::string str;
    129 
    130  while(len--)
    131  {
    132  str += static_cast<char>(usart.readByte());
    133  }
    134 
    135  info.push_back(str);
    136  }
    137 
    138  uint8_t aw = usart.readByte();
    139  if(aw != MSG_OK)
    140  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    141 
    142  return info;
    143 }
    144 
    146 {
    147  usart.writeByte(RQ_ST);
    148 
    149  uint8_t aw = usart.readByte();
    150  return aw == MSG_OK;
    151 }
    152 
    153 bool B15F::digitalWrite0(uint8_t port)
    154 {
    155  usart.writeByte(RQ_BA0);
    156  usart.writeByte(port);
    157 
    158  uint8_t aw = usart.readByte();
    159  delay_us(10);
    160  return aw == MSG_OK;
    161 }
    162 
    163 bool B15F::digitalWrite1(uint8_t port)
    164 {
    165  usart.writeByte(RQ_BA1);
    166  usart.writeByte(port);
    167 
    168  uint8_t aw = usart.readByte();
    169  delay_us(10);
    170  return aw == MSG_OK;
    171 }
    172 
    174 {
    175  usart.clearInputBuffer();
    176  usart.writeByte(RQ_BE0);
    177  uint8_t byte = usart.readByte();
    178  delay_us(10);
    179  return byte;
    180 }
    181 
    183 {
    184  usart.clearInputBuffer();
    185  usart.writeByte(RQ_BE1);
    186  uint8_t byte = usart.readByte();
    187  delay_us(10);
    188  return byte;
    189 }
    190 
    192 {
    193  usart.clearInputBuffer();
    194  usart.writeByte(RQ_DSW);
    195  uint8_t byte = usart.readByte();
    196  delay_us(10);
    197  return byte;
    198 }
    199 
    200 bool B15F::analogWrite0(uint16_t value)
    201 {
    202  usart.writeByte(RQ_AA0);
    203  usart.writeInt(value);
    204 
    205  uint8_t aw = usart.readByte();
    206  delay_us(10);
    207  return aw == MSG_OK;
    208 }
    209 
    210 bool B15F::analogWrite1(uint16_t value)
    211 {
    212  usart.writeByte(RQ_AA1);
    213  usart.writeInt(value);
    214 
    215  uint8_t aw = usart.readByte();
    216  delay_us(10);
    217  return aw == MSG_OK;
    218 }
    219 
    220 uint16_t B15F::analogRead(uint8_t channel)
    221 {
    222  usart.clearInputBuffer();
    223  if(channel > 7)
    224  abort("Bad ADC channel: " + std::to_string(channel));
    225 
    226  uint8_t rq[] =
    227  {
    228  RQ_ADC,
    229  channel
    230  };
    231 
    232  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    233  if(n_sent != sizeof(rq))
    234  abort("Sent failed");
    235 
    236  uint16_t adc = usart.readInt();
    237 
    238  if(adc > 1023)
    239  abort("Bad ADC data detected (1)");
    240  return adc;
    241 }
    242 
    243 void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    244 {
    245  // check pointers
    246  buffer_a += offset_a;
    247  buffer_b += offset_b;
    248 
    249 
    250  usart.clearInputBuffer();
    251  usart.writeByte(RQ_ADC_DAC_STROKE);
    252  usart.writeByte(channel_a);
    253  usart.writeByte(channel_b);
    254  usart.writeInt(start);
    255  usart.writeInt(static_cast<uint16_t>(delta));
    256  usart.writeInt(count);
    257 
    258  for(uint16_t i = 0; i < count; i++)
    259  {
    260  if(buffer_a)
    261  {
    262  buffer_a[i] = usart.readInt();
    263 
    264  if(buffer_a[i] > 1023) // check for broken usart connection
    265  abort("Bad ADC data detected (2)");
    266  }
    267  else
    268  {
    269  usart.readInt();
    270  }
    271 
    272  if(buffer_b)
    273  {
    274  buffer_b[i] = usart.readInt();
    275 
    276  if(buffer_b[i] > 1023) // check for broken usart connection
    277  abort("Bad ADC data detected (3)");
    278  }
    279  else
    280  {
    281  usart.readInt();
    282  }
    283  }
    284 
    285  uint8_t aw = usart.readByte();
    286  if(aw != MSG_OK)
    287  abort("Sequenz unterbrochen");
    288 
    289  delay_us(10);
    290 }
    291 
    292 uint8_t B15F::pwmSetFrequency(uint32_t freq)
    293 {
    294  usart.clearInputBuffer();
    295 
    296  uint8_t rq[] =
    297  {
    298  RQ_PWM_SET_FREQ,
    299  static_cast<uint8_t>((freq >> 0) & 0xFF),
    300  static_cast<uint8_t>((freq >> 8) & 0xFF),
    301  static_cast<uint8_t>((freq >> 16) & 0xFF),
    302  static_cast<uint8_t>((freq >> 24) & 0xFF)
    303  };
    304 
    305  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    306  if(n_sent != sizeof(rq))
    307  abort("Sent failed");
    308 
    309  uint8_t byte = usart.readByte();
    310  delay_us(10);
    311  return byte;
    312 }
    313 
    314 bool B15F::pwmSetValue(uint8_t value)
    315 {
    316  usart.clearInputBuffer();
    317 
    318  uint8_t rq[] =
    319  {
    320  RQ_PWM_SET_VALUE,
    321  value
    322  };
    323 
    324  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    325  if(n_sent != sizeof(rq))
    326  abort("Sent failed");
    327 
    328  uint8_t aw = usart.readByte();
    329  delay_us(10);
    330  return aw == MSG_OK;
    331 }
    332 
    333 bool B15F::setRegister(uint8_t adr, uint8_t val)
    334 {
    335  usart.clearInputBuffer();
    336 
    337  uint8_t rq[] =
    338  {
    339  RQ_SET_REG,
    340  adr,
    341  val
    342  };
    343 
    344  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    345  if(n_sent != sizeof(rq))
    346  abort("Sent failed");
    347 
    348  uint8_t byte = usart.readByte();
    349  delay_us(10);
    350  return byte == val;
    351 }
    352 
    353 uint8_t B15F::getRegister(uint8_t adr)
    354 {
    355  usart.clearInputBuffer();
    356 
    357  uint8_t rq[] =
    358  {
    359  RQ_GET_REG,
    360  adr
    361  };
    362 
    363  int n_sent = usart.write_timeout(&rq[0], 0, sizeof(rq), 1000);
    364  if(n_sent != sizeof(rq))
    365  abort("Sent failed");
    366 
    367  uint8_t aw = usart.readByte();
    368  delay_us(10);
    369  return aw;
    370 }
    371 
    372 
    373 void B15F::delay_ms(uint16_t ms)
    374 {
    375  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    376 }
    377 
    378 void B15F::delay_us(uint16_t us)
    379 {
    380  std::this_thread::sleep_for(std::chrono::microseconds(us));
    381 }
    382 
    384 {
    385  if(!instance)
    386  instance = new B15F();
    387 
    388  return *instance;
    389 }
    390 
    391 // https://stackoverflow.com/a/478960
    392 std::string B15F::exec(std::string cmd)
    393 {
    394  std::array<char, 128> buffer;
    395  std::string result;
    396  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    397  if (!pipe)
    398  {
    399  throw std::runtime_error("popen() failed!");
    400  }
    401  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    402  {
    403  result += buffer.data();
    404  }
    405  return result;
    406 }
    407 
    408 void B15F::abort(std::string msg)
    409 {
    410  DriverException ex(msg);
    411  abort(ex);
    412 }
    413 void B15F::abort(std::exception& ex)
    414 {
    415  if(errorhandler)
    416  errorhandler(ex);
    417  else
    418  {
    419  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    420  std::cout << ex.what() << std::endl;
    421  throw DriverException(ex.what());
    422  }
    423 }
    424 
    425 void B15F::setAbortHandler(errorhandler_t func)
    426 {
    427  errorhandler = func;
    428 }
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:392
    +
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:353
    uint8_t readByte(void)
    Definition: usart.cpp:216
    -
    void delay_us(uint16_t us)
    Definition: b15f.cpp:338
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:378
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:292
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:243
    bool testConnection(void)
    Definition: b15f.cpp:90
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:333
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:343
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:373
    +
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:333
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:383
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:368
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:408
    void clearInputBuffer(void)
    Definition: usart.cpp:39
    void clearOutputBuffer(void)
    Definition: usart.cpp:46
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    -
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:215
    +
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:231
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:322
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:118
    -
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:218
    +
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:234
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    void writeByte(uint8_t b)
    Definition: usart.cpp:67
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:314
    void discard(void)
    Definition: b15f.cpp:72
    -
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:216
    +
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:232
    void openDevice(std::string device)
    Definition: usart.cpp:3
    uint16_t readInt(void)
    Definition: usart.cpp:235
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    void reconnect(void)
    Definition: b15f.cpp:57
    -
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:221
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:385
    +
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:237
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:425
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    -
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:220
    +
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:236
    void writeInt(uint16_t d)
    Definition: usart.cpp:81
    bool testIntConv(void)
    Definition: b15f.cpp:105
    diff --git a/docs/html/b15f_8h_source.html b/docs/html/b15f_8h_source.html index 346c23c..1bad799 100644 --- a/docs/html/b15f_8h_source.html +++ b/docs/html/b15f_8h_source.html @@ -70,42 +70,44 @@ $(function() {
    b15f.h
    -
    1 #ifndef B15F_H
    2 #define B15F_H
    3 
    4 #include <iostream>
    5 #include <bits/stdc++.h>
    6 #include <string>
    7 #include <fstream>
    8 #include <cstdlib>
    9 #include <chrono>
    10 #include <cstdint>
    11 #include <vector>
    12 
    13 #include <unistd.h>
    14 #include <fcntl.h>
    15 #include <sys/ioctl.h>
    16 #include <termios.h>
    17 #include "usart.h"
    18 #include "driverexception.h"
    19 #include "timeoutexception.h"
    20 
    21 typedef std::function<void(std::exception&)> errorhandler_t;
    22 
    23 
    26 class B15F
    27 {
    28 private:
    29  // privater Konstruktor
    30  B15F(void);
    31 public:
    32 
    33  /*************************************
    34  * Grundfunktionen des B15F Treibers *
    35  *************************************/
    36 
    41  void reconnect(void);
    42 
    47  void discard(void);
    48 
    53  bool testConnection(void);
    54 
    59  bool testIntConv(void);
    60 
    65  std::vector<std::string> getBoardInfo(void);
    66 
    71  void delay_ms(uint16_t ms);
    72 
    77  void delay_us(uint16_t us);
    78 
    83  static B15F& getInstance(void);
    84 
    89  static std::string exec(std::string cmd);
    90 
    95  static void abort(std::string msg);
    96 
    101  static void abort(std::exception& ex);
    102 
    107  static void setAbortHandler(errorhandler_t func);
    108 
    109  /*************************************/
    110 
    111 
    112 
    113  /*************************
    114  * Steuerbefehle für B15 *
    115  *************************/
    116 
    122  bool activateSelfTestMode(void);
    123 
    129  bool digitalWrite0(uint8_t);
    130 
    136  bool digitalWrite1(uint8_t);
    137 
    143  uint8_t digitalRead0(void);
    144 
    150  uint8_t digitalRead1(void);
    151 
    157  uint8_t readDipSwitch(void);
    158 
    164  bool analogWrite0(uint16_t port);
    165 
    171  bool analogWrite1(uint16_t port);
    172 
    178  uint16_t analogRead(uint8_t channel);
    179 
    195  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
    196 
    204  uint8_t pwmSetFrequency(uint32_t freq);
    205 
    211  bool pwmSetValue(uint8_t value);
    212 
    213  /*************************/
    214 
    215 
    216  // CONSTANTS
    217  const std::string PRE = "[B15F] ";
    218  constexpr static uint8_t MSG_OK = 0xFF;
    219  constexpr static uint8_t MSG_FAIL = 0xFE;
    220  constexpr static uint16_t RECONNECT_TIMEOUT = 64;
    221  constexpr static uint16_t WDT_TIMEOUT = 15;
    222  constexpr static uint8_t RECONNECT_TRIES = 3;
    223  constexpr static uint32_t BAUDRATE = 57600;
    224 
    225 private:
    226 
    231  void init(void);
    232 
    233  USART usart;
    234  static B15F* instance;
    235  static errorhandler_t errorhandler;
    236 
    237  // REQUESTS
    238  constexpr static uint8_t RQ_DISC = 0;
    239  constexpr static uint8_t RQ_TEST = 1;
    240  constexpr static uint8_t RQ_INFO = 2;
    241  constexpr static uint8_t RQ_INT = 3;
    242  constexpr static uint8_t RQ_ST = 4;
    243  constexpr static uint8_t RQ_BA0 = 5;
    244  constexpr static uint8_t RQ_BA1 = 6;
    245  constexpr static uint8_t RQ_BE0 = 7;
    246  constexpr static uint8_t RQ_BE1 = 8;
    247  constexpr static uint8_t RQ_DSW = 9;
    248  constexpr static uint8_t RQ_AA0 = 10;
    249  constexpr static uint8_t RQ_AA1 = 11;
    250  constexpr static uint8_t RQ_ADC = 12;
    251  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
    252  constexpr static uint8_t RQ_PWM_SET_FREQ = 14;
    253  constexpr static uint8_t RQ_PWM_SET_VALUE = 15;
    254 };
    255 
    256 #endif // B15F_H
    -
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:352
    -
    constexpr static uint8_t MSG_FAIL
    Value to reject a received command.
    Definition: b15f.h:217
    -
    void delay_us(uint16_t us)
    Definition: b15f.cpp:338
    +
    1 #ifndef B15F_H
    2 #define B15F_H
    3 
    4 #include <iostream>
    5 #include <bits/stdc++.h>
    6 #include <string>
    7 #include <fstream>
    8 #include <cstdlib>
    9 #include <chrono>
    10 #include <cstdint>
    11 #include <vector>
    12 
    13 #include <unistd.h>
    14 #include <fcntl.h>
    15 #include <sys/ioctl.h>
    16 #include <termios.h>
    17 #include "usart.h"
    18 #include "driverexception.h"
    19 #include "timeoutexception.h"
    20 
    21 typedef std::function<void(std::exception&)> errorhandler_t;
    22 
    23 
    26 class B15F
    27 {
    28 private:
    29  // privater Konstruktor
    30  B15F(void);
    31 public:
    32 
    33  /*************************************
    34  * Grundfunktionen des B15F Treibers *
    35  *************************************/
    36 
    41  void reconnect(void);
    42 
    47  void discard(void);
    48 
    53  bool testConnection(void);
    54 
    59  bool testIntConv(void);
    60 
    65  std::vector<std::string> getBoardInfo(void);
    66 
    71  void delay_ms(uint16_t ms);
    72 
    77  void delay_us(uint16_t us);
    78 
    83  static B15F& getInstance(void);
    84 
    89  static std::string exec(std::string cmd);
    90 
    95  static void abort(std::string msg);
    96 
    101  static void abort(std::exception& ex);
    102 
    107  static void setAbortHandler(errorhandler_t func);
    108 
    109  /*************************************/
    110 
    111 
    112 
    113  /*************************
    114  * Steuerbefehle für B15 *
    115  *************************/
    116 
    122  bool activateSelfTestMode(void);
    123 
    129  bool digitalWrite0(uint8_t);
    130 
    136  bool digitalWrite1(uint8_t);
    137 
    143  uint8_t digitalRead0(void);
    144 
    150  uint8_t digitalRead1(void);
    151 
    157  uint8_t readDipSwitch(void);
    158 
    164  bool analogWrite0(uint16_t port);
    165 
    171  bool analogWrite1(uint16_t port);
    172 
    178  uint16_t analogRead(uint8_t channel);
    179 
    195  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
    196 
    204  uint8_t pwmSetFrequency(uint32_t freq);
    205 
    211  bool pwmSetValue(uint8_t value);
    212 
    220  bool setRegister(uint8_t adr, uint8_t val);
    221 
    227  uint8_t getRegister(uint8_t adr);
    228 
    229  /*************************/
    230 
    231 
    232  // CONSTANTS
    233  const std::string PRE = "[B15F] ";
    234  constexpr static uint8_t MSG_OK = 0xFF;
    235  constexpr static uint8_t MSG_FAIL = 0xFE;
    236  constexpr static uint16_t RECONNECT_TIMEOUT = 64;
    237  constexpr static uint16_t WDT_TIMEOUT = 15;
    238  constexpr static uint8_t RECONNECT_TRIES = 3;
    239  constexpr static uint32_t BAUDRATE = 57600;
    240 
    241 private:
    242 
    247  void init(void);
    248 
    249  USART usart;
    250  static B15F* instance;
    251  static errorhandler_t errorhandler;
    252 
    253  // REQUESTS
    254  constexpr static uint8_t RQ_DISC = 0;
    255  constexpr static uint8_t RQ_TEST = 1;
    256  constexpr static uint8_t RQ_INFO = 2;
    257  constexpr static uint8_t RQ_INT = 3;
    258  constexpr static uint8_t RQ_ST = 4;
    259  constexpr static uint8_t RQ_BA0 = 5;
    260  constexpr static uint8_t RQ_BA1 = 6;
    261  constexpr static uint8_t RQ_BE0 = 7;
    262  constexpr static uint8_t RQ_BE1 = 8;
    263  constexpr static uint8_t RQ_DSW = 9;
    264  constexpr static uint8_t RQ_AA0 = 10;
    265  constexpr static uint8_t RQ_AA1 = 11;
    266  constexpr static uint8_t RQ_ADC = 12;
    267  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
    268  constexpr static uint8_t RQ_PWM_SET_FREQ = 14;
    269  constexpr static uint8_t RQ_PWM_SET_VALUE = 15;
    270  constexpr static uint8_t RQ_SET_REG = 16;
    271  constexpr static uint8_t RQ_GET_REG = 17;
    272 };
    273 
    274 #endif // B15F_H
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:392
    +
    constexpr static uint8_t MSG_FAIL
    Value to reject a received command.
    Definition: b15f.h:233
    +
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:353
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:378
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:292
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:243
    bool testConnection(void)
    Definition: b15f.cpp:90
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:333
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:343
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:373
    +
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:333
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:383
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:368
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:408
    Definition: usart.h:18
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    -
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:215
    +
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:231
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:118
    -
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:218
    +
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:234
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:314
    void discard(void)
    Definition: b15f.cpp:72
    -
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:216
    +
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:232
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    -
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:219
    +
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:235
    void reconnect(void)
    Definition: b15f.cpp:57
    -
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:221
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:385
    +
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:237
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:425
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    -
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:220
    +
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:236
    bool testIntConv(void)
    Definition: b15f.cpp:105
    diff --git a/docs/html/classB15F-members.html b/docs/html/classB15F-members.html index 119895f..e12f994 100644 --- a/docs/html/classB15F-members.html +++ b/docs/html/classB15F-members.html @@ -87,23 +87,25 @@ $(function() { exec(std::string cmd)B15Fstatic getBoardInfo(void)B15F getInstance(void)B15Fstatic - MSG_FAILB15Fstatic - MSG_OKB15Fstatic - PREB15F - pwmSetFrequency(uint32_t freq)B15F - pwmSetValue(uint8_t value)B15F - readDipSwitch(void)B15F - reconnect(void)B15F - RECONNECT_TIMEOUTB15Fstatic - RECONNECT_TRIESB15Fstatic - setAbortHandler(errorhandler_t func)B15Fstatic + getRegister(uint8_t adr)B15F + MSG_FAILB15Fstatic + MSG_OKB15Fstatic + PREB15F + pwmSetFrequency(uint32_t freq)B15F + pwmSetValue(uint8_t value)B15F + readDipSwitch(void)B15F + reconnect(void)B15F + RECONNECT_TIMEOUTB15Fstatic + RECONNECT_TRIESB15Fstatic + setAbortHandler(errorhandler_t func)B15Fstatic + setRegister(uint8_t adr, uint8_t val)B15F testConnection(void)B15F testIntConv(void)B15F WDT_TIMEOUTB15Fstatic diff --git a/docs/html/classB15F.html b/docs/html/classB15F.html index f22425d..68e4f0d 100644 --- a/docs/html/classB15F.html +++ b/docs/html/classB15F.html @@ -115,6 +115,10 @@ Public Member Functions   bool pwmSetValue (uint8_t value)   +bool setRegister (uint8_t adr, uint8_t val) +  +uint8_t getRegister (uint8_t adr) +  @@ -198,7 +202,7 @@ constexpr static uint32_t 

    Static Public Member Functions

    -

    Definition at line 373 of file b15f.cpp.

    +

    Definition at line 413 of file b15f.cpp.

    @@ -232,7 +236,7 @@ constexpr static uint32_t 
    -

    Definition at line 368 of file b15f.cpp.

    +

    Definition at line 408 of file b15f.cpp.

    @@ -472,7 +476,7 @@ constexpr static uint32_t 
    -

    Definition at line 333 of file b15f.cpp.

    +

    Definition at line 373 of file b15f.cpp.

    @@ -498,7 +502,7 @@ constexpr static uint32_t 
    -

    Definition at line 338 of file b15f.cpp.

    +

    Definition at line 378 of file b15f.cpp.

    @@ -676,7 +680,7 @@ constexpr static uint32_t 
    -

    Definition at line 352 of file b15f.cpp.

    +

    Definition at line 392 of file b15f.cpp.

    @@ -736,7 +740,39 @@ constexpr static uint32_t 
    -

    Definition at line 343 of file b15f.cpp.

    +

    Definition at line 383 of file b15f.cpp.

    + + + + +

    ◆ getRegister()

    + +
    +
    + + + + + + + + +
    uint8_t B15F::getRegister (uint8_t adr)
    +
    +

    Liefert den Wert eines MCU Registers.

    Parameters
    + + +
    adrSpeicheradresse des Registers
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 353 of file b15f.cpp.

    @@ -888,7 +924,50 @@ constexpr static uint32_t 
    -

    Definition at line 385 of file b15f.cpp.

    +

    Definition at line 425 of file b15f.cpp.

    + + + + +

    ◆ setRegister()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool B15F::setRegister (uint8_t adr,
    uint8_t val 
    )
    +
    +

    Setzt direkt den Wert eines MCU Registers. Wichtig: bei einer falschen Adresse kann das Board 15 ernsthaften Schaden nehmen!

    Parameters
    + + + +
    adrSpeicheradresse des Registers
    valNeuer Wert für das Register
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 333 of file b15f.cpp.

    @@ -951,7 +1030,7 @@ constexpr static uint32_t 
    diff --git a/docs/html/classDot-members.html b/docs/html/classDot-members.html index fafd43d..eecb9f4 100644 --- a/docs/html/classDot-members.html +++ b/docs/html/classDot-members.html @@ -76,7 +76,7 @@ $(function() {
    diff --git a/docs/html/classDot.html b/docs/html/classDot.html index b05a9bc..4a766ca 100644 --- a/docs/html/classDot.html +++ b/docs/html/classDot.html @@ -196,7 +196,7 @@ Public Member Functions diff --git a/docs/html/classDriverException-members.html b/docs/html/classDriverException-members.html index 5f85cd6..a2ee492 100644 --- a/docs/html/classDriverException-members.html +++ b/docs/html/classDriverException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classDriverException.html b/docs/html/classDriverException.html index 95ed51e..ae8c97a 100644 --- a/docs/html/classDriverException.html +++ b/docs/html/classDriverException.html @@ -109,7 +109,7 @@ std::string msg_< diff --git a/docs/html/classPlottyFile-members.html b/docs/html/classPlottyFile-members.html index b38eece..131dda0 100644 --- a/docs/html/classPlottyFile-members.html +++ b/docs/html/classPlottyFile-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/docs/html/classPlottyFile.html b/docs/html/classPlottyFile.html index de9db48..881cffc 100644 --- a/docs/html/classPlottyFile.html +++ b/docs/html/classPlottyFile.html @@ -811,7 +811,7 @@ Public Member Functions diff --git a/docs/html/classTimeoutException-members.html b/docs/html/classTimeoutException-members.html index 8c3285a..2519544 100644 --- a/docs/html/classTimeoutException-members.html +++ b/docs/html/classTimeoutException-members.html @@ -78,7 +78,7 @@ $(function() { diff --git a/docs/html/classTimeoutException.html b/docs/html/classTimeoutException.html index 6aa40b1..ce3c55b 100644 --- a/docs/html/classTimeoutException.html +++ b/docs/html/classTimeoutException.html @@ -112,7 +112,7 @@ int m_timeout diff --git a/docs/html/classUSART-members.html b/docs/html/classUSART-members.html index 8d603c6..aab4287 100644 --- a/docs/html/classUSART-members.html +++ b/docs/html/classUSART-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/docs/html/classUSART.html b/docs/html/classUSART.html index aa16cc1..24d0a7e 100644 --- a/docs/html/classUSART.html +++ b/docs/html/classUSART.html @@ -531,7 +531,7 @@ constexpr static uint8_t B diff --git a/docs/html/classUSARTException-members.html b/docs/html/classUSARTException-members.html index fb0f7cc..131e02f 100644 --- a/docs/html/classUSARTException-members.html +++ b/docs/html/classUSARTException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classUSARTException.html b/docs/html/classUSARTException.html index 96d050d..d85d089 100644 --- a/docs/html/classUSARTException.html +++ b/docs/html/classUSARTException.html @@ -109,7 +109,7 @@ std::string msg diff --git a/docs/html/classView-members.html b/docs/html/classView-members.html index 0816e70..b4be838 100644 --- a/docs/html/classView-members.html +++ b/docs/html/classView-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/docs/html/classView.html b/docs/html/classView.html index ba64d4a..d63c251 100644 --- a/docs/html/classView.html +++ b/docs/html/classView.html @@ -157,7 +157,7 @@ constexpr static int KEY_E diff --git a/docs/html/classViewInfo-members.html b/docs/html/classViewInfo-members.html index 11fecf3..744892f 100644 --- a/docs/html/classViewInfo-members.html +++ b/docs/html/classViewInfo-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/docs/html/classViewInfo.html b/docs/html/classViewInfo.html index 090a6da..ee1b6e0 100644 --- a/docs/html/classViewInfo.html +++ b/docs/html/classViewInfo.html @@ -185,7 +185,7 @@ static std::vector< std::string >  diff --git a/docs/html/classViewMonitor-members.html b/docs/html/classViewMonitor-members.html index f8b0248..017648b 100644 --- a/docs/html/classViewMonitor-members.html +++ b/docs/html/classViewMonitor-members.html @@ -103,7 +103,7 @@ $(function() { diff --git a/docs/html/classViewMonitor.html b/docs/html/classViewMonitor.html index 7566433..ea10ac1 100644 --- a/docs/html/classViewMonitor.html +++ b/docs/html/classViewMonitor.html @@ -197,7 +197,7 @@ constexpr static int KEY_E diff --git a/docs/html/classViewPromt-members.html b/docs/html/classViewPromt-members.html index 0620da4..da76ef6 100644 --- a/docs/html/classViewPromt-members.html +++ b/docs/html/classViewPromt-members.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/classViewPromt.html b/docs/html/classViewPromt.html index e4f148d..da8106e 100644 --- a/docs/html/classViewPromt.html +++ b/docs/html/classViewPromt.html @@ -205,7 +205,7 @@ static std::vector< std::string >  diff --git a/docs/html/classViewSelection-members.html b/docs/html/classViewSelection-members.html index 7eb9d49..ea0d8c3 100644 --- a/docs/html/classViewSelection-members.html +++ b/docs/html/classViewSelection-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/docs/html/classViewSelection.html b/docs/html/classViewSelection.html index 3983a76..59de0b0 100644 --- a/docs/html/classViewSelection.html +++ b/docs/html/classViewSelection.html @@ -172,7 +172,7 @@ static std::vector< std::string >  diff --git a/docs/html/classes.html b/docs/html/classes.html index 54bd780..18d3b60 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/cli_8cpp_source.html b/docs/html/cli_8cpp_source.html index 941591f..dcdc53f 100644 --- a/docs/html/cli_8cpp_source.html +++ b/docs/html/cli_8cpp_source.html @@ -68,11 +68,11 @@ $(function() {
    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
    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 }
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:343
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:385
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:383
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:425
    diff --git a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html index bd969af..e501dfc 100644 --- a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html +++ b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html index 9d8eb0a..021c216 100644 --- a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html +++ b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dot_8cpp_source.html b/docs/html/dot_8cpp_source.html index dd83450..6c6b61a 100644 --- a/docs/html/dot_8cpp_source.html +++ b/docs/html/dot_8cpp_source.html @@ -77,7 +77,7 @@ $(function() {
    Dot(uint16_t x, uint16_t y, uint8_t curve)
    Definition: dot.cpp:3
    diff --git a/docs/html/dot_8h_source.html b/docs/html/dot_8h_source.html index 9c0bd19..773473b 100644 --- a/docs/html/dot_8h_source.html +++ b/docs/html/dot_8h_source.html @@ -78,7 +78,7 @@ $(function() {
    Dot(uint16_t x, uint16_t y, uint8_t curve)
    Definition: dot.cpp:3
    diff --git a/docs/html/driverexception_8h_source.html b/docs/html/driverexception_8h_source.html index 015c2ad..b83ab80 100644 --- a/docs/html/driverexception_8h_source.html +++ b/docs/html/driverexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/files.html b/docs/html/files.html index e880b89..4d38804 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -99,7 +99,7 @@ $(function() { diff --git a/docs/html/functions.html b/docs/html/functions.html index 26bae8d..ccd1c21 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -191,6 +191,9 @@ $(function() {
  • getRefY() : PlottyFile
  • +
  • getRegister() +: B15F +
  • getTimeout() : USART
  • @@ -301,6 +304,9 @@ $(function() {
  • setRefY() : PlottyFile
  • +
  • setRegister() +: B15F +
  • setTimeout() : USART
  • @@ -349,7 +355,7 @@ $(function() { diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html index 1c2fd52..89acf80 100644 --- a/docs/html/functions_func.html +++ b/docs/html/functions_func.html @@ -184,6 +184,9 @@ $(function() {
  • getRefY() : PlottyFile
  • +
  • getRegister() +: B15F +
  • getTimeout() : USART
  • @@ -275,6 +278,9 @@ $(function() {
  • setRefY() : PlottyFile
  • +
  • setRegister() +: B15F +
  • setTimeout() : USART
  • @@ -320,7 +326,7 @@ $(function() { diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index 3172ad7..a041bb7 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -88,7 +88,7 @@ $(function() { diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html index bf24851..506d51b 100644 --- a/docs/html/hierarchy.html +++ b/docs/html/hierarchy.html @@ -86,7 +86,7 @@ $(function() { diff --git a/docs/html/index.html b/docs/html/index.html index 50426bf..63f9619 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -72,7 +72,7 @@ Dort befindet sich auch eine Übersicht der verfügbaren Befehle.

    diff --git a/docs/html/plottyfile_8cpp_source.html b/docs/html/plottyfile_8cpp_source.html index abd1e0b..1427215 100644 --- a/docs/html/plottyfile_8cpp_source.html +++ b/docs/html/plottyfile_8cpp_source.html @@ -101,7 +101,7 @@ $(function() {
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    diff --git a/docs/html/plottyfile_8h_source.html b/docs/html/plottyfile_8h_source.html index dd26e80..1021496 100644 --- a/docs/html/plottyfile_8h_source.html +++ b/docs/html/plottyfile_8h_source.html @@ -102,7 +102,7 @@ $(function() {
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js index c269a53..9518d98 100644 --- a/docs/html/search/all_6.js +++ b/docs/html/search/all_6.js @@ -13,6 +13,7 @@ var searchData= ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], + ['getregister',['getRegister',['../classB15F.html#a43b477a9e2e5b1b2142958fa5e1a78b3',1,'B15F']]], ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js index 588c06f..552513c 100644 --- a/docs/html/search/all_b.js +++ b/docs/html/search/all_b.js @@ -11,6 +11,7 @@ var searchData= ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], + ['setregister',['setRegister',['../classB15F.html#a2735424cf98bd0e2892b5a9b6eb24582',1,'B15F']]], ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js index c269a53..9518d98 100644 --- a/docs/html/search/functions_5.js +++ b/docs/html/search/functions_5.js @@ -13,6 +13,7 @@ var searchData= ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], + ['getregister',['getRegister',['../classB15F.html#a43b477a9e2e5b1b2142958fa5e1a78b3',1,'B15F']]], ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], diff --git a/docs/html/search/functions_9.js b/docs/html/search/functions_9.js index 588c06f..552513c 100644 --- a/docs/html/search/functions_9.js +++ b/docs/html/search/functions_9.js @@ -11,6 +11,7 @@ var searchData= ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], + ['setregister',['setRegister',['../classB15F.html#a2735424cf98bd0e2892b5a9b6eb24582',1,'B15F']]], ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], diff --git a/docs/html/timeoutexception_8h_source.html b/docs/html/timeoutexception_8h_source.html index 9351c47..0bfd0e2 100644 --- a/docs/html/timeoutexception_8h_source.html +++ b/docs/html/timeoutexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/ui_8cpp_source.html b/docs/html/ui_8cpp_source.html index 2012b32..b82ff5f 100644 --- a/docs/html/ui_8cpp_source.html +++ b/docs/html/ui_8cpp_source.html @@ -73,8 +73,8 @@ $(function() {
    1 #include "ui.h"
    2 #include "../drv/b15f.h"
    3 
    4 std::vector<View*> win_stack;
    5 std::thread t_refresh;
    6 
    7 void show_main(int)
    8 {
    9  ViewSelection* view = new ViewSelection();
    10  view->setTitle("B15F - Command Line Interface");
    11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
    12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
    13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
    14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
    15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
    16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
    17  view->addChoice("[ Informationen ]", &show_info);
    18  view->addChoice("", nullptr);
    19  view->addChoice("[ Beenden ]", &finish);
    20  view->repaint();
    21 
    22  win_stack.push_back(view);
    23  input(0);
    24 }
    25 
    26 void input(int)
    27 {
    28  call_t nextCall;
    29  int key;
    30  do
    31  {
    32  key = wgetch(View::getWinContext());
    33  win_stack.back()->repaint();
    34  nextCall = win_stack.back()->keypress(key);
    35 
    36  if(key == -1)
    37  view_back(key);
    38 
    39  if(nextCall)
    40  nextCall(key);
    41  }
    42  while(win_stack.size());
    43 }
    44 
    45 void view_back(int)
    46 {
    47  if(win_stack.size())
    48  {
    49  delete win_stack.back();
    50  win_stack.pop_back();
    51  }
    52  if(win_stack.size())
    53  win_stack.back()->repaint();
    54 }
    55 
    56 void finish(int)
    57 {
    58  cleanup();
    59  exit(EXIT_SUCCESS);
    60 }
    61 
    62 void cleanup()
    63 {
    64  if(t_refresh.joinable())
    65  t_refresh.join();
    66  clrtoeol();
    67  refresh();
    68  endwin();
    69 }
    70 
    71 void show_info(int)
    72 {
    73  ViewInfo* view = new ViewInfo();
    74  view->setTitle("Info");
    75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
    76  view->setLabelClose("[ Zurueck ]");
    77  view->repaint();
    78 
    79  win_stack.push_back(view);
    80  input(0);
    81 }
    82 
    83 void show_monitor(int)
    84 {
    85  ViewMonitor* view = new ViewMonitor();
    86  view->setTitle("Monitor");
    87  view->setText("\nErfasse Messwerte...");
    88  view->setLabelClose("[ Zurueck ]");
    89  view->repaint();
    90 
    91  win_stack.push_back(view);
    92  input(0);
    93 }
    94 
    95 void show_invalid_port_input(int)
    96 {
    97  ViewInfo* view = new ViewInfo();
    98  view->setTitle("Falsche Eingabe");
    99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
    100  view->setLabelClose("[ Schliessen ]");
    101  view->repaint();
    102 
    103  win_stack.push_back(view);
    104  input(0);
    105 }
    106 
    107 void show_invalid_dac_input(int)
    108 {
    109  ViewInfo* view = new ViewInfo();
    110  view->setTitle("Falsche Eingabe");
    111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
    112  view->setLabelClose("[ Schliessen ]");
    113  view->repaint();
    114 
    115  win_stack.push_back(view);
    116  input(0);
    117 }
    118 
    119 void write_digital_output0(int)
    120 {
    121  try
    122  {
    123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    124  if(d > 255 || 0 > d)
    125  throw std::invalid_argument("bad value");
    126  uint8_t port = static_cast<uint8_t>(d);
    127 
    128  B15F& drv = B15F::getInstance();
    129  drv.digitalWrite0(port);
    130  view_back(0);
    131  }
    132  catch(std::invalid_argument& ex)
    133  {
    134  show_invalid_port_input(0);
    135  }
    136 }
    137 
    138 void write_digital_output1(int)
    139 {
    140  try
    141  {
    142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    143  if(d > 255 || 0 > d)
    144  throw std::invalid_argument("bad value");
    145  uint8_t port = static_cast<uint8_t>(d);
    146 
    147  B15F& drv = B15F::getInstance();
    148  drv.digitalWrite1(port);
    149  view_back(0);
    150  }
    151  catch(std::invalid_argument& ex)
    152  {
    153  show_invalid_port_input(0);
    154  }
    155 }
    156 
    157 void write_analog_output0(int)
    158 {
    159  try
    160  {
    161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    162  if(port > 1023)
    163  throw std::invalid_argument("bad value");
    164 
    165  B15F& drv = B15F::getInstance();
    166  drv.analogWrite0(port);
    167  view_back(0);
    168  }
    169  catch(std::invalid_argument& ex)
    170  {
    171  show_invalid_dac_input(0);
    172  }
    173 }
    174 
    175 void write_analog_output1(int)
    176 {
    177  try
    178  {
    179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    180  if(port > 1023)
    181  throw std::invalid_argument("bad value");
    182 
    183  B15F& drv = B15F::getInstance();
    184  drv.analogWrite1(port);
    185  view_back(0);
    186  }
    187  catch(std::invalid_argument& ex)
    188  {
    189  show_invalid_dac_input(0);
    190  }
    191 }
    192 
    193 void show_digital_output0(int)
    194 {
    195  ViewPromt* view = new ViewPromt();
    196  view->setTitle("Digitale Ausgabe BE0");
    197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    198  view->setCancel("[ Zurueck ]", true);
    199  view->setConfirm("[ OK ]", &write_digital_output0);
    200  view->repaint();
    201 
    202  win_stack.push_back(view);
    203  input(0);
    204 }
    205 
    206 void show_digital_output1(int)
    207 {
    208  ViewPromt* view = new ViewPromt();
    209  view->setTitle("Digitale Ausgabe BE1");
    210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    211  view->setCancel("[ Zurueck ]", true);
    212  view->setConfirm("[ OK ]", &write_digital_output1);
    213  view->repaint();
    214 
    215  win_stack.push_back(view);
    216  input(0);
    217 }
    218 
    219 void show_analog_output0(int)
    220 {
    221  ViewPromt* view = new ViewPromt();
    222  view->setTitle("Analoge Ausgabe AA0");
    223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    224  view->setCancel("[ Zurueck ]", true);
    225  view->setConfirm("[ OK ]", &write_analog_output0);
    226  view->repaint();
    227 
    228  win_stack.push_back(view);
    229  input(0);
    230 }
    231 
    232 void show_analog_output1(int)
    233 {
    234  ViewPromt* view = new ViewPromt();
    235  view->setTitle("Analoge Ausgabe AA1");
    236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    237  view->setCancel("[ Zurueck ]", true);
    238  view->setConfirm("[ OK ]", &write_analog_output1);
    239  view->repaint();
    240 
    241  win_stack.push_back(view);
    242  input(0);
    243 }
    244 
    245 void start_selftest(int)
    246 {
    247  B15F& drv = B15F::getInstance();
    248  drv.activateSelfTestMode();
    249 
    250  ViewInfo* view = new ViewInfo();
    251  view->setTitle("Selbsttest aktiv");
    252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
    253  view->setLabelClose("[ Selbsttest Beenden ]");
    254  view->setCall(&stop_selftest);
    255  view->repaint();
    256 
    257  win_stack.push_back(view);
    258  input(0);
    259 }
    260 
    261 void stop_selftest(int)
    262 {
    263  B15F& drv = B15F::getInstance();
    264  drv.discard();
    266  drv.reconnect();
    267  drv.digitalWrite0(0);
    268  drv.digitalWrite1(0);
    269 }
    270 
    271 void show_selftest_info(int)
    272 {
    273  ViewInfo* view = new ViewInfo();
    274  view->setTitle("Selbsttest");
    275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
    276  view->setLabelClose("[ Weiter ]");
    277  view->setCall(&start_selftest);
    278  view->repaint();
    279 
    280  win_stack.push_back(view);
    281  input(0);
    282 }
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:333
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:343
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:373
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:383
    Definition: b15f.h:26
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    @@ -83,12 +83,12 @@ $(function() {
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    void discard(void)
    Definition: b15f.cpp:72
    -
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:219
    +
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:235
    void reconnect(void)
    Definition: b15f.cpp:57
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    diff --git a/docs/html/ui_8h_source.html b/docs/html/ui_8h_source.html index 545b5cb..e3da44c 100644 --- a/docs/html/ui_8h_source.html +++ b/docs/html/ui_8h_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #ifndef UI_H
    2 #define UI_H
    3 
    4 #include <vector>
    5 #include "view_selection.h"
    6 #include "view_info.h"
    7 #include "view_monitor.h"
    8 #include "view_promt.h"
    9 
    10 void show_main(int);
    11 void input(int);
    12 void view_back(int);
    13 void finish(int);
    14 void cleanup();
    15 
    16 void show_info(int);
    17 void show_monitor(int);
    18 void show_invalid_port_input(int);
    19 void show_invalid_dac_input(int);
    20 void write_digital_output0(int);
    21 void write_digital_output1(int);
    22 void write_analog_output0(int);
    23 void write_analog_output1(int);
    24 void show_digital_output0(int);
    25 void show_digital_output1(int);
    26 void show_analog_output0(int);
    27 void show_analog_output1(int);
    28 
    29 // selftest group
    30 void show_selftest_info(int);
    31 void start_selftest(int);
    32 void stop_selftest(int);
    33 
    34 
    35 extern std::vector<View*> win_stack;
    36 extern std::thread t_refresh;
    37 
    38 #endif // UI_H
    diff --git a/docs/html/usart_8cpp_source.html b/docs/html/usart_8cpp_source.html index 70b7d23..3c613ee 100644 --- a/docs/html/usart_8cpp_source.html +++ b/docs/html/usart_8cpp_source.html @@ -90,7 +90,7 @@ $(function() {
    void writeInt(uint16_t d)
    Definition: usart.cpp:81
    diff --git a/docs/html/usart_8h_source.html b/docs/html/usart_8h_source.html index 25eac7a..fb279ff 100644 --- a/docs/html/usart_8h_source.html +++ b/docs/html/usart_8h_source.html @@ -89,7 +89,7 @@ $(function() {
    void writeInt(uint16_t d)
    Definition: usart.cpp:81
    diff --git a/docs/html/usartexception_8h_source.html b/docs/html/usartexception_8h_source.html index d037b79..ce6e187 100644 --- a/docs/html/usartexception_8h_source.html +++ b/docs/html/usartexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/view_8cpp_source.html b/docs/html/view_8cpp_source.html index 030d2a5..ce0f029 100644 --- a/docs/html/view_8cpp_source.html +++ b/docs/html/view_8cpp_source.html @@ -71,10 +71,10 @@ $(function() {
    1 #include "view.h"
    2 
    3 WINDOW* View::win = nullptr;
    4 
    5 View::View()
    6 {
    7  if(!win)
    8  {
    9  B15F::abort("View::win not initialized, missing context");
    10  }
    11  getmaxyx(win, height, width); // init width and height
    12  keypad(win, TRUE);
    13 }
    14 
    15 View::~View()
    16 {
    17 }
    18 
    19 void View::setWinContext(WINDOW* win)
    20 {
    21  View::win = win;
    22 }
    23 
    24 WINDOW* View::getWinContext()
    25 {
    26  return win;
    27 }
    28 
    29 // from: https://stackoverflow.com/a/37454181
    30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
    31 {
    32  std::vector<std::string> tokens;
    33  size_t prev = 0, pos = 0;
    34  do
    35  {
    36  pos = str.find(delim, prev);
    37  if (pos == std::string::npos) pos = str.length();
    38  std::string token = str.substr(prev, pos-prev);
    39  if (!token.empty()) tokens.push_back(token);
    40  prev = pos + delim.length();
    41  }
    42  while (pos < str.length() && prev < str.length());
    43  return tokens;
    44 }
    45 
    46 
    47 void View::setTitle(std::string title)
    48 {
    49  this->title = title;
    50 }
    51 
    52 void View::repaint()
    53 {
    54  // get screen size
    55  struct winsize size;
    56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
    57  throw std::runtime_error("TIOCGWINSZ error");
    58 
    59 
    60  start_x = floor((size.ws_col - width) / 2.);
    61  start_y = floor((size.ws_row - height) / 2.);
    62 
    63  curs_set(0); // hide cursor
    64  mvwin(win, start_y, start_x);
    65  clear();
    66  wclear(win);
    67 
    68  // generic draw
    69  box(win, 0, 0);
    70  int offset_x = (width - title.length()) / 2;
    71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
    72 
    73  // specific draw
    74  draw();
    75 
    76  refresh();
    77  wrefresh(win);
    78 }
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:368
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:408
    diff --git a/docs/html/view_8h_source.html b/docs/html/view_8h_source.html index 8978a3e..34219aa 100644 --- a/docs/html/view_8h_source.html +++ b/docs/html/view_8h_source.html @@ -74,7 +74,7 @@ $(function() {
    Definition: view.h:19
    diff --git a/docs/html/view__info_8cpp_source.html b/docs/html/view__info_8cpp_source.html index c9d1a98..fc91695 100644 --- a/docs/html/view__info_8cpp_source.html +++ b/docs/html/view__info_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_info.h"
    2 
    3 ViewInfo::ViewInfo()
    4 {
    5  calls.push_back(nullptr);
    6 }
    7 
    8 void ViewInfo::setText(std::string text)
    9 {
    10  this->text = text;
    11 }
    12 
    13 void ViewInfo::setLabelClose(std::string label)
    14 {
    15  this->label_close = label;
    16 }
    17 
    18 void ViewInfo::setCall(call_t call)
    19 {
    20  calls[0] = call;
    21 }
    22 
    23 void ViewInfo::draw()
    24 {
    25  int li = 0;
    26  for(std::string line : str_split(text, "\n"))
    27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
    28 
    29  close_offset_x = (width - label_close.length()) / 2;
    30  close_offset_y = height - 2;
    31 
    32  wattron(win, A_REVERSE);
    33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
    34  wattroff(win, A_REVERSE);
    35 }
    36 
    37 call_t ViewInfo::keypress(int& key)
    38 {
    39  switch(key)
    40  {
    41 
    42  case KEY_MOUSE:
    43  {
    44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    45  MEVENT event;
    46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    47  {
    48  size_t column = start_x + close_offset_x;
    49  size_t row = start_y + close_offset_y;
    50  size_t mouse_x = event.x, mouse_y = event.y;
    51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    52  key = -1; // do return from view
    53  }
    54  break;
    55  }
    56  case KEY_ENT:
    57  key = -1; // do return from view
    58  break;
    59  default:
    60  break;
    61  }
    62  return calls[0];
    63 }
    diff --git a/docs/html/view__info_8h_source.html b/docs/html/view__info_8h_source.html index 4aaf34e..253009d 100644 --- a/docs/html/view__info_8h_source.html +++ b/docs/html/view__info_8h_source.html @@ -75,7 +75,7 @@ $(function() {
    Definition: view.h:19
    diff --git a/docs/html/view__monitor_8cpp_source.html b/docs/html/view__monitor_8cpp_source.html index fa3a723..09f6315 100644 --- a/docs/html/view__monitor_8cpp_source.html +++ b/docs/html/view__monitor_8cpp_source.html @@ -74,17 +74,17 @@ $(function() {
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:333
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:343
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:373
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:383
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:368
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:408
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    void reconnect(void)
    Definition: b15f.cpp:57
    diff --git a/docs/html/view__monitor_8h_source.html b/docs/html/view__monitor_8h_source.html index c050394..b311d44 100644 --- a/docs/html/view__monitor_8h_source.html +++ b/docs/html/view__monitor_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/view__promt_8cpp_source.html b/docs/html/view__promt_8cpp_source.html index 0e91d6e..cb9f31c 100644 --- a/docs/html/view__promt_8cpp_source.html +++ b/docs/html/view__promt_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_promt.h"
    2 
    3 void ViewPromt::draw()
    4 {
    5  curs_set(1); // show cursor
    6 
    7  int li = text_offset_y;
    8  int ci = 0;
    9  for(std::string line : str_split(message + input, "\n"))
    10  {
    11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
    12  ci = line.length() + text_offset_x;
    13  }
    14 
    15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
    16  button_offset_y = height - text_offset_y;
    17 
    18  if(selection == 0)
    19  {
    20  wattron(win, A_REVERSE);
    21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    22  wattroff(win, A_REVERSE);
    23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    25  }
    26  else
    27  {
    28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    30  wattron(win, A_REVERSE);
    31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    32  wattroff(win, A_REVERSE);
    33  }
    34  wmove(win, li, ci);
    35 }
    36 
    37 void ViewPromt::setMessage(std::string message)
    38 {
    39  this->message = message;
    40 }
    41 
    42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
    43 {
    44  label_confirm = name;
    45  call_confirm = call;
    46 }
    47 
    48 void ViewPromt::setCancel(std::string name, bool cancelable)
    49 {
    50  label_cancel = name;
    51  this->cancelable = cancelable;
    52 }
    53 
    54 std::string ViewPromt::getInput()
    55 {
    56  return input;
    57 }
    58 
    59 std::function<void(int)> ViewPromt::keypress(int& key)
    60 {
    61  std::function<void(int)> ret = nullptr;
    62  switch(key)
    63  {
    64  case KEY_BACKSPACE:
    65  if(input.length())
    66  input.pop_back();
    67  break;
    68  case '\t':
    69  case KEY_LEFT:
    70  case KEY_RIGHT:
    71  selection = (selection + 1 ) % 2;
    72  break;
    73  case KEY_MOUSE:
    74  {
    75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    76  MEVENT event;
    77  bool hit = false;
    78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    79  {
    80  size_t column_start = start_x + button_offset_x;
    81  size_t row_start = start_y + button_offset_y;
    82  size_t mouse_x = event.x, mouse_y = event.y;
    83  if(mouse_y == row_start)
    84  {
    85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
    86  {
    87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    88  hit = true;
    89  selection = 0;
    90  }
    91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
    92  {
    93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    94  hit = true;
    95  selection = 1;
    96  }
    97  }
    98  }
    99  if(!hit)
    100  break;
    101 
    102  // fall through to next case
    103  [[fallthrough]];
    104  }
    105  case KEY_ENT:
    106  if(selection == 0) // exit
    107  key = -1; // do return from view
    108  else
    109  ret = call_confirm;
    110  break;
    111  default:
    112  break;
    113  }
    114 
    115  if(key >= ' ' && key <= '~')
    116  input += (char) key;
    117 
    118  if(key != KEY_ENT)
    119  repaint();
    120  return ret;
    121 }
    diff --git a/docs/html/view__promt_8h_source.html b/docs/html/view__promt_8h_source.html index 6acbb7b..3ffc2fc 100644 --- a/docs/html/view__promt_8h_source.html +++ b/docs/html/view__promt_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/view__selection_8cpp_source.html b/docs/html/view__selection_8cpp_source.html index d78a6f9..324fa41 100644 --- a/docs/html/view__selection_8cpp_source.html +++ b/docs/html/view__selection_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_selection.h"
    2 
    3 void ViewSelection::draw()
    4 {
    5  //curs_set(0); // hide cursor
    6  for(size_t i = 0; i < choices.size(); i++)
    7  {
    8  if(selection == i)
    9  wattron(win, A_REVERSE);
    10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
    11  if(selection == i)
    12  wattroff(win, A_REVERSE);
    13  }
    14 }
    15 
    16 void ViewSelection::addChoice(std::string name, call_t call)
    17 {
    18  choices.push_back(name);
    19  calls.push_back(call);
    20 }
    21 
    22 call_t ViewSelection::keypress(int& key)
    23 {
    24  call_t ret = nullptr;
    25  switch(key)
    26  {
    27  case KEY_UP:
    28  do
    29  selection = (selection - 1 + choices.size()) % choices.size();
    30  while(!choices[selection].length() && choices.size());
    31  break;
    32 
    33  case '\t':
    34  case KEY_DOWN:
    35  do
    36  selection = (selection + 1) % choices.size();
    37  while(!choices[selection].length() && choices.size());
    38  break;
    39 
    40  case KEY_MOUSE:
    41  {
    42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    43  MEVENT event;
    44  bool hit = false;
    45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    46  {
    47  size_t column_start = start_x + choice_offset_x;
    48  size_t row_start = start_y + choice_offset_y;
    49  size_t mouse_x = event.x, mouse_y = event.y;
    50  for(size_t i = 0; i < choices.size(); i++)
    51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
    52  {
    53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
    54  hit = true;
    55  selection = i;
    56  }
    57  }
    58  if(!hit)
    59  break;
    60 
    61  // fall through to next case
    62  [[fallthrough]];
    63  }
    64 
    65  case KEY_ENT:
    66  if(selection == choices.size() - 1) // exit
    67  key = -1; // do return from view
    68  else
    69  ret = calls[selection];
    70  break;
    71  default:
    72  break;
    73  }
    74  repaint();
    75  return ret;
    76 }
    diff --git a/docs/html/view__selection_8h_source.html b/docs/html/view__selection_8h_source.html index 19bac8c..e284347 100644 --- a/docs/html/view__selection_8h_source.html +++ b/docs/html/view__selection_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/firmware/requests.cpp b/firmware/requests.cpp index 55f5cf6..bd3c014 100644 --- a/firmware/requests.cpp +++ b/firmware/requests.cpp @@ -70,6 +70,14 @@ void handleRequest() case RQ_PWM_SET_VALUE: rqPwmSetValue(); break; + + case RQ_SET_REG: + rqSetRegister(); + break; + + case RQ_GET_REG: + rqGetRegister(); + break; default: break; @@ -244,3 +252,24 @@ void rqPwmSetValue() usart.writeByte(USART::MSG_OK); usart.flush(); } + +void rqSetRegister() +{ + usart.initTX(); + uint16_t reg = usart.readByte(); + uint16_t val = usart.readByte(); + + (*(volatile uint8_t *) reg) = val; + usart.writeByte((*(volatile uint8_t *) reg)); + usart.flush(); +} + +void rqGetRegister() +{ + usart.initTX(); + uint16_t reg = usart.readByte(); + + usart.writeByte((*(volatile uint8_t *) reg)); + usart.flush(); +} + diff --git a/firmware/requests.h b/firmware/requests.h index 418b003..336f8f5 100644 --- a/firmware/requests.h +++ b/firmware/requests.h @@ -20,9 +20,11 @@ constexpr static uint8_t RQ_DSW = 9; constexpr static uint8_t RQ_AA0 = 10; constexpr static uint8_t RQ_AA1 = 11; constexpr static uint8_t RQ_ADC = 12; -constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; -constexpr static uint8_t RQ_PWM_SET_FREQ = 14; -constexpr static uint8_t RQ_PWM_SET_VALUE = 15; +constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; +constexpr static uint8_t RQ_PWM_SET_FREQ = 14; +constexpr static uint8_t RQ_PWM_SET_VALUE = 15; +constexpr static uint8_t RQ_SET_REG = 16; +constexpr static uint8_t RQ_GET_REG = 17; uint8_t const rq_len[] = { /* RQ_DISC */ 1, @@ -40,7 +42,9 @@ uint8_t const rq_len[] = { /* RQ_ADC */ 2, /* RQ_ADC_DAC_STROKE */ 9, /* RQ_PWM_SET_FREQ */ 5, - /* RQ_PWM_SET_VALUE */ 2 + /* RQ_PWM_SET_VALUE */ 2, + /* RQ_SET_REG */ 3, + /* RQ_GET_REG */ 2 }; /** @@ -65,5 +69,7 @@ void rqAnalogRead(void); void rqAdcDacStroke(void); void rqPwmSetFreq(void); void rqPwmSetValue(void); +void rqSetRegister(void); +void rqGetRegister(void); #endif // REQUESTS_H From 8d00bb06001ad45cb25afd44d45b4deeb3d40ef0 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Wed, 29 May 2019 10:43:23 +0200 Subject: [PATCH 08/35] renamed read_timeout & write_timeout --- control/bin/b15fcli | Bin 89776 -> 0 bytes control/src/.idea/misc.xml | 7 + control/src/.idea/modules.xml | 8 + control/src/.idea/src.iml | 2 + control/src/.idea/vcs.xml | 6 + control/src/.idea/workspace.xml | 424 ++++ control/src/CMakeLists.txt | 34 + control/src/cmake-build-debug/CMakeCache.txt | 390 ++++ .../CMakeFiles/3.14.3/CMakeCCompiler.cmake | 75 + .../CMakeFiles/3.14.3/CMakeCXXCompiler.cmake | 78 + .../CMakeFiles/3.14.3/CMakeSystem.cmake | 15 + .../3.14.3/CompilerIdC/CMakeCCompilerId.c | 666 +++++++ .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 644 ++++++ .../CMakeDirectoryInformation.cmake | 16 + .../CMakeFiles/CMakeOutput.log | 821 ++++++++ .../CMakeFiles/Makefile.cmake | 52 + .../cmake-build-debug/CMakeFiles/Makefile2 | 113 ++ .../cmake-build-debug/CMakeFiles/Progress/1 | 1 + .../cmake-build-debug/CMakeFiles/Progress/10 | 1 + .../cmake-build-debug/CMakeFiles/Progress/11 | 1 + .../cmake-build-debug/CMakeFiles/Progress/12 | 1 + .../cmake-build-debug/CMakeFiles/Progress/2 | 1 + .../cmake-build-debug/CMakeFiles/Progress/3 | 1 + .../cmake-build-debug/CMakeFiles/Progress/4 | 1 + .../cmake-build-debug/CMakeFiles/Progress/5 | 1 + .../cmake-build-debug/CMakeFiles/Progress/6 | 1 + .../cmake-build-debug/CMakeFiles/Progress/7 | 1 + .../cmake-build-debug/CMakeFiles/Progress/8 | 1 + .../cmake-build-debug/CMakeFiles/Progress/9 | 1 + .../CMakeFiles/Progress/count.txt | 1 + .../CMakeFiles/TargetDirectories.txt | 3 + .../CMakeFiles/clion-environment.txt | 3 + .../CMakeFiles/clion-log.txt | 14 + .../CMakeFiles/cmake.check_cache | 1 + .../CMakeFiles/feature_tests.c | 38 + .../CMakeFiles/feature_tests.cxx | 405 ++++ .../CMakeFiles/progress.marks | 1 + .../CMakeFiles/src.dir/CXX.includecache | 242 +++ .../CMakeFiles/src.dir/DependInfo.cmake | 33 + .../CMakeFiles/src.dir/build.make | 248 +++ .../CMakeFiles/src.dir/cmake_clean.cmake | 20 + .../CMakeFiles/src.dir/depend.internal | 93 + .../CMakeFiles/src.dir/depend.make | 93 + .../CMakeFiles/src.dir/flags.make | 10 + .../CMakeFiles/src.dir/link.txt | 1 + .../CMakeFiles/src.dir/progress.make | 13 + control/src/cmake-build-debug/Makefile | 346 ++++ .../src/cmake-build-debug/cmake_install.cmake | 49 + control/src/cmake-build-debug/src.cbp | 169 ++ control/src/drv/b15f.cpp | 10 +- control/src/drv/usart.cpp | 12 +- control/src/drv/usart.h | 5 +- docs/html/annotated.html | 93 - docs/html/b15f_8cpp_source.html | 121 -- docs/html/b15f_8h_source.html | 115 -- docs/html/bc_s.png | Bin 676 -> 0 bytes docs/html/bdwn.png | Bin 147 -> 0 bytes docs/html/classB15F-members.html | 113 -- docs/html/classB15F.html | 1038 ---------- docs/html/classDot-members.html | 84 - docs/html/classDot.html | 204 -- docs/html/classDriverException-members.html | 85 - docs/html/classDriverException.html | 117 -- docs/html/classDriverException.png | Bin 481 -> 0 bytes docs/html/classPlottyFile-members.html | 108 - docs/html/classPlottyFile.html | 819 -------- docs/html/classTimeoutException-members.html | 86 - docs/html/classTimeoutException.html | 120 -- docs/html/classTimeoutException.png | Bin 480 -> 0 bytes docs/html/classUSART-members.html | 102 - docs/html/classUSART.html | 539 ----- docs/html/classUSARTException-members.html | 85 - docs/html/classUSARTException.html | 117 -- docs/html/classUSARTException.png | Bin 484 -> 0 bytes docs/html/classView-members.html | 97 - docs/html/classView.html | 165 -- docs/html/classView.png | Bin 1094 -> 0 bytes docs/html/classViewInfo-members.html | 107 - docs/html/classViewInfo.html | 193 -- docs/html/classViewInfo.png | Bin 556 -> 0 bytes docs/html/classViewMonitor-members.html | 111 -- docs/html/classViewMonitor.html | 205 -- docs/html/classViewMonitor.png | Bin 552 -> 0 bytes docs/html/classViewPromt-members.html | 113 -- docs/html/classViewPromt.html | 213 -- docs/html/classViewPromt.png | Bin 387 -> 0 bytes docs/html/classViewSelection-members.html | 102 - docs/html/classViewSelection.html | 180 -- docs/html/classViewSelection.png | Bin 435 -> 0 bytes docs/html/classes.html | 113 -- docs/html/cli_8cpp_source.html | 80 - docs/html/closed.png | Bin 132 -> 0 bytes .../dir_1788f8309b1a812dcb800a185471cf6c.html | 81 - .../dir_587c94d866dbb2f408f78cf41f9b2f8d.html | 81 - docs/html/doc.png | Bin 746 -> 0 bytes docs/html/dot_8cpp_source.html | 85 - docs/html/dot_8h_source.html | 86 - docs/html/doxygen.css | 1766 ----------------- docs/html/doxygen.png | Bin 3779 -> 0 bytes docs/html/driverexception_8h_source.html | 82 - docs/html/dynsections.js | 127 -- docs/html/files.html | 107 - docs/html/folderclosed.png | Bin 616 -> 0 bytes docs/html/folderopen.png | Bin 597 -> 0 bytes docs/html/functions.html | 363 ---- docs/html/functions_func.html | 334 ---- docs/html/functions_vars.html | 96 - docs/html/hierarchy.html | 94 - docs/html/index.html | 80 - docs/html/jquery.js | 35 - docs/html/menu.js | 50 - docs/html/menudata.js | 60 - docs/html/nav_f.png | Bin 153 -> 0 bytes docs/html/nav_g.png | Bin 95 -> 0 bytes docs/html/nav_h.png | Bin 98 -> 0 bytes docs/html/open.png | Bin 123 -> 0 bytes docs/html/plottyfile_8cpp_source.html | 109 - docs/html/plottyfile_8h_source.html | 110 - docs/html/search/all_0.html | 30 - docs/html/search/all_0.js | 10 - docs/html/search/all_1.html | 30 - docs/html/search/all_1.js | 5 - docs/html/search/all_2.html | 30 - docs/html/search/all_2.js | 6 - docs/html/search/all_3.html | 30 - docs/html/search/all_3.js | 12 - docs/html/search/all_4.html | 30 - docs/html/search/all_4.js | 5 - docs/html/search/all_5.html | 30 - docs/html/search/all_5.js | 4 - docs/html/search/all_6.html | 30 - docs/html/search/all_6.js | 23 - docs/html/search/all_7.html | 30 - docs/html/search/all_7.js | 5 - docs/html/search/all_8.html | 30 - docs/html/search/all_8.js | 4 - docs/html/search/all_9.html | 30 - docs/html/search/all_9.js | 8 - docs/html/search/all_a.html | 30 - docs/html/search/all_a.js | 9 - docs/html/search/all_b.html | 30 - docs/html/search/all_b.js | 20 - docs/html/search/all_c.html | 30 - docs/html/search/all_c.js | 6 - docs/html/search/all_d.html | 30 - docs/html/search/all_d.js | 5 - docs/html/search/all_e.html | 30 - docs/html/search/all_e.js | 8 - docs/html/search/all_f.html | 30 - docs/html/search/all_f.js | 8 - docs/html/search/classes_0.html | 30 - docs/html/search/classes_0.js | 4 - docs/html/search/classes_1.html | 30 - docs/html/search/classes_1.js | 5 - docs/html/search/classes_2.html | 30 - docs/html/search/classes_2.js | 4 - docs/html/search/classes_3.html | 30 - docs/html/search/classes_3.js | 4 - docs/html/search/classes_4.html | 30 - docs/html/search/classes_4.js | 5 - docs/html/search/classes_5.html | 30 - docs/html/search/classes_5.js | 8 - docs/html/search/close.png | Bin 273 -> 0 bytes docs/html/search/functions_0.html | 30 - docs/html/search/functions_0.js | 10 - docs/html/search/functions_1.html | 30 - docs/html/search/functions_1.js | 6 - docs/html/search/functions_2.html | 30 - docs/html/search/functions_2.js | 11 - docs/html/search/functions_3.html | 30 - docs/html/search/functions_3.js | 4 - docs/html/search/functions_4.html | 30 - docs/html/search/functions_4.js | 4 - docs/html/search/functions_5.html | 30 - docs/html/search/functions_5.js | 23 - docs/html/search/functions_6.html | 30 - docs/html/search/functions_6.js | 4 - docs/html/search/functions_7.html | 30 - docs/html/search/functions_7.js | 6 - docs/html/search/functions_8.html | 30 - docs/html/search/functions_8.js | 7 - docs/html/search/functions_9.html | 30 - docs/html/search/functions_9.js | 20 - docs/html/search/functions_a.html | 30 - docs/html/search/functions_a.js | 5 - docs/html/search/functions_b.html | 30 - docs/html/search/functions_b.js | 7 - docs/html/search/mag_sel.png | Bin 465 -> 0 bytes docs/html/search/nomatches.html | 12 - docs/html/search/pages_0.html | 30 - docs/html/search/pages_0.js | 4 - docs/html/search/search.css | 271 --- docs/html/search/search.js | 814 -------- docs/html/search/search_l.png | Bin 567 -> 0 bytes docs/html/search/search_m.png | Bin 158 -> 0 bytes docs/html/search/search_r.png | Bin 553 -> 0 bytes docs/html/search/searchdata.js | 27 - docs/html/search/variables_0.html | 30 - docs/html/search/variables_0.js | 4 - docs/html/search/variables_1.html | 30 - docs/html/search/variables_1.js | 5 - docs/html/search/variables_2.html | 30 - docs/html/search/variables_2.js | 4 - docs/html/search/variables_3.html | 30 - docs/html/search/variables_3.js | 5 - docs/html/search/variables_4.html | 30 - docs/html/search/variables_4.js | 4 - docs/html/splitbar.png | Bin 314 -> 0 bytes docs/html/sync_off.png | Bin 853 -> 0 bytes docs/html/sync_on.png | Bin 845 -> 0 bytes docs/html/tab_a.png | Bin 142 -> 0 bytes docs/html/tab_b.png | Bin 169 -> 0 bytes docs/html/tab_h.png | Bin 177 -> 0 bytes docs/html/tab_s.png | Bin 184 -> 0 bytes docs/html/tabs.css | 1 - docs/html/timeoutexception_8h_source.html | 82 - docs/html/ui_8cpp_source.html | 96 - docs/html/ui_8h_source.html | 81 - docs/html/usart_8cpp_source.html | 98 - docs/html/usart_8h_source.html | 97 - docs/html/usartexception_8h_source.html | 82 - docs/html/view_8cpp_source.html | 82 - docs/html/view_8h_source.html | 82 - docs/html/view__info_8cpp_source.html | 81 - docs/html/view__info_8h_source.html | 83 - docs/html/view__monitor_8cpp_source.html | 92 - docs/html/view__monitor_8h_source.html | 83 - docs/html/view__promt_8cpp_source.html | 81 - docs/html/view__promt_8h_source.html | 83 - docs/html/view__selection_8cpp_source.html | 81 - docs/html/view__selection_8h_source.html | 83 - 231 files changed, 5160 insertions(+), 13377 deletions(-) delete mode 100755 control/bin/b15fcli create mode 100644 control/src/.idea/misc.xml create mode 100644 control/src/.idea/modules.xml create mode 100644 control/src/.idea/src.iml create mode 100644 control/src/.idea/vcs.xml create mode 100644 control/src/.idea/workspace.xml create mode 100644 control/src/CMakeLists.txt create mode 100644 control/src/cmake-build-debug/CMakeCache.txt create mode 100644 control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeCCompiler.cmake create mode 100644 control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeCXXCompiler.cmake create mode 100644 control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeSystem.cmake create mode 100644 control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdC/CMakeCCompilerId.c create mode 100644 control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 control/src/cmake-build-debug/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 control/src/cmake-build-debug/CMakeFiles/CMakeOutput.log create mode 100644 control/src/cmake-build-debug/CMakeFiles/Makefile.cmake create mode 100644 control/src/cmake-build-debug/CMakeFiles/Makefile2 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/1 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/10 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/11 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/12 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/2 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/3 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/4 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/5 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/6 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/7 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/8 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/9 create mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/count.txt create mode 100644 control/src/cmake-build-debug/CMakeFiles/TargetDirectories.txt create mode 100644 control/src/cmake-build-debug/CMakeFiles/clion-environment.txt create mode 100644 control/src/cmake-build-debug/CMakeFiles/clion-log.txt create mode 100644 control/src/cmake-build-debug/CMakeFiles/cmake.check_cache create mode 100644 control/src/cmake-build-debug/CMakeFiles/feature_tests.c create mode 100644 control/src/cmake-build-debug/CMakeFiles/feature_tests.cxx create mode 100644 control/src/cmake-build-debug/CMakeFiles/progress.marks create mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/CXX.includecache create mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/DependInfo.cmake create mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/build.make create mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/cmake_clean.cmake create mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/depend.internal create mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/depend.make create mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/flags.make create mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/link.txt create mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/progress.make create mode 100644 control/src/cmake-build-debug/Makefile create mode 100644 control/src/cmake-build-debug/cmake_install.cmake create mode 100644 control/src/cmake-build-debug/src.cbp delete mode 100644 docs/html/annotated.html delete mode 100644 docs/html/b15f_8cpp_source.html delete mode 100644 docs/html/b15f_8h_source.html delete mode 100644 docs/html/bc_s.png delete mode 100644 docs/html/bdwn.png delete mode 100644 docs/html/classB15F-members.html delete mode 100644 docs/html/classB15F.html delete mode 100644 docs/html/classDot-members.html delete mode 100644 docs/html/classDot.html delete mode 100644 docs/html/classDriverException-members.html delete mode 100644 docs/html/classDriverException.html delete mode 100644 docs/html/classDriverException.png delete mode 100644 docs/html/classPlottyFile-members.html delete mode 100644 docs/html/classPlottyFile.html delete mode 100644 docs/html/classTimeoutException-members.html delete mode 100644 docs/html/classTimeoutException.html delete mode 100644 docs/html/classTimeoutException.png delete mode 100644 docs/html/classUSART-members.html delete mode 100644 docs/html/classUSART.html delete mode 100644 docs/html/classUSARTException-members.html delete mode 100644 docs/html/classUSARTException.html delete mode 100644 docs/html/classUSARTException.png delete mode 100644 docs/html/classView-members.html delete mode 100644 docs/html/classView.html delete mode 100644 docs/html/classView.png delete mode 100644 docs/html/classViewInfo-members.html delete mode 100644 docs/html/classViewInfo.html delete mode 100644 docs/html/classViewInfo.png delete mode 100644 docs/html/classViewMonitor-members.html delete mode 100644 docs/html/classViewMonitor.html delete mode 100644 docs/html/classViewMonitor.png delete mode 100644 docs/html/classViewPromt-members.html delete mode 100644 docs/html/classViewPromt.html delete mode 100644 docs/html/classViewPromt.png delete mode 100644 docs/html/classViewSelection-members.html delete mode 100644 docs/html/classViewSelection.html delete mode 100644 docs/html/classViewSelection.png delete mode 100644 docs/html/classes.html delete mode 100644 docs/html/cli_8cpp_source.html delete mode 100644 docs/html/closed.png delete mode 100644 docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html delete mode 100644 docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html delete mode 100644 docs/html/doc.png delete mode 100644 docs/html/dot_8cpp_source.html delete mode 100644 docs/html/dot_8h_source.html delete mode 100644 docs/html/doxygen.css delete mode 100644 docs/html/doxygen.png delete mode 100644 docs/html/driverexception_8h_source.html delete mode 100644 docs/html/dynsections.js delete mode 100644 docs/html/files.html delete mode 100644 docs/html/folderclosed.png delete mode 100644 docs/html/folderopen.png delete mode 100644 docs/html/functions.html delete mode 100644 docs/html/functions_func.html delete mode 100644 docs/html/functions_vars.html delete mode 100644 docs/html/hierarchy.html delete mode 100644 docs/html/index.html delete mode 100644 docs/html/jquery.js delete mode 100644 docs/html/menu.js delete mode 100644 docs/html/menudata.js delete mode 100644 docs/html/nav_f.png delete mode 100644 docs/html/nav_g.png delete mode 100644 docs/html/nav_h.png delete mode 100644 docs/html/open.png delete mode 100644 docs/html/plottyfile_8cpp_source.html delete mode 100644 docs/html/plottyfile_8h_source.html delete mode 100644 docs/html/search/all_0.html delete mode 100644 docs/html/search/all_0.js delete mode 100644 docs/html/search/all_1.html delete mode 100644 docs/html/search/all_1.js delete mode 100644 docs/html/search/all_2.html delete mode 100644 docs/html/search/all_2.js delete mode 100644 docs/html/search/all_3.html delete mode 100644 docs/html/search/all_3.js delete mode 100644 docs/html/search/all_4.html delete mode 100644 docs/html/search/all_4.js delete mode 100644 docs/html/search/all_5.html delete mode 100644 docs/html/search/all_5.js delete mode 100644 docs/html/search/all_6.html delete mode 100644 docs/html/search/all_6.js delete mode 100644 docs/html/search/all_7.html delete mode 100644 docs/html/search/all_7.js delete mode 100644 docs/html/search/all_8.html delete mode 100644 docs/html/search/all_8.js delete mode 100644 docs/html/search/all_9.html delete mode 100644 docs/html/search/all_9.js delete mode 100644 docs/html/search/all_a.html delete mode 100644 docs/html/search/all_a.js delete mode 100644 docs/html/search/all_b.html delete mode 100644 docs/html/search/all_b.js delete mode 100644 docs/html/search/all_c.html delete mode 100644 docs/html/search/all_c.js delete mode 100644 docs/html/search/all_d.html delete mode 100644 docs/html/search/all_d.js delete mode 100644 docs/html/search/all_e.html delete mode 100644 docs/html/search/all_e.js delete mode 100644 docs/html/search/all_f.html delete mode 100644 docs/html/search/all_f.js delete mode 100644 docs/html/search/classes_0.html delete mode 100644 docs/html/search/classes_0.js delete mode 100644 docs/html/search/classes_1.html delete mode 100644 docs/html/search/classes_1.js delete mode 100644 docs/html/search/classes_2.html delete mode 100644 docs/html/search/classes_2.js delete mode 100644 docs/html/search/classes_3.html delete mode 100644 docs/html/search/classes_3.js delete mode 100644 docs/html/search/classes_4.html delete mode 100644 docs/html/search/classes_4.js delete mode 100644 docs/html/search/classes_5.html delete mode 100644 docs/html/search/classes_5.js delete mode 100644 docs/html/search/close.png delete mode 100644 docs/html/search/functions_0.html delete mode 100644 docs/html/search/functions_0.js delete mode 100644 docs/html/search/functions_1.html delete mode 100644 docs/html/search/functions_1.js delete mode 100644 docs/html/search/functions_2.html delete mode 100644 docs/html/search/functions_2.js delete mode 100644 docs/html/search/functions_3.html delete mode 100644 docs/html/search/functions_3.js delete mode 100644 docs/html/search/functions_4.html delete mode 100644 docs/html/search/functions_4.js delete mode 100644 docs/html/search/functions_5.html delete mode 100644 docs/html/search/functions_5.js delete mode 100644 docs/html/search/functions_6.html delete mode 100644 docs/html/search/functions_6.js delete mode 100644 docs/html/search/functions_7.html delete mode 100644 docs/html/search/functions_7.js delete mode 100644 docs/html/search/functions_8.html delete mode 100644 docs/html/search/functions_8.js delete mode 100644 docs/html/search/functions_9.html delete mode 100644 docs/html/search/functions_9.js delete mode 100644 docs/html/search/functions_a.html delete mode 100644 docs/html/search/functions_a.js delete mode 100644 docs/html/search/functions_b.html delete mode 100644 docs/html/search/functions_b.js delete mode 100644 docs/html/search/mag_sel.png delete mode 100644 docs/html/search/nomatches.html delete mode 100644 docs/html/search/pages_0.html delete mode 100644 docs/html/search/pages_0.js delete mode 100644 docs/html/search/search.css delete mode 100644 docs/html/search/search.js delete mode 100644 docs/html/search/search_l.png delete mode 100644 docs/html/search/search_m.png delete mode 100644 docs/html/search/search_r.png delete mode 100644 docs/html/search/searchdata.js delete mode 100644 docs/html/search/variables_0.html delete mode 100644 docs/html/search/variables_0.js delete mode 100644 docs/html/search/variables_1.html delete mode 100644 docs/html/search/variables_1.js delete mode 100644 docs/html/search/variables_2.html delete mode 100644 docs/html/search/variables_2.js delete mode 100644 docs/html/search/variables_3.html delete mode 100644 docs/html/search/variables_3.js delete mode 100644 docs/html/search/variables_4.html delete mode 100644 docs/html/search/variables_4.js delete mode 100644 docs/html/splitbar.png delete mode 100644 docs/html/sync_off.png delete mode 100644 docs/html/sync_on.png delete mode 100644 docs/html/tab_a.png delete mode 100644 docs/html/tab_b.png delete mode 100644 docs/html/tab_h.png delete mode 100644 docs/html/tab_s.png delete mode 100644 docs/html/tabs.css delete mode 100644 docs/html/timeoutexception_8h_source.html delete mode 100644 docs/html/ui_8cpp_source.html delete mode 100644 docs/html/ui_8h_source.html delete mode 100644 docs/html/usart_8cpp_source.html delete mode 100644 docs/html/usart_8h_source.html delete mode 100644 docs/html/usartexception_8h_source.html delete mode 100644 docs/html/view_8cpp_source.html delete mode 100644 docs/html/view_8h_source.html delete mode 100644 docs/html/view__info_8cpp_source.html delete mode 100644 docs/html/view__info_8h_source.html delete mode 100644 docs/html/view__monitor_8cpp_source.html delete mode 100644 docs/html/view__monitor_8h_source.html delete mode 100644 docs/html/view__promt_8cpp_source.html delete mode 100644 docs/html/view__promt_8h_source.html delete mode 100644 docs/html/view__selection_8cpp_source.html delete mode 100644 docs/html/view__selection_8h_source.html diff --git a/control/bin/b15fcli b/control/bin/b15fcli deleted file mode 100755 index 864a09cf34677967f19d0897dcce89ccb8ca853f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89776 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 + + + + + \ No newline at end of file diff --git a/control/src/.idea/modules.xml b/control/src/.idea/modules.xml new file mode 100644 index 0000000..f669a0e --- /dev/null +++ b/control/src/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/control/src/.idea/src.iml b/control/src/.idea/src.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/control/src/.idea/src.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/control/src/.idea/vcs.xml b/control/src/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/control/src/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml new file mode 100644 index 0000000..b807b87 --- /dev/null +++ b/control/src/.idea/workspace.xml @@ -0,0 +1,424 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + read + read_timeout + read_timeout + write_timeout + + + ::read_timeout + USART::read_timeout + USART::write_timeout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    plottyfile.cpp
    -
    -
    -
    1 #include "plottyfile.h"
    2 
    4 {
    5  dots.push_back(dot);
    6 }
    7 
    9 {
    10  dots.push_back(dot);
    11 }
    12 
    13 void PlottyFile::setFunctionType(FunctionType function_type)
    14 {
    15  this->function_type = function_type;
    16 }
    17 
    18 void PlottyFile::setQuadrant(uint8_t quadrant)
    19 {
    20  if(quadrant < 1 || quadrant > 4)
    21  throw std::range_error("Ungueltiger Quadrant");
    22  this->quadrant = quadrant;
    23 }
    24 
    25 void PlottyFile::setRefX(uint16_t ref_x)
    26 {
    27  this->ref_x = ref_x;
    28 }
    29 
    30 void PlottyFile::setRefY(uint16_t ref_y)
    31 {
    32  this->ref_y = ref_y;
    33 }
    34 
    35 void PlottyFile::setParaFirstCurve(uint16_t para_first)
    36 {
    37  this->para_first = para_first;
    38 }
    39 
    40 void PlottyFile::setParaStepWidth(uint16_t para_stepwidth)
    41 {
    42  this->para_stepwidth = para_stepwidth;
    43 }
    44 
    45 void PlottyFile::setUnitX(std::string unit_x)
    46 {
    47  this->unit_x = unit_x;
    48 }
    49 
    50 void PlottyFile::setDescX(std::string desc_x)
    51 {
    52  this->desc_x = desc_x;
    53 }
    54 
    55 void PlottyFile::setUnitY(std::string unit_y)
    56 {
    57  this->unit_y = unit_y;
    58 }
    59 
    60 void PlottyFile::setDescY(std::string desc_y)
    61 {
    62  this->desc_y = desc_y;
    63 }
    64 
    65 void PlottyFile::setUnitPara(std::string unit_para)
    66 {
    67  this->unit_para = unit_para;
    68 }
    69 
    70 void PlottyFile::setDescPara(std::string desc_para)
    71 {
    72  this->desc_para = desc_para;
    73 }
    74 
    75 FunctionType PlottyFile::getFunctionType() const
    76 {
    77  return function_type;
    78 }
    79 
    80 uint8_t PlottyFile::getQuadrant() const
    81 {
    82  return quadrant;
    83 }
    84 
    85 uint16_t PlottyFile::getRefX() const
    86 {
    87  return ref_x;
    88 }
    89 
    90 uint16_t PlottyFile::getRefY() const
    91 {
    92  return ref_y;
    93 }
    94 
    96 {
    97  return para_first;
    98 }
    99 
    101 {
    102  return para_stepwidth;
    103 }
    104 
    105 std::string PlottyFile::getUnitX() const
    106 {
    107  return unit_x;
    108 }
    109 
    110 std::string PlottyFile::getDescX() const
    111 {
    112  return desc_x;
    113 }
    114 
    115 std::string PlottyFile::getUnitY() const
    116 {
    117  return unit_y;
    118 }
    119 
    120 std::string PlottyFile::getDescY() const
    121 {
    122  return desc_y;
    123 }
    124 
    125 std::string PlottyFile::getUnitPara() const
    126 {
    127  return unit_para;
    128 }
    129 
    130 std::string PlottyFile::getDescPara() const
    131 {
    132  return desc_para;
    133 }
    134 
    135 void PlottyFile::prepStr(std::string& str, uint8_t len)
    136 {
    137  if(str.length() > len)
    138  throw std::runtime_error("Zu grosser String.");
    139 
    140  if(str.length() != len)
    141  str += '\n';
    142 
    143  while(str.length() < len)
    144  str += '\0';
    145 }
    146 
    147 void PlottyFile::writeToFile(std::string filename)
    148 {
    149  prepStr(unit_x, STR_LEN_SHORT);
    150  prepStr(desc_x, STR_LEN_LARGE);
    151  prepStr(unit_y, STR_LEN_SHORT);
    152  prepStr(desc_y, STR_LEN_LARGE);
    153  prepStr(unit_para, STR_LEN_SHORT);
    154  prepStr(desc_para, STR_LEN_LARGE);
    155 
    156  std::ofstream file(filename);
    157 
    158  // write file header
    159  file.write(reinterpret_cast<char*>(&command), 1);
    160  file.write(head.c_str(), head.length());
    161  file.write(filetype.c_str(), filetype.length());
    162  file.write(reinterpret_cast<char*>(&version), 2);
    163  file.write(reinterpret_cast<char*>(&subversion), 2);
    164  file.put(static_cast<uint8_t>(function_type));
    165  file.write(reinterpret_cast<char*>(&quadrant), 1);
    166  file.write(reinterpret_cast<char*>(&ref_x), 2);
    167  file.write(reinterpret_cast<char*>(&ref_y), 2);
    168  file.write(reinterpret_cast<char*>(&para_first), 2);
    169  file.write(reinterpret_cast<char*>(&para_stepwidth), 2);
    170  file.write(unit_x.c_str(), unit_x.length());
    171  file.write(desc_x.c_str(), desc_x.length());
    172  file.write(unit_y.c_str(), unit_y.length());
    173  file.write(desc_y.c_str(), desc_y.length());
    174  file.write(unit_para.c_str(), unit_para.length());
    175  file.write(desc_para.c_str(), desc_para.length());
    176  file.write(reinterpret_cast<const char*>(&eof), 1);
    177 
    178  // make sure header size is 256 Byte
    179  while(file.tellp() < 256)
    180  file.put(0);
    181 
    182  for(Dot& dot : dots)
    183  {
    184  file.put((dot.getX() >> 8) | (static_cast<uint8_t>(dot.getCurve()) << 2));
    185  file.put(dot.getX() & 0xFF);
    186  file.put(dot.getY() >> 8);
    187  file.put(dot.getY() & 0xFF);
    188  }
    189 
    190  file.close();
    191 }
    192 
    193 void PlottyFile::startPlotty(std::string filename)
    194 {
    195  int code = system(("plotty --in " + filename).c_str());
    196  if(code)
    197  throw std::runtime_error("Fehler beim Aufruf von plotty");
    198 }
    -
    void setParaStepWidth(uint16_t para_stepwidth)
    Definition: plottyfile.cpp:40
    -
    uint8_t getQuadrant(void) const
    Definition: plottyfile.cpp:80
    -
    void startPlotty(std::string filename)
    Definition: plottyfile.cpp:193
    -
    void writeToFile(std::string filename)
    Definition: plottyfile.cpp:147
    -
    void setUnitX(std::string unit_x)
    Definition: plottyfile.cpp:45
    -
    void setUnitPara(std::string unit_para)
    Definition: plottyfile.cpp:65
    -
    void setDescY(std::string desc_y)
    Definition: plottyfile.cpp:60
    -
    void setQuadrant(uint8_t quadrant)
    Definition: plottyfile.cpp:18
    -
    std::string getDescY(void) const
    Definition: plottyfile.cpp:120
    -
    void setRefY(uint16_t ref_y)
    Definition: plottyfile.cpp:30
    -
    std::string getDescX(void) const
    Definition: plottyfile.cpp:110
    -
    void setFunctionType(FunctionType function_type)
    Definition: plottyfile.cpp:13
    -
    void setDescX(std::string desc_x)
    Definition: plottyfile.cpp:50
    -
    Definition: dot.h:12
    -
    void setRefX(uint16_t ref_x)
    Definition: plottyfile.cpp:25
    -
    void setUnitY(std::string unit_y)
    Definition: plottyfile.cpp:55
    -
    void addDot(Dot &dot)
    Definition: plottyfile.cpp:3
    -
    void setDescPara(std::string desc_para)
    Definition: plottyfile.cpp:70
    -
    uint16_t getParaStepWidth(void) const
    Definition: plottyfile.cpp:100
    -
    std::string getDescPara(void) const
    Definition: plottyfile.cpp:130
    -
    void setParaFirstCurve(uint16_t para_first)
    Definition: plottyfile.cpp:35
    -
    std::string getUnitY(void) const
    Definition: plottyfile.cpp:115
    -
    uint16_t getParaFirstCurve(void) const
    Definition: plottyfile.cpp:95
    -
    uint16_t getRefX(void) const
    Definition: plottyfile.cpp:85
    -
    std::string getUnitPara(void) const
    Definition: plottyfile.cpp:125
    -
    FunctionType getFunctionType(void) const
    Definition: plottyfile.cpp:75
    -
    uint16_t getRefY(void) const
    Definition: plottyfile.cpp:90
    -
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    - - - - diff --git a/docs/html/plottyfile_8h_source.html b/docs/html/plottyfile_8h_source.html deleted file mode 100644 index 1021496..0000000 --- a/docs/html/plottyfile_8h_source.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - -B15F: drv/plottyfile.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    plottyfile.h
    -
    -
    -
    1 #ifndef PLOTTYFILE_H
    2 #define PLOTTYFILE_H
    3 
    4 #include <iostream>
    5 #include <fstream>
    6 #include <exception>
    7 #include <vector>
    8 #include "dot.h"
    9 
    10 enum FunctionType
    11 {
    12  CurveFamily = 'S',
    13  Curve = 'C',
    14  Level = 'P'
    15 };
    16 
    20 {
    21 public:
    26  void addDot(Dot& dot);
    27 
    32  void addDot(Dot dot);
    33 
    38  void setFunctionType(FunctionType function_type);
    39 
    44  void setQuadrant(uint8_t quadrant);
    45 
    50  void setRefX(uint16_t ref_x);
    51 
    56  void setRefY(uint16_t ref_y);
    57 
    63  void setParaFirstCurve(uint16_t para_first);
    64 
    69  void setParaStepWidth(uint16_t para_stepwidth);
    70 
    75  void setUnitX(std::string unit_x);
    76 
    81  void setDescX(std::string desc_x);
    82 
    87  void setUnitY(std::string unit_y);
    88 
    93  void setDescY(std::string desc_y);
    94 
    99  void setUnitPara(std::string unit_para);
    104  void setDescPara(std::string desc_para);
    105 
    106 
    107 
    111  FunctionType getFunctionType(void) const;
    112 
    116  uint8_t getQuadrant(void) const;
    117 
    121  uint16_t getRefX(void) const;
    122 
    126  uint16_t getRefY(void) const;
    127 
    131  uint16_t getParaFirstCurve(void) const;
    132 
    136  uint16_t getParaStepWidth(void) const;
    137 
    141  std::string getUnitX(void) const;
    142 
    146  std::string getDescX(void) const;
    147 
    151  std::string getUnitY(void) const;
    152 
    156  std::string getDescY(void) const;
    157 
    161  std::string getUnitPara(void) const;
    162 
    166  std::string getDescPara(void) const;
    167 
    168 
    173  void writeToFile(std::string filename);
    174 
    179  void startPlotty(std::string filename);
    180 private:
    181  void prepStr(std::string& str, uint8_t len);
    182 
    183  std::vector<Dot> dots;
    184 
    185  int8_t command = 0x1D;
    186  const std::string head = "HTWK-HWLab";
    187  const std::string filetype = "MD";
    188  int16_t version = 1;
    189  int16_t subversion = 0;
    190  FunctionType function_type = FunctionType::Curve;
    191  uint8_t quadrant = 1;
    192  uint16_t ref_x = 1023;
    193  uint16_t ref_y = 1023;
    194  uint16_t para_first = 1;
    195  uint16_t para_stepwidth = 1;
    196  std::string unit_x;
    197  std::string desc_x;
    198  std::string unit_y;
    199  std::string desc_y;
    200  std::string unit_para;
    201  std::string desc_para;
    202  const uint8_t eof = 0xD;
    203 
    204  constexpr static uint8_t STR_LEN_SHORT = 10;
    205  constexpr static uint8_t STR_LEN_LARGE = 20;
    206 };
    207 
    208 #endif // PLOTTYFILE_H
    -
    void setParaStepWidth(uint16_t para_stepwidth)
    Definition: plottyfile.cpp:40
    -
    uint8_t getQuadrant(void) const
    Definition: plottyfile.cpp:80
    -
    void startPlotty(std::string filename)
    Definition: plottyfile.cpp:193
    -
    void writeToFile(std::string filename)
    Definition: plottyfile.cpp:147
    -
    void setUnitX(std::string unit_x)
    Definition: plottyfile.cpp:45
    -
    void setUnitPara(std::string unit_para)
    Definition: plottyfile.cpp:65
    -
    void setDescY(std::string desc_y)
    Definition: plottyfile.cpp:60
    -
    void setQuadrant(uint8_t quadrant)
    Definition: plottyfile.cpp:18
    -
    std::string getDescY(void) const
    Definition: plottyfile.cpp:120
    - -
    void setRefY(uint16_t ref_y)
    Definition: plottyfile.cpp:30
    -
    std::string getDescX(void) const
    Definition: plottyfile.cpp:110
    -
    void setFunctionType(FunctionType function_type)
    Definition: plottyfile.cpp:13
    -
    void setDescX(std::string desc_x)
    Definition: plottyfile.cpp:50
    -
    Definition: dot.h:12
    -
    void setRefX(uint16_t ref_x)
    Definition: plottyfile.cpp:25
    -
    void setUnitY(std::string unit_y)
    Definition: plottyfile.cpp:55
    -
    void addDot(Dot &dot)
    Definition: plottyfile.cpp:3
    -
    void setDescPara(std::string desc_para)
    Definition: plottyfile.cpp:70
    -
    uint16_t getParaStepWidth(void) const
    Definition: plottyfile.cpp:100
    -
    std::string getDescPara(void) const
    Definition: plottyfile.cpp:130
    -
    void setParaFirstCurve(uint16_t para_first)
    Definition: plottyfile.cpp:35
    -
    std::string getUnitY(void) const
    Definition: plottyfile.cpp:115
    -
    uint16_t getParaFirstCurve(void) const
    Definition: plottyfile.cpp:95
    -
    uint16_t getRefX(void) const
    Definition: plottyfile.cpp:85
    -
    std::string getUnitPara(void) const
    Definition: plottyfile.cpp:125
    -
    FunctionType getFunctionType(void) const
    Definition: plottyfile.cpp:75
    -
    uint16_t getRefY(void) const
    Definition: plottyfile.cpp:90
    -
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    - - - - diff --git a/docs/html/search/all_0.html b/docs/html/search/all_0.html deleted file mode 100644 index a52d5f0..0000000 --- a/docs/html/search/all_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js deleted file mode 100644 index c4bd927..0000000 --- a/docs/html/search/all_0.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['abort',['abort',['../classB15F.html#a3f09a418f9e3be5d1d750e4515c96f1e',1,'B15F::abort(std::string msg)'],['../classB15F.html#ac962a6a49bddd0e261a8c7d3aded23f8',1,'B15F::abort(std::exception &ex)']]], - ['activateselftestmode',['activateSelfTestMode',['../classB15F.html#ad9bf80ee2485fb5aac9926c6ef0731f1',1,'B15F']]], - ['adddot',['addDot',['../classPlottyFile.html#ae091e6eaaca16302f17572ac7dec6f7c',1,'PlottyFile::addDot(Dot &dot)'],['../classPlottyFile.html#a80e4b45219b4e9571992edfc28a28568',1,'PlottyFile::addDot(Dot dot)']]], - ['analogread',['analogRead',['../classB15F.html#ae0bd1f69751e2dc3c462db9213fc4627',1,'B15F']]], - ['analogsequence',['analogSequence',['../classB15F.html#ab82a324426c3063318c6cafb3089ae02',1,'B15F']]], - ['analogwrite0',['analogWrite0',['../classB15F.html#afc55fd590c7fa5c942d100cb60c4b0d3',1,'B15F']]], - ['analogwrite1',['analogWrite1',['../classB15F.html#a7f1becceac744f5cd2ad529748fd836f',1,'B15F']]] -]; diff --git a/docs/html/search/all_1.html b/docs/html/search/all_1.html deleted file mode 100644 index 0fcb704..0000000 --- a/docs/html/search/all_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js deleted file mode 100644 index 4a50fd7..0000000 --- a/docs/html/search/all_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['b15f',['B15F',['../classB15F.html',1,'']]], - ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]] -]; diff --git a/docs/html/search/all_2.html b/docs/html/search/all_2.html deleted file mode 100644 index 19c530f..0000000 --- a/docs/html/search/all_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js deleted file mode 100644 index 7200182..0000000 --- a/docs/html/search/all_2.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['clearinputbuffer',['clearInputBuffer',['../classUSART.html#a28a2b4c5ed66b2c3a81196f76884f156',1,'USART']]], - ['clearoutputbuffer',['clearOutputBuffer',['../classUSART.html#a756d268a8762c316f91ca3238972b0c1',1,'USART']]], - ['closedevice',['closeDevice',['../classUSART.html#af80d6291ac1d2df04cfa1d8d27458cc5',1,'USART']]] -]; diff --git a/docs/html/search/all_3.html b/docs/html/search/all_3.html deleted file mode 100644 index 1ae887f..0000000 --- a/docs/html/search/all_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js deleted file mode 100644 index 08afc23..0000000 --- a/docs/html/search/all_3.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['delay_5fms',['delay_ms',['../classB15F.html#aaffce20afb9f06bc4b7556c70ce76416',1,'B15F']]], - ['delay_5fus',['delay_us',['../classB15F.html#adcaac8ae8db3c28eccb499fbd720361f',1,'B15F']]], - ['digitalread0',['digitalRead0',['../classB15F.html#ae0df6d423deeb2fd610968bd1c72060e',1,'B15F']]], - ['digitalread1',['digitalRead1',['../classB15F.html#afc76b612dd4faeee0ac02a66b65af5f2',1,'B15F']]], - ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], - ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], - ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], - ['dot',['Dot',['../classDot.html',1,'Dot'],['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot::Dot()']]], - ['driverexception',['DriverException',['../classDriverException.html',1,'']]] -]; diff --git a/docs/html/search/all_4.html b/docs/html/search/all_4.html deleted file mode 100644 index 14c90ef..0000000 --- a/docs/html/search/all_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js deleted file mode 100644 index 4acd298..0000000 --- a/docs/html/search/all_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['exec',['exec',['../classB15F.html#a1a7ac52984ed7ecac008a3e4060eee3a',1,'B15F']]], - ['einführung',['Einführung',['../index.html',1,'']]] -]; diff --git a/docs/html/search/all_5.html b/docs/html/search/all_5.html deleted file mode 100644 index 60fa53e..0000000 --- a/docs/html/search/all_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js deleted file mode 100644 index 3641ddc..0000000 --- a/docs/html/search/all_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['flushoutputbuffer',['flushOutputBuffer',['../classUSART.html#adb6ff4d1cf1af79ca255c5a81780200d',1,'USART']]] -]; diff --git a/docs/html/search/all_6.html b/docs/html/search/all_6.html deleted file mode 100644 index 7180363..0000000 --- a/docs/html/search/all_6.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js deleted file mode 100644 index 9518d98..0000000 --- a/docs/html/search/all_6.js +++ /dev/null @@ -1,23 +0,0 @@ -var searchData= -[ - ['getbaudrate',['getBaudrate',['../classUSART.html#a4918672d8069df205378a528b1892db3',1,'USART']]], - ['getboardinfo',['getBoardInfo',['../classB15F.html#a4f01677e73d6d172a2c1cae9427a591b',1,'B15F']]], - ['getcurve',['getCurve',['../classDot.html#ad0ae7dc1a9be3d8d985affc089b34396',1,'Dot']]], - ['getdescpara',['getDescPara',['../classPlottyFile.html#a536967daae3b382a5d6575f55450e198',1,'PlottyFile']]], - ['getdescx',['getDescX',['../classPlottyFile.html#a9cf7baa569be308c2cf6e07cadded09d',1,'PlottyFile']]], - ['getdescy',['getDescY',['../classPlottyFile.html#ab4a847fd71a804182f211233e194df45',1,'PlottyFile']]], - ['getfunctiontype',['getFunctionType',['../classPlottyFile.html#a88bb7d8350ed5fbc7a40e8d903c94bdb',1,'PlottyFile']]], - ['getinstance',['getInstance',['../classB15F.html#a8b4533d232c55ef2aa967e39e2d23380',1,'B15F']]], - ['getparafirstcurve',['getParaFirstCurve',['../classPlottyFile.html#a40828c93d66fe80166c4f603d5bdfa48',1,'PlottyFile']]], - ['getparastepwidth',['getParaStepWidth',['../classPlottyFile.html#a9da23f2bb8e6eb1837fc992ffd4057db',1,'PlottyFile']]], - ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], - ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], - ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], - ['getregister',['getRegister',['../classB15F.html#a43b477a9e2e5b1b2142958fa5e1a78b3',1,'B15F']]], - ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], - ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], - ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], - ['getunity',['getUnitY',['../classPlottyFile.html#a746b96036872dbece204e9739f3413b6',1,'PlottyFile']]], - ['getx',['getX',['../classDot.html#a029f0cc99c474122b77a708a317e7f77',1,'Dot']]], - ['gety',['getY',['../classDot.html#a8fcb987e6308d8184d1a2c8692227e58',1,'Dot']]] -]; diff --git a/docs/html/search/all_7.html b/docs/html/search/all_7.html deleted file mode 100644 index ee6d2e4..0000000 --- a/docs/html/search/all_7.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js deleted file mode 100644 index fd5dff3..0000000 --- a/docs/html/search/all_7.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], - ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] -]; diff --git a/docs/html/search/all_8.html b/docs/html/search/all_8.html deleted file mode 100644 index 7829aa4..0000000 --- a/docs/html/search/all_8.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js deleted file mode 100644 index bd75d34..0000000 --- a/docs/html/search/all_8.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['opendevice',['openDevice',['../classUSART.html#a5f7e2abda2ec4a68a5fdb8ee2f8a940a',1,'USART']]] -]; diff --git a/docs/html/search/all_9.html b/docs/html/search/all_9.html deleted file mode 100644 index e4242c7..0000000 --- a/docs/html/search/all_9.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js deleted file mode 100644 index c3ed16c..0000000 --- a/docs/html/search/all_9.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]], - ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]], - ['printstatistics',['printStatistics',['../classUSART.html#a33559bb8f0eda33a489d47b9c9227b59',1,'USART']]], - ['pwmsetfrequency',['pwmSetFrequency',['../classB15F.html#ac6f6532bb9550a0632c28b98c157d0a1',1,'B15F']]], - ['pwmsetvalue',['pwmSetValue',['../classB15F.html#af9aad3c0db5d5a8b37219d713e1977ee',1,'B15F']]] -]; diff --git a/docs/html/search/all_a.html b/docs/html/search/all_a.html deleted file mode 100644 index 47a4a78..0000000 --- a/docs/html/search/all_a.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js deleted file mode 100644 index 9759958..0000000 --- a/docs/html/search/all_a.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['readbyte',['readByte',['../classUSART.html#a8f54b98b26bfe084359a5604bda82562',1,'USART']]], - ['readdipswitch',['readDipSwitch',['../classB15F.html#a6f858f21ea81d491b5031b3644a2239a',1,'B15F']]], - ['readint',['readInt',['../classUSART.html#a1534c229db71a375e556cf1e7d0b8119',1,'USART']]], - ['reconnect',['reconnect',['../classB15F.html#a52557b375443c180a044e7d4e80a1ae7',1,'B15F']]], - ['reconnect_5ftimeout',['RECONNECT_TIMEOUT',['../classB15F.html#a040951746fbfd632e12bd1ad14578816',1,'B15F']]], - ['reconnect_5ftries',['RECONNECT_TRIES',['../classB15F.html#a6c4895bdbcd71ff6743becf97985c2dc',1,'B15F']]] -]; diff --git a/docs/html/search/all_b.html b/docs/html/search/all_b.html deleted file mode 100644 index 1320a43..0000000 --- a/docs/html/search/all_b.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js deleted file mode 100644 index 552513c..0000000 --- a/docs/html/search/all_b.js +++ /dev/null @@ -1,20 +0,0 @@ -var searchData= -[ - ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], - ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], - ['setdescpara',['setDescPara',['../classPlottyFile.html#a431904143c3c1164a2e8b8cfec3c77ab',1,'PlottyFile']]], - ['setdescx',['setDescX',['../classPlottyFile.html#aa0449c290265d55d6223b19cf0a88b0a',1,'PlottyFile']]], - ['setdescy',['setDescY',['../classPlottyFile.html#a38a3a4dfc76bc70523727584bf01d590',1,'PlottyFile']]], - ['setfunctiontype',['setFunctionType',['../classPlottyFile.html#a4e5ab1ebb012a5cc1a3d6458a4cd512f',1,'PlottyFile']]], - ['setparafirstcurve',['setParaFirstCurve',['../classPlottyFile.html#aa676414793becb975506f48d6e949dd0',1,'PlottyFile']]], - ['setparastepwidth',['setParaStepWidth',['../classPlottyFile.html#a6caebd31e04e2e7081cc007047350355',1,'PlottyFile']]], - ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], - ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], - ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], - ['setregister',['setRegister',['../classB15F.html#a2735424cf98bd0e2892b5a9b6eb24582',1,'B15F']]], - ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], - ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], - ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], - ['setunity',['setUnitY',['../classPlottyFile.html#abb18c814f435926f741f7ceb310f3059',1,'PlottyFile']]], - ['startplotty',['startPlotty',['../classPlottyFile.html#a08a115ef10458cadfe76077d623313df',1,'PlottyFile']]] -]; diff --git a/docs/html/search/all_c.html b/docs/html/search/all_c.html deleted file mode 100644 index 32a3a1b..0000000 --- a/docs/html/search/all_c.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js deleted file mode 100644 index 57a58a5..0000000 --- a/docs/html/search/all_c.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], - ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], - ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'']]] -]; diff --git a/docs/html/search/all_d.html b/docs/html/search/all_d.html deleted file mode 100644 index a386096..0000000 --- a/docs/html/search/all_d.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js deleted file mode 100644 index c030e1b..0000000 --- a/docs/html/search/all_d.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['usart',['USART',['../classUSART.html',1,'']]], - ['usartexception',['USARTException',['../classUSARTException.html',1,'']]] -]; diff --git a/docs/html/search/all_e.html b/docs/html/search/all_e.html deleted file mode 100644 index 2931618..0000000 --- a/docs/html/search/all_e.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js deleted file mode 100644 index 27f785f..0000000 --- a/docs/html/search/all_e.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['view',['View',['../classView.html',1,'']]], - ['viewinfo',['ViewInfo',['../classViewInfo.html',1,'']]], - ['viewmonitor',['ViewMonitor',['../classViewMonitor.html',1,'']]], - ['viewpromt',['ViewPromt',['../classViewPromt.html',1,'']]], - ['viewselection',['ViewSelection',['../classViewSelection.html',1,'']]] -]; diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html deleted file mode 100644 index ca42a52..0000000 --- a/docs/html/search/all_f.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js deleted file mode 100644 index 6a81098..0000000 --- a/docs/html/search/all_f.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]], - ['writebyte',['writeByte',['../classUSART.html#a60eadbe9956bab8144ee96d89eacd9f5',1,'USART']]], - ['writeint',['writeInt',['../classUSART.html#a78b30d9aa863f38745e982860392599a',1,'USART']]], - ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]], - ['writeu32',['writeU32',['../classUSART.html#a68c2d1cb7172813ae8ed61360fad47f6',1,'USART']]] -]; diff --git a/docs/html/search/classes_0.html b/docs/html/search/classes_0.html deleted file mode 100644 index d585e6a..0000000 --- a/docs/html/search/classes_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js deleted file mode 100644 index 7622f87..0000000 --- a/docs/html/search/classes_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['b15f',['B15F',['../classB15F.html',1,'']]] -]; diff --git a/docs/html/search/classes_1.html b/docs/html/search/classes_1.html deleted file mode 100644 index baeb182..0000000 --- a/docs/html/search/classes_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/classes_1.js b/docs/html/search/classes_1.js deleted file mode 100644 index c2d5cc3..0000000 --- a/docs/html/search/classes_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['dot',['Dot',['../classDot.html',1,'']]], - ['driverexception',['DriverException',['../classDriverException.html',1,'']]] -]; diff --git a/docs/html/search/classes_2.html b/docs/html/search/classes_2.html deleted file mode 100644 index d267279..0000000 --- a/docs/html/search/classes_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/classes_2.js b/docs/html/search/classes_2.js deleted file mode 100644 index ca8950f..0000000 --- a/docs/html/search/classes_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]] -]; diff --git a/docs/html/search/classes_3.html b/docs/html/search/classes_3.html deleted file mode 100644 index 8a5cbe1..0000000 --- a/docs/html/search/classes_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/classes_3.js b/docs/html/search/classes_3.js deleted file mode 100644 index b7d0b63..0000000 --- a/docs/html/search/classes_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'']]] -]; diff --git a/docs/html/search/classes_4.html b/docs/html/search/classes_4.html deleted file mode 100644 index 300b9ab..0000000 --- a/docs/html/search/classes_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/classes_4.js b/docs/html/search/classes_4.js deleted file mode 100644 index c030e1b..0000000 --- a/docs/html/search/classes_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['usart',['USART',['../classUSART.html',1,'']]], - ['usartexception',['USARTException',['../classUSARTException.html',1,'']]] -]; diff --git a/docs/html/search/classes_5.html b/docs/html/search/classes_5.html deleted file mode 100644 index e7afb2c..0000000 --- a/docs/html/search/classes_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/classes_5.js b/docs/html/search/classes_5.js deleted file mode 100644 index 27f785f..0000000 --- a/docs/html/search/classes_5.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['view',['View',['../classView.html',1,'']]], - ['viewinfo',['ViewInfo',['../classViewInfo.html',1,'']]], - ['viewmonitor',['ViewMonitor',['../classViewMonitor.html',1,'']]], - ['viewpromt',['ViewPromt',['../classViewPromt.html',1,'']]], - ['viewselection',['ViewSelection',['../classViewSelection.html',1,'']]] -]; diff --git a/docs/html/search/close.png b/docs/html/search/close.png deleted file mode 100644 index 9342d3dfeea7b7c4ee610987e717804b5a42ceb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN diff --git a/docs/html/search/functions_0.html b/docs/html/search/functions_0.html deleted file mode 100644 index 8a729f7..0000000 --- a/docs/html/search/functions_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js deleted file mode 100644 index c4bd927..0000000 --- a/docs/html/search/functions_0.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['abort',['abort',['../classB15F.html#a3f09a418f9e3be5d1d750e4515c96f1e',1,'B15F::abort(std::string msg)'],['../classB15F.html#ac962a6a49bddd0e261a8c7d3aded23f8',1,'B15F::abort(std::exception &ex)']]], - ['activateselftestmode',['activateSelfTestMode',['../classB15F.html#ad9bf80ee2485fb5aac9926c6ef0731f1',1,'B15F']]], - ['adddot',['addDot',['../classPlottyFile.html#ae091e6eaaca16302f17572ac7dec6f7c',1,'PlottyFile::addDot(Dot &dot)'],['../classPlottyFile.html#a80e4b45219b4e9571992edfc28a28568',1,'PlottyFile::addDot(Dot dot)']]], - ['analogread',['analogRead',['../classB15F.html#ae0bd1f69751e2dc3c462db9213fc4627',1,'B15F']]], - ['analogsequence',['analogSequence',['../classB15F.html#ab82a324426c3063318c6cafb3089ae02',1,'B15F']]], - ['analogwrite0',['analogWrite0',['../classB15F.html#afc55fd590c7fa5c942d100cb60c4b0d3',1,'B15F']]], - ['analogwrite1',['analogWrite1',['../classB15F.html#a7f1becceac744f5cd2ad529748fd836f',1,'B15F']]] -]; diff --git a/docs/html/search/functions_1.html b/docs/html/search/functions_1.html deleted file mode 100644 index d4929aa..0000000 --- a/docs/html/search/functions_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_1.js b/docs/html/search/functions_1.js deleted file mode 100644 index 7200182..0000000 --- a/docs/html/search/functions_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['clearinputbuffer',['clearInputBuffer',['../classUSART.html#a28a2b4c5ed66b2c3a81196f76884f156',1,'USART']]], - ['clearoutputbuffer',['clearOutputBuffer',['../classUSART.html#a756d268a8762c316f91ca3238972b0c1',1,'USART']]], - ['closedevice',['closeDevice',['../classUSART.html#af80d6291ac1d2df04cfa1d8d27458cc5',1,'USART']]] -]; diff --git a/docs/html/search/functions_2.html b/docs/html/search/functions_2.html deleted file mode 100644 index 07e3fda..0000000 --- a/docs/html/search/functions_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js deleted file mode 100644 index 7c01e06..0000000 --- a/docs/html/search/functions_2.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['delay_5fms',['delay_ms',['../classB15F.html#aaffce20afb9f06bc4b7556c70ce76416',1,'B15F']]], - ['delay_5fus',['delay_us',['../classB15F.html#adcaac8ae8db3c28eccb499fbd720361f',1,'B15F']]], - ['digitalread0',['digitalRead0',['../classB15F.html#ae0df6d423deeb2fd610968bd1c72060e',1,'B15F']]], - ['digitalread1',['digitalRead1',['../classB15F.html#afc76b612dd4faeee0ac02a66b65af5f2',1,'B15F']]], - ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], - ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], - ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], - ['dot',['Dot',['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot']]] -]; diff --git a/docs/html/search/functions_3.html b/docs/html/search/functions_3.html deleted file mode 100644 index 40bd389..0000000 --- a/docs/html/search/functions_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_3.js b/docs/html/search/functions_3.js deleted file mode 100644 index fb3f662..0000000 --- a/docs/html/search/functions_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['exec',['exec',['../classB15F.html#a1a7ac52984ed7ecac008a3e4060eee3a',1,'B15F']]] -]; diff --git a/docs/html/search/functions_4.html b/docs/html/search/functions_4.html deleted file mode 100644 index 8a4df4c..0000000 --- a/docs/html/search/functions_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js deleted file mode 100644 index 3641ddc..0000000 --- a/docs/html/search/functions_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['flushoutputbuffer',['flushOutputBuffer',['../classUSART.html#adb6ff4d1cf1af79ca255c5a81780200d',1,'USART']]] -]; diff --git a/docs/html/search/functions_5.html b/docs/html/search/functions_5.html deleted file mode 100644 index 2b983b2..0000000 --- a/docs/html/search/functions_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js deleted file mode 100644 index 9518d98..0000000 --- a/docs/html/search/functions_5.js +++ /dev/null @@ -1,23 +0,0 @@ -var searchData= -[ - ['getbaudrate',['getBaudrate',['../classUSART.html#a4918672d8069df205378a528b1892db3',1,'USART']]], - ['getboardinfo',['getBoardInfo',['../classB15F.html#a4f01677e73d6d172a2c1cae9427a591b',1,'B15F']]], - ['getcurve',['getCurve',['../classDot.html#ad0ae7dc1a9be3d8d985affc089b34396',1,'Dot']]], - ['getdescpara',['getDescPara',['../classPlottyFile.html#a536967daae3b382a5d6575f55450e198',1,'PlottyFile']]], - ['getdescx',['getDescX',['../classPlottyFile.html#a9cf7baa569be308c2cf6e07cadded09d',1,'PlottyFile']]], - ['getdescy',['getDescY',['../classPlottyFile.html#ab4a847fd71a804182f211233e194df45',1,'PlottyFile']]], - ['getfunctiontype',['getFunctionType',['../classPlottyFile.html#a88bb7d8350ed5fbc7a40e8d903c94bdb',1,'PlottyFile']]], - ['getinstance',['getInstance',['../classB15F.html#a8b4533d232c55ef2aa967e39e2d23380',1,'B15F']]], - ['getparafirstcurve',['getParaFirstCurve',['../classPlottyFile.html#a40828c93d66fe80166c4f603d5bdfa48',1,'PlottyFile']]], - ['getparastepwidth',['getParaStepWidth',['../classPlottyFile.html#a9da23f2bb8e6eb1837fc992ffd4057db',1,'PlottyFile']]], - ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], - ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], - ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], - ['getregister',['getRegister',['../classB15F.html#a43b477a9e2e5b1b2142958fa5e1a78b3',1,'B15F']]], - ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], - ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], - ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], - ['getunity',['getUnitY',['../classPlottyFile.html#a746b96036872dbece204e9739f3413b6',1,'PlottyFile']]], - ['getx',['getX',['../classDot.html#a029f0cc99c474122b77a708a317e7f77',1,'Dot']]], - ['gety',['getY',['../classDot.html#a8fcb987e6308d8184d1a2c8692227e58',1,'Dot']]] -]; diff --git a/docs/html/search/functions_6.html b/docs/html/search/functions_6.html deleted file mode 100644 index f7d283d..0000000 --- a/docs/html/search/functions_6.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_6.js b/docs/html/search/functions_6.js deleted file mode 100644 index bd75d34..0000000 --- a/docs/html/search/functions_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['opendevice',['openDevice',['../classUSART.html#a5f7e2abda2ec4a68a5fdb8ee2f8a940a',1,'USART']]] -]; diff --git a/docs/html/search/functions_7.html b/docs/html/search/functions_7.html deleted file mode 100644 index a74fe44..0000000 --- a/docs/html/search/functions_7.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_7.js b/docs/html/search/functions_7.js deleted file mode 100644 index 939b6a3..0000000 --- a/docs/html/search/functions_7.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['printstatistics',['printStatistics',['../classUSART.html#a33559bb8f0eda33a489d47b9c9227b59',1,'USART']]], - ['pwmsetfrequency',['pwmSetFrequency',['../classB15F.html#ac6f6532bb9550a0632c28b98c157d0a1',1,'B15F']]], - ['pwmsetvalue',['pwmSetValue',['../classB15F.html#af9aad3c0db5d5a8b37219d713e1977ee',1,'B15F']]] -]; diff --git a/docs/html/search/functions_8.html b/docs/html/search/functions_8.html deleted file mode 100644 index 75fc0be..0000000 --- a/docs/html/search/functions_8.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_8.js b/docs/html/search/functions_8.js deleted file mode 100644 index 5d35f1d..0000000 --- a/docs/html/search/functions_8.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['readbyte',['readByte',['../classUSART.html#a8f54b98b26bfe084359a5604bda82562',1,'USART']]], - ['readdipswitch',['readDipSwitch',['../classB15F.html#a6f858f21ea81d491b5031b3644a2239a',1,'B15F']]], - ['readint',['readInt',['../classUSART.html#a1534c229db71a375e556cf1e7d0b8119',1,'USART']]], - ['reconnect',['reconnect',['../classB15F.html#a52557b375443c180a044e7d4e80a1ae7',1,'B15F']]] -]; diff --git a/docs/html/search/functions_9.html b/docs/html/search/functions_9.html deleted file mode 100644 index 7541c9e..0000000 --- a/docs/html/search/functions_9.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_9.js b/docs/html/search/functions_9.js deleted file mode 100644 index 552513c..0000000 --- a/docs/html/search/functions_9.js +++ /dev/null @@ -1,20 +0,0 @@ -var searchData= -[ - ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], - ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], - ['setdescpara',['setDescPara',['../classPlottyFile.html#a431904143c3c1164a2e8b8cfec3c77ab',1,'PlottyFile']]], - ['setdescx',['setDescX',['../classPlottyFile.html#aa0449c290265d55d6223b19cf0a88b0a',1,'PlottyFile']]], - ['setdescy',['setDescY',['../classPlottyFile.html#a38a3a4dfc76bc70523727584bf01d590',1,'PlottyFile']]], - ['setfunctiontype',['setFunctionType',['../classPlottyFile.html#a4e5ab1ebb012a5cc1a3d6458a4cd512f',1,'PlottyFile']]], - ['setparafirstcurve',['setParaFirstCurve',['../classPlottyFile.html#aa676414793becb975506f48d6e949dd0',1,'PlottyFile']]], - ['setparastepwidth',['setParaStepWidth',['../classPlottyFile.html#a6caebd31e04e2e7081cc007047350355',1,'PlottyFile']]], - ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], - ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], - ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], - ['setregister',['setRegister',['../classB15F.html#a2735424cf98bd0e2892b5a9b6eb24582',1,'B15F']]], - ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], - ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], - ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], - ['setunity',['setUnitY',['../classPlottyFile.html#abb18c814f435926f741f7ceb310f3059',1,'PlottyFile']]], - ['startplotty',['startPlotty',['../classPlottyFile.html#a08a115ef10458cadfe76077d623313df',1,'PlottyFile']]] -]; diff --git a/docs/html/search/functions_a.html b/docs/html/search/functions_a.html deleted file mode 100644 index 5a5be63..0000000 --- a/docs/html/search/functions_a.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_a.js b/docs/html/search/functions_a.js deleted file mode 100644 index 4b801c0..0000000 --- a/docs/html/search/functions_a.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], - ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]] -]; diff --git a/docs/html/search/functions_b.html b/docs/html/search/functions_b.html deleted file mode 100644 index fc2d5aa..0000000 --- a/docs/html/search/functions_b.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/functions_b.js b/docs/html/search/functions_b.js deleted file mode 100644 index 59b6148..0000000 --- a/docs/html/search/functions_b.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['writebyte',['writeByte',['../classUSART.html#a60eadbe9956bab8144ee96d89eacd9f5',1,'USART']]], - ['writeint',['writeInt',['../classUSART.html#a78b30d9aa863f38745e982860392599a',1,'USART']]], - ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]], - ['writeu32',['writeU32',['../classUSART.html#a68c2d1cb7172813ae8ed61360fad47f6',1,'USART']]] -]; diff --git a/docs/html/search/mag_sel.png b/docs/html/search/mag_sel.png deleted file mode 100644 index 39c0ed52a25dd9d080ee0d42ae6c6042bdfa04d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!2%?$TA$hhDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~NU84L`?eGCi_EEpJ?t}-xGu`@87+QPtK?83kxQ`TapwHK(CDaqU2h2ejD|C#+j z9%q3^WHAE+w=f7ZGR&GI0Tg5}@$_|Nf5gMiEhFgvHvB$N=!mC_V~EE2vzPXI9ZnEo zd+1zHor@dYLod2Y{ z@R$7$Z!PXTbY$|@#T!bMzm?`b<(R`cbw(gxJHzu zB$lLFB^RXvDF!10LknF)BV7aY5JN*NBMU1-b8Q0yD+2>vd*|CI8glbfGSez?Ylunu RoetE%;OXk;vd$@?2>>CYplSdB diff --git a/docs/html/search/nomatches.html b/docs/html/search/nomatches.html deleted file mode 100644 index 4377320..0000000 --- a/docs/html/search/nomatches.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - -
    -
    No Matches
    -
    - - diff --git a/docs/html/search/pages_0.html b/docs/html/search/pages_0.html deleted file mode 100644 index 32cbf49..0000000 --- a/docs/html/search/pages_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js deleted file mode 100644 index abe03ca..0000000 --- a/docs/html/search/pages_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['einführung',['Einführung',['../index.html',1,'']]] -]; diff --git a/docs/html/search/search.css b/docs/html/search/search.css deleted file mode 100644 index 3cf9df9..0000000 --- a/docs/html/search/search.css +++ /dev/null @@ -1,271 +0,0 @@ -/*---------------- Search Box */ - -#FSearchBox { - float: left; -} - -#MSearchBox { - white-space : nowrap; - float: none; - margin-top: 8px; - right: 0px; - width: 170px; - height: 24px; - z-index: 102; -} - -#MSearchBox .left -{ - display:block; - position:absolute; - left:10px; - width:20px; - height:19px; - background:url('search_l.png') no-repeat; - background-position:right; -} - -#MSearchSelect { - display:block; - position:absolute; - width:20px; - height:19px; -} - -.left #MSearchSelect { - left:4px; -} - -.right #MSearchSelect { - right:5px; -} - -#MSearchField { - display:block; - position:absolute; - height:19px; - background:url('search_m.png') repeat-x; - border:none; - width:115px; - margin-left:20px; - padding-left:4px; - color: #909090; - outline: none; - font: 9pt Arial, Verdana, sans-serif; - -webkit-border-radius: 0px; -} - -#FSearchBox #MSearchField { - margin-left:15px; -} - -#MSearchBox .right { - display:block; - position:absolute; - right:10px; - top:8px; - width:20px; - height:19px; - background:url('search_r.png') no-repeat; - background-position:left; -} - -#MSearchClose { - display: none; - position: absolute; - top: 4px; - background : none; - border: none; - margin: 0px 4px 0px 0px; - padding: 0px 0px; - outline: none; -} - -.left #MSearchClose { - left: 6px; -} - -.right #MSearchClose { - right: 2px; -} - -.MSearchBoxActive #MSearchField { - color: #000000; -} - -/*---------------- Search filter selection */ - -#MSearchSelectWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #90A5CE; - background-color: #F9FAFC; - z-index: 10001; - padding-top: 4px; - padding-bottom: 4px; - -moz-border-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -.SelectItem { - font: 8pt Arial, Verdana, sans-serif; - padding-left: 2px; - padding-right: 12px; - border: 0px; -} - -span.SelectionMark { - margin-right: 4px; - font-family: monospace; - outline-style: none; - text-decoration: none; -} - -a.SelectItem { - display: block; - outline-style: none; - color: #000000; - text-decoration: none; - padding-left: 6px; - padding-right: 12px; -} - -a.SelectItem:focus, -a.SelectItem:active { - color: #000000; - outline-style: none; - text-decoration: none; -} - -a.SelectItem:hover { - color: #FFFFFF; - background-color: #3D578C; - outline-style: none; - text-decoration: none; - cursor: pointer; - display: block; -} - -/*---------------- Search results window */ - -iframe#MSearchResults { - width: 60ex; - height: 15em; -} - -#MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #000; - background-color: #EEF1F7; - z-index:10000; -} - -/* ----------------------------------- */ - - -#SRIndex { - clear:both; - padding-bottom: 15px; -} - -.SREntry { - font-size: 10pt; - padding-left: 1ex; -} - -.SRPage .SREntry { - font-size: 8pt; - padding: 1px 5px; -} - -body.SRPage { - margin: 5px 2px; -} - -.SRChildren { - padding-left: 3ex; padding-bottom: .5em -} - -.SRPage .SRChildren { - display: none; -} - -.SRSymbol { - font-weight: bold; - color: #425E97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRScope { - display: block; - color: #425E97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRSymbol:focus, a.SRSymbol:active, -a.SRScope:focus, a.SRScope:active { - text-decoration: underline; -} - -span.SRScope { - padding-left: 4px; -} - -.SRPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; -} - -.SRResult { - display: none; -} - -DIV.searchresults { - margin-left: 10px; - margin-right: 10px; -} - -/*---------------- External search page results */ - -.searchresult { - background-color: #F0F3F8; -} - -.pages b { - color: white; - padding: 5px 5px 3px 5px; - background-image: url("../tab_a.png"); - background-repeat: repeat-x; - text-shadow: 0 1px 1px #000000; -} - -.pages { - line-height: 17px; - margin-left: 4px; - text-decoration: none; -} - -.hl { - font-weight: bold; -} - -#searchresults { - margin-bottom: 20px; -} - -.searchpages { - margin-top: 10px; -} - diff --git a/docs/html/search/search.js b/docs/html/search/search.js deleted file mode 100644 index a554ab9..0000000 --- a/docs/html/search/search.js +++ /dev/null @@ -1,814 +0,0 @@ -/* - @licstart The following is the entire license notice for the - JavaScript code in this file. - - Copyright (C) 1997-2017 by Dimitri van Heesch - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - @licend The above is the entire license notice - for the JavaScript code in this file - */ -function convertToId(search) -{ - var result = ''; - for (i=0;i do a search - { - this.Search(); - } - } - - this.OnSearchSelectKey = function(evt) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 && this.searchIndex0) // Up - { - this.searchIndex--; - this.OnSelectItem(this.searchIndex); - } - else if (e.keyCode==13 || e.keyCode==27) - { - this.OnSelectItem(this.searchIndex); - this.CloseSelectionWindow(); - this.DOMSearchField().focus(); - } - return false; - } - - // --------- Actions - - // Closes the results window. - this.CloseResultsWindow = function() - { - this.DOMPopupSearchResultsWindow().style.display = 'none'; - this.DOMSearchClose().style.display = 'none'; - this.Activate(false); - } - - this.CloseSelectionWindow = function() - { - this.DOMSearchSelectWindow().style.display = 'none'; - } - - // Performs a search. - this.Search = function() - { - this.keyTimeout = 0; - - // strip leading whitespace - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - - var code = searchValue.toLowerCase().charCodeAt(0); - var idxChar = searchValue.substr(0, 1).toLowerCase(); - if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair - { - idxChar = searchValue.substr(0, 2); - } - - var resultsPage; - var resultsPageWithSearch; - var hasResultsPage; - - var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); - if (idx!=-1) - { - var hexCode=idx.toString(16); - resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; - resultsPageWithSearch = resultsPage+'?'+escape(searchValue); - hasResultsPage = true; - } - else // nothing available for this search term - { - resultsPage = this.resultsPath + '/nomatches.html'; - resultsPageWithSearch = resultsPage; - hasResultsPage = false; - } - - window.frames.MSearchResults.location = resultsPageWithSearch; - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - - if (domPopupSearchResultsWindow.style.display!='block') - { - var domSearchBox = this.DOMSearchBox(); - this.DOMSearchClose().style.display = 'inline'; - if (this.insideFrame) - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - domPopupSearchResultsWindow.style.position = 'relative'; - domPopupSearchResultsWindow.style.display = 'block'; - var width = document.body.clientWidth - 8; // the -8 is for IE :-( - domPopupSearchResultsWindow.style.width = width + 'px'; - domPopupSearchResults.style.width = width + 'px'; - } - else - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; - var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; - domPopupSearchResultsWindow.style.display = 'block'; - left -= domPopupSearchResults.offsetWidth; - domPopupSearchResultsWindow.style.top = top + 'px'; - domPopupSearchResultsWindow.style.left = left + 'px'; - } - } - - this.lastSearchValue = searchValue; - this.lastResultsPage = resultsPage; - } - - // -------- Activation Functions - - // Activates or deactivates the search panel, resetting things to - // their default values if necessary. - this.Activate = function(isActive) - { - if (isActive || // open it - this.DOMPopupSearchResultsWindow().style.display == 'block' - ) - { - this.DOMSearchBox().className = 'MSearchBoxActive'; - - var searchField = this.DOMSearchField(); - - if (searchField.value == this.searchLabel) // clear "Search" term upon entry - { - searchField.value = ''; - this.searchActive = true; - } - } - else if (!isActive) // directly remove the panel - { - this.DOMSearchBox().className = 'MSearchBoxInactive'; - this.DOMSearchField().value = this.searchLabel; - this.searchActive = false; - this.lastSearchValue = '' - this.lastResultsPage = ''; - } - } -} - -// ----------------------------------------------------------------------- - -// The class that handles everything on the search results page. -function SearchResults(name) -{ - // The number of matches from the last run of . - this.lastMatchCount = 0; - this.lastKey = 0; - this.repeatOn = false; - - // Toggles the visibility of the passed element ID. - this.FindChildElement = function(id) - { - var parentElement = document.getElementById(id); - var element = parentElement.firstChild; - - while (element && element!=parentElement) - { - if (element.nodeName == 'DIV' && element.className == 'SRChildren') - { - return element; - } - - if (element.nodeName == 'DIV' && element.hasChildNodes()) - { - element = element.firstChild; - } - else if (element.nextSibling) - { - element = element.nextSibling; - } - else - { - do - { - element = element.parentNode; - } - while (element && element!=parentElement && !element.nextSibling); - - if (element && element!=parentElement) - { - element = element.nextSibling; - } - } - } - } - - this.Toggle = function(id) - { - var element = this.FindChildElement(id); - if (element) - { - if (element.style.display == 'block') - { - element.style.display = 'none'; - } - else - { - element.style.display = 'block'; - } - } - } - - // Searches for the passed string. If there is no parameter, - // it takes it from the URL query. - // - // Always returns true, since other documents may try to call it - // and that may or may not be possible. - this.Search = function(search) - { - if (!search) // get search word from URL - { - search = window.location.search; - search = search.substring(1); // Remove the leading '?' - search = unescape(search); - } - - search = search.replace(/^ +/, ""); // strip leading spaces - search = search.replace(/ +$/, ""); // strip trailing spaces - search = search.toLowerCase(); - search = convertToId(search); - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' - - if (search.length<=rowMatchName.length && - rowMatchName.substr(0, search.length)==search) - { - row.style.display = 'block'; - matches++; - } - else - { - row.style.display = 'none'; - } - } - i++; - } - document.getElementById("Searching").style.display='none'; - if (matches == 0) // no results - { - document.getElementById("NoMatches").style.display='block'; - } - else // at least one result - { - document.getElementById("NoMatches").style.display='none'; - } - this.lastMatchCount = matches; - return true; - } - - // return the first item with index index or higher that is visible - this.NavNext = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index++; - } - return focusItem; - } - - this.NavPrev = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index--; - } - return focusItem; - } - - this.ProcessKeys = function(e) - { - if (e.type == "keydown") - { - this.repeatOn = false; - this.lastKey = e.keyCode; - } - else if (e.type == "keypress") - { - if (!this.repeatOn) - { - if (this.lastKey) this.repeatOn = true; - return false; // ignore first keypress after keydown - } - } - else if (e.type == "keyup") - { - this.lastKey = 0; - this.repeatOn = false; - } - return this.lastKey!=0; - } - - this.Nav = function(evt,itemIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - var newIndex = itemIndex-1; - var focusItem = this.NavPrev(newIndex); - if (focusItem) - { - var child = this.FindChildElement(focusItem.parentNode.parentNode.id); - if (child && child.style.display == 'block') // children visible - { - var n=0; - var tmpElem; - while (1) // search for last child - { - tmpElem = document.getElementById('Item'+newIndex+'_c'+n); - if (tmpElem) - { - focusItem = tmpElem; - } - else // found it! - { - break; - } - n++; - } - } - } - if (focusItem) - { - focusItem.focus(); - } - else // return focus to search field - { - parent.document.getElementById("MSearchField").focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = itemIndex+1; - var focusItem; - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem && elem.style.display == 'block') // children visible - { - focusItem = document.getElementById('Item'+itemIndex+'_c0'); - } - if (!focusItem) focusItem = this.NavNext(newIndex); - if (focusItem) focusItem.focus(); - } - else if (this.lastKey==39) // Right - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'block'; - } - else if (this.lastKey==37) // Left - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'none'; - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } - - this.NavChild = function(evt,itemIndex,childIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - if (childIndex>0) - { - var newIndex = childIndex-1; - document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); - } - else // already at first child, jump to parent - { - document.getElementById('Item'+itemIndex).focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = childIndex+1; - var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); - if (!elem) // last child, jump to parent next parent - { - elem = this.NavNext(itemIndex+1); - } - if (elem) - { - elem.focus(); - } - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } -} - -function setKeyActions(elem,action) -{ - elem.setAttribute('onkeydown',action); - elem.setAttribute('onkeypress',action); - elem.setAttribute('onkeyup',action); -} - -function setClassAttr(elem,attr) -{ - elem.setAttribute('class',attr); - elem.setAttribute('className',attr); -} - -function createResults() -{ - var results = document.getElementById("SRResults"); - for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W diff --git a/docs/html/search/search_r.png b/docs/html/search/search_r.png deleted file mode 100644 index 1af5d21ee13e070d7600f1c4657fde843b953a69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js deleted file mode 100644 index c99c8bb..0000000 --- a/docs/html/search/searchdata.js +++ /dev/null @@ -1,27 +0,0 @@ -var indexSectionsWithContent = -{ - 0: "abcdefgmoprstuvw", - 1: "bdptuv", - 2: "acdefgoprstw", - 3: "bmprw", - 4: "e" -}; - -var indexSectionNames = -{ - 0: "all", - 1: "classes", - 2: "functions", - 3: "variables", - 4: "pages" -}; - -var indexSectionLabels = -{ - 0: "All", - 1: "Classes", - 2: "Functions", - 3: "Variables", - 4: "Pages" -}; - diff --git a/docs/html/search/variables_0.html b/docs/html/search/variables_0.html deleted file mode 100644 index a2a3ae6..0000000 --- a/docs/html/search/variables_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js deleted file mode 100644 index d1fd2cf..0000000 --- a/docs/html/search/variables_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]] -]; diff --git a/docs/html/search/variables_1.html b/docs/html/search/variables_1.html deleted file mode 100644 index b243c42..0000000 --- a/docs/html/search/variables_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js deleted file mode 100644 index fd5dff3..0000000 --- a/docs/html/search/variables_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], - ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] -]; diff --git a/docs/html/search/variables_2.html b/docs/html/search/variables_2.html deleted file mode 100644 index 647df20..0000000 --- a/docs/html/search/variables_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js deleted file mode 100644 index 570beea..0000000 --- a/docs/html/search/variables_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]] -]; diff --git a/docs/html/search/variables_3.html b/docs/html/search/variables_3.html deleted file mode 100644 index 9dc9b89..0000000 --- a/docs/html/search/variables_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js deleted file mode 100644 index fbf0a47..0000000 --- a/docs/html/search/variables_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['reconnect_5ftimeout',['RECONNECT_TIMEOUT',['../classB15F.html#a040951746fbfd632e12bd1ad14578816',1,'B15F']]], - ['reconnect_5ftries',['RECONNECT_TRIES',['../classB15F.html#a6c4895bdbcd71ff6743becf97985c2dc',1,'B15F']]] -]; diff --git a/docs/html/search/variables_4.html b/docs/html/search/variables_4.html deleted file mode 100644 index 78cc2c7..0000000 --- a/docs/html/search/variables_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js deleted file mode 100644 index 9a9c561..0000000 --- a/docs/html/search/variables_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]] -]; diff --git a/docs/html/splitbar.png b/docs/html/splitbar.png deleted file mode 100644 index fe895f2c58179b471a22d8320b39a4bd7312ec8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T diff --git a/docs/html/sync_off.png b/docs/html/sync_off.png deleted file mode 100644 index 3b443fc62892114406e3d399421b2a881b897acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* diff --git a/docs/html/sync_on.png b/docs/html/sync_on.png deleted file mode 100644 index e08320fb64e6fa33b573005ed6d8fe294e19db76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 diff --git a/docs/html/tab_a.png b/docs/html/tab_a.png deleted file mode 100644 index 3b725c41c5a527a3a3e40097077d0e206a681247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 diff --git a/docs/html/tab_b.png b/docs/html/tab_b.png deleted file mode 100644 index e2b4a8638cb3496a016eaed9e16ffc12846dea18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ diff --git a/docs/html/tabs.css b/docs/html/tabs.css deleted file mode 100644 index 85a0cd5..0000000 --- a/docs/html/tabs.css +++ /dev/null @@ -1 +0,0 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/docs/html/timeoutexception_8h_source.html b/docs/html/timeoutexception_8h_source.html deleted file mode 100644 index 0bfd0e2..0000000 --- a/docs/html/timeoutexception_8h_source.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -B15F: drv/timeoutexception.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    timeoutexception.h
    -
    -
    -
    1 #ifndef TIMEOUTEXCEPTION_H
    2 #define TIMEOUTEXCEPTION_H
    3 
    4 #include <exception>
    5 
    6 // SOURCE: https://stackoverflow.com/a/8152888
    7 
    10 class TimeoutException: public std::exception
    11 {
    12 public:
    13  explicit TimeoutException(const char* message, int timeout) : TimeoutException(std::string(message), timeout)
    14  {
    15  }
    16 
    17  explicit TimeoutException(const std::string& message, int timeout) : msg(message), m_timeout(timeout)
    18  {
    19  if(!msg.length())
    20  msg = "Timeout reached (" + std::to_string(m_timeout) + ")";
    21  }
    22 
    23  virtual ~TimeoutException() throw ()
    24  {
    25  }
    26 
    27  virtual const char* what() const throw ()
    28  {
    29  return msg.c_str();
    30  }
    31 
    32 protected:
    33  std::string msg;
    34  int m_timeout;
    35 };
    36 
    37 #endif // TIMEOUTEXCEPTION_H
    - - - - - diff --git a/docs/html/ui_8cpp_source.html b/docs/html/ui_8cpp_source.html deleted file mode 100644 index b82ff5f..0000000 --- a/docs/html/ui_8cpp_source.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - -B15F: ui/ui.cpp Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    ui.cpp
    -
    -
    -
    1 #include "ui.h"
    2 #include "../drv/b15f.h"
    3 
    4 std::vector<View*> win_stack;
    5 std::thread t_refresh;
    6 
    7 void show_main(int)
    8 {
    9  ViewSelection* view = new ViewSelection();
    10  view->setTitle("B15F - Command Line Interface");
    11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
    12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
    13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
    14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
    15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
    16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
    17  view->addChoice("[ Informationen ]", &show_info);
    18  view->addChoice("", nullptr);
    19  view->addChoice("[ Beenden ]", &finish);
    20  view->repaint();
    21 
    22  win_stack.push_back(view);
    23  input(0);
    24 }
    25 
    26 void input(int)
    27 {
    28  call_t nextCall;
    29  int key;
    30  do
    31  {
    32  key = wgetch(View::getWinContext());
    33  win_stack.back()->repaint();
    34  nextCall = win_stack.back()->keypress(key);
    35 
    36  if(key == -1)
    37  view_back(key);
    38 
    39  if(nextCall)
    40  nextCall(key);
    41  }
    42  while(win_stack.size());
    43 }
    44 
    45 void view_back(int)
    46 {
    47  if(win_stack.size())
    48  {
    49  delete win_stack.back();
    50  win_stack.pop_back();
    51  }
    52  if(win_stack.size())
    53  win_stack.back()->repaint();
    54 }
    55 
    56 void finish(int)
    57 {
    58  cleanup();
    59  exit(EXIT_SUCCESS);
    60 }
    61 
    62 void cleanup()
    63 {
    64  if(t_refresh.joinable())
    65  t_refresh.join();
    66  clrtoeol();
    67  refresh();
    68  endwin();
    69 }
    70 
    71 void show_info(int)
    72 {
    73  ViewInfo* view = new ViewInfo();
    74  view->setTitle("Info");
    75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
    76  view->setLabelClose("[ Zurueck ]");
    77  view->repaint();
    78 
    79  win_stack.push_back(view);
    80  input(0);
    81 }
    82 
    83 void show_monitor(int)
    84 {
    85  ViewMonitor* view = new ViewMonitor();
    86  view->setTitle("Monitor");
    87  view->setText("\nErfasse Messwerte...");
    88  view->setLabelClose("[ Zurueck ]");
    89  view->repaint();
    90 
    91  win_stack.push_back(view);
    92  input(0);
    93 }
    94 
    95 void show_invalid_port_input(int)
    96 {
    97  ViewInfo* view = new ViewInfo();
    98  view->setTitle("Falsche Eingabe");
    99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
    100  view->setLabelClose("[ Schliessen ]");
    101  view->repaint();
    102 
    103  win_stack.push_back(view);
    104  input(0);
    105 }
    106 
    107 void show_invalid_dac_input(int)
    108 {
    109  ViewInfo* view = new ViewInfo();
    110  view->setTitle("Falsche Eingabe");
    111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
    112  view->setLabelClose("[ Schliessen ]");
    113  view->repaint();
    114 
    115  win_stack.push_back(view);
    116  input(0);
    117 }
    118 
    119 void write_digital_output0(int)
    120 {
    121  try
    122  {
    123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    124  if(d > 255 || 0 > d)
    125  throw std::invalid_argument("bad value");
    126  uint8_t port = static_cast<uint8_t>(d);
    127 
    128  B15F& drv = B15F::getInstance();
    129  drv.digitalWrite0(port);
    130  view_back(0);
    131  }
    132  catch(std::invalid_argument& ex)
    133  {
    134  show_invalid_port_input(0);
    135  }
    136 }
    137 
    138 void write_digital_output1(int)
    139 {
    140  try
    141  {
    142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    143  if(d > 255 || 0 > d)
    144  throw std::invalid_argument("bad value");
    145  uint8_t port = static_cast<uint8_t>(d);
    146 
    147  B15F& drv = B15F::getInstance();
    148  drv.digitalWrite1(port);
    149  view_back(0);
    150  }
    151  catch(std::invalid_argument& ex)
    152  {
    153  show_invalid_port_input(0);
    154  }
    155 }
    156 
    157 void write_analog_output0(int)
    158 {
    159  try
    160  {
    161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    162  if(port > 1023)
    163  throw std::invalid_argument("bad value");
    164 
    165  B15F& drv = B15F::getInstance();
    166  drv.analogWrite0(port);
    167  view_back(0);
    168  }
    169  catch(std::invalid_argument& ex)
    170  {
    171  show_invalid_dac_input(0);
    172  }
    173 }
    174 
    175 void write_analog_output1(int)
    176 {
    177  try
    178  {
    179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    180  if(port > 1023)
    181  throw std::invalid_argument("bad value");
    182 
    183  B15F& drv = B15F::getInstance();
    184  drv.analogWrite1(port);
    185  view_back(0);
    186  }
    187  catch(std::invalid_argument& ex)
    188  {
    189  show_invalid_dac_input(0);
    190  }
    191 }
    192 
    193 void show_digital_output0(int)
    194 {
    195  ViewPromt* view = new ViewPromt();
    196  view->setTitle("Digitale Ausgabe BE0");
    197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    198  view->setCancel("[ Zurueck ]", true);
    199  view->setConfirm("[ OK ]", &write_digital_output0);
    200  view->repaint();
    201 
    202  win_stack.push_back(view);
    203  input(0);
    204 }
    205 
    206 void show_digital_output1(int)
    207 {
    208  ViewPromt* view = new ViewPromt();
    209  view->setTitle("Digitale Ausgabe BE1");
    210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    211  view->setCancel("[ Zurueck ]", true);
    212  view->setConfirm("[ OK ]", &write_digital_output1);
    213  view->repaint();
    214 
    215  win_stack.push_back(view);
    216  input(0);
    217 }
    218 
    219 void show_analog_output0(int)
    220 {
    221  ViewPromt* view = new ViewPromt();
    222  view->setTitle("Analoge Ausgabe AA0");
    223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    224  view->setCancel("[ Zurueck ]", true);
    225  view->setConfirm("[ OK ]", &write_analog_output0);
    226  view->repaint();
    227 
    228  win_stack.push_back(view);
    229  input(0);
    230 }
    231 
    232 void show_analog_output1(int)
    233 {
    234  ViewPromt* view = new ViewPromt();
    235  view->setTitle("Analoge Ausgabe AA1");
    236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    237  view->setCancel("[ Zurueck ]", true);
    238  view->setConfirm("[ OK ]", &write_analog_output1);
    239  view->repaint();
    240 
    241  win_stack.push_back(view);
    242  input(0);
    243 }
    244 
    245 void start_selftest(int)
    246 {
    247  B15F& drv = B15F::getInstance();
    248  drv.activateSelfTestMode();
    249 
    250  ViewInfo* view = new ViewInfo();
    251  view->setTitle("Selbsttest aktiv");
    252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
    253  view->setLabelClose("[ Selbsttest Beenden ]");
    254  view->setCall(&stop_selftest);
    255  view->repaint();
    256 
    257  win_stack.push_back(view);
    258  input(0);
    259 }
    260 
    261 void stop_selftest(int)
    262 {
    263  B15F& drv = B15F::getInstance();
    264  drv.discard();
    266  drv.reconnect();
    267  drv.digitalWrite0(0);
    268  drv.digitalWrite1(0);
    269 }
    270 
    271 void show_selftest_info(int)
    272 {
    273  ViewInfo* view = new ViewInfo();
    274  view->setTitle("Selbsttest");
    275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
    276  view->setLabelClose("[ Weiter ]");
    277  view->setCall(&start_selftest);
    278  view->repaint();
    279 
    280  win_stack.push_back(view);
    281  input(0);
    282 }
    - - -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:373
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:383
    -
    Definition: b15f.h:26
    -
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    -
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    - -
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    - -
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    -
    void discard(void)
    Definition: b15f.cpp:72
    -
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:235
    -
    void reconnect(void)
    Definition: b15f.cpp:57
    -
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    - - - - diff --git a/docs/html/ui_8h_source.html b/docs/html/ui_8h_source.html deleted file mode 100644 index e3da44c..0000000 --- a/docs/html/ui_8h_source.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -B15F: ui/ui.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    ui.h
    -
    -
    -
    1 #ifndef UI_H
    2 #define UI_H
    3 
    4 #include <vector>
    5 #include "view_selection.h"
    6 #include "view_info.h"
    7 #include "view_monitor.h"
    8 #include "view_promt.h"
    9 
    10 void show_main(int);
    11 void input(int);
    12 void view_back(int);
    13 void finish(int);
    14 void cleanup();
    15 
    16 void show_info(int);
    17 void show_monitor(int);
    18 void show_invalid_port_input(int);
    19 void show_invalid_dac_input(int);
    20 void write_digital_output0(int);
    21 void write_digital_output1(int);
    22 void write_analog_output0(int);
    23 void write_analog_output1(int);
    24 void show_digital_output0(int);
    25 void show_digital_output1(int);
    26 void show_analog_output0(int);
    27 void show_analog_output1(int);
    28 
    29 // selftest group
    30 void show_selftest_info(int);
    31 void start_selftest(int);
    32 void stop_selftest(int);
    33 
    34 
    35 extern std::vector<View*> win_stack;
    36 extern std::thread t_refresh;
    37 
    38 #endif // UI_H
    - - - - diff --git a/docs/html/usart_8cpp_source.html b/docs/html/usart_8cpp_source.html deleted file mode 100644 index 3c613ee..0000000 --- a/docs/html/usart_8cpp_source.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - -B15F: drv/usart.cpp Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    usart.cpp
    -
    -
    -
    1 #include "usart.h"
    2 
    3 void USART::openDevice(std::string device)
    4 {
    5  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY /* | O_NONBLOCK*/);
    6  if(file_desc <= 0)
    7  throw USARTException("Fehler beim Öffnen des Gerätes");
    8 
    9  struct termios options;
    10  int code = tcgetattr(file_desc, &options);
    11  if(code)
    12  throw USARTException("Fehler beim Lesen der Geräteparameter");
    13 
    14  options.c_cflag = CS8 | CLOCAL | CREAD;
    15  options.c_iflag = IGNPAR;
    16  options.c_oflag = 0;
    17  options.c_lflag = 0;
    18  options.c_cc[VMIN] = 0; // #bytes read returns at least
    19  options.c_cc[VTIME] = timeout;
    20  code = cfsetspeed(&options, baudrate);
    21  if(code)
    22  throw USARTException("Fehler beim Setzen der Baudrate");
    23 
    24  code = tcsetattr(file_desc, TCSANOW, &options);
    25  if(code)
    26  throw USARTException("Fehler beim Setzen der Geräteparameter");
    27 
    30 }
    31 
    33 {
    34  int code = close(file_desc);
    35  if(code)
    36  throw USARTException("Fehler beim Schließen des Gerätes");
    37 }
    38 
    40 {
    41  int code = tcflush(file_desc, TCIFLUSH);
    42  if(code)
    43  throw USARTException("Fehler beim Leeren des Eingangspuffers");
    44 }
    45 
    47 {
    48  int code = tcflush(file_desc, TCOFLUSH);
    49  if(code)
    50  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
    51 }
    52 
    54 {
    55  int code = tcdrain(file_desc);
    56  if(code)
    57  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
    58 }
    59 
    61 {
    62  double pz = 1e2 * n_blocks_failed / n_blocks_total;
    63  pz = std::round(pz * 1e2) / 1e2;
    64  std::cout << "blocks total: " << n_blocks_total << " ok: " << (n_blocks_total - n_blocks_failed) << " failed: " << n_blocks_failed << " (" << pz << "%)" << std::endl;
    65 }
    66 
    67 void USART::writeByte(uint8_t b)
    68 {
    69  int sent = write(file_desc, &b, 1);
    70  if(sent != 1)
    71  {
    72  std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl;
    73  usleep(100000);
    74  sent = write(file_desc, &b, 1);
    75  if(sent != 1)
    76  throw USARTException("Fehler beim Senden: writeByte()");
    77  }
    78 
    79 }
    80 
    81 void USART::writeInt(uint16_t d)
    82 {
    83  int sent = write(file_desc, reinterpret_cast<char*>(&d), 2);
    84  if(sent != 2)
    85  throw USARTException("Fehler beim Senden: writeInt()");
    86 }
    87 
    88 void USART::writeU32(uint32_t w)
    89 {
    90  int sent = write(file_desc, reinterpret_cast<char*>(&w), 4);
    91  if(sent != 4)
    92  throw USARTException("Fehler beim Senden: writeU32()");
    93 }
    94 
    95 int USART::read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout)
    96 {
    97  uint32_t elapsed = 0;
    98  int n_read = -1;
    99  auto start = std::chrono::steady_clock::now();
    100  auto end = start;
    101  while(elapsed < timeout)
    102  {
    103  n_read = read(file_desc, buffer + offset, len);
    104  if (n_read == len)
    105  return n_read;
    106 
    107  end = std::chrono::steady_clock::now();
    108  elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    109  }
    110 
    111  return 0;
    112 }
    113 
    114 int USART::write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout)
    115 {
    116  uint32_t elapsed = 0;
    117  int n_sent = -1;
    118  auto start = std::chrono::steady_clock::now();
    119  auto end = start;
    120  while(elapsed < timeout)
    121  {
    122  n_sent = write(file_desc, buffer + offset, len);
    124  if (n_sent == len)
    125  return n_sent;
    126 
    127  end = std::chrono::steady_clock::now();
    128  elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    129  }
    130 
    131  return n_sent;
    132 }
    133 
    134 void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len)
    135 {
    136  uint8_t crc;
    137  uint8_t aw;
    138  const uint16_t us_per_bit = (1000000 / baudrate) * 16;
    139  const uint16_t n_total = len + 3;
    140 
    141  n_blocks_total++;
    142  bool failed = false;
    143 
    144  do
    145  {
    146  // calc crc
    147  crc = 0;
    148  for(uint8_t i = 0; i < len; i++)
    149  {
    150  crc ^= buffer[i];
    151  for (uint8_t k = 0; k < 8; k++)
    152  {
    153  if (crc & 1)
    154  crc ^= CRC7_POLY;
    155  crc >>= 1;
    156  }
    157  }
    158 
    159  // construct block
    160  block_buffer[0] = len;
    161  std::memcpy(&block_buffer[1], buffer + offset, len);
    162  block_buffer[len + 1] = crc;
    163  block_buffer[len + 2] = BLOCK_END;
    164 
    165  // send block
    168  int n_sent = write_timeout(&block_buffer[0], 0, len + 3, us_per_bit * n_total);
    169  if(n_sent != n_total)
    170  throw std::runtime_error("fatal (send): " + std::to_string(n_sent));
    171 
    172  /*for(uint8_t i = 0; i < len + 3; i++)
    173  {
    174  write_timeout(&block_buffer[i], 0, 1, us_per_bit * n_total);
    175  //tcdrain(file_desc);
    176  //usleep(1000);
    177  }*/
    178 
    179  // flush output data
    180  tcdrain(file_desc);
    181 
    182  //usleep(us_per_bit * n_total * 10);
    183 
    184  // check response
    185  int n_read = read_timeout(&aw, 0, 1, us_per_bit * n_blocks_total * 10);
    186  for(uint16_t i = 0; i < 255 && n_read != 1; i++)
    187  {
    188  writeByte(0x80); // Stoppzeichen für Block
    189  if(tcdrain(file_desc))
    190  {
    191  std::cout << "drain failed" << std::endl;
    192  }
    193  std::cout << "WARNING: read error (" << n_read << "), retry #" << (int) i << std::endl;
    194  usleep(us_per_bit*100);
    195  n_read = read_timeout(&aw, 0, 1, us_per_bit);
    196  }
    197 
    198  if(n_read != 1)
    199  throw std::runtime_error("fatal: " + std::to_string(n_read));
    200 
    201  //clearInputBuffer();
    202 
    203  if(aw != 0xFF)
    204  {
    205  if(!failed)
    206  n_blocks_failed++;
    207  failed = true;
    208  std::cout << "block failed, retry" << std::endl;
    209  }
    210  }
    211  while(aw != 0xFF);
    212 
    213  //std::cout << "OK" << std::endl;
    214 }
    215 
    216 uint8_t USART::readByte(void)
    217 {
    218  char b;
    219  auto start = std::chrono::steady_clock::now();
    220  auto end = start;
    221  uint16_t elapsed = 0;
    222  while(elapsed < timeout * 100)
    223  {
    224  int code = read(file_desc, &b, 1);
    225  if (code > 0)
    226  return static_cast<uint8_t>(b);
    227 
    228  end = std::chrono::steady_clock::now();
    229  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    230  }
    231 
    232  throw TimeoutException("Verbindung unterbrochen.", timeout);
    233 }
    234 
    235 uint16_t USART::readInt(void)
    236 {
    237  return readByte() | readByte() << 8;
    238 }
    239 
    240 bool USART::readBlock(uint8_t* buffer, uint16_t offset)
    241 {
    242  uint8_t len = readByte();
    243  uint8_t crc = 0;
    244  buffer += offset;
    245 
    246  uint32_t block_timeout = timeout / 10;
    247 
    248  // wait for block
    249  int n_ready;
    250  uint16_t elapsed = 0;
    251  auto start = std::chrono::steady_clock::now();
    252  auto end = start;
    253  while(elapsed < block_timeout)
    254  {
    255  int code = ioctl(file_desc, FIONREAD, &n_ready);
    256  if(code != 0)
    257  {
    258  std::cout << "n_ready code: " << code << std::endl;
    259  return false;
    260  }
    261 
    262  if(n_ready >= len + 1)
    263  break;
    264 
    265  end = std::chrono::steady_clock::now();
    266  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    267  }
    268  if(elapsed >= timeout)
    269  {
    270  std::cout << "block timeout: " << std::endl;
    271  return false;
    272  }
    273 
    274  while(len--)
    275  {
    276  *buffer = readByte();
    277 
    278  crc ^= *buffer++;
    279  for (uint8_t i = 0; i < 8; i++)
    280  {
    281  if (crc & 1)
    282  crc ^= CRC7_POLY;
    283  crc >>= 1;
    284  }
    285  }
    286 
    287  crc ^= readByte();
    288  for (uint8_t i = 0; i < 8; i++)
    289  {
    290  if (crc & 1)
    291  crc ^= CRC7_POLY;
    292  crc >>= 1;
    293  }
    294 
    295  if(TEST == 1)
    296  crc = 1;
    297  if(TEST > 100)
    298  TEST = 0;
    299 
    300  if (crc == 0)
    301  {
    302  writeByte(0xFF);
    303  return true;
    304  }
    305  else
    306  {
    307  writeByte(0xFE);
    308  return false;
    309  }
    310 }
    311 
    313 {
    314  return baudrate;
    315 }
    316 
    318 {
    319  return timeout;
    320 }
    321 
    322 void USART::setBaudrate(uint32_t baudrate)
    323 {
    324  this->baudrate = baudrate;
    325 }
    326 
    327 void USART::setTimeout(uint8_t timeout)
    328 {
    329  this->timeout = timeout;
    330 }
    -
    void writeU32(uint32_t d)
    Definition: usart.cpp:88
    -
    uint32_t getBaudrate(void)
    Definition: usart.cpp:312
    -
    uint8_t readByte(void)
    Definition: usart.cpp:216
    - -
    void printStatistics(void)
    Definition: usart.cpp:60
    -
    void closeDevice(void)
    Definition: usart.cpp:32
    -
    void clearInputBuffer(void)
    Definition: usart.cpp:39
    -
    uint8_t getTimeout(void)
    Definition: usart.cpp:317
    -
    void clearOutputBuffer(void)
    Definition: usart.cpp:46
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:322
    -
    void writeByte(uint8_t b)
    Definition: usart.cpp:67
    -
    void openDevice(std::string device)
    Definition: usart.cpp:3
    -
    uint16_t readInt(void)
    Definition: usart.cpp:235
    -
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:327
    -
    void flushOutputBuffer(void)
    Definition: usart.cpp:53
    - -
    void writeInt(uint16_t d)
    Definition: usart.cpp:81
    - - - - diff --git a/docs/html/usart_8h_source.html b/docs/html/usart_8h_source.html deleted file mode 100644 index fb279ff..0000000 --- a/docs/html/usart_8h_source.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - -B15F: drv/usart.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    usart.h
    -
    -
    -
    1 #ifndef USART_H
    2 #define USART_H
    3 
    4 #include <iostream>
    5 #include <cstdint>
    6 #include <chrono>
    7 #include <unistd.h>
    8 #include <cstring>
    9 #include <fcntl.h>
    10 #include <sys/ioctl.h>
    11 #include <termios.h>
    12 #include <cmath>
    13 #include "usartexception.h"
    14 #include "timeoutexception.h"
    15 
    18 class USART
    19 {
    20 public:
    21 
    22  /*************************************************
    23  * Methoden für die Verwaltung der Schnittstelle *
    24  *************************************************/
    25 
    31  void openDevice(std::string device);
    32 
    37  void closeDevice(void);
    38 
    43  void clearInputBuffer(void);
    44 
    49  void clearOutputBuffer(void);
    50 
    55  void flushOutputBuffer(void);
    56 
    60  void printStatistics(void);
    61 
    62  /*************************************************/
    63 
    64 
    65 
    66  /*************************************
    67  * Methoden für die Datenübertragung *
    68  *************************************/
    69 
    75  void writeByte(uint8_t b);
    76 
    82  void writeInt(uint16_t d);
    83 
    89  void writeU32(uint32_t d);
    90 
    95  uint8_t readByte(void);
    96 
    101  uint16_t readInt(void);
    102 
    103  int read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
    104  int write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
    105  void writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len);
    106  bool readBlock(uint8_t* buffer, uint16_t offset);
    107 
    108  /*************************************/
    109 
    110 
    111 
    112  /***************************************
    113  * Methoden für einstellbare Parameter *
    114  ***************************************/
    115 
    120  uint32_t getBaudrate(void);
    121 
    126  uint8_t getTimeout(void);
    127 
    132  void setBaudrate(uint32_t baudrate);
    133 
    138  void setTimeout(uint8_t timeout);
    139 
    140  /***************************************/
    141 
    142  constexpr static uint8_t CRC7_POLY = 0x91;
    143  constexpr static uint8_t MAX_BLOCK_SIZE = 64;
    144  constexpr static uint8_t BLOCK_END = 0x80;
    145 private:
    146 
    147  int file_desc = -1; // Linux Dateideskriptor
    148  uint32_t baudrate = 9600; // Standard-Baudrate, sollte mit setBaudrate() überschrieben werden!
    149  int TEST = 0;
    150  uint8_t timeout = 10; // in Dezisekunden
    151  uint8_t block_buffer[MAX_BLOCK_SIZE + 3];
    152 
    153  // debug statistics
    154  uint32_t n_blocks_total = 0;
    155  uint32_t n_blocks_failed = 0;
    156 };
    157 
    158 
    159 #endif // USART_H
    -
    void writeU32(uint32_t d)
    Definition: usart.cpp:88
    -
    uint32_t getBaudrate(void)
    Definition: usart.cpp:312
    -
    uint8_t readByte(void)
    Definition: usart.cpp:216
    -
    void printStatistics(void)
    Definition: usart.cpp:60
    -
    void closeDevice(void)
    Definition: usart.cpp:32
    -
    void clearInputBuffer(void)
    Definition: usart.cpp:39
    -
    uint8_t getTimeout(void)
    Definition: usart.cpp:317
    -
    Definition: usart.h:18
    -
    void clearOutputBuffer(void)
    Definition: usart.cpp:46
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:322
    -
    void writeByte(uint8_t b)
    Definition: usart.cpp:67
    -
    void openDevice(std::string device)
    Definition: usart.cpp:3
    -
    uint16_t readInt(void)
    Definition: usart.cpp:235
    -
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:327
    -
    void flushOutputBuffer(void)
    Definition: usart.cpp:53
    -
    void writeInt(uint16_t d)
    Definition: usart.cpp:81
    - - - - diff --git a/docs/html/usartexception_8h_source.html b/docs/html/usartexception_8h_source.html deleted file mode 100644 index ce6e187..0000000 --- a/docs/html/usartexception_8h_source.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -B15F: drv/usartexception.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    usartexception.h
    -
    -
    -
    1 #ifndef USARTEXCEPTION_H
    2 #define USARTEXCEPTION_H
    3 
    4 #include <exception>
    5 #include <string>
    6 
    7 // SOURCE: https://stackoverflow.com/a/8152888
    8 
    11 class USARTException: public std::exception
    12 {
    13 public:
    14  explicit USARTException(const char* message) : msg(message)
    15  {
    16  }
    17 
    18  explicit USARTException(const std::string& message) : msg(message)
    19  {
    20  }
    21 
    22  virtual ~USARTException() throw ()
    23  {
    24  }
    25 
    26  virtual const char* what() const throw ()
    27  {
    28  return msg.c_str();
    29  }
    30 
    31 protected:
    32  std::string msg;
    33 };
    34 
    35 #endif // USARTEXCEPTION_H
    - - - - - diff --git a/docs/html/view_8cpp_source.html b/docs/html/view_8cpp_source.html deleted file mode 100644 index ce0f029..0000000 --- a/docs/html/view_8cpp_source.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -B15F: ui/view.cpp Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    view.cpp
    -
    -
    -
    1 #include "view.h"
    2 
    3 WINDOW* View::win = nullptr;
    4 
    5 View::View()
    6 {
    7  if(!win)
    8  {
    9  B15F::abort("View::win not initialized, missing context");
    10  }
    11  getmaxyx(win, height, width); // init width and height
    12  keypad(win, TRUE);
    13 }
    14 
    15 View::~View()
    16 {
    17 }
    18 
    19 void View::setWinContext(WINDOW* win)
    20 {
    21  View::win = win;
    22 }
    23 
    24 WINDOW* View::getWinContext()
    25 {
    26  return win;
    27 }
    28 
    29 // from: https://stackoverflow.com/a/37454181
    30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
    31 {
    32  std::vector<std::string> tokens;
    33  size_t prev = 0, pos = 0;
    34  do
    35  {
    36  pos = str.find(delim, prev);
    37  if (pos == std::string::npos) pos = str.length();
    38  std::string token = str.substr(prev, pos-prev);
    39  if (!token.empty()) tokens.push_back(token);
    40  prev = pos + delim.length();
    41  }
    42  while (pos < str.length() && prev < str.length());
    43  return tokens;
    44 }
    45 
    46 
    47 void View::setTitle(std::string title)
    48 {
    49  this->title = title;
    50 }
    51 
    52 void View::repaint()
    53 {
    54  // get screen size
    55  struct winsize size;
    56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
    57  throw std::runtime_error("TIOCGWINSZ error");
    58 
    59 
    60  start_x = floor((size.ws_col - width) / 2.);
    61  start_y = floor((size.ws_row - height) / 2.);
    62 
    63  curs_set(0); // hide cursor
    64  mvwin(win, start_y, start_x);
    65  clear();
    66  wclear(win);
    67 
    68  // generic draw
    69  box(win, 0, 0);
    70  int offset_x = (width - title.length()) / 2;
    71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
    72 
    73  // specific draw
    74  draw();
    75 
    76  refresh();
    77  wrefresh(win);
    78 }
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:408
    - - - - diff --git a/docs/html/view_8h_source.html b/docs/html/view_8h_source.html deleted file mode 100644 index 34219aa..0000000 --- a/docs/html/view_8h_source.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -B15F: ui/view.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    view.h
    -
    -
    -
    1 #ifndef VIEW_H
    2 #define VIEW_H
    3 
    4 #include <iostream>
    5 #include <cmath>
    6 #include <vector>
    7 #include <functional>
    8 #include <ncurses.h> // sudo apt-get install libncurses5-dev
    9 #include <sys/ioctl.h>
    10 #include <unistd.h>
    11 #include <signal.h>
    12 #include "../drv/b15f.h"
    13 
    14 extern std::string ERR_MSG;
    15 typedef std::function<void(int)> call_t;
    16 
    19 class View
    20 {
    21 public:
    22  View(void);
    23  virtual ~View(void);
    24 
    25  static void setWinContext(WINDOW* win);
    26  static WINDOW* getWinContext(void);
    27  static std::vector<std::string> str_split(const std::string& str, const std::string delim);
    28 
    29  virtual void setTitle(std::string title);
    30 
    31  virtual void repaint(void);
    32 
    33  virtual void draw(void) = 0;
    34  virtual call_t keypress(int& key) = 0;
    35 
    36 
    37 protected:
    38  int width, height;
    39  int start_x = 0, start_y = 0;
    40  std::string title;
    41  std::vector<call_t> calls;
    42 
    43  static WINDOW* win;
    44  constexpr static int KEY_ENT = 10;
    45 };
    46 
    47 #endif // VIEW_H
    -
    Definition: view.h:19
    - - - - diff --git a/docs/html/view__info_8cpp_source.html b/docs/html/view__info_8cpp_source.html deleted file mode 100644 index fc91695..0000000 --- a/docs/html/view__info_8cpp_source.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -B15F: ui/view_info.cpp Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    view_info.cpp
    -
    -
    -
    1 #include "view_info.h"
    2 
    3 ViewInfo::ViewInfo()
    4 {
    5  calls.push_back(nullptr);
    6 }
    7 
    8 void ViewInfo::setText(std::string text)
    9 {
    10  this->text = text;
    11 }
    12 
    13 void ViewInfo::setLabelClose(std::string label)
    14 {
    15  this->label_close = label;
    16 }
    17 
    18 void ViewInfo::setCall(call_t call)
    19 {
    20  calls[0] = call;
    21 }
    22 
    23 void ViewInfo::draw()
    24 {
    25  int li = 0;
    26  for(std::string line : str_split(text, "\n"))
    27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
    28 
    29  close_offset_x = (width - label_close.length()) / 2;
    30  close_offset_y = height - 2;
    31 
    32  wattron(win, A_REVERSE);
    33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
    34  wattroff(win, A_REVERSE);
    35 }
    36 
    37 call_t ViewInfo::keypress(int& key)
    38 {
    39  switch(key)
    40  {
    41 
    42  case KEY_MOUSE:
    43  {
    44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    45  MEVENT event;
    46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    47  {
    48  size_t column = start_x + close_offset_x;
    49  size_t row = start_y + close_offset_y;
    50  size_t mouse_x = event.x, mouse_y = event.y;
    51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    52  key = -1; // do return from view
    53  }
    54  break;
    55  }
    56  case KEY_ENT:
    57  key = -1; // do return from view
    58  break;
    59  default:
    60  break;
    61  }
    62  return calls[0];
    63 }
    - - - - diff --git a/docs/html/view__info_8h_source.html b/docs/html/view__info_8h_source.html deleted file mode 100644 index 253009d..0000000 --- a/docs/html/view__info_8h_source.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -B15F: ui/view_info.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    view_info.h
    -
    -
    -
    1 #ifndef VIEW_INFO
    2 #define VIEW_INFO
    3 
    4 #include "view.h"
    5 
    8 class ViewInfo : public View
    9 {
    10 public:
    11  ViewInfo(void);
    12  virtual void setText(std::string text);
    13  virtual void setLabelClose(std::string label);;
    14  virtual void setCall(call_t call);
    15  virtual void draw(void) override;
    16  virtual call_t keypress(int& key) override;
    17 
    18 protected:
    19  std::string text;
    20  std::string label_close;
    21  int close_offset_x = 0;
    22  int close_offset_y = 0;
    23  constexpr static int text_offset_x = 2;
    24  constexpr static int text_offset_y = 3;
    25 };
    26 
    27 #endif // VIEW_INFO
    - -
    Definition: view.h:19
    - - - - diff --git a/docs/html/view__monitor_8cpp_source.html b/docs/html/view__monitor_8cpp_source.html deleted file mode 100644 index 09f6315..0000000 --- a/docs/html/view__monitor_8cpp_source.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - -B15F: ui/view_monitor.cpp Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    view_monitor.cpp
    -
    -
    -
    1 #include "view_monitor.h"
    2 
    3 ViewMonitor::ViewMonitor() : t_worker(&ViewMonitor::worker, this)
    4 {
    5 }
    6 
    7 call_t ViewMonitor::keypress(int& key)
    8 {
    9  switch(key)
    10  {
    11 
    12  case KEY_MOUSE:
    13  {
    14  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    15  MEVENT event;
    16  bool hit = false;
    17  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    18  {
    19  size_t column = start_x + close_offset_x;
    20  size_t row = start_y + close_offset_y;
    21  size_t mouse_x = event.x, mouse_y = event.y;
    22  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    23  hit = true;
    24  }
    25  if(!hit)
    26  break;
    27 
    28  // fall through to next case
    29  [[fallthrough]];
    30  }
    31  case KEY_ENT:
    32  run_worker = false;
    33  key = -1; // do return from view
    34  wclear(win);
    35  wrefresh(win);
    36  t_worker.join();
    37  break;
    38  default:
    39  break;
    40  }
    41  return calls[0];
    42 }
    43 
    44 std::string ViewMonitor::fancyDigitalString(uint8_t& b)
    45 {
    46  std::stringstream str;
    47  str << std::bitset<8>(b).to_string();
    48  str << " ";
    49  str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec;
    50  return str.str();
    51 }
    52 
    53 std::string ViewMonitor::fancyAnalogString(uint16_t& v)
    54 {
    55  std::stringstream str;
    56  double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0;
    57 
    58  str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V ";
    59 
    60  str << "[";
    61  uint8_t p = round(v * 40.0 / 1023.0);
    62  for(uint8_t i = 0; i < p; i++)
    63  str << "X";
    64  for(uint8_t i = 0; i < 40 - p; i++)
    65  str << " ";
    66  str << "]" << std::endl;
    67 
    68  return str.str();
    69 }
    70 
    71 void ViewMonitor::worker()
    72 {
    73  B15F& drv = B15F::getInstance();
    74  while(run_worker)
    75  {
    76  try
    77  {
    78  std::this_thread::sleep_for(std::chrono::milliseconds(100));
    79 
    80  uint8_t be0 = drv.digitalRead0();
    81  uint8_t be1 = drv.digitalRead1();
    82  uint8_t dsw = drv.readDipSwitch();
    83  uint16_t adc[8];
    84  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    85  adc[i] = drv.analogRead(i);
    86 
    87 
    88  std::stringstream str;
    89 
    90  // hline
    91  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    92  if(i % 2 == 0)
    93  str << "-";
    94  else
    95  str << " ";
    96  str << std::endl;
    97 
    98  str << "Digitale Enigaenge:" << std::endl;
    99  str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl;
    100  str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl;
    101  str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl;
    102 
    103  // hline
    104  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    105  if(i % 2 == 0)
    106  str << "-";
    107  else
    108  str << " ";
    109  str << std::endl;
    110 
    111  str << "Analoge Eingaenge:" << std::endl;
    112  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    113  {
    114  str << "Kanal " << std::to_string((int) i) << ": ";
    115  str << fancyAnalogString(adc[i]) << std::endl;
    116  }
    117 
    118  text = str.str();
    119  repaint();
    120  }
    121  catch(DriverException& ex)
    122  {
    123  std::cout << "DriverException: " << ex.what() << std::endl;
    124  drv.delay_ms(1000);
    125  }
    126  catch(...)
    127  {
    128  try
    129  {
    130  drv.reconnect();
    131  }
    132  catch(...)
    133  {
    134  B15F::abort("yoho meine dudes");
    135  return;
    136  }
    137  }
    138  }
    139 }
    - -
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    -
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:373
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:383
    -
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:408
    -
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    -
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    -
    void reconnect(void)
    Definition: b15f.cpp:57
    - - - - - diff --git a/docs/html/view__monitor_8h_source.html b/docs/html/view__monitor_8h_source.html deleted file mode 100644 index b311d44..0000000 --- a/docs/html/view__monitor_8h_source.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -B15F: ui/view_monitor.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    view_monitor.h
    -
    -
    -
    1 #ifndef VIEW_MONITOR_H
    2 #define VIEW_MONITOR_H
    3 
    4 #include <thread>
    5 #include <chrono>
    6 #include <sstream>
    7 #include <bitset>
    8 #include "view_info.h"
    9 #include "../drv/b15f.h"
    10 
    13 class ViewMonitor : public ViewInfo
    14 {
    15 
    16 public:
    17  ViewMonitor(void);
    18  virtual call_t keypress(int& key) override;
    19 
    20 private:
    21  std::string fancyDigitalString(uint8_t& b);
    22  std::string fancyAnalogString(uint16_t& v);
    23 
    24 protected:
    25  virtual void worker(void);
    26  volatile bool run_worker = true;
    27  std::thread t_worker;
    28 
    29 };
    30 
    31 #endif // VIEW_MONITOR_H
    - - - - - - diff --git a/docs/html/view__promt_8cpp_source.html b/docs/html/view__promt_8cpp_source.html deleted file mode 100644 index cb9f31c..0000000 --- a/docs/html/view__promt_8cpp_source.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -B15F: ui/view_promt.cpp Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    view_promt.cpp
    -
    -
    -
    1 #include "view_promt.h"
    2 
    3 void ViewPromt::draw()
    4 {
    5  curs_set(1); // show cursor
    6 
    7  int li = text_offset_y;
    8  int ci = 0;
    9  for(std::string line : str_split(message + input, "\n"))
    10  {
    11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
    12  ci = line.length() + text_offset_x;
    13  }
    14 
    15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
    16  button_offset_y = height - text_offset_y;
    17 
    18  if(selection == 0)
    19  {
    20  wattron(win, A_REVERSE);
    21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    22  wattroff(win, A_REVERSE);
    23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    25  }
    26  else
    27  {
    28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    30  wattron(win, A_REVERSE);
    31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    32  wattroff(win, A_REVERSE);
    33  }
    34  wmove(win, li, ci);
    35 }
    36 
    37 void ViewPromt::setMessage(std::string message)
    38 {
    39  this->message = message;
    40 }
    41 
    42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
    43 {
    44  label_confirm = name;
    45  call_confirm = call;
    46 }
    47 
    48 void ViewPromt::setCancel(std::string name, bool cancelable)
    49 {
    50  label_cancel = name;
    51  this->cancelable = cancelable;
    52 }
    53 
    54 std::string ViewPromt::getInput()
    55 {
    56  return input;
    57 }
    58 
    59 std::function<void(int)> ViewPromt::keypress(int& key)
    60 {
    61  std::function<void(int)> ret = nullptr;
    62  switch(key)
    63  {
    64  case KEY_BACKSPACE:
    65  if(input.length())
    66  input.pop_back();
    67  break;
    68  case '\t':
    69  case KEY_LEFT:
    70  case KEY_RIGHT:
    71  selection = (selection + 1 ) % 2;
    72  break;
    73  case KEY_MOUSE:
    74  {
    75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    76  MEVENT event;
    77  bool hit = false;
    78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    79  {
    80  size_t column_start = start_x + button_offset_x;
    81  size_t row_start = start_y + button_offset_y;
    82  size_t mouse_x = event.x, mouse_y = event.y;
    83  if(mouse_y == row_start)
    84  {
    85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
    86  {
    87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    88  hit = true;
    89  selection = 0;
    90  }
    91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
    92  {
    93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    94  hit = true;
    95  selection = 1;
    96  }
    97  }
    98  }
    99  if(!hit)
    100  break;
    101 
    102  // fall through to next case
    103  [[fallthrough]];
    104  }
    105  case KEY_ENT:
    106  if(selection == 0) // exit
    107  key = -1; // do return from view
    108  else
    109  ret = call_confirm;
    110  break;
    111  default:
    112  break;
    113  }
    114 
    115  if(key >= ' ' && key <= '~')
    116  input += (char) key;
    117 
    118  if(key != KEY_ENT)
    119  repaint();
    120  return ret;
    121 }
    - - - - diff --git a/docs/html/view__promt_8h_source.html b/docs/html/view__promt_8h_source.html deleted file mode 100644 index 3ffc2fc..0000000 --- a/docs/html/view__promt_8h_source.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -B15F: ui/view_promt.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    view_promt.h
    -
    -
    -
    1 #ifndef VIEW_PROMT_H
    2 #define VIEW_PROMT_H
    3 
    4 #include <vector>
    5 #include <string>
    6 #include "view.h"
    7 
    10 class ViewPromt : public View
    11 {
    12 public:
    13  virtual void draw(void) override;
    14  virtual void setMessage(std::string message);
    15  virtual void setConfirm(std::string name, call_t call);
    16  virtual void setCancel(std::string name, bool cancelable);
    17  virtual std::string getInput(void);
    18  virtual call_t keypress(int& key) override;
    19 
    20 protected:
    21  size_t selection = 1;
    22  std::string input;
    23  std::string message = "Input";
    24  std::string label_confirm = "[ OK ]";
    25  std::string sep = " ";
    26  std::string label_cancel = "[ Cancel ]";
    27  call_t call_confirm = nullptr;
    28  bool cancelable = true;
    29  int button_offset_x = 0, button_offset_y = 0;
    30  constexpr static int text_offset_x = 2;
    31  constexpr static int text_offset_y = 2;
    32 };
    33 
    34 #endif // VIEW_PROMT_H
    -
    Definition: view.h:19
    - - - - - diff --git a/docs/html/view__selection_8cpp_source.html b/docs/html/view__selection_8cpp_source.html deleted file mode 100644 index 324fa41..0000000 --- a/docs/html/view__selection_8cpp_source.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -B15F: ui/view_selection.cpp Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    view_selection.cpp
    -
    -
    -
    1 #include "view_selection.h"
    2 
    3 void ViewSelection::draw()
    4 {
    5  //curs_set(0); // hide cursor
    6  for(size_t i = 0; i < choices.size(); i++)
    7  {
    8  if(selection == i)
    9  wattron(win, A_REVERSE);
    10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
    11  if(selection == i)
    12  wattroff(win, A_REVERSE);
    13  }
    14 }
    15 
    16 void ViewSelection::addChoice(std::string name, call_t call)
    17 {
    18  choices.push_back(name);
    19  calls.push_back(call);
    20 }
    21 
    22 call_t ViewSelection::keypress(int& key)
    23 {
    24  call_t ret = nullptr;
    25  switch(key)
    26  {
    27  case KEY_UP:
    28  do
    29  selection = (selection - 1 + choices.size()) % choices.size();
    30  while(!choices[selection].length() && choices.size());
    31  break;
    32 
    33  case '\t':
    34  case KEY_DOWN:
    35  do
    36  selection = (selection + 1) % choices.size();
    37  while(!choices[selection].length() && choices.size());
    38  break;
    39 
    40  case KEY_MOUSE:
    41  {
    42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    43  MEVENT event;
    44  bool hit = false;
    45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    46  {
    47  size_t column_start = start_x + choice_offset_x;
    48  size_t row_start = start_y + choice_offset_y;
    49  size_t mouse_x = event.x, mouse_y = event.y;
    50  for(size_t i = 0; i < choices.size(); i++)
    51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
    52  {
    53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
    54  hit = true;
    55  selection = i;
    56  }
    57  }
    58  if(!hit)
    59  break;
    60 
    61  // fall through to next case
    62  [[fallthrough]];
    63  }
    64 
    65  case KEY_ENT:
    66  if(selection == choices.size() - 1) // exit
    67  key = -1; // do return from view
    68  else
    69  ret = calls[selection];
    70  break;
    71  default:
    72  break;
    73  }
    74  repaint();
    75  return ret;
    76 }
    - - - - diff --git a/docs/html/view__selection_8h_source.html b/docs/html/view__selection_8h_source.html deleted file mode 100644 index e284347..0000000 --- a/docs/html/view__selection_8h_source.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -B15F: ui/view_selection.h Source File - - - - - - - - - -
    -
    - - - - - - -
    -
    B15F -
    -
    Board 15 Famulus Edition
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    view_selection.h
    -
    -
    -
    1 #ifndef VIEW_SELECTION_H
    2 #define VIEW_SELECTION_H
    3 
    4 #include <vector>
    5 #include <string>
    6 #include "view.h"
    7 
    10 class ViewSelection : public View
    11 {
    12 public:
    13  virtual void draw(void) override;
    14  virtual void addChoice(std::string name, call_t call);
    15  virtual call_t keypress(int& key) override;
    16 
    17 
    18 protected:
    19  size_t selection = 0;
    20  std::vector<std::string> choices;
    21 
    22  constexpr static int choice_offset_x = 2;
    23  constexpr static int choice_offset_y = 3;
    24 };
    25 
    26 #endif // VIEW_SELECTION_H
    -
    Definition: view.h:19
    - - - - - From 63d81c6e7e95d51718e9ee55f23a8fe7ba82b762 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Wed, 29 May 2019 10:46:38 +0200 Subject: [PATCH 09/35] removed unused timeout --- control/src/.idea/workspace.xml | 264 +++++--------------------------- control/src/drv/b15f.cpp | 10 +- control/src/drv/usart.cpp | 166 +------------------- control/src/drv/usart.h | 12 +- 4 files changed, 45 insertions(+), 407 deletions(-) diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml index b807b87..bfe8436 100644 --- a/control/src/.idea/workspace.xml +++ b/control/src/.idea/workspace.xml @@ -12,221 +12,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -406,17 +204,27 @@ - + - - + + - + - - + + + + + + + + + + + + diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index e3ba218..722513f 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -229,7 +229,7 @@ uint16_t B15F::analogRead(uint8_t channel) channel }; - int n_sent = usart.receive(&rq[0], 0, sizeof(rq), 1000); + int n_sent = usart.receive(&rq[0], 0, sizeof(rq)); if(n_sent != sizeof(rq)) abort("Sent failed"); @@ -302,7 +302,7 @@ uint8_t B15F::pwmSetFrequency(uint32_t freq) static_cast((freq >> 24) & 0xFF) }; - int n_sent = usart.receive(&rq[0], 0, sizeof(rq), 1000); + int n_sent = usart.receive(&rq[0], 0, sizeof(rq)); if(n_sent != sizeof(rq)) abort("Sent failed"); @@ -321,7 +321,7 @@ bool B15F::pwmSetValue(uint8_t value) value }; - int n_sent = usart.receive(&rq[0], 0, sizeof(rq), 1000); + int n_sent = usart.receive(&rq[0], 0, sizeof(rq)); if(n_sent != sizeof(rq)) abort("Sent failed"); @@ -341,7 +341,7 @@ bool B15F::setRegister(uint8_t adr, uint8_t val) val }; - int n_sent = usart.receive(&rq[0], 0, sizeof(rq), 1000); + int n_sent = usart.receive(&rq[0], 0, sizeof(rq)); if(n_sent != sizeof(rq)) abort("Sent failed"); @@ -360,7 +360,7 @@ uint8_t B15F::getRegister(uint8_t adr) adr }; - int n_sent = usart.receive(&rq[0], 0, sizeof(rq), 1000); + int n_sent = usart.receive(&rq[0], 0, sizeof(rq)); if(n_sent != sizeof(rq)) abort("Sent failed"); diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index 0566cd9..9c48ab2 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -57,13 +57,6 @@ void USART::flushOutputBuffer() throw USARTException("Fehler beim Versenden des Ausgangspuffers"); } -void USART::printStatistics() -{ - double pz = 1e2 * n_blocks_failed / n_blocks_total; - pz = std::round(pz * 1e2) / 1e2; - std::cout << "blocks total: " << n_blocks_total << " ok: " << (n_blocks_total - n_blocks_failed) << " failed: " << n_blocks_failed << " (" << pz << "%)" << std::endl; -} - void USART::writeByte(uint8_t b) { int sent = write(file_desc, &b, 1); @@ -92,7 +85,7 @@ void USART::writeU32(uint32_t w) throw USARTException("Fehler beim Senden: writeU32()"); } -int USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len, uint32_t timeout) +int USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) { uint32_t elapsed = 0; int n_read = -1; @@ -111,7 +104,7 @@ int USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len, uint32_t time return 0; } -int USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len, uint32_t timeout) +int USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) { uint32_t elapsed = 0; int n_sent = -1; @@ -130,89 +123,6 @@ int USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len, uint32_t timeo return n_sent; } - -void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len) -{ - uint8_t crc; - uint8_t aw; - const uint16_t us_per_bit = (1000000 / baudrate) * 16; - const uint16_t n_total = len + 3; - - n_blocks_total++; - bool failed = false; - - do - { - // calc crc - crc = 0; - for(uint8_t i = 0; i < len; i++) - { - crc ^= buffer[i]; - for (uint8_t k = 0; k < 8; k++) - { - if (crc & 1) - crc ^= CRC7_POLY; - crc >>= 1; - } - } - - // construct block - block_buffer[0] = len; - std::memcpy(&block_buffer[1], buffer + offset, len); - block_buffer[len + 1] = crc; - block_buffer[len + 2] = BLOCK_END; - - // send block - clearOutputBuffer(); - clearInputBuffer(); - int n_sent = receive(&block_buffer[0], 0, len + 3, us_per_bit * n_total); - if(n_sent != n_total) - throw std::runtime_error("fatal (send): " + std::to_string(n_sent)); - - /*for(uint8_t i = 0; i < len + 3; i++) - { - receive(&block_buffer[i], 0, 1, us_per_bit * n_total); - //tcdrain(file_desc); - //usleep(1000); - }*/ - - // flush output data - tcdrain(file_desc); - - //usleep(us_per_bit * n_total * 10); - - // check response - int n_read = transmit(&aw, 0, 1, us_per_bit * n_blocks_total * 10); - for(uint16_t i = 0; i < 255 && n_read != 1; i++) - { - writeByte(0x80); // Stoppzeichen für Block - if(tcdrain(file_desc)) - { - std::cout << "drain failed" << std::endl; - } - std::cout << "WARNING: read error (" << n_read << "), retry #" << (int) i << std::endl; - usleep(us_per_bit*100); - n_read = transmit(&aw, 0, 1, us_per_bit); - } - - if(n_read != 1) - throw std::runtime_error("fatal: " + std::to_string(n_read)); - - //clearInputBuffer(); - - if(aw != 0xFF) - { - if(!failed) - n_blocks_failed++; - failed = true; - std::cout << "block failed, retry" << std::endl; - } - } - while(aw != 0xFF); - - //std::cout << "OK" << std::endl; -} - uint8_t USART::readByte(void) { char b; @@ -237,78 +147,6 @@ uint16_t USART::readInt(void) return readByte() | readByte() << 8; } -bool USART::readBlock(uint8_t* buffer, uint16_t offset) -{ - uint8_t len = readByte(); - uint8_t crc = 0; - buffer += offset; - - uint32_t block_timeout = timeout / 10; - - // wait for block - int n_ready; - uint16_t elapsed = 0; - auto start = std::chrono::steady_clock::now(); - auto end = start; - while(elapsed < block_timeout) - { - int code = ioctl(file_desc, FIONREAD, &n_ready); - if(code != 0) - { - std::cout << "n_ready code: " << code << std::endl; - return false; - } - - if(n_ready >= len + 1) - break; - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - if(elapsed >= timeout) - { - std::cout << "block timeout: " << std::endl; - return false; - } - - while(len--) - { - *buffer = readByte(); - - crc ^= *buffer++; - for (uint8_t i = 0; i < 8; i++) - { - if (crc & 1) - crc ^= CRC7_POLY; - crc >>= 1; - } - } - - crc ^= readByte(); - for (uint8_t i = 0; i < 8; i++) - { - if (crc & 1) - crc ^= CRC7_POLY; - crc >>= 1; - } - - if(TEST == 1) - crc = 1; - if(TEST > 100) - TEST = 0; - - if (crc == 0) - { - writeByte(0xFF); - return true; - } - else - { - writeByte(0xFE); - return false; - } -} - uint32_t USART::getBaudrate() { return baudrate; diff --git a/control/src/drv/usart.h b/control/src/drv/usart.h index 698d78a..e42f461 100644 --- a/control/src/drv/usart.h +++ b/control/src/drv/usart.h @@ -54,11 +54,6 @@ public: */ void flushOutputBuffer(void); - /** - * Gibt Anzahl an erfolgreichen und fehlgeschlagenen Block-Übertragungen an - */ - void printStatistics(void); - /*************************************************/ @@ -100,11 +95,8 @@ public: */ uint16_t readInt(void); - int transmit(uint8_t *buffer, uint16_t offset, uint8_t len, uint32_t timeout); - int receive(uint8_t *buffer, uint16_t offset, uint8_t len, uint32_t timeout); - - void writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len); - bool readBlock(uint8_t* buffer, uint16_t offset); + int transmit(uint8_t *buffer, uint16_t offset, uint8_t len); + int receive(uint8_t *buffer, uint16_t offset, uint8_t len); /*************************************/ From 0ec3988c5804c69c65ab5dd406eecbc63a46cb62 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Wed, 29 May 2019 11:07:42 +0200 Subject: [PATCH 10/35] comments --- control/src/.idea/workspace.xml | 68 ++++++++++++++++++++------------- control/src/drv/b15f.cpp | 20 +++------- control/src/drv/usart.cpp | 41 ++++---------------- control/src/drv/usart.h | 17 ++++++++- 4 files changed, 70 insertions(+), 76 deletions(-) diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml index bfe8436..a95e56f 100644 --- a/control/src/.idea/workspace.xml +++ b/control/src/.idea/workspace.xml @@ -38,11 +38,11 @@ - + - - + + @@ -50,17 +50,26 @@ - - + + - + + + + + + + + + + - - + + @@ -86,9 +95,9 @@ @@ -128,7 +137,7 @@ - + - - + - + @@ -204,27 +213,34 @@ - + + + + - - + + + + + + + + + - - + + - - - - + - - + + diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index 722513f..208bfff 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -229,9 +229,7 @@ uint16_t B15F::analogRead(uint8_t channel) channel }; - int n_sent = usart.receive(&rq[0], 0, sizeof(rq)); - if(n_sent != sizeof(rq)) - abort("Sent failed"); + usart.transmit(&rq[0], 0, sizeof(rq)); uint16_t adc = usart.readInt(); @@ -302,9 +300,7 @@ uint8_t B15F::pwmSetFrequency(uint32_t freq) static_cast((freq >> 24) & 0xFF) }; - int n_sent = usart.receive(&rq[0], 0, sizeof(rq)); - if(n_sent != sizeof(rq)) - abort("Sent failed"); + usart.transmit(&rq[0], 0, sizeof(rq)); uint8_t byte = usart.readByte(); delay_us(10); @@ -321,9 +317,7 @@ bool B15F::pwmSetValue(uint8_t value) value }; - int n_sent = usart.receive(&rq[0], 0, sizeof(rq)); - if(n_sent != sizeof(rq)) - abort("Sent failed"); + usart.transmit(&rq[0], 0, sizeof(rq)); uint8_t aw = usart.readByte(); delay_us(10); @@ -341,9 +335,7 @@ bool B15F::setRegister(uint8_t adr, uint8_t val) val }; - int n_sent = usart.receive(&rq[0], 0, sizeof(rq)); - if(n_sent != sizeof(rq)) - abort("Sent failed"); + usart.transmit(&rq[0], 0, sizeof(rq)); uint8_t byte = usart.readByte(); delay_us(10); @@ -360,9 +352,7 @@ uint8_t B15F::getRegister(uint8_t adr) adr }; - int n_sent = usart.receive(&rq[0], 0, sizeof(rq)); - if(n_sent != sizeof(rq)) - abort("Sent failed"); + usart.transmit(&rq[0], 0, sizeof(rq)); uint8_t aw = usart.readByte(); delay_us(10); diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index 9c48ab2..f148c91 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -85,43 +85,18 @@ void USART::writeU32(uint32_t w) throw USARTException("Fehler beim Senden: writeU32()"); } -int USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) +void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) { - uint32_t elapsed = 0; - int n_read = -1; - auto start = std::chrono::steady_clock::now(); - auto end = start; - while(elapsed < timeout) - { - n_read = read(file_desc, buffer + offset, len); - if (n_read == len) - return n_read; - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - - return 0; + int n = read(file_desc, buffer + offset, len); + if(n != len) + throw USARTException(std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); } -int USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) +void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) { - uint32_t elapsed = 0; - int n_sent = -1; - auto start = std::chrono::steady_clock::now(); - auto end = start; - while(elapsed < timeout) - { - n_sent = write(file_desc, buffer + offset, len); - flushOutputBuffer(); - if (n_sent == len) - return n_sent; - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - - return n_sent; + int n = write(file_desc, buffer + offset, len); + if(n != len) + throw USARTException(std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); } uint8_t USART::readByte(void) { diff --git a/control/src/drv/usart.h b/control/src/drv/usart.h index e42f461..39e2ff5 100644 --- a/control/src/drv/usart.h +++ b/control/src/drv/usart.h @@ -95,8 +95,21 @@ public: */ uint16_t readInt(void); - int transmit(uint8_t *buffer, uint16_t offset, uint8_t len); - int receive(uint8_t *buffer, uint16_t offset, uint8_t len); + /** + * Sends n bytes from the buffer over USART + * \param buffer target buffer + * \param offset in buffer (mostly 0) + * \throws USARTException + */ + void transmit(uint8_t *buffer, uint16_t offset, uint8_t len); + + /** + * Receives n bytes from USART and writes them into the buffer + * \param buffer target buffer + * \param offset in buffer (mostly 0) + * \throws USARTException + */ + void receive(uint8_t *buffer, uint16_t offset, uint8_t len); /*************************************/ From b4ac345875961d93a2b28d0d2e7db2de8e4e47c0 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Tue, 4 Jun 2019 09:43:10 +0200 Subject: [PATCH 11/35] some comments --- control/src/.idea/workspace.xml | 75 +++++++++++----------- control/src/drv/usart.cpp | 107 +++++++++++++++----------------- control/src/drv/usart.h | 2 + 3 files changed, 90 insertions(+), 94 deletions(-) diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml index a95e56f..911e858 100644 --- a/control/src/.idea/workspace.xml +++ b/control/src/.idea/workspace.xml @@ -12,7 +12,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -38,20 +38,20 @@ - + - - + + - + - - + + @@ -68,7 +68,7 @@ - + @@ -96,8 +96,8 @@ @@ -137,7 +137,7 @@ - + - - - + - - - - - - + @@ -195,17 +190,26 @@ - - + + + + + + + + + + + @@ -213,8 +217,12 @@ - - + + + + + + @@ -223,24 +231,17 @@ - + - - + + - - - - - - - - - + + diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index f148c91..6f06858 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -1,111 +1,109 @@ #include "usart.h" -void USART::openDevice(std::string device) -{ - file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY /* | O_NONBLOCK*/); - if(file_desc <= 0) +USART::~USART() { + closeDevice(); +} + +void USART::openDevice(std::string device) { + // Benutze blockierenden Modus + file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); + if (file_desc <= 0) throw USARTException("Fehler beim Öffnen des Gerätes"); struct termios options; int code = tcgetattr(file_desc, &options); - if(code) + if (code) throw USARTException("Fehler beim Lesen der Geräteparameter"); options.c_cflag = CS8 | CLOCAL | CREAD; options.c_iflag = IGNPAR; options.c_oflag = 0; options.c_lflag = 0; - options.c_cc[VMIN] = 0; // #bytes read returns at least + options.c_cc[VMIN] = 0; // #bytes read returns at least options.c_cc[VTIME] = timeout; code = cfsetspeed(&options, baudrate); - if(code) + if (code) throw USARTException("Fehler beim Setzen der Baudrate"); code = tcsetattr(file_desc, TCSANOW, &options); - if(code) + if (code) throw USARTException("Fehler beim Setzen der Geräteparameter"); clearOutputBuffer(); clearInputBuffer(); } -void USART::closeDevice() -{ - int code = close(file_desc); - if(code) - throw USARTException("Fehler beim Schließen des Gerätes"); +void USART::closeDevice() { + if (file_desc > 0) { + int code = close(file_desc); + if (code) + throw USARTException("Fehler beim Schließen des Gerätes"); + file_desc = -1; + } } -void USART::clearInputBuffer() -{ +void USART::clearInputBuffer() { int code = tcflush(file_desc, TCIFLUSH); - if(code) + if (code) throw USARTException("Fehler beim Leeren des Eingangspuffers"); } -void USART::clearOutputBuffer() -{ +void USART::clearOutputBuffer() { int code = tcflush(file_desc, TCOFLUSH); - if(code) + if (code) throw USARTException("Fehler beim Leeren des Ausgangspuffers"); } -void USART::flushOutputBuffer() -{ +void USART::flushOutputBuffer() { int code = tcdrain(file_desc); - if(code) + if (code) throw USARTException("Fehler beim Versenden des Ausgangspuffers"); } -void USART::writeByte(uint8_t b) -{ +void USART::writeByte(uint8_t b) { int sent = write(file_desc, &b, 1); - if(sent != 1) - { + if (sent != 1) { std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl; usleep(100000); sent = write(file_desc, &b, 1); - if(sent != 1) + if (sent != 1) throw USARTException("Fehler beim Senden: writeByte()"); } } -void USART::writeInt(uint16_t d) -{ - int sent = write(file_desc, reinterpret_cast(&d), 2); - if(sent != 2) +void USART::writeInt(uint16_t d) { + int sent = write(file_desc, reinterpret_cast(&d), 2); + if (sent != 2) throw USARTException("Fehler beim Senden: writeInt()"); } -void USART::writeU32(uint32_t w) -{ - int sent = write(file_desc, reinterpret_cast(&w), 4); - if(sent != 4) +void USART::writeU32(uint32_t w) { + int sent = write(file_desc, reinterpret_cast(&w), 4); + if (sent != 4) throw USARTException("Fehler beim Senden: writeU32()"); } -void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) -{ +void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) { int n = read(file_desc, buffer + offset, len); - if(n != len) - throw USARTException(std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); + if (n != len) + throw USARTException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); } -void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) -{ +void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) { int n = write(file_desc, buffer + offset, len); - if(n != len) - throw USARTException(std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); + if (n != len) + throw USARTException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); } -uint8_t USART::readByte(void) -{ + +uint8_t USART::readByte(void) { char b; auto start = std::chrono::steady_clock::now(); auto end = start; uint16_t elapsed = 0; - while(elapsed < timeout * 100) - { + while (elapsed < timeout * 100) { int code = read(file_desc, &b, 1); if (code > 0) return static_cast(b); @@ -117,27 +115,22 @@ uint8_t USART::readByte(void) throw TimeoutException("Verbindung unterbrochen.", timeout); } -uint16_t USART::readInt(void) -{ +uint16_t USART::readInt(void) { return readByte() | readByte() << 8; } -uint32_t USART::getBaudrate() -{ +uint32_t USART::getBaudrate() { return baudrate; } -uint8_t USART::getTimeout() -{ +uint8_t USART::getTimeout() { return timeout; } -void USART::setBaudrate(uint32_t baudrate) -{ +void USART::setBaudrate(uint32_t baudrate) { this->baudrate = baudrate; } -void USART::setTimeout(uint8_t timeout) -{ +void USART::setTimeout(uint8_t timeout) { this->timeout = timeout; } diff --git a/control/src/drv/usart.h b/control/src/drv/usart.h index 39e2ff5..81600d2 100644 --- a/control/src/drv/usart.h +++ b/control/src/drv/usart.h @@ -23,6 +23,8 @@ public: * Methoden für die Verwaltung der Schnittstelle * *************************************************/ + ~USART(void); + /** * Öffnet die USART Schnittstelle * \param device Linux-Gerätepfad From ab82f2f90e162c29e7bbafe149d1476a6fbc60f8 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Tue, 4 Jun 2019 10:00:41 +0200 Subject: [PATCH 12/35] usartexception revised --- control/src/.idea/workspace.xml | 123 +- control/src/drv/backup.cpp | 52 + control/src/drv/usart.cpp | 88 +- control/src/drv/usart.h | 74 +- control/src/drv/usartexception.h | 23 +- docs/html/CMakeCCompilerId_8c_source.html | 81 + docs/html/CMakeCXXCompilerId_8cpp_source.html | 81 + docs/html/annotated.html | 93 + docs/html/b15f_8cpp_source.html | 118 ++ docs/html/b15f_8h_source.html | 115 ++ docs/html/backup_8cpp_source.html | 83 + docs/html/bc_s.png | Bin 0 -> 676 bytes docs/html/bdwn.png | Bin 0 -> 147 bytes docs/html/classB15F-members.html | 113 ++ docs/html/classB15F.html | 1038 ++++++++++ docs/html/classDot-members.html | 84 + docs/html/classDot.html | 204 ++ docs/html/classDriverException-members.html | 85 + docs/html/classDriverException.html | 117 ++ docs/html/classDriverException.png | Bin 0 -> 481 bytes docs/html/classPlottyFile-members.html | 108 + docs/html/classPlottyFile.html | 819 ++++++++ docs/html/classTimeoutException-members.html | 86 + docs/html/classTimeoutException.html | 120 ++ docs/html/classTimeoutException.png | Bin 0 -> 480 bytes docs/html/classUSART-members.html | 93 + docs/html/classUSART.html | 497 +++++ docs/html/classUSARTException-members.html | 85 + docs/html/classUSARTException.html | 247 +++ docs/html/classUSARTException.png | Bin 0 -> 484 bytes docs/html/classView-members.html | 97 + docs/html/classView.html | 165 ++ docs/html/classView.png | Bin 0 -> 1094 bytes docs/html/classViewInfo-members.html | 107 + docs/html/classViewInfo.html | 193 ++ docs/html/classViewInfo.png | Bin 0 -> 556 bytes docs/html/classViewMonitor-members.html | 111 ++ docs/html/classViewMonitor.html | 205 ++ docs/html/classViewMonitor.png | Bin 0 -> 552 bytes docs/html/classViewPromt-members.html | 113 ++ docs/html/classViewPromt.html | 213 ++ docs/html/classViewPromt.png | Bin 0 -> 387 bytes docs/html/classViewSelection-members.html | 102 + docs/html/classViewSelection.html | 180 ++ docs/html/classViewSelection.png | Bin 0 -> 435 bytes docs/html/classes.html | 113 ++ docs/html/cli_8cpp_source.html | 80 + docs/html/closed.png | Bin 0 -> 132 bytes .../dir_1788f8309b1a812dcb800a185471cf6c.html | 81 + .../dir_19f2f1b99f19c12fa55b8d312cf373ed.html | 81 + .../dir_3d3c8ff3ebf9841b39117ac899f41936.html | 85 + .../dir_587c94d866dbb2f408f78cf41f9b2f8d.html | 81 + .../dir_90e361ec3542f3dd076ea3ad19547437.html | 81 + .../dir_95e29a8b8ee7c54052c171a88bb95675.html | 85 + .../dir_f89abcb304c928c7d889aa5625570de5.html | 81 + docs/html/doc.png | Bin 0 -> 746 bytes docs/html/dot_8cpp_source.html | 85 + docs/html/dot_8h_source.html | 86 + docs/html/doxygen.css | 1766 +++++++++++++++++ docs/html/doxygen.png | Bin 0 -> 3779 bytes docs/html/driverexception_8h_source.html | 82 + docs/html/dynsections.js | 127 ++ docs/html/feature__tests_8c_source.html | 81 + docs/html/feature__tests_8cxx_source.html | 81 + docs/html/files.html | 117 ++ docs/html/folderclosed.png | Bin 0 -> 616 bytes docs/html/folderopen.png | Bin 0 -> 597 bytes docs/html/functions.html | 377 ++++ docs/html/functions_func.html | 345 ++++ docs/html/functions_vars.html | 99 + docs/html/hierarchy.html | 94 + docs/html/index.html | 80 + docs/html/jquery.js | 35 + docs/html/menu.js | 50 + docs/html/menudata.js | 64 + docs/html/nav_f.png | Bin 0 -> 153 bytes docs/html/nav_g.png | Bin 0 -> 95 bytes docs/html/nav_h.png | Bin 0 -> 98 bytes docs/html/open.png | Bin 0 -> 123 bytes docs/html/plottyfile_8cpp_source.html | 109 + docs/html/plottyfile_8h_source.html | 110 + docs/html/search/all_0.html | 30 + docs/html/search/all_0.js | 10 + docs/html/search/all_1.html | 30 + docs/html/search/all_1.js | 5 + docs/html/search/all_10.html | 30 + docs/html/search/all_10.js | 5 + docs/html/search/all_2.html | 30 + docs/html/search/all_2.js | 6 + docs/html/search/all_3.html | 30 + docs/html/search/all_3.js | 12 + docs/html/search/all_4.html | 30 + docs/html/search/all_4.js | 5 + docs/html/search/all_5.html | 30 + docs/html/search/all_5.js | 4 + docs/html/search/all_6.html | 30 + docs/html/search/all_6.js | 23 + docs/html/search/all_7.html | 30 + docs/html/search/all_7.js | 6 + docs/html/search/all_8.html | 30 + docs/html/search/all_8.js | 4 + docs/html/search/all_9.html | 30 + docs/html/search/all_9.js | 7 + docs/html/search/all_a.html | 30 + docs/html/search/all_a.js | 8 + docs/html/search/all_b.html | 30 + docs/html/search/all_b.js | 20 + docs/html/search/all_c.html | 30 + docs/html/search/all_c.js | 7 + docs/html/search/all_d.html | 30 + docs/html/search/all_d.js | 5 + docs/html/search/all_e.html | 30 + docs/html/search/all_e.js | 8 + docs/html/search/all_f.html | 30 + docs/html/search/all_f.js | 6 + docs/html/search/classes_0.html | 30 + docs/html/search/classes_0.js | 4 + docs/html/search/classes_1.html | 30 + docs/html/search/classes_1.js | 5 + docs/html/search/classes_2.html | 30 + docs/html/search/classes_2.js | 4 + docs/html/search/classes_3.html | 30 + docs/html/search/classes_3.js | 4 + docs/html/search/classes_4.html | 30 + docs/html/search/classes_4.js | 5 + docs/html/search/classes_5.html | 30 + docs/html/search/classes_5.js | 8 + docs/html/search/close.png | Bin 0 -> 273 bytes docs/html/search/functions_0.html | 30 + docs/html/search/functions_0.js | 10 + docs/html/search/functions_1.html | 30 + docs/html/search/functions_1.js | 6 + docs/html/search/functions_2.html | 30 + docs/html/search/functions_2.js | 11 + docs/html/search/functions_3.html | 30 + docs/html/search/functions_3.js | 4 + docs/html/search/functions_4.html | 30 + docs/html/search/functions_4.js | 4 + docs/html/search/functions_5.html | 30 + docs/html/search/functions_5.js | 23 + docs/html/search/functions_6.html | 30 + docs/html/search/functions_6.js | 4 + docs/html/search/functions_7.html | 30 + docs/html/search/functions_7.js | 5 + docs/html/search/functions_8.html | 30 + docs/html/search/functions_8.js | 6 + docs/html/search/functions_9.html | 30 + docs/html/search/functions_9.js | 20 + docs/html/search/functions_a.html | 30 + docs/html/search/functions_a.js | 6 + docs/html/search/functions_b.html | 30 + docs/html/search/functions_b.js | 5 + docs/html/search/functions_c.html | 30 + docs/html/search/functions_c.js | 5 + docs/html/search/functions_d.html | 30 + docs/html/search/functions_d.js | 5 + docs/html/search/mag_sel.png | Bin 0 -> 465 bytes docs/html/search/nomatches.html | 12 + docs/html/search/pages_0.html | 30 + docs/html/search/pages_0.js | 4 + docs/html/search/search.css | 271 +++ docs/html/search/search.js | 814 ++++++++ docs/html/search/search_l.png | Bin 0 -> 567 bytes docs/html/search/search_m.png | Bin 0 -> 158 bytes docs/html/search/search_r.png | Bin 0 -> 553 bytes docs/html/search/searchdata.js | 27 + docs/html/search/variables_0.html | 30 + docs/html/search/variables_0.js | 4 + docs/html/search/variables_1.html | 30 + docs/html/search/variables_1.js | 6 + docs/html/search/variables_2.html | 30 + docs/html/search/variables_2.js | 4 + docs/html/search/variables_3.html | 30 + docs/html/search/variables_3.js | 5 + docs/html/search/variables_4.html | 30 + docs/html/search/variables_4.js | 4 + docs/html/splitbar.png | Bin 0 -> 314 bytes docs/html/sync_off.png | Bin 0 -> 853 bytes docs/html/sync_on.png | Bin 0 -> 845 bytes docs/html/tab_a.png | Bin 0 -> 142 bytes docs/html/tab_b.png | Bin 0 -> 169 bytes docs/html/tab_h.png | Bin 0 -> 177 bytes docs/html/tab_s.png | Bin 0 -> 184 bytes docs/html/tabs.css | 1 + docs/html/timeoutexception_8h_source.html | 82 + docs/html/ui_8cpp_source.html | 96 + docs/html/ui_8h_source.html | 81 + docs/html/usart_8cpp_source.html | 94 + docs/html/usart_8h_source.html | 95 + docs/html/usartexception_8h_source.html | 87 + docs/html/view_8cpp_source.html | 82 + docs/html/view_8h_source.html | 82 + docs/html/view__info_8cpp_source.html | 81 + docs/html/view__info_8h_source.html | 83 + docs/html/view__monitor_8cpp_source.html | 92 + docs/html/view__monitor_8h_source.html | 83 + docs/html/view__promt_8cpp_source.html | 81 + docs/html/view__promt_8h_source.html | 83 + docs/html/view__selection_8cpp_source.html | 81 + docs/html/view__selection_8h_source.html | 83 + 200 files changed, 14602 insertions(+), 160 deletions(-) create mode 100644 control/src/drv/backup.cpp create mode 100644 docs/html/CMakeCCompilerId_8c_source.html create mode 100644 docs/html/CMakeCXXCompilerId_8cpp_source.html create mode 100644 docs/html/annotated.html create mode 100644 docs/html/b15f_8cpp_source.html create mode 100644 docs/html/b15f_8h_source.html create mode 100644 docs/html/backup_8cpp_source.html create mode 100644 docs/html/bc_s.png create mode 100644 docs/html/bdwn.png create mode 100644 docs/html/classB15F-members.html create mode 100644 docs/html/classB15F.html create mode 100644 docs/html/classDot-members.html create mode 100644 docs/html/classDot.html create mode 100644 docs/html/classDriverException-members.html create mode 100644 docs/html/classDriverException.html create mode 100644 docs/html/classDriverException.png create mode 100644 docs/html/classPlottyFile-members.html create mode 100644 docs/html/classPlottyFile.html create mode 100644 docs/html/classTimeoutException-members.html create mode 100644 docs/html/classTimeoutException.html create mode 100644 docs/html/classTimeoutException.png create mode 100644 docs/html/classUSART-members.html create mode 100644 docs/html/classUSART.html create mode 100644 docs/html/classUSARTException-members.html create mode 100644 docs/html/classUSARTException.html create mode 100644 docs/html/classUSARTException.png create mode 100644 docs/html/classView-members.html create mode 100644 docs/html/classView.html create mode 100644 docs/html/classView.png create mode 100644 docs/html/classViewInfo-members.html create mode 100644 docs/html/classViewInfo.html create mode 100644 docs/html/classViewInfo.png create mode 100644 docs/html/classViewMonitor-members.html create mode 100644 docs/html/classViewMonitor.html create mode 100644 docs/html/classViewMonitor.png create mode 100644 docs/html/classViewPromt-members.html create mode 100644 docs/html/classViewPromt.html create mode 100644 docs/html/classViewPromt.png create mode 100644 docs/html/classViewSelection-members.html create mode 100644 docs/html/classViewSelection.html create mode 100644 docs/html/classViewSelection.png create mode 100644 docs/html/classes.html create mode 100644 docs/html/cli_8cpp_source.html create mode 100644 docs/html/closed.png create mode 100644 docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html create mode 100644 docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html create mode 100644 docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html create mode 100644 docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html create mode 100644 docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html create mode 100644 docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html create mode 100644 docs/html/dir_f89abcb304c928c7d889aa5625570de5.html create mode 100644 docs/html/doc.png create mode 100644 docs/html/dot_8cpp_source.html create mode 100644 docs/html/dot_8h_source.html create mode 100644 docs/html/doxygen.css create mode 100644 docs/html/doxygen.png create mode 100644 docs/html/driverexception_8h_source.html create mode 100644 docs/html/dynsections.js create mode 100644 docs/html/feature__tests_8c_source.html create mode 100644 docs/html/feature__tests_8cxx_source.html create mode 100644 docs/html/files.html create mode 100644 docs/html/folderclosed.png create mode 100644 docs/html/folderopen.png create mode 100644 docs/html/functions.html create mode 100644 docs/html/functions_func.html create mode 100644 docs/html/functions_vars.html create mode 100644 docs/html/hierarchy.html create mode 100644 docs/html/index.html create mode 100644 docs/html/jquery.js create mode 100644 docs/html/menu.js create mode 100644 docs/html/menudata.js create mode 100644 docs/html/nav_f.png create mode 100644 docs/html/nav_g.png create mode 100644 docs/html/nav_h.png create mode 100644 docs/html/open.png create mode 100644 docs/html/plottyfile_8cpp_source.html create mode 100644 docs/html/plottyfile_8h_source.html create mode 100644 docs/html/search/all_0.html create mode 100644 docs/html/search/all_0.js create mode 100644 docs/html/search/all_1.html create mode 100644 docs/html/search/all_1.js create mode 100644 docs/html/search/all_10.html create mode 100644 docs/html/search/all_10.js create mode 100644 docs/html/search/all_2.html create mode 100644 docs/html/search/all_2.js create mode 100644 docs/html/search/all_3.html create mode 100644 docs/html/search/all_3.js create mode 100644 docs/html/search/all_4.html create mode 100644 docs/html/search/all_4.js create mode 100644 docs/html/search/all_5.html create mode 100644 docs/html/search/all_5.js create mode 100644 docs/html/search/all_6.html create mode 100644 docs/html/search/all_6.js create mode 100644 docs/html/search/all_7.html create mode 100644 docs/html/search/all_7.js create mode 100644 docs/html/search/all_8.html create mode 100644 docs/html/search/all_8.js create mode 100644 docs/html/search/all_9.html create mode 100644 docs/html/search/all_9.js create mode 100644 docs/html/search/all_a.html create mode 100644 docs/html/search/all_a.js create mode 100644 docs/html/search/all_b.html create mode 100644 docs/html/search/all_b.js create mode 100644 docs/html/search/all_c.html create mode 100644 docs/html/search/all_c.js create mode 100644 docs/html/search/all_d.html create mode 100644 docs/html/search/all_d.js create mode 100644 docs/html/search/all_e.html create mode 100644 docs/html/search/all_e.js create mode 100644 docs/html/search/all_f.html create mode 100644 docs/html/search/all_f.js create mode 100644 docs/html/search/classes_0.html create mode 100644 docs/html/search/classes_0.js create mode 100644 docs/html/search/classes_1.html create mode 100644 docs/html/search/classes_1.js create mode 100644 docs/html/search/classes_2.html create mode 100644 docs/html/search/classes_2.js create mode 100644 docs/html/search/classes_3.html create mode 100644 docs/html/search/classes_3.js create mode 100644 docs/html/search/classes_4.html create mode 100644 docs/html/search/classes_4.js create mode 100644 docs/html/search/classes_5.html create mode 100644 docs/html/search/classes_5.js create mode 100644 docs/html/search/close.png create mode 100644 docs/html/search/functions_0.html create mode 100644 docs/html/search/functions_0.js create mode 100644 docs/html/search/functions_1.html create mode 100644 docs/html/search/functions_1.js create mode 100644 docs/html/search/functions_2.html create mode 100644 docs/html/search/functions_2.js create mode 100644 docs/html/search/functions_3.html create mode 100644 docs/html/search/functions_3.js create mode 100644 docs/html/search/functions_4.html create mode 100644 docs/html/search/functions_4.js create mode 100644 docs/html/search/functions_5.html create mode 100644 docs/html/search/functions_5.js create mode 100644 docs/html/search/functions_6.html create mode 100644 docs/html/search/functions_6.js create mode 100644 docs/html/search/functions_7.html create mode 100644 docs/html/search/functions_7.js create mode 100644 docs/html/search/functions_8.html create mode 100644 docs/html/search/functions_8.js create mode 100644 docs/html/search/functions_9.html create mode 100644 docs/html/search/functions_9.js create mode 100644 docs/html/search/functions_a.html create mode 100644 docs/html/search/functions_a.js create mode 100644 docs/html/search/functions_b.html create mode 100644 docs/html/search/functions_b.js create mode 100644 docs/html/search/functions_c.html create mode 100644 docs/html/search/functions_c.js create mode 100644 docs/html/search/functions_d.html create mode 100644 docs/html/search/functions_d.js create mode 100644 docs/html/search/mag_sel.png create mode 100644 docs/html/search/nomatches.html create mode 100644 docs/html/search/pages_0.html create mode 100644 docs/html/search/pages_0.js create mode 100644 docs/html/search/search.css create mode 100644 docs/html/search/search.js create mode 100644 docs/html/search/search_l.png create mode 100644 docs/html/search/search_m.png create mode 100644 docs/html/search/search_r.png create mode 100644 docs/html/search/searchdata.js create mode 100644 docs/html/search/variables_0.html create mode 100644 docs/html/search/variables_0.js create mode 100644 docs/html/search/variables_1.html create mode 100644 docs/html/search/variables_1.js create mode 100644 docs/html/search/variables_2.html create mode 100644 docs/html/search/variables_2.js create mode 100644 docs/html/search/variables_3.html create mode 100644 docs/html/search/variables_3.js create mode 100644 docs/html/search/variables_4.html create mode 100644 docs/html/search/variables_4.js create mode 100644 docs/html/splitbar.png create mode 100644 docs/html/sync_off.png create mode 100644 docs/html/sync_on.png create mode 100644 docs/html/tab_a.png create mode 100644 docs/html/tab_b.png create mode 100644 docs/html/tab_h.png create mode 100644 docs/html/tab_s.png create mode 100644 docs/html/tabs.css create mode 100644 docs/html/timeoutexception_8h_source.html create mode 100644 docs/html/ui_8cpp_source.html create mode 100644 docs/html/ui_8h_source.html create mode 100644 docs/html/usart_8cpp_source.html create mode 100644 docs/html/usart_8h_source.html create mode 100644 docs/html/usartexception_8h_source.html create mode 100644 docs/html/view_8cpp_source.html create mode 100644 docs/html/view_8h_source.html create mode 100644 docs/html/view__info_8cpp_source.html create mode 100644 docs/html/view__info_8h_source.html create mode 100644 docs/html/view__monitor_8cpp_source.html create mode 100644 docs/html/view__monitor_8h_source.html create mode 100644 docs/html/view__promt_8cpp_source.html create mode 100644 docs/html/view__promt_8h_source.html create mode 100644 docs/html/view__selection_8cpp_source.html create mode 100644 docs/html/view__selection_8h_source.html diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml index 911e858..87a7f90 100644 --- a/control/src/.idea/workspace.xml +++ b/control/src/.idea/workspace.xml @@ -12,9 +12,9 @@ - + - + + + + + + + + + + + + @@ -169,12 +202,12 @@ - @@ -185,14 +218,14 @@ - + - + @@ -207,9 +240,6 @@ - - - @@ -219,29 +249,46 @@ - + - + - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/control/src/drv/backup.cpp b/control/src/drv/backup.cpp new file mode 100644 index 0000000..51c6f06 --- /dev/null +++ b/control/src/drv/backup.cpp @@ -0,0 +1,52 @@ + +void USART::writeByte(uint8_t b) +{ + int sent = write(file_desc, &b, 1); + if (sent != 1) + { + std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl; + usleep(100000); + sent = write(file_desc, &b, 1); + if (sent != 1) + throw USARTException("Fehler beim Senden: writeByte()"); + } + +} + +void USART::writeInt(uint16_t d) +{ + int sent = write(file_desc, reinterpret_cast(&d), 2); + if (sent != 2) + throw USARTException("Fehler beim Senden: writeInt()"); +} + +void USART::writeU32(uint32_t w) +{ + int sent = write(file_desc, reinterpret_cast(&w), 4); + if (sent != 4) + throw USARTException("Fehler beim Senden: writeU32()"); +} + +uint8_t USART::readByte(void) +{ + char b; + auto start = std::chrono::steady_clock::now(); + auto end = start; + uint16_t elapsed = 0; + while (elapsed < timeout * 100) + { + int code = read(file_desc, &b, 1); + if (code > 0) + return static_cast(b); + + end = std::chrono::steady_clock::now(); + elapsed = std::chrono::duration_cast(end - start).count(); + } + + throw TimeoutException("Verbindung unterbrochen.", timeout); +} + +uint16_t USART::readInt(void) +{ + return readByte() | readByte() << 8; +} diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index 6f06858..5327c48 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -1,10 +1,12 @@ #include "usart.h" -USART::~USART() { +USART::~USART() +{ closeDevice(); } -void USART::openDevice(std::string device) { +void USART::openDevice(std::string device) +{ // Benutze blockierenden Modus file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); if (file_desc <= 0) @@ -33,8 +35,10 @@ void USART::openDevice(std::string device) { clearInputBuffer(); } -void USART::closeDevice() { - if (file_desc > 0) { +void USART::closeDevice() +{ + if (file_desc > 0) + { int code = close(file_desc); if (code) throw USARTException("Fehler beim Schließen des Gerätes"); @@ -42,95 +46,59 @@ void USART::closeDevice() { } } -void USART::clearInputBuffer() { +void USART::clearInputBuffer() +{ int code = tcflush(file_desc, TCIFLUSH); if (code) throw USARTException("Fehler beim Leeren des Eingangspuffers"); } -void USART::clearOutputBuffer() { +void USART::clearOutputBuffer() +{ int code = tcflush(file_desc, TCOFLUSH); if (code) throw USARTException("Fehler beim Leeren des Ausgangspuffers"); } -void USART::flushOutputBuffer() { +void USART::flushOutputBuffer() +{ int code = tcdrain(file_desc); if (code) throw USARTException("Fehler beim Versenden des Ausgangspuffers"); } -void USART::writeByte(uint8_t b) { - int sent = write(file_desc, &b, 1); - if (sent != 1) { - std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl; - usleep(100000); - sent = write(file_desc, &b, 1); - if (sent != 1) - throw USARTException("Fehler beim Senden: writeByte()"); - } - -} - -void USART::writeInt(uint16_t d) { - int sent = write(file_desc, reinterpret_cast(&d), 2); - if (sent != 2) - throw USARTException("Fehler beim Senden: writeInt()"); -} - -void USART::writeU32(uint32_t w) { - int sent = write(file_desc, reinterpret_cast(&w), 4); - if (sent != 4) - throw USARTException("Fehler beim Senden: writeU32()"); -} - -void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) { +void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) +{ int n = read(file_desc, buffer + offset, len); if (n != len) throw USARTException( - std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); } -void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) { +void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) +{ int n = write(file_desc, buffer + offset, len); if (n != len) throw USARTException( - std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); } -uint8_t USART::readByte(void) { - char b; - auto start = std::chrono::steady_clock::now(); - auto end = start; - uint16_t elapsed = 0; - while (elapsed < timeout * 100) { - int code = read(file_desc, &b, 1); - if (code > 0) - return static_cast(b); - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - - throw TimeoutException("Verbindung unterbrochen.", timeout); -} - -uint16_t USART::readInt(void) { - return readByte() | readByte() << 8; -} - -uint32_t USART::getBaudrate() { +uint32_t USART::getBaudrate() +{ return baudrate; } -uint8_t USART::getTimeout() { +uint8_t USART::getTimeout() +{ return timeout; } -void USART::setBaudrate(uint32_t baudrate) { +void USART::setBaudrate(uint32_t baudrate) +{ this->baudrate = baudrate; } -void USART::setTimeout(uint8_t timeout) { +void USART::setTimeout(uint8_t timeout) +{ this->timeout = timeout; } diff --git a/control/src/drv/usart.h b/control/src/drv/usart.h index 81600d2..014297e 100644 --- a/control/src/drv/usart.h +++ b/control/src/drv/usart.h @@ -1,17 +1,12 @@ #ifndef USART_H #define USART_H -#include #include -#include -#include -#include #include -#include +#include #include -#include +#include #include "usartexception.h" -#include "timeoutexception.h" /*! C++ Wrapper class for termios usart library. */ @@ -23,7 +18,15 @@ public: * Methoden für die Verwaltung der Schnittstelle * *************************************************/ - ~USART(void); + /** + * Standard-Konstruktor + */ + explicit USART() = default; + + /** + * Destructor, ruft automatisch closeDevice() auf + */ + virtual ~USART(void); /** * Öffnet die USART Schnittstelle @@ -64,43 +67,11 @@ public: * Methoden für die Datenübertragung * *************************************/ - /** - * Sendet ein Byte über die USART Schnittstelle - * \param b das zu sendende Byte - * \throws USARTException - */ - void writeByte(uint8_t b); - - /** - * Sendet ein Integer über die USART Schnittstelle - * \param b das zu sendende Int - * \throws USARTException - */ - void writeInt(uint16_t d); - - /** - * Sendet ein uint32_t über die USART Schnittstelle - * \param b das zu sendende uint32_t - * \throws USARTException - */ - void writeU32(uint32_t d); - - /** - * Empfängt ein Byte über die USART Schnittstelle - * \throws USARTException - */ - uint8_t readByte(void); - - /** - * Empfängt ein Integer über die USART Schnittstelle - * \throws USARTException - */ - uint16_t readInt(void); - /** * Sends n bytes from the buffer over USART * \param buffer target buffer * \param offset in buffer (mostly 0) + * \param len count of bytes to send * \throws USARTException */ void transmit(uint8_t *buffer, uint16_t offset, uint8_t len); @@ -109,6 +80,7 @@ public: * Receives n bytes from USART and writes them into the buffer * \param buffer target buffer * \param offset in buffer (mostly 0) + * \param len count of bytes to receive * \throws USARTException */ void receive(uint8_t *buffer, uint16_t offset, uint8_t len); @@ -135,33 +107,23 @@ public: /** * Setzt die Baudrate - * Änderungen werden erst nach einem open() wirksam + * Änderungen werden erst nach openDevice() wirksam */ void setBaudrate(uint32_t baudrate); /** * Setzt den Timeout (in Dezisekunden) - * Änderungen werden erst nach einem open() wirksam + * Änderungen werden erst nach openDevice() wirksam */ void setTimeout(uint8_t timeout); /***************************************/ - constexpr static uint8_t CRC7_POLY = 0x91; - constexpr static uint8_t MAX_BLOCK_SIZE = 64; - constexpr static uint8_t BLOCK_END = 0x80; private: - int file_desc = -1; // Linux Dateideskriptor - uint32_t baudrate = 9600; // Standard-Baudrate, sollte mit setBaudrate() überschrieben werden! - int TEST = 0; - uint8_t timeout = 10; // in Dezisekunden - uint8_t block_buffer[MAX_BLOCK_SIZE + 3]; - - // debug statistics - uint32_t n_blocks_total = 0; - uint32_t n_blocks_failed = 0; + int file_desc = -1; //!< Linux Dateideskriptor + uint32_t baudrate = 9600; //!< Standard-Baudrate, sollte mit setBaudrate() überschrieben werden! + uint8_t timeout = 10; //!< in Dezisekunden }; - #endif // USART_H diff --git a/control/src/drv/usartexception.h b/control/src/drv/usartexception.h index a8ba5c7..68f5b0d 100644 --- a/control/src/drv/usartexception.h +++ b/control/src/drv/usartexception.h @@ -4,32 +4,43 @@ #include #include -// SOURCE: https://stackoverflow.com/a/8152888 - /*! Exception for USART problems, for instance buffer overflow. */ class USARTException: public std::exception { public: + /** + * Constructor + * @param message as c-string + */ explicit USARTException(const char* message) : msg(message) { } + /** + * Constructor + * @param message as c++-string + */ explicit USARTException(const std::string& message) : msg(message) { } - virtual ~USARTException() throw () - { - } + /** + * Standard-destructor + */ + virtual ~USARTException() = default; + /** + * Get failure description + * @return error message as c-string + */ virtual const char* what() const throw () { return msg.c_str(); } protected: - std::string msg; + std::string msg; //!< failure description }; #endif // USARTEXCEPTION_H diff --git a/docs/html/CMakeCCompilerId_8c_source.html b/docs/html/CMakeCCompilerId_8c_source.html new file mode 100644 index 0000000..a7c7bda --- /dev/null +++ b/docs/html/CMakeCCompilerId_8c_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/3.14.3/CompilerIdC/CMakeCCompilerId.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    CMakeCCompilerId.c
    +
    +
    +
    1 #ifdef __cplusplus
    2 # error "A C++ compiler has been selected for C."
    3 #endif
    4 
    5 #if defined(__18CXX)
    6 # define ID_VOID_MAIN
    7 #endif
    8 #if defined(__CLASSIC_C__)
    9 /* cv-qualifiers did not exist in K&R C */
    10 # define const
    11 # define volatile
    12 #endif
    13 
    14 
    15 /* Version number components: V=Version, R=Revision, P=Patch
    16  Version date components: YYYY=Year, MM=Month, DD=Day */
    17 
    18 #if defined(__INTEL_COMPILER) || defined(__ICC)
    19 # define COMPILER_ID "Intel"
    20 # if defined(_MSC_VER)
    21 # define SIMULATE_ID "MSVC"
    22 # endif
    23 /* __INTEL_COMPILER = VRP */
    24 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
    25 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
    26 # if defined(__INTEL_COMPILER_UPDATE)
    27 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
    28 # else
    29 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
    30 # endif
    31 # if defined(__INTEL_COMPILER_BUILD_DATE)
    32 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
    33 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
    34 # endif
    35 # if defined(_MSC_VER)
    36 /* _MSC_VER = VVRR */
    37 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    38 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    39 # endif
    40 
    41 #elif defined(__PATHCC__)
    42 # define COMPILER_ID "PathScale"
    43 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
    44 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
    45 # if defined(__PATHCC_PATCHLEVEL__)
    46 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
    47 # endif
    48 
    49 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
    50 # define COMPILER_ID "Embarcadero"
    51 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
    52 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
    53 # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
    54 
    55 #elif defined(__BORLANDC__)
    56 # define COMPILER_ID "Borland"
    57 /* __BORLANDC__ = 0xVRR */
    58 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
    59 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
    60 
    61 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
    62 # define COMPILER_ID "Watcom"
    63 /* __WATCOMC__ = VVRR */
    64 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
    65 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    66 # if (__WATCOMC__ % 10) > 0
    67 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    68 # endif
    69 
    70 #elif defined(__WATCOMC__)
    71 # define COMPILER_ID "OpenWatcom"
    72 /* __WATCOMC__ = VVRP + 1100 */
    73 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
    74 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    75 # if (__WATCOMC__ % 10) > 0
    76 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    77 # endif
    78 
    79 #elif defined(__SUNPRO_C)
    80 # define COMPILER_ID "SunPro"
    81 # if __SUNPRO_C >= 0x5100
    82 /* __SUNPRO_C = 0xVRRP */
    83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12)
    84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF)
    85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
    86 # else
    87 /* __SUNPRO_CC = 0xVRP */
    88 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8)
    89 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF)
    90 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
    91 # endif
    92 
    93 #elif defined(__HP_cc)
    94 # define COMPILER_ID "HP"
    95 /* __HP_cc = VVRRPP */
    96 # define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000)
    97 # define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100)
    98 # define COMPILER_VERSION_PATCH DEC(__HP_cc % 100)
    99 
    100 #elif defined(__DECC)
    101 # define COMPILER_ID "Compaq"
    102 /* __DECC_VER = VVRRTPPPP */
    103 # define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000)
    104 # define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100)
    105 # define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000)
    106 
    107 #elif defined(__IBMC__) && defined(__COMPILER_VER__)
    108 # define COMPILER_ID "zOS"
    109 # if defined(__ibmxl__)
    110 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    111 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    112 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    113 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    114 # else
    115 /* __IBMC__ = VRP */
    116 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    117 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    118 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    119 # endif
    120 
    121 
    122 #elif defined(__ibmxl__) || (defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800)
    123 # define COMPILER_ID "XL"
    124 # if defined(__ibmxl__)
    125 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    126 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    127 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    128 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    129 # else
    130 /* __IBMC__ = VRP */
    131 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    132 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    133 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    134 # endif
    135 
    136 
    137 #elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800
    138 # define COMPILER_ID "VisualAge"
    139 # if defined(__ibmxl__)
    140 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    141 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    142 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    143 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    144 # else
    145 /* __IBMC__ = VRP */
    146 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    147 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    148 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    149 # endif
    150 
    151 
    152 #elif defined(__PGI)
    153 # define COMPILER_ID "PGI"
    154 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
    155 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
    156 # if defined(__PGIC_PATCHLEVEL__)
    157 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
    158 # endif
    159 
    160 #elif defined(_CRAYC)
    161 # define COMPILER_ID "Cray"
    162 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
    163 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
    164 
    165 #elif defined(__TI_COMPILER_VERSION__)
    166 # define COMPILER_ID "TI"
    167 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
    168 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
    169 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
    170 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
    171 
    172 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
    173 # define COMPILER_ID "Fujitsu"
    174 
    175 #elif defined(__ghs__)
    176 # define COMPILER_ID "GHS"
    177 /* __GHS_VERSION_NUMBER = VVVVRP */
    178 # ifdef __GHS_VERSION_NUMBER
    179 # define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
    180 # define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
    181 # define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
    182 # endif
    183 
    184 #elif defined(__TINYC__)
    185 # define COMPILER_ID "TinyCC"
    186 
    187 #elif defined(__BCC__)
    188 # define COMPILER_ID "Bruce"
    189 
    190 #elif defined(__SCO_VERSION__)
    191 # define COMPILER_ID "SCO"
    192 
    193 #elif defined(__ARMCC_VERSION) && !defined(__clang__)
    194 # define COMPILER_ID "ARMCC"
    195 #if __ARMCC_VERSION >= 1000000
    196 /* __ARMCC_VERSION = VRRPPPP */
    197 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
    198 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
    199 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    200 #else
    201 /* __ARMCC_VERSION = VRPPPP */
    202 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
    203 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
    204 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    205 #endif
    206 
    207 
    208 #elif defined(__clang__) && defined(__apple_build_version__)
    209 # define COMPILER_ID "AppleClang"
    210 # if defined(_MSC_VER)
    211 # define SIMULATE_ID "MSVC"
    212 # endif
    213 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    214 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    215 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    216 # if defined(_MSC_VER)
    217 /* _MSC_VER = VVRR */
    218 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    219 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    220 # endif
    221 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
    222 
    223 #elif defined(__clang__)
    224 # define COMPILER_ID "Clang"
    225 # if defined(_MSC_VER)
    226 # define SIMULATE_ID "MSVC"
    227 # endif
    228 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    229 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    230 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    231 # if defined(_MSC_VER)
    232 /* _MSC_VER = VVRR */
    233 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    234 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    235 # endif
    236 
    237 #elif defined(__GNUC__)
    238 # define COMPILER_ID "GNU"
    239 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
    240 # if defined(__GNUC_MINOR__)
    241 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
    242 # endif
    243 # if defined(__GNUC_PATCHLEVEL__)
    244 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
    245 # endif
    246 
    247 #elif defined(_MSC_VER)
    248 # define COMPILER_ID "MSVC"
    249 /* _MSC_VER = VVRR */
    250 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
    251 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
    252 # if defined(_MSC_FULL_VER)
    253 # if _MSC_VER >= 1400
    254 /* _MSC_FULL_VER = VVRRPPPPP */
    255 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
    256 # else
    257 /* _MSC_FULL_VER = VVRRPPPP */
    258 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
    259 # endif
    260 # endif
    261 # if defined(_MSC_BUILD)
    262 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
    263 # endif
    264 
    265 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
    266 # define COMPILER_ID "ADSP"
    267 #if defined(__VISUALDSPVERSION__)
    268 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
    269 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
    270 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
    271 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
    272 #endif
    273 
    274 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    275 # define COMPILER_ID "IAR"
    276 # if defined(__VER__) && defined(__ICCARM__)
    277 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
    278 # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
    279 # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
    280 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    281 # elif defined(__VER__) && defined(__ICCAVR__)
    282 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
    283 # define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
    284 # define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
    285 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    286 # endif
    287 
    288 #elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC)
    289 # define COMPILER_ID "SDCC"
    290 # if defined(__SDCC_VERSION_MAJOR)
    291 # define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR)
    292 # define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR)
    293 # define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH)
    294 # else
    295 /* SDCC = VRP */
    296 # define COMPILER_VERSION_MAJOR DEC(SDCC/100)
    297 # define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10)
    298 # define COMPILER_VERSION_PATCH DEC(SDCC % 10)
    299 # endif
    300 
    301 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
    302 # define COMPILER_ID "MIPSpro"
    303 # if defined(_SGI_COMPILER_VERSION)
    304 /* _SGI_COMPILER_VERSION = VRP */
    305 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
    306 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
    307 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
    308 # else
    309 /* _COMPILER_VERSION = VRP */
    310 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
    311 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
    312 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
    313 # endif
    314 
    315 
    316 /* These compilers are either not known or too old to define an
    317  identification macro. Try to identify the platform and guess that
    318  it is the native compiler. */
    319 #elif defined(__hpux) || defined(__hpua)
    320 # define COMPILER_ID "HP"
    321 
    322 #else /* unknown compiler */
    323 # define COMPILER_ID ""
    324 #endif
    325 
    326 /* Construct the string literal in pieces to prevent the source from
    327  getting matched. Store it in a pointer rather than an array
    328  because some compilers will just produce instructions to fill the
    329  array rather than assigning a pointer to a static array. */
    330 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
    331 #ifdef SIMULATE_ID
    332 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
    333 #endif
    334 
    335 #ifdef __QNXNTO__
    336 char const* qnxnto = "INFO" ":" "qnxnto[]";
    337 #endif
    338 
    339 #if defined(__CRAYXE) || defined(__CRAYXC)
    340 char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
    341 #endif
    342 
    343 #define STRINGIFY_HELPER(X) #X
    344 #define STRINGIFY(X) STRINGIFY_HELPER(X)
    345 
    346 /* Identify known platforms by name. */
    347 #if defined(__linux) || defined(__linux__) || defined(linux)
    348 # define PLATFORM_ID "Linux"
    349 
    350 #elif defined(__CYGWIN__)
    351 # define PLATFORM_ID "Cygwin"
    352 
    353 #elif defined(__MINGW32__)
    354 # define PLATFORM_ID "MinGW"
    355 
    356 #elif defined(__APPLE__)
    357 # define PLATFORM_ID "Darwin"
    358 
    359 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
    360 # define PLATFORM_ID "Windows"
    361 
    362 #elif defined(__FreeBSD__) || defined(__FreeBSD)
    363 # define PLATFORM_ID "FreeBSD"
    364 
    365 #elif defined(__NetBSD__) || defined(__NetBSD)
    366 # define PLATFORM_ID "NetBSD"
    367 
    368 #elif defined(__OpenBSD__) || defined(__OPENBSD)
    369 # define PLATFORM_ID "OpenBSD"
    370 
    371 #elif defined(__sun) || defined(sun)
    372 # define PLATFORM_ID "SunOS"
    373 
    374 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
    375 # define PLATFORM_ID "AIX"
    376 
    377 #elif defined(__hpux) || defined(__hpux__)
    378 # define PLATFORM_ID "HP-UX"
    379 
    380 #elif defined(__HAIKU__)
    381 # define PLATFORM_ID "Haiku"
    382 
    383 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
    384 # define PLATFORM_ID "BeOS"
    385 
    386 #elif defined(__QNX__) || defined(__QNXNTO__)
    387 # define PLATFORM_ID "QNX"
    388 
    389 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
    390 # define PLATFORM_ID "Tru64"
    391 
    392 #elif defined(__riscos) || defined(__riscos__)
    393 # define PLATFORM_ID "RISCos"
    394 
    395 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
    396 # define PLATFORM_ID "SINIX"
    397 
    398 #elif defined(__UNIX_SV__)
    399 # define PLATFORM_ID "UNIX_SV"
    400 
    401 #elif defined(__bsdos__)
    402 # define PLATFORM_ID "BSDOS"
    403 
    404 #elif defined(_MPRAS) || defined(MPRAS)
    405 # define PLATFORM_ID "MP-RAS"
    406 
    407 #elif defined(__osf) || defined(__osf__)
    408 # define PLATFORM_ID "OSF1"
    409 
    410 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
    411 # define PLATFORM_ID "SCO_SV"
    412 
    413 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
    414 # define PLATFORM_ID "ULTRIX"
    415 
    416 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
    417 # define PLATFORM_ID "Xenix"
    418 
    419 #elif defined(__WATCOMC__)
    420 # if defined(__LINUX__)
    421 # define PLATFORM_ID "Linux"
    422 
    423 # elif defined(__DOS__)
    424 # define PLATFORM_ID "DOS"
    425 
    426 # elif defined(__OS2__)
    427 # define PLATFORM_ID "OS2"
    428 
    429 # elif defined(__WINDOWS__)
    430 # define PLATFORM_ID "Windows3x"
    431 
    432 # else /* unknown platform */
    433 # define PLATFORM_ID
    434 # endif
    435 
    436 #elif defined(__INTEGRITY)
    437 # if defined(INT_178B)
    438 # define PLATFORM_ID "Integrity178"
    439 
    440 # else /* regular Integrity */
    441 # define PLATFORM_ID "Integrity"
    442 # endif
    443 
    444 #else /* unknown platform */
    445 # define PLATFORM_ID
    446 
    447 #endif
    448 
    449 /* For windows compilers MSVC and Intel we can determine
    450  the architecture of the compiler being used. This is because
    451  the compilers do not have flags that can change the architecture,
    452  but rather depend on which compiler is being used
    453 */
    454 #if defined(_WIN32) && defined(_MSC_VER)
    455 # if defined(_M_IA64)
    456 # define ARCHITECTURE_ID "IA64"
    457 
    458 # elif defined(_M_X64) || defined(_M_AMD64)
    459 # define ARCHITECTURE_ID "x64"
    460 
    461 # elif defined(_M_IX86)
    462 # define ARCHITECTURE_ID "X86"
    463 
    464 # elif defined(_M_ARM64)
    465 # define ARCHITECTURE_ID "ARM64"
    466 
    467 # elif defined(_M_ARM)
    468 # if _M_ARM == 4
    469 # define ARCHITECTURE_ID "ARMV4I"
    470 # elif _M_ARM == 5
    471 # define ARCHITECTURE_ID "ARMV5I"
    472 # else
    473 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
    474 # endif
    475 
    476 # elif defined(_M_MIPS)
    477 # define ARCHITECTURE_ID "MIPS"
    478 
    479 # elif defined(_M_SH)
    480 # define ARCHITECTURE_ID "SHx"
    481 
    482 # else /* unknown architecture */
    483 # define ARCHITECTURE_ID ""
    484 # endif
    485 
    486 #elif defined(__WATCOMC__)
    487 # if defined(_M_I86)
    488 # define ARCHITECTURE_ID "I86"
    489 
    490 # elif defined(_M_IX86)
    491 # define ARCHITECTURE_ID "X86"
    492 
    493 # else /* unknown architecture */
    494 # define ARCHITECTURE_ID ""
    495 # endif
    496 
    497 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    498 # if defined(__ICCARM__)
    499 # define ARCHITECTURE_ID "ARM"
    500 
    501 # elif defined(__ICCAVR__)
    502 # define ARCHITECTURE_ID "AVR"
    503 
    504 # else /* unknown architecture */
    505 # define ARCHITECTURE_ID ""
    506 # endif
    507 
    508 #elif defined(__ghs__)
    509 # if defined(__PPC64__)
    510 # define ARCHITECTURE_ID "PPC64"
    511 
    512 # elif defined(__ppc__)
    513 # define ARCHITECTURE_ID "PPC"
    514 
    515 # elif defined(__ARM__)
    516 # define ARCHITECTURE_ID "ARM"
    517 
    518 # elif defined(__x86_64__)
    519 # define ARCHITECTURE_ID "x64"
    520 
    521 # elif defined(__i386__)
    522 # define ARCHITECTURE_ID "X86"
    523 
    524 # else /* unknown architecture */
    525 # define ARCHITECTURE_ID ""
    526 # endif
    527 #else
    528 # define ARCHITECTURE_ID
    529 #endif
    530 
    531 /* Convert integer to decimal digit literals. */
    532 #define DEC(n) \
    533  ('0' + (((n) / 10000000)%10)), \
    534  ('0' + (((n) / 1000000)%10)), \
    535  ('0' + (((n) / 100000)%10)), \
    536  ('0' + (((n) / 10000)%10)), \
    537  ('0' + (((n) / 1000)%10)), \
    538  ('0' + (((n) / 100)%10)), \
    539  ('0' + (((n) / 10)%10)), \
    540  ('0' + ((n) % 10))
    541 
    542 /* Convert integer to hex digit literals. */
    543 #define HEX(n) \
    544  ('0' + ((n)>>28 & 0xF)), \
    545  ('0' + ((n)>>24 & 0xF)), \
    546  ('0' + ((n)>>20 & 0xF)), \
    547  ('0' + ((n)>>16 & 0xF)), \
    548  ('0' + ((n)>>12 & 0xF)), \
    549  ('0' + ((n)>>8 & 0xF)), \
    550  ('0' + ((n)>>4 & 0xF)), \
    551  ('0' + ((n) & 0xF))
    552 
    553 /* Construct a string literal encoding the version number components. */
    554 #ifdef COMPILER_VERSION_MAJOR
    555 char const info_version[] =
    556 {
    557  'I', 'N', 'F', 'O', ':',
    558  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
    559  COMPILER_VERSION_MAJOR,
    560 # ifdef COMPILER_VERSION_MINOR
    561  '.', COMPILER_VERSION_MINOR,
    562 # ifdef COMPILER_VERSION_PATCH
    563  '.', COMPILER_VERSION_PATCH,
    564 # ifdef COMPILER_VERSION_TWEAK
    565  '.', COMPILER_VERSION_TWEAK,
    566 # endif
    567 # endif
    568 # endif
    569  ']','\0'
    570 };
    571 #endif
    572 
    573 /* Construct a string literal encoding the internal version number. */
    574 #ifdef COMPILER_VERSION_INTERNAL
    575 char const info_version_internal[] =
    576 {
    577  'I', 'N', 'F', 'O', ':',
    578  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
    579  'i','n','t','e','r','n','a','l','[',
    580  COMPILER_VERSION_INTERNAL,']','\0'
    581 };
    582 #endif
    583 
    584 /* Construct a string literal encoding the version number components. */
    585 #ifdef SIMULATE_VERSION_MAJOR
    586 char const info_simulate_version[] =
    587 {
    588  'I', 'N', 'F', 'O', ':',
    589  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
    590  SIMULATE_VERSION_MAJOR,
    591 # ifdef SIMULATE_VERSION_MINOR
    592  '.', SIMULATE_VERSION_MINOR,
    593 # ifdef SIMULATE_VERSION_PATCH
    594  '.', SIMULATE_VERSION_PATCH,
    595 # ifdef SIMULATE_VERSION_TWEAK
    596  '.', SIMULATE_VERSION_TWEAK,
    597 # endif
    598 # endif
    599 # endif
    600  ']','\0'
    601 };
    602 #endif
    603 
    604 /* Construct the string literal in pieces to prevent the source from
    605  getting matched. Store it in a pointer rather than an array
    606  because some compilers will just produce instructions to fill the
    607  array rather than assigning a pointer to a static array. */
    608 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
    609 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
    610 
    611 
    612 
    613 
    614 #if !defined(__STDC__)
    615 # if (defined(_MSC_VER) && !defined(__clang__)) \
    616  || (defined(__ibmxl__) || defined(__IBMC__))
    617 # define C_DIALECT "90"
    618 # else
    619 # define C_DIALECT
    620 # endif
    621 #elif __STDC_VERSION__ >= 201000L
    622 # define C_DIALECT "11"
    623 #elif __STDC_VERSION__ >= 199901L
    624 # define C_DIALECT "99"
    625 #else
    626 # define C_DIALECT "90"
    627 #endif
    628 const char* info_language_dialect_default =
    629  "INFO" ":" "dialect_default[" C_DIALECT "]";
    630 
    631 /*--------------------------------------------------------------------------*/
    632 
    633 #ifdef ID_VOID_MAIN
    634 void main() {}
    635 #else
    636 # if defined(__CLASSIC_C__)
    637 int main(argc, argv) int argc;
    638 char *argv[];
    639 # else
    640 int main(int argc, char* argv[])
    641 # endif
    642 {
    643  int require = 0;
    644  require += info_compiler[argc];
    645  require += info_platform[argc];
    646  require += info_arch[argc];
    647 #ifdef COMPILER_VERSION_MAJOR
    648  require += info_version[argc];
    649 #endif
    650 #ifdef COMPILER_VERSION_INTERNAL
    651  require += info_version_internal[argc];
    652 #endif
    653 #ifdef SIMULATE_ID
    654  require += info_simulate[argc];
    655 #endif
    656 #ifdef SIMULATE_VERSION_MAJOR
    657  require += info_simulate_version[argc];
    658 #endif
    659 #if defined(__CRAYXE) || defined(__CRAYXC)
    660  require += info_cray[argc];
    661 #endif
    662  require += info_language_dialect_default[argc];
    663  (void)argv;
    664  return require;
    665 }
    666 #endif
    + + + + diff --git a/docs/html/CMakeCXXCompilerId_8cpp_source.html b/docs/html/CMakeCXXCompilerId_8cpp_source.html new file mode 100644 index 0000000..04f58bc --- /dev/null +++ b/docs/html/CMakeCXXCompilerId_8cpp_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/3.14.3/CompilerIdCXX/CMakeCXXCompilerId.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    CMakeCXXCompilerId.cpp
    +
    +
    +
    1 /* This source file must have a .cpp extension so that all C++ compilers
    2  recognize the extension without flags. Borland does not know .cxx for
    3  example. */
    4 #ifndef __cplusplus
    5 # error "A C compiler has been selected for C++."
    6 #endif
    7 
    8 
    9 /* Version number components: V=Version, R=Revision, P=Patch
    10  Version date components: YYYY=Year, MM=Month, DD=Day */
    11 
    12 #if defined(__COMO__)
    13 # define COMPILER_ID "Comeau"
    14 /* __COMO_VERSION__ = VRR */
    15 # define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
    16 # define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
    17 
    18 #elif defined(__INTEL_COMPILER) || defined(__ICC)
    19 # define COMPILER_ID "Intel"
    20 # if defined(_MSC_VER)
    21 # define SIMULATE_ID "MSVC"
    22 # endif
    23 /* __INTEL_COMPILER = VRP */
    24 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
    25 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
    26 # if defined(__INTEL_COMPILER_UPDATE)
    27 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
    28 # else
    29 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
    30 # endif
    31 # if defined(__INTEL_COMPILER_BUILD_DATE)
    32 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
    33 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
    34 # endif
    35 # if defined(_MSC_VER)
    36 /* _MSC_VER = VVRR */
    37 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    38 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    39 # endif
    40 
    41 #elif defined(__PATHCC__)
    42 # define COMPILER_ID "PathScale"
    43 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
    44 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
    45 # if defined(__PATHCC_PATCHLEVEL__)
    46 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
    47 # endif
    48 
    49 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
    50 # define COMPILER_ID "Embarcadero"
    51 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
    52 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
    53 # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
    54 
    55 #elif defined(__BORLANDC__)
    56 # define COMPILER_ID "Borland"
    57 /* __BORLANDC__ = 0xVRR */
    58 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
    59 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
    60 
    61 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
    62 # define COMPILER_ID "Watcom"
    63 /* __WATCOMC__ = VVRR */
    64 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
    65 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    66 # if (__WATCOMC__ % 10) > 0
    67 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    68 # endif
    69 
    70 #elif defined(__WATCOMC__)
    71 # define COMPILER_ID "OpenWatcom"
    72 /* __WATCOMC__ = VVRP + 1100 */
    73 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
    74 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    75 # if (__WATCOMC__ % 10) > 0
    76 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    77 # endif
    78 
    79 #elif defined(__SUNPRO_CC)
    80 # define COMPILER_ID "SunPro"
    81 # if __SUNPRO_CC >= 0x5100
    82 /* __SUNPRO_CC = 0xVRRP */
    83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
    84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
    85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
    86 # else
    87 /* __SUNPRO_CC = 0xVRP */
    88 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
    89 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
    90 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
    91 # endif
    92 
    93 #elif defined(__HP_aCC)
    94 # define COMPILER_ID "HP"
    95 /* __HP_aCC = VVRRPP */
    96 # define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
    97 # define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
    98 # define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
    99 
    100 #elif defined(__DECCXX)
    101 # define COMPILER_ID "Compaq"
    102 /* __DECCXX_VER = VVRRTPPPP */
    103 # define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
    104 # define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100)
    105 # define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
    106 
    107 #elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
    108 # define COMPILER_ID "zOS"
    109 # if defined(__ibmxl__)
    110 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    111 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    112 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    113 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    114 # else
    115 /* __IBMCPP__ = VRP */
    116 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    117 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    118 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    119 # endif
    120 
    121 
    122 #elif defined(__ibmxl__) || (defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800)
    123 # define COMPILER_ID "XL"
    124 # if defined(__ibmxl__)
    125 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    126 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    127 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    128 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    129 # else
    130 /* __IBMCPP__ = VRP */
    131 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    132 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    133 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    134 # endif
    135 
    136 
    137 #elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
    138 # define COMPILER_ID "VisualAge"
    139 # if defined(__ibmxl__)
    140 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    141 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    142 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    143 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    144 # else
    145 /* __IBMCPP__ = VRP */
    146 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    147 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    148 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    149 # endif
    150 
    151 
    152 #elif defined(__PGI)
    153 # define COMPILER_ID "PGI"
    154 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
    155 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
    156 # if defined(__PGIC_PATCHLEVEL__)
    157 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
    158 # endif
    159 
    160 #elif defined(_CRAYC)
    161 # define COMPILER_ID "Cray"
    162 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
    163 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
    164 
    165 #elif defined(__TI_COMPILER_VERSION__)
    166 # define COMPILER_ID "TI"
    167 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
    168 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
    169 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
    170 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
    171 
    172 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
    173 # define COMPILER_ID "Fujitsu"
    174 
    175 #elif defined(__ghs__)
    176 # define COMPILER_ID "GHS"
    177 /* __GHS_VERSION_NUMBER = VVVVRP */
    178 # ifdef __GHS_VERSION_NUMBER
    179 # define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
    180 # define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
    181 # define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
    182 # endif
    183 
    184 #elif defined(__SCO_VERSION__)
    185 # define COMPILER_ID "SCO"
    186 
    187 #elif defined(__ARMCC_VERSION) && !defined(__clang__)
    188 # define COMPILER_ID "ARMCC"
    189 #if __ARMCC_VERSION >= 1000000
    190 /* __ARMCC_VERSION = VRRPPPP */
    191 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
    192 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
    193 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    194 #else
    195 /* __ARMCC_VERSION = VRPPPP */
    196 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
    197 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
    198 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    199 #endif
    200 
    201 
    202 #elif defined(__clang__) && defined(__apple_build_version__)
    203 # define COMPILER_ID "AppleClang"
    204 # if defined(_MSC_VER)
    205 # define SIMULATE_ID "MSVC"
    206 # endif
    207 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    208 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    209 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    210 # if defined(_MSC_VER)
    211 /* _MSC_VER = VVRR */
    212 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    213 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    214 # endif
    215 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
    216 
    217 #elif defined(__clang__)
    218 # define COMPILER_ID "Clang"
    219 # if defined(_MSC_VER)
    220 # define SIMULATE_ID "MSVC"
    221 # endif
    222 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    223 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    224 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    225 # if defined(_MSC_VER)
    226 /* _MSC_VER = VVRR */
    227 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    228 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    229 # endif
    230 
    231 #elif defined(__GNUC__) || defined(__GNUG__)
    232 # define COMPILER_ID "GNU"
    233 # if defined(__GNUC__)
    234 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
    235 # else
    236 # define COMPILER_VERSION_MAJOR DEC(__GNUG__)
    237 # endif
    238 # if defined(__GNUC_MINOR__)
    239 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
    240 # endif
    241 # if defined(__GNUC_PATCHLEVEL__)
    242 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
    243 # endif
    244 
    245 #elif defined(_MSC_VER)
    246 # define COMPILER_ID "MSVC"
    247 /* _MSC_VER = VVRR */
    248 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
    249 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
    250 # if defined(_MSC_FULL_VER)
    251 # if _MSC_VER >= 1400
    252 /* _MSC_FULL_VER = VVRRPPPPP */
    253 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
    254 # else
    255 /* _MSC_FULL_VER = VVRRPPPP */
    256 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
    257 # endif
    258 # endif
    259 # if defined(_MSC_BUILD)
    260 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
    261 # endif
    262 
    263 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
    264 # define COMPILER_ID "ADSP"
    265 #if defined(__VISUALDSPVERSION__)
    266 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
    267 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
    268 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
    269 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
    270 #endif
    271 
    272 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    273 # define COMPILER_ID "IAR"
    274 # if defined(__VER__) && defined(__ICCARM__)
    275 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
    276 # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
    277 # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
    278 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    279 # elif defined(__VER__) && defined(__ICCAVR__)
    280 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
    281 # define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
    282 # define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
    283 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    284 # endif
    285 
    286 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
    287 # define COMPILER_ID "MIPSpro"
    288 # if defined(_SGI_COMPILER_VERSION)
    289 /* _SGI_COMPILER_VERSION = VRP */
    290 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
    291 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
    292 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
    293 # else
    294 /* _COMPILER_VERSION = VRP */
    295 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
    296 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
    297 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
    298 # endif
    299 
    300 
    301 /* These compilers are either not known or too old to define an
    302  identification macro. Try to identify the platform and guess that
    303  it is the native compiler. */
    304 #elif defined(__hpux) || defined(__hpua)
    305 # define COMPILER_ID "HP"
    306 
    307 #else /* unknown compiler */
    308 # define COMPILER_ID ""
    309 #endif
    310 
    311 /* Construct the string literal in pieces to prevent the source from
    312  getting matched. Store it in a pointer rather than an array
    313  because some compilers will just produce instructions to fill the
    314  array rather than assigning a pointer to a static array. */
    315 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
    316 #ifdef SIMULATE_ID
    317 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
    318 #endif
    319 
    320 #ifdef __QNXNTO__
    321 char const* qnxnto = "INFO" ":" "qnxnto[]";
    322 #endif
    323 
    324 #if defined(__CRAYXE) || defined(__CRAYXC)
    325 char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
    326 #endif
    327 
    328 #define STRINGIFY_HELPER(X) #X
    329 #define STRINGIFY(X) STRINGIFY_HELPER(X)
    330 
    331 /* Identify known platforms by name. */
    332 #if defined(__linux) || defined(__linux__) || defined(linux)
    333 # define PLATFORM_ID "Linux"
    334 
    335 #elif defined(__CYGWIN__)
    336 # define PLATFORM_ID "Cygwin"
    337 
    338 #elif defined(__MINGW32__)
    339 # define PLATFORM_ID "MinGW"
    340 
    341 #elif defined(__APPLE__)
    342 # define PLATFORM_ID "Darwin"
    343 
    344 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
    345 # define PLATFORM_ID "Windows"
    346 
    347 #elif defined(__FreeBSD__) || defined(__FreeBSD)
    348 # define PLATFORM_ID "FreeBSD"
    349 
    350 #elif defined(__NetBSD__) || defined(__NetBSD)
    351 # define PLATFORM_ID "NetBSD"
    352 
    353 #elif defined(__OpenBSD__) || defined(__OPENBSD)
    354 # define PLATFORM_ID "OpenBSD"
    355 
    356 #elif defined(__sun) || defined(sun)
    357 # define PLATFORM_ID "SunOS"
    358 
    359 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
    360 # define PLATFORM_ID "AIX"
    361 
    362 #elif defined(__hpux) || defined(__hpux__)
    363 # define PLATFORM_ID "HP-UX"
    364 
    365 #elif defined(__HAIKU__)
    366 # define PLATFORM_ID "Haiku"
    367 
    368 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
    369 # define PLATFORM_ID "BeOS"
    370 
    371 #elif defined(__QNX__) || defined(__QNXNTO__)
    372 # define PLATFORM_ID "QNX"
    373 
    374 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
    375 # define PLATFORM_ID "Tru64"
    376 
    377 #elif defined(__riscos) || defined(__riscos__)
    378 # define PLATFORM_ID "RISCos"
    379 
    380 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
    381 # define PLATFORM_ID "SINIX"
    382 
    383 #elif defined(__UNIX_SV__)
    384 # define PLATFORM_ID "UNIX_SV"
    385 
    386 #elif defined(__bsdos__)
    387 # define PLATFORM_ID "BSDOS"
    388 
    389 #elif defined(_MPRAS) || defined(MPRAS)
    390 # define PLATFORM_ID "MP-RAS"
    391 
    392 #elif defined(__osf) || defined(__osf__)
    393 # define PLATFORM_ID "OSF1"
    394 
    395 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
    396 # define PLATFORM_ID "SCO_SV"
    397 
    398 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
    399 # define PLATFORM_ID "ULTRIX"
    400 
    401 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
    402 # define PLATFORM_ID "Xenix"
    403 
    404 #elif defined(__WATCOMC__)
    405 # if defined(__LINUX__)
    406 # define PLATFORM_ID "Linux"
    407 
    408 # elif defined(__DOS__)
    409 # define PLATFORM_ID "DOS"
    410 
    411 # elif defined(__OS2__)
    412 # define PLATFORM_ID "OS2"
    413 
    414 # elif defined(__WINDOWS__)
    415 # define PLATFORM_ID "Windows3x"
    416 
    417 # else /* unknown platform */
    418 # define PLATFORM_ID
    419 # endif
    420 
    421 #elif defined(__INTEGRITY)
    422 # if defined(INT_178B)
    423 # define PLATFORM_ID "Integrity178"
    424 
    425 # else /* regular Integrity */
    426 # define PLATFORM_ID "Integrity"
    427 # endif
    428 
    429 #else /* unknown platform */
    430 # define PLATFORM_ID
    431 
    432 #endif
    433 
    434 /* For windows compilers MSVC and Intel we can determine
    435  the architecture of the compiler being used. This is because
    436  the compilers do not have flags that can change the architecture,
    437  but rather depend on which compiler is being used
    438 */
    439 #if defined(_WIN32) && defined(_MSC_VER)
    440 # if defined(_M_IA64)
    441 # define ARCHITECTURE_ID "IA64"
    442 
    443 # elif defined(_M_X64) || defined(_M_AMD64)
    444 # define ARCHITECTURE_ID "x64"
    445 
    446 # elif defined(_M_IX86)
    447 # define ARCHITECTURE_ID "X86"
    448 
    449 # elif defined(_M_ARM64)
    450 # define ARCHITECTURE_ID "ARM64"
    451 
    452 # elif defined(_M_ARM)
    453 # if _M_ARM == 4
    454 # define ARCHITECTURE_ID "ARMV4I"
    455 # elif _M_ARM == 5
    456 # define ARCHITECTURE_ID "ARMV5I"
    457 # else
    458 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
    459 # endif
    460 
    461 # elif defined(_M_MIPS)
    462 # define ARCHITECTURE_ID "MIPS"
    463 
    464 # elif defined(_M_SH)
    465 # define ARCHITECTURE_ID "SHx"
    466 
    467 # else /* unknown architecture */
    468 # define ARCHITECTURE_ID ""
    469 # endif
    470 
    471 #elif defined(__WATCOMC__)
    472 # if defined(_M_I86)
    473 # define ARCHITECTURE_ID "I86"
    474 
    475 # elif defined(_M_IX86)
    476 # define ARCHITECTURE_ID "X86"
    477 
    478 # else /* unknown architecture */
    479 # define ARCHITECTURE_ID ""
    480 # endif
    481 
    482 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    483 # if defined(__ICCARM__)
    484 # define ARCHITECTURE_ID "ARM"
    485 
    486 # elif defined(__ICCAVR__)
    487 # define ARCHITECTURE_ID "AVR"
    488 
    489 # else /* unknown architecture */
    490 # define ARCHITECTURE_ID ""
    491 # endif
    492 
    493 #elif defined(__ghs__)
    494 # if defined(__PPC64__)
    495 # define ARCHITECTURE_ID "PPC64"
    496 
    497 # elif defined(__ppc__)
    498 # define ARCHITECTURE_ID "PPC"
    499 
    500 # elif defined(__ARM__)
    501 # define ARCHITECTURE_ID "ARM"
    502 
    503 # elif defined(__x86_64__)
    504 # define ARCHITECTURE_ID "x64"
    505 
    506 # elif defined(__i386__)
    507 # define ARCHITECTURE_ID "X86"
    508 
    509 # else /* unknown architecture */
    510 # define ARCHITECTURE_ID ""
    511 # endif
    512 #else
    513 # define ARCHITECTURE_ID
    514 #endif
    515 
    516 /* Convert integer to decimal digit literals. */
    517 #define DEC(n) \
    518  ('0' + (((n) / 10000000)%10)), \
    519  ('0' + (((n) / 1000000)%10)), \
    520  ('0' + (((n) / 100000)%10)), \
    521  ('0' + (((n) / 10000)%10)), \
    522  ('0' + (((n) / 1000)%10)), \
    523  ('0' + (((n) / 100)%10)), \
    524  ('0' + (((n) / 10)%10)), \
    525  ('0' + ((n) % 10))
    526 
    527 /* Convert integer to hex digit literals. */
    528 #define HEX(n) \
    529  ('0' + ((n)>>28 & 0xF)), \
    530  ('0' + ((n)>>24 & 0xF)), \
    531  ('0' + ((n)>>20 & 0xF)), \
    532  ('0' + ((n)>>16 & 0xF)), \
    533  ('0' + ((n)>>12 & 0xF)), \
    534  ('0' + ((n)>>8 & 0xF)), \
    535  ('0' + ((n)>>4 & 0xF)), \
    536  ('0' + ((n) & 0xF))
    537 
    538 /* Construct a string literal encoding the version number components. */
    539 #ifdef COMPILER_VERSION_MAJOR
    540 char const info_version[] =
    541 {
    542  'I', 'N', 'F', 'O', ':',
    543  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
    544  COMPILER_VERSION_MAJOR,
    545 # ifdef COMPILER_VERSION_MINOR
    546  '.', COMPILER_VERSION_MINOR,
    547 # ifdef COMPILER_VERSION_PATCH
    548  '.', COMPILER_VERSION_PATCH,
    549 # ifdef COMPILER_VERSION_TWEAK
    550  '.', COMPILER_VERSION_TWEAK,
    551 # endif
    552 # endif
    553 # endif
    554  ']','\0'
    555 };
    556 #endif
    557 
    558 /* Construct a string literal encoding the internal version number. */
    559 #ifdef COMPILER_VERSION_INTERNAL
    560 char const info_version_internal[] =
    561 {
    562  'I', 'N', 'F', 'O', ':',
    563  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
    564  'i','n','t','e','r','n','a','l','[',
    565  COMPILER_VERSION_INTERNAL,']','\0'
    566 };
    567 #endif
    568 
    569 /* Construct a string literal encoding the version number components. */
    570 #ifdef SIMULATE_VERSION_MAJOR
    571 char const info_simulate_version[] =
    572 {
    573  'I', 'N', 'F', 'O', ':',
    574  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
    575  SIMULATE_VERSION_MAJOR,
    576 # ifdef SIMULATE_VERSION_MINOR
    577  '.', SIMULATE_VERSION_MINOR,
    578 # ifdef SIMULATE_VERSION_PATCH
    579  '.', SIMULATE_VERSION_PATCH,
    580 # ifdef SIMULATE_VERSION_TWEAK
    581  '.', SIMULATE_VERSION_TWEAK,
    582 # endif
    583 # endif
    584 # endif
    585  ']','\0'
    586 };
    587 #endif
    588 
    589 /* Construct the string literal in pieces to prevent the source from
    590  getting matched. Store it in a pointer rather than an array
    591  because some compilers will just produce instructions to fill the
    592  array rather than assigning a pointer to a static array. */
    593 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
    594 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
    595 
    596 
    597 
    598 
    599 #if defined(_MSC_VER) && defined(_MSVC_LANG)
    600 #define CXX_STD _MSVC_LANG
    601 #else
    602 #define CXX_STD __cplusplus
    603 #endif
    604 
    605 const char* info_language_dialect_default = "INFO" ":" "dialect_default["
    606 #if CXX_STD > 201703L
    607  "20"
    608 #elif CXX_STD >= 201703L
    609  "17"
    610 #elif CXX_STD >= 201402L
    611  "14"
    612 #elif CXX_STD >= 201103L
    613  "11"
    614 #else
    615  "98"
    616 #endif
    617  "]";
    618 
    619 /*--------------------------------------------------------------------------*/
    620 
    621 int main(int argc, char* argv[])
    622 {
    623  int require = 0;
    624  require += info_compiler[argc];
    625  require += info_platform[argc];
    626 #ifdef COMPILER_VERSION_MAJOR
    627  require += info_version[argc];
    628 #endif
    629 #ifdef COMPILER_VERSION_INTERNAL
    630  require += info_version_internal[argc];
    631 #endif
    632 #ifdef SIMULATE_ID
    633  require += info_simulate[argc];
    634 #endif
    635 #ifdef SIMULATE_VERSION_MAJOR
    636  require += info_simulate_version[argc];
    637 #endif
    638 #if defined(__CRAYXE) || defined(__CRAYXC)
    639  require += info_cray[argc];
    640 #endif
    641  require += info_language_dialect_default[argc];
    642  (void)argv;
    643  return require;
    644 }
    + + + + diff --git a/docs/html/annotated.html b/docs/html/annotated.html new file mode 100644 index 0000000..c4c82a7 --- /dev/null +++ b/docs/html/annotated.html @@ -0,0 +1,93 @@ + + + + + + + +B15F: Class List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Class List
    +
    +
    +
    Here are the classes, structs, unions and interfaces with brief descriptions:
    +
    + + + + diff --git a/docs/html/b15f_8cpp_source.html b/docs/html/b15f_8cpp_source.html new file mode 100644 index 0000000..46c3211 --- /dev/null +++ b/docs/html/b15f_8cpp_source.html @@ -0,0 +1,118 @@ + + + + + + + +B15F: drv/b15f.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    b15f.cpp
    +
    +
    +
    1 #include "b15f.h"
    2 
    3 B15F* B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos)
    16  device.pop_back();
    17 
    18  if(device.length() == 0)
    19  abort("Adapter nicht gefunden");
    20 
    21  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    22 
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31 
    32  std::cout << PRE << "Teste Verbindung... " << std::flush;
    33  uint8_t tries = 3;
    34  while(tries--)
    35  {
    36  // verwerfe Daten, die µC noch hat
    37  //discard();
    38 
    39  if(!testConnection())
    40  continue;
    41 
    42  if(!testIntConv())
    43  continue;
    44 
    45  break;
    46  }
    47  if(tries == 0)
    48  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    49  std::cout << "OK" << std::endl;
    50 
    51 
    52  // Gib board info aus
    53  std::vector<std::string> info = getBoardInfo();
    54  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while(tries--)
    61  {
    63  discard();
    64 
    65  if(testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  usart.clearOutputBuffer();
    77  for(uint8_t i = 0; i < 16; i++)
    78  {
    79  usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input)
    80  delay_ms(4);
    81  }
    82  usart.clearInputBuffer();
    83  }
    84  catch(std::exception& ex)
    85  {
    86  abort(ex);
    87  }
    88 }
    89 
    91 {
    92  // erzeuge zufälliges Byte
    93  srand(time(NULL));
    94  uint8_t dummy = rand() % 256;
    95 
    96  usart.writeByte(RQ_TEST);
    97  usart.writeByte(dummy);
    98 
    99  uint8_t aw = usart.readByte();
    100  uint8_t mirror = usart.readByte();
    101 
    102  return aw == MSG_OK && mirror == dummy;
    103 }
    104 
    106 {
    107  srand(time(NULL));
    108  uint16_t dummy = rand() % (0xFFFF / 3);
    109 
    110  usart.writeByte(RQ_INT);
    111  usart.writeInt(dummy);
    112 
    113  uint16_t aw = usart.readInt();
    114  return aw == dummy * 3;
    115 }
    116 
    117 
    118 std::vector<std::string> B15F::getBoardInfo(void)
    119 {
    120  std::vector<std::string> info;
    121 
    122  usart.writeByte(RQ_INFO);
    123 
    124  uint8_t n = usart.readByte();
    125  while(n--)
    126  {
    127  uint8_t len = usart.readByte();
    128  std::string str;
    129 
    130  while(len--)
    131  {
    132  str += static_cast<char>(usart.readByte());
    133  }
    134 
    135  info.push_back(str);
    136  }
    137 
    138  uint8_t aw = usart.readByte();
    139  if(aw != MSG_OK)
    140  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    141 
    142  return info;
    143 }
    144 
    146 {
    147  usart.writeByte(RQ_ST);
    148 
    149  uint8_t aw = usart.readByte();
    150  return aw == MSG_OK;
    151 }
    152 
    153 bool B15F::digitalWrite0(uint8_t port)
    154 {
    155  usart.writeByte(RQ_BA0);
    156  usart.writeByte(port);
    157 
    158  uint8_t aw = usart.readByte();
    159  delay_us(10);
    160  return aw == MSG_OK;
    161 }
    162 
    163 bool B15F::digitalWrite1(uint8_t port)
    164 {
    165  usart.writeByte(RQ_BA1);
    166  usart.writeByte(port);
    167 
    168  uint8_t aw = usart.readByte();
    169  delay_us(10);
    170  return aw == MSG_OK;
    171 }
    172 
    174 {
    175  usart.clearInputBuffer();
    176  usart.writeByte(RQ_BE0);
    177  uint8_t byte = usart.readByte();
    178  delay_us(10);
    179  return byte;
    180 }
    181 
    183 {
    184  usart.clearInputBuffer();
    185  usart.writeByte(RQ_BE1);
    186  uint8_t byte = usart.readByte();
    187  delay_us(10);
    188  return byte;
    189 }
    190 
    192 {
    193  usart.clearInputBuffer();
    194  usart.writeByte(RQ_DSW);
    195  uint8_t byte = usart.readByte();
    196  delay_us(10);
    197  return byte;
    198 }
    199 
    200 bool B15F::analogWrite0(uint16_t value)
    201 {
    202  usart.writeByte(RQ_AA0);
    203  usart.writeInt(value);
    204 
    205  uint8_t aw = usart.readByte();
    206  delay_us(10);
    207  return aw == MSG_OK;
    208 }
    209 
    210 bool B15F::analogWrite1(uint16_t value)
    211 {
    212  usart.writeByte(RQ_AA1);
    213  usart.writeInt(value);
    214 
    215  uint8_t aw = usart.readByte();
    216  delay_us(10);
    217  return aw == MSG_OK;
    218 }
    219 
    220 uint16_t B15F::analogRead(uint8_t channel)
    221 {
    222  usart.clearInputBuffer();
    223  if(channel > 7)
    224  abort("Bad ADC channel: " + std::to_string(channel));
    225 
    226  uint8_t rq[] =
    227  {
    228  RQ_ADC,
    229  channel
    230  };
    231 
    232  usart.transmit(&rq[0], 0, sizeof(rq));
    233 
    234  uint16_t adc = usart.readInt();
    235 
    236  if(adc > 1023)
    237  abort("Bad ADC data detected (1)");
    238  return adc;
    239 }
    240 
    241 void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    242 {
    243  // check pointers
    244  buffer_a += offset_a;
    245  buffer_b += offset_b;
    246 
    247 
    248  usart.clearInputBuffer();
    249  usart.writeByte(RQ_ADC_DAC_STROKE);
    250  usart.writeByte(channel_a);
    251  usart.writeByte(channel_b);
    252  usart.writeInt(start);
    253  usart.writeInt(static_cast<uint16_t>(delta));
    254  usart.writeInt(count);
    255 
    256  for(uint16_t i = 0; i < count; i++)
    257  {
    258  if(buffer_a)
    259  {
    260  buffer_a[i] = usart.readInt();
    261 
    262  if(buffer_a[i] > 1023) // check for broken usart connection
    263  abort("Bad ADC data detected (2)");
    264  }
    265  else
    266  {
    267  usart.readInt();
    268  }
    269 
    270  if(buffer_b)
    271  {
    272  buffer_b[i] = usart.readInt();
    273 
    274  if(buffer_b[i] > 1023) // check for broken usart connection
    275  abort("Bad ADC data detected (3)");
    276  }
    277  else
    278  {
    279  usart.readInt();
    280  }
    281  }
    282 
    283  uint8_t aw = usart.readByte();
    284  if(aw != MSG_OK)
    285  abort("Sequenz unterbrochen");
    286 
    287  delay_us(10);
    288 }
    289 
    290 uint8_t B15F::pwmSetFrequency(uint32_t freq)
    291 {
    292  usart.clearInputBuffer();
    293 
    294  uint8_t rq[] =
    295  {
    296  RQ_PWM_SET_FREQ,
    297  static_cast<uint8_t>((freq >> 0) & 0xFF),
    298  static_cast<uint8_t>((freq >> 8) & 0xFF),
    299  static_cast<uint8_t>((freq >> 16) & 0xFF),
    300  static_cast<uint8_t>((freq >> 24) & 0xFF)
    301  };
    302 
    303  usart.transmit(&rq[0], 0, sizeof(rq));
    304 
    305  uint8_t byte = usart.readByte();
    306  delay_us(10);
    307  return byte;
    308 }
    309 
    310 bool B15F::pwmSetValue(uint8_t value)
    311 {
    312  usart.clearInputBuffer();
    313 
    314  uint8_t rq[] =
    315  {
    316  RQ_PWM_SET_VALUE,
    317  value
    318  };
    319 
    320  usart.transmit(&rq[0], 0, sizeof(rq));
    321 
    322  uint8_t aw = usart.readByte();
    323  delay_us(10);
    324  return aw == MSG_OK;
    325 }
    326 
    327 bool B15F::setRegister(uint8_t adr, uint8_t val)
    328 {
    329  usart.clearInputBuffer();
    330 
    331  uint8_t rq[] =
    332  {
    333  RQ_SET_REG,
    334  adr,
    335  val
    336  };
    337 
    338  usart.transmit(&rq[0], 0, sizeof(rq));
    339 
    340  uint8_t byte = usart.readByte();
    341  delay_us(10);
    342  return byte == val;
    343 }
    344 
    345 uint8_t B15F::getRegister(uint8_t adr)
    346 {
    347  usart.clearInputBuffer();
    348 
    349  uint8_t rq[] =
    350  {
    351  RQ_GET_REG,
    352  adr
    353  };
    354 
    355  usart.transmit(&rq[0], 0, sizeof(rq));
    356 
    357  uint8_t aw = usart.readByte();
    358  delay_us(10);
    359  return aw;
    360 }
    361 
    362 
    363 void B15F::delay_ms(uint16_t ms)
    364 {
    365  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    366 }
    367 
    368 void B15F::delay_us(uint16_t us)
    369 {
    370  std::this_thread::sleep_for(std::chrono::microseconds(us));
    371 }
    372 
    374 {
    375  if(!instance)
    376  instance = new B15F();
    377 
    378  return *instance;
    379 }
    380 
    381 // https://stackoverflow.com/a/478960
    382 std::string B15F::exec(std::string cmd)
    383 {
    384  std::array<char, 128> buffer;
    385  std::string result;
    386  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    387  if (!pipe)
    388  {
    389  throw std::runtime_error("popen() failed!");
    390  }
    391  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    392  {
    393  result += buffer.data();
    394  }
    395  return result;
    396 }
    397 
    398 void B15F::abort(std::string msg)
    399 {
    400  DriverException ex(msg);
    401  abort(ex);
    402 }
    403 void B15F::abort(std::exception& ex)
    404 {
    405  if(errorhandler)
    406  errorhandler(ex);
    407  else
    408  {
    409  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    410  std::cout << ex.what() << std::endl;
    411  throw DriverException(ex.what());
    412  }
    413 }
    414 
    415 void B15F::setAbortHandler(errorhandler_t func)
    416 {
    417  errorhandler = func;
    418 }
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:382
    +
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:345
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:368
    +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    +
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:290
    +
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:241
    +
    bool testConnection(void)
    Definition: b15f.cpp:90
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:363
    +
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:327
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:373
    +
    Definition: b15f.h:26
    +
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:78
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:398
    +
    void clearInputBuffer(void)
    Definition: usart.cpp:49
    +
    void clearOutputBuffer(void)
    Definition: usart.cpp:56
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    +
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:231
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:96
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    +
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:118
    +
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:234
    +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    +
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:310
    +
    void discard(void)
    Definition: b15f.cpp:72
    +
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:232
    +
    void openDevice(std::string device)
    Definition: usart.cpp:8
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    +
    void reconnect(void)
    Definition: b15f.cpp:57
    +
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:237
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:415
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    +
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:236
    +
    bool testIntConv(void)
    Definition: b15f.cpp:105
    + + + + + diff --git a/docs/html/b15f_8h_source.html b/docs/html/b15f_8h_source.html new file mode 100644 index 0000000..2c00d60 --- /dev/null +++ b/docs/html/b15f_8h_source.html @@ -0,0 +1,115 @@ + + + + + + + +B15F: drv/b15f.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    b15f.h
    +
    +
    +
    1 #ifndef B15F_H
    2 #define B15F_H
    3 
    4 #include <iostream>
    5 #include <bits/stdc++.h>
    6 #include <string>
    7 #include <fstream>
    8 #include <cstdlib>
    9 #include <chrono>
    10 #include <cstdint>
    11 #include <vector>
    12 
    13 #include <unistd.h>
    14 #include <fcntl.h>
    15 #include <sys/ioctl.h>
    16 #include <termios.h>
    17 #include "usart.h"
    18 #include "driverexception.h"
    19 #include "timeoutexception.h"
    20 
    21 typedef std::function<void(std::exception&)> errorhandler_t;
    22 
    23 
    26 class B15F
    27 {
    28 private:
    29  // privater Konstruktor
    30  B15F(void);
    31 public:
    32 
    33  /*************************************
    34  * Grundfunktionen des B15F Treibers *
    35  *************************************/
    36 
    41  void reconnect(void);
    42 
    47  void discard(void);
    48 
    53  bool testConnection(void);
    54 
    59  bool testIntConv(void);
    60 
    65  std::vector<std::string> getBoardInfo(void);
    66 
    71  void delay_ms(uint16_t ms);
    72 
    77  void delay_us(uint16_t us);
    78 
    83  static B15F& getInstance(void);
    84 
    89  static std::string exec(std::string cmd);
    90 
    95  static void abort(std::string msg);
    96 
    101  static void abort(std::exception& ex);
    102 
    107  static void setAbortHandler(errorhandler_t func);
    108 
    109  /*************************************/
    110 
    111 
    112 
    113  /*************************
    114  * Steuerbefehle für B15 *
    115  *************************/
    116 
    122  bool activateSelfTestMode(void);
    123 
    129  bool digitalWrite0(uint8_t);
    130 
    136  bool digitalWrite1(uint8_t);
    137 
    143  uint8_t digitalRead0(void);
    144 
    150  uint8_t digitalRead1(void);
    151 
    157  uint8_t readDipSwitch(void);
    158 
    164  bool analogWrite0(uint16_t port);
    165 
    171  bool analogWrite1(uint16_t port);
    172 
    178  uint16_t analogRead(uint8_t channel);
    179 
    195  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
    196 
    204  uint8_t pwmSetFrequency(uint32_t freq);
    205 
    211  bool pwmSetValue(uint8_t value);
    212 
    220  bool setRegister(uint8_t adr, uint8_t val);
    221 
    227  uint8_t getRegister(uint8_t adr);
    228 
    229  /*************************/
    230 
    231 
    232  // CONSTANTS
    233  const std::string PRE = "[B15F] ";
    234  constexpr static uint8_t MSG_OK = 0xFF;
    235  constexpr static uint8_t MSG_FAIL = 0xFE;
    236  constexpr static uint16_t RECONNECT_TIMEOUT = 64;
    237  constexpr static uint16_t WDT_TIMEOUT = 15;
    238  constexpr static uint8_t RECONNECT_TRIES = 3;
    239  constexpr static uint32_t BAUDRATE = 57600;
    240 
    241 private:
    242 
    247  void init(void);
    248 
    249  USART usart;
    250  static B15F* instance;
    251  static errorhandler_t errorhandler;
    252 
    253  // REQUESTS
    254  constexpr static uint8_t RQ_DISC = 0;
    255  constexpr static uint8_t RQ_TEST = 1;
    256  constexpr static uint8_t RQ_INFO = 2;
    257  constexpr static uint8_t RQ_INT = 3;
    258  constexpr static uint8_t RQ_ST = 4;
    259  constexpr static uint8_t RQ_BA0 = 5;
    260  constexpr static uint8_t RQ_BA1 = 6;
    261  constexpr static uint8_t RQ_BE0 = 7;
    262  constexpr static uint8_t RQ_BE1 = 8;
    263  constexpr static uint8_t RQ_DSW = 9;
    264  constexpr static uint8_t RQ_AA0 = 10;
    265  constexpr static uint8_t RQ_AA1 = 11;
    266  constexpr static uint8_t RQ_ADC = 12;
    267  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
    268  constexpr static uint8_t RQ_PWM_SET_FREQ = 14;
    269  constexpr static uint8_t RQ_PWM_SET_VALUE = 15;
    270  constexpr static uint8_t RQ_SET_REG = 16;
    271  constexpr static uint8_t RQ_GET_REG = 17;
    272 };
    273 
    274 #endif // B15F_H
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:382
    +
    constexpr static uint8_t MSG_FAIL
    Value to reject a received command.
    Definition: b15f.h:233
    +
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:345
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:368
    +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    +
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:290
    +
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:241
    +
    bool testConnection(void)
    Definition: b15f.cpp:90
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:363
    +
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:327
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:373
    +
    Definition: b15f.h:26
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:398
    +
    Definition: usart.h:13
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    +
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:231
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    +
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:118
    +
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:234
    +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    +
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:310
    +
    void discard(void)
    Definition: b15f.cpp:72
    +
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:232
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    +
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:235
    +
    void reconnect(void)
    Definition: b15f.cpp:57
    +
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:237
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:415
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    +
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:236
    +
    bool testIntConv(void)
    Definition: b15f.cpp:105
    + + + + diff --git a/docs/html/backup_8cpp_source.html b/docs/html/backup_8cpp_source.html new file mode 100644 index 0000000..ceb3907 --- /dev/null +++ b/docs/html/backup_8cpp_source.html @@ -0,0 +1,83 @@ + + + + + + + +B15F: drv/backup.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    backup.cpp
    +
    +
    +
    1 
    2 void USART::writeByte(uint8_t b)
    3 {
    4  int sent = write(file_desc, &b, 1);
    5  if (sent != 1)
    6  {
    7  std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl;
    8  usleep(100000);
    9  sent = write(file_desc, &b, 1);
    10  if (sent != 1)
    11  throw USARTException("Fehler beim Senden: writeByte()");
    12  }
    13 
    14 }
    15 
    16 void USART::writeInt(uint16_t d)
    17 {
    18  int sent = write(file_desc, reinterpret_cast<char *>(&d), 2);
    19  if (sent != 2)
    20  throw USARTException("Fehler beim Senden: writeInt()");
    21 }
    22 
    23 void USART::writeU32(uint32_t w)
    24 {
    25  int sent = write(file_desc, reinterpret_cast<char *>(&w), 4);
    26  if (sent != 4)
    27  throw USARTException("Fehler beim Senden: writeU32()");
    28 }
    29 
    30 uint8_t USART::readByte(void)
    31 {
    32  char b;
    33  auto start = std::chrono::steady_clock::now();
    34  auto end = start;
    35  uint16_t elapsed = 0;
    36  while (elapsed < timeout * 100)
    37  {
    38  int code = read(file_desc, &b, 1);
    39  if (code > 0)
    40  return static_cast<uint8_t>(b);
    41 
    42  end = std::chrono::steady_clock::now();
    43  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    44  }
    45 
    46  throw TimeoutException("Verbindung unterbrochen.", timeout);
    47 }
    48 
    49 uint16_t USART::readInt(void)
    50 {
    51  return readByte() | readByte() << 8;
    52 }
    + + + + + + diff --git a/docs/html/bc_s.png b/docs/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/docs/html/bdwn.png b/docs/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    B15F Member List
    +
    +
    + +

    This is the complete list of members for B15F, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    abort(std::string msg)B15Fstatic
    abort(std::exception &ex)B15Fstatic
    activateSelfTestMode(void)B15F
    analogRead(uint8_t channel)B15F
    analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)B15F
    analogWrite0(uint16_t port)B15F
    analogWrite1(uint16_t port)B15F
    BAUDRATEB15Fstatic
    delay_ms(uint16_t ms)B15F
    delay_us(uint16_t us)B15F
    digitalRead0(void)B15F
    digitalRead1(void)B15F
    digitalWrite0(uint8_t)B15F
    digitalWrite1(uint8_t)B15F
    discard(void)B15F
    exec(std::string cmd)B15Fstatic
    getBoardInfo(void)B15F
    getInstance(void)B15Fstatic
    getRegister(uint8_t adr)B15F
    MSG_FAILB15Fstatic
    MSG_OKB15Fstatic
    PREB15F
    pwmSetFrequency(uint32_t freq)B15F
    pwmSetValue(uint8_t value)B15F
    readDipSwitch(void)B15F
    reconnect(void)B15F
    RECONNECT_TIMEOUTB15Fstatic
    RECONNECT_TRIESB15Fstatic
    setAbortHandler(errorhandler_t func)B15Fstatic
    setRegister(uint8_t adr, uint8_t val)B15F
    testConnection(void)B15F
    testIntConv(void)B15F
    WDT_TIMEOUTB15Fstatic
    + + + + diff --git a/docs/html/classB15F.html b/docs/html/classB15F.html new file mode 100644 index 0000000..2f7b525 --- /dev/null +++ b/docs/html/classB15F.html @@ -0,0 +1,1038 @@ + + + + + + + +B15F: B15F Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    + +

    #include <b15f.h>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    void reconnect (void)
     
    void discard (void)
     
    bool testConnection (void)
     
    bool testIntConv (void)
     
    std::vector< std::string > getBoardInfo (void)
     
    void delay_ms (uint16_t ms)
     
    void delay_us (uint16_t us)
     
    bool activateSelfTestMode (void)
     
    bool digitalWrite0 (uint8_t)
     
    bool digitalWrite1 (uint8_t)
     
    uint8_t digitalRead0 (void)
     
    uint8_t digitalRead1 (void)
     
    uint8_t readDipSwitch (void)
     
    bool analogWrite0 (uint16_t port)
     
    bool analogWrite1 (uint16_t port)
     
    uint16_t analogRead (uint8_t channel)
     
    void analogSequence (uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
     
    uint8_t pwmSetFrequency (uint32_t freq)
     
    bool pwmSetValue (uint8_t value)
     
    bool setRegister (uint8_t adr, uint8_t val)
     
    uint8_t getRegister (uint8_t adr)
     
    + + + + + + + + + + + +

    +Static Public Member Functions

    static B15FgetInstance (void)
     
    static std::string exec (std::string cmd)
     
    static void abort (std::string msg)
     
    static void abort (std::exception &ex)
     
    static void setAbortHandler (errorhandler_t func)
     
    + + + + +

    +Public Attributes

    +const std::string PRE = "[B15F] "
     B15F stdout prefix.
     
    + + + + + + + + + + + + + + + + + + + +

    +Static Public Attributes

    +constexpr static uint8_t MSG_OK = 0xFF
     Value to acknowledge a received command.
     
    +constexpr static uint8_t MSG_FAIL = 0xFE
     Value to reject a received command.
     
    +constexpr static uint16_t RECONNECT_TIMEOUT = 64
     Time in ms after which a reconnect attempt aborts.
     
    +constexpr static uint16_t WDT_TIMEOUT = 15
     Time in ms after which the watch dog timer resets the MCU.
     
    +constexpr static uint8_t RECONNECT_TRIES = 3
     Maximum count of reconnect attempts after which the driver stops.
     
    +constexpr static uint32_t BAUDRATE = 57600
     USART baudrate for communication with the MCU.
     
    +

    Detailed Description

    +

    main driver class

    + +

    Definition at line 26 of file b15f.h.

    +

    Member Function Documentation

    + +

    ◆ abort() [1/2]

    + +
    +
    + + + + + +
    + + + + + + + + +
    void B15F::abort (std::exception & ex)
    +
    +static
    +
    +

    Multithread sicherer Abbruch des B15F-Treibers

    Parameters
    + + +
    exException als Abbruchursache
    +
    +
    + +

    Definition at line 403 of file b15f.cpp.

    + +
    +
    + +

    ◆ abort() [2/2]

    + +
    +
    + + + + + +
    + + + + + + + + +
    void B15F::abort (std::string msg)
    +
    +static
    +
    +

    Multithread sicherer Abbruch des B15F-Treibers

    Parameters
    + + +
    msgBeschreibung der Abbruchursache
    +
    +
    + +

    Definition at line 398 of file b15f.cpp.

    + +
    +
    + +

    ◆ activateSelfTestMode()

    + +
    +
    + + + + + + + + +
    bool B15F::activateSelfTestMode (void )
    +
    +

    Versetzt das Board in den Selbsttest-Modus WICHTIG: Es darf dabei nichts an den Klemmen angeschlossen sein!

    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 145 of file b15f.cpp.

    + +
    +
    + +

    ◆ analogRead()

    + +
    +
    + + + + + + + + +
    uint16_t B15F::analogRead (uint8_t channel)
    +
    +

    Liest den Wert des Analog-Digital-Converters (ADC / ADU)

    Parameters
    + + +
    channelKanalwahl von 0 - 7
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 220 of file b15f.cpp.

    + +
    +
    + +

    ◆ analogSequence()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void B15F::analogSequence (uint8_t channel_a,
    uint16_t * buffer_a,
    uint32_t offset_a,
    uint8_t channel_b,
    uint16_t * buffer_b,
    uint32_t offset_b,
    uint16_t start,
    int16_t delta,
    uint16_t count 
    )
    +
    +

    DAC 0 wird auf den Startwert gesetzt und dann schrittweise um Delta inkrementiert. Für jeden eingestelleten DAC-Wert werden zwei ADCs (channel_a und channel_b) angesprochen und die Werte übermittelt. Die Werte werden in buffer_a für Kanal a und buffer_b für Kanal b gespeichert.

    Parameters
    + + + + + + + + + + +
    channel_aAuswahl des ADC a, von 0 - 7
    buffer_aSpeichertort für Werte des Kanals a
    offset_aAnzahl an Werten des Kanals a, die im Speicher übersprungen werden sollen
    channel_bAuswahl des ADC b, von 0 - 7
    buffer_bSpeichertort für Werte des Kanals b
    offset_bAnzahl an Werten des Kanals b, die im Speicher übersprungen werden
    startStartwert des DACs
    deltaSchrittweite, mit welcher der DAC inkrementiert wird
    countAnzahl an Inkrementierungen
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 241 of file b15f.cpp.

    + +
    +
    + +

    ◆ analogWrite0()

    + +
    +
    + + + + + + + + +
    bool B15F::analogWrite0 (uint16_t port)
    +
    +

    Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 0

    Parameters
    + + +
    port10-Bit Wert
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 200 of file b15f.cpp.

    + +
    +
    + +

    ◆ analogWrite1()

    + +
    +
    + + + + + + + + +
    bool B15F::analogWrite1 (uint16_t port)
    +
    +

    Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 1

    Parameters
    + + +
    port10-Bit Wert
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 210 of file b15f.cpp.

    + +
    +
    + +

    ◆ delay_ms()

    + +
    +
    + + + + + + + + +
    void B15F::delay_ms (uint16_t ms)
    +
    +

    Lässt den Treiber für eine angegebene Zeit pausieren

    Parameters
    + + +
    msVerzögerung in Millisekunden
    +
    +
    + +

    Definition at line 363 of file b15f.cpp.

    + +
    +
    + +

    ◆ delay_us()

    + +
    +
    + + + + + + + + +
    void B15F::delay_us (uint16_t us)
    +
    +

    Lässt den Treiber für eine angegebene Zeit pausieren

    Parameters
    + + +
    usVerzögerung in Microsekunden
    +
    +
    + +

    Definition at line 368 of file b15f.cpp.

    + +
    +
    + +

    ◆ digitalRead0()

    + +
    +
    + + + + + + + + +
    uint8_t B15F::digitalRead0 (void )
    +
    +

    Liest den Wert des digitalen Eingabeports 0

    Returns
    Wert für gesamten Port
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 173 of file b15f.cpp.

    + +
    +
    + +

    ◆ digitalRead1()

    + +
    +
    + + + + + + + + +
    uint8_t B15F::digitalRead1 (void )
    +
    +

    Liest den Wert des digitalen Eingabeports 1

    Returns
    Wert für gesamten Port
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 182 of file b15f.cpp.

    + +
    +
    + +

    ◆ digitalWrite0()

    + +
    +
    + + + + + + + + +
    bool B15F::digitalWrite0 (uint8_t port)
    +
    +

    Setzt den Wert des digitalen Ausgabeports 0

    Parameters
    + + +
    portWert für gesamten Port
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 153 of file b15f.cpp.

    + +
    +
    + +

    ◆ digitalWrite1()

    + +
    +
    + + + + + + + + +
    bool B15F::digitalWrite1 (uint8_t port)
    +
    +

    Setzt den Wert des digitalen Ausgabeports 1

    Parameters
    + + +
    portWert für gesamten Port
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 163 of file b15f.cpp.

    + +
    +
    + +

    ◆ discard()

    + +
    +
    + + + + + + + + +
    void B15F::discard (void )
    +
    +

    Verwirft Daten im USART Puffer auf dieser Maschine und B15

    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 72 of file b15f.cpp.

    + +
    +
    + +

    ◆ exec()

    + +
    +
    + + + + + +
    + + + + + + + + +
    std::string B15F::exec (std::string cmd)
    +
    +static
    +
    +

    Führt ein Befehl auf dieser Maschine aus und liefert stdout zurück

    Parameters
    + + +
    cmdDer Befehl
    +
    +
    + +

    Definition at line 382 of file b15f.cpp.

    + +
    +
    + +

    ◆ getBoardInfo()

    + +
    +
    + + + + + + + + +
    std::vector< std::string > B15F::getBoardInfo (void )
    +
    +

    Liefert Informationen zur aktuellen Firmware des B15

    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 118 of file b15f.cpp.

    + +
    +
    + +

    ◆ getInstance()

    + +
    +
    + + + + + +
    + + + + + + + + +
    B15F & B15F::getInstance (void )
    +
    +static
    +
    +

    Liefert eine Referenz zur aktuellen Treiber-Instanz

    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 373 of file b15f.cpp.

    + +
    +
    + +

    ◆ getRegister()

    + +
    +
    + + + + + + + + +
    uint8_t B15F::getRegister (uint8_t adr)
    +
    +

    Liefert den Wert eines MCU Registers.

    Parameters
    + + +
    adrSpeicheradresse des Registers
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 345 of file b15f.cpp.

    + +
    +
    + +

    ◆ pwmSetFrequency()

    + +
    +
    + + + + + + + + +
    uint8_t B15F::pwmSetFrequency (uint32_t freq)
    +
    +

    Setzt die Register so, dass näherungsweise die gewünschte Frequenz erzeugt wird. Ist freq == 0 wird PWM deaktiviert.

    Parameters
    + + +
    freqPWM Frequenz
    +
    +
    +
    Returns
    Top Wert des PWM Value für die gesetzte Frequenz
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 290 of file b15f.cpp.

    + +
    +
    + +

    ◆ pwmSetValue()

    + +
    +
    + + + + + + + + +
    bool B15F::pwmSetValue (uint8_t value)
    +
    +

    Setzt den PWM Wert.

    Parameters
    + + +
    valuePWM Wert [0..0xFF]
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 310 of file b15f.cpp.

    + +
    +
    + +

    ◆ readDipSwitch()

    + +
    +
    + + + + + + + + +
    uint8_t B15F::readDipSwitch (void )
    +
    +

    Liest den Wert des digitalen Eingabeports, an dem der DIP-switch angeschlossen ist (S7)

    Returns
    Wert für gesamten Port
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 191 of file b15f.cpp.

    + +
    +
    + +

    ◆ reconnect()

    + +
    +
    + + + + + + + + +
    void B15F::reconnect (void )
    +
    +

    Versucht die Verbindung zum B15 wiederherzustellen

    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 57 of file b15f.cpp.

    + +
    +
    + +

    ◆ setAbortHandler()

    + +
    +
    + + + + + +
    + + + + + + + + +
    void B15F::setAbortHandler (errorhandler_t func)
    +
    +static
    +
    +

    Setzt eine Fehlerbehandlungsroutine für den Treiberabbruch (abort)

    Parameters
    + + +
    funcFunktion, die Exception als Parameter bekommt
    +
    +
    + +

    Definition at line 415 of file b15f.cpp.

    + +
    +
    + +

    ◆ setRegister()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool B15F::setRegister (uint8_t adr,
    uint8_t val 
    )
    +
    +

    Setzt direkt den Wert eines MCU Registers. Wichtig: bei einer falschen Adresse kann das Board 15 ernsthaften Schaden nehmen!

    Parameters
    + + + +
    adrSpeicheradresse des Registers
    valNeuer Wert für das Register
    +
    +
    +
    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 327 of file b15f.cpp.

    + +
    +
    + +

    ◆ testConnection()

    + +
    +
    + + + + + + + + +
    bool B15F::testConnection (void )
    +
    +

    Testet die USART Verbindung auf Funktion

    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 90 of file b15f.cpp.

    + +
    +
    + +

    ◆ testIntConv()

    + +
    +
    + + + + + + + + +
    bool B15F::testIntConv (void )
    +
    +

    Testet die Integer Konvertierung der USART Verbindung

    Exceptions
    + + +
    DriverException
    +
    +
    + +

    Definition at line 105 of file b15f.cpp.

    + +
    +
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/classDot-members.html b/docs/html/classDot-members.html new file mode 100644 index 0000000..da5ef98 --- /dev/null +++ b/docs/html/classDot-members.html @@ -0,0 +1,84 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Dot Member List
    +
    +
    + +

    This is the complete list of members for Dot, including all inherited members.

    + + + + + +
    Dot(uint16_t x, uint16_t y, uint8_t curve)Dot
    getCurve(void) constDot
    getX(void) constDot
    getY(void) constDot
    + + + + diff --git a/docs/html/classDot.html b/docs/html/classDot.html new file mode 100644 index 0000000..e6f418b --- /dev/null +++ b/docs/html/classDot.html @@ -0,0 +1,204 @@ + + + + + + + +B15F: Dot Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Dot Class Reference
    +
    +
    + +

    #include <dot.h>

    + + + + + + + + + + +

    +Public Member Functions

     Dot (uint16_t x, uint16_t y, uint8_t curve)
     
    uint16_t getX (void) const
     
    uint16_t getY (void) const
     
    uint8_t getCurve (void) const
     
    +

    Detailed Description

    +

    Immutable dot class with x and y coordinate and curve index. Dots with the same curve index get the same color by plotty.

    + +

    Definition at line 12 of file dot.h.

    +

    Constructor & Destructor Documentation

    + +

    ◆ Dot()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Dot::Dot (uint16_t x,
    uint16_t y,
    uint8_t curve 
    )
    +
    +

    Constructor with x and y coordinate and curve index.

    + +

    Definition at line 3 of file dot.cpp.

    + +
    +
    +

    Member Function Documentation

    + +

    ◆ getCurve()

    + +
    +
    + + + + + + + + +
    uint8_t Dot::getCurve (void ) const
    +
    +

    Returns the curve index.

    + +

    Definition at line 19 of file dot.cpp.

    + +
    +
    + +

    ◆ getX()

    + +
    +
    + + + + + + + + +
    uint16_t Dot::getX (void ) const
    +
    +

    Returns the x coordinate.

    + +

    Definition at line 9 of file dot.cpp.

    + +
    +
    + +

    ◆ getY()

    + +
    +
    + + + + + + + + +
    uint16_t Dot::getY (void ) const
    +
    +

    Returns the y coordinate.

    + +

    Definition at line 14 of file dot.cpp.

    + +
    +
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/classDriverException-members.html b/docs/html/classDriverException-members.html new file mode 100644 index 0000000..37e5ca6 --- /dev/null +++ b/docs/html/classDriverException-members.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    DriverException Member List
    +
    +
    + +

    This is the complete list of members for DriverException, including all inherited members.

    + + + + + + +
    DriverException(const char *message) (defined in DriverException)DriverExceptioninlineexplicit
    DriverException(const std::string &message) (defined in DriverException)DriverExceptioninlineexplicit
    msg_ (defined in DriverException)DriverExceptionprotected
    what() const (defined in DriverException)DriverExceptioninlinevirtual
    ~DriverException() (defined in DriverException)DriverExceptioninlinevirtual
    + + + + diff --git a/docs/html/classDriverException.html b/docs/html/classDriverException.html new file mode 100644 index 0000000..f40ae8c --- /dev/null +++ b/docs/html/classDriverException.html @@ -0,0 +1,117 @@ + + + + + + + +B15F: DriverException Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    DriverException Class Reference
    +
    +
    + +

    #include <driverexception.h>

    +
    + + Inheritance diagram for DriverException:
    +
    +
    + + + + + + + + + +

    +Public Member Functions

    DriverException (const char *message)
     
    DriverException (const std::string &message)
     
    +virtual const char * what () const throw ()
     
    + + + +

    +Protected Attributes

    +std::string msg_
     
    +

    Detailed Description

    +

    Exception driver problems, for instance incompatible firmware version.

    + +

    Definition at line 10 of file driverexception.h.

    +

    The documentation for this class was generated from the following file: +
    + + + + diff --git a/docs/html/classDriverException.png b/docs/html/classDriverException.png new file mode 100644 index 0000000000000000000000000000000000000000..5b60bc759625925bd4e0cc75ebda8d9af2606396 GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^=|CL7!3-pgAI!c7q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXg3p`yMLn;{G&b>XUSwVocINb;}Jom2%dUf^9ZaL3ghbF3r)>dA>;&1-` zT+sag=gWP4CRNE)6cz2gb#BSGtfWa-9^RR}Jko7#$y`m3pmyc+U!tpv-jv(s2AaOM zycgv8s$f_CQa-&o=eN(hTs3>vwtM@&dIZVW`&Fo%^atYe4*fH4erBksWaLSh@cgTk zveXmLS&EAS=hcVjKV8jgdc9?pvqG3D8?EQIfX+{?^z zhp%t;|2x8WB|HDb^7Opr0W+`p#5s0u3$C)Cx% + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    PlottyFile Member List
    +
    +
    + +

    This is the complete list of members for PlottyFile, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    addDot(Dot &dot)PlottyFile
    addDot(Dot dot)PlottyFile
    getDescPara(void) constPlottyFile
    getDescX(void) constPlottyFile
    getDescY(void) constPlottyFile
    getFunctionType(void) constPlottyFile
    getParaFirstCurve(void) constPlottyFile
    getParaStepWidth(void) constPlottyFile
    getQuadrant(void) constPlottyFile
    getRefX(void) constPlottyFile
    getRefY(void) constPlottyFile
    getUnitPara(void) constPlottyFile
    getUnitX(void) constPlottyFile
    getUnitY(void) constPlottyFile
    setDescPara(std::string desc_para)PlottyFile
    setDescX(std::string desc_x)PlottyFile
    setDescY(std::string desc_y)PlottyFile
    setFunctionType(FunctionType function_type)PlottyFile
    setParaFirstCurve(uint16_t para_first)PlottyFile
    setParaStepWidth(uint16_t para_stepwidth)PlottyFile
    setQuadrant(uint8_t quadrant)PlottyFile
    setRefX(uint16_t ref_x)PlottyFile
    setRefY(uint16_t ref_y)PlottyFile
    setUnitPara(std::string unit_para)PlottyFile
    setUnitX(std::string unit_x)PlottyFile
    setUnitY(std::string unit_y)PlottyFile
    startPlotty(std::string filename)PlottyFile
    writeToFile(std::string filename)PlottyFile
    + + + + diff --git a/docs/html/classPlottyFile.html b/docs/html/classPlottyFile.html new file mode 100644 index 0000000..cd79636 --- /dev/null +++ b/docs/html/classPlottyFile.html @@ -0,0 +1,819 @@ + + + + + + + +B15F: PlottyFile Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    PlottyFile Class Reference
    +
    +
    + +

    #include <plottyfile.h>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    void addDot (Dot &dot)
     
    void addDot (Dot dot)
     
    void setFunctionType (FunctionType function_type)
     
    void setQuadrant (uint8_t quadrant)
     
    void setRefX (uint16_t ref_x)
     
    void setRefY (uint16_t ref_y)
     
    void setParaFirstCurve (uint16_t para_first)
     
    void setParaStepWidth (uint16_t para_stepwidth)
     
    void setUnitX (std::string unit_x)
     
    void setDescX (std::string desc_x)
     
    void setUnitY (std::string unit_y)
     
    void setDescY (std::string desc_y)
     
    void setUnitPara (std::string unit_para)
     
    void setDescPara (std::string desc_para)
     
    FunctionType getFunctionType (void) const
     
    uint8_t getQuadrant (void) const
     
    uint16_t getRefX (void) const
     
    uint16_t getRefY (void) const
     
    uint16_t getParaFirstCurve (void) const
     
    uint16_t getParaStepWidth (void) const
     
    std::string getUnitX (void) const
     
    std::string getDescX (void) const
     
    std::string getUnitY (void) const
     
    std::string getDescY (void) const
     
    std::string getUnitPara (void) const
     
    std::string getDescPara (void) const
     
    void writeToFile (std::string filename)
     
    void startPlotty (std::string filename)
     
    +

    Detailed Description

    +

    Wrapper class for convenient plot file creation, needed to display graphs using plotty.

    + +

    Definition at line 19 of file plottyfile.h.

    +

    Member Function Documentation

    + +

    ◆ addDot() [1/2]

    + +
    +
    + + + + + + + + +
    void PlottyFile::addDot (Dotdot)
    +
    +

    Adds a dot to the plotty file.

    Parameters
    + + +
    dotthe dot
    +
    +
    + +

    Definition at line 3 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ addDot() [2/2]

    + +
    +
    + + + + + + + + +
    void PlottyFile::addDot (Dot dot)
    +
    +

    Adds a dot by reference to the plotty file.

    Parameters
    + + +
    dotthe dot
    +
    +
    + +

    Definition at line 8 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getDescPara()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getDescPara (void ) const
    +
    +
    Returns
    description of parameter
    + +

    Definition at line 130 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getDescX()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getDescX (void ) const
    +
    +
    Returns
    description of x axis
    + +

    Definition at line 110 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getDescY()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getDescY (void ) const
    +
    +
    Returns
    description of y axis
    + +

    Definition at line 120 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getFunctionType()

    + +
    +
    + + + + + + + + +
    FunctionType PlottyFile::getFunctionType (void ) const
    +
    +
    Returns
    the FunctionType
    + +

    Definition at line 75 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getParaFirstCurve()

    + +
    +
    + + + + + + + + +
    uint16_t PlottyFile::getParaFirstCurve (void ) const
    +
    +
    Returns
    initial parameter value
    + +

    Definition at line 95 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getParaStepWidth()

    + +
    +
    + + + + + + + + +
    uint16_t PlottyFile::getParaStepWidth (void ) const
    +
    +
    Returns
    parameter stepwith
    + +

    Definition at line 100 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getQuadrant()

    + +
    +
    + + + + + + + + +
    uint8_t PlottyFile::getQuadrant (void ) const
    +
    +
    Returns
    the quadrant
    + +

    Definition at line 80 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getRefX()

    + +
    +
    + + + + + + + + +
    uint16_t PlottyFile::getRefX (void ) const
    +
    +
    Returns
    x reference (max) value
    + +

    Definition at line 85 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getRefY()

    + +
    +
    + + + + + + + + +
    uint16_t PlottyFile::getRefY (void ) const
    +
    +
    Returns
    y reference (max) value
    + +

    Definition at line 90 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getUnitPara()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getUnitPara (void ) const
    +
    +
    Returns
    unit of parameter
    + +

    Definition at line 125 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getUnitX()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getUnitX (void ) const
    +
    +
    Returns
    unit of x axis
    + +

    Definition at line 105 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ getUnitY()

    + +
    +
    + + + + + + + + +
    std::string PlottyFile::getUnitY (void ) const
    +
    +
    Returns
    unit of y axis
    + +

    Definition at line 115 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setDescPara()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setDescPara (std::string desc_para)
    +
    +

    Sets the description of the parameter.

    Parameters
    + + +
    para_firstdescription
    +
    +
    + +

    Definition at line 70 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setDescX()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setDescX (std::string desc_x)
    +
    +

    Sets the description of the x axis.

    Parameters
    + + +
    para_firstdescription
    +
    +
    + +

    Definition at line 50 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setDescY()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setDescY (std::string desc_y)
    +
    +

    Sets the description of the y axis.

    Parameters
    + + +
    para_firstdescription
    +
    +
    + +

    Definition at line 60 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setFunctionType()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setFunctionType (FunctionType function_type)
    +
    +

    Sets the FunctionType of this plotty file.

    Parameters
    + + +
    function_typeenum value
    +
    +
    + +

    Definition at line 13 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setParaFirstCurve()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setParaFirstCurve (uint16_t para_first)
    +
    +

    Sets initial value of the parameter. Gets used together with the stepwith to label the curves.

    Parameters
    + + +
    para_firstinitial parameter value
    +
    +
    + +

    Definition at line 35 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setParaStepWidth()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setParaStepWidth (uint16_t para_stepwidth)
    +
    +

    Sets the stepwith the parameter got increased with each curve.

    Parameters
    + + +
    para_firstparameter stepwith
    +
    +
    + +

    Definition at line 40 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setQuadrant()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setQuadrant (uint8_t quadrant)
    +
    +

    Sets the quadrant of this plot.

    Parameters
    + + +
    quadrantquadrant number (1..4)
    +
    +
    + +

    Definition at line 18 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setRefX()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setRefX (uint16_t ref_x)
    +
    +

    Sets reference (max) value of the x axis

    Parameters
    + + +
    ref_xreference value
    +
    +
    + +

    Definition at line 25 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setRefY()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setRefY (uint16_t ref_y)
    +
    +

    Sets reference (max) value of the y axis

    Parameters
    + + +
    ref_yreference value
    +
    +
    + +

    Definition at line 30 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setUnitPara()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setUnitPara (std::string unit_para)
    +
    +

    Sets the unit of the parameter.

    Parameters
    + + +
    para_firstunit
    +
    +
    + +

    Definition at line 65 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setUnitX()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setUnitX (std::string unit_x)
    +
    +

    Sets the unit of the x axis.

    Parameters
    + + +
    para_firstunit
    +
    +
    + +

    Definition at line 45 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ setUnitY()

    + +
    +
    + + + + + + + + +
    void PlottyFile::setUnitY (std::string unit_y)
    +
    +

    Sets the unit of the y axis.

    Parameters
    + + +
    para_firstunit
    +
    +
    + +

    Definition at line 55 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ startPlotty()

    + +
    +
    + + + + + + + + +
    void PlottyFile::startPlotty (std::string filename)
    +
    +

    Starts plotty with a plot file.

    Parameters
    + + +
    filenameplot path
    +
    +
    + +

    Definition at line 193 of file plottyfile.cpp.

    + +
    +
    + +

    ◆ writeToFile()

    + +
    +
    + + + + + + + + +
    void PlottyFile::writeToFile (std::string filename)
    +
    +

    Saves the PlottyFile in a binary format, ready to open with plotty.

    Parameters
    + + +
    filenamedesired plot path
    +
    +
    + +

    Definition at line 147 of file plottyfile.cpp.

    + +
    +
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/classTimeoutException-members.html b/docs/html/classTimeoutException-members.html new file mode 100644 index 0000000..156b33b --- /dev/null +++ b/docs/html/classTimeoutException-members.html @@ -0,0 +1,86 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    TimeoutException Member List
    +
    +
    + +

    This is the complete list of members for TimeoutException, including all inherited members.

    + + + + + + + +
    m_timeout (defined in TimeoutException)TimeoutExceptionprotected
    msg (defined in TimeoutException)TimeoutExceptionprotected
    TimeoutException(const char *message, int timeout) (defined in TimeoutException)TimeoutExceptioninlineexplicit
    TimeoutException(const std::string &message, int timeout) (defined in TimeoutException)TimeoutExceptioninlineexplicit
    what() const (defined in TimeoutException)TimeoutExceptioninlinevirtual
    ~TimeoutException() (defined in TimeoutException)TimeoutExceptioninlinevirtual
    + + + + diff --git a/docs/html/classTimeoutException.html b/docs/html/classTimeoutException.html new file mode 100644 index 0000000..505363b --- /dev/null +++ b/docs/html/classTimeoutException.html @@ -0,0 +1,120 @@ + + + + + + + +B15F: TimeoutException Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    TimeoutException Class Reference
    +
    +
    + +

    #include <timeoutexception.h>

    +
    + + Inheritance diagram for TimeoutException:
    +
    +
    + + + + + + + + + +

    +Public Member Functions

    TimeoutException (const char *message, int timeout)
     
    TimeoutException (const std::string &message, int timeout)
     
    +virtual const char * what () const throw ()
     
    + + + + + +

    +Protected Attributes

    +std::string msg
     
    +int m_timeout
     
    +

    Detailed Description

    +

    Exception for USART related timeouts.

    + +

    Definition at line 10 of file timeoutexception.h.

    +

    The documentation for this class was generated from the following file: +
    + + + + diff --git a/docs/html/classTimeoutException.png b/docs/html/classTimeoutException.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f464dfd5052472436754ea90df9e19970149ba GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^c|aV%!3-qNf88Jgq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXg^F3W0Ln;{G&OKOkSb>K%eEOdM{~zCA zv!3DPBeclR`qYMn$2N&2E=@mk=Fb6@lie3QFRA>Sl~?(vmB+YblF5mwc|TV^neuv1 z+?&a|#lNa|Yh6=WdAL>YX+=+w(Mp-4vsAW9US8_^{KTnSH#$|e?!2^ie$@19`xa^6 zUcchqPfPEh*$WS!S!?v+o!yn#vS+_S%bvAcd1igSR=jZX63-UDNoo(*8ygohKakC1 zsQd9M&pdqo`n-*mzvh(w-(&2|ZqR*!(MPF-VKRs80Tm~9gHAZtp?Bs?d5H$`h0HUK z=)Y`}PUk$akiqtvM#C&8gRnGx!GNAPkF~cqz11w{&GZscFE}!P@wLo;t?RpXy)6sd zw(R)k-rHeZr-MjbiR{YZVw`b+&TTAs)--eZ6yLxc_>tDau@of%$620q{ zNIgf9w@rO{@~-0ZZ~tyCeSUGl+jD0&E}!@BRQ=TM9H1LqUNAs>@|f?@LC4!mnlfC0 P(ZS&9>gTe~DWM4f2U+LU literal 0 HcmV?d00001 diff --git a/docs/html/classUSART-members.html b/docs/html/classUSART-members.html new file mode 100644 index 0000000..12b5a35 --- /dev/null +++ b/docs/html/classUSART-members.html @@ -0,0 +1,93 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    USART Member List
    +
    +
    + +

    This is the complete list of members for USART, including all inherited members.

    + + + + + + + + + + + + + + +
    clearInputBuffer(void)USART
    clearOutputBuffer(void)USART
    closeDevice(void)USART
    flushOutputBuffer(void)USART
    getBaudrate(void)USART
    getTimeout(void)USART
    openDevice(std::string device)USART
    receive(uint8_t *buffer, uint16_t offset, uint8_t len)USART
    setBaudrate(uint32_t baudrate)USART
    setTimeout(uint8_t timeout)USART
    transmit(uint8_t *buffer, uint16_t offset, uint8_t len)USART
    USART()=defaultUSARTexplicit
    ~USART(void)USARTvirtual
    + + + + diff --git a/docs/html/classUSART.html b/docs/html/classUSART.html new file mode 100644 index 0000000..3a81f92 --- /dev/null +++ b/docs/html/classUSART.html @@ -0,0 +1,497 @@ + + + + + + + +B15F: USART Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    USART Class Reference
    +
    +
    + +

    #include <usart.h>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

     USART ()=default
     
    virtual ~USART (void)
     
    void openDevice (std::string device)
     
    void closeDevice (void)
     
    void clearInputBuffer (void)
     
    void clearOutputBuffer (void)
     
    void flushOutputBuffer (void)
     
    void transmit (uint8_t *buffer, uint16_t offset, uint8_t len)
     
    void receive (uint8_t *buffer, uint16_t offset, uint8_t len)
     
    uint32_t getBaudrate (void)
     
    uint8_t getTimeout (void)
     
    void setBaudrate (uint32_t baudrate)
     
    void setTimeout (uint8_t timeout)
     
    +

    Detailed Description

    +

    C++ Wrapper class for termios usart library.

    + +

    Definition at line 13 of file usart.h.

    +

    Constructor & Destructor Documentation

    + +

    ◆ USART()

    + +
    +
    + + + + + +
    + + + + + + + +
    USART::USART ()
    +
    +explicitdefault
    +
    +

    Standard-Konstruktor

    + +
    +
    + +

    ◆ ~USART()

    + +
    +
    + + + + + +
    + + + + + + + + +
    USART::~USART (void )
    +
    +virtual
    +
    +

    Destructor, ruft automatisch closeDevice() auf

    + +

    Definition at line 3 of file usart.cpp.

    + +
    +
    +

    Member Function Documentation

    + +

    ◆ clearInputBuffer()

    + +
    +
    + + + + + + + + +
    void USART::clearInputBuffer (void )
    +
    +

    Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gelesen wurden

    Exceptions
    + + +
    USARTException
    +
    +
    + +

    Definition at line 49 of file usart.cpp.

    + +
    +
    + +

    ◆ clearOutputBuffer()

    + +
    +
    + + + + + + + + +
    void USART::clearOutputBuffer (void )
    +
    +

    Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden

    Exceptions
    + + +
    USARTException
    +
    +
    + +

    Definition at line 56 of file usart.cpp.

    + +
    +
    + +

    ◆ closeDevice()

    + +
    +
    + + + + + + + + +
    void USART::closeDevice (void )
    +
    +

    Schließt die USART Schnittstelle

    Exceptions
    + + +
    USARTException
    +
    +
    + +

    Definition at line 38 of file usart.cpp.

    + +
    +
    + +

    ◆ flushOutputBuffer()

    + +
    +
    + + + + + + + + +
    void USART::flushOutputBuffer (void )
    +
    +

    Schreibt Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden

    Exceptions
    + + +
    USARTException
    +
    +
    + +

    Definition at line 63 of file usart.cpp.

    + +
    +
    + +

    ◆ getBaudrate()

    + +
    +
    + + + + + + + + +
    uint32_t USART::getBaudrate (void )
    +
    +

    Liefert die eingestellte Baudrate Änderungen werden erst nach einem open() wirksam

    + +

    Definition at line 86 of file usart.cpp.

    + +
    +
    + +

    ◆ getTimeout()

    + +
    +
    + + + + + + + + +
    uint8_t USART::getTimeout (void )
    +
    +

    Liefert den eingestellten Timeout (in Dezisekunden) Änderungen werden erst nach einem open() wirksam

    + +

    Definition at line 91 of file usart.cpp.

    + +
    +
    + +

    ◆ openDevice()

    + +
    +
    + + + + + + + + +
    void USART::openDevice (std::string device)
    +
    +

    Öffnet die USART Schnittstelle

    Parameters
    + + +
    deviceLinux-Gerätepfad
    +
    +
    +
    Exceptions
    + + +
    USARTException
    +
    +
    + +

    Definition at line 8 of file usart.cpp.

    + +
    +
    + +

    ◆ receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void USART::receive (uint8_t * buffer,
    uint16_t offset,
    uint8_t len 
    )
    +
    +

    Receives n bytes from USART and writes them into the buffer

    Parameters
    + + + + +
    buffertarget buffer
    offsetin buffer (mostly 0)
    lencount of bytes to receive
    +
    +
    +
    Exceptions
    + + +
    USARTException
    +
    +
    + +

    Definition at line 70 of file usart.cpp.

    + +
    +
    + +

    ◆ setBaudrate()

    + +
    +
    + + + + + + + + +
    void USART::setBaudrate (uint32_t baudrate)
    +
    +

    Setzt die Baudrate Änderungen werden erst nach openDevice() wirksam

    + +

    Definition at line 96 of file usart.cpp.

    + +
    +
    + +

    ◆ setTimeout()

    + +
    +
    + + + + + + + + +
    void USART::setTimeout (uint8_t timeout)
    +
    +

    Setzt den Timeout (in Dezisekunden) Änderungen werden erst nach openDevice() wirksam

    + +

    Definition at line 101 of file usart.cpp.

    + +
    +
    + +

    ◆ transmit()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void USART::transmit (uint8_t * buffer,
    uint16_t offset,
    uint8_t len 
    )
    +
    +

    Sends n bytes from the buffer over USART

    Parameters
    + + + + +
    buffertarget buffer
    offsetin buffer (mostly 0)
    lencount of bytes to send
    +
    +
    +
    Exceptions
    + + +
    USARTException
    +
    +
    + +

    Definition at line 78 of file usart.cpp.

    + +
    +
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/classUSARTException-members.html b/docs/html/classUSARTException-members.html new file mode 100644 index 0000000..c9696e1 --- /dev/null +++ b/docs/html/classUSARTException-members.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    USARTException Member List
    +
    +
    + +

    This is the complete list of members for USARTException, including all inherited members.

    + + + + + + +
    msgUSARTExceptionprotected
    USARTException(const char *message)USARTExceptioninlineexplicit
    USARTException(const std::string &message)USARTExceptioninlineexplicit
    what() constUSARTExceptioninlinevirtual
    ~USARTException()=defaultUSARTExceptionvirtual
    + + + + diff --git a/docs/html/classUSARTException.html b/docs/html/classUSARTException.html new file mode 100644 index 0000000..bab5acb --- /dev/null +++ b/docs/html/classUSARTException.html @@ -0,0 +1,247 @@ + + + + + + + +B15F: USARTException Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    USARTException Class Reference
    +
    +
    + +

    #include <usartexception.h>

    +
    + + Inheritance diagram for USARTException:
    +
    +
    + + + + + + + + + + + +

    +Public Member Functions

     USARTException (const char *message)
     
     USARTException (const std::string &message)
     
    virtual ~USARTException ()=default
     
    virtual const char * what () const throw ()
     
    + + + + +

    +Protected Attributes

    +std::string msg
     failure description
     
    +

    Detailed Description

    +

    Exception for USART problems, for instance buffer overflow.

    + +

    Definition at line 11 of file usartexception.h.

    +

    Constructor & Destructor Documentation

    + +

    ◆ USARTException() [1/2]

    + +
    +
    + + + + + +
    + + + + + + + + +
    USARTException::USARTException (const char * message)
    +
    +inlineexplicit
    +
    +

    Constructor

    Parameters
    + + +
    messageas c-string
    +
    +
    + +

    Definition at line 18 of file usartexception.h.

    + +
    +
    + +

    ◆ USARTException() [2/2]

    + +
    +
    + + + + + +
    + + + + + + + + +
    USARTException::USARTException (const std::string & message)
    +
    +inlineexplicit
    +
    +

    Constructor

    Parameters
    + + +
    messageas c++-string
    +
    +
    + +

    Definition at line 26 of file usartexception.h.

    + +
    +
    + +

    ◆ ~USARTException()

    + +
    +
    + + + + + +
    + + + + + + + +
    virtual USARTException::~USARTException ()
    +
    +virtualdefault
    +
    +

    Standard-destructor

    + +
    +
    +

    Member Function Documentation

    + +

    ◆ what()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    virtual const char* USARTException::what () const
    throw (
    )
    +
    +inlinevirtual
    +
    +

    Get failure description

    Returns
    error message as c-string
    + +

    Definition at line 39 of file usartexception.h.

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + diff --git a/docs/html/classUSARTException.png b/docs/html/classUSARTException.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9d8a0309fdd7afb6f89ea59a339d8db10bbbcc GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^*+3k?!3-od?^Fi>DTx4|5ZC|z{{xvX-h3_XKQsZz z0^Vow*xkP61Pb7PB|4S3kX^?$yrfBfi% zgfpvRsN3AKIUkh-+P?OmFiuPJOqev~P>E+ykNuMaSPXc_-p=(Z87q43w6#r)W<5%~uZYWuo{p0wz*BfMxS(U^vIL7VCf;tZDq4-z_`ycGQ SQS*RN!r + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    View Member List
    +
    +
    + +

    This is the complete list of members for View, including all inherited members.

    + + + + + + + + + + + + + + + + + + +
    calls (defined in View)Viewprotected
    draw(void)=0 (defined in View)Viewpure virtual
    getWinContext(void) (defined in View)Viewstatic
    height (defined in View)Viewprotected
    KEY_ENT (defined in View)Viewprotectedstatic
    keypress(int &key)=0 (defined in View)Viewpure virtual
    repaint(void) (defined in View)Viewvirtual
    setTitle(std::string title) (defined in View)Viewvirtual
    setWinContext(WINDOW *win) (defined in View)Viewstatic
    start_x (defined in View)Viewprotected
    start_y (defined in View)Viewprotected
    str_split(const std::string &str, const std::string delim) (defined in View)Viewstatic
    title (defined in View)Viewprotected
    View(void) (defined in View)View
    width (defined in View)Viewprotected
    win (defined in View)Viewprotectedstatic
    ~View(void) (defined in View)Viewvirtual
    + + + + diff --git a/docs/html/classView.html b/docs/html/classView.html new file mode 100644 index 0000000..fa71626 --- /dev/null +++ b/docs/html/classView.html @@ -0,0 +1,165 @@ + + + + + + + +B15F: View Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    + +

    #include <view.h>

    +
    + + Inheritance diagram for View:
    +
    +
    + + + + + + + + + + + +

    +Public Member Functions

    +virtual void setTitle (std::string title)
     
    +virtual void repaint (void)
     
    +virtual void draw (void)=0
     
    +virtual call_t keypress (int &key)=0
     
    + + + + + + + +

    +Static Public Member Functions

    +static void setWinContext (WINDOW *win)
     
    +static WINDOW * getWinContext (void)
     
    +static std::vector< std::string > str_split (const std::string &str, const std::string delim)
     
    + + + + + + + + + + + + + +

    +Protected Attributes

    +int width
     
    +int height
     
    +int start_x = 0
     
    +int start_y = 0
     
    +std::string title
     
    +std::vector< call_t > calls
     
    + + + + + +

    +Static Protected Attributes

    +static WINDOW * win = nullptr
     
    +constexpr static int KEY_ENT = 10
     
    +

    Detailed Description

    +

    Base class for multiple views with the ncurses user interface.

    + +

    Definition at line 19 of file view.h.

    +

    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/classView.png b/docs/html/classView.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf3f8ec4f16d3e0e3e78bbc7dee0f04ac962aaf GIT binary patch literal 1094 zcmeAS@N?(olHy`uVBq!ia0y~yVAKGzJ2;quWb&rALLem(;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z!i)&*QPIUC6svrKrsS^$GvBa;D_NJHQPhMqjOtMVTz z{{GnYo{RNEV0rbIdG33%+O}VlI1pyu_G&*XSHexERe21z@8(^7ecyTR+0WVm4B5U5 zUL7#t*l_jjf>(#Wf7{8o;dbxBU!nQ|4DmWBhBL7yh-fe@c3_l<)8^9yeRGo z4Bxm#4ix4}Yc?EaVlB9HSTl&hot5i=mJhPK5L$s!8bDLU8?tV1+v~%S{&jYBZDS;c zJi<#DQs!-1OGWl?n-cU!&(wS3lHyr$O)7IQuTSHgq9QA%;c3J*MMaX;Yf{g)1+zYG z{qGobSIznCsl4|>W$G1mo|mG!Wlu+bJ9l?(&GQ`T`cfWM&&{u1=uPGX(z`CMEv{z* zGSZ&MHBVaNI=lbgXZ|?b_l~kJ>Rz_(s@`1ty}?dzns_fZnWRB z{O-NDZ-3n{;}F@3+MpWoEX#x67hF4MTRyXc4+Xo+0cfC|{yM5OD-PM=2h3`!~I^&&f%cLdyOBqx><6net zX7QTD#|;fRU>LYHPEuLy;5jL9fy&7jjGZUteg1jtO#-C>@h#)uC@x&?~DMW-b z=mi5K92UVaXP$O4eVqNjdC9I`=kD0o?e~FRNi#isZtLFd&9Bz|xO#aBpU=Wwv5#+j zzWw>czlP)a=FL((S|PHM{TWMMntizURyK5h?`@{6vLmal*Hj&zeA(XX^Y$|`iAeF?cjOoI=Vxk;iVBUDW$}41u(QU8&-ee Ze<9&_e`9|{2Qbq!c)I$ztaD0e0stQD%u@gW literal 0 HcmV?d00001 diff --git a/docs/html/classViewInfo-members.html b/docs/html/classViewInfo-members.html new file mode 100644 index 0000000..8c6fde2 --- /dev/null +++ b/docs/html/classViewInfo-members.html @@ -0,0 +1,107 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    ViewInfo Member List
    +
    +
    + +

    This is the complete list of members for ViewInfo, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    calls (defined in View)Viewprotected
    close_offset_x (defined in ViewInfo)ViewInfoprotected
    close_offset_y (defined in ViewInfo)ViewInfoprotected
    draw(void) override (defined in ViewInfo)ViewInfovirtual
    getWinContext(void) (defined in View)Viewstatic
    height (defined in View)Viewprotected
    KEY_ENT (defined in View)Viewprotectedstatic
    keypress(int &key) override (defined in ViewInfo)ViewInfovirtual
    label_close (defined in ViewInfo)ViewInfoprotected
    repaint(void) (defined in View)Viewvirtual
    setCall(call_t call) (defined in ViewInfo)ViewInfovirtual
    setLabelClose(std::string label) (defined in ViewInfo)ViewInfovirtual
    setText(std::string text) (defined in ViewInfo)ViewInfovirtual
    setTitle(std::string title) (defined in View)Viewvirtual
    setWinContext(WINDOW *win) (defined in View)Viewstatic
    start_x (defined in View)Viewprotected
    start_y (defined in View)Viewprotected
    str_split(const std::string &str, const std::string delim) (defined in View)Viewstatic
    text (defined in ViewInfo)ViewInfoprotected
    text_offset_x (defined in ViewInfo)ViewInfoprotectedstatic
    text_offset_y (defined in ViewInfo)ViewInfoprotectedstatic
    title (defined in View)Viewprotected
    View(void) (defined in View)View
    ViewInfo(void) (defined in ViewInfo)ViewInfo
    width (defined in View)Viewprotected
    win (defined in View)Viewprotectedstatic
    ~View(void) (defined in View)Viewvirtual
    + + + + diff --git a/docs/html/classViewInfo.html b/docs/html/classViewInfo.html new file mode 100644 index 0000000..204d1a1 --- /dev/null +++ b/docs/html/classViewInfo.html @@ -0,0 +1,193 @@ + + + + + + + +B15F: ViewInfo Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    + +

    #include <view_info.h>

    +
    + + Inheritance diagram for ViewInfo:
    +
    +
    + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    +virtual void setText (std::string text)
     
    +virtual void setLabelClose (std::string label)
     
    +virtual void setCall (call_t call)
     
    +virtual void draw (void) override
     
    +virtual call_t keypress (int &key) override
     
    - Public Member Functions inherited from View
    +virtual void setTitle (std::string title)
     
    +virtual void repaint (void)
     
    + + + + + + + + + + + + + + + + + + + + + + +

    +Protected Attributes

    +std::string text
     
    +std::string label_close
     
    +int close_offset_x = 0
     
    +int close_offset_y = 0
     
    - Protected Attributes inherited from View
    +int width
     
    +int height
     
    +int start_x = 0
     
    +int start_y = 0
     
    +std::string title
     
    +std::vector< call_t > calls
     
    + + + + + + + + + + +

    +Static Protected Attributes

    +constexpr static int text_offset_x = 2
     
    +constexpr static int text_offset_y = 3
     
    - Static Protected Attributes inherited from View
    +static WINDOW * win = nullptr
     
    +constexpr static int KEY_ENT = 10
     
    + + + + + + + + +

    +Additional Inherited Members

    - Static Public Member Functions inherited from View
    +static void setWinContext (WINDOW *win)
     
    +static WINDOW * getWinContext (void)
     
    +static std::vector< std::string > str_split (const std::string &str, const std::string delim)
     
    +

    Detailed Description

    +

    View for simple text message output.

    + +

    Definition at line 8 of file view_info.h.

    +

    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/classViewInfo.png b/docs/html/classViewInfo.png new file mode 100644 index 0000000000000000000000000000000000000000..aad65ce79768ec3eed5393cc37cbd928531a73f8 GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^!9d)>!3-qVOjW-Jq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgcYC@xhEy=VoqKUovjUGRzq#?h|LW_z zI-*uxIo3XR*4le5mgMQ3vwInKDX744 zQq&jg&rdniWhY&Ew(9-PO_9d6d*+%(IC*9j{;Yc!w|rjwXW{gBySsxY*{RH#^yGNI z_1QBuj4zTI3Z5}OH~8T#U(n}O{!;i{{pIfkOcp|Z4EBdOAGljE{^3w>kblUsLuKid zIf{%sKoU{s=JXUlE}Wh5M*o2Ja=!*<)7tud&u%WyNYz@-_IbMHtkY+VH^_#cySk)TW2>HiI`1_3&+Cf+Tgm>o6=`+5tnNa2gFeU-`*%K?s__iJ zBpBvY9 + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    ViewMonitor Member List
    +
    +
    + +

    This is the complete list of members for ViewMonitor, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    calls (defined in View)Viewprotected
    close_offset_x (defined in ViewInfo)ViewInfoprotected
    close_offset_y (defined in ViewInfo)ViewInfoprotected
    draw(void) override (defined in ViewInfo)ViewInfovirtual
    getWinContext(void) (defined in View)Viewstatic
    height (defined in View)Viewprotected
    KEY_ENT (defined in View)Viewprotectedstatic
    keypress(int &key) override (defined in ViewMonitor)ViewMonitorvirtual
    label_close (defined in ViewInfo)ViewInfoprotected
    repaint(void) (defined in View)Viewvirtual
    run_worker (defined in ViewMonitor)ViewMonitorprotected
    setCall(call_t call) (defined in ViewInfo)ViewInfovirtual
    setLabelClose(std::string label) (defined in ViewInfo)ViewInfovirtual
    setText(std::string text) (defined in ViewInfo)ViewInfovirtual
    setTitle(std::string title) (defined in View)Viewvirtual
    setWinContext(WINDOW *win) (defined in View)Viewstatic
    start_x (defined in View)Viewprotected
    start_y (defined in View)Viewprotected
    str_split(const std::string &str, const std::string delim) (defined in View)Viewstatic
    t_worker (defined in ViewMonitor)ViewMonitorprotected
    text (defined in ViewInfo)ViewInfoprotected
    text_offset_x (defined in ViewInfo)ViewInfoprotectedstatic
    text_offset_y (defined in ViewInfo)ViewInfoprotectedstatic
    title (defined in View)Viewprotected
    View(void) (defined in View)View
    ViewInfo(void) (defined in ViewInfo)ViewInfo
    ViewMonitor(void) (defined in ViewMonitor)ViewMonitor
    width (defined in View)Viewprotected
    win (defined in View)Viewprotectedstatic
    worker(void) (defined in ViewMonitor)ViewMonitorprotectedvirtual
    ~View(void) (defined in View)Viewvirtual
    + + + + diff --git a/docs/html/classViewMonitor.html b/docs/html/classViewMonitor.html new file mode 100644 index 0000000..91b330c --- /dev/null +++ b/docs/html/classViewMonitor.html @@ -0,0 +1,205 @@ + + + + + + + +B15F: ViewMonitor Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    + +

    #include <view_monitor.h>

    +
    + + Inheritance diagram for ViewMonitor:
    +
    +
    + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    +virtual call_t keypress (int &key) override
     
    - Public Member Functions inherited from ViewInfo
    +virtual void setText (std::string text)
     
    +virtual void setLabelClose (std::string label)
     
    +virtual void setCall (call_t call)
     
    +virtual void draw (void) override
     
    - Public Member Functions inherited from View
    +virtual void setTitle (std::string title)
     
    +virtual void repaint (void)
     
    + + + +

    +Protected Member Functions

    +virtual void worker (void)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Protected Attributes

    +volatile bool run_worker = true
     
    +std::thread t_worker
     
    - Protected Attributes inherited from ViewInfo
    +std::string text
     
    +std::string label_close
     
    +int close_offset_x = 0
     
    +int close_offset_y = 0
     
    - Protected Attributes inherited from View
    +int width
     
    +int height
     
    +int start_x = 0
     
    +int start_y = 0
     
    +std::string title
     
    +std::vector< call_t > calls
     
    + + + + + + + + + + + + + + + + + + +

    +Additional Inherited Members

    - Static Public Member Functions inherited from View
    +static void setWinContext (WINDOW *win)
     
    +static WINDOW * getWinContext (void)
     
    +static std::vector< std::string > str_split (const std::string &str, const std::string delim)
     
    - Static Protected Attributes inherited from ViewInfo
    +constexpr static int text_offset_x = 2
     
    +constexpr static int text_offset_y = 3
     
    - Static Protected Attributes inherited from View
    +static WINDOW * win = nullptr
     
    +constexpr static int KEY_ENT = 10
     
    +

    Detailed Description

    +

    View to display all B15 inputs.

    + +

    Definition at line 13 of file view_monitor.h.

    +

    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/classViewMonitor.png b/docs/html/classViewMonitor.png new file mode 100644 index 0000000000000000000000000000000000000000..08ea716e04e938e5dddd2d9d3076d70a155ddce2 GIT binary patch literal 552 zcmeAS@N?(olHy`uVBq!ia0vp^!9d)>!3-qVOjW-Jq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgw|lxchEy=Vof|m0S%HVmJU;EufBT=S zIs*E`ULS2gw{$YA^h+t8+T(X^C1NHyc`jEu`te?7sgC%hlBUUio>pfM-b=sRww5(q zCG$vS`pkC)+a@eAbg$K)sypka@Y|eDQ%z50zVpv77g~KbvoD;suiZlRrSm0C&%!^& z%Xe4nFg%~Z(6sZQrSHc}(sTGzcYNV{e*KH>T!zLa!U}yQOh+dAHCSBY6mYj<6fP@c=sK4T_pGh@pn zpexPNXUaW(AZhyb^|jSctJM$m9e?>kZ9#YWxzu|z>hB5dE#4Vg{Mlr^4)?0;7ctY# z(@$R!Wvg8?b)u-16+1q@Rpyek(7u-*LDF7_AJRu6{1-oD!M<-|76z literal 0 HcmV?d00001 diff --git a/docs/html/classViewPromt-members.html b/docs/html/classViewPromt-members.html new file mode 100644 index 0000000..7209583 --- /dev/null +++ b/docs/html/classViewPromt-members.html @@ -0,0 +1,113 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    ViewPromt Member List
    +
    +
    + +

    This is the complete list of members for ViewPromt, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    button_offset_x (defined in ViewPromt)ViewPromtprotected
    button_offset_y (defined in ViewPromt)ViewPromtprotected
    call_confirm (defined in ViewPromt)ViewPromtprotected
    calls (defined in View)Viewprotected
    cancelable (defined in ViewPromt)ViewPromtprotected
    draw(void) override (defined in ViewPromt)ViewPromtvirtual
    getInput(void) (defined in ViewPromt)ViewPromtvirtual
    getWinContext(void) (defined in View)Viewstatic
    height (defined in View)Viewprotected
    input (defined in ViewPromt)ViewPromtprotected
    KEY_ENT (defined in View)Viewprotectedstatic
    keypress(int &key) override (defined in ViewPromt)ViewPromtvirtual
    label_cancel (defined in ViewPromt)ViewPromtprotected
    label_confirm (defined in ViewPromt)ViewPromtprotected
    message (defined in ViewPromt)ViewPromtprotected
    repaint(void) (defined in View)Viewvirtual
    selection (defined in ViewPromt)ViewPromtprotected
    sep (defined in ViewPromt)ViewPromtprotected
    setCancel(std::string name, bool cancelable) (defined in ViewPromt)ViewPromtvirtual
    setConfirm(std::string name, call_t call) (defined in ViewPromt)ViewPromtvirtual
    setMessage(std::string message) (defined in ViewPromt)ViewPromtvirtual
    setTitle(std::string title) (defined in View)Viewvirtual
    setWinContext(WINDOW *win) (defined in View)Viewstatic
    start_x (defined in View)Viewprotected
    start_y (defined in View)Viewprotected
    str_split(const std::string &str, const std::string delim) (defined in View)Viewstatic
    text_offset_x (defined in ViewPromt)ViewPromtprotectedstatic
    text_offset_y (defined in ViewPromt)ViewPromtprotectedstatic
    title (defined in View)Viewprotected
    View(void) (defined in View)View
    width (defined in View)Viewprotected
    win (defined in View)Viewprotectedstatic
    ~View(void) (defined in View)Viewvirtual
    + + + + diff --git a/docs/html/classViewPromt.html b/docs/html/classViewPromt.html new file mode 100644 index 0000000..c896e6b --- /dev/null +++ b/docs/html/classViewPromt.html @@ -0,0 +1,213 @@ + + + + + + + +B15F: ViewPromt Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    + +

    #include <view_promt.h>

    +
    + + Inheritance diagram for ViewPromt:
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    +virtual void draw (void) override
     
    +virtual void setMessage (std::string message)
     
    +virtual void setConfirm (std::string name, call_t call)
     
    +virtual void setCancel (std::string name, bool cancelable)
     
    +virtual std::string getInput (void)
     
    +virtual call_t keypress (int &key) override
     
    - Public Member Functions inherited from View
    +virtual void setTitle (std::string title)
     
    +virtual void repaint (void)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Protected Attributes

    +size_t selection = 1
     
    +std::string input
     
    +std::string message = "Input"
     
    +std::string label_confirm = "[ OK ]"
     
    +std::string sep = " "
     
    +std::string label_cancel = "[ Cancel ]"
     
    +call_t call_confirm = nullptr
     
    +bool cancelable = true
     
    +int button_offset_x = 0
     
    +int button_offset_y = 0
     
    - Protected Attributes inherited from View
    +int width
     
    +int height
     
    +int start_x = 0
     
    +int start_y = 0
     
    +std::string title
     
    +std::vector< call_t > calls
     
    + + + + + + + + + + +

    +Static Protected Attributes

    +constexpr static int text_offset_x = 2
     
    +constexpr static int text_offset_y = 2
     
    - Static Protected Attributes inherited from View
    +static WINDOW * win = nullptr
     
    +constexpr static int KEY_ENT = 10
     
    + + + + + + + + +

    +Additional Inherited Members

    - Static Public Member Functions inherited from View
    +static void setWinContext (WINDOW *win)
     
    +static WINDOW * getWinContext (void)
     
    +static std::vector< std::string > str_split (const std::string &str, const std::string delim)
     
    +

    Detailed Description

    +

    View for basic user text input.

    + +

    Definition at line 10 of file view_promt.h.

    +

    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/classViewPromt.png b/docs/html/classViewPromt.png new file mode 100644 index 0000000000000000000000000000000000000000..525a1d7ad4319e9d11da58d27a0af6e1625f9d13 GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^9zYzx!3-pOw;gTc>RXezk_qR%(!5#&ICMi=hTe{o8%wj1Cje1KVJh2f?nD zzij-E?9^gVzw&o4$AaYUxS3TK&BCv-L@nsrmU>Q4|MYh5z}xq_XVt$wptM`CwztUb zc=@XrtFF~m-oLT`x5E{t`#1Z$`eZMB_6YGR)LIp~n%zQQ_W%RX?9KNQjW>V)!?59} WKw#*X`DMTmWAJqKb6Mw<&;$Sl$ELIZ literal 0 HcmV?d00001 diff --git a/docs/html/classViewSelection-members.html b/docs/html/classViewSelection-members.html new file mode 100644 index 0000000..d819e76 --- /dev/null +++ b/docs/html/classViewSelection-members.html @@ -0,0 +1,102 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    ViewSelection Member List
    +
    +
    + +

    This is the complete list of members for ViewSelection, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + +
    addChoice(std::string name, call_t call) (defined in ViewSelection)ViewSelectionvirtual
    calls (defined in View)Viewprotected
    choice_offset_x (defined in ViewSelection)ViewSelectionprotectedstatic
    choice_offset_y (defined in ViewSelection)ViewSelectionprotectedstatic
    choices (defined in ViewSelection)ViewSelectionprotected
    draw(void) override (defined in ViewSelection)ViewSelectionvirtual
    getWinContext(void) (defined in View)Viewstatic
    height (defined in View)Viewprotected
    KEY_ENT (defined in View)Viewprotectedstatic
    keypress(int &key) override (defined in ViewSelection)ViewSelectionvirtual
    repaint(void) (defined in View)Viewvirtual
    selection (defined in ViewSelection)ViewSelectionprotected
    setTitle(std::string title) (defined in View)Viewvirtual
    setWinContext(WINDOW *win) (defined in View)Viewstatic
    start_x (defined in View)Viewprotected
    start_y (defined in View)Viewprotected
    str_split(const std::string &str, const std::string delim) (defined in View)Viewstatic
    title (defined in View)Viewprotected
    View(void) (defined in View)View
    width (defined in View)Viewprotected
    win (defined in View)Viewprotectedstatic
    ~View(void) (defined in View)Viewvirtual
    + + + + diff --git a/docs/html/classViewSelection.html b/docs/html/classViewSelection.html new file mode 100644 index 0000000..0af6fb2 --- /dev/null +++ b/docs/html/classViewSelection.html @@ -0,0 +1,180 @@ + + + + + + + +B15F: ViewSelection Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    + +

    #include <view_selection.h>

    +
    + + Inheritance diagram for ViewSelection:
    +
    +
    + + + + + + + + + + + + + + +

    +Public Member Functions

    +virtual void draw (void) override
     
    +virtual void addChoice (std::string name, call_t call)
     
    +virtual call_t keypress (int &key) override
     
    - Public Member Functions inherited from View
    +virtual void setTitle (std::string title)
     
    +virtual void repaint (void)
     
    + + + + + + + + + + + + + + + + + + +

    +Protected Attributes

    +size_t selection = 0
     
    +std::vector< std::string > choices
     
    - Protected Attributes inherited from View
    +int width
     
    +int height
     
    +int start_x = 0
     
    +int start_y = 0
     
    +std::string title
     
    +std::vector< call_t > calls
     
    + + + + + + + + + + +

    +Static Protected Attributes

    +constexpr static int choice_offset_x = 2
     
    +constexpr static int choice_offset_y = 3
     
    - Static Protected Attributes inherited from View
    +static WINDOW * win = nullptr
     
    +constexpr static int KEY_ENT = 10
     
    + + + + + + + + +

    +Additional Inherited Members

    - Static Public Member Functions inherited from View
    +static void setWinContext (WINDOW *win)
     
    +static WINDOW * getWinContext (void)
     
    +static std::vector< std::string > str_split (const std::string &str, const std::string delim)
     
    +

    Detailed Description

    +

    View for user selection input.

    + +

    Definition at line 10 of file view_selection.h.

    +

    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/classViewSelection.png b/docs/html/classViewSelection.png new file mode 100644 index 0000000000000000000000000000000000000000..53db457549061d2bf812fb126b706a61b545e1e8 GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^F+d!^!3-o9e|{tgq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgojhF}Ln;{G&SlJNRS;lpcYpM^|IT`a z72UdK^|wu8AFqf^o$yq)VNUV4CLK?^mY7LA`*r<)Z?*Bbq~iZ%(wB~z+t%E3TjhOY z;u34QQ>V{{-t+g|m9C}xG~WDv)sBPu;mDT>oo znz!3LpEH-C;sDcw*5x&kGH>U7ntuEIJFWkRGdV3ARG%=kO<}iy%?9#e46Q& z`0sYp3%_q~JGF3+_IIcF@XFd>AA(-{{&K042>$B)^K8rXEmw|jI%oAiarL>c-@e4$ z + + + + + + +B15F: Class Index + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Class Index
    +
    +
    +
    b | d | p | t | u | v
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      b  
    +
    DriverException   
      u  
    +
    ViewInfo   
      p  
    +
    ViewMonitor   
    B15F   USART   ViewPromt   
      d  
    +
    PlottyFile   USARTException   ViewSelection   
      t  
    +
      v  
    +
    Dot   
    TimeoutException   View   
    +
    b | d | p | t | u | v
    +
    + + + + diff --git a/docs/html/cli_8cpp_source.html b/docs/html/cli_8cpp_source.html new file mode 100644 index 0000000..ae2abad --- /dev/null +++ b/docs/html/cli_8cpp_source.html @@ -0,0 +1,80 @@ + + + + + + + +B15F: cli.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    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
    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 }
    + +
    static B15F & getInstance(void)
    Definition: b15f.cpp:373
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:415
    + + + + diff --git a/docs/html/closed.png b/docs/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html new file mode 100644 index 0000000..871f95a --- /dev/null +++ b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: ui Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    ui Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html b/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html new file mode 100644 index 0000000..a53fe67 --- /dev/null +++ b/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/3.14.3/CompilerIdC Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    CompilerIdC Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html b/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html new file mode 100644 index 0000000..f86514e --- /dev/null +++ b/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/3.14.3 Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    3.14.3 Directory Reference
    +
    +
    + + +

    +Directories

    +
    + + + + diff --git a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html new file mode 100644 index 0000000..878320b --- /dev/null +++ b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: drv Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    drv Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html b/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html new file mode 100644 index 0000000..7a3fec8 --- /dev/null +++ b/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/3.14.3/CompilerIdCXX Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    CompilerIdCXX Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html b/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html new file mode 100644 index 0000000..4c678a4 --- /dev/null +++ b/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: cmake-build-debug Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    cmake-build-debug Directory Reference
    +
    +
    + + +

    +Directories

    +
    + + + + diff --git a/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html b/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html new file mode 100644 index 0000000..324da84 --- /dev/null +++ b/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    CMakeFiles Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/doc.png b/docs/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/docs/html/dot_8cpp_source.html b/docs/html/dot_8cpp_source.html new file mode 100644 index 0000000..d4fc2e5 --- /dev/null +++ b/docs/html/dot_8cpp_source.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: drv/dot.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    dot.cpp
    +
    +
    +
    1 #include "dot.h"
    2 
    3 Dot::Dot(uint16_t x, uint16_t y, uint8_t curve) : x(x), y(y), curve(curve)
    4 {
    5  if(curve >= 64)
    6  throw std::range_error("Kurvenindex muss im Bereich [0, 63] liegen");
    7 }
    8 
    9 uint16_t Dot::getX() const
    10 {
    11  return x;
    12 }
    13 
    14 uint16_t Dot::getY() const
    15 {
    16  return y;
    17 }
    18 
    19 uint8_t Dot::getCurve(void) const
    20 {
    21  return curve;
    22 }
    +
    uint16_t getX(void) const
    Definition: dot.cpp:9
    +
    uint16_t getY(void) const
    Definition: dot.cpp:14
    +
    uint8_t getCurve(void) const
    Definition: dot.cpp:19
    +
    Dot(uint16_t x, uint16_t y, uint8_t curve)
    Definition: dot.cpp:3
    + + + + diff --git a/docs/html/dot_8h_source.html b/docs/html/dot_8h_source.html new file mode 100644 index 0000000..1b7d1f7 --- /dev/null +++ b/docs/html/dot_8h_source.html @@ -0,0 +1,86 @@ + + + + + + + +B15F: drv/dot.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    dot.h
    +
    +
    +
    1 #ifndef DOT_H
    2 #define DOT_H
    3 
    4 #include <cstdint>
    5 #include <stdexcept>
    6 
    12 class Dot
    13 {
    14 public:
    18  Dot(uint16_t x, uint16_t y, uint8_t curve);
    19 
    23  uint16_t getX(void) const;
    24 
    28  uint16_t getY(void) const;
    29 
    33  uint8_t getCurve(void) const;
    34 
    35 private:
    36  uint16_t x, y;
    37  uint8_t curve;
    38 };
    39 
    40 
    41 #endif // DOT_H
    +
    uint16_t getX(void) const
    Definition: dot.cpp:9
    +
    Definition: dot.h:12
    +
    uint16_t getY(void) const
    Definition: dot.cpp:14
    +
    uint8_t getCurve(void) const
    Definition: dot.cpp:19
    +
    Dot(uint16_t x, uint16_t y, uint8_t curve)
    Definition: dot.cpp:3
    + + + + diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css new file mode 100644 index 0000000..5bc13aa --- /dev/null +++ b/docs/html/doxygen.css @@ -0,0 +1,1766 @@ +/* The standard CSS for doxygen 1.8.16 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #FFFFFF; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/docs/html/doxygen.png b/docs/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 zcmV;!4m|ORP)tMIv#Q0*~7*`IBSO7_x;@a8#Zk6_PeKR_s92J&)(m+);m9Iz3blw)z#Gi zP!9lj4$%+*>Hz@HCmM9L9|8c+0u=!H$O3?R0Kgx|#WP<6fKfC8fM-CQZT|_r@`>VO zX^Hgb|9cJqpdJA5$MCEK`F_2@2Y@s>^+;pF`~jdI0Pvr|vl4`=C)EH@1IFe7pdJ8F zH(qGi004~QnF)Ggga~8v08kGAs2hKTATxr7pwfNk|4#_AaT>w8P6TV+R2kbS$v==} zAjf`s0g#V8lB+b3)5oEI*q+{Yt$MZDruD2^;$+(_%Qn+%v0X-bJO=;@kiJ^ygLBnC z?1OVv_%aex1M@jKU|Z~$eI?PoF4Vj>fDzyo zAiLfpXY*a^Sj-S5D0S3@#V$sRW)g)_1e#$%8xdM>Jm7?!h zu0P2X=xoN>^!4DoPRgph2(2va07yfpXF+WH7EOg1GY%Zn z7~1A<(z7Q$ktEXhW_?GMpHp9l_UL18F3KOsxu81pqoBiNbFSGsof-W z6~eloMoz=4?OOnl2J268x5rOY`dCk0us(uS#Ud4yqOr@?=Q57a}tit|BhY>}~frH1sP`ScHS_d)oqH^lYy zZ%VP`#10MlE~P?cE(%(#(AUSv_T{+;t@$U}El}(1ig`vZo`Rm;+5&(AYzJ^Ae=h2X z@Re%vHwZU>|f0NI&%$*4eJweC5OROQrpPMA@*w|o z()A==l}(@bv^&>H1Ob3C=<^|hob?0+xJ?QQ3-ueQC}zy&JQNib!OqSO@-=>XzxlSF zAZ^U*1l6EEmg3r};_HY>&Jo_{dOPEFTWPmt=U&F#+0(O59^UIlHbNX+eF8UzyDR*T z(=5X$VF3!gm@RooS-&iiUYGG^`hMR(07zr_xP`d!^BH?uD>Phl8Rdifx3Af^Zr`Ku ztL+~HkVeL#bJ)7;`=>;{KNRvjmc}1}c58Sr#Treq=4{xo!ATy|c>iRSp4`dzMMVd@ zL8?uwXDY}Wqgh4mH`|$BTXpUIu6A1-cSq%hJw;@^Zr8TP=GMh*p(m(tN7@!^D~sl$ zz^tf4II4|};+irE$Fnm4NTc5%p{PRA`%}Zk`CE5?#h3|xcyQsS#iONZ z6H(@^i9td!$z~bZiJLTax$o>r(p}3o@< zyD7%(>ZYvy=6$U3e!F{Z`uSaYy`xQyl?b{}eg|G3&fz*`QH@mDUn)1%#5u`0m$%D} z?;tZ0u(mWeMV0QtzjgN!lT*pNRj;6510Wwx?Yi_=tYw|J#7@(Xe7ifDzXuK;JB;QO z#bg~K$cgm$@{QiL_3yr}y&~wuv=P=#O&Tj=Sr)aCUlYmZMcw?)T?c%0rUe1cS+o!qs_ zQ6Gp)-{)V!;=q}llyK3|^WeLKyjf%y;xHku;9(vM!j|~<7w1c*Mk-;P{T&yG) z@C-8E?QPynNQ<8f01D`2qexcVEIOU?y}MG)TAE6&VT5`rK8s(4PE;uQ92LTXUQ<>^ ztyQ@=@kRdh@ebUG^Z6NWWIL;_IGJ2ST>$t!$m$qvtj0Qmw8moN6GUV^!QKNK zHBXCtUH8)RY9++gH_TUV4^=-j$t}dD3qsN7GclJ^Zc&(j6&a_!$jCf}%c5ey`pm~1)@{yI3 zTdWyB+*X{JFw#z;PwRr5evb2!ueWF;v`B0HoUu4-(~aL=z;OXUUEtG`_$)Oxw6FKg zEzY`CyKaSBK3xt#8gA|r_|Kehn_HYVBMpEwbn9-fI*!u*eTA1ef8Mkl1=!jV4oYwWYM}i`A>_F4nhmlCIC6WLa zY%;4&@AlnaG11ejl61Jev21|r*m+?Kru3;1tFDl}#!OzUp6c>go4{C|^erwpG*&h6bspUPJag}oOkN2912Y3I?(eRc@U9>z#HPBHC?nps7H5!zP``90!Q1n80jo+B3TWXp!8Pe zwuKuLLI6l3Gv@+QH*Y}2wPLPQ1^EZhT#+Ed8q8Wo z1pTmIBxv14-{l&QVKxAyQF#8Q@NeJwWdKk>?cpiJLkJr+aZ!Me+Cfp!?FWSRf^j2k z73BRR{WSKaMkJ>1Nbx5dan5hg^_}O{Tj6u%iV%#QGz0Q@j{R^Ik)Z*+(YvY2ziBG)?AmJa|JV%4UT$k`hcOg5r9R?5>?o~JzK zJCrj&{i#hG>N7!B4kNX(%igb%kDj0fOQThC-8mtfap82PNRXr1D>lbgg)dYTQ(kbx z`Ee5kXG~Bh+BHQBf|kJEy6(ga%WfhvdQNDuOfQoe377l#ht&DrMGeIsI5C<&ai zWG$|hop2@@q5YDa)_-A?B02W;#fH!%k`daQLEItaJJ8Yf1L%8x;kg?)k)00P-lH+w z)5$QNV6r2$YtnV(4o=0^3{kmaXn*Dm0F*fU(@o)yVVjk|ln8ea6BMy%vZAhW9|wvA z8RoDkVoMEz1d>|5(k0Nw>22ZT){V<3$^C-cN+|~hKt2)){+l-?3m@-$c?-dlzQ)q- zZ)j%n^gerV{|+t}9m1_&&Ly!9$rtG4XX|WQ8`xYzGC~U@nYh~g(z9)bdAl#xH)xd5a=@|qql z|FzEil{P5(@gy!4ek05i$>`E^G~{;pnf6ftpLh$h#W?^#4UkPfa;;?bsIe&kz!+40 zI|6`F2n020)-r`pFaZ38F!S-lJM-o&inOw|66=GMeP@xQU5ghQH{~5Uh~TMTd;I9` z>YhVB`e^EVj*S7JF39ZgNf}A-0DwOcTT63ydN$I3b?yBQtUI*_fae~kPvzoD$zjX3 zoqBe#>12im4WzZ=f^4+u=!lA|#r%1`WB0-6*3BL#at`47#ebPpR|D1b)3BjT34nYY z%Ds%d?5$|{LgOIaRO{{oC&RK`O91$fqwM0(C_TALcozu*fWHb%%q&p-q{_8*2Zsi^ zh1ZCnr^UYa;4vQEtHk{~zi>wwMC5o{S=$P0X681y`SXwFH?Ewn{x-MOZynmc)JT5v zuHLwh;tLfxRrr%|k370}GofLl7thg>ACWWY&msqaVu&ry+`7+Ss>NL^%T1|z{IGMA zW-SKl=V-^{(f!Kf^#3(|T2W47d(%JVCI4JgRrT1pNz>+ietmFToNv^`gzC@&O-)+i zPQ~RwK8%C_vf%;%e>NyTp~dM5;!C|N0Q^6|CEb7Bw=Vz~$1#FA;Z*?mKSC)Hl-20s t8QyHj(g6VK0RYbl8UjE)0O0w=e*@m04r>stuEhWV002ovPDHLkV1hl;dM*F} literal 0 HcmV?d00001 diff --git a/docs/html/driverexception_8h_source.html b/docs/html/driverexception_8h_source.html new file mode 100644 index 0000000..9bffda7 --- /dev/null +++ b/docs/html/driverexception_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +B15F: drv/driverexception.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    driverexception.h
    +
    +
    +
    1 #ifndef DRIVEREXCEPTION_H
    2 #define DRIVEREXCEPTION_H
    3 
    4 #include <exception>
    5 
    6 // SOURCE: https://stackoverflow.com/a/8152888
    7 
    10 class DriverException: public std::exception
    11 {
    12 public:
    13  explicit DriverException(const char* message) : msg_(message)
    14  {
    15  }
    16 
    17  explicit DriverException(const std::string& message) : msg_(message)
    18  {
    19  }
    20 
    21  virtual ~DriverException() throw ()
    22  {
    23  }
    24 
    25  virtual const char* what() const throw ()
    26  {
    27  return msg_.c_str();
    28  }
    29 
    30 protected:
    31  std::string msg_;
    32 };
    33 
    34 #endif // DRIVEREXCEPTION_H
    35 
    + + + + + diff --git a/docs/html/dynsections.js b/docs/html/dynsections.js new file mode 100644 index 0000000..c8e84aa --- /dev/null +++ b/docs/html/dynsections.js @@ -0,0 +1,127 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +B15F: cmake-build-debug/CMakeFiles/feature_tests.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    feature_tests.c
    +
    +
    +
    1 
    2 const char features[] = {"\n"
    3  "C_FEATURE:"
    4 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304
    5  "1"
    6 #else
    7  "0"
    8 #endif
    9  "c_function_prototypes\n"
    10  "C_FEATURE:"
    11 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    12  "1"
    13 #else
    14  "0"
    15 #endif
    16  "c_restrict\n"
    17  "C_FEATURE:"
    18 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L
    19  "1"
    20 #else
    21  "0"
    22 #endif
    23  "c_static_assert\n"
    24  "C_FEATURE:"
    25 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    26  "1"
    27 #else
    28  "0"
    29 #endif
    30  "c_variadic_macros\n"
    31 
    32  };
    33 
    34 int main(int argc, char** argv)
    35 {
    36  (void)argv;
    37  return features[argc];
    38 }
    + + + + diff --git a/docs/html/feature__tests_8cxx_source.html b/docs/html/feature__tests_8cxx_source.html new file mode 100644 index 0000000..ee23257 --- /dev/null +++ b/docs/html/feature__tests_8cxx_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/feature_tests.cxx Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    feature_tests.cxx
    +
    +
    +
    1 
    2  const char features[] = {"\n"
    3 "CXX_FEATURE:"
    4 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
    5 "1"
    6 #else
    7 "0"
    8 #endif
    9 "cxx_aggregate_default_initializers\n"
    10 "CXX_FEATURE:"
    11 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    12 "1"
    13 #else
    14 "0"
    15 #endif
    16 "cxx_alias_templates\n"
    17 "CXX_FEATURE:"
    18 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    19 "1"
    20 #else
    21 "0"
    22 #endif
    23 "cxx_alignas\n"
    24 "CXX_FEATURE:"
    25 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    26 "1"
    27 #else
    28 "0"
    29 #endif
    30 "cxx_alignof\n"
    31 "CXX_FEATURE:"
    32 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    33 "1"
    34 #else
    35 "0"
    36 #endif
    37 "cxx_attributes\n"
    38 "CXX_FEATURE:"
    39 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    40 "1"
    41 #else
    42 "0"
    43 #endif
    44 "cxx_attribute_deprecated\n"
    45 "CXX_FEATURE:"
    46 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    47 "1"
    48 #else
    49 "0"
    50 #endif
    51 "cxx_auto_type\n"
    52 "CXX_FEATURE:"
    53 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    54 "1"
    55 #else
    56 "0"
    57 #endif
    58 "cxx_binary_literals\n"
    59 "CXX_FEATURE:"
    60 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    61 "1"
    62 #else
    63 "0"
    64 #endif
    65 "cxx_constexpr\n"
    66 "CXX_FEATURE:"
    67 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    68 "1"
    69 #else
    70 "0"
    71 #endif
    72 "cxx_contextual_conversions\n"
    73 "CXX_FEATURE:"
    74 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    75 "1"
    76 #else
    77 "0"
    78 #endif
    79 "cxx_decltype\n"
    80 "CXX_FEATURE:"
    81 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    82 "1"
    83 #else
    84 "0"
    85 #endif
    86 "cxx_decltype_auto\n"
    87 "CXX_FEATURE:"
    88 #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L
    89 "1"
    90 #else
    91 "0"
    92 #endif
    93 "cxx_decltype_incomplete_return_types\n"
    94 "CXX_FEATURE:"
    95 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    96 "1"
    97 #else
    98 "0"
    99 #endif
    100 "cxx_default_function_template_args\n"
    101 "CXX_FEATURE:"
    102 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    103 "1"
    104 #else
    105 "0"
    106 #endif
    107 "cxx_defaulted_functions\n"
    108 "CXX_FEATURE:"
    109 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    110 "1"
    111 #else
    112 "0"
    113 #endif
    114 "cxx_defaulted_move_initializers\n"
    115 "CXX_FEATURE:"
    116 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    117 "1"
    118 #else
    119 "0"
    120 #endif
    121 "cxx_delegating_constructors\n"
    122 "CXX_FEATURE:"
    123 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    124 "1"
    125 #else
    126 "0"
    127 #endif
    128 "cxx_deleted_functions\n"
    129 "CXX_FEATURE:"
    130 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    131 "1"
    132 #else
    133 "0"
    134 #endif
    135 "cxx_digit_separators\n"
    136 "CXX_FEATURE:"
    137 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    138 "1"
    139 #else
    140 "0"
    141 #endif
    142 "cxx_enum_forward_declarations\n"
    143 "CXX_FEATURE:"
    144 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    145 "1"
    146 #else
    147 "0"
    148 #endif
    149 "cxx_explicit_conversions\n"
    150 "CXX_FEATURE:"
    151 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    152 "1"
    153 #else
    154 "0"
    155 #endif
    156 "cxx_extended_friend_declarations\n"
    157 "CXX_FEATURE:"
    158 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    159 "1"
    160 #else
    161 "0"
    162 #endif
    163 "cxx_extern_templates\n"
    164 "CXX_FEATURE:"
    165 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    166 "1"
    167 #else
    168 "0"
    169 #endif
    170 "cxx_final\n"
    171 "CXX_FEATURE:"
    172 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    173 "1"
    174 #else
    175 "0"
    176 #endif
    177 "cxx_func_identifier\n"
    178 "CXX_FEATURE:"
    179 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    180 "1"
    181 #else
    182 "0"
    183 #endif
    184 "cxx_generalized_initializers\n"
    185 "CXX_FEATURE:"
    186 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    187 "1"
    188 #else
    189 "0"
    190 #endif
    191 "cxx_generic_lambdas\n"
    192 "CXX_FEATURE:"
    193 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    194 "1"
    195 #else
    196 "0"
    197 #endif
    198 "cxx_inheriting_constructors\n"
    199 "CXX_FEATURE:"
    200 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    201 "1"
    202 #else
    203 "0"
    204 #endif
    205 "cxx_inline_namespaces\n"
    206 "CXX_FEATURE:"
    207 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    208 "1"
    209 #else
    210 "0"
    211 #endif
    212 "cxx_lambdas\n"
    213 "CXX_FEATURE:"
    214 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    215 "1"
    216 #else
    217 "0"
    218 #endif
    219 "cxx_lambda_init_captures\n"
    220 "CXX_FEATURE:"
    221 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    222 "1"
    223 #else
    224 "0"
    225 #endif
    226 "cxx_local_type_template_args\n"
    227 "CXX_FEATURE:"
    228 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    229 "1"
    230 #else
    231 "0"
    232 #endif
    233 "cxx_long_long_type\n"
    234 "CXX_FEATURE:"
    235 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    236 "1"
    237 #else
    238 "0"
    239 #endif
    240 "cxx_noexcept\n"
    241 "CXX_FEATURE:"
    242 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    243 "1"
    244 #else
    245 "0"
    246 #endif
    247 "cxx_nonstatic_member_init\n"
    248 "CXX_FEATURE:"
    249 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    250 "1"
    251 #else
    252 "0"
    253 #endif
    254 "cxx_nullptr\n"
    255 "CXX_FEATURE:"
    256 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    257 "1"
    258 #else
    259 "0"
    260 #endif
    261 "cxx_override\n"
    262 "CXX_FEATURE:"
    263 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    264 "1"
    265 #else
    266 "0"
    267 #endif
    268 "cxx_range_for\n"
    269 "CXX_FEATURE:"
    270 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    271 "1"
    272 #else
    273 "0"
    274 #endif
    275 "cxx_raw_string_literals\n"
    276 "CXX_FEATURE:"
    277 #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L
    278 "1"
    279 #else
    280 "0"
    281 #endif
    282 "cxx_reference_qualified_functions\n"
    283 "CXX_FEATURE:"
    284 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
    285 "1"
    286 #else
    287 "0"
    288 #endif
    289 "cxx_relaxed_constexpr\n"
    290 "CXX_FEATURE:"
    291 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    292 "1"
    293 #else
    294 "0"
    295 #endif
    296 "cxx_return_type_deduction\n"
    297 "CXX_FEATURE:"
    298 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    299 "1"
    300 #else
    301 "0"
    302 #endif
    303 "cxx_right_angle_brackets\n"
    304 "CXX_FEATURE:"
    305 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    306 "1"
    307 #else
    308 "0"
    309 #endif
    310 "cxx_rvalue_references\n"
    311 "CXX_FEATURE:"
    312 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    313 "1"
    314 #else
    315 "0"
    316 #endif
    317 "cxx_sizeof_member\n"
    318 "CXX_FEATURE:"
    319 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    320 "1"
    321 #else
    322 "0"
    323 #endif
    324 "cxx_static_assert\n"
    325 "CXX_FEATURE:"
    326 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    327 "1"
    328 #else
    329 "0"
    330 #endif
    331 "cxx_strong_enums\n"
    332 "CXX_FEATURE:"
    333 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus
    334 "1"
    335 #else
    336 "0"
    337 #endif
    338 "cxx_template_template_parameters\n"
    339 "CXX_FEATURE:"
    340 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    341 "1"
    342 #else
    343 "0"
    344 #endif
    345 "cxx_thread_local\n"
    346 "CXX_FEATURE:"
    347 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    348 "1"
    349 #else
    350 "0"
    351 #endif
    352 "cxx_trailing_return_types\n"
    353 "CXX_FEATURE:"
    354 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    355 "1"
    356 #else
    357 "0"
    358 #endif
    359 "cxx_unicode_literals\n"
    360 "CXX_FEATURE:"
    361 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    362 "1"
    363 #else
    364 "0"
    365 #endif
    366 "cxx_uniform_initialization\n"
    367 "CXX_FEATURE:"
    368 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    369 "1"
    370 #else
    371 "0"
    372 #endif
    373 "cxx_unrestricted_unions\n"
    374 "CXX_FEATURE:"
    375 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    376 "1"
    377 #else
    378 "0"
    379 #endif
    380 "cxx_user_literals\n"
    381 "CXX_FEATURE:"
    382 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
    383 "1"
    384 #else
    385 "0"
    386 #endif
    387 "cxx_variable_templates\n"
    388 "CXX_FEATURE:"
    389 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    390 "1"
    391 #else
    392 "0"
    393 #endif
    394 "cxx_variadic_macros\n"
    395 "CXX_FEATURE:"
    396 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    397 "1"
    398 #else
    399 "0"
    400 #endif
    401 "cxx_variadic_templates\n"
    402 
    403 };
    404 
    405 int main(int argc, char** argv) { (void)argv; return features[argc]; }
    + + + + diff --git a/docs/html/files.html b/docs/html/files.html new file mode 100644 index 0000000..8c82b44 --- /dev/null +++ b/docs/html/files.html @@ -0,0 +1,117 @@ + + + + + + + +B15F: File List + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12345]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      cmake-build-debug
      CMakeFiles
      3.14.3
      CompilerIdC
     CMakeCCompilerId.c
      CompilerIdCXX
     CMakeCXXCompilerId.cpp
     feature_tests.c
     feature_tests.cxx
      drv
     b15f.cpp
     b15f.h
     backup.cpp
     dot.cpp
     dot.h
     driverexception.h
     plottyfile.cpp
     plottyfile.h
     timeoutexception.h
     usart.cpp
     usart.h
     usartexception.h
      ui
     ui.cpp
     ui.h
     view.cpp
     view.h
     view_info.cpp
     view_info.h
     view_monitor.cpp
     view_monitor.h
     view_promt.cpp
     view_promt.h
     view_selection.cpp
     view_selection.h
     cli.cpp
    +
    +
    + + + + diff --git a/docs/html/folderclosed.png b/docs/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/docs/html/functions.html b/docs/html/functions.html new file mode 100644 index 0000000..2c7fec8 --- /dev/null +++ b/docs/html/functions.html @@ -0,0 +1,377 @@ + + + + + + + +B15F: Class Members + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - a -

      +
    • abort() +: B15F +
    • +
    • activateSelfTestMode() +: B15F +
    • +
    • addDot() +: PlottyFile +
    • +
    • analogRead() +: B15F +
    • +
    • analogSequence() +: B15F +
    • +
    • analogWrite0() +: B15F +
    • +
    • analogWrite1() +: B15F +
    • +
    + + +

    - b -

      +
    • BAUDRATE +: B15F +
    • +
    + + +

    - c -

      +
    • clearInputBuffer() +: USART +
    • +
    • clearOutputBuffer() +: USART +
    • +
    • closeDevice() +: USART +
    • +
    + + +

    - d -

      +
    • delay_ms() +: B15F +
    • +
    • delay_us() +: B15F +
    • +
    • digitalRead0() +: B15F +
    • +
    • digitalRead1() +: B15F +
    • +
    • digitalWrite0() +: B15F +
    • +
    • digitalWrite1() +: B15F +
    • +
    • discard() +: B15F +
    • +
    • Dot() +: Dot +
    • +
    + + +

    - e -

      +
    • exec() +: B15F +
    • +
    + + +

    - f -

      +
    • flushOutputBuffer() +: USART +
    • +
    + + +

    - g -

    + + +

    - m -

    + + +

    - o -

      +
    • openDevice() +: USART +
    • +
    + + +

    - p -

      +
    • PRE +: B15F +
    • +
    • pwmSetFrequency() +: B15F +
    • +
    • pwmSetValue() +: B15F +
    • +
    + + +

    - r -

      +
    • readDipSwitch() +: B15F +
    • +
    • receive() +: USART +
    • +
    • reconnect() +: B15F +
    • +
    • RECONNECT_TIMEOUT +: B15F +
    • +
    • RECONNECT_TRIES +: B15F +
    • +
    + + +

    - s -

    + + +

    - t -

      +
    • testConnection() +: B15F +
    • +
    • testIntConv() +: B15F +
    • +
    • transmit() +: USART +
    • +
    + + +

    - u -

    + + +

    - w -

    + + +

    - ~ -

    +
    + + + + diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html new file mode 100644 index 0000000..8bfa8ab --- /dev/null +++ b/docs/html/functions_func.html @@ -0,0 +1,345 @@ + + + + + + + +B15F: Class Members - Functions + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - a -

      +
    • abort() +: B15F +
    • +
    • activateSelfTestMode() +: B15F +
    • +
    • addDot() +: PlottyFile +
    • +
    • analogRead() +: B15F +
    • +
    • analogSequence() +: B15F +
    • +
    • analogWrite0() +: B15F +
    • +
    • analogWrite1() +: B15F +
    • +
    + + +

    - c -

      +
    • clearInputBuffer() +: USART +
    • +
    • clearOutputBuffer() +: USART +
    • +
    • closeDevice() +: USART +
    • +
    + + +

    - d -

      +
    • delay_ms() +: B15F +
    • +
    • delay_us() +: B15F +
    • +
    • digitalRead0() +: B15F +
    • +
    • digitalRead1() +: B15F +
    • +
    • digitalWrite0() +: B15F +
    • +
    • digitalWrite1() +: B15F +
    • +
    • discard() +: B15F +
    • +
    • Dot() +: Dot +
    • +
    + + +

    - e -

      +
    • exec() +: B15F +
    • +
    + + +

    - f -

      +
    • flushOutputBuffer() +: USART +
    • +
    + + +

    - g -

    + + +

    - o -

      +
    • openDevice() +: USART +
    • +
    + + +

    - p -

      +
    • pwmSetFrequency() +: B15F +
    • +
    • pwmSetValue() +: B15F +
    • +
    + + +

    - r -

      +
    • readDipSwitch() +: B15F +
    • +
    • receive() +: USART +
    • +
    • reconnect() +: B15F +
    • +
    + + +

    - s -

    + + +

    - t -

      +
    • testConnection() +: B15F +
    • +
    • testIntConv() +: B15F +
    • +
    • transmit() +: USART +
    • +
    + + +

    - u -

    + + +

    - w -

    + + +

    - ~ -

    +
    + + + + diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html new file mode 100644 index 0000000..e93604a --- /dev/null +++ b/docs/html/functions_vars.html @@ -0,0 +1,99 @@ + + + + + + + +B15F: Class Members - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html new file mode 100644 index 0000000..ed00fde --- /dev/null +++ b/docs/html/hierarchy.html @@ -0,0 +1,94 @@ + + + + + + + +B15F: Class Hierarchy + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Class Hierarchy
    +
    +
    +
    This inheritance list is sorted roughly, but not completely, alphabetically:
    +
    [detail level 123]
    + + + + + + + + + + + + + +
     CB15F
     CDot
     Cexception
     CDriverException
     CTimeoutException
     CUSARTException
     CPlottyFile
     CUSART
     CView
     CViewInfo
     CViewMonitor
     CViewPromt
     CViewSelection
    +
    +
    + + + + diff --git a/docs/html/index.html b/docs/html/index.html new file mode 100644 index 0000000..fc7e07d --- /dev/null +++ b/docs/html/index.html @@ -0,0 +1,80 @@ + + + + + + + +B15F: Einführung + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Einführung
    +
    +
    +

    Die wichtigste Klasse für die Steuerung des Board 15 ist B15F.
    +Dort befindet sich auch eine Übersicht der verfügbaren Befehle.

    +
    +
    + + + + diff --git a/docs/html/jquery.js b/docs/html/jquery.js new file mode 100644 index 0000000..64861eb --- /dev/null +++ b/docs/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    plottyfile.cpp
    +
    +
    +
    1 #include "plottyfile.h"
    2 
    4 {
    5  dots.push_back(dot);
    6 }
    7 
    9 {
    10  dots.push_back(dot);
    11 }
    12 
    13 void PlottyFile::setFunctionType(FunctionType function_type)
    14 {
    15  this->function_type = function_type;
    16 }
    17 
    18 void PlottyFile::setQuadrant(uint8_t quadrant)
    19 {
    20  if(quadrant < 1 || quadrant > 4)
    21  throw std::range_error("Ungueltiger Quadrant");
    22  this->quadrant = quadrant;
    23 }
    24 
    25 void PlottyFile::setRefX(uint16_t ref_x)
    26 {
    27  this->ref_x = ref_x;
    28 }
    29 
    30 void PlottyFile::setRefY(uint16_t ref_y)
    31 {
    32  this->ref_y = ref_y;
    33 }
    34 
    35 void PlottyFile::setParaFirstCurve(uint16_t para_first)
    36 {
    37  this->para_first = para_first;
    38 }
    39 
    40 void PlottyFile::setParaStepWidth(uint16_t para_stepwidth)
    41 {
    42  this->para_stepwidth = para_stepwidth;
    43 }
    44 
    45 void PlottyFile::setUnitX(std::string unit_x)
    46 {
    47  this->unit_x = unit_x;
    48 }
    49 
    50 void PlottyFile::setDescX(std::string desc_x)
    51 {
    52  this->desc_x = desc_x;
    53 }
    54 
    55 void PlottyFile::setUnitY(std::string unit_y)
    56 {
    57  this->unit_y = unit_y;
    58 }
    59 
    60 void PlottyFile::setDescY(std::string desc_y)
    61 {
    62  this->desc_y = desc_y;
    63 }
    64 
    65 void PlottyFile::setUnitPara(std::string unit_para)
    66 {
    67  this->unit_para = unit_para;
    68 }
    69 
    70 void PlottyFile::setDescPara(std::string desc_para)
    71 {
    72  this->desc_para = desc_para;
    73 }
    74 
    75 FunctionType PlottyFile::getFunctionType() const
    76 {
    77  return function_type;
    78 }
    79 
    80 uint8_t PlottyFile::getQuadrant() const
    81 {
    82  return quadrant;
    83 }
    84 
    85 uint16_t PlottyFile::getRefX() const
    86 {
    87  return ref_x;
    88 }
    89 
    90 uint16_t PlottyFile::getRefY() const
    91 {
    92  return ref_y;
    93 }
    94 
    96 {
    97  return para_first;
    98 }
    99 
    101 {
    102  return para_stepwidth;
    103 }
    104 
    105 std::string PlottyFile::getUnitX() const
    106 {
    107  return unit_x;
    108 }
    109 
    110 std::string PlottyFile::getDescX() const
    111 {
    112  return desc_x;
    113 }
    114 
    115 std::string PlottyFile::getUnitY() const
    116 {
    117  return unit_y;
    118 }
    119 
    120 std::string PlottyFile::getDescY() const
    121 {
    122  return desc_y;
    123 }
    124 
    125 std::string PlottyFile::getUnitPara() const
    126 {
    127  return unit_para;
    128 }
    129 
    130 std::string PlottyFile::getDescPara() const
    131 {
    132  return desc_para;
    133 }
    134 
    135 void PlottyFile::prepStr(std::string& str, uint8_t len)
    136 {
    137  if(str.length() > len)
    138  throw std::runtime_error("Zu grosser String.");
    139 
    140  if(str.length() != len)
    141  str += '\n';
    142 
    143  while(str.length() < len)
    144  str += '\0';
    145 }
    146 
    147 void PlottyFile::writeToFile(std::string filename)
    148 {
    149  prepStr(unit_x, STR_LEN_SHORT);
    150  prepStr(desc_x, STR_LEN_LARGE);
    151  prepStr(unit_y, STR_LEN_SHORT);
    152  prepStr(desc_y, STR_LEN_LARGE);
    153  prepStr(unit_para, STR_LEN_SHORT);
    154  prepStr(desc_para, STR_LEN_LARGE);
    155 
    156  std::ofstream file(filename);
    157 
    158  // write file header
    159  file.write(reinterpret_cast<char*>(&command), 1);
    160  file.write(head.c_str(), head.length());
    161  file.write(filetype.c_str(), filetype.length());
    162  file.write(reinterpret_cast<char*>(&version), 2);
    163  file.write(reinterpret_cast<char*>(&subversion), 2);
    164  file.put(static_cast<uint8_t>(function_type));
    165  file.write(reinterpret_cast<char*>(&quadrant), 1);
    166  file.write(reinterpret_cast<char*>(&ref_x), 2);
    167  file.write(reinterpret_cast<char*>(&ref_y), 2);
    168  file.write(reinterpret_cast<char*>(&para_first), 2);
    169  file.write(reinterpret_cast<char*>(&para_stepwidth), 2);
    170  file.write(unit_x.c_str(), unit_x.length());
    171  file.write(desc_x.c_str(), desc_x.length());
    172  file.write(unit_y.c_str(), unit_y.length());
    173  file.write(desc_y.c_str(), desc_y.length());
    174  file.write(unit_para.c_str(), unit_para.length());
    175  file.write(desc_para.c_str(), desc_para.length());
    176  file.write(reinterpret_cast<const char*>(&eof), 1);
    177 
    178  // make sure header size is 256 Byte
    179  while(file.tellp() < 256)
    180  file.put(0);
    181 
    182  for(Dot& dot : dots)
    183  {
    184  file.put((dot.getX() >> 8) | (static_cast<uint8_t>(dot.getCurve()) << 2));
    185  file.put(dot.getX() & 0xFF);
    186  file.put(dot.getY() >> 8);
    187  file.put(dot.getY() & 0xFF);
    188  }
    189 
    190  file.close();
    191 }
    192 
    193 void PlottyFile::startPlotty(std::string filename)
    194 {
    195  int code = system(("plotty --in " + filename).c_str());
    196  if(code)
    197  throw std::runtime_error("Fehler beim Aufruf von plotty");
    198 }
    +
    void setParaStepWidth(uint16_t para_stepwidth)
    Definition: plottyfile.cpp:40
    +
    uint8_t getQuadrant(void) const
    Definition: plottyfile.cpp:80
    +
    void startPlotty(std::string filename)
    Definition: plottyfile.cpp:193
    +
    void writeToFile(std::string filename)
    Definition: plottyfile.cpp:147
    +
    void setUnitX(std::string unit_x)
    Definition: plottyfile.cpp:45
    +
    void setUnitPara(std::string unit_para)
    Definition: plottyfile.cpp:65
    +
    void setDescY(std::string desc_y)
    Definition: plottyfile.cpp:60
    +
    void setQuadrant(uint8_t quadrant)
    Definition: plottyfile.cpp:18
    +
    std::string getDescY(void) const
    Definition: plottyfile.cpp:120
    +
    void setRefY(uint16_t ref_y)
    Definition: plottyfile.cpp:30
    +
    std::string getDescX(void) const
    Definition: plottyfile.cpp:110
    +
    void setFunctionType(FunctionType function_type)
    Definition: plottyfile.cpp:13
    +
    void setDescX(std::string desc_x)
    Definition: plottyfile.cpp:50
    +
    Definition: dot.h:12
    +
    void setRefX(uint16_t ref_x)
    Definition: plottyfile.cpp:25
    +
    void setUnitY(std::string unit_y)
    Definition: plottyfile.cpp:55
    +
    void addDot(Dot &dot)
    Definition: plottyfile.cpp:3
    +
    void setDescPara(std::string desc_para)
    Definition: plottyfile.cpp:70
    +
    uint16_t getParaStepWidth(void) const
    Definition: plottyfile.cpp:100
    +
    std::string getDescPara(void) const
    Definition: plottyfile.cpp:130
    +
    void setParaFirstCurve(uint16_t para_first)
    Definition: plottyfile.cpp:35
    +
    std::string getUnitY(void) const
    Definition: plottyfile.cpp:115
    +
    uint16_t getParaFirstCurve(void) const
    Definition: plottyfile.cpp:95
    +
    uint16_t getRefX(void) const
    Definition: plottyfile.cpp:85
    +
    std::string getUnitPara(void) const
    Definition: plottyfile.cpp:125
    +
    FunctionType getFunctionType(void) const
    Definition: plottyfile.cpp:75
    +
    uint16_t getRefY(void) const
    Definition: plottyfile.cpp:90
    +
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    + + + + diff --git a/docs/html/plottyfile_8h_source.html b/docs/html/plottyfile_8h_source.html new file mode 100644 index 0000000..f547f4d --- /dev/null +++ b/docs/html/plottyfile_8h_source.html @@ -0,0 +1,110 @@ + + + + + + + +B15F: drv/plottyfile.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    plottyfile.h
    +
    +
    +
    1 #ifndef PLOTTYFILE_H
    2 #define PLOTTYFILE_H
    3 
    4 #include <iostream>
    5 #include <fstream>
    6 #include <exception>
    7 #include <vector>
    8 #include "dot.h"
    9 
    10 enum FunctionType
    11 {
    12  CurveFamily = 'S',
    13  Curve = 'C',
    14  Level = 'P'
    15 };
    16 
    20 {
    21 public:
    26  void addDot(Dot& dot);
    27 
    32  void addDot(Dot dot);
    33 
    38  void setFunctionType(FunctionType function_type);
    39 
    44  void setQuadrant(uint8_t quadrant);
    45 
    50  void setRefX(uint16_t ref_x);
    51 
    56  void setRefY(uint16_t ref_y);
    57 
    63  void setParaFirstCurve(uint16_t para_first);
    64 
    69  void setParaStepWidth(uint16_t para_stepwidth);
    70 
    75  void setUnitX(std::string unit_x);
    76 
    81  void setDescX(std::string desc_x);
    82 
    87  void setUnitY(std::string unit_y);
    88 
    93  void setDescY(std::string desc_y);
    94 
    99  void setUnitPara(std::string unit_para);
    104  void setDescPara(std::string desc_para);
    105 
    106 
    107 
    111  FunctionType getFunctionType(void) const;
    112 
    116  uint8_t getQuadrant(void) const;
    117 
    121  uint16_t getRefX(void) const;
    122 
    126  uint16_t getRefY(void) const;
    127 
    131  uint16_t getParaFirstCurve(void) const;
    132 
    136  uint16_t getParaStepWidth(void) const;
    137 
    141  std::string getUnitX(void) const;
    142 
    146  std::string getDescX(void) const;
    147 
    151  std::string getUnitY(void) const;
    152 
    156  std::string getDescY(void) const;
    157 
    161  std::string getUnitPara(void) const;
    162 
    166  std::string getDescPara(void) const;
    167 
    168 
    173  void writeToFile(std::string filename);
    174 
    179  void startPlotty(std::string filename);
    180 private:
    181  void prepStr(std::string& str, uint8_t len);
    182 
    183  std::vector<Dot> dots;
    184 
    185  int8_t command = 0x1D;
    186  const std::string head = "HTWK-HWLab";
    187  const std::string filetype = "MD";
    188  int16_t version = 1;
    189  int16_t subversion = 0;
    190  FunctionType function_type = FunctionType::Curve;
    191  uint8_t quadrant = 1;
    192  uint16_t ref_x = 1023;
    193  uint16_t ref_y = 1023;
    194  uint16_t para_first = 1;
    195  uint16_t para_stepwidth = 1;
    196  std::string unit_x;
    197  std::string desc_x;
    198  std::string unit_y;
    199  std::string desc_y;
    200  std::string unit_para;
    201  std::string desc_para;
    202  const uint8_t eof = 0xD;
    203 
    204  constexpr static uint8_t STR_LEN_SHORT = 10;
    205  constexpr static uint8_t STR_LEN_LARGE = 20;
    206 };
    207 
    208 #endif // PLOTTYFILE_H
    +
    void setParaStepWidth(uint16_t para_stepwidth)
    Definition: plottyfile.cpp:40
    +
    uint8_t getQuadrant(void) const
    Definition: plottyfile.cpp:80
    +
    void startPlotty(std::string filename)
    Definition: plottyfile.cpp:193
    +
    void writeToFile(std::string filename)
    Definition: plottyfile.cpp:147
    +
    void setUnitX(std::string unit_x)
    Definition: plottyfile.cpp:45
    +
    void setUnitPara(std::string unit_para)
    Definition: plottyfile.cpp:65
    +
    void setDescY(std::string desc_y)
    Definition: plottyfile.cpp:60
    +
    void setQuadrant(uint8_t quadrant)
    Definition: plottyfile.cpp:18
    +
    std::string getDescY(void) const
    Definition: plottyfile.cpp:120
    + +
    void setRefY(uint16_t ref_y)
    Definition: plottyfile.cpp:30
    +
    std::string getDescX(void) const
    Definition: plottyfile.cpp:110
    +
    void setFunctionType(FunctionType function_type)
    Definition: plottyfile.cpp:13
    +
    void setDescX(std::string desc_x)
    Definition: plottyfile.cpp:50
    +
    Definition: dot.h:12
    +
    void setRefX(uint16_t ref_x)
    Definition: plottyfile.cpp:25
    +
    void setUnitY(std::string unit_y)
    Definition: plottyfile.cpp:55
    +
    void addDot(Dot &dot)
    Definition: plottyfile.cpp:3
    +
    void setDescPara(std::string desc_para)
    Definition: plottyfile.cpp:70
    +
    uint16_t getParaStepWidth(void) const
    Definition: plottyfile.cpp:100
    +
    std::string getDescPara(void) const
    Definition: plottyfile.cpp:130
    +
    void setParaFirstCurve(uint16_t para_first)
    Definition: plottyfile.cpp:35
    +
    std::string getUnitY(void) const
    Definition: plottyfile.cpp:115
    +
    uint16_t getParaFirstCurve(void) const
    Definition: plottyfile.cpp:95
    +
    uint16_t getRefX(void) const
    Definition: plottyfile.cpp:85
    +
    std::string getUnitPara(void) const
    Definition: plottyfile.cpp:125
    +
    FunctionType getFunctionType(void) const
    Definition: plottyfile.cpp:75
    +
    uint16_t getRefY(void) const
    Definition: plottyfile.cpp:90
    +
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    + + + + diff --git a/docs/html/search/all_0.html b/docs/html/search/all_0.html new file mode 100644 index 0000000..a52d5f0 --- /dev/null +++ b/docs/html/search/all_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js new file mode 100644 index 0000000..c4bd927 --- /dev/null +++ b/docs/html/search/all_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['abort',['abort',['../classB15F.html#a3f09a418f9e3be5d1d750e4515c96f1e',1,'B15F::abort(std::string msg)'],['../classB15F.html#ac962a6a49bddd0e261a8c7d3aded23f8',1,'B15F::abort(std::exception &ex)']]], + ['activateselftestmode',['activateSelfTestMode',['../classB15F.html#ad9bf80ee2485fb5aac9926c6ef0731f1',1,'B15F']]], + ['adddot',['addDot',['../classPlottyFile.html#ae091e6eaaca16302f17572ac7dec6f7c',1,'PlottyFile::addDot(Dot &dot)'],['../classPlottyFile.html#a80e4b45219b4e9571992edfc28a28568',1,'PlottyFile::addDot(Dot dot)']]], + ['analogread',['analogRead',['../classB15F.html#ae0bd1f69751e2dc3c462db9213fc4627',1,'B15F']]], + ['analogsequence',['analogSequence',['../classB15F.html#ab82a324426c3063318c6cafb3089ae02',1,'B15F']]], + ['analogwrite0',['analogWrite0',['../classB15F.html#afc55fd590c7fa5c942d100cb60c4b0d3',1,'B15F']]], + ['analogwrite1',['analogWrite1',['../classB15F.html#a7f1becceac744f5cd2ad529748fd836f',1,'B15F']]] +]; diff --git a/docs/html/search/all_1.html b/docs/html/search/all_1.html new file mode 100644 index 0000000..0fcb704 --- /dev/null +++ b/docs/html/search/all_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js new file mode 100644 index 0000000..4a50fd7 --- /dev/null +++ b/docs/html/search/all_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['b15f',['B15F',['../classB15F.html',1,'']]], + ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]] +]; diff --git a/docs/html/search/all_10.html b/docs/html/search/all_10.html new file mode 100644 index 0000000..c234738 --- /dev/null +++ b/docs/html/search/all_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js new file mode 100644 index 0000000..8c65e1c --- /dev/null +++ b/docs/html/search/all_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_7eusart',['~USART',['../classUSART.html#a0c8eb1a939ca00921e22f6cbcc7bb749',1,'USART']]], + ['_7eusartexception',['~USARTException',['../classUSARTException.html#a0e008b3cb4974859e6bc8c8f8eb480be',1,'USARTException']]] +]; diff --git a/docs/html/search/all_2.html b/docs/html/search/all_2.html new file mode 100644 index 0000000..19c530f --- /dev/null +++ b/docs/html/search/all_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js new file mode 100644 index 0000000..7200182 --- /dev/null +++ b/docs/html/search/all_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['clearinputbuffer',['clearInputBuffer',['../classUSART.html#a28a2b4c5ed66b2c3a81196f76884f156',1,'USART']]], + ['clearoutputbuffer',['clearOutputBuffer',['../classUSART.html#a756d268a8762c316f91ca3238972b0c1',1,'USART']]], + ['closedevice',['closeDevice',['../classUSART.html#af80d6291ac1d2df04cfa1d8d27458cc5',1,'USART']]] +]; diff --git a/docs/html/search/all_3.html b/docs/html/search/all_3.html new file mode 100644 index 0000000..1ae887f --- /dev/null +++ b/docs/html/search/all_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js new file mode 100644 index 0000000..08afc23 --- /dev/null +++ b/docs/html/search/all_3.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['delay_5fms',['delay_ms',['../classB15F.html#aaffce20afb9f06bc4b7556c70ce76416',1,'B15F']]], + ['delay_5fus',['delay_us',['../classB15F.html#adcaac8ae8db3c28eccb499fbd720361f',1,'B15F']]], + ['digitalread0',['digitalRead0',['../classB15F.html#ae0df6d423deeb2fd610968bd1c72060e',1,'B15F']]], + ['digitalread1',['digitalRead1',['../classB15F.html#afc76b612dd4faeee0ac02a66b65af5f2',1,'B15F']]], + ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], + ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], + ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], + ['dot',['Dot',['../classDot.html',1,'Dot'],['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot::Dot()']]], + ['driverexception',['DriverException',['../classDriverException.html',1,'']]] +]; diff --git a/docs/html/search/all_4.html b/docs/html/search/all_4.html new file mode 100644 index 0000000..14c90ef --- /dev/null +++ b/docs/html/search/all_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js new file mode 100644 index 0000000..4acd298 --- /dev/null +++ b/docs/html/search/all_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['exec',['exec',['../classB15F.html#a1a7ac52984ed7ecac008a3e4060eee3a',1,'B15F']]], + ['einführung',['Einführung',['../index.html',1,'']]] +]; diff --git a/docs/html/search/all_5.html b/docs/html/search/all_5.html new file mode 100644 index 0000000..60fa53e --- /dev/null +++ b/docs/html/search/all_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js new file mode 100644 index 0000000..3641ddc --- /dev/null +++ b/docs/html/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['flushoutputbuffer',['flushOutputBuffer',['../classUSART.html#adb6ff4d1cf1af79ca255c5a81780200d',1,'USART']]] +]; diff --git a/docs/html/search/all_6.html b/docs/html/search/all_6.html new file mode 100644 index 0000000..7180363 --- /dev/null +++ b/docs/html/search/all_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js new file mode 100644 index 0000000..9518d98 --- /dev/null +++ b/docs/html/search/all_6.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['getbaudrate',['getBaudrate',['../classUSART.html#a4918672d8069df205378a528b1892db3',1,'USART']]], + ['getboardinfo',['getBoardInfo',['../classB15F.html#a4f01677e73d6d172a2c1cae9427a591b',1,'B15F']]], + ['getcurve',['getCurve',['../classDot.html#ad0ae7dc1a9be3d8d985affc089b34396',1,'Dot']]], + ['getdescpara',['getDescPara',['../classPlottyFile.html#a536967daae3b382a5d6575f55450e198',1,'PlottyFile']]], + ['getdescx',['getDescX',['../classPlottyFile.html#a9cf7baa569be308c2cf6e07cadded09d',1,'PlottyFile']]], + ['getdescy',['getDescY',['../classPlottyFile.html#ab4a847fd71a804182f211233e194df45',1,'PlottyFile']]], + ['getfunctiontype',['getFunctionType',['../classPlottyFile.html#a88bb7d8350ed5fbc7a40e8d903c94bdb',1,'PlottyFile']]], + ['getinstance',['getInstance',['../classB15F.html#a8b4533d232c55ef2aa967e39e2d23380',1,'B15F']]], + ['getparafirstcurve',['getParaFirstCurve',['../classPlottyFile.html#a40828c93d66fe80166c4f603d5bdfa48',1,'PlottyFile']]], + ['getparastepwidth',['getParaStepWidth',['../classPlottyFile.html#a9da23f2bb8e6eb1837fc992ffd4057db',1,'PlottyFile']]], + ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], + ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], + ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], + ['getregister',['getRegister',['../classB15F.html#a43b477a9e2e5b1b2142958fa5e1a78b3',1,'B15F']]], + ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], + ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], + ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], + ['getunity',['getUnitY',['../classPlottyFile.html#a746b96036872dbece204e9739f3413b6',1,'PlottyFile']]], + ['getx',['getX',['../classDot.html#a029f0cc99c474122b77a708a317e7f77',1,'Dot']]], + ['gety',['getY',['../classDot.html#a8fcb987e6308d8184d1a2c8692227e58',1,'Dot']]] +]; diff --git a/docs/html/search/all_7.html b/docs/html/search/all_7.html new file mode 100644 index 0000000..ee6d2e4 --- /dev/null +++ b/docs/html/search/all_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js new file mode 100644 index 0000000..7c761ff --- /dev/null +++ b/docs/html/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['msg',['msg',['../classUSARTException.html#a14c80df95f216d221aa97cffbcd8dd79',1,'USARTException']]], + ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], + ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] +]; diff --git a/docs/html/search/all_8.html b/docs/html/search/all_8.html new file mode 100644 index 0000000..7829aa4 --- /dev/null +++ b/docs/html/search/all_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js new file mode 100644 index 0000000..bd75d34 --- /dev/null +++ b/docs/html/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['opendevice',['openDevice',['../classUSART.html#a5f7e2abda2ec4a68a5fdb8ee2f8a940a',1,'USART']]] +]; diff --git a/docs/html/search/all_9.html b/docs/html/search/all_9.html new file mode 100644 index 0000000..e4242c7 --- /dev/null +++ b/docs/html/search/all_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js new file mode 100644 index 0000000..1695de2 --- /dev/null +++ b/docs/html/search/all_9.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]], + ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]], + ['pwmsetfrequency',['pwmSetFrequency',['../classB15F.html#ac6f6532bb9550a0632c28b98c157d0a1',1,'B15F']]], + ['pwmsetvalue',['pwmSetValue',['../classB15F.html#af9aad3c0db5d5a8b37219d713e1977ee',1,'B15F']]] +]; diff --git a/docs/html/search/all_a.html b/docs/html/search/all_a.html new file mode 100644 index 0000000..47a4a78 --- /dev/null +++ b/docs/html/search/all_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js new file mode 100644 index 0000000..7ca61ac --- /dev/null +++ b/docs/html/search/all_a.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['readdipswitch',['readDipSwitch',['../classB15F.html#a6f858f21ea81d491b5031b3644a2239a',1,'B15F']]], + ['receive',['receive',['../classUSART.html#a0fdc238203852f00bd750127602b2a6a',1,'USART']]], + ['reconnect',['reconnect',['../classB15F.html#a52557b375443c180a044e7d4e80a1ae7',1,'B15F']]], + ['reconnect_5ftimeout',['RECONNECT_TIMEOUT',['../classB15F.html#a040951746fbfd632e12bd1ad14578816',1,'B15F']]], + ['reconnect_5ftries',['RECONNECT_TRIES',['../classB15F.html#a6c4895bdbcd71ff6743becf97985c2dc',1,'B15F']]] +]; diff --git a/docs/html/search/all_b.html b/docs/html/search/all_b.html new file mode 100644 index 0000000..1320a43 --- /dev/null +++ b/docs/html/search/all_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js new file mode 100644 index 0000000..552513c --- /dev/null +++ b/docs/html/search/all_b.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], + ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], + ['setdescpara',['setDescPara',['../classPlottyFile.html#a431904143c3c1164a2e8b8cfec3c77ab',1,'PlottyFile']]], + ['setdescx',['setDescX',['../classPlottyFile.html#aa0449c290265d55d6223b19cf0a88b0a',1,'PlottyFile']]], + ['setdescy',['setDescY',['../classPlottyFile.html#a38a3a4dfc76bc70523727584bf01d590',1,'PlottyFile']]], + ['setfunctiontype',['setFunctionType',['../classPlottyFile.html#a4e5ab1ebb012a5cc1a3d6458a4cd512f',1,'PlottyFile']]], + ['setparafirstcurve',['setParaFirstCurve',['../classPlottyFile.html#aa676414793becb975506f48d6e949dd0',1,'PlottyFile']]], + ['setparastepwidth',['setParaStepWidth',['../classPlottyFile.html#a6caebd31e04e2e7081cc007047350355',1,'PlottyFile']]], + ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], + ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], + ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], + ['setregister',['setRegister',['../classB15F.html#a2735424cf98bd0e2892b5a9b6eb24582',1,'B15F']]], + ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], + ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], + ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], + ['setunity',['setUnitY',['../classPlottyFile.html#abb18c814f435926f741f7ceb310f3059',1,'PlottyFile']]], + ['startplotty',['startPlotty',['../classPlottyFile.html#a08a115ef10458cadfe76077d623313df',1,'PlottyFile']]] +]; diff --git a/docs/html/search/all_c.html b/docs/html/search/all_c.html new file mode 100644 index 0000000..32a3a1b --- /dev/null +++ b/docs/html/search/all_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js new file mode 100644 index 0000000..9b03a67 --- /dev/null +++ b/docs/html/search/all_c.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], + ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], + ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'']]], + ['transmit',['transmit',['../classUSART.html#a41b19dd58f307015b73e154048cd74ca',1,'USART']]] +]; diff --git a/docs/html/search/all_d.html b/docs/html/search/all_d.html new file mode 100644 index 0000000..a386096 --- /dev/null +++ b/docs/html/search/all_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js new file mode 100644 index 0000000..7e9d9bc --- /dev/null +++ b/docs/html/search/all_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usart',['USART',['../classUSART.html',1,'USART'],['../classUSART.html#a5daed20dc595c43d87c4c28bb08a7449',1,'USART::USART()']]], + ['usartexception',['USARTException',['../classUSARTException.html',1,'USARTException'],['../classUSARTException.html#a3c359db129825703b91392d5128cf93d',1,'USARTException::USARTException(const char *message)'],['../classUSARTException.html#a643c0a8b7f0d81e2f1693a75b378e6c2',1,'USARTException::USARTException(const std::string &message)']]] +]; diff --git a/docs/html/search/all_e.html b/docs/html/search/all_e.html new file mode 100644 index 0000000..2931618 --- /dev/null +++ b/docs/html/search/all_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js new file mode 100644 index 0000000..27f785f --- /dev/null +++ b/docs/html/search/all_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['view',['View',['../classView.html',1,'']]], + ['viewinfo',['ViewInfo',['../classViewInfo.html',1,'']]], + ['viewmonitor',['ViewMonitor',['../classViewMonitor.html',1,'']]], + ['viewpromt',['ViewPromt',['../classViewPromt.html',1,'']]], + ['viewselection',['ViewSelection',['../classViewSelection.html',1,'']]] +]; diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html new file mode 100644 index 0000000..ca42a52 --- /dev/null +++ b/docs/html/search/all_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js new file mode 100644 index 0000000..511b30a --- /dev/null +++ b/docs/html/search/all_f.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]], + ['what',['what',['../classUSARTException.html#a2af5e3c00cd0585c7427c2e0420a8f15',1,'USARTException']]], + ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] +]; diff --git a/docs/html/search/classes_0.html b/docs/html/search/classes_0.html new file mode 100644 index 0000000..d585e6a --- /dev/null +++ b/docs/html/search/classes_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js new file mode 100644 index 0000000..7622f87 --- /dev/null +++ b/docs/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['b15f',['B15F',['../classB15F.html',1,'']]] +]; diff --git a/docs/html/search/classes_1.html b/docs/html/search/classes_1.html new file mode 100644 index 0000000..baeb182 --- /dev/null +++ b/docs/html/search/classes_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_1.js b/docs/html/search/classes_1.js new file mode 100644 index 0000000..c2d5cc3 --- /dev/null +++ b/docs/html/search/classes_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['dot',['Dot',['../classDot.html',1,'']]], + ['driverexception',['DriverException',['../classDriverException.html',1,'']]] +]; diff --git a/docs/html/search/classes_2.html b/docs/html/search/classes_2.html new file mode 100644 index 0000000..d267279 --- /dev/null +++ b/docs/html/search/classes_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_2.js b/docs/html/search/classes_2.js new file mode 100644 index 0000000..ca8950f --- /dev/null +++ b/docs/html/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]] +]; diff --git a/docs/html/search/classes_3.html b/docs/html/search/classes_3.html new file mode 100644 index 0000000..8a5cbe1 --- /dev/null +++ b/docs/html/search/classes_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_3.js b/docs/html/search/classes_3.js new file mode 100644 index 0000000..b7d0b63 --- /dev/null +++ b/docs/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'']]] +]; diff --git a/docs/html/search/classes_4.html b/docs/html/search/classes_4.html new file mode 100644 index 0000000..300b9ab --- /dev/null +++ b/docs/html/search/classes_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_4.js b/docs/html/search/classes_4.js new file mode 100644 index 0000000..c030e1b --- /dev/null +++ b/docs/html/search/classes_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usart',['USART',['../classUSART.html',1,'']]], + ['usartexception',['USARTException',['../classUSARTException.html',1,'']]] +]; diff --git a/docs/html/search/classes_5.html b/docs/html/search/classes_5.html new file mode 100644 index 0000000..e7afb2c --- /dev/null +++ b/docs/html/search/classes_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_5.js b/docs/html/search/classes_5.js new file mode 100644 index 0000000..27f785f --- /dev/null +++ b/docs/html/search/classes_5.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['view',['View',['../classView.html',1,'']]], + ['viewinfo',['ViewInfo',['../classViewInfo.html',1,'']]], + ['viewmonitor',['ViewMonitor',['../classViewMonitor.html',1,'']]], + ['viewpromt',['ViewPromt',['../classViewPromt.html',1,'']]], + ['viewselection',['ViewSelection',['../classViewSelection.html',1,'']]] +]; diff --git a/docs/html/search/close.png b/docs/html/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/docs/html/search/functions_0.html b/docs/html/search/functions_0.html new file mode 100644 index 0000000..8a729f7 --- /dev/null +++ b/docs/html/search/functions_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js new file mode 100644 index 0000000..c4bd927 --- /dev/null +++ b/docs/html/search/functions_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['abort',['abort',['../classB15F.html#a3f09a418f9e3be5d1d750e4515c96f1e',1,'B15F::abort(std::string msg)'],['../classB15F.html#ac962a6a49bddd0e261a8c7d3aded23f8',1,'B15F::abort(std::exception &ex)']]], + ['activateselftestmode',['activateSelfTestMode',['../classB15F.html#ad9bf80ee2485fb5aac9926c6ef0731f1',1,'B15F']]], + ['adddot',['addDot',['../classPlottyFile.html#ae091e6eaaca16302f17572ac7dec6f7c',1,'PlottyFile::addDot(Dot &dot)'],['../classPlottyFile.html#a80e4b45219b4e9571992edfc28a28568',1,'PlottyFile::addDot(Dot dot)']]], + ['analogread',['analogRead',['../classB15F.html#ae0bd1f69751e2dc3c462db9213fc4627',1,'B15F']]], + ['analogsequence',['analogSequence',['../classB15F.html#ab82a324426c3063318c6cafb3089ae02',1,'B15F']]], + ['analogwrite0',['analogWrite0',['../classB15F.html#afc55fd590c7fa5c942d100cb60c4b0d3',1,'B15F']]], + ['analogwrite1',['analogWrite1',['../classB15F.html#a7f1becceac744f5cd2ad529748fd836f',1,'B15F']]] +]; diff --git a/docs/html/search/functions_1.html b/docs/html/search/functions_1.html new file mode 100644 index 0000000..d4929aa --- /dev/null +++ b/docs/html/search/functions_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_1.js b/docs/html/search/functions_1.js new file mode 100644 index 0000000..7200182 --- /dev/null +++ b/docs/html/search/functions_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['clearinputbuffer',['clearInputBuffer',['../classUSART.html#a28a2b4c5ed66b2c3a81196f76884f156',1,'USART']]], + ['clearoutputbuffer',['clearOutputBuffer',['../classUSART.html#a756d268a8762c316f91ca3238972b0c1',1,'USART']]], + ['closedevice',['closeDevice',['../classUSART.html#af80d6291ac1d2df04cfa1d8d27458cc5',1,'USART']]] +]; diff --git a/docs/html/search/functions_2.html b/docs/html/search/functions_2.html new file mode 100644 index 0000000..07e3fda --- /dev/null +++ b/docs/html/search/functions_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js new file mode 100644 index 0000000..7c01e06 --- /dev/null +++ b/docs/html/search/functions_2.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['delay_5fms',['delay_ms',['../classB15F.html#aaffce20afb9f06bc4b7556c70ce76416',1,'B15F']]], + ['delay_5fus',['delay_us',['../classB15F.html#adcaac8ae8db3c28eccb499fbd720361f',1,'B15F']]], + ['digitalread0',['digitalRead0',['../classB15F.html#ae0df6d423deeb2fd610968bd1c72060e',1,'B15F']]], + ['digitalread1',['digitalRead1',['../classB15F.html#afc76b612dd4faeee0ac02a66b65af5f2',1,'B15F']]], + ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], + ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], + ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], + ['dot',['Dot',['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot']]] +]; diff --git a/docs/html/search/functions_3.html b/docs/html/search/functions_3.html new file mode 100644 index 0000000..40bd389 --- /dev/null +++ b/docs/html/search/functions_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_3.js b/docs/html/search/functions_3.js new file mode 100644 index 0000000..fb3f662 --- /dev/null +++ b/docs/html/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['exec',['exec',['../classB15F.html#a1a7ac52984ed7ecac008a3e4060eee3a',1,'B15F']]] +]; diff --git a/docs/html/search/functions_4.html b/docs/html/search/functions_4.html new file mode 100644 index 0000000..8a4df4c --- /dev/null +++ b/docs/html/search/functions_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js new file mode 100644 index 0000000..3641ddc --- /dev/null +++ b/docs/html/search/functions_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['flushoutputbuffer',['flushOutputBuffer',['../classUSART.html#adb6ff4d1cf1af79ca255c5a81780200d',1,'USART']]] +]; diff --git a/docs/html/search/functions_5.html b/docs/html/search/functions_5.html new file mode 100644 index 0000000..2b983b2 --- /dev/null +++ b/docs/html/search/functions_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js new file mode 100644 index 0000000..9518d98 --- /dev/null +++ b/docs/html/search/functions_5.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['getbaudrate',['getBaudrate',['../classUSART.html#a4918672d8069df205378a528b1892db3',1,'USART']]], + ['getboardinfo',['getBoardInfo',['../classB15F.html#a4f01677e73d6d172a2c1cae9427a591b',1,'B15F']]], + ['getcurve',['getCurve',['../classDot.html#ad0ae7dc1a9be3d8d985affc089b34396',1,'Dot']]], + ['getdescpara',['getDescPara',['../classPlottyFile.html#a536967daae3b382a5d6575f55450e198',1,'PlottyFile']]], + ['getdescx',['getDescX',['../classPlottyFile.html#a9cf7baa569be308c2cf6e07cadded09d',1,'PlottyFile']]], + ['getdescy',['getDescY',['../classPlottyFile.html#ab4a847fd71a804182f211233e194df45',1,'PlottyFile']]], + ['getfunctiontype',['getFunctionType',['../classPlottyFile.html#a88bb7d8350ed5fbc7a40e8d903c94bdb',1,'PlottyFile']]], + ['getinstance',['getInstance',['../classB15F.html#a8b4533d232c55ef2aa967e39e2d23380',1,'B15F']]], + ['getparafirstcurve',['getParaFirstCurve',['../classPlottyFile.html#a40828c93d66fe80166c4f603d5bdfa48',1,'PlottyFile']]], + ['getparastepwidth',['getParaStepWidth',['../classPlottyFile.html#a9da23f2bb8e6eb1837fc992ffd4057db',1,'PlottyFile']]], + ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], + ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], + ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], + ['getregister',['getRegister',['../classB15F.html#a43b477a9e2e5b1b2142958fa5e1a78b3',1,'B15F']]], + ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], + ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], + ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], + ['getunity',['getUnitY',['../classPlottyFile.html#a746b96036872dbece204e9739f3413b6',1,'PlottyFile']]], + ['getx',['getX',['../classDot.html#a029f0cc99c474122b77a708a317e7f77',1,'Dot']]], + ['gety',['getY',['../classDot.html#a8fcb987e6308d8184d1a2c8692227e58',1,'Dot']]] +]; diff --git a/docs/html/search/functions_6.html b/docs/html/search/functions_6.html new file mode 100644 index 0000000..f7d283d --- /dev/null +++ b/docs/html/search/functions_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_6.js b/docs/html/search/functions_6.js new file mode 100644 index 0000000..bd75d34 --- /dev/null +++ b/docs/html/search/functions_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['opendevice',['openDevice',['../classUSART.html#a5f7e2abda2ec4a68a5fdb8ee2f8a940a',1,'USART']]] +]; diff --git a/docs/html/search/functions_7.html b/docs/html/search/functions_7.html new file mode 100644 index 0000000..a74fe44 --- /dev/null +++ b/docs/html/search/functions_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_7.js b/docs/html/search/functions_7.js new file mode 100644 index 0000000..b0de2bf --- /dev/null +++ b/docs/html/search/functions_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['pwmsetfrequency',['pwmSetFrequency',['../classB15F.html#ac6f6532bb9550a0632c28b98c157d0a1',1,'B15F']]], + ['pwmsetvalue',['pwmSetValue',['../classB15F.html#af9aad3c0db5d5a8b37219d713e1977ee',1,'B15F']]] +]; diff --git a/docs/html/search/functions_8.html b/docs/html/search/functions_8.html new file mode 100644 index 0000000..75fc0be --- /dev/null +++ b/docs/html/search/functions_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_8.js b/docs/html/search/functions_8.js new file mode 100644 index 0000000..b57cb64 --- /dev/null +++ b/docs/html/search/functions_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['readdipswitch',['readDipSwitch',['../classB15F.html#a6f858f21ea81d491b5031b3644a2239a',1,'B15F']]], + ['receive',['receive',['../classUSART.html#a0fdc238203852f00bd750127602b2a6a',1,'USART']]], + ['reconnect',['reconnect',['../classB15F.html#a52557b375443c180a044e7d4e80a1ae7',1,'B15F']]] +]; diff --git a/docs/html/search/functions_9.html b/docs/html/search/functions_9.html new file mode 100644 index 0000000..7541c9e --- /dev/null +++ b/docs/html/search/functions_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_9.js b/docs/html/search/functions_9.js new file mode 100644 index 0000000..552513c --- /dev/null +++ b/docs/html/search/functions_9.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], + ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], + ['setdescpara',['setDescPara',['../classPlottyFile.html#a431904143c3c1164a2e8b8cfec3c77ab',1,'PlottyFile']]], + ['setdescx',['setDescX',['../classPlottyFile.html#aa0449c290265d55d6223b19cf0a88b0a',1,'PlottyFile']]], + ['setdescy',['setDescY',['../classPlottyFile.html#a38a3a4dfc76bc70523727584bf01d590',1,'PlottyFile']]], + ['setfunctiontype',['setFunctionType',['../classPlottyFile.html#a4e5ab1ebb012a5cc1a3d6458a4cd512f',1,'PlottyFile']]], + ['setparafirstcurve',['setParaFirstCurve',['../classPlottyFile.html#aa676414793becb975506f48d6e949dd0',1,'PlottyFile']]], + ['setparastepwidth',['setParaStepWidth',['../classPlottyFile.html#a6caebd31e04e2e7081cc007047350355',1,'PlottyFile']]], + ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], + ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], + ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], + ['setregister',['setRegister',['../classB15F.html#a2735424cf98bd0e2892b5a9b6eb24582',1,'B15F']]], + ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], + ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], + ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], + ['setunity',['setUnitY',['../classPlottyFile.html#abb18c814f435926f741f7ceb310f3059',1,'PlottyFile']]], + ['startplotty',['startPlotty',['../classPlottyFile.html#a08a115ef10458cadfe76077d623313df',1,'PlottyFile']]] +]; diff --git a/docs/html/search/functions_a.html b/docs/html/search/functions_a.html new file mode 100644 index 0000000..5a5be63 --- /dev/null +++ b/docs/html/search/functions_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_a.js b/docs/html/search/functions_a.js new file mode 100644 index 0000000..a8ec38d --- /dev/null +++ b/docs/html/search/functions_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], + ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], + ['transmit',['transmit',['../classUSART.html#a41b19dd58f307015b73e154048cd74ca',1,'USART']]] +]; diff --git a/docs/html/search/functions_b.html b/docs/html/search/functions_b.html new file mode 100644 index 0000000..fc2d5aa --- /dev/null +++ b/docs/html/search/functions_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_b.js b/docs/html/search/functions_b.js new file mode 100644 index 0000000..7419b81 --- /dev/null +++ b/docs/html/search/functions_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usart',['USART',['../classUSART.html#a5daed20dc595c43d87c4c28bb08a7449',1,'USART']]], + ['usartexception',['USARTException',['../classUSARTException.html#a3c359db129825703b91392d5128cf93d',1,'USARTException::USARTException(const char *message)'],['../classUSARTException.html#a643c0a8b7f0d81e2f1693a75b378e6c2',1,'USARTException::USARTException(const std::string &message)']]] +]; diff --git a/docs/html/search/functions_c.html b/docs/html/search/functions_c.html new file mode 100644 index 0000000..a1a1437 --- /dev/null +++ b/docs/html/search/functions_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_c.js b/docs/html/search/functions_c.js new file mode 100644 index 0000000..1a80ade --- /dev/null +++ b/docs/html/search/functions_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['what',['what',['../classUSARTException.html#a2af5e3c00cd0585c7427c2e0420a8f15',1,'USARTException']]], + ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] +]; diff --git a/docs/html/search/functions_d.html b/docs/html/search/functions_d.html new file mode 100644 index 0000000..4375535 --- /dev/null +++ b/docs/html/search/functions_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_d.js b/docs/html/search/functions_d.js new file mode 100644 index 0000000..8c65e1c --- /dev/null +++ b/docs/html/search/functions_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_7eusart',['~USART',['../classUSART.html#a0c8eb1a939ca00921e22f6cbcc7bb749',1,'USART']]], + ['_7eusartexception',['~USARTException',['../classUSARTException.html#a0e008b3cb4974859e6bc8c8f8eb480be',1,'USARTException']]] +]; diff --git a/docs/html/search/mag_sel.png b/docs/html/search/mag_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..39c0ed52a25dd9d080ee0d42ae6c6042bdfa04d7 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!2%?$TA$hhDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~NU84L`?eGCi_EEpJ?t}-xGu`@87+QPtK?83kxQ`TapwHK(CDaqU2h2ejD|C#+j z9%q3^WHAE+w=f7ZGR&GI0Tg5}@$_|Nf5gMiEhFgvHvB$N=!mC_V~EE2vzPXI9ZnEo zd+1zHor@dYLod2Y{ z@R$7$Z!PXTbY$|@#T!bMzm?`b<(R`cbw(gxJHzu zB$lLFB^RXvDF!10LknF)BV7aY5JN*NBMU1-b8Q0yD+2>vd*|CI8glbfGSez?Ylunu RoetE%;OXk;vd$@?2>>CYplSdB literal 0 HcmV?d00001 diff --git a/docs/html/search/nomatches.html b/docs/html/search/nomatches.html new file mode 100644 index 0000000..4377320 --- /dev/null +++ b/docs/html/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/docs/html/search/pages_0.html b/docs/html/search/pages_0.html new file mode 100644 index 0000000..32cbf49 --- /dev/null +++ b/docs/html/search/pages_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js new file mode 100644 index 0000000..abe03ca --- /dev/null +++ b/docs/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['einführung',['Einführung',['../index.html',1,'']]] +]; diff --git a/docs/html/search/search.css b/docs/html/search/search.css new file mode 100644 index 0000000..3cf9df9 --- /dev/null +++ b/docs/html/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + float: none; + margin-top: 8px; + right: 0px; + width: 170px; + height: 24px; + z-index: 102; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:115px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:8px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/docs/html/search/search.js b/docs/html/search/search.js new file mode 100644 index 0000000..a554ab9 --- /dev/null +++ b/docs/html/search/search.js @@ -0,0 +1,814 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/docs/html/search/search_r.png b/docs/html/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5d21ee13e070d7600f1c4657fde843b953a69 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD literal 0 HcmV?d00001 diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js new file mode 100644 index 0000000..c2c426a --- /dev/null +++ b/docs/html/search/searchdata.js @@ -0,0 +1,27 @@ +var indexSectionsWithContent = +{ + 0: "abcdefgmoprstuvw~", + 1: "bdptuv", + 2: "acdefgoprstuw~", + 3: "bmprw", + 4: "e" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "functions", + 3: "variables", + 4: "pages" +}; + +var indexSectionLabels = +{ + 0: "All", + 1: "Classes", + 2: "Functions", + 3: "Variables", + 4: "Pages" +}; + diff --git a/docs/html/search/variables_0.html b/docs/html/search/variables_0.html new file mode 100644 index 0000000..a2a3ae6 --- /dev/null +++ b/docs/html/search/variables_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js new file mode 100644 index 0000000..d1fd2cf --- /dev/null +++ b/docs/html/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]] +]; diff --git a/docs/html/search/variables_1.html b/docs/html/search/variables_1.html new file mode 100644 index 0000000..b243c42 --- /dev/null +++ b/docs/html/search/variables_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js new file mode 100644 index 0000000..7c761ff --- /dev/null +++ b/docs/html/search/variables_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['msg',['msg',['../classUSARTException.html#a14c80df95f216d221aa97cffbcd8dd79',1,'USARTException']]], + ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], + ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] +]; diff --git a/docs/html/search/variables_2.html b/docs/html/search/variables_2.html new file mode 100644 index 0000000..647df20 --- /dev/null +++ b/docs/html/search/variables_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js new file mode 100644 index 0000000..570beea --- /dev/null +++ b/docs/html/search/variables_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]] +]; diff --git a/docs/html/search/variables_3.html b/docs/html/search/variables_3.html new file mode 100644 index 0000000..9dc9b89 --- /dev/null +++ b/docs/html/search/variables_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js new file mode 100644 index 0000000..fbf0a47 --- /dev/null +++ b/docs/html/search/variables_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['reconnect_5ftimeout',['RECONNECT_TIMEOUT',['../classB15F.html#a040951746fbfd632e12bd1ad14578816',1,'B15F']]], + ['reconnect_5ftries',['RECONNECT_TRIES',['../classB15F.html#a6c4895bdbcd71ff6743becf97985c2dc',1,'B15F']]] +]; diff --git a/docs/html/search/variables_4.html b/docs/html/search/variables_4.html new file mode 100644 index 0000000..78cc2c7 --- /dev/null +++ b/docs/html/search/variables_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js new file mode 100644 index 0000000..9a9c561 --- /dev/null +++ b/docs/html/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]] +]; diff --git a/docs/html/splitbar.png b/docs/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/docs/html/sync_off.png b/docs/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/docs/html/sync_on.png b/docs/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/docs/html/tab_a.png b/docs/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/docs/html/tab_b.png b/docs/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/docs/html/tabs.css b/docs/html/tabs.css new file mode 100644 index 0000000..85a0cd5 --- /dev/null +++ b/docs/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/docs/html/timeoutexception_8h_source.html b/docs/html/timeoutexception_8h_source.html new file mode 100644 index 0000000..a66ca6e --- /dev/null +++ b/docs/html/timeoutexception_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +B15F: drv/timeoutexception.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    timeoutexception.h
    +
    +
    +
    1 #ifndef TIMEOUTEXCEPTION_H
    2 #define TIMEOUTEXCEPTION_H
    3 
    4 #include <exception>
    5 
    6 // SOURCE: https://stackoverflow.com/a/8152888
    7 
    10 class TimeoutException: public std::exception
    11 {
    12 public:
    13  explicit TimeoutException(const char* message, int timeout) : TimeoutException(std::string(message), timeout)
    14  {
    15  }
    16 
    17  explicit TimeoutException(const std::string& message, int timeout) : msg(message), m_timeout(timeout)
    18  {
    19  if(!msg.length())
    20  msg = "Timeout reached (" + std::to_string(m_timeout) + ")";
    21  }
    22 
    23  virtual ~TimeoutException() throw ()
    24  {
    25  }
    26 
    27  virtual const char* what() const throw ()
    28  {
    29  return msg.c_str();
    30  }
    31 
    32 protected:
    33  std::string msg;
    34  int m_timeout;
    35 };
    36 
    37 #endif // TIMEOUTEXCEPTION_H
    + + + + + diff --git a/docs/html/ui_8cpp_source.html b/docs/html/ui_8cpp_source.html new file mode 100644 index 0000000..ea37cff --- /dev/null +++ b/docs/html/ui_8cpp_source.html @@ -0,0 +1,96 @@ + + + + + + + +B15F: ui/ui.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    ui.cpp
    +
    +
    +
    1 #include "ui.h"
    2 #include "../drv/b15f.h"
    3 
    4 std::vector<View*> win_stack;
    5 std::thread t_refresh;
    6 
    7 void show_main(int)
    8 {
    9  ViewSelection* view = new ViewSelection();
    10  view->setTitle("B15F - Command Line Interface");
    11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
    12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
    13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
    14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
    15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
    16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
    17  view->addChoice("[ Informationen ]", &show_info);
    18  view->addChoice("", nullptr);
    19  view->addChoice("[ Beenden ]", &finish);
    20  view->repaint();
    21 
    22  win_stack.push_back(view);
    23  input(0);
    24 }
    25 
    26 void input(int)
    27 {
    28  call_t nextCall;
    29  int key;
    30  do
    31  {
    32  key = wgetch(View::getWinContext());
    33  win_stack.back()->repaint();
    34  nextCall = win_stack.back()->keypress(key);
    35 
    36  if(key == -1)
    37  view_back(key);
    38 
    39  if(nextCall)
    40  nextCall(key);
    41  }
    42  while(win_stack.size());
    43 }
    44 
    45 void view_back(int)
    46 {
    47  if(win_stack.size())
    48  {
    49  delete win_stack.back();
    50  win_stack.pop_back();
    51  }
    52  if(win_stack.size())
    53  win_stack.back()->repaint();
    54 }
    55 
    56 void finish(int)
    57 {
    58  cleanup();
    59  exit(EXIT_SUCCESS);
    60 }
    61 
    62 void cleanup()
    63 {
    64  if(t_refresh.joinable())
    65  t_refresh.join();
    66  clrtoeol();
    67  refresh();
    68  endwin();
    69 }
    70 
    71 void show_info(int)
    72 {
    73  ViewInfo* view = new ViewInfo();
    74  view->setTitle("Info");
    75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
    76  view->setLabelClose("[ Zurueck ]");
    77  view->repaint();
    78 
    79  win_stack.push_back(view);
    80  input(0);
    81 }
    82 
    83 void show_monitor(int)
    84 {
    85  ViewMonitor* view = new ViewMonitor();
    86  view->setTitle("Monitor");
    87  view->setText("\nErfasse Messwerte...");
    88  view->setLabelClose("[ Zurueck ]");
    89  view->repaint();
    90 
    91  win_stack.push_back(view);
    92  input(0);
    93 }
    94 
    95 void show_invalid_port_input(int)
    96 {
    97  ViewInfo* view = new ViewInfo();
    98  view->setTitle("Falsche Eingabe");
    99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
    100  view->setLabelClose("[ Schliessen ]");
    101  view->repaint();
    102 
    103  win_stack.push_back(view);
    104  input(0);
    105 }
    106 
    107 void show_invalid_dac_input(int)
    108 {
    109  ViewInfo* view = new ViewInfo();
    110  view->setTitle("Falsche Eingabe");
    111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
    112  view->setLabelClose("[ Schliessen ]");
    113  view->repaint();
    114 
    115  win_stack.push_back(view);
    116  input(0);
    117 }
    118 
    119 void write_digital_output0(int)
    120 {
    121  try
    122  {
    123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    124  if(d > 255 || 0 > d)
    125  throw std::invalid_argument("bad value");
    126  uint8_t port = static_cast<uint8_t>(d);
    127 
    128  B15F& drv = B15F::getInstance();
    129  drv.digitalWrite0(port);
    130  view_back(0);
    131  }
    132  catch(std::invalid_argument& ex)
    133  {
    134  show_invalid_port_input(0);
    135  }
    136 }
    137 
    138 void write_digital_output1(int)
    139 {
    140  try
    141  {
    142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    143  if(d > 255 || 0 > d)
    144  throw std::invalid_argument("bad value");
    145  uint8_t port = static_cast<uint8_t>(d);
    146 
    147  B15F& drv = B15F::getInstance();
    148  drv.digitalWrite1(port);
    149  view_back(0);
    150  }
    151  catch(std::invalid_argument& ex)
    152  {
    153  show_invalid_port_input(0);
    154  }
    155 }
    156 
    157 void write_analog_output0(int)
    158 {
    159  try
    160  {
    161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    162  if(port > 1023)
    163  throw std::invalid_argument("bad value");
    164 
    165  B15F& drv = B15F::getInstance();
    166  drv.analogWrite0(port);
    167  view_back(0);
    168  }
    169  catch(std::invalid_argument& ex)
    170  {
    171  show_invalid_dac_input(0);
    172  }
    173 }
    174 
    175 void write_analog_output1(int)
    176 {
    177  try
    178  {
    179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    180  if(port > 1023)
    181  throw std::invalid_argument("bad value");
    182 
    183  B15F& drv = B15F::getInstance();
    184  drv.analogWrite1(port);
    185  view_back(0);
    186  }
    187  catch(std::invalid_argument& ex)
    188  {
    189  show_invalid_dac_input(0);
    190  }
    191 }
    192 
    193 void show_digital_output0(int)
    194 {
    195  ViewPromt* view = new ViewPromt();
    196  view->setTitle("Digitale Ausgabe BE0");
    197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    198  view->setCancel("[ Zurueck ]", true);
    199  view->setConfirm("[ OK ]", &write_digital_output0);
    200  view->repaint();
    201 
    202  win_stack.push_back(view);
    203  input(0);
    204 }
    205 
    206 void show_digital_output1(int)
    207 {
    208  ViewPromt* view = new ViewPromt();
    209  view->setTitle("Digitale Ausgabe BE1");
    210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    211  view->setCancel("[ Zurueck ]", true);
    212  view->setConfirm("[ OK ]", &write_digital_output1);
    213  view->repaint();
    214 
    215  win_stack.push_back(view);
    216  input(0);
    217 }
    218 
    219 void show_analog_output0(int)
    220 {
    221  ViewPromt* view = new ViewPromt();
    222  view->setTitle("Analoge Ausgabe AA0");
    223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    224  view->setCancel("[ Zurueck ]", true);
    225  view->setConfirm("[ OK ]", &write_analog_output0);
    226  view->repaint();
    227 
    228  win_stack.push_back(view);
    229  input(0);
    230 }
    231 
    232 void show_analog_output1(int)
    233 {
    234  ViewPromt* view = new ViewPromt();
    235  view->setTitle("Analoge Ausgabe AA1");
    236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    237  view->setCancel("[ Zurueck ]", true);
    238  view->setConfirm("[ OK ]", &write_analog_output1);
    239  view->repaint();
    240 
    241  win_stack.push_back(view);
    242  input(0);
    243 }
    244 
    245 void start_selftest(int)
    246 {
    247  B15F& drv = B15F::getInstance();
    248  drv.activateSelfTestMode();
    249 
    250  ViewInfo* view = new ViewInfo();
    251  view->setTitle("Selbsttest aktiv");
    252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
    253  view->setLabelClose("[ Selbsttest Beenden ]");
    254  view->setCall(&stop_selftest);
    255  view->repaint();
    256 
    257  win_stack.push_back(view);
    258  input(0);
    259 }
    260 
    261 void stop_selftest(int)
    262 {
    263  B15F& drv = B15F::getInstance();
    264  drv.discard();
    266  drv.reconnect();
    267  drv.digitalWrite0(0);
    268  drv.digitalWrite1(0);
    269 }
    270 
    271 void show_selftest_info(int)
    272 {
    273  ViewInfo* view = new ViewInfo();
    274  view->setTitle("Selbsttest");
    275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
    276  view->setLabelClose("[ Weiter ]");
    277  view->setCall(&start_selftest);
    278  view->repaint();
    279 
    280  win_stack.push_back(view);
    281  input(0);
    282 }
    + + +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:363
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:373
    +
    Definition: b15f.h:26
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    + +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    + +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    +
    void discard(void)
    Definition: b15f.cpp:72
    +
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:235
    +
    void reconnect(void)
    Definition: b15f.cpp:57
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    + + + + diff --git a/docs/html/ui_8h_source.html b/docs/html/ui_8h_source.html new file mode 100644 index 0000000..a53a18d --- /dev/null +++ b/docs/html/ui_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: ui/ui.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    ui.h
    +
    +
    +
    1 #ifndef UI_H
    2 #define UI_H
    3 
    4 #include <vector>
    5 #include "view_selection.h"
    6 #include "view_info.h"
    7 #include "view_monitor.h"
    8 #include "view_promt.h"
    9 
    10 void show_main(int);
    11 void input(int);
    12 void view_back(int);
    13 void finish(int);
    14 void cleanup();
    15 
    16 void show_info(int);
    17 void show_monitor(int);
    18 void show_invalid_port_input(int);
    19 void show_invalid_dac_input(int);
    20 void write_digital_output0(int);
    21 void write_digital_output1(int);
    22 void write_analog_output0(int);
    23 void write_analog_output1(int);
    24 void show_digital_output0(int);
    25 void show_digital_output1(int);
    26 void show_analog_output0(int);
    27 void show_analog_output1(int);
    28 
    29 // selftest group
    30 void show_selftest_info(int);
    31 void start_selftest(int);
    32 void stop_selftest(int);
    33 
    34 
    35 extern std::vector<View*> win_stack;
    36 extern std::thread t_refresh;
    37 
    38 #endif // UI_H
    + + + + diff --git a/docs/html/usart_8cpp_source.html b/docs/html/usart_8cpp_source.html new file mode 100644 index 0000000..a28c9ac --- /dev/null +++ b/docs/html/usart_8cpp_source.html @@ -0,0 +1,94 @@ + + + + + + + +B15F: drv/usart.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    usart.cpp
    +
    +
    +
    1 #include "usart.h"
    2 
    4 {
    5  closeDevice();
    6 }
    7 
    8 void USART::openDevice(std::string device)
    9 {
    10  // Benutze blockierenden Modus
    11  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
    12  if (file_desc <= 0)
    13  throw USARTException("Fehler beim Öffnen des Gerätes");
    14 
    15  struct termios options;
    16  int code = tcgetattr(file_desc, &options);
    17  if (code)
    18  throw USARTException("Fehler beim Lesen der Geräteparameter");
    19 
    20  options.c_cflag = CS8 | CLOCAL | CREAD;
    21  options.c_iflag = IGNPAR;
    22  options.c_oflag = 0;
    23  options.c_lflag = 0;
    24  options.c_cc[VMIN] = 0; // #bytes read returns at least
    25  options.c_cc[VTIME] = timeout;
    26  code = cfsetspeed(&options, baudrate);
    27  if (code)
    28  throw USARTException("Fehler beim Setzen der Baudrate");
    29 
    30  code = tcsetattr(file_desc, TCSANOW, &options);
    31  if (code)
    32  throw USARTException("Fehler beim Setzen der Geräteparameter");
    33 
    36 }
    37 
    39 {
    40  if (file_desc > 0)
    41  {
    42  int code = close(file_desc);
    43  if (code)
    44  throw USARTException("Fehler beim Schließen des Gerätes");
    45  file_desc = -1;
    46  }
    47 }
    48 
    50 {
    51  int code = tcflush(file_desc, TCIFLUSH);
    52  if (code)
    53  throw USARTException("Fehler beim Leeren des Eingangspuffers");
    54 }
    55 
    57 {
    58  int code = tcflush(file_desc, TCOFLUSH);
    59  if (code)
    60  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
    61 }
    62 
    64 {
    65  int code = tcdrain(file_desc);
    66  if (code)
    67  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
    68 }
    69 
    70 void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    71 {
    72  int n = read(file_desc, buffer + offset, len);
    73  if (n != len)
    74  throw USARTException(
    75  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__));
    76 }
    77 
    78 void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    79 {
    80  int n = write(file_desc, buffer + offset, len);
    81  if (n != len)
    82  throw USARTException(
    83  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__));
    84 }
    85 
    87 {
    88  return baudrate;
    89 }
    90 
    92 {
    93  return timeout;
    94 }
    95 
    96 void USART::setBaudrate(uint32_t baudrate)
    97 {
    98  this->baudrate = baudrate;
    99 }
    100 
    101 void USART::setTimeout(uint8_t timeout)
    102 {
    103  this->timeout = timeout;
    104 }
    +
    uint32_t getBaudrate(void)
    Definition: usart.cpp:86
    + +
    void closeDevice(void)
    Definition: usart.cpp:38
    +
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:78
    +
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:70
    +
    void clearInputBuffer(void)
    Definition: usart.cpp:49
    +
    uint8_t getTimeout(void)
    Definition: usart.cpp:91
    +
    void clearOutputBuffer(void)
    Definition: usart.cpp:56
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:96
    +
    virtual ~USART(void)
    Definition: usart.cpp:3
    +
    void openDevice(std::string device)
    Definition: usart.cpp:8
    +
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:101
    +
    void flushOutputBuffer(void)
    Definition: usart.cpp:63
    + + + + diff --git a/docs/html/usart_8h_source.html b/docs/html/usart_8h_source.html new file mode 100644 index 0000000..a76b9f0 --- /dev/null +++ b/docs/html/usart_8h_source.html @@ -0,0 +1,95 @@ + + + + + + + +B15F: drv/usart.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    usart.h
    +
    +
    +
    1 #ifndef USART_H
    2 #define USART_H
    3 
    4 #include <cstdint>
    5 #include <fcntl.h>
    6 #include <unistd.h>
    7 #include <termios.h>
    8 #include <sys/ioctl.h>
    9 #include "usartexception.h"
    10 
    13 class USART
    14 {
    15 public:
    16 
    17  /*************************************************
    18  * Methoden für die Verwaltung der Schnittstelle *
    19  *************************************************/
    20 
    24  explicit USART() = default;
    25 
    29  virtual ~USART(void);
    30 
    36  void openDevice(std::string device);
    37 
    42  void closeDevice(void);
    43 
    48  void clearInputBuffer(void);
    49 
    54  void clearOutputBuffer(void);
    55 
    60  void flushOutputBuffer(void);
    61 
    62  /*************************************************/
    63 
    64 
    65 
    66  /*************************************
    67  * Methoden für die Datenübertragung *
    68  *************************************/
    69 
    77  void transmit(uint8_t *buffer, uint16_t offset, uint8_t len);
    78 
    86  void receive(uint8_t *buffer, uint16_t offset, uint8_t len);
    87 
    88  /*************************************/
    89 
    90 
    91 
    92  /***************************************
    93  * Methoden für einstellbare Parameter *
    94  ***************************************/
    95 
    100  uint32_t getBaudrate(void);
    101 
    106  uint8_t getTimeout(void);
    107 
    112  void setBaudrate(uint32_t baudrate);
    113 
    118  void setTimeout(uint8_t timeout);
    119 
    120  /***************************************/
    121 
    122 private:
    123 
    124  int file_desc = -1;
    125  uint32_t baudrate = 9600;
    126  uint8_t timeout = 10;
    127 };
    128 
    129 #endif // USART_H
    +
    uint32_t getBaudrate(void)
    Definition: usart.cpp:86
    +
    USART()=default
    +
    void closeDevice(void)
    Definition: usart.cpp:38
    +
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:78
    +
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:70
    +
    void clearInputBuffer(void)
    Definition: usart.cpp:49
    +
    uint8_t getTimeout(void)
    Definition: usart.cpp:91
    +
    Definition: usart.h:13
    +
    void clearOutputBuffer(void)
    Definition: usart.cpp:56
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:96
    +
    virtual ~USART(void)
    Definition: usart.cpp:3
    +
    void openDevice(std::string device)
    Definition: usart.cpp:8
    +
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:101
    +
    void flushOutputBuffer(void)
    Definition: usart.cpp:63
    + + + + diff --git a/docs/html/usartexception_8h_source.html b/docs/html/usartexception_8h_source.html new file mode 100644 index 0000000..5c34d82 --- /dev/null +++ b/docs/html/usartexception_8h_source.html @@ -0,0 +1,87 @@ + + + + + + + +B15F: drv/usartexception.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    usartexception.h
    +
    +
    +
    1 #ifndef USARTEXCEPTION_H
    2 #define USARTEXCEPTION_H
    3 
    4 #include <exception>
    5 #include <string>
    6 
    7 // SOURCE: https://stackoverflow.com/a/8152888
    8 
    11 class USARTException: public std::exception
    12 {
    13 public:
    18  explicit USARTException(const char* message) : msg(message)
    19  {
    20  }
    21 
    26  explicit USARTException(const std::string& message) : msg(message)
    27  {
    28  }
    29 
    33  virtual ~USARTException() = default;
    34 
    39  virtual const char* what() const throw ()
    40  {
    41  return msg.c_str();
    42  }
    43 
    44 protected:
    45  std::string msg;
    46 };
    47 
    48 #endif // USARTEXCEPTION_H
    +
    USARTException(const char *message)
    + +
    virtual const char * what() const
    +
    std::string msg
    failure description
    +
    USARTException(const std::string &message)
    +
    virtual ~USARTException()=default
    + + + + diff --git a/docs/html/view_8cpp_source.html b/docs/html/view_8cpp_source.html new file mode 100644 index 0000000..02e2fa7 --- /dev/null +++ b/docs/html/view_8cpp_source.html @@ -0,0 +1,82 @@ + + + + + + + +B15F: ui/view.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    view.cpp
    +
    +
    +
    1 #include "view.h"
    2 
    3 WINDOW* View::win = nullptr;
    4 
    5 View::View()
    6 {
    7  if(!win)
    8  {
    9  B15F::abort("View::win not initialized, missing context");
    10  }
    11  getmaxyx(win, height, width); // init width and height
    12  keypad(win, TRUE);
    13 }
    14 
    15 View::~View()
    16 {
    17 }
    18 
    19 void View::setWinContext(WINDOW* win)
    20 {
    21  View::win = win;
    22 }
    23 
    24 WINDOW* View::getWinContext()
    25 {
    26  return win;
    27 }
    28 
    29 // from: https://stackoverflow.com/a/37454181
    30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
    31 {
    32  std::vector<std::string> tokens;
    33  size_t prev = 0, pos = 0;
    34  do
    35  {
    36  pos = str.find(delim, prev);
    37  if (pos == std::string::npos) pos = str.length();
    38  std::string token = str.substr(prev, pos-prev);
    39  if (!token.empty()) tokens.push_back(token);
    40  prev = pos + delim.length();
    41  }
    42  while (pos < str.length() && prev < str.length());
    43  return tokens;
    44 }
    45 
    46 
    47 void View::setTitle(std::string title)
    48 {
    49  this->title = title;
    50 }
    51 
    52 void View::repaint()
    53 {
    54  // get screen size
    55  struct winsize size;
    56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
    57  throw std::runtime_error("TIOCGWINSZ error");
    58 
    59 
    60  start_x = floor((size.ws_col - width) / 2.);
    61  start_y = floor((size.ws_row - height) / 2.);
    62 
    63  curs_set(0); // hide cursor
    64  mvwin(win, start_y, start_x);
    65  clear();
    66  wclear(win);
    67 
    68  // generic draw
    69  box(win, 0, 0);
    70  int offset_x = (width - title.length()) / 2;
    71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
    72 
    73  // specific draw
    74  draw();
    75 
    76  refresh();
    77  wrefresh(win);
    78 }
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:398
    + + + + diff --git a/docs/html/view_8h_source.html b/docs/html/view_8h_source.html new file mode 100644 index 0000000..1673a6f --- /dev/null +++ b/docs/html/view_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +B15F: ui/view.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    view.h
    +
    +
    +
    1 #ifndef VIEW_H
    2 #define VIEW_H
    3 
    4 #include <iostream>
    5 #include <cmath>
    6 #include <vector>
    7 #include <functional>
    8 #include <ncurses.h> // sudo apt-get install libncurses5-dev
    9 #include <sys/ioctl.h>
    10 #include <unistd.h>
    11 #include <signal.h>
    12 #include "../drv/b15f.h"
    13 
    14 extern std::string ERR_MSG;
    15 typedef std::function<void(int)> call_t;
    16 
    19 class View
    20 {
    21 public:
    22  View(void);
    23  virtual ~View(void);
    24 
    25  static void setWinContext(WINDOW* win);
    26  static WINDOW* getWinContext(void);
    27  static std::vector<std::string> str_split(const std::string& str, const std::string delim);
    28 
    29  virtual void setTitle(std::string title);
    30 
    31  virtual void repaint(void);
    32 
    33  virtual void draw(void) = 0;
    34  virtual call_t keypress(int& key) = 0;
    35 
    36 
    37 protected:
    38  int width, height;
    39  int start_x = 0, start_y = 0;
    40  std::string title;
    41  std::vector<call_t> calls;
    42 
    43  static WINDOW* win;
    44  constexpr static int KEY_ENT = 10;
    45 };
    46 
    47 #endif // VIEW_H
    +
    Definition: view.h:19
    + + + + diff --git a/docs/html/view__info_8cpp_source.html b/docs/html/view__info_8cpp_source.html new file mode 100644 index 0000000..40c553d --- /dev/null +++ b/docs/html/view__info_8cpp_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: ui/view_info.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    view_info.cpp
    +
    +
    +
    1 #include "view_info.h"
    2 
    3 ViewInfo::ViewInfo()
    4 {
    5  calls.push_back(nullptr);
    6 }
    7 
    8 void ViewInfo::setText(std::string text)
    9 {
    10  this->text = text;
    11 }
    12 
    13 void ViewInfo::setLabelClose(std::string label)
    14 {
    15  this->label_close = label;
    16 }
    17 
    18 void ViewInfo::setCall(call_t call)
    19 {
    20  calls[0] = call;
    21 }
    22 
    23 void ViewInfo::draw()
    24 {
    25  int li = 0;
    26  for(std::string line : str_split(text, "\n"))
    27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
    28 
    29  close_offset_x = (width - label_close.length()) / 2;
    30  close_offset_y = height - 2;
    31 
    32  wattron(win, A_REVERSE);
    33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
    34  wattroff(win, A_REVERSE);
    35 }
    36 
    37 call_t ViewInfo::keypress(int& key)
    38 {
    39  switch(key)
    40  {
    41 
    42  case KEY_MOUSE:
    43  {
    44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    45  MEVENT event;
    46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    47  {
    48  size_t column = start_x + close_offset_x;
    49  size_t row = start_y + close_offset_y;
    50  size_t mouse_x = event.x, mouse_y = event.y;
    51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    52  key = -1; // do return from view
    53  }
    54  break;
    55  }
    56  case KEY_ENT:
    57  key = -1; // do return from view
    58  break;
    59  default:
    60  break;
    61  }
    62  return calls[0];
    63 }
    + + + + diff --git a/docs/html/view__info_8h_source.html b/docs/html/view__info_8h_source.html new file mode 100644 index 0000000..8271dec --- /dev/null +++ b/docs/html/view__info_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +B15F: ui/view_info.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    view_info.h
    +
    +
    +
    1 #ifndef VIEW_INFO
    2 #define VIEW_INFO
    3 
    4 #include "view.h"
    5 
    8 class ViewInfo : public View
    9 {
    10 public:
    11  ViewInfo(void);
    12  virtual void setText(std::string text);
    13  virtual void setLabelClose(std::string label);;
    14  virtual void setCall(call_t call);
    15  virtual void draw(void) override;
    16  virtual call_t keypress(int& key) override;
    17 
    18 protected:
    19  std::string text;
    20  std::string label_close;
    21  int close_offset_x = 0;
    22  int close_offset_y = 0;
    23  constexpr static int text_offset_x = 2;
    24  constexpr static int text_offset_y = 3;
    25 };
    26 
    27 #endif // VIEW_INFO
    + +
    Definition: view.h:19
    + + + + diff --git a/docs/html/view__monitor_8cpp_source.html b/docs/html/view__monitor_8cpp_source.html new file mode 100644 index 0000000..5365229 --- /dev/null +++ b/docs/html/view__monitor_8cpp_source.html @@ -0,0 +1,92 @@ + + + + + + + +B15F: ui/view_monitor.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    view_monitor.cpp
    +
    +
    +
    1 #include "view_monitor.h"
    2 
    3 ViewMonitor::ViewMonitor() : t_worker(&ViewMonitor::worker, this)
    4 {
    5 }
    6 
    7 call_t ViewMonitor::keypress(int& key)
    8 {
    9  switch(key)
    10  {
    11 
    12  case KEY_MOUSE:
    13  {
    14  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    15  MEVENT event;
    16  bool hit = false;
    17  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    18  {
    19  size_t column = start_x + close_offset_x;
    20  size_t row = start_y + close_offset_y;
    21  size_t mouse_x = event.x, mouse_y = event.y;
    22  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    23  hit = true;
    24  }
    25  if(!hit)
    26  break;
    27 
    28  // fall through to next case
    29  [[fallthrough]];
    30  }
    31  case KEY_ENT:
    32  run_worker = false;
    33  key = -1; // do return from view
    34  wclear(win);
    35  wrefresh(win);
    36  t_worker.join();
    37  break;
    38  default:
    39  break;
    40  }
    41  return calls[0];
    42 }
    43 
    44 std::string ViewMonitor::fancyDigitalString(uint8_t& b)
    45 {
    46  std::stringstream str;
    47  str << std::bitset<8>(b).to_string();
    48  str << " ";
    49  str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec;
    50  return str.str();
    51 }
    52 
    53 std::string ViewMonitor::fancyAnalogString(uint16_t& v)
    54 {
    55  std::stringstream str;
    56  double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0;
    57 
    58  str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V ";
    59 
    60  str << "[";
    61  uint8_t p = round(v * 40.0 / 1023.0);
    62  for(uint8_t i = 0; i < p; i++)
    63  str << "X";
    64  for(uint8_t i = 0; i < 40 - p; i++)
    65  str << " ";
    66  str << "]" << std::endl;
    67 
    68  return str.str();
    69 }
    70 
    71 void ViewMonitor::worker()
    72 {
    73  B15F& drv = B15F::getInstance();
    74  while(run_worker)
    75  {
    76  try
    77  {
    78  std::this_thread::sleep_for(std::chrono::milliseconds(100));
    79 
    80  uint8_t be0 = drv.digitalRead0();
    81  uint8_t be1 = drv.digitalRead1();
    82  uint8_t dsw = drv.readDipSwitch();
    83  uint16_t adc[8];
    84  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    85  adc[i] = drv.analogRead(i);
    86 
    87 
    88  std::stringstream str;
    89 
    90  // hline
    91  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    92  if(i % 2 == 0)
    93  str << "-";
    94  else
    95  str << " ";
    96  str << std::endl;
    97 
    98  str << "Digitale Enigaenge:" << std::endl;
    99  str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl;
    100  str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl;
    101  str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl;
    102 
    103  // hline
    104  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    105  if(i % 2 == 0)
    106  str << "-";
    107  else
    108  str << " ";
    109  str << std::endl;
    110 
    111  str << "Analoge Eingaenge:" << std::endl;
    112  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    113  {
    114  str << "Kanal " << std::to_string((int) i) << ": ";
    115  str << fancyAnalogString(adc[i]) << std::endl;
    116  }
    117 
    118  text = str.str();
    119  repaint();
    120  }
    121  catch(DriverException& ex)
    122  {
    123  std::cout << "DriverException: " << ex.what() << std::endl;
    124  drv.delay_ms(1000);
    125  }
    126  catch(...)
    127  {
    128  try
    129  {
    130  drv.reconnect();
    131  }
    132  catch(...)
    133  {
    134  B15F::abort("yoho meine dudes");
    135  return;
    136  }
    137  }
    138  }
    139 }
    + +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:363
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:373
    +
    Definition: b15f.h:26
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:398
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    +
    void reconnect(void)
    Definition: b15f.cpp:57
    + + + + + diff --git a/docs/html/view__monitor_8h_source.html b/docs/html/view__monitor_8h_source.html new file mode 100644 index 0000000..339bb08 --- /dev/null +++ b/docs/html/view__monitor_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +B15F: ui/view_monitor.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    view_monitor.h
    +
    +
    +
    1 #ifndef VIEW_MONITOR_H
    2 #define VIEW_MONITOR_H
    3 
    4 #include <thread>
    5 #include <chrono>
    6 #include <sstream>
    7 #include <bitset>
    8 #include "view_info.h"
    9 #include "../drv/b15f.h"
    10 
    13 class ViewMonitor : public ViewInfo
    14 {
    15 
    16 public:
    17  ViewMonitor(void);
    18  virtual call_t keypress(int& key) override;
    19 
    20 private:
    21  std::string fancyDigitalString(uint8_t& b);
    22  std::string fancyAnalogString(uint16_t& v);
    23 
    24 protected:
    25  virtual void worker(void);
    26  volatile bool run_worker = true;
    27  std::thread t_worker;
    28 
    29 };
    30 
    31 #endif // VIEW_MONITOR_H
    + + + + + + diff --git a/docs/html/view__promt_8cpp_source.html b/docs/html/view__promt_8cpp_source.html new file mode 100644 index 0000000..30ebc5d --- /dev/null +++ b/docs/html/view__promt_8cpp_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: ui/view_promt.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    view_promt.cpp
    +
    +
    +
    1 #include "view_promt.h"
    2 
    3 void ViewPromt::draw()
    4 {
    5  curs_set(1); // show cursor
    6 
    7  int li = text_offset_y;
    8  int ci = 0;
    9  for(std::string line : str_split(message + input, "\n"))
    10  {
    11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
    12  ci = line.length() + text_offset_x;
    13  }
    14 
    15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
    16  button_offset_y = height - text_offset_y;
    17 
    18  if(selection == 0)
    19  {
    20  wattron(win, A_REVERSE);
    21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    22  wattroff(win, A_REVERSE);
    23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    25  }
    26  else
    27  {
    28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    30  wattron(win, A_REVERSE);
    31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    32  wattroff(win, A_REVERSE);
    33  }
    34  wmove(win, li, ci);
    35 }
    36 
    37 void ViewPromt::setMessage(std::string message)
    38 {
    39  this->message = message;
    40 }
    41 
    42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
    43 {
    44  label_confirm = name;
    45  call_confirm = call;
    46 }
    47 
    48 void ViewPromt::setCancel(std::string name, bool cancelable)
    49 {
    50  label_cancel = name;
    51  this->cancelable = cancelable;
    52 }
    53 
    54 std::string ViewPromt::getInput()
    55 {
    56  return input;
    57 }
    58 
    59 std::function<void(int)> ViewPromt::keypress(int& key)
    60 {
    61  std::function<void(int)> ret = nullptr;
    62  switch(key)
    63  {
    64  case KEY_BACKSPACE:
    65  if(input.length())
    66  input.pop_back();
    67  break;
    68  case '\t':
    69  case KEY_LEFT:
    70  case KEY_RIGHT:
    71  selection = (selection + 1 ) % 2;
    72  break;
    73  case KEY_MOUSE:
    74  {
    75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    76  MEVENT event;
    77  bool hit = false;
    78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    79  {
    80  size_t column_start = start_x + button_offset_x;
    81  size_t row_start = start_y + button_offset_y;
    82  size_t mouse_x = event.x, mouse_y = event.y;
    83  if(mouse_y == row_start)
    84  {
    85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
    86  {
    87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    88  hit = true;
    89  selection = 0;
    90  }
    91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
    92  {
    93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    94  hit = true;
    95  selection = 1;
    96  }
    97  }
    98  }
    99  if(!hit)
    100  break;
    101 
    102  // fall through to next case
    103  [[fallthrough]];
    104  }
    105  case KEY_ENT:
    106  if(selection == 0) // exit
    107  key = -1; // do return from view
    108  else
    109  ret = call_confirm;
    110  break;
    111  default:
    112  break;
    113  }
    114 
    115  if(key >= ' ' && key <= '~')
    116  input += (char) key;
    117 
    118  if(key != KEY_ENT)
    119  repaint();
    120  return ret;
    121 }
    + + + + diff --git a/docs/html/view__promt_8h_source.html b/docs/html/view__promt_8h_source.html new file mode 100644 index 0000000..407553e --- /dev/null +++ b/docs/html/view__promt_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +B15F: ui/view_promt.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    view_promt.h
    +
    +
    +
    1 #ifndef VIEW_PROMT_H
    2 #define VIEW_PROMT_H
    3 
    4 #include <vector>
    5 #include <string>
    6 #include "view.h"
    7 
    10 class ViewPromt : public View
    11 {
    12 public:
    13  virtual void draw(void) override;
    14  virtual void setMessage(std::string message);
    15  virtual void setConfirm(std::string name, call_t call);
    16  virtual void setCancel(std::string name, bool cancelable);
    17  virtual std::string getInput(void);
    18  virtual call_t keypress(int& key) override;
    19 
    20 protected:
    21  size_t selection = 1;
    22  std::string input;
    23  std::string message = "Input";
    24  std::string label_confirm = "[ OK ]";
    25  std::string sep = " ";
    26  std::string label_cancel = "[ Cancel ]";
    27  call_t call_confirm = nullptr;
    28  bool cancelable = true;
    29  int button_offset_x = 0, button_offset_y = 0;
    30  constexpr static int text_offset_x = 2;
    31  constexpr static int text_offset_y = 2;
    32 };
    33 
    34 #endif // VIEW_PROMT_H
    +
    Definition: view.h:19
    + + + + + diff --git a/docs/html/view__selection_8cpp_source.html b/docs/html/view__selection_8cpp_source.html new file mode 100644 index 0000000..0631ccf --- /dev/null +++ b/docs/html/view__selection_8cpp_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: ui/view_selection.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    view_selection.cpp
    +
    +
    +
    1 #include "view_selection.h"
    2 
    3 void ViewSelection::draw()
    4 {
    5  //curs_set(0); // hide cursor
    6  for(size_t i = 0; i < choices.size(); i++)
    7  {
    8  if(selection == i)
    9  wattron(win, A_REVERSE);
    10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
    11  if(selection == i)
    12  wattroff(win, A_REVERSE);
    13  }
    14 }
    15 
    16 void ViewSelection::addChoice(std::string name, call_t call)
    17 {
    18  choices.push_back(name);
    19  calls.push_back(call);
    20 }
    21 
    22 call_t ViewSelection::keypress(int& key)
    23 {
    24  call_t ret = nullptr;
    25  switch(key)
    26  {
    27  case KEY_UP:
    28  do
    29  selection = (selection - 1 + choices.size()) % choices.size();
    30  while(!choices[selection].length() && choices.size());
    31  break;
    32 
    33  case '\t':
    34  case KEY_DOWN:
    35  do
    36  selection = (selection + 1) % choices.size();
    37  while(!choices[selection].length() && choices.size());
    38  break;
    39 
    40  case KEY_MOUSE:
    41  {
    42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    43  MEVENT event;
    44  bool hit = false;
    45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    46  {
    47  size_t column_start = start_x + choice_offset_x;
    48  size_t row_start = start_y + choice_offset_y;
    49  size_t mouse_x = event.x, mouse_y = event.y;
    50  for(size_t i = 0; i < choices.size(); i++)
    51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
    52  {
    53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
    54  hit = true;
    55  selection = i;
    56  }
    57  }
    58  if(!hit)
    59  break;
    60 
    61  // fall through to next case
    62  [[fallthrough]];
    63  }
    64 
    65  case KEY_ENT:
    66  if(selection == choices.size() - 1) // exit
    67  key = -1; // do return from view
    68  else
    69  ret = calls[selection];
    70  break;
    71  default:
    72  break;
    73  }
    74  repaint();
    75  return ret;
    76 }
    + + + + diff --git a/docs/html/view__selection_8h_source.html b/docs/html/view__selection_8h_source.html new file mode 100644 index 0000000..bad2520 --- /dev/null +++ b/docs/html/view__selection_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +B15F: ui/view_selection.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    B15F +
    +
    Board 15 Famulus Edition
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    view_selection.h
    +
    +
    +
    1 #ifndef VIEW_SELECTION_H
    2 #define VIEW_SELECTION_H
    3 
    4 #include <vector>
    5 #include <string>
    6 #include "view.h"
    7 
    10 class ViewSelection : public View
    11 {
    12 public:
    13  virtual void draw(void) override;
    14  virtual void addChoice(std::string name, call_t call);
    15  virtual call_t keypress(int& key) override;
    16 
    17 
    18 protected:
    19  size_t selection = 0;
    20  std::vector<std::string> choices;
    21 
    22  constexpr static int choice_offset_x = 2;
    23  constexpr static int choice_offset_y = 3;
    24 };
    25 
    26 #endif // VIEW_SELECTION_H
    +
    Definition: view.h:19
    + + + + + From b4996e84c81e9973a7e1b5661dcc0c6ab3935f4a Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Tue, 4 Jun 2019 10:28:01 +0200 Subject: [PATCH 13/35] b15f.cpp uses only usart transmit & receive --- control/bin/b15fcli | Bin 0 -> 89776 bytes control/src/.idea/workspace.xml | 81 ++-- control/src/drv/b15f.cpp | 268 ++++++----- control/src/drv/b15f.cpp.orig | 439 ++++++++++++++++++ docs/html/CMakeCCompilerId_8c_source.html | 2 +- docs/html/CMakeCXXCompilerId_8cpp_source.html | 2 +- docs/html/annotated.html | 2 +- docs/html/b15f_8cpp_source.html | 51 +- docs/html/b15f_8h_source.html | 48 +- docs/html/backup_8cpp_source.html | 4 +- docs/html/classB15F-members.html | 2 +- docs/html/classB15F.html | 50 +- docs/html/classDot-members.html | 2 +- docs/html/classDot.html | 2 +- docs/html/classDriverException-members.html | 2 +- docs/html/classDriverException.html | 2 +- docs/html/classPlottyFile-members.html | 2 +- docs/html/classPlottyFile.html | 2 +- docs/html/classTimeoutException-members.html | 2 +- docs/html/classTimeoutException.html | 2 +- docs/html/classUSART-members.html | 2 +- docs/html/classUSART.html | 2 +- docs/html/classUSARTException-members.html | 2 +- docs/html/classUSARTException.html | 10 +- docs/html/classView-members.html | 2 +- docs/html/classView.html | 2 +- docs/html/classViewInfo-members.html | 2 +- docs/html/classViewInfo.html | 2 +- docs/html/classViewMonitor-members.html | 2 +- docs/html/classViewMonitor.html | 2 +- docs/html/classViewPromt-members.html | 2 +- docs/html/classViewPromt.html | 2 +- docs/html/classViewSelection-members.html | 2 +- docs/html/classViewSelection.html | 2 +- docs/html/classes.html | 2 +- docs/html/cli_8cpp_source.html | 6 +- .../dir_1788f8309b1a812dcb800a185471cf6c.html | 2 +- .../dir_19f2f1b99f19c12fa55b8d312cf373ed.html | 2 +- .../dir_3d3c8ff3ebf9841b39117ac899f41936.html | 2 +- .../dir_587c94d866dbb2f408f78cf41f9b2f8d.html | 2 +- .../dir_90e361ec3542f3dd076ea3ad19547437.html | 2 +- .../dir_95e29a8b8ee7c54052c171a88bb95675.html | 2 +- .../dir_f89abcb304c928c7d889aa5625570de5.html | 2 +- docs/html/dot_8cpp_source.html | 2 +- docs/html/dot_8h_source.html | 2 +- docs/html/driverexception_8h_source.html | 2 +- docs/html/feature__tests_8c_source.html | 2 +- docs/html/feature__tests_8cxx_source.html | 2 +- docs/html/files.html | 2 +- docs/html/functions.html | 2 +- docs/html/functions_func.html | 2 +- docs/html/functions_vars.html | 2 +- docs/html/hierarchy.html | 2 +- docs/html/index.html | 2 +- docs/html/plottyfile_8cpp_source.html | 2 +- docs/html/plottyfile_8h_source.html | 2 +- docs/html/timeoutexception_8h_source.html | 2 +- docs/html/ui_8cpp_source.html | 16 +- docs/html/ui_8h_source.html | 2 +- docs/html/usart_8cpp_source.html | 4 +- docs/html/usart_8h_source.html | 2 +- docs/html/usartexception_8h_source.html | 14 +- docs/html/view_8cpp_source.html | 4 +- docs/html/view_8h_source.html | 2 +- docs/html/view__info_8cpp_source.html | 2 +- docs/html/view__info_8h_source.html | 2 +- docs/html/view__monitor_8cpp_source.html | 16 +- docs/html/view__monitor_8h_source.html | 2 +- docs/html/view__promt_8cpp_source.html | 2 +- docs/html/view__promt_8h_source.html | 2 +- docs/html/view__selection_8cpp_source.html | 2 +- docs/html/view__selection_8h_source.html | 2 +- 72 files changed, 806 insertions(+), 319 deletions(-) create mode 100755 control/bin/b15fcli create mode 100644 control/src/drv/b15f.cpp.orig diff --git a/control/bin/b15fcli b/control/bin/b15fcli new file mode 100755 index 0000000000000000000000000000000000000000..65fe6788a7403dc068f3ec4d196a91e1345ea8ac GIT binary patch literal 89776 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 a1r+zF{1ukY=3Axz{plj+;id$pNA|y4v_(w- literal 0 HcmV?d00001 diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml index 87a7f90..e3f79b8 100644 --- a/control/src/.idea/workspace.xml +++ b/control/src/.idea/workspace.xml @@ -12,9 +12,7 @@
    - - - + - @@ -225,7 +214,7 @@ - + @@ -242,42 +231,42 @@ - + - + - - + + - - - - - - - - - + + - - + + + + + + + + + - + @@ -285,10 +274,10 @@ - + - - + + diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index 208bfff..4febe04 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -1,6 +1,6 @@ #include "b15f.h" -B15F* B15F::instance = nullptr; +B15F *B15F::instance = nullptr; errorhandler_t B15F::errorhandler = nullptr; B15F::B15F() @@ -12,57 +12,57 @@ void B15F::init() { std::string device = exec("bash -c 'ls /dev/ttyUSB*'"); - while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos) + while (device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || + device.find('\t') != std::string::npos) device.pop_back(); - if(device.length() == 0) + if (device.length() == 0) abort("Adapter nicht gefunden"); std::cout << PRE << "Verwende Adapter: " << device << std::endl; - std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush; usart.setBaudrate(BAUDRATE); usart.openDevice(device); std::cout << "OK" << std::endl; - std::cout << PRE << "Teste Verbindung... " << std::flush; uint8_t tries = 3; - while(tries--) + while (tries--) { // verwerfe Daten, die µC noch hat //discard(); - if(!testConnection()) + if (!testConnection()) continue; - if(!testIntConv()) + if (!testIntConv()) continue; break; } - if(tries == 0) + if (tries == 0) abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?"); std::cout << "OK" << std::endl; // Gib board info aus std::vector info = getBoardInfo(); - std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl; + std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" + << std::endl; } void B15F::reconnect() { uint8_t tries = RECONNECT_TRIES; - while(tries--) + while (tries--) { delay_ms(RECONNECT_TIMEOUT); discard(); - if(testConnection()) + if (testConnection()) return; } @@ -73,15 +73,20 @@ void B15F::discard(void) { try { - usart.clearOutputBuffer(); - for(uint8_t i = 0; i < 16; i++) + uint8_t rq[] = { - usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input) + RQ_DISC + }; + + usart.clearOutputBuffer(); + for (uint8_t i = 0; i < 16; i++) + { + usart.transmit(&rq[0], 0, sizeof(rq)); // sende discard Befehl (verwerfe input) delay_ms(4); } usart.clearInputBuffer(); } - catch(std::exception& ex) + catch (std::exception &ex) { abort(ex); } @@ -93,13 +98,17 @@ bool B15F::testConnection() srand(time(NULL)); uint8_t dummy = rand() % 256; - usart.writeByte(RQ_TEST); - usart.writeByte(dummy); + uint8_t rq[] = + { + RQ_TEST, + dummy + }; + usart.transmit(&rq[0], 0, sizeof(rq)); - uint8_t aw = usart.readByte(); - uint8_t mirror = usart.readByte(); + uint8_t aw[2]; + usart.receive(&aw[0], 0, sizeof(aw)); - return aw == MSG_OK && mirror == dummy; + return aw[0] == MSG_OK && aw[1] == dummy; } bool B15F::testIntConv() @@ -107,10 +116,17 @@ bool B15F::testIntConv() srand(time(NULL)); uint16_t dummy = rand() % (0xFFFF / 3); - usart.writeByte(RQ_INT); - usart.writeInt(dummy); + uint8_t rq[] = + { + RQ_INT, + static_cast(dummy & 0xFF), + static_cast(dummy >> 8) + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint16_t aw; + usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); - uint16_t aw = usart.readInt(); return aw == dummy * 3; } @@ -119,24 +135,30 @@ std::vector B15F::getBoardInfo(void) { std::vector info; - usart.writeByte(RQ_INFO); - - uint8_t n = usart.readByte(); - while(n--) + uint8_t rq[] = { - uint8_t len = usart.readByte(); - std::string str; + RQ_INFO + }; + usart.transmit(&rq[0], 0, sizeof(rq)); - while(len--) - { - str += static_cast(usart.readByte()); - } + uint8_t n; + usart.receive(&n, 0, sizeof(n)); - info.push_back(str); + while (n--) + { + uint8_t len; + usart.receive(&len, 0, sizeof(len)); + + char str[len + 1]; + str[len] = '\0'; + usart.receive(reinterpret_cast(&str[0]), 0, len); + + info.push_back(std::string(str)); } - uint8_t aw = usart.readByte(); - if(aw != MSG_OK) + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + if (aw != MSG_OK) abort("Board Info fehlerhalft: code " + std::to_string((int) aw)); return info; @@ -144,83 +166,121 @@ std::vector B15F::getBoardInfo(void) bool B15F::activateSelfTestMode() { - usart.writeByte(RQ_ST); + uint8_t rq[] = + { + RQ_ST + }; + usart.transmit(&rq[0], 0, sizeof(rq)); - uint8_t aw = usart.readByte(); + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); return aw == MSG_OK; } bool B15F::digitalWrite0(uint8_t port) { - usart.writeByte(RQ_BA0); - usart.writeByte(port); + uint8_t rq[] = + { + RQ_BA0, + port + }; + usart.transmit(&rq[0], 0, sizeof(rq)); - uint8_t aw = usart.readByte(); - delay_us(10); + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); return aw == MSG_OK; } bool B15F::digitalWrite1(uint8_t port) { - usart.writeByte(RQ_BA1); - usart.writeByte(port); + uint8_t rq[] = + { + RQ_BA1, + port + }; + usart.transmit(&rq[0], 0, sizeof(rq)); - uint8_t aw = usart.readByte(); - delay_us(10); + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); return aw == MSG_OK; } uint8_t B15F::digitalRead0() { usart.clearInputBuffer(); - usart.writeByte(RQ_BE0); - uint8_t byte = usart.readByte(); - delay_us(10); - return byte; + uint8_t rq[] = + { + RQ_BE0 + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; } uint8_t B15F::digitalRead1() { usart.clearInputBuffer(); - usart.writeByte(RQ_BE1); - uint8_t byte = usart.readByte(); - delay_us(10); - return byte; + uint8_t rq[] = + { + RQ_BE1 + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; } uint8_t B15F::readDipSwitch() { usart.clearInputBuffer(); - usart.writeByte(RQ_DSW); - uint8_t byte = usart.readByte(); - delay_us(10); - return byte; + uint8_t rq[] = + { + RQ_DSW + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; } bool B15F::analogWrite0(uint16_t value) { - usart.writeByte(RQ_AA0); - usart.writeInt(value); + uint8_t rq[] = + { + RQ_AA0, + static_cast(value & 0xFF), + static_cast(value >> 8) + }; + usart.transmit(&rq[0], 0, sizeof(rq)); - uint8_t aw = usart.readByte(); - delay_us(10); + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); return aw == MSG_OK; } bool B15F::analogWrite1(uint16_t value) { - usart.writeByte(RQ_AA1); - usart.writeInt(value); + uint8_t rq[] = + { + RQ_AA1, + static_cast(value & 0xFF), + static_cast(value >> 8) + }; + usart.transmit(&rq[0], 0, sizeof(rq)); - uint8_t aw = usart.readByte(); - delay_us(10); + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); return aw == MSG_OK; } uint16_t B15F::analogRead(uint8_t channel) { usart.clearInputBuffer(); - if(channel > 7) + if (channel > 7) abort("Bad ADC channel: " + std::to_string(channel)); uint8_t rq[] = @@ -231,16 +291,20 @@ uint16_t B15F::analogRead(uint8_t channel) usart.transmit(&rq[0], 0, sizeof(rq)); - uint16_t adc = usart.readInt(); + uint16_t aw; + usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); - if(adc > 1023) + if (aw > 1023) abort("Bad ADC data detected (1)"); - return adc; + return aw; } -void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count) +void +B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, + uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count) { - // check pointers + /* + // prepare pointers buffer_a += offset_a; buffer_b += offset_b; @@ -253,38 +317,31 @@ void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset usart.writeInt(static_cast(delta)); usart.writeInt(count); - for(uint16_t i = 0; i < count; i++) - { - if(buffer_a) - { + for (uint16_t i = 0; i < count; i++) { + if (buffer_a) { buffer_a[i] = usart.readInt(); - if(buffer_a[i] > 1023) // check for broken usart connection + if (buffer_a[i] > 1023) // check for broken usart connection abort("Bad ADC data detected (2)"); - } - else - { + } else { usart.readInt(); } - if(buffer_b) - { + if (buffer_b) { buffer_b[i] = usart.readInt(); - if(buffer_b[i] > 1023) // check for broken usart connection + if (buffer_b[i] > 1023) // check for broken usart connection abort("Bad ADC data detected (3)"); - } - else - { + } else { usart.readInt(); } } uint8_t aw = usart.readByte(); - if(aw != MSG_OK) + if (aw != MSG_OK) abort("Sequenz unterbrochen"); - delay_us(10); + delay_us(10);*/ } uint8_t B15F::pwmSetFrequency(uint32_t freq) @@ -294,17 +351,17 @@ uint8_t B15F::pwmSetFrequency(uint32_t freq) uint8_t rq[] = { RQ_PWM_SET_FREQ, - static_cast((freq >> 0) & 0xFF), - static_cast((freq >> 8) & 0xFF), + static_cast((freq >> 0) & 0xFF), + static_cast((freq >> 8) & 0xFF), static_cast((freq >> 16) & 0xFF), static_cast((freq >> 24) & 0xFF) }; usart.transmit(&rq[0], 0, sizeof(rq)); - uint8_t byte = usart.readByte(); - delay_us(10); - return byte; + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; } bool B15F::pwmSetValue(uint8_t value) @@ -319,8 +376,8 @@ bool B15F::pwmSetValue(uint8_t value) usart.transmit(&rq[0], 0, sizeof(rq)); - uint8_t aw = usart.readByte(); - delay_us(10); + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); return aw == MSG_OK; } @@ -337,9 +394,9 @@ bool B15F::setRegister(uint8_t adr, uint8_t val) usart.transmit(&rq[0], 0, sizeof(rq)); - uint8_t byte = usart.readByte(); - delay_us(10); - return byte == val; + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == val; } uint8_t B15F::getRegister(uint8_t adr) @@ -354,8 +411,8 @@ uint8_t B15F::getRegister(uint8_t adr) usart.transmit(&rq[0], 0, sizeof(rq)); - uint8_t aw = usart.readByte(); - delay_us(10); + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); return aw; } @@ -370,9 +427,9 @@ void B15F::delay_us(uint16_t us) std::this_thread::sleep_for(std::chrono::microseconds(us)); } -B15F& B15F::getInstance(void) +B15F &B15F::getInstance(void) { - if(!instance) + if (!instance) instance = new B15F(); return *instance; @@ -400,9 +457,10 @@ void B15F::abort(std::string msg) DriverException ex(msg); abort(ex); } -void B15F::abort(std::exception& ex) + +void B15F::abort(std::exception &ex) { - if(errorhandler) + if (errorhandler) errorhandler(ex); else { diff --git a/control/src/drv/b15f.cpp.orig b/control/src/drv/b15f.cpp.orig new file mode 100644 index 0000000..b8d1d62 --- /dev/null +++ b/control/src/drv/b15f.cpp.orig @@ -0,0 +1,439 @@ +#include "b15f.h" + +B15F *B15F::instance = nullptr; +errorhandler_t B15F::errorhandler = nullptr; + +B15F::B15F() { + init(); +} + +void B15F::init() { + + std::string device = exec("bash -c 'ls /dev/ttyUSB*'"); + while (device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || + device.find('\t') != std::string::npos) + device.pop_back(); + + if (device.length() == 0) + abort("Adapter nicht gefunden"); + + std::cout << PRE << "Verwende Adapter: " << device << std::endl; + + + std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush; + usart.setBaudrate(BAUDRATE); + usart.openDevice(device); + std::cout << "OK" << std::endl; + + + std::cout << PRE << "Teste Verbindung... " << std::flush; + uint8_t tries = 3; + while (tries--) { + // verwerfe Daten, die µC noch hat + //discard(); + + if (!testConnection()) + continue; + + if (!testIntConv()) + continue; + + break; + } + if (tries == 0) + abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?"); + std::cout << "OK" << std::endl; + + + // Gib board info aus + std::vector info = getBoardInfo(); + std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" + << std::endl; +} + +void B15F::reconnect() { + uint8_t tries = RECONNECT_TRIES; + while (tries--) { + delay_ms(RECONNECT_TIMEOUT); + discard(); + + if (testConnection()) + return; + } + + abort("Verbindung kann nicht repariert werden"); +} + +void B15F::discard(void) { + try { + uint8_t rq[] = + { + RQ_DISC + }; + + usart.clearOutputBuffer(); + for (uint8_t i = 0; i < 16; i++) { + usart.transmit(&rq[0], 0, sizeof(rq)); // sende discard Befehl (verwerfe input) + delay_ms(4); + } + usart.clearInputBuffer(); + } + catch (std::exception &ex) { + abort(ex); + } +} + +bool B15F::testConnection() { + // erzeuge zufälliges Byte + srand(time(NULL)); + uint8_t dummy = rand() % 256; + + uint8_t rq[] = + { + RQ_TEST, + dummy + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw[2]; + usart.receive(&aw[0], 0, sizeof(aw)); + + return aw[0] == MSG_OK && aw[1] == dummy; +} + +bool B15F::testIntConv() { + srand(time(NULL)); + uint16_t dummy = rand() % (0xFFFF / 3); + + uint8_t rq[] = + { + RQ_INT, + static_cast(dummy & 0xFF), + static_cast(dummy >> 8) + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint16_t aw; + usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); + + return aw == dummy * 3; +} + + +std::vector B15F::getBoardInfo(void) { + std::vector info; + + uint8_t rq[] = + { + RQ_INFO + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t n; + usart.receive(&n, 0, sizeof(n)); + + while (n--) { + uint8_t len; + usart.receive(&len, 0, sizeof(len)); + + char str[len + 1]; + str[len] = '\0'; + usart.receive(reinterpret_cast(&str[0]), 0, len); + + info.push_back(std::string(str)); + } + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + if (aw != MSG_OK) + abort("Board Info fehlerhalft: code " + std::to_string((int) aw)); + + return info; +} + +bool B15F::activateSelfTestMode() { + uint8_t rq[] = + { + RQ_ST + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +bool B15F::digitalWrite0(uint8_t port) { + uint8_t rq[] = + { + RQ_BA0, + port + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +bool B15F::digitalWrite1(uint8_t port) { + uint8_t rq[] = + { + RQ_BA1, + port + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +uint8_t B15F::digitalRead0() { + usart.clearInputBuffer(); + uint8_t rq[] = + { + RQ_BE0 + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; +} + +uint8_t B15F::digitalRead1() { + usart.clearInputBuffer(); + uint8_t rq[] = + { + RQ_BE1 + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; +} + +uint8_t B15F::readDipSwitch() { + usart.clearInputBuffer(); + uint8_t rq[] = + { + RQ_DSW + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; +} + +bool B15F::analogWrite0(uint16_t value) { + uint8_t rq[] = + { + RQ_AA0, + static_cast(value & 0xFF), + static_cast(value >> 8) + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +bool B15F::analogWrite1(uint16_t value) { + uint8_t rq[] = + { + RQ_AA1, + static_cast(value & 0xFF), + static_cast(value >> 8) + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +uint16_t B15F::analogRead(uint8_t channel) { + usart.clearInputBuffer(); + if (channel > 7) + abort("Bad ADC channel: " + std::to_string(channel)); + + uint8_t rq[] = + { + RQ_ADC, + channel + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint16_t aw; + usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); + + if (aw > 1023) + abort("Bad ADC data detected (1)"); + return aw; +} + +void +B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, + uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count) { + /* + // prepare pointers + buffer_a += offset_a; + buffer_b += offset_b; + + + usart.clearInputBuffer(); + usart.writeByte(RQ_ADC_DAC_STROKE); + usart.writeByte(channel_a); + usart.writeByte(channel_b); + usart.writeInt(start); + usart.writeInt(static_cast(delta)); + usart.writeInt(count); + + for (uint16_t i = 0; i < count; i++) { + if (buffer_a) { + buffer_a[i] = usart.readInt(); + + if (buffer_a[i] > 1023) // check for broken usart connection + abort("Bad ADC data detected (2)"); + } else { + usart.readInt(); + } + + if (buffer_b) { + buffer_b[i] = usart.readInt(); + + if (buffer_b[i] > 1023) // check for broken usart connection + abort("Bad ADC data detected (3)"); + } else { + usart.readInt(); + } + } + + uint8_t aw = usart.readByte(); + if (aw != MSG_OK) + abort("Sequenz unterbrochen"); + + delay_us(10);*/ +} + +uint8_t B15F::pwmSetFrequency(uint32_t freq) { + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_PWM_SET_FREQ, + static_cast((freq >> 0) & 0xFF), + static_cast((freq >> 8) & 0xFF), + static_cast((freq >> 16) & 0xFF), + static_cast((freq >> 24) & 0xFF) + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; +} + +bool B15F::pwmSetValue(uint8_t value) { + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_PWM_SET_VALUE, + value + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +bool B15F::setRegister(uint8_t adr, uint8_t val) { + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_SET_REG, + adr, + val + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == val; +} + +uint8_t B15F::getRegister(uint8_t adr) { + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_GET_REG, + adr + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; +} + + +void B15F::delay_ms(uint16_t ms) { + std::this_thread::sleep_for(std::chrono::milliseconds(ms)); +} + +void B15F::delay_us(uint16_t us) { + std::this_thread::sleep_for(std::chrono::microseconds(us)); +} + +B15F &B15F::getInstance(void) { + if (!instance) + instance = new B15F(); + + return *instance; +} + +// https://stackoverflow.com/a/478960 +std::string B15F::exec(std::string cmd) { + std::array buffer; + std::string result; + std::unique_ptr pipe(popen(cmd.c_str(), "r"), pclose); + if (!pipe) { + throw std::runtime_error("popen() failed!"); + } + while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) { + result += buffer.data(); + } + return result; +} + +void B15F::abort(std::string msg) { + DriverException ex(msg); + abort(ex); +} + +void B15F::abort(std::exception &ex) { + if (errorhandler) + errorhandler(ex); + else { + std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl; + std::cout << ex.what() << std::endl; + throw DriverException(ex.what()); + } +} + +void B15F::setAbortHandler(errorhandler_t func) { + errorhandler = func; +} diff --git a/docs/html/CMakeCCompilerId_8c_source.html b/docs/html/CMakeCCompilerId_8c_source.html index a7c7bda..81263ee 100644 --- a/docs/html/CMakeCCompilerId_8c_source.html +++ b/docs/html/CMakeCCompilerId_8c_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #ifdef __cplusplus
    2 # error "A C++ compiler has been selected for C."
    3 #endif
    4 
    5 #if defined(__18CXX)
    6 # define ID_VOID_MAIN
    7 #endif
    8 #if defined(__CLASSIC_C__)
    9 /* cv-qualifiers did not exist in K&R C */
    10 # define const
    11 # define volatile
    12 #endif
    13 
    14 
    15 /* Version number components: V=Version, R=Revision, P=Patch
    16  Version date components: YYYY=Year, MM=Month, DD=Day */
    17 
    18 #if defined(__INTEL_COMPILER) || defined(__ICC)
    19 # define COMPILER_ID "Intel"
    20 # if defined(_MSC_VER)
    21 # define SIMULATE_ID "MSVC"
    22 # endif
    23 /* __INTEL_COMPILER = VRP */
    24 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
    25 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
    26 # if defined(__INTEL_COMPILER_UPDATE)
    27 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
    28 # else
    29 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
    30 # endif
    31 # if defined(__INTEL_COMPILER_BUILD_DATE)
    32 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
    33 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
    34 # endif
    35 # if defined(_MSC_VER)
    36 /* _MSC_VER = VVRR */
    37 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    38 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    39 # endif
    40 
    41 #elif defined(__PATHCC__)
    42 # define COMPILER_ID "PathScale"
    43 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
    44 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
    45 # if defined(__PATHCC_PATCHLEVEL__)
    46 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
    47 # endif
    48 
    49 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
    50 # define COMPILER_ID "Embarcadero"
    51 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
    52 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
    53 # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
    54 
    55 #elif defined(__BORLANDC__)
    56 # define COMPILER_ID "Borland"
    57 /* __BORLANDC__ = 0xVRR */
    58 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
    59 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
    60 
    61 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
    62 # define COMPILER_ID "Watcom"
    63 /* __WATCOMC__ = VVRR */
    64 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
    65 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    66 # if (__WATCOMC__ % 10) > 0
    67 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    68 # endif
    69 
    70 #elif defined(__WATCOMC__)
    71 # define COMPILER_ID "OpenWatcom"
    72 /* __WATCOMC__ = VVRP + 1100 */
    73 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
    74 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    75 # if (__WATCOMC__ % 10) > 0
    76 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    77 # endif
    78 
    79 #elif defined(__SUNPRO_C)
    80 # define COMPILER_ID "SunPro"
    81 # if __SUNPRO_C >= 0x5100
    82 /* __SUNPRO_C = 0xVRRP */
    83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12)
    84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF)
    85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
    86 # else
    87 /* __SUNPRO_CC = 0xVRP */
    88 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8)
    89 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF)
    90 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
    91 # endif
    92 
    93 #elif defined(__HP_cc)
    94 # define COMPILER_ID "HP"
    95 /* __HP_cc = VVRRPP */
    96 # define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000)
    97 # define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100)
    98 # define COMPILER_VERSION_PATCH DEC(__HP_cc % 100)
    99 
    100 #elif defined(__DECC)
    101 # define COMPILER_ID "Compaq"
    102 /* __DECC_VER = VVRRTPPPP */
    103 # define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000)
    104 # define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100)
    105 # define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000)
    106 
    107 #elif defined(__IBMC__) && defined(__COMPILER_VER__)
    108 # define COMPILER_ID "zOS"
    109 # if defined(__ibmxl__)
    110 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    111 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    112 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    113 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    114 # else
    115 /* __IBMC__ = VRP */
    116 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    117 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    118 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    119 # endif
    120 
    121 
    122 #elif defined(__ibmxl__) || (defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800)
    123 # define COMPILER_ID "XL"
    124 # if defined(__ibmxl__)
    125 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    126 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    127 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    128 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    129 # else
    130 /* __IBMC__ = VRP */
    131 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    132 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    133 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    134 # endif
    135 
    136 
    137 #elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800
    138 # define COMPILER_ID "VisualAge"
    139 # if defined(__ibmxl__)
    140 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    141 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    142 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    143 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    144 # else
    145 /* __IBMC__ = VRP */
    146 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    147 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    148 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    149 # endif
    150 
    151 
    152 #elif defined(__PGI)
    153 # define COMPILER_ID "PGI"
    154 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
    155 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
    156 # if defined(__PGIC_PATCHLEVEL__)
    157 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
    158 # endif
    159 
    160 #elif defined(_CRAYC)
    161 # define COMPILER_ID "Cray"
    162 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
    163 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
    164 
    165 #elif defined(__TI_COMPILER_VERSION__)
    166 # define COMPILER_ID "TI"
    167 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
    168 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
    169 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
    170 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
    171 
    172 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
    173 # define COMPILER_ID "Fujitsu"
    174 
    175 #elif defined(__ghs__)
    176 # define COMPILER_ID "GHS"
    177 /* __GHS_VERSION_NUMBER = VVVVRP */
    178 # ifdef __GHS_VERSION_NUMBER
    179 # define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
    180 # define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
    181 # define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
    182 # endif
    183 
    184 #elif defined(__TINYC__)
    185 # define COMPILER_ID "TinyCC"
    186 
    187 #elif defined(__BCC__)
    188 # define COMPILER_ID "Bruce"
    189 
    190 #elif defined(__SCO_VERSION__)
    191 # define COMPILER_ID "SCO"
    192 
    193 #elif defined(__ARMCC_VERSION) && !defined(__clang__)
    194 # define COMPILER_ID "ARMCC"
    195 #if __ARMCC_VERSION >= 1000000
    196 /* __ARMCC_VERSION = VRRPPPP */
    197 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
    198 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
    199 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    200 #else
    201 /* __ARMCC_VERSION = VRPPPP */
    202 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
    203 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
    204 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    205 #endif
    206 
    207 
    208 #elif defined(__clang__) && defined(__apple_build_version__)
    209 # define COMPILER_ID "AppleClang"
    210 # if defined(_MSC_VER)
    211 # define SIMULATE_ID "MSVC"
    212 # endif
    213 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    214 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    215 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    216 # if defined(_MSC_VER)
    217 /* _MSC_VER = VVRR */
    218 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    219 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    220 # endif
    221 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
    222 
    223 #elif defined(__clang__)
    224 # define COMPILER_ID "Clang"
    225 # if defined(_MSC_VER)
    226 # define SIMULATE_ID "MSVC"
    227 # endif
    228 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    229 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    230 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    231 # if defined(_MSC_VER)
    232 /* _MSC_VER = VVRR */
    233 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    234 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    235 # endif
    236 
    237 #elif defined(__GNUC__)
    238 # define COMPILER_ID "GNU"
    239 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
    240 # if defined(__GNUC_MINOR__)
    241 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
    242 # endif
    243 # if defined(__GNUC_PATCHLEVEL__)
    244 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
    245 # endif
    246 
    247 #elif defined(_MSC_VER)
    248 # define COMPILER_ID "MSVC"
    249 /* _MSC_VER = VVRR */
    250 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
    251 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
    252 # if defined(_MSC_FULL_VER)
    253 # if _MSC_VER >= 1400
    254 /* _MSC_FULL_VER = VVRRPPPPP */
    255 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
    256 # else
    257 /* _MSC_FULL_VER = VVRRPPPP */
    258 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
    259 # endif
    260 # endif
    261 # if defined(_MSC_BUILD)
    262 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
    263 # endif
    264 
    265 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
    266 # define COMPILER_ID "ADSP"
    267 #if defined(__VISUALDSPVERSION__)
    268 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
    269 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
    270 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
    271 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
    272 #endif
    273 
    274 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    275 # define COMPILER_ID "IAR"
    276 # if defined(__VER__) && defined(__ICCARM__)
    277 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
    278 # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
    279 # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
    280 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    281 # elif defined(__VER__) && defined(__ICCAVR__)
    282 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
    283 # define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
    284 # define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
    285 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    286 # endif
    287 
    288 #elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC)
    289 # define COMPILER_ID "SDCC"
    290 # if defined(__SDCC_VERSION_MAJOR)
    291 # define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR)
    292 # define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR)
    293 # define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH)
    294 # else
    295 /* SDCC = VRP */
    296 # define COMPILER_VERSION_MAJOR DEC(SDCC/100)
    297 # define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10)
    298 # define COMPILER_VERSION_PATCH DEC(SDCC % 10)
    299 # endif
    300 
    301 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
    302 # define COMPILER_ID "MIPSpro"
    303 # if defined(_SGI_COMPILER_VERSION)
    304 /* _SGI_COMPILER_VERSION = VRP */
    305 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
    306 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
    307 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
    308 # else
    309 /* _COMPILER_VERSION = VRP */
    310 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
    311 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
    312 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
    313 # endif
    314 
    315 
    316 /* These compilers are either not known or too old to define an
    317  identification macro. Try to identify the platform and guess that
    318  it is the native compiler. */
    319 #elif defined(__hpux) || defined(__hpua)
    320 # define COMPILER_ID "HP"
    321 
    322 #else /* unknown compiler */
    323 # define COMPILER_ID ""
    324 #endif
    325 
    326 /* Construct the string literal in pieces to prevent the source from
    327  getting matched. Store it in a pointer rather than an array
    328  because some compilers will just produce instructions to fill the
    329  array rather than assigning a pointer to a static array. */
    330 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
    331 #ifdef SIMULATE_ID
    332 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
    333 #endif
    334 
    335 #ifdef __QNXNTO__
    336 char const* qnxnto = "INFO" ":" "qnxnto[]";
    337 #endif
    338 
    339 #if defined(__CRAYXE) || defined(__CRAYXC)
    340 char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
    341 #endif
    342 
    343 #define STRINGIFY_HELPER(X) #X
    344 #define STRINGIFY(X) STRINGIFY_HELPER(X)
    345 
    346 /* Identify known platforms by name. */
    347 #if defined(__linux) || defined(__linux__) || defined(linux)
    348 # define PLATFORM_ID "Linux"
    349 
    350 #elif defined(__CYGWIN__)
    351 # define PLATFORM_ID "Cygwin"
    352 
    353 #elif defined(__MINGW32__)
    354 # define PLATFORM_ID "MinGW"
    355 
    356 #elif defined(__APPLE__)
    357 # define PLATFORM_ID "Darwin"
    358 
    359 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
    360 # define PLATFORM_ID "Windows"
    361 
    362 #elif defined(__FreeBSD__) || defined(__FreeBSD)
    363 # define PLATFORM_ID "FreeBSD"
    364 
    365 #elif defined(__NetBSD__) || defined(__NetBSD)
    366 # define PLATFORM_ID "NetBSD"
    367 
    368 #elif defined(__OpenBSD__) || defined(__OPENBSD)
    369 # define PLATFORM_ID "OpenBSD"
    370 
    371 #elif defined(__sun) || defined(sun)
    372 # define PLATFORM_ID "SunOS"
    373 
    374 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
    375 # define PLATFORM_ID "AIX"
    376 
    377 #elif defined(__hpux) || defined(__hpux__)
    378 # define PLATFORM_ID "HP-UX"
    379 
    380 #elif defined(__HAIKU__)
    381 # define PLATFORM_ID "Haiku"
    382 
    383 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
    384 # define PLATFORM_ID "BeOS"
    385 
    386 #elif defined(__QNX__) || defined(__QNXNTO__)
    387 # define PLATFORM_ID "QNX"
    388 
    389 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
    390 # define PLATFORM_ID "Tru64"
    391 
    392 #elif defined(__riscos) || defined(__riscos__)
    393 # define PLATFORM_ID "RISCos"
    394 
    395 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
    396 # define PLATFORM_ID "SINIX"
    397 
    398 #elif defined(__UNIX_SV__)
    399 # define PLATFORM_ID "UNIX_SV"
    400 
    401 #elif defined(__bsdos__)
    402 # define PLATFORM_ID "BSDOS"
    403 
    404 #elif defined(_MPRAS) || defined(MPRAS)
    405 # define PLATFORM_ID "MP-RAS"
    406 
    407 #elif defined(__osf) || defined(__osf__)
    408 # define PLATFORM_ID "OSF1"
    409 
    410 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
    411 # define PLATFORM_ID "SCO_SV"
    412 
    413 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
    414 # define PLATFORM_ID "ULTRIX"
    415 
    416 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
    417 # define PLATFORM_ID "Xenix"
    418 
    419 #elif defined(__WATCOMC__)
    420 # if defined(__LINUX__)
    421 # define PLATFORM_ID "Linux"
    422 
    423 # elif defined(__DOS__)
    424 # define PLATFORM_ID "DOS"
    425 
    426 # elif defined(__OS2__)
    427 # define PLATFORM_ID "OS2"
    428 
    429 # elif defined(__WINDOWS__)
    430 # define PLATFORM_ID "Windows3x"
    431 
    432 # else /* unknown platform */
    433 # define PLATFORM_ID
    434 # endif
    435 
    436 #elif defined(__INTEGRITY)
    437 # if defined(INT_178B)
    438 # define PLATFORM_ID "Integrity178"
    439 
    440 # else /* regular Integrity */
    441 # define PLATFORM_ID "Integrity"
    442 # endif
    443 
    444 #else /* unknown platform */
    445 # define PLATFORM_ID
    446 
    447 #endif
    448 
    449 /* For windows compilers MSVC and Intel we can determine
    450  the architecture of the compiler being used. This is because
    451  the compilers do not have flags that can change the architecture,
    452  but rather depend on which compiler is being used
    453 */
    454 #if defined(_WIN32) && defined(_MSC_VER)
    455 # if defined(_M_IA64)
    456 # define ARCHITECTURE_ID "IA64"
    457 
    458 # elif defined(_M_X64) || defined(_M_AMD64)
    459 # define ARCHITECTURE_ID "x64"
    460 
    461 # elif defined(_M_IX86)
    462 # define ARCHITECTURE_ID "X86"
    463 
    464 # elif defined(_M_ARM64)
    465 # define ARCHITECTURE_ID "ARM64"
    466 
    467 # elif defined(_M_ARM)
    468 # if _M_ARM == 4
    469 # define ARCHITECTURE_ID "ARMV4I"
    470 # elif _M_ARM == 5
    471 # define ARCHITECTURE_ID "ARMV5I"
    472 # else
    473 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
    474 # endif
    475 
    476 # elif defined(_M_MIPS)
    477 # define ARCHITECTURE_ID "MIPS"
    478 
    479 # elif defined(_M_SH)
    480 # define ARCHITECTURE_ID "SHx"
    481 
    482 # else /* unknown architecture */
    483 # define ARCHITECTURE_ID ""
    484 # endif
    485 
    486 #elif defined(__WATCOMC__)
    487 # if defined(_M_I86)
    488 # define ARCHITECTURE_ID "I86"
    489 
    490 # elif defined(_M_IX86)
    491 # define ARCHITECTURE_ID "X86"
    492 
    493 # else /* unknown architecture */
    494 # define ARCHITECTURE_ID ""
    495 # endif
    496 
    497 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    498 # if defined(__ICCARM__)
    499 # define ARCHITECTURE_ID "ARM"
    500 
    501 # elif defined(__ICCAVR__)
    502 # define ARCHITECTURE_ID "AVR"
    503 
    504 # else /* unknown architecture */
    505 # define ARCHITECTURE_ID ""
    506 # endif
    507 
    508 #elif defined(__ghs__)
    509 # if defined(__PPC64__)
    510 # define ARCHITECTURE_ID "PPC64"
    511 
    512 # elif defined(__ppc__)
    513 # define ARCHITECTURE_ID "PPC"
    514 
    515 # elif defined(__ARM__)
    516 # define ARCHITECTURE_ID "ARM"
    517 
    518 # elif defined(__x86_64__)
    519 # define ARCHITECTURE_ID "x64"
    520 
    521 # elif defined(__i386__)
    522 # define ARCHITECTURE_ID "X86"
    523 
    524 # else /* unknown architecture */
    525 # define ARCHITECTURE_ID ""
    526 # endif
    527 #else
    528 # define ARCHITECTURE_ID
    529 #endif
    530 
    531 /* Convert integer to decimal digit literals. */
    532 #define DEC(n) \
    533  ('0' + (((n) / 10000000)%10)), \
    534  ('0' + (((n) / 1000000)%10)), \
    535  ('0' + (((n) / 100000)%10)), \
    536  ('0' + (((n) / 10000)%10)), \
    537  ('0' + (((n) / 1000)%10)), \
    538  ('0' + (((n) / 100)%10)), \
    539  ('0' + (((n) / 10)%10)), \
    540  ('0' + ((n) % 10))
    541 
    542 /* Convert integer to hex digit literals. */
    543 #define HEX(n) \
    544  ('0' + ((n)>>28 & 0xF)), \
    545  ('0' + ((n)>>24 & 0xF)), \
    546  ('0' + ((n)>>20 & 0xF)), \
    547  ('0' + ((n)>>16 & 0xF)), \
    548  ('0' + ((n)>>12 & 0xF)), \
    549  ('0' + ((n)>>8 & 0xF)), \
    550  ('0' + ((n)>>4 & 0xF)), \
    551  ('0' + ((n) & 0xF))
    552 
    553 /* Construct a string literal encoding the version number components. */
    554 #ifdef COMPILER_VERSION_MAJOR
    555 char const info_version[] =
    556 {
    557  'I', 'N', 'F', 'O', ':',
    558  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
    559  COMPILER_VERSION_MAJOR,
    560 # ifdef COMPILER_VERSION_MINOR
    561  '.', COMPILER_VERSION_MINOR,
    562 # ifdef COMPILER_VERSION_PATCH
    563  '.', COMPILER_VERSION_PATCH,
    564 # ifdef COMPILER_VERSION_TWEAK
    565  '.', COMPILER_VERSION_TWEAK,
    566 # endif
    567 # endif
    568 # endif
    569  ']','\0'
    570 };
    571 #endif
    572 
    573 /* Construct a string literal encoding the internal version number. */
    574 #ifdef COMPILER_VERSION_INTERNAL
    575 char const info_version_internal[] =
    576 {
    577  'I', 'N', 'F', 'O', ':',
    578  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
    579  'i','n','t','e','r','n','a','l','[',
    580  COMPILER_VERSION_INTERNAL,']','\0'
    581 };
    582 #endif
    583 
    584 /* Construct a string literal encoding the version number components. */
    585 #ifdef SIMULATE_VERSION_MAJOR
    586 char const info_simulate_version[] =
    587 {
    588  'I', 'N', 'F', 'O', ':',
    589  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
    590  SIMULATE_VERSION_MAJOR,
    591 # ifdef SIMULATE_VERSION_MINOR
    592  '.', SIMULATE_VERSION_MINOR,
    593 # ifdef SIMULATE_VERSION_PATCH
    594  '.', SIMULATE_VERSION_PATCH,
    595 # ifdef SIMULATE_VERSION_TWEAK
    596  '.', SIMULATE_VERSION_TWEAK,
    597 # endif
    598 # endif
    599 # endif
    600  ']','\0'
    601 };
    602 #endif
    603 
    604 /* Construct the string literal in pieces to prevent the source from
    605  getting matched. Store it in a pointer rather than an array
    606  because some compilers will just produce instructions to fill the
    607  array rather than assigning a pointer to a static array. */
    608 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
    609 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
    610 
    611 
    612 
    613 
    614 #if !defined(__STDC__)
    615 # if (defined(_MSC_VER) && !defined(__clang__)) \
    616  || (defined(__ibmxl__) || defined(__IBMC__))
    617 # define C_DIALECT "90"
    618 # else
    619 # define C_DIALECT
    620 # endif
    621 #elif __STDC_VERSION__ >= 201000L
    622 # define C_DIALECT "11"
    623 #elif __STDC_VERSION__ >= 199901L
    624 # define C_DIALECT "99"
    625 #else
    626 # define C_DIALECT "90"
    627 #endif
    628 const char* info_language_dialect_default =
    629  "INFO" ":" "dialect_default[" C_DIALECT "]";
    630 
    631 /*--------------------------------------------------------------------------*/
    632 
    633 #ifdef ID_VOID_MAIN
    634 void main() {}
    635 #else
    636 # if defined(__CLASSIC_C__)
    637 int main(argc, argv) int argc;
    638 char *argv[];
    639 # else
    640 int main(int argc, char* argv[])
    641 # endif
    642 {
    643  int require = 0;
    644  require += info_compiler[argc];
    645  require += info_platform[argc];
    646  require += info_arch[argc];
    647 #ifdef COMPILER_VERSION_MAJOR
    648  require += info_version[argc];
    649 #endif
    650 #ifdef COMPILER_VERSION_INTERNAL
    651  require += info_version_internal[argc];
    652 #endif
    653 #ifdef SIMULATE_ID
    654  require += info_simulate[argc];
    655 #endif
    656 #ifdef SIMULATE_VERSION_MAJOR
    657  require += info_simulate_version[argc];
    658 #endif
    659 #if defined(__CRAYXE) || defined(__CRAYXC)
    660  require += info_cray[argc];
    661 #endif
    662  require += info_language_dialect_default[argc];
    663  (void)argv;
    664  return require;
    665 }
    666 #endif
    diff --git a/docs/html/CMakeCXXCompilerId_8cpp_source.html b/docs/html/CMakeCXXCompilerId_8cpp_source.html index 04f58bc..3c38e14 100644 --- a/docs/html/CMakeCXXCompilerId_8cpp_source.html +++ b/docs/html/CMakeCXXCompilerId_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 /* This source file must have a .cpp extension so that all C++ compilers
    2  recognize the extension without flags. Borland does not know .cxx for
    3  example. */
    4 #ifndef __cplusplus
    5 # error "A C compiler has been selected for C++."
    6 #endif
    7 
    8 
    9 /* Version number components: V=Version, R=Revision, P=Patch
    10  Version date components: YYYY=Year, MM=Month, DD=Day */
    11 
    12 #if defined(__COMO__)
    13 # define COMPILER_ID "Comeau"
    14 /* __COMO_VERSION__ = VRR */
    15 # define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
    16 # define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
    17 
    18 #elif defined(__INTEL_COMPILER) || defined(__ICC)
    19 # define COMPILER_ID "Intel"
    20 # if defined(_MSC_VER)
    21 # define SIMULATE_ID "MSVC"
    22 # endif
    23 /* __INTEL_COMPILER = VRP */
    24 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
    25 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
    26 # if defined(__INTEL_COMPILER_UPDATE)
    27 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
    28 # else
    29 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
    30 # endif
    31 # if defined(__INTEL_COMPILER_BUILD_DATE)
    32 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
    33 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
    34 # endif
    35 # if defined(_MSC_VER)
    36 /* _MSC_VER = VVRR */
    37 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    38 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    39 # endif
    40 
    41 #elif defined(__PATHCC__)
    42 # define COMPILER_ID "PathScale"
    43 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
    44 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
    45 # if defined(__PATHCC_PATCHLEVEL__)
    46 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
    47 # endif
    48 
    49 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
    50 # define COMPILER_ID "Embarcadero"
    51 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
    52 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
    53 # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
    54 
    55 #elif defined(__BORLANDC__)
    56 # define COMPILER_ID "Borland"
    57 /* __BORLANDC__ = 0xVRR */
    58 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
    59 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
    60 
    61 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
    62 # define COMPILER_ID "Watcom"
    63 /* __WATCOMC__ = VVRR */
    64 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
    65 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    66 # if (__WATCOMC__ % 10) > 0
    67 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    68 # endif
    69 
    70 #elif defined(__WATCOMC__)
    71 # define COMPILER_ID "OpenWatcom"
    72 /* __WATCOMC__ = VVRP + 1100 */
    73 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
    74 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    75 # if (__WATCOMC__ % 10) > 0
    76 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    77 # endif
    78 
    79 #elif defined(__SUNPRO_CC)
    80 # define COMPILER_ID "SunPro"
    81 # if __SUNPRO_CC >= 0x5100
    82 /* __SUNPRO_CC = 0xVRRP */
    83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
    84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
    85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
    86 # else
    87 /* __SUNPRO_CC = 0xVRP */
    88 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
    89 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
    90 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
    91 # endif
    92 
    93 #elif defined(__HP_aCC)
    94 # define COMPILER_ID "HP"
    95 /* __HP_aCC = VVRRPP */
    96 # define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
    97 # define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
    98 # define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
    99 
    100 #elif defined(__DECCXX)
    101 # define COMPILER_ID "Compaq"
    102 /* __DECCXX_VER = VVRRTPPPP */
    103 # define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
    104 # define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100)
    105 # define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
    106 
    107 #elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
    108 # define COMPILER_ID "zOS"
    109 # if defined(__ibmxl__)
    110 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    111 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    112 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    113 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    114 # else
    115 /* __IBMCPP__ = VRP */
    116 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    117 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    118 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    119 # endif
    120 
    121 
    122 #elif defined(__ibmxl__) || (defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800)
    123 # define COMPILER_ID "XL"
    124 # if defined(__ibmxl__)
    125 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    126 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    127 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    128 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    129 # else
    130 /* __IBMCPP__ = VRP */
    131 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    132 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    133 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    134 # endif
    135 
    136 
    137 #elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
    138 # define COMPILER_ID "VisualAge"
    139 # if defined(__ibmxl__)
    140 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    141 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    142 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    143 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    144 # else
    145 /* __IBMCPP__ = VRP */
    146 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    147 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    148 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    149 # endif
    150 
    151 
    152 #elif defined(__PGI)
    153 # define COMPILER_ID "PGI"
    154 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
    155 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
    156 # if defined(__PGIC_PATCHLEVEL__)
    157 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
    158 # endif
    159 
    160 #elif defined(_CRAYC)
    161 # define COMPILER_ID "Cray"
    162 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
    163 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
    164 
    165 #elif defined(__TI_COMPILER_VERSION__)
    166 # define COMPILER_ID "TI"
    167 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
    168 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
    169 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
    170 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
    171 
    172 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
    173 # define COMPILER_ID "Fujitsu"
    174 
    175 #elif defined(__ghs__)
    176 # define COMPILER_ID "GHS"
    177 /* __GHS_VERSION_NUMBER = VVVVRP */
    178 # ifdef __GHS_VERSION_NUMBER
    179 # define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
    180 # define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
    181 # define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
    182 # endif
    183 
    184 #elif defined(__SCO_VERSION__)
    185 # define COMPILER_ID "SCO"
    186 
    187 #elif defined(__ARMCC_VERSION) && !defined(__clang__)
    188 # define COMPILER_ID "ARMCC"
    189 #if __ARMCC_VERSION >= 1000000
    190 /* __ARMCC_VERSION = VRRPPPP */
    191 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
    192 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
    193 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    194 #else
    195 /* __ARMCC_VERSION = VRPPPP */
    196 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
    197 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
    198 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    199 #endif
    200 
    201 
    202 #elif defined(__clang__) && defined(__apple_build_version__)
    203 # define COMPILER_ID "AppleClang"
    204 # if defined(_MSC_VER)
    205 # define SIMULATE_ID "MSVC"
    206 # endif
    207 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    208 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    209 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    210 # if defined(_MSC_VER)
    211 /* _MSC_VER = VVRR */
    212 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    213 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    214 # endif
    215 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
    216 
    217 #elif defined(__clang__)
    218 # define COMPILER_ID "Clang"
    219 # if defined(_MSC_VER)
    220 # define SIMULATE_ID "MSVC"
    221 # endif
    222 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    223 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    224 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    225 # if defined(_MSC_VER)
    226 /* _MSC_VER = VVRR */
    227 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    228 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    229 # endif
    230 
    231 #elif defined(__GNUC__) || defined(__GNUG__)
    232 # define COMPILER_ID "GNU"
    233 # if defined(__GNUC__)
    234 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
    235 # else
    236 # define COMPILER_VERSION_MAJOR DEC(__GNUG__)
    237 # endif
    238 # if defined(__GNUC_MINOR__)
    239 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
    240 # endif
    241 # if defined(__GNUC_PATCHLEVEL__)
    242 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
    243 # endif
    244 
    245 #elif defined(_MSC_VER)
    246 # define COMPILER_ID "MSVC"
    247 /* _MSC_VER = VVRR */
    248 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
    249 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
    250 # if defined(_MSC_FULL_VER)
    251 # if _MSC_VER >= 1400
    252 /* _MSC_FULL_VER = VVRRPPPPP */
    253 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
    254 # else
    255 /* _MSC_FULL_VER = VVRRPPPP */
    256 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
    257 # endif
    258 # endif
    259 # if defined(_MSC_BUILD)
    260 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
    261 # endif
    262 
    263 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
    264 # define COMPILER_ID "ADSP"
    265 #if defined(__VISUALDSPVERSION__)
    266 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
    267 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
    268 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
    269 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
    270 #endif
    271 
    272 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    273 # define COMPILER_ID "IAR"
    274 # if defined(__VER__) && defined(__ICCARM__)
    275 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
    276 # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
    277 # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
    278 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    279 # elif defined(__VER__) && defined(__ICCAVR__)
    280 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
    281 # define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
    282 # define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
    283 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    284 # endif
    285 
    286 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
    287 # define COMPILER_ID "MIPSpro"
    288 # if defined(_SGI_COMPILER_VERSION)
    289 /* _SGI_COMPILER_VERSION = VRP */
    290 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
    291 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
    292 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
    293 # else
    294 /* _COMPILER_VERSION = VRP */
    295 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
    296 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
    297 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
    298 # endif
    299 
    300 
    301 /* These compilers are either not known or too old to define an
    302  identification macro. Try to identify the platform and guess that
    303  it is the native compiler. */
    304 #elif defined(__hpux) || defined(__hpua)
    305 # define COMPILER_ID "HP"
    306 
    307 #else /* unknown compiler */
    308 # define COMPILER_ID ""
    309 #endif
    310 
    311 /* Construct the string literal in pieces to prevent the source from
    312  getting matched. Store it in a pointer rather than an array
    313  because some compilers will just produce instructions to fill the
    314  array rather than assigning a pointer to a static array. */
    315 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
    316 #ifdef SIMULATE_ID
    317 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
    318 #endif
    319 
    320 #ifdef __QNXNTO__
    321 char const* qnxnto = "INFO" ":" "qnxnto[]";
    322 #endif
    323 
    324 #if defined(__CRAYXE) || defined(__CRAYXC)
    325 char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
    326 #endif
    327 
    328 #define STRINGIFY_HELPER(X) #X
    329 #define STRINGIFY(X) STRINGIFY_HELPER(X)
    330 
    331 /* Identify known platforms by name. */
    332 #if defined(__linux) || defined(__linux__) || defined(linux)
    333 # define PLATFORM_ID "Linux"
    334 
    335 #elif defined(__CYGWIN__)
    336 # define PLATFORM_ID "Cygwin"
    337 
    338 #elif defined(__MINGW32__)
    339 # define PLATFORM_ID "MinGW"
    340 
    341 #elif defined(__APPLE__)
    342 # define PLATFORM_ID "Darwin"
    343 
    344 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
    345 # define PLATFORM_ID "Windows"
    346 
    347 #elif defined(__FreeBSD__) || defined(__FreeBSD)
    348 # define PLATFORM_ID "FreeBSD"
    349 
    350 #elif defined(__NetBSD__) || defined(__NetBSD)
    351 # define PLATFORM_ID "NetBSD"
    352 
    353 #elif defined(__OpenBSD__) || defined(__OPENBSD)
    354 # define PLATFORM_ID "OpenBSD"
    355 
    356 #elif defined(__sun) || defined(sun)
    357 # define PLATFORM_ID "SunOS"
    358 
    359 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
    360 # define PLATFORM_ID "AIX"
    361 
    362 #elif defined(__hpux) || defined(__hpux__)
    363 # define PLATFORM_ID "HP-UX"
    364 
    365 #elif defined(__HAIKU__)
    366 # define PLATFORM_ID "Haiku"
    367 
    368 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
    369 # define PLATFORM_ID "BeOS"
    370 
    371 #elif defined(__QNX__) || defined(__QNXNTO__)
    372 # define PLATFORM_ID "QNX"
    373 
    374 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
    375 # define PLATFORM_ID "Tru64"
    376 
    377 #elif defined(__riscos) || defined(__riscos__)
    378 # define PLATFORM_ID "RISCos"
    379 
    380 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
    381 # define PLATFORM_ID "SINIX"
    382 
    383 #elif defined(__UNIX_SV__)
    384 # define PLATFORM_ID "UNIX_SV"
    385 
    386 #elif defined(__bsdos__)
    387 # define PLATFORM_ID "BSDOS"
    388 
    389 #elif defined(_MPRAS) || defined(MPRAS)
    390 # define PLATFORM_ID "MP-RAS"
    391 
    392 #elif defined(__osf) || defined(__osf__)
    393 # define PLATFORM_ID "OSF1"
    394 
    395 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
    396 # define PLATFORM_ID "SCO_SV"
    397 
    398 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
    399 # define PLATFORM_ID "ULTRIX"
    400 
    401 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
    402 # define PLATFORM_ID "Xenix"
    403 
    404 #elif defined(__WATCOMC__)
    405 # if defined(__LINUX__)
    406 # define PLATFORM_ID "Linux"
    407 
    408 # elif defined(__DOS__)
    409 # define PLATFORM_ID "DOS"
    410 
    411 # elif defined(__OS2__)
    412 # define PLATFORM_ID "OS2"
    413 
    414 # elif defined(__WINDOWS__)
    415 # define PLATFORM_ID "Windows3x"
    416 
    417 # else /* unknown platform */
    418 # define PLATFORM_ID
    419 # endif
    420 
    421 #elif defined(__INTEGRITY)
    422 # if defined(INT_178B)
    423 # define PLATFORM_ID "Integrity178"
    424 
    425 # else /* regular Integrity */
    426 # define PLATFORM_ID "Integrity"
    427 # endif
    428 
    429 #else /* unknown platform */
    430 # define PLATFORM_ID
    431 
    432 #endif
    433 
    434 /* For windows compilers MSVC and Intel we can determine
    435  the architecture of the compiler being used. This is because
    436  the compilers do not have flags that can change the architecture,
    437  but rather depend on which compiler is being used
    438 */
    439 #if defined(_WIN32) && defined(_MSC_VER)
    440 # if defined(_M_IA64)
    441 # define ARCHITECTURE_ID "IA64"
    442 
    443 # elif defined(_M_X64) || defined(_M_AMD64)
    444 # define ARCHITECTURE_ID "x64"
    445 
    446 # elif defined(_M_IX86)
    447 # define ARCHITECTURE_ID "X86"
    448 
    449 # elif defined(_M_ARM64)
    450 # define ARCHITECTURE_ID "ARM64"
    451 
    452 # elif defined(_M_ARM)
    453 # if _M_ARM == 4
    454 # define ARCHITECTURE_ID "ARMV4I"
    455 # elif _M_ARM == 5
    456 # define ARCHITECTURE_ID "ARMV5I"
    457 # else
    458 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
    459 # endif
    460 
    461 # elif defined(_M_MIPS)
    462 # define ARCHITECTURE_ID "MIPS"
    463 
    464 # elif defined(_M_SH)
    465 # define ARCHITECTURE_ID "SHx"
    466 
    467 # else /* unknown architecture */
    468 # define ARCHITECTURE_ID ""
    469 # endif
    470 
    471 #elif defined(__WATCOMC__)
    472 # if defined(_M_I86)
    473 # define ARCHITECTURE_ID "I86"
    474 
    475 # elif defined(_M_IX86)
    476 # define ARCHITECTURE_ID "X86"
    477 
    478 # else /* unknown architecture */
    479 # define ARCHITECTURE_ID ""
    480 # endif
    481 
    482 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    483 # if defined(__ICCARM__)
    484 # define ARCHITECTURE_ID "ARM"
    485 
    486 # elif defined(__ICCAVR__)
    487 # define ARCHITECTURE_ID "AVR"
    488 
    489 # else /* unknown architecture */
    490 # define ARCHITECTURE_ID ""
    491 # endif
    492 
    493 #elif defined(__ghs__)
    494 # if defined(__PPC64__)
    495 # define ARCHITECTURE_ID "PPC64"
    496 
    497 # elif defined(__ppc__)
    498 # define ARCHITECTURE_ID "PPC"
    499 
    500 # elif defined(__ARM__)
    501 # define ARCHITECTURE_ID "ARM"
    502 
    503 # elif defined(__x86_64__)
    504 # define ARCHITECTURE_ID "x64"
    505 
    506 # elif defined(__i386__)
    507 # define ARCHITECTURE_ID "X86"
    508 
    509 # else /* unknown architecture */
    510 # define ARCHITECTURE_ID ""
    511 # endif
    512 #else
    513 # define ARCHITECTURE_ID
    514 #endif
    515 
    516 /* Convert integer to decimal digit literals. */
    517 #define DEC(n) \
    518  ('0' + (((n) / 10000000)%10)), \
    519  ('0' + (((n) / 1000000)%10)), \
    520  ('0' + (((n) / 100000)%10)), \
    521  ('0' + (((n) / 10000)%10)), \
    522  ('0' + (((n) / 1000)%10)), \
    523  ('0' + (((n) / 100)%10)), \
    524  ('0' + (((n) / 10)%10)), \
    525  ('0' + ((n) % 10))
    526 
    527 /* Convert integer to hex digit literals. */
    528 #define HEX(n) \
    529  ('0' + ((n)>>28 & 0xF)), \
    530  ('0' + ((n)>>24 & 0xF)), \
    531  ('0' + ((n)>>20 & 0xF)), \
    532  ('0' + ((n)>>16 & 0xF)), \
    533  ('0' + ((n)>>12 & 0xF)), \
    534  ('0' + ((n)>>8 & 0xF)), \
    535  ('0' + ((n)>>4 & 0xF)), \
    536  ('0' + ((n) & 0xF))
    537 
    538 /* Construct a string literal encoding the version number components. */
    539 #ifdef COMPILER_VERSION_MAJOR
    540 char const info_version[] =
    541 {
    542  'I', 'N', 'F', 'O', ':',
    543  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
    544  COMPILER_VERSION_MAJOR,
    545 # ifdef COMPILER_VERSION_MINOR
    546  '.', COMPILER_VERSION_MINOR,
    547 # ifdef COMPILER_VERSION_PATCH
    548  '.', COMPILER_VERSION_PATCH,
    549 # ifdef COMPILER_VERSION_TWEAK
    550  '.', COMPILER_VERSION_TWEAK,
    551 # endif
    552 # endif
    553 # endif
    554  ']','\0'
    555 };
    556 #endif
    557 
    558 /* Construct a string literal encoding the internal version number. */
    559 #ifdef COMPILER_VERSION_INTERNAL
    560 char const info_version_internal[] =
    561 {
    562  'I', 'N', 'F', 'O', ':',
    563  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
    564  'i','n','t','e','r','n','a','l','[',
    565  COMPILER_VERSION_INTERNAL,']','\0'
    566 };
    567 #endif
    568 
    569 /* Construct a string literal encoding the version number components. */
    570 #ifdef SIMULATE_VERSION_MAJOR
    571 char const info_simulate_version[] =
    572 {
    573  'I', 'N', 'F', 'O', ':',
    574  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
    575  SIMULATE_VERSION_MAJOR,
    576 # ifdef SIMULATE_VERSION_MINOR
    577  '.', SIMULATE_VERSION_MINOR,
    578 # ifdef SIMULATE_VERSION_PATCH
    579  '.', SIMULATE_VERSION_PATCH,
    580 # ifdef SIMULATE_VERSION_TWEAK
    581  '.', SIMULATE_VERSION_TWEAK,
    582 # endif
    583 # endif
    584 # endif
    585  ']','\0'
    586 };
    587 #endif
    588 
    589 /* Construct the string literal in pieces to prevent the source from
    590  getting matched. Store it in a pointer rather than an array
    591  because some compilers will just produce instructions to fill the
    592  array rather than assigning a pointer to a static array. */
    593 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
    594 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
    595 
    596 
    597 
    598 
    599 #if defined(_MSC_VER) && defined(_MSVC_LANG)
    600 #define CXX_STD _MSVC_LANG
    601 #else
    602 #define CXX_STD __cplusplus
    603 #endif
    604 
    605 const char* info_language_dialect_default = "INFO" ":" "dialect_default["
    606 #if CXX_STD > 201703L
    607  "20"
    608 #elif CXX_STD >= 201703L
    609  "17"
    610 #elif CXX_STD >= 201402L
    611  "14"
    612 #elif CXX_STD >= 201103L
    613  "11"
    614 #else
    615  "98"
    616 #endif
    617  "]";
    618 
    619 /*--------------------------------------------------------------------------*/
    620 
    621 int main(int argc, char* argv[])
    622 {
    623  int require = 0;
    624  require += info_compiler[argc];
    625  require += info_platform[argc];
    626 #ifdef COMPILER_VERSION_MAJOR
    627  require += info_version[argc];
    628 #endif
    629 #ifdef COMPILER_VERSION_INTERNAL
    630  require += info_version_internal[argc];
    631 #endif
    632 #ifdef SIMULATE_ID
    633  require += info_simulate[argc];
    634 #endif
    635 #ifdef SIMULATE_VERSION_MAJOR
    636  require += info_simulate_version[argc];
    637 #endif
    638 #if defined(__CRAYXE) || defined(__CRAYXC)
    639  require += info_cray[argc];
    640 #endif
    641  require += info_language_dialect_default[argc];
    642  (void)argv;
    643  return require;
    644 }
    diff --git a/docs/html/annotated.html b/docs/html/annotated.html index c4c82a7..5ac1c23 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -85,7 +85,7 @@ $(function() { diff --git a/docs/html/b15f_8cpp_source.html b/docs/html/b15f_8cpp_source.html index 46c3211..2b0aafd 100644 --- a/docs/html/b15f_8cpp_source.html +++ b/docs/html/b15f_8cpp_source.html @@ -70,47 +70,48 @@ $(function() {
    b15f.cpp
    -
    1 #include "b15f.h"
    2 
    3 B15F* B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while(device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || device.find('\t') != std::string::npos)
    16  device.pop_back();
    17 
    18  if(device.length() == 0)
    19  abort("Adapter nicht gefunden");
    20 
    21  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    22 
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31 
    32  std::cout << PRE << "Teste Verbindung... " << std::flush;
    33  uint8_t tries = 3;
    34  while(tries--)
    35  {
    36  // verwerfe Daten, die µC noch hat
    37  //discard();
    38 
    39  if(!testConnection())
    40  continue;
    41 
    42  if(!testIntConv())
    43  continue;
    44 
    45  break;
    46  }
    47  if(tries == 0)
    48  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    49  std::cout << "OK" << std::endl;
    50 
    51 
    52  // Gib board info aus
    53  std::vector<std::string> info = getBoardInfo();
    54  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while(tries--)
    61  {
    63  discard();
    64 
    65  if(testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  usart.clearOutputBuffer();
    77  for(uint8_t i = 0; i < 16; i++)
    78  {
    79  usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input)
    80  delay_ms(4);
    81  }
    82  usart.clearInputBuffer();
    83  }
    84  catch(std::exception& ex)
    85  {
    86  abort(ex);
    87  }
    88 }
    89 
    91 {
    92  // erzeuge zufälliges Byte
    93  srand(time(NULL));
    94  uint8_t dummy = rand() % 256;
    95 
    96  usart.writeByte(RQ_TEST);
    97  usart.writeByte(dummy);
    98 
    99  uint8_t aw = usart.readByte();
    100  uint8_t mirror = usart.readByte();
    101 
    102  return aw == MSG_OK && mirror == dummy;
    103 }
    104 
    106 {
    107  srand(time(NULL));
    108  uint16_t dummy = rand() % (0xFFFF / 3);
    109 
    110  usart.writeByte(RQ_INT);
    111  usart.writeInt(dummy);
    112 
    113  uint16_t aw = usart.readInt();
    114  return aw == dummy * 3;
    115 }
    116 
    117 
    118 std::vector<std::string> B15F::getBoardInfo(void)
    119 {
    120  std::vector<std::string> info;
    121 
    122  usart.writeByte(RQ_INFO);
    123 
    124  uint8_t n = usart.readByte();
    125  while(n--)
    126  {
    127  uint8_t len = usart.readByte();
    128  std::string str;
    129 
    130  while(len--)
    131  {
    132  str += static_cast<char>(usart.readByte());
    133  }
    134 
    135  info.push_back(str);
    136  }
    137 
    138  uint8_t aw = usart.readByte();
    139  if(aw != MSG_OK)
    140  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    141 
    142  return info;
    143 }
    144 
    146 {
    147  usart.writeByte(RQ_ST);
    148 
    149  uint8_t aw = usart.readByte();
    150  return aw == MSG_OK;
    151 }
    152 
    153 bool B15F::digitalWrite0(uint8_t port)
    154 {
    155  usart.writeByte(RQ_BA0);
    156  usart.writeByte(port);
    157 
    158  uint8_t aw = usart.readByte();
    159  delay_us(10);
    160  return aw == MSG_OK;
    161 }
    162 
    163 bool B15F::digitalWrite1(uint8_t port)
    164 {
    165  usart.writeByte(RQ_BA1);
    166  usart.writeByte(port);
    167 
    168  uint8_t aw = usart.readByte();
    169  delay_us(10);
    170  return aw == MSG_OK;
    171 }
    172 
    174 {
    175  usart.clearInputBuffer();
    176  usart.writeByte(RQ_BE0);
    177  uint8_t byte = usart.readByte();
    178  delay_us(10);
    179  return byte;
    180 }
    181 
    183 {
    184  usart.clearInputBuffer();
    185  usart.writeByte(RQ_BE1);
    186  uint8_t byte = usart.readByte();
    187  delay_us(10);
    188  return byte;
    189 }
    190 
    192 {
    193  usart.clearInputBuffer();
    194  usart.writeByte(RQ_DSW);
    195  uint8_t byte = usart.readByte();
    196  delay_us(10);
    197  return byte;
    198 }
    199 
    200 bool B15F::analogWrite0(uint16_t value)
    201 {
    202  usart.writeByte(RQ_AA0);
    203  usart.writeInt(value);
    204 
    205  uint8_t aw = usart.readByte();
    206  delay_us(10);
    207  return aw == MSG_OK;
    208 }
    209 
    210 bool B15F::analogWrite1(uint16_t value)
    211 {
    212  usart.writeByte(RQ_AA1);
    213  usart.writeInt(value);
    214 
    215  uint8_t aw = usart.readByte();
    216  delay_us(10);
    217  return aw == MSG_OK;
    218 }
    219 
    220 uint16_t B15F::analogRead(uint8_t channel)
    221 {
    222  usart.clearInputBuffer();
    223  if(channel > 7)
    224  abort("Bad ADC channel: " + std::to_string(channel));
    225 
    226  uint8_t rq[] =
    227  {
    228  RQ_ADC,
    229  channel
    230  };
    231 
    232  usart.transmit(&rq[0], 0, sizeof(rq));
    233 
    234  uint16_t adc = usart.readInt();
    235 
    236  if(adc > 1023)
    237  abort("Bad ADC data detected (1)");
    238  return adc;
    239 }
    240 
    241 void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    242 {
    243  // check pointers
    244  buffer_a += offset_a;
    245  buffer_b += offset_b;
    246 
    247 
    248  usart.clearInputBuffer();
    249  usart.writeByte(RQ_ADC_DAC_STROKE);
    250  usart.writeByte(channel_a);
    251  usart.writeByte(channel_b);
    252  usart.writeInt(start);
    253  usart.writeInt(static_cast<uint16_t>(delta));
    254  usart.writeInt(count);
    255 
    256  for(uint16_t i = 0; i < count; i++)
    257  {
    258  if(buffer_a)
    259  {
    260  buffer_a[i] = usart.readInt();
    261 
    262  if(buffer_a[i] > 1023) // check for broken usart connection
    263  abort("Bad ADC data detected (2)");
    264  }
    265  else
    266  {
    267  usart.readInt();
    268  }
    269 
    270  if(buffer_b)
    271  {
    272  buffer_b[i] = usart.readInt();
    273 
    274  if(buffer_b[i] > 1023) // check for broken usart connection
    275  abort("Bad ADC data detected (3)");
    276  }
    277  else
    278  {
    279  usart.readInt();
    280  }
    281  }
    282 
    283  uint8_t aw = usart.readByte();
    284  if(aw != MSG_OK)
    285  abort("Sequenz unterbrochen");
    286 
    287  delay_us(10);
    288 }
    289 
    290 uint8_t B15F::pwmSetFrequency(uint32_t freq)
    291 {
    292  usart.clearInputBuffer();
    293 
    294  uint8_t rq[] =
    295  {
    296  RQ_PWM_SET_FREQ,
    297  static_cast<uint8_t>((freq >> 0) & 0xFF),
    298  static_cast<uint8_t>((freq >> 8) & 0xFF),
    299  static_cast<uint8_t>((freq >> 16) & 0xFF),
    300  static_cast<uint8_t>((freq >> 24) & 0xFF)
    301  };
    302 
    303  usart.transmit(&rq[0], 0, sizeof(rq));
    304 
    305  uint8_t byte = usart.readByte();
    306  delay_us(10);
    307  return byte;
    308 }
    309 
    310 bool B15F::pwmSetValue(uint8_t value)
    311 {
    312  usart.clearInputBuffer();
    313 
    314  uint8_t rq[] =
    315  {
    316  RQ_PWM_SET_VALUE,
    317  value
    318  };
    319 
    320  usart.transmit(&rq[0], 0, sizeof(rq));
    321 
    322  uint8_t aw = usart.readByte();
    323  delay_us(10);
    324  return aw == MSG_OK;
    325 }
    326 
    327 bool B15F::setRegister(uint8_t adr, uint8_t val)
    328 {
    329  usart.clearInputBuffer();
    330 
    331  uint8_t rq[] =
    332  {
    333  RQ_SET_REG,
    334  adr,
    335  val
    336  };
    337 
    338  usart.transmit(&rq[0], 0, sizeof(rq));
    339 
    340  uint8_t byte = usart.readByte();
    341  delay_us(10);
    342  return byte == val;
    343 }
    344 
    345 uint8_t B15F::getRegister(uint8_t adr)
    346 {
    347  usart.clearInputBuffer();
    348 
    349  uint8_t rq[] =
    350  {
    351  RQ_GET_REG,
    352  adr
    353  };
    354 
    355  usart.transmit(&rq[0], 0, sizeof(rq));
    356 
    357  uint8_t aw = usart.readByte();
    358  delay_us(10);
    359  return aw;
    360 }
    361 
    362 
    363 void B15F::delay_ms(uint16_t ms)
    364 {
    365  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    366 }
    367 
    368 void B15F::delay_us(uint16_t us)
    369 {
    370  std::this_thread::sleep_for(std::chrono::microseconds(us));
    371 }
    372 
    374 {
    375  if(!instance)
    376  instance = new B15F();
    377 
    378  return *instance;
    379 }
    380 
    381 // https://stackoverflow.com/a/478960
    382 std::string B15F::exec(std::string cmd)
    383 {
    384  std::array<char, 128> buffer;
    385  std::string result;
    386  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    387  if (!pipe)
    388  {
    389  throw std::runtime_error("popen() failed!");
    390  }
    391  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    392  {
    393  result += buffer.data();
    394  }
    395  return result;
    396 }
    397 
    398 void B15F::abort(std::string msg)
    399 {
    400  DriverException ex(msg);
    401  abort(ex);
    402 }
    403 void B15F::abort(std::exception& ex)
    404 {
    405  if(errorhandler)
    406  errorhandler(ex);
    407  else
    408  {
    409  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    410  std::cout << ex.what() << std::endl;
    411  throw DriverException(ex.what());
    412  }
    413 }
    414 
    415 void B15F::setAbortHandler(errorhandler_t func)
    416 {
    417  errorhandler = func;
    418 }
    -
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:382
    -
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:345
    -
    void delay_us(uint16_t us)
    Definition: b15f.cpp:368
    -
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    -
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:290
    -
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:241
    -
    bool testConnection(void)
    Definition: b15f.cpp:90
    -
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:363
    -
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:327
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:373
    +
    1 #include "b15f.h"
    2 
    3 B15F *B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while (device.find(' ') != std::string::npos || device.find('\n') != std::string::npos ||
    16  device.find('\t') != std::string::npos)
    17  device.pop_back();
    18 
    19  if (device.length() == 0)
    20  abort("Adapter nicht gefunden");
    21 
    22  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31  std::cout << PRE << "Teste Verbindung... " << std::flush;
    32  uint8_t tries = 3;
    33  while (tries--)
    34  {
    35  // verwerfe Daten, die µC noch hat
    36  //discard();
    37 
    38  if (!testConnection())
    39  continue;
    40 
    41  if (!testIntConv())
    42  continue;
    43 
    44  break;
    45  }
    46  if (tries == 0)
    47  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    48  std::cout << "OK" << std::endl;
    49 
    50 
    51  // Gib board info aus
    52  std::vector<std::string> info = getBoardInfo();
    53  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")"
    54  << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while (tries--)
    61  {
    63  discard();
    64 
    65  if (testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  uint8_t rq[] =
    77  {
    78  RQ_DISC
    79  };
    80 
    81  usart.clearOutputBuffer();
    82  for (uint8_t i = 0; i < 16; i++)
    83  {
    84  usart.transmit(&rq[0], 0, sizeof(rq)); // sende discard Befehl (verwerfe input)
    85  delay_ms(4);
    86  }
    87  usart.clearInputBuffer();
    88  }
    89  catch (std::exception &ex)
    90  {
    91  abort(ex);
    92  }
    93 }
    94 
    96 {
    97  // erzeuge zufälliges Byte
    98  srand(time(NULL));
    99  uint8_t dummy = rand() % 256;
    100 
    101  uint8_t rq[] =
    102  {
    103  RQ_TEST,
    104  dummy
    105  };
    106  usart.transmit(&rq[0], 0, sizeof(rq));
    107 
    108  uint8_t aw[2];
    109  usart.receive(&aw[0], 0, sizeof(aw));
    110 
    111  return aw[0] == MSG_OK && aw[1] == dummy;
    112 }
    113 
    115 {
    116  srand(time(NULL));
    117  uint16_t dummy = rand() % (0xFFFF / 3);
    118 
    119  uint8_t rq[] =
    120  {
    121  RQ_INT,
    122  static_cast<uint8_t >(dummy & 0xFF),
    123  static_cast<uint8_t >(dummy >> 8)
    124  };
    125  usart.transmit(&rq[0], 0, sizeof(rq));
    126 
    127  uint16_t aw;
    128  usart.receive(reinterpret_cast<uint8_t*>(&aw), 0, sizeof(aw));
    129 
    130  return aw == dummy * 3;
    131 }
    132 
    133 
    134 std::vector<std::string> B15F::getBoardInfo(void)
    135 {
    136  std::vector<std::string> info;
    137 
    138  uint8_t rq[] =
    139  {
    140  RQ_INFO
    141  };
    142  usart.transmit(&rq[0], 0, sizeof(rq));
    143 
    144  uint8_t n;
    145  usart.receive(&n, 0, sizeof(n));
    146 
    147  while (n--)
    148  {
    149  uint8_t len;
    150  usart.receive(&len, 0, sizeof(len));
    151 
    152  char str[len + 1];
    153  str[len] = '\0';
    154  usart.receive(reinterpret_cast<uint8_t *>(&str[0]), 0, len);
    155 
    156  info.push_back(std::string(str));
    157  }
    158 
    159  uint8_t aw;
    160  usart.receive(&aw, 0, sizeof(aw));
    161  if (aw != MSG_OK)
    162  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    163 
    164  return info;
    165 }
    166 
    168 {
    169  uint8_t rq[] =
    170  {
    171  RQ_ST
    172  };
    173  usart.transmit(&rq[0], 0, sizeof(rq));
    174 
    175  uint8_t aw;
    176  usart.receive(&aw, 0, sizeof(aw));
    177  return aw == MSG_OK;
    178 }
    179 
    180 bool B15F::digitalWrite0(uint8_t port)
    181 {
    182  uint8_t rq[] =
    183  {
    184  RQ_BA0,
    185  port
    186  };
    187  usart.transmit(&rq[0], 0, sizeof(rq));
    188 
    189  uint8_t aw;
    190  usart.receive(&aw, 0, sizeof(aw));
    191  return aw == MSG_OK;
    192 }
    193 
    194 bool B15F::digitalWrite1(uint8_t port)
    195 {
    196  uint8_t rq[] =
    197  {
    198  RQ_BA1,
    199  port
    200  };
    201  usart.transmit(&rq[0], 0, sizeof(rq));
    202 
    203  uint8_t aw;
    204  usart.receive(&aw, 0, sizeof(aw));
    205  return aw == MSG_OK;
    206 }
    207 
    209 {
    210  usart.clearInputBuffer();
    211  uint8_t rq[] =
    212  {
    213  RQ_BE0
    214  };
    215  usart.transmit(&rq[0], 0, sizeof(rq));
    216 
    217  uint8_t aw;
    218  usart.receive(&aw, 0, sizeof(aw));
    219  return aw;
    220 }
    221 
    223 {
    224  usart.clearInputBuffer();
    225  uint8_t rq[] =
    226  {
    227  RQ_BE1
    228  };
    229  usart.transmit(&rq[0], 0, sizeof(rq));
    230 
    231  uint8_t aw;
    232  usart.receive(&aw, 0, sizeof(aw));
    233  return aw;
    234 }
    235 
    237 {
    238  usart.clearInputBuffer();
    239  uint8_t rq[] =
    240  {
    241  RQ_DSW
    242  };
    243  usart.transmit(&rq[0], 0, sizeof(rq));
    244 
    245  uint8_t aw;
    246  usart.receive(&aw, 0, sizeof(aw));
    247  return aw;
    248 }
    249 
    250 bool B15F::analogWrite0(uint16_t value)
    251 {
    252  uint8_t rq[] =
    253  {
    254  RQ_AA0,
    255  static_cast<uint8_t >(value & 0xFF),
    256  static_cast<uint8_t >(value >> 8)
    257  };
    258  usart.transmit(&rq[0], 0, sizeof(rq));
    259 
    260  uint8_t aw;
    261  usart.receive(&aw, 0, sizeof(aw));
    262  return aw == MSG_OK;
    263 }
    264 
    265 bool B15F::analogWrite1(uint16_t value)
    266 {
    267  uint8_t rq[] =
    268  {
    269  RQ_AA1,
    270  static_cast<uint8_t >(value & 0xFF),
    271  static_cast<uint8_t >(value >> 8)
    272  };
    273  usart.transmit(&rq[0], 0, sizeof(rq));
    274 
    275  uint8_t aw;
    276  usart.receive(&aw, 0, sizeof(aw));
    277  return aw == MSG_OK;
    278 }
    279 
    280 uint16_t B15F::analogRead(uint8_t channel)
    281 {
    282  usart.clearInputBuffer();
    283  if (channel > 7)
    284  abort("Bad ADC channel: " + std::to_string(channel));
    285 
    286  uint8_t rq[] =
    287  {
    288  RQ_ADC,
    289  channel
    290  };
    291 
    292  usart.transmit(&rq[0], 0, sizeof(rq));
    293 
    294  uint16_t aw;
    295  usart.receive(reinterpret_cast<uint8_t*>(&aw), 0, sizeof(aw));
    296 
    297  if (aw > 1023)
    298  abort("Bad ADC data detected (1)");
    299  return aw;
    300 }
    301 
    302 void
    303 B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b,
    304  uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    305 {
    306  /*
    307  // prepare pointers
    308  buffer_a += offset_a;
    309  buffer_b += offset_b;
    310 
    311 
    312  usart.clearInputBuffer();
    313  usart.writeByte(RQ_ADC_DAC_STROKE);
    314  usart.writeByte(channel_a);
    315  usart.writeByte(channel_b);
    316  usart.writeInt(start);
    317  usart.writeInt(static_cast<uint16_t>(delta));
    318  usart.writeInt(count);
    319 
    320  for (uint16_t i = 0; i < count; i++) {
    321  if (buffer_a) {
    322  buffer_a[i] = usart.readInt();
    323 
    324  if (buffer_a[i] > 1023) // check for broken usart connection
    325  abort("Bad ADC data detected (2)");
    326  } else {
    327  usart.readInt();
    328  }
    329 
    330  if (buffer_b) {
    331  buffer_b[i] = usart.readInt();
    332 
    333  if (buffer_b[i] > 1023) // check for broken usart connection
    334  abort("Bad ADC data detected (3)");
    335  } else {
    336  usart.readInt();
    337  }
    338  }
    339 
    340  uint8_t aw = usart.readByte();
    341  if (aw != MSG_OK)
    342  abort("Sequenz unterbrochen");
    343 
    344  delay_us(10);*/
    345 }
    346 
    347 uint8_t B15F::pwmSetFrequency(uint32_t freq)
    348 {
    349  usart.clearInputBuffer();
    350 
    351  uint8_t rq[] =
    352  {
    353  RQ_PWM_SET_FREQ,
    354  static_cast<uint8_t>((freq >> 0) & 0xFF),
    355  static_cast<uint8_t>((freq >> 8) & 0xFF),
    356  static_cast<uint8_t>((freq >> 16) & 0xFF),
    357  static_cast<uint8_t>((freq >> 24) & 0xFF)
    358  };
    359 
    360  usart.transmit(&rq[0], 0, sizeof(rq));
    361 
    362  uint8_t aw;
    363  usart.receive(&aw, 0, sizeof(aw));
    364  return aw;
    365 }
    366 
    367 bool B15F::pwmSetValue(uint8_t value)
    368 {
    369  usart.clearInputBuffer();
    370 
    371  uint8_t rq[] =
    372  {
    373  RQ_PWM_SET_VALUE,
    374  value
    375  };
    376 
    377  usart.transmit(&rq[0], 0, sizeof(rq));
    378 
    379  uint8_t aw;
    380  usart.receive(&aw, 0, sizeof(aw));
    381  return aw == MSG_OK;
    382 }
    383 
    384 bool B15F::setRegister(uint8_t adr, uint8_t val)
    385 {
    386  usart.clearInputBuffer();
    387 
    388  uint8_t rq[] =
    389  {
    390  RQ_SET_REG,
    391  adr,
    392  val
    393  };
    394 
    395  usart.transmit(&rq[0], 0, sizeof(rq));
    396 
    397  uint8_t aw;
    398  usart.receive(&aw, 0, sizeof(aw));
    399  return aw == val;
    400 }
    401 
    402 uint8_t B15F::getRegister(uint8_t adr)
    403 {
    404  usart.clearInputBuffer();
    405 
    406  uint8_t rq[] =
    407  {
    408  RQ_GET_REG,
    409  adr
    410  };
    411 
    412  usart.transmit(&rq[0], 0, sizeof(rq));
    413 
    414  uint8_t aw;
    415  usart.receive(&aw, 0, sizeof(aw));
    416  return aw;
    417 }
    418 
    419 
    420 void B15F::delay_ms(uint16_t ms)
    421 {
    422  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    423 }
    424 
    425 void B15F::delay_us(uint16_t us)
    426 {
    427  std::this_thread::sleep_for(std::chrono::microseconds(us));
    428 }
    429 
    431 {
    432  if (!instance)
    433  instance = new B15F();
    434 
    435  return *instance;
    436 }
    437 
    438 // https://stackoverflow.com/a/478960
    439 std::string B15F::exec(std::string cmd)
    440 {
    441  std::array<char, 128> buffer;
    442  std::string result;
    443  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    444  if (!pipe)
    445  {
    446  throw std::runtime_error("popen() failed!");
    447  }
    448  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    449  {
    450  result += buffer.data();
    451  }
    452  return result;
    453 }
    454 
    455 void B15F::abort(std::string msg)
    456 {
    457  DriverException ex(msg);
    458  abort(ex);
    459 }
    460 
    461 void B15F::abort(std::exception &ex)
    462 {
    463  if (errorhandler)
    464  errorhandler(ex);
    465  else
    466  {
    467  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    468  std::cout << ex.what() << std::endl;
    469  throw DriverException(ex.what());
    470  }
    471 }
    472 
    473 void B15F::setAbortHandler(errorhandler_t func)
    474 {
    475  errorhandler = func;
    476 }
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:439
    +
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:402
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:425
    +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:208
    +
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:347
    +
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:303
    +
    bool testConnection(void)
    Definition: b15f.cpp:95
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:236
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:420
    +
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:384
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:430
    Definition: b15f.h:26
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:78
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:398
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:455
    +
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:70
    void clearInputBuffer(void)
    Definition: usart.cpp:49
    void clearOutputBuffer(void)
    Definition: usart.cpp:56
    -
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    -
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:280
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:180
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:231
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:96
    -
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    -
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:118
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:167
    +
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:134
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:234
    -
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    -
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    -
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:310
    +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:265
    +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:194
    +
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:367
    void discard(void)
    Definition: b15f.cpp:72
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:232
    void openDevice(std::string device)
    Definition: usart.cpp:8
    -
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:222
    void reconnect(void)
    Definition: b15f.cpp:57
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:237
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:415
    -
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:473
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:250
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:236
    -
    bool testIntConv(void)
    Definition: b15f.cpp:105
    +
    bool testIntConv(void)
    Definition: b15f.cpp:114
    diff --git a/docs/html/b15f_8h_source.html b/docs/html/b15f_8h_source.html index 2c00d60..e07ff44 100644 --- a/docs/html/b15f_8h_source.html +++ b/docs/html/b15f_8h_source.html @@ -71,43 +71,43 @@ $(function() {
    1 #ifndef B15F_H
    2 #define B15F_H
    3 
    4 #include <iostream>
    5 #include <bits/stdc++.h>
    6 #include <string>
    7 #include <fstream>
    8 #include <cstdlib>
    9 #include <chrono>
    10 #include <cstdint>
    11 #include <vector>
    12 
    13 #include <unistd.h>
    14 #include <fcntl.h>
    15 #include <sys/ioctl.h>
    16 #include <termios.h>
    17 #include "usart.h"
    18 #include "driverexception.h"
    19 #include "timeoutexception.h"
    20 
    21 typedef std::function<void(std::exception&)> errorhandler_t;
    22 
    23 
    26 class B15F
    27 {
    28 private:
    29  // privater Konstruktor
    30  B15F(void);
    31 public:
    32 
    33  /*************************************
    34  * Grundfunktionen des B15F Treibers *
    35  *************************************/
    36 
    41  void reconnect(void);
    42 
    47  void discard(void);
    48 
    53  bool testConnection(void);
    54 
    59  bool testIntConv(void);
    60 
    65  std::vector<std::string> getBoardInfo(void);
    66 
    71  void delay_ms(uint16_t ms);
    72 
    77  void delay_us(uint16_t us);
    78 
    83  static B15F& getInstance(void);
    84 
    89  static std::string exec(std::string cmd);
    90 
    95  static void abort(std::string msg);
    96 
    101  static void abort(std::exception& ex);
    102 
    107  static void setAbortHandler(errorhandler_t func);
    108 
    109  /*************************************/
    110 
    111 
    112 
    113  /*************************
    114  * Steuerbefehle für B15 *
    115  *************************/
    116 
    122  bool activateSelfTestMode(void);
    123 
    129  bool digitalWrite0(uint8_t);
    130 
    136  bool digitalWrite1(uint8_t);
    137 
    143  uint8_t digitalRead0(void);
    144 
    150  uint8_t digitalRead1(void);
    151 
    157  uint8_t readDipSwitch(void);
    158 
    164  bool analogWrite0(uint16_t port);
    165 
    171  bool analogWrite1(uint16_t port);
    172 
    178  uint16_t analogRead(uint8_t channel);
    179 
    195  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
    196 
    204  uint8_t pwmSetFrequency(uint32_t freq);
    205 
    211  bool pwmSetValue(uint8_t value);
    212 
    220  bool setRegister(uint8_t adr, uint8_t val);
    221 
    227  uint8_t getRegister(uint8_t adr);
    228 
    229  /*************************/
    230 
    231 
    232  // CONSTANTS
    233  const std::string PRE = "[B15F] ";
    234  constexpr static uint8_t MSG_OK = 0xFF;
    235  constexpr static uint8_t MSG_FAIL = 0xFE;
    236  constexpr static uint16_t RECONNECT_TIMEOUT = 64;
    237  constexpr static uint16_t WDT_TIMEOUT = 15;
    238  constexpr static uint8_t RECONNECT_TRIES = 3;
    239  constexpr static uint32_t BAUDRATE = 57600;
    240 
    241 private:
    242 
    247  void init(void);
    248 
    249  USART usart;
    250  static B15F* instance;
    251  static errorhandler_t errorhandler;
    252 
    253  // REQUESTS
    254  constexpr static uint8_t RQ_DISC = 0;
    255  constexpr static uint8_t RQ_TEST = 1;
    256  constexpr static uint8_t RQ_INFO = 2;
    257  constexpr static uint8_t RQ_INT = 3;
    258  constexpr static uint8_t RQ_ST = 4;
    259  constexpr static uint8_t RQ_BA0 = 5;
    260  constexpr static uint8_t RQ_BA1 = 6;
    261  constexpr static uint8_t RQ_BE0 = 7;
    262  constexpr static uint8_t RQ_BE1 = 8;
    263  constexpr static uint8_t RQ_DSW = 9;
    264  constexpr static uint8_t RQ_AA0 = 10;
    265  constexpr static uint8_t RQ_AA1 = 11;
    266  constexpr static uint8_t RQ_ADC = 12;
    267  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
    268  constexpr static uint8_t RQ_PWM_SET_FREQ = 14;
    269  constexpr static uint8_t RQ_PWM_SET_VALUE = 15;
    270  constexpr static uint8_t RQ_SET_REG = 16;
    271  constexpr static uint8_t RQ_GET_REG = 17;
    272 };
    273 
    274 #endif // B15F_H
    -
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:382
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:439
    constexpr static uint8_t MSG_FAIL
    Value to reject a received command.
    Definition: b15f.h:233
    -
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:345
    -
    void delay_us(uint16_t us)
    Definition: b15f.cpp:368
    -
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    -
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:290
    -
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:241
    -
    bool testConnection(void)
    Definition: b15f.cpp:90
    -
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:363
    -
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:327
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:373
    +
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:402
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:425
    +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:208
    +
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:347
    +
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:303
    +
    bool testConnection(void)
    Definition: b15f.cpp:95
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:236
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:420
    +
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:384
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:430
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:398
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:455
    Definition: usart.h:13
    -
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    -
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:280
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:180
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:231
    -
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    -
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:118
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:167
    +
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:134
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:234
    -
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    -
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    -
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:310
    +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:265
    +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:194
    +
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:367
    void discard(void)
    Definition: b15f.cpp:72
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:232
    -
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:222
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:235
    void reconnect(void)
    Definition: b15f.cpp:57
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:237
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:415
    -
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:473
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:250
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:236
    -
    bool testIntConv(void)
    Definition: b15f.cpp:105
    +
    bool testIntConv(void)
    Definition: b15f.cpp:114
    diff --git a/docs/html/backup_8cpp_source.html b/docs/html/backup_8cpp_source.html index ceb3907..c5c60b4 100644 --- a/docs/html/backup_8cpp_source.html +++ b/docs/html/backup_8cpp_source.html @@ -71,11 +71,11 @@ $(function() {
    1 
    2 void USART::writeByte(uint8_t b)
    3 {
    4  int sent = write(file_desc, &b, 1);
    5  if (sent != 1)
    6  {
    7  std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl;
    8  usleep(100000);
    9  sent = write(file_desc, &b, 1);
    10  if (sent != 1)
    11  throw USARTException("Fehler beim Senden: writeByte()");
    12  }
    13 
    14 }
    15 
    16 void USART::writeInt(uint16_t d)
    17 {
    18  int sent = write(file_desc, reinterpret_cast<char *>(&d), 2);
    19  if (sent != 2)
    20  throw USARTException("Fehler beim Senden: writeInt()");
    21 }
    22 
    23 void USART::writeU32(uint32_t w)
    24 {
    25  int sent = write(file_desc, reinterpret_cast<char *>(&w), 4);
    26  if (sent != 4)
    27  throw USARTException("Fehler beim Senden: writeU32()");
    28 }
    29 
    30 uint8_t USART::readByte(void)
    31 {
    32  char b;
    33  auto start = std::chrono::steady_clock::now();
    34  auto end = start;
    35  uint16_t elapsed = 0;
    36  while (elapsed < timeout * 100)
    37  {
    38  int code = read(file_desc, &b, 1);
    39  if (code > 0)
    40  return static_cast<uint8_t>(b);
    41 
    42  end = std::chrono::steady_clock::now();
    43  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    44  }
    45 
    46  throw TimeoutException("Verbindung unterbrochen.", timeout);
    47 }
    48 
    49 uint16_t USART::readInt(void)
    50 {
    51  return readByte() | readByte() << 8;
    52 }
    - + diff --git a/docs/html/classB15F-members.html b/docs/html/classB15F-members.html index ea2b029..4d727c9 100644 --- a/docs/html/classB15F-members.html +++ b/docs/html/classB15F-members.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/classB15F.html b/docs/html/classB15F.html index 2f7b525..f5da455 100644 --- a/docs/html/classB15F.html +++ b/docs/html/classB15F.html @@ -202,7 +202,7 @@ constexpr static uint32_t  -

    Definition at line 403 of file b15f.cpp.

    +

    Definition at line 461 of file b15f.cpp.

    @@ -236,7 +236,7 @@ constexpr static uint32_t  -

    Definition at line 398 of file b15f.cpp.

    +

    Definition at line 455 of file b15f.cpp.

    @@ -262,7 +262,7 @@ constexpr static uint32_t  -

    Definition at line 145 of file b15f.cpp.

    +

    Definition at line 167 of file b15f.cpp.

    @@ -294,7 +294,7 @@ constexpr static uint32_t  -

    Definition at line 220 of file b15f.cpp.

    +

    Definition at line 280 of file b15f.cpp.

    @@ -386,7 +386,7 @@ constexpr static uint32_t  -

    Definition at line 241 of file b15f.cpp.

    +

    Definition at line 303 of file b15f.cpp.

    @@ -418,7 +418,7 @@ constexpr static uint32_t  -

    Definition at line 200 of file b15f.cpp.

    +

    Definition at line 250 of file b15f.cpp.

    @@ -450,7 +450,7 @@ constexpr static uint32_t  -

    Definition at line 210 of file b15f.cpp.

    +

    Definition at line 265 of file b15f.cpp.

    @@ -476,7 +476,7 @@ constexpr static uint32_t  -

    Definition at line 363 of file b15f.cpp.

    +

    Definition at line 420 of file b15f.cpp.

    @@ -502,7 +502,7 @@ constexpr static uint32_t  -

    Definition at line 368 of file b15f.cpp.

    +

    Definition at line 425 of file b15f.cpp.

    @@ -529,7 +529,7 @@ constexpr static uint32_t  -

    Definition at line 173 of file b15f.cpp.

    +

    Definition at line 208 of file b15f.cpp.

    @@ -556,7 +556,7 @@ constexpr static uint32_t  -

    Definition at line 182 of file b15f.cpp.

    +

    Definition at line 222 of file b15f.cpp.

    @@ -588,7 +588,7 @@ constexpr static uint32_t  -

    Definition at line 153 of file b15f.cpp.

    +

    Definition at line 180 of file b15f.cpp.

    @@ -620,7 +620,7 @@ constexpr static uint32_t  -

    Definition at line 163 of file b15f.cpp.

    +

    Definition at line 194 of file b15f.cpp.

    @@ -680,7 +680,7 @@ constexpr static uint32_t  -

    Definition at line 382 of file b15f.cpp.

    +

    Definition at line 439 of file b15f.cpp.

    @@ -706,7 +706,7 @@ constexpr static uint32_t  -

    Definition at line 118 of file b15f.cpp.

    +

    Definition at line 134 of file b15f.cpp.

    @@ -740,7 +740,7 @@ constexpr static uint32_t  -

    Definition at line 373 of file b15f.cpp.

    +

    Definition at line 430 of file b15f.cpp.

    @@ -772,7 +772,7 @@ constexpr static uint32_t  -

    Definition at line 345 of file b15f.cpp.

    +

    Definition at line 402 of file b15f.cpp.

    @@ -805,7 +805,7 @@ constexpr static uint32_t  -

    Definition at line 290 of file b15f.cpp.

    +

    Definition at line 347 of file b15f.cpp.

    @@ -837,7 +837,7 @@ constexpr static uint32_t  -

    Definition at line 310 of file b15f.cpp.

    +

    Definition at line 367 of file b15f.cpp.

    @@ -864,7 +864,7 @@ constexpr static uint32_t  -

    Definition at line 191 of file b15f.cpp.

    +

    Definition at line 236 of file b15f.cpp.

    @@ -924,7 +924,7 @@ constexpr static uint32_t  -

    Definition at line 415 of file b15f.cpp.

    +

    Definition at line 473 of file b15f.cpp.

    @@ -967,7 +967,7 @@ constexpr static uint32_t  -

    Definition at line 327 of file b15f.cpp.

    +

    Definition at line 384 of file b15f.cpp.

    @@ -993,7 +993,7 @@ constexpr static uint32_t  -

    Definition at line 90 of file b15f.cpp.

    +

    Definition at line 95 of file b15f.cpp.

    @@ -1019,7 +1019,7 @@ constexpr static uint32_t  -

    Definition at line 105 of file b15f.cpp.

    +

    Definition at line 114 of file b15f.cpp.

    @@ -1030,7 +1030,7 @@ constexpr static uint32_t  diff --git a/docs/html/classDot-members.html b/docs/html/classDot-members.html index da5ef98..90e9a67 100644 --- a/docs/html/classDot-members.html +++ b/docs/html/classDot-members.html @@ -76,7 +76,7 @@ $(function() { diff --git a/docs/html/classDot.html b/docs/html/classDot.html index e6f418b..afdbc85 100644 --- a/docs/html/classDot.html +++ b/docs/html/classDot.html @@ -196,7 +196,7 @@ Public Member Functions diff --git a/docs/html/classDriverException-members.html b/docs/html/classDriverException-members.html index 37e5ca6..c31fd7a 100644 --- a/docs/html/classDriverException-members.html +++ b/docs/html/classDriverException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classDriverException.html b/docs/html/classDriverException.html index f40ae8c..dbd0544 100644 --- a/docs/html/classDriverException.html +++ b/docs/html/classDriverException.html @@ -109,7 +109,7 @@ std::string msg_< diff --git a/docs/html/classPlottyFile-members.html b/docs/html/classPlottyFile-members.html index 8cb5beb..0f5e431 100644 --- a/docs/html/classPlottyFile-members.html +++ b/docs/html/classPlottyFile-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/docs/html/classPlottyFile.html b/docs/html/classPlottyFile.html index cd79636..cb1c533 100644 --- a/docs/html/classPlottyFile.html +++ b/docs/html/classPlottyFile.html @@ -811,7 +811,7 @@ Public Member Functions diff --git a/docs/html/classTimeoutException-members.html b/docs/html/classTimeoutException-members.html index 156b33b..820b7b2 100644 --- a/docs/html/classTimeoutException-members.html +++ b/docs/html/classTimeoutException-members.html @@ -78,7 +78,7 @@ $(function() { diff --git a/docs/html/classTimeoutException.html b/docs/html/classTimeoutException.html index 505363b..66d4503 100644 --- a/docs/html/classTimeoutException.html +++ b/docs/html/classTimeoutException.html @@ -112,7 +112,7 @@ int m_timeout diff --git a/docs/html/classUSART-members.html b/docs/html/classUSART-members.html index 12b5a35..8366260 100644 --- a/docs/html/classUSART-members.html +++ b/docs/html/classUSART-members.html @@ -85,7 +85,7 @@ $(function() { diff --git a/docs/html/classUSART.html b/docs/html/classUSART.html index 3a81f92..4eb8a95 100644 --- a/docs/html/classUSART.html +++ b/docs/html/classUSART.html @@ -489,7 +489,7 @@ Public Member Functions diff --git a/docs/html/classUSARTException-members.html b/docs/html/classUSARTException-members.html index c9696e1..72be017 100644 --- a/docs/html/classUSARTException-members.html +++ b/docs/html/classUSARTException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classUSARTException.html b/docs/html/classUSARTException.html index bab5acb..3f7d649 100644 --- a/docs/html/classUSARTException.html +++ b/docs/html/classUSARTException.html @@ -102,7 +102,7 @@ std::string 

    Detailed Description

    Exception for USART problems, for instance buffer overflow.

    -

    Definition at line 11 of file usartexception.h.

    +

    Definition at line 9 of file usartexception.h.

    Constructor & Destructor Documentation

    ◆ USARTException() [1/2]

    @@ -134,7 +134,7 @@ std::string  -

    Definition at line 18 of file usartexception.h.

    +

    Definition at line 16 of file usartexception.h.

    @@ -168,7 +168,7 @@ std::string  -

    Definition at line 26 of file usartexception.h.

    +

    Definition at line 24 of file usartexception.h.

    @@ -229,7 +229,7 @@ std::string  @@ -239,7 +239,7 @@ std::string  diff --git a/docs/html/classView-members.html b/docs/html/classView-members.html index a9ed5a9..fc7095a 100644 --- a/docs/html/classView-members.html +++ b/docs/html/classView-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/docs/html/classView.html b/docs/html/classView.html index fa71626..bd00dda 100644 --- a/docs/html/classView.html +++ b/docs/html/classView.html @@ -157,7 +157,7 @@ constexpr static int KEY_E diff --git a/docs/html/classViewInfo-members.html b/docs/html/classViewInfo-members.html index 8c6fde2..73d04e5 100644 --- a/docs/html/classViewInfo-members.html +++ b/docs/html/classViewInfo-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/docs/html/classViewInfo.html b/docs/html/classViewInfo.html index 204d1a1..79587c4 100644 --- a/docs/html/classViewInfo.html +++ b/docs/html/classViewInfo.html @@ -185,7 +185,7 @@ static std::vector< std::string >  diff --git a/docs/html/classViewMonitor-members.html b/docs/html/classViewMonitor-members.html index e3e7551..60da14d 100644 --- a/docs/html/classViewMonitor-members.html +++ b/docs/html/classViewMonitor-members.html @@ -103,7 +103,7 @@ $(function() { diff --git a/docs/html/classViewMonitor.html b/docs/html/classViewMonitor.html index 91b330c..4915a9b 100644 --- a/docs/html/classViewMonitor.html +++ b/docs/html/classViewMonitor.html @@ -197,7 +197,7 @@ constexpr static int KEY_E diff --git a/docs/html/classViewPromt-members.html b/docs/html/classViewPromt-members.html index 7209583..70dad1e 100644 --- a/docs/html/classViewPromt-members.html +++ b/docs/html/classViewPromt-members.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/classViewPromt.html b/docs/html/classViewPromt.html index c896e6b..a74c7ff 100644 --- a/docs/html/classViewPromt.html +++ b/docs/html/classViewPromt.html @@ -205,7 +205,7 @@ static std::vector< std::string >  diff --git a/docs/html/classViewSelection-members.html b/docs/html/classViewSelection-members.html index d819e76..b76a262 100644 --- a/docs/html/classViewSelection-members.html +++ b/docs/html/classViewSelection-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/docs/html/classViewSelection.html b/docs/html/classViewSelection.html index 0af6fb2..9f4a292 100644 --- a/docs/html/classViewSelection.html +++ b/docs/html/classViewSelection.html @@ -172,7 +172,7 @@ static std::vector< std::string >  diff --git a/docs/html/classes.html b/docs/html/classes.html index e13d485..5da6c23 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/cli_8cpp_source.html b/docs/html/cli_8cpp_source.html index ae2abad..c8a025e 100644 --- a/docs/html/cli_8cpp_source.html +++ b/docs/html/cli_8cpp_source.html @@ -68,11 +68,11 @@ $(function() {
    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
    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 }
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:373
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:415
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:430
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:473
    diff --git a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html index 871f95a..a908015 100644 --- a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html +++ b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html b/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html index a53fe67..24fcf59 100644 --- a/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html +++ b/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html b/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html index f86514e..5939e6f 100644 --- a/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html +++ b/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html @@ -77,7 +77,7 @@ Directories diff --git a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html index 878320b..7af269d 100644 --- a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html +++ b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html b/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html index 7a3fec8..38d6b31 100644 --- a/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html +++ b/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html b/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html index 4c678a4..8c90198 100644 --- a/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html +++ b/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html @@ -77,7 +77,7 @@ Directories diff --git a/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html b/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html index 324da84..aa7bba6 100644 --- a/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html +++ b/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dot_8cpp_source.html b/docs/html/dot_8cpp_source.html index d4fc2e5..914f15a 100644 --- a/docs/html/dot_8cpp_source.html +++ b/docs/html/dot_8cpp_source.html @@ -77,7 +77,7 @@ $(function() {
    Dot(uint16_t x, uint16_t y, uint8_t curve)
    Definition: dot.cpp:3
    diff --git a/docs/html/dot_8h_source.html b/docs/html/dot_8h_source.html index 1b7d1f7..78c98a1 100644 --- a/docs/html/dot_8h_source.html +++ b/docs/html/dot_8h_source.html @@ -78,7 +78,7 @@ $(function() {
    Dot(uint16_t x, uint16_t y, uint8_t curve)
    Definition: dot.cpp:3
    diff --git a/docs/html/driverexception_8h_source.html b/docs/html/driverexception_8h_source.html index 9bffda7..4f01106 100644 --- a/docs/html/driverexception_8h_source.html +++ b/docs/html/driverexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/feature__tests_8c_source.html b/docs/html/feature__tests_8c_source.html index efcd263..c666e6f 100644 --- a/docs/html/feature__tests_8c_source.html +++ b/docs/html/feature__tests_8c_source.html @@ -73,7 +73,7 @@ $(function() {
    1 
    2 const char features[] = {"\n"
    3  "C_FEATURE:"
    4 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304
    5  "1"
    6 #else
    7  "0"
    8 #endif
    9  "c_function_prototypes\n"
    10  "C_FEATURE:"
    11 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    12  "1"
    13 #else
    14  "0"
    15 #endif
    16  "c_restrict\n"
    17  "C_FEATURE:"
    18 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L
    19  "1"
    20 #else
    21  "0"
    22 #endif
    23  "c_static_assert\n"
    24  "C_FEATURE:"
    25 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    26  "1"
    27 #else
    28  "0"
    29 #endif
    30  "c_variadic_macros\n"
    31 
    32  };
    33 
    34 int main(int argc, char** argv)
    35 {
    36  (void)argv;
    37  return features[argc];
    38 }
    diff --git a/docs/html/feature__tests_8cxx_source.html b/docs/html/feature__tests_8cxx_source.html index ee23257..aed34e6 100644 --- a/docs/html/feature__tests_8cxx_source.html +++ b/docs/html/feature__tests_8cxx_source.html @@ -73,7 +73,7 @@ $(function() {
    1 
    2  const char features[] = {"\n"
    3 "CXX_FEATURE:"
    4 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
    5 "1"
    6 #else
    7 "0"
    8 #endif
    9 "cxx_aggregate_default_initializers\n"
    10 "CXX_FEATURE:"
    11 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    12 "1"
    13 #else
    14 "0"
    15 #endif
    16 "cxx_alias_templates\n"
    17 "CXX_FEATURE:"
    18 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    19 "1"
    20 #else
    21 "0"
    22 #endif
    23 "cxx_alignas\n"
    24 "CXX_FEATURE:"
    25 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    26 "1"
    27 #else
    28 "0"
    29 #endif
    30 "cxx_alignof\n"
    31 "CXX_FEATURE:"
    32 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    33 "1"
    34 #else
    35 "0"
    36 #endif
    37 "cxx_attributes\n"
    38 "CXX_FEATURE:"
    39 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    40 "1"
    41 #else
    42 "0"
    43 #endif
    44 "cxx_attribute_deprecated\n"
    45 "CXX_FEATURE:"
    46 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    47 "1"
    48 #else
    49 "0"
    50 #endif
    51 "cxx_auto_type\n"
    52 "CXX_FEATURE:"
    53 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    54 "1"
    55 #else
    56 "0"
    57 #endif
    58 "cxx_binary_literals\n"
    59 "CXX_FEATURE:"
    60 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    61 "1"
    62 #else
    63 "0"
    64 #endif
    65 "cxx_constexpr\n"
    66 "CXX_FEATURE:"
    67 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    68 "1"
    69 #else
    70 "0"
    71 #endif
    72 "cxx_contextual_conversions\n"
    73 "CXX_FEATURE:"
    74 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    75 "1"
    76 #else
    77 "0"
    78 #endif
    79 "cxx_decltype\n"
    80 "CXX_FEATURE:"
    81 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    82 "1"
    83 #else
    84 "0"
    85 #endif
    86 "cxx_decltype_auto\n"
    87 "CXX_FEATURE:"
    88 #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L
    89 "1"
    90 #else
    91 "0"
    92 #endif
    93 "cxx_decltype_incomplete_return_types\n"
    94 "CXX_FEATURE:"
    95 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    96 "1"
    97 #else
    98 "0"
    99 #endif
    100 "cxx_default_function_template_args\n"
    101 "CXX_FEATURE:"
    102 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    103 "1"
    104 #else
    105 "0"
    106 #endif
    107 "cxx_defaulted_functions\n"
    108 "CXX_FEATURE:"
    109 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    110 "1"
    111 #else
    112 "0"
    113 #endif
    114 "cxx_defaulted_move_initializers\n"
    115 "CXX_FEATURE:"
    116 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    117 "1"
    118 #else
    119 "0"
    120 #endif
    121 "cxx_delegating_constructors\n"
    122 "CXX_FEATURE:"
    123 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    124 "1"
    125 #else
    126 "0"
    127 #endif
    128 "cxx_deleted_functions\n"
    129 "CXX_FEATURE:"
    130 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    131 "1"
    132 #else
    133 "0"
    134 #endif
    135 "cxx_digit_separators\n"
    136 "CXX_FEATURE:"
    137 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    138 "1"
    139 #else
    140 "0"
    141 #endif
    142 "cxx_enum_forward_declarations\n"
    143 "CXX_FEATURE:"
    144 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    145 "1"
    146 #else
    147 "0"
    148 #endif
    149 "cxx_explicit_conversions\n"
    150 "CXX_FEATURE:"
    151 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    152 "1"
    153 #else
    154 "0"
    155 #endif
    156 "cxx_extended_friend_declarations\n"
    157 "CXX_FEATURE:"
    158 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    159 "1"
    160 #else
    161 "0"
    162 #endif
    163 "cxx_extern_templates\n"
    164 "CXX_FEATURE:"
    165 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    166 "1"
    167 #else
    168 "0"
    169 #endif
    170 "cxx_final\n"
    171 "CXX_FEATURE:"
    172 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    173 "1"
    174 #else
    175 "0"
    176 #endif
    177 "cxx_func_identifier\n"
    178 "CXX_FEATURE:"
    179 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    180 "1"
    181 #else
    182 "0"
    183 #endif
    184 "cxx_generalized_initializers\n"
    185 "CXX_FEATURE:"
    186 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    187 "1"
    188 #else
    189 "0"
    190 #endif
    191 "cxx_generic_lambdas\n"
    192 "CXX_FEATURE:"
    193 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    194 "1"
    195 #else
    196 "0"
    197 #endif
    198 "cxx_inheriting_constructors\n"
    199 "CXX_FEATURE:"
    200 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    201 "1"
    202 #else
    203 "0"
    204 #endif
    205 "cxx_inline_namespaces\n"
    206 "CXX_FEATURE:"
    207 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    208 "1"
    209 #else
    210 "0"
    211 #endif
    212 "cxx_lambdas\n"
    213 "CXX_FEATURE:"
    214 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    215 "1"
    216 #else
    217 "0"
    218 #endif
    219 "cxx_lambda_init_captures\n"
    220 "CXX_FEATURE:"
    221 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    222 "1"
    223 #else
    224 "0"
    225 #endif
    226 "cxx_local_type_template_args\n"
    227 "CXX_FEATURE:"
    228 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    229 "1"
    230 #else
    231 "0"
    232 #endif
    233 "cxx_long_long_type\n"
    234 "CXX_FEATURE:"
    235 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    236 "1"
    237 #else
    238 "0"
    239 #endif
    240 "cxx_noexcept\n"
    241 "CXX_FEATURE:"
    242 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    243 "1"
    244 #else
    245 "0"
    246 #endif
    247 "cxx_nonstatic_member_init\n"
    248 "CXX_FEATURE:"
    249 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    250 "1"
    251 #else
    252 "0"
    253 #endif
    254 "cxx_nullptr\n"
    255 "CXX_FEATURE:"
    256 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    257 "1"
    258 #else
    259 "0"
    260 #endif
    261 "cxx_override\n"
    262 "CXX_FEATURE:"
    263 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    264 "1"
    265 #else
    266 "0"
    267 #endif
    268 "cxx_range_for\n"
    269 "CXX_FEATURE:"
    270 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    271 "1"
    272 #else
    273 "0"
    274 #endif
    275 "cxx_raw_string_literals\n"
    276 "CXX_FEATURE:"
    277 #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L
    278 "1"
    279 #else
    280 "0"
    281 #endif
    282 "cxx_reference_qualified_functions\n"
    283 "CXX_FEATURE:"
    284 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
    285 "1"
    286 #else
    287 "0"
    288 #endif
    289 "cxx_relaxed_constexpr\n"
    290 "CXX_FEATURE:"
    291 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    292 "1"
    293 #else
    294 "0"
    295 #endif
    296 "cxx_return_type_deduction\n"
    297 "CXX_FEATURE:"
    298 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    299 "1"
    300 #else
    301 "0"
    302 #endif
    303 "cxx_right_angle_brackets\n"
    304 "CXX_FEATURE:"
    305 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    306 "1"
    307 #else
    308 "0"
    309 #endif
    310 "cxx_rvalue_references\n"
    311 "CXX_FEATURE:"
    312 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    313 "1"
    314 #else
    315 "0"
    316 #endif
    317 "cxx_sizeof_member\n"
    318 "CXX_FEATURE:"
    319 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    320 "1"
    321 #else
    322 "0"
    323 #endif
    324 "cxx_static_assert\n"
    325 "CXX_FEATURE:"
    326 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    327 "1"
    328 #else
    329 "0"
    330 #endif
    331 "cxx_strong_enums\n"
    332 "CXX_FEATURE:"
    333 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus
    334 "1"
    335 #else
    336 "0"
    337 #endif
    338 "cxx_template_template_parameters\n"
    339 "CXX_FEATURE:"
    340 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    341 "1"
    342 #else
    343 "0"
    344 #endif
    345 "cxx_thread_local\n"
    346 "CXX_FEATURE:"
    347 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    348 "1"
    349 #else
    350 "0"
    351 #endif
    352 "cxx_trailing_return_types\n"
    353 "CXX_FEATURE:"
    354 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    355 "1"
    356 #else
    357 "0"
    358 #endif
    359 "cxx_unicode_literals\n"
    360 "CXX_FEATURE:"
    361 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    362 "1"
    363 #else
    364 "0"
    365 #endif
    366 "cxx_uniform_initialization\n"
    367 "CXX_FEATURE:"
    368 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    369 "1"
    370 #else
    371 "0"
    372 #endif
    373 "cxx_unrestricted_unions\n"
    374 "CXX_FEATURE:"
    375 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    376 "1"
    377 #else
    378 "0"
    379 #endif
    380 "cxx_user_literals\n"
    381 "CXX_FEATURE:"
    382 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
    383 "1"
    384 #else
    385 "0"
    386 #endif
    387 "cxx_variable_templates\n"
    388 "CXX_FEATURE:"
    389 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    390 "1"
    391 #else
    392 "0"
    393 #endif
    394 "cxx_variadic_macros\n"
    395 "CXX_FEATURE:"
    396 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    397 "1"
    398 #else
    399 "0"
    400 #endif
    401 "cxx_variadic_templates\n"
    402 
    403 };
    404 
    405 int main(int argc, char** argv) { (void)argv; return features[argc]; }
    diff --git a/docs/html/files.html b/docs/html/files.html index 8c82b44..2e1ad56 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -109,7 +109,7 @@ $(function() { diff --git a/docs/html/functions.html b/docs/html/functions.html index 2c7fec8..82ac130 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -369,7 +369,7 @@ $(function() { diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html index 8bfa8ab..0cf3285 100644 --- a/docs/html/functions_func.html +++ b/docs/html/functions_func.html @@ -337,7 +337,7 @@ $(function() { diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index e93604a..69c203a 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -91,7 +91,7 @@ $(function() { diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html index ed00fde..e30ebdb 100644 --- a/docs/html/hierarchy.html +++ b/docs/html/hierarchy.html @@ -86,7 +86,7 @@ $(function() { diff --git a/docs/html/index.html b/docs/html/index.html index fc7e07d..92a0872 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -72,7 +72,7 @@ Dort befindet sich auch eine Übersicht der verfügbaren Befehle.

    diff --git a/docs/html/plottyfile_8cpp_source.html b/docs/html/plottyfile_8cpp_source.html index ee3e7d4..f354875 100644 --- a/docs/html/plottyfile_8cpp_source.html +++ b/docs/html/plottyfile_8cpp_source.html @@ -101,7 +101,7 @@ $(function() {
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    diff --git a/docs/html/plottyfile_8h_source.html b/docs/html/plottyfile_8h_source.html index f547f4d..d015346 100644 --- a/docs/html/plottyfile_8h_source.html +++ b/docs/html/plottyfile_8h_source.html @@ -102,7 +102,7 @@ $(function() {
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    diff --git a/docs/html/timeoutexception_8h_source.html b/docs/html/timeoutexception_8h_source.html index a66ca6e..5aac1f4 100644 --- a/docs/html/timeoutexception_8h_source.html +++ b/docs/html/timeoutexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/ui_8cpp_source.html b/docs/html/ui_8cpp_source.html index ea37cff..f460c1a 100644 --- a/docs/html/ui_8cpp_source.html +++ b/docs/html/ui_8cpp_source.html @@ -73,22 +73,22 @@ $(function() {
    1 #include "ui.h"
    2 #include "../drv/b15f.h"
    3 
    4 std::vector<View*> win_stack;
    5 std::thread t_refresh;
    6 
    7 void show_main(int)
    8 {
    9  ViewSelection* view = new ViewSelection();
    10  view->setTitle("B15F - Command Line Interface");
    11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
    12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
    13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
    14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
    15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
    16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
    17  view->addChoice("[ Informationen ]", &show_info);
    18  view->addChoice("", nullptr);
    19  view->addChoice("[ Beenden ]", &finish);
    20  view->repaint();
    21 
    22  win_stack.push_back(view);
    23  input(0);
    24 }
    25 
    26 void input(int)
    27 {
    28  call_t nextCall;
    29  int key;
    30  do
    31  {
    32  key = wgetch(View::getWinContext());
    33  win_stack.back()->repaint();
    34  nextCall = win_stack.back()->keypress(key);
    35 
    36  if(key == -1)
    37  view_back(key);
    38 
    39  if(nextCall)
    40  nextCall(key);
    41  }
    42  while(win_stack.size());
    43 }
    44 
    45 void view_back(int)
    46 {
    47  if(win_stack.size())
    48  {
    49  delete win_stack.back();
    50  win_stack.pop_back();
    51  }
    52  if(win_stack.size())
    53  win_stack.back()->repaint();
    54 }
    55 
    56 void finish(int)
    57 {
    58  cleanup();
    59  exit(EXIT_SUCCESS);
    60 }
    61 
    62 void cleanup()
    63 {
    64  if(t_refresh.joinable())
    65  t_refresh.join();
    66  clrtoeol();
    67  refresh();
    68  endwin();
    69 }
    70 
    71 void show_info(int)
    72 {
    73  ViewInfo* view = new ViewInfo();
    74  view->setTitle("Info");
    75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
    76  view->setLabelClose("[ Zurueck ]");
    77  view->repaint();
    78 
    79  win_stack.push_back(view);
    80  input(0);
    81 }
    82 
    83 void show_monitor(int)
    84 {
    85  ViewMonitor* view = new ViewMonitor();
    86  view->setTitle("Monitor");
    87  view->setText("\nErfasse Messwerte...");
    88  view->setLabelClose("[ Zurueck ]");
    89  view->repaint();
    90 
    91  win_stack.push_back(view);
    92  input(0);
    93 }
    94 
    95 void show_invalid_port_input(int)
    96 {
    97  ViewInfo* view = new ViewInfo();
    98  view->setTitle("Falsche Eingabe");
    99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
    100  view->setLabelClose("[ Schliessen ]");
    101  view->repaint();
    102 
    103  win_stack.push_back(view);
    104  input(0);
    105 }
    106 
    107 void show_invalid_dac_input(int)
    108 {
    109  ViewInfo* view = new ViewInfo();
    110  view->setTitle("Falsche Eingabe");
    111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
    112  view->setLabelClose("[ Schliessen ]");
    113  view->repaint();
    114 
    115  win_stack.push_back(view);
    116  input(0);
    117 }
    118 
    119 void write_digital_output0(int)
    120 {
    121  try
    122  {
    123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    124  if(d > 255 || 0 > d)
    125  throw std::invalid_argument("bad value");
    126  uint8_t port = static_cast<uint8_t>(d);
    127 
    128  B15F& drv = B15F::getInstance();
    129  drv.digitalWrite0(port);
    130  view_back(0);
    131  }
    132  catch(std::invalid_argument& ex)
    133  {
    134  show_invalid_port_input(0);
    135  }
    136 }
    137 
    138 void write_digital_output1(int)
    139 {
    140  try
    141  {
    142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    143  if(d > 255 || 0 > d)
    144  throw std::invalid_argument("bad value");
    145  uint8_t port = static_cast<uint8_t>(d);
    146 
    147  B15F& drv = B15F::getInstance();
    148  drv.digitalWrite1(port);
    149  view_back(0);
    150  }
    151  catch(std::invalid_argument& ex)
    152  {
    153  show_invalid_port_input(0);
    154  }
    155 }
    156 
    157 void write_analog_output0(int)
    158 {
    159  try
    160  {
    161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    162  if(port > 1023)
    163  throw std::invalid_argument("bad value");
    164 
    165  B15F& drv = B15F::getInstance();
    166  drv.analogWrite0(port);
    167  view_back(0);
    168  }
    169  catch(std::invalid_argument& ex)
    170  {
    171  show_invalid_dac_input(0);
    172  }
    173 }
    174 
    175 void write_analog_output1(int)
    176 {
    177  try
    178  {
    179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    180  if(port > 1023)
    181  throw std::invalid_argument("bad value");
    182 
    183  B15F& drv = B15F::getInstance();
    184  drv.analogWrite1(port);
    185  view_back(0);
    186  }
    187  catch(std::invalid_argument& ex)
    188  {
    189  show_invalid_dac_input(0);
    190  }
    191 }
    192 
    193 void show_digital_output0(int)
    194 {
    195  ViewPromt* view = new ViewPromt();
    196  view->setTitle("Digitale Ausgabe BE0");
    197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    198  view->setCancel("[ Zurueck ]", true);
    199  view->setConfirm("[ OK ]", &write_digital_output0);
    200  view->repaint();
    201 
    202  win_stack.push_back(view);
    203  input(0);
    204 }
    205 
    206 void show_digital_output1(int)
    207 {
    208  ViewPromt* view = new ViewPromt();
    209  view->setTitle("Digitale Ausgabe BE1");
    210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    211  view->setCancel("[ Zurueck ]", true);
    212  view->setConfirm("[ OK ]", &write_digital_output1);
    213  view->repaint();
    214 
    215  win_stack.push_back(view);
    216  input(0);
    217 }
    218 
    219 void show_analog_output0(int)
    220 {
    221  ViewPromt* view = new ViewPromt();
    222  view->setTitle("Analoge Ausgabe AA0");
    223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    224  view->setCancel("[ Zurueck ]", true);
    225  view->setConfirm("[ OK ]", &write_analog_output0);
    226  view->repaint();
    227 
    228  win_stack.push_back(view);
    229  input(0);
    230 }
    231 
    232 void show_analog_output1(int)
    233 {
    234  ViewPromt* view = new ViewPromt();
    235  view->setTitle("Analoge Ausgabe AA1");
    236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    237  view->setCancel("[ Zurueck ]", true);
    238  view->setConfirm("[ OK ]", &write_analog_output1);
    239  view->repaint();
    240 
    241  win_stack.push_back(view);
    242  input(0);
    243 }
    244 
    245 void start_selftest(int)
    246 {
    247  B15F& drv = B15F::getInstance();
    248  drv.activateSelfTestMode();
    249 
    250  ViewInfo* view = new ViewInfo();
    251  view->setTitle("Selbsttest aktiv");
    252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
    253  view->setLabelClose("[ Selbsttest Beenden ]");
    254  view->setCall(&stop_selftest);
    255  view->repaint();
    256 
    257  win_stack.push_back(view);
    258  input(0);
    259 }
    260 
    261 void stop_selftest(int)
    262 {
    263  B15F& drv = B15F::getInstance();
    264  drv.discard();
    266  drv.reconnect();
    267  drv.digitalWrite0(0);
    268  drv.digitalWrite1(0);
    269 }
    270 
    271 void show_selftest_info(int)
    272 {
    273  ViewInfo* view = new ViewInfo();
    274  view->setTitle("Selbsttest");
    275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
    276  view->setLabelClose("[ Weiter ]");
    277  view->setCall(&start_selftest);
    278  view->repaint();
    279 
    280  win_stack.push_back(view);
    281  input(0);
    282 }
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:363
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:373
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:420
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:430
    Definition: b15f.h:26
    -
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:153
    -
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:145
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:180
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:167
    -
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:210
    +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:265
    -
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:163
    +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:194
    void discard(void)
    Definition: b15f.cpp:72
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:235
    void reconnect(void)
    Definition: b15f.cpp:57
    -
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:200
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:250
    diff --git a/docs/html/ui_8h_source.html b/docs/html/ui_8h_source.html index a53a18d..832cfbe 100644 --- a/docs/html/ui_8h_source.html +++ b/docs/html/ui_8h_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #ifndef UI_H
    2 #define UI_H
    3 
    4 #include <vector>
    5 #include "view_selection.h"
    6 #include "view_info.h"
    7 #include "view_monitor.h"
    8 #include "view_promt.h"
    9 
    10 void show_main(int);
    11 void input(int);
    12 void view_back(int);
    13 void finish(int);
    14 void cleanup();
    15 
    16 void show_info(int);
    17 void show_monitor(int);
    18 void show_invalid_port_input(int);
    19 void show_invalid_dac_input(int);
    20 void write_digital_output0(int);
    21 void write_digital_output1(int);
    22 void write_analog_output0(int);
    23 void write_analog_output1(int);
    24 void show_digital_output0(int);
    25 void show_digital_output1(int);
    26 void show_analog_output0(int);
    27 void show_analog_output1(int);
    28 
    29 // selftest group
    30 void show_selftest_info(int);
    31 void start_selftest(int);
    32 void stop_selftest(int);
    33 
    34 
    35 extern std::vector<View*> win_stack;
    36 extern std::thread t_refresh;
    37 
    38 #endif // UI_H
    diff --git a/docs/html/usart_8cpp_source.html b/docs/html/usart_8cpp_source.html index a28c9ac..b8f3416 100644 --- a/docs/html/usart_8cpp_source.html +++ b/docs/html/usart_8cpp_source.html @@ -72,7 +72,7 @@ $(function() {
    1 #include "usart.h"
    2 
    4 {
    5  closeDevice();
    6 }
    7 
    8 void USART::openDevice(std::string device)
    9 {
    10  // Benutze blockierenden Modus
    11  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
    12  if (file_desc <= 0)
    13  throw USARTException("Fehler beim Öffnen des Gerätes");
    14 
    15  struct termios options;
    16  int code = tcgetattr(file_desc, &options);
    17  if (code)
    18  throw USARTException("Fehler beim Lesen der Geräteparameter");
    19 
    20  options.c_cflag = CS8 | CLOCAL | CREAD;
    21  options.c_iflag = IGNPAR;
    22  options.c_oflag = 0;
    23  options.c_lflag = 0;
    24  options.c_cc[VMIN] = 0; // #bytes read returns at least
    25  options.c_cc[VTIME] = timeout;
    26  code = cfsetspeed(&options, baudrate);
    27  if (code)
    28  throw USARTException("Fehler beim Setzen der Baudrate");
    29 
    30  code = tcsetattr(file_desc, TCSANOW, &options);
    31  if (code)
    32  throw USARTException("Fehler beim Setzen der Geräteparameter");
    33 
    36 }
    37 
    39 {
    40  if (file_desc > 0)
    41  {
    42  int code = close(file_desc);
    43  if (code)
    44  throw USARTException("Fehler beim Schließen des Gerätes");
    45  file_desc = -1;
    46  }
    47 }
    48 
    50 {
    51  int code = tcflush(file_desc, TCIFLUSH);
    52  if (code)
    53  throw USARTException("Fehler beim Leeren des Eingangspuffers");
    54 }
    55 
    57 {
    58  int code = tcflush(file_desc, TCOFLUSH);
    59  if (code)
    60  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
    61 }
    62 
    64 {
    65  int code = tcdrain(file_desc);
    66  if (code)
    67  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
    68 }
    69 
    70 void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    71 {
    72  int n = read(file_desc, buffer + offset, len);
    73  if (n != len)
    74  throw USARTException(
    75  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__));
    76 }
    77 
    78 void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    79 {
    80  int n = write(file_desc, buffer + offset, len);
    81  if (n != len)
    82  throw USARTException(
    83  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__));
    84 }
    85 
    87 {
    88  return baudrate;
    89 }
    90 
    92 {
    93  return timeout;
    94 }
    95 
    96 void USART::setBaudrate(uint32_t baudrate)
    97 {
    98  this->baudrate = baudrate;
    99 }
    100 
    101 void USART::setTimeout(uint8_t timeout)
    102 {
    103  this->timeout = timeout;
    104 }
    uint32_t getBaudrate(void)
    Definition: usart.cpp:86
    - +
    void closeDevice(void)
    Definition: usart.cpp:38
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:78
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:70
    @@ -86,7 +86,7 @@ $(function() {
    void flushOutputBuffer(void)
    Definition: usart.cpp:63
    diff --git a/docs/html/usart_8h_source.html b/docs/html/usart_8h_source.html index a76b9f0..e14235e 100644 --- a/docs/html/usart_8h_source.html +++ b/docs/html/usart_8h_source.html @@ -87,7 +87,7 @@ $(function() {
    void flushOutputBuffer(void)
    Definition: usart.cpp:63
    diff --git a/docs/html/usartexception_8h_source.html b/docs/html/usartexception_8h_source.html index 5c34d82..f6ea1e0 100644 --- a/docs/html/usartexception_8h_source.html +++ b/docs/html/usartexception_8h_source.html @@ -70,16 +70,16 @@ $(function() {
    usartexception.h
    -
    1 #ifndef USARTEXCEPTION_H
    2 #define USARTEXCEPTION_H
    3 
    4 #include <exception>
    5 #include <string>
    6 
    7 // SOURCE: https://stackoverflow.com/a/8152888
    8 
    11 class USARTException: public std::exception
    12 {
    13 public:
    18  explicit USARTException(const char* message) : msg(message)
    19  {
    20  }
    21 
    26  explicit USARTException(const std::string& message) : msg(message)
    27  {
    28  }
    29 
    33  virtual ~USARTException() = default;
    34 
    39  virtual const char* what() const throw ()
    40  {
    41  return msg.c_str();
    42  }
    43 
    44 protected:
    45  std::string msg;
    46 };
    47 
    48 #endif // USARTEXCEPTION_H
    -
    USARTException(const char *message)
    - -
    virtual const char * what() const
    -
    std::string msg
    failure description
    -
    USARTException(const std::string &message)
    +
    1 #ifndef USARTEXCEPTION_H
    2 #define USARTEXCEPTION_H
    3 
    4 #include <exception>
    5 #include <string>
    6 
    9 class USARTException: public std::exception
    10 {
    11 public:
    16  explicit USARTException(const char* message) : msg(message)
    17  {
    18  }
    19 
    24  explicit USARTException(const std::string& message) : msg(message)
    25  {
    26  }
    27 
    31  virtual ~USARTException() = default;
    32 
    37  virtual const char* what() const throw ()
    38  {
    39  return msg.c_str();
    40  }
    41 
    42 protected:
    43  std::string msg;
    44 };
    45 
    46 #endif // USARTEXCEPTION_H
    +
    USARTException(const char *message)
    + +
    virtual const char * what() const
    +
    std::string msg
    failure description
    +
    USARTException(const std::string &message)
    virtual ~USARTException()=default
    diff --git a/docs/html/view_8cpp_source.html b/docs/html/view_8cpp_source.html index 02e2fa7..9c20ba1 100644 --- a/docs/html/view_8cpp_source.html +++ b/docs/html/view_8cpp_source.html @@ -71,10 +71,10 @@ $(function() {
    1 #include "view.h"
    2 
    3 WINDOW* View::win = nullptr;
    4 
    5 View::View()
    6 {
    7  if(!win)
    8  {
    9  B15F::abort("View::win not initialized, missing context");
    10  }
    11  getmaxyx(win, height, width); // init width and height
    12  keypad(win, TRUE);
    13 }
    14 
    15 View::~View()
    16 {
    17 }
    18 
    19 void View::setWinContext(WINDOW* win)
    20 {
    21  View::win = win;
    22 }
    23 
    24 WINDOW* View::getWinContext()
    25 {
    26  return win;
    27 }
    28 
    29 // from: https://stackoverflow.com/a/37454181
    30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
    31 {
    32  std::vector<std::string> tokens;
    33  size_t prev = 0, pos = 0;
    34  do
    35  {
    36  pos = str.find(delim, prev);
    37  if (pos == std::string::npos) pos = str.length();
    38  std::string token = str.substr(prev, pos-prev);
    39  if (!token.empty()) tokens.push_back(token);
    40  prev = pos + delim.length();
    41  }
    42  while (pos < str.length() && prev < str.length());
    43  return tokens;
    44 }
    45 
    46 
    47 void View::setTitle(std::string title)
    48 {
    49  this->title = title;
    50 }
    51 
    52 void View::repaint()
    53 {
    54  // get screen size
    55  struct winsize size;
    56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
    57  throw std::runtime_error("TIOCGWINSZ error");
    58 
    59 
    60  start_x = floor((size.ws_col - width) / 2.);
    61  start_y = floor((size.ws_row - height) / 2.);
    62 
    63  curs_set(0); // hide cursor
    64  mvwin(win, start_y, start_x);
    65  clear();
    66  wclear(win);
    67 
    68  // generic draw
    69  box(win, 0, 0);
    70  int offset_x = (width - title.length()) / 2;
    71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
    72 
    73  // specific draw
    74  draw();
    75 
    76  refresh();
    77  wrefresh(win);
    78 }
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:398
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:455
    diff --git a/docs/html/view_8h_source.html b/docs/html/view_8h_source.html index 1673a6f..c435614 100644 --- a/docs/html/view_8h_source.html +++ b/docs/html/view_8h_source.html @@ -74,7 +74,7 @@ $(function() {
    Definition: view.h:19
    diff --git a/docs/html/view__info_8cpp_source.html b/docs/html/view__info_8cpp_source.html index 40c553d..2a83349 100644 --- a/docs/html/view__info_8cpp_source.html +++ b/docs/html/view__info_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_info.h"
    2 
    3 ViewInfo::ViewInfo()
    4 {
    5  calls.push_back(nullptr);
    6 }
    7 
    8 void ViewInfo::setText(std::string text)
    9 {
    10  this->text = text;
    11 }
    12 
    13 void ViewInfo::setLabelClose(std::string label)
    14 {
    15  this->label_close = label;
    16 }
    17 
    18 void ViewInfo::setCall(call_t call)
    19 {
    20  calls[0] = call;
    21 }
    22 
    23 void ViewInfo::draw()
    24 {
    25  int li = 0;
    26  for(std::string line : str_split(text, "\n"))
    27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
    28 
    29  close_offset_x = (width - label_close.length()) / 2;
    30  close_offset_y = height - 2;
    31 
    32  wattron(win, A_REVERSE);
    33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
    34  wattroff(win, A_REVERSE);
    35 }
    36 
    37 call_t ViewInfo::keypress(int& key)
    38 {
    39  switch(key)
    40  {
    41 
    42  case KEY_MOUSE:
    43  {
    44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    45  MEVENT event;
    46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    47  {
    48  size_t column = start_x + close_offset_x;
    49  size_t row = start_y + close_offset_y;
    50  size_t mouse_x = event.x, mouse_y = event.y;
    51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    52  key = -1; // do return from view
    53  }
    54  break;
    55  }
    56  case KEY_ENT:
    57  key = -1; // do return from view
    58  break;
    59  default:
    60  break;
    61  }
    62  return calls[0];
    63 }
    diff --git a/docs/html/view__info_8h_source.html b/docs/html/view__info_8h_source.html index 8271dec..22fae9d 100644 --- a/docs/html/view__info_8h_source.html +++ b/docs/html/view__info_8h_source.html @@ -75,7 +75,7 @@ $(function() {
    Definition: view.h:19
    diff --git a/docs/html/view__monitor_8cpp_source.html b/docs/html/view__monitor_8cpp_source.html index 5365229..3988fa5 100644 --- a/docs/html/view__monitor_8cpp_source.html +++ b/docs/html/view__monitor_8cpp_source.html @@ -72,19 +72,19 @@ $(function() {
    1 #include "view_monitor.h"
    2 
    3 ViewMonitor::ViewMonitor() : t_worker(&ViewMonitor::worker, this)
    4 {
    5 }
    6 
    7 call_t ViewMonitor::keypress(int& key)
    8 {
    9  switch(key)
    10  {
    11 
    12  case KEY_MOUSE:
    13  {
    14  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    15  MEVENT event;
    16  bool hit = false;
    17  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    18  {
    19  size_t column = start_x + close_offset_x;
    20  size_t row = start_y + close_offset_y;
    21  size_t mouse_x = event.x, mouse_y = event.y;
    22  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    23  hit = true;
    24  }
    25  if(!hit)
    26  break;
    27 
    28  // fall through to next case
    29  [[fallthrough]];
    30  }
    31  case KEY_ENT:
    32  run_worker = false;
    33  key = -1; // do return from view
    34  wclear(win);
    35  wrefresh(win);
    36  t_worker.join();
    37  break;
    38  default:
    39  break;
    40  }
    41  return calls[0];
    42 }
    43 
    44 std::string ViewMonitor::fancyDigitalString(uint8_t& b)
    45 {
    46  std::stringstream str;
    47  str << std::bitset<8>(b).to_string();
    48  str << " ";
    49  str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec;
    50  return str.str();
    51 }
    52 
    53 std::string ViewMonitor::fancyAnalogString(uint16_t& v)
    54 {
    55  std::stringstream str;
    56  double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0;
    57 
    58  str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V ";
    59 
    60  str << "[";
    61  uint8_t p = round(v * 40.0 / 1023.0);
    62  for(uint8_t i = 0; i < p; i++)
    63  str << "X";
    64  for(uint8_t i = 0; i < 40 - p; i++)
    65  str << " ";
    66  str << "]" << std::endl;
    67 
    68  return str.str();
    69 }
    70 
    71 void ViewMonitor::worker()
    72 {
    73  B15F& drv = B15F::getInstance();
    74  while(run_worker)
    75  {
    76  try
    77  {
    78  std::this_thread::sleep_for(std::chrono::milliseconds(100));
    79 
    80  uint8_t be0 = drv.digitalRead0();
    81  uint8_t be1 = drv.digitalRead1();
    82  uint8_t dsw = drv.readDipSwitch();
    83  uint16_t adc[8];
    84  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    85  adc[i] = drv.analogRead(i);
    86 
    87 
    88  std::stringstream str;
    89 
    90  // hline
    91  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    92  if(i % 2 == 0)
    93  str << "-";
    94  else
    95  str << " ";
    96  str << std::endl;
    97 
    98  str << "Digitale Enigaenge:" << std::endl;
    99  str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl;
    100  str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl;
    101  str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl;
    102 
    103  // hline
    104  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    105  if(i % 2 == 0)
    106  str << "-";
    107  else
    108  str << " ";
    109  str << std::endl;
    110 
    111  str << "Analoge Eingaenge:" << std::endl;
    112  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    113  {
    114  str << "Kanal " << std::to_string((int) i) << ": ";
    115  str << fancyAnalogString(adc[i]) << std::endl;
    116  }
    117 
    118  text = str.str();
    119  repaint();
    120  }
    121  catch(DriverException& ex)
    122  {
    123  std::cout << "DriverException: " << ex.what() << std::endl;
    124  drv.delay_ms(1000);
    125  }
    126  catch(...)
    127  {
    128  try
    129  {
    130  drv.reconnect();
    131  }
    132  catch(...)
    133  {
    134  B15F::abort("yoho meine dudes");
    135  return;
    136  }
    137  }
    138  }
    139 }
    -
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:173
    -
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:191
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:363
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:373
    +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:208
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:236
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:420
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:430
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:398
    -
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:220
    -
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:182
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:455
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:280
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:222
    void reconnect(void)
    Definition: b15f.cpp:57
    diff --git a/docs/html/view__monitor_8h_source.html b/docs/html/view__monitor_8h_source.html index 339bb08..5908596 100644 --- a/docs/html/view__monitor_8h_source.html +++ b/docs/html/view__monitor_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/view__promt_8cpp_source.html b/docs/html/view__promt_8cpp_source.html index 30ebc5d..c02be54 100644 --- a/docs/html/view__promt_8cpp_source.html +++ b/docs/html/view__promt_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_promt.h"
    2 
    3 void ViewPromt::draw()
    4 {
    5  curs_set(1); // show cursor
    6 
    7  int li = text_offset_y;
    8  int ci = 0;
    9  for(std::string line : str_split(message + input, "\n"))
    10  {
    11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
    12  ci = line.length() + text_offset_x;
    13  }
    14 
    15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
    16  button_offset_y = height - text_offset_y;
    17 
    18  if(selection == 0)
    19  {
    20  wattron(win, A_REVERSE);
    21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    22  wattroff(win, A_REVERSE);
    23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    25  }
    26  else
    27  {
    28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    30  wattron(win, A_REVERSE);
    31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    32  wattroff(win, A_REVERSE);
    33  }
    34  wmove(win, li, ci);
    35 }
    36 
    37 void ViewPromt::setMessage(std::string message)
    38 {
    39  this->message = message;
    40 }
    41 
    42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
    43 {
    44  label_confirm = name;
    45  call_confirm = call;
    46 }
    47 
    48 void ViewPromt::setCancel(std::string name, bool cancelable)
    49 {
    50  label_cancel = name;
    51  this->cancelable = cancelable;
    52 }
    53 
    54 std::string ViewPromt::getInput()
    55 {
    56  return input;
    57 }
    58 
    59 std::function<void(int)> ViewPromt::keypress(int& key)
    60 {
    61  std::function<void(int)> ret = nullptr;
    62  switch(key)
    63  {
    64  case KEY_BACKSPACE:
    65  if(input.length())
    66  input.pop_back();
    67  break;
    68  case '\t':
    69  case KEY_LEFT:
    70  case KEY_RIGHT:
    71  selection = (selection + 1 ) % 2;
    72  break;
    73  case KEY_MOUSE:
    74  {
    75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    76  MEVENT event;
    77  bool hit = false;
    78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    79  {
    80  size_t column_start = start_x + button_offset_x;
    81  size_t row_start = start_y + button_offset_y;
    82  size_t mouse_x = event.x, mouse_y = event.y;
    83  if(mouse_y == row_start)
    84  {
    85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
    86  {
    87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    88  hit = true;
    89  selection = 0;
    90  }
    91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
    92  {
    93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    94  hit = true;
    95  selection = 1;
    96  }
    97  }
    98  }
    99  if(!hit)
    100  break;
    101 
    102  // fall through to next case
    103  [[fallthrough]];
    104  }
    105  case KEY_ENT:
    106  if(selection == 0) // exit
    107  key = -1; // do return from view
    108  else
    109  ret = call_confirm;
    110  break;
    111  default:
    112  break;
    113  }
    114 
    115  if(key >= ' ' && key <= '~')
    116  input += (char) key;
    117 
    118  if(key != KEY_ENT)
    119  repaint();
    120  return ret;
    121 }
    diff --git a/docs/html/view__promt_8h_source.html b/docs/html/view__promt_8h_source.html index 407553e..5ac13df 100644 --- a/docs/html/view__promt_8h_source.html +++ b/docs/html/view__promt_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/view__selection_8cpp_source.html b/docs/html/view__selection_8cpp_source.html index 0631ccf..96c404a 100644 --- a/docs/html/view__selection_8cpp_source.html +++ b/docs/html/view__selection_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_selection.h"
    2 
    3 void ViewSelection::draw()
    4 {
    5  //curs_set(0); // hide cursor
    6  for(size_t i = 0; i < choices.size(); i++)
    7  {
    8  if(selection == i)
    9  wattron(win, A_REVERSE);
    10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
    11  if(selection == i)
    12  wattroff(win, A_REVERSE);
    13  }
    14 }
    15 
    16 void ViewSelection::addChoice(std::string name, call_t call)
    17 {
    18  choices.push_back(name);
    19  calls.push_back(call);
    20 }
    21 
    22 call_t ViewSelection::keypress(int& key)
    23 {
    24  call_t ret = nullptr;
    25  switch(key)
    26  {
    27  case KEY_UP:
    28  do
    29  selection = (selection - 1 + choices.size()) % choices.size();
    30  while(!choices[selection].length() && choices.size());
    31  break;
    32 
    33  case '\t':
    34  case KEY_DOWN:
    35  do
    36  selection = (selection + 1) % choices.size();
    37  while(!choices[selection].length() && choices.size());
    38  break;
    39 
    40  case KEY_MOUSE:
    41  {
    42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    43  MEVENT event;
    44  bool hit = false;
    45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    46  {
    47  size_t column_start = start_x + choice_offset_x;
    48  size_t row_start = start_y + choice_offset_y;
    49  size_t mouse_x = event.x, mouse_y = event.y;
    50  for(size_t i = 0; i < choices.size(); i++)
    51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
    52  {
    53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
    54  hit = true;
    55  selection = i;
    56  }
    57  }
    58  if(!hit)
    59  break;
    60 
    61  // fall through to next case
    62  [[fallthrough]];
    63  }
    64 
    65  case KEY_ENT:
    66  if(selection == choices.size() - 1) // exit
    67  key = -1; // do return from view
    68  else
    69  ret = calls[selection];
    70  break;
    71  default:
    72  break;
    73  }
    74  repaint();
    75  return ret;
    76 }
    diff --git a/docs/html/view__selection_8h_source.html b/docs/html/view__selection_8h_source.html index bad2520..c091b4d 100644 --- a/docs/html/view__selection_8h_source.html +++ b/docs/html/view__selection_8h_source.html @@ -75,7 +75,7 @@ $(function() { From 82e5c3ef93faf3ab93a20452ce3447517e6709ba Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Tue, 4 Jun 2019 10:38:56 +0200 Subject: [PATCH 14/35] makefile phony targets --- control/src/.idea/workspace.xml | 63 +++-- control/src/Makefile | 4 +- control/src/drv/b15f.cpp | 4 +- control/src/drv/b15f.cpp.orig | 439 -------------------------------- control/src/drv/usart.cpp | 2 +- 5 files changed, 49 insertions(+), 463 deletions(-) delete mode 100644 control/src/drv/b15f.cpp.orig diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml index e3f79b8..65a8c7a 100644 --- a/control/src/.idea/workspace.xml +++ b/control/src/.idea/workspace.xml @@ -12,7 +12,11 @@
    + + + + - @@ -214,8 +228,8 @@ - - + + @@ -253,14 +267,7 @@ - - - - - - - - + @@ -274,10 +281,24 @@ + + + + + + + - - + + + + + + + + + diff --git a/control/src/Makefile b/control/src/Makefile index cd10e0f..953be6f 100644 --- a/control/src/Makefile +++ b/control/src/Makefile @@ -38,6 +38,8 @@ OBJECTS_CLI = cli.o ui/view.o ui/view_selection.o ui/view_promt.o ui/view_info # *** TARGETS *** +.PHONY: $(OUT_TMP_DRV) clean help + all: drv cli style doc drv: $(OBJECTS_DRV) $(OUT_TMP_DRV) @@ -78,7 +80,7 @@ help: @echo "make install . to install or update the lib and headers on this machine" @echo "make uninstall to remove the lib and headers on this machine" @echo "make clean ... to delete objects and executables" - + clean: @echo "Cleaning..." rm -f $(OBJECTS_DRV) $(OBJECTS_CLI) $(OUT_TMP_CLI) $(OUT_TMP_DRV) diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index 4febe04..b4a47a0 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -143,7 +143,7 @@ std::vector B15F::getBoardInfo(void) uint8_t n; usart.receive(&n, 0, sizeof(n)); - + std::cout << "len: " << (int) n << std::endl << std::flush; while (n--) { uint8_t len; @@ -153,6 +153,8 @@ std::vector B15F::getBoardInfo(void) str[len] = '\0'; usart.receive(reinterpret_cast(&str[0]), 0, len); + std::cout << &str[0] << std::endl; + info.push_back(std::string(str)); } diff --git a/control/src/drv/b15f.cpp.orig b/control/src/drv/b15f.cpp.orig deleted file mode 100644 index b8d1d62..0000000 --- a/control/src/drv/b15f.cpp.orig +++ /dev/null @@ -1,439 +0,0 @@ -#include "b15f.h" - -B15F *B15F::instance = nullptr; -errorhandler_t B15F::errorhandler = nullptr; - -B15F::B15F() { - init(); -} - -void B15F::init() { - - std::string device = exec("bash -c 'ls /dev/ttyUSB*'"); - while (device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || - device.find('\t') != std::string::npos) - device.pop_back(); - - if (device.length() == 0) - abort("Adapter nicht gefunden"); - - std::cout << PRE << "Verwende Adapter: " << device << std::endl; - - - std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush; - usart.setBaudrate(BAUDRATE); - usart.openDevice(device); - std::cout << "OK" << std::endl; - - - std::cout << PRE << "Teste Verbindung... " << std::flush; - uint8_t tries = 3; - while (tries--) { - // verwerfe Daten, die µC noch hat - //discard(); - - if (!testConnection()) - continue; - - if (!testIntConv()) - continue; - - break; - } - if (tries == 0) - abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?"); - std::cout << "OK" << std::endl; - - - // Gib board info aus - std::vector info = getBoardInfo(); - std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" - << std::endl; -} - -void B15F::reconnect() { - uint8_t tries = RECONNECT_TRIES; - while (tries--) { - delay_ms(RECONNECT_TIMEOUT); - discard(); - - if (testConnection()) - return; - } - - abort("Verbindung kann nicht repariert werden"); -} - -void B15F::discard(void) { - try { - uint8_t rq[] = - { - RQ_DISC - }; - - usart.clearOutputBuffer(); - for (uint8_t i = 0; i < 16; i++) { - usart.transmit(&rq[0], 0, sizeof(rq)); // sende discard Befehl (verwerfe input) - delay_ms(4); - } - usart.clearInputBuffer(); - } - catch (std::exception &ex) { - abort(ex); - } -} - -bool B15F::testConnection() { - // erzeuge zufälliges Byte - srand(time(NULL)); - uint8_t dummy = rand() % 256; - - uint8_t rq[] = - { - RQ_TEST, - dummy - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw[2]; - usart.receive(&aw[0], 0, sizeof(aw)); - - return aw[0] == MSG_OK && aw[1] == dummy; -} - -bool B15F::testIntConv() { - srand(time(NULL)); - uint16_t dummy = rand() % (0xFFFF / 3); - - uint8_t rq[] = - { - RQ_INT, - static_cast(dummy & 0xFF), - static_cast(dummy >> 8) - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint16_t aw; - usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); - - return aw == dummy * 3; -} - - -std::vector B15F::getBoardInfo(void) { - std::vector info; - - uint8_t rq[] = - { - RQ_INFO - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t n; - usart.receive(&n, 0, sizeof(n)); - - while (n--) { - uint8_t len; - usart.receive(&len, 0, sizeof(len)); - - char str[len + 1]; - str[len] = '\0'; - usart.receive(reinterpret_cast(&str[0]), 0, len); - - info.push_back(std::string(str)); - } - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - if (aw != MSG_OK) - abort("Board Info fehlerhalft: code " + std::to_string((int) aw)); - - return info; -} - -bool B15F::activateSelfTestMode() { - uint8_t rq[] = - { - RQ_ST - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw == MSG_OK; -} - -bool B15F::digitalWrite0(uint8_t port) { - uint8_t rq[] = - { - RQ_BA0, - port - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw == MSG_OK; -} - -bool B15F::digitalWrite1(uint8_t port) { - uint8_t rq[] = - { - RQ_BA1, - port - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw == MSG_OK; -} - -uint8_t B15F::digitalRead0() { - usart.clearInputBuffer(); - uint8_t rq[] = - { - RQ_BE0 - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw; -} - -uint8_t B15F::digitalRead1() { - usart.clearInputBuffer(); - uint8_t rq[] = - { - RQ_BE1 - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw; -} - -uint8_t B15F::readDipSwitch() { - usart.clearInputBuffer(); - uint8_t rq[] = - { - RQ_DSW - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw; -} - -bool B15F::analogWrite0(uint16_t value) { - uint8_t rq[] = - { - RQ_AA0, - static_cast(value & 0xFF), - static_cast(value >> 8) - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw == MSG_OK; -} - -bool B15F::analogWrite1(uint16_t value) { - uint8_t rq[] = - { - RQ_AA1, - static_cast(value & 0xFF), - static_cast(value >> 8) - }; - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw == MSG_OK; -} - -uint16_t B15F::analogRead(uint8_t channel) { - usart.clearInputBuffer(); - if (channel > 7) - abort("Bad ADC channel: " + std::to_string(channel)); - - uint8_t rq[] = - { - RQ_ADC, - channel - }; - - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint16_t aw; - usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); - - if (aw > 1023) - abort("Bad ADC data detected (1)"); - return aw; -} - -void -B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, - uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count) { - /* - // prepare pointers - buffer_a += offset_a; - buffer_b += offset_b; - - - usart.clearInputBuffer(); - usart.writeByte(RQ_ADC_DAC_STROKE); - usart.writeByte(channel_a); - usart.writeByte(channel_b); - usart.writeInt(start); - usart.writeInt(static_cast(delta)); - usart.writeInt(count); - - for (uint16_t i = 0; i < count; i++) { - if (buffer_a) { - buffer_a[i] = usart.readInt(); - - if (buffer_a[i] > 1023) // check for broken usart connection - abort("Bad ADC data detected (2)"); - } else { - usart.readInt(); - } - - if (buffer_b) { - buffer_b[i] = usart.readInt(); - - if (buffer_b[i] > 1023) // check for broken usart connection - abort("Bad ADC data detected (3)"); - } else { - usart.readInt(); - } - } - - uint8_t aw = usart.readByte(); - if (aw != MSG_OK) - abort("Sequenz unterbrochen"); - - delay_us(10);*/ -} - -uint8_t B15F::pwmSetFrequency(uint32_t freq) { - usart.clearInputBuffer(); - - uint8_t rq[] = - { - RQ_PWM_SET_FREQ, - static_cast((freq >> 0) & 0xFF), - static_cast((freq >> 8) & 0xFF), - static_cast((freq >> 16) & 0xFF), - static_cast((freq >> 24) & 0xFF) - }; - - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw; -} - -bool B15F::pwmSetValue(uint8_t value) { - usart.clearInputBuffer(); - - uint8_t rq[] = - { - RQ_PWM_SET_VALUE, - value - }; - - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw == MSG_OK; -} - -bool B15F::setRegister(uint8_t adr, uint8_t val) { - usart.clearInputBuffer(); - - uint8_t rq[] = - { - RQ_SET_REG, - adr, - val - }; - - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw == val; -} - -uint8_t B15F::getRegister(uint8_t adr) { - usart.clearInputBuffer(); - - uint8_t rq[] = - { - RQ_GET_REG, - adr - }; - - usart.transmit(&rq[0], 0, sizeof(rq)); - - uint8_t aw; - usart.receive(&aw, 0, sizeof(aw)); - return aw; -} - - -void B15F::delay_ms(uint16_t ms) { - std::this_thread::sleep_for(std::chrono::milliseconds(ms)); -} - -void B15F::delay_us(uint16_t us) { - std::this_thread::sleep_for(std::chrono::microseconds(us)); -} - -B15F &B15F::getInstance(void) { - if (!instance) - instance = new B15F(); - - return *instance; -} - -// https://stackoverflow.com/a/478960 -std::string B15F::exec(std::string cmd) { - std::array buffer; - std::string result; - std::unique_ptr pipe(popen(cmd.c_str(), "r"), pclose); - if (!pipe) { - throw std::runtime_error("popen() failed!"); - } - while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) { - result += buffer.data(); - } - return result; -} - -void B15F::abort(std::string msg) { - DriverException ex(msg); - abort(ex); -} - -void B15F::abort(std::exception &ex) { - if (errorhandler) - errorhandler(ex); - else { - std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl; - std::cout << ex.what() << std::endl; - throw DriverException(ex.what()); - } -} - -void B15F::setAbortHandler(errorhandler_t func) { - errorhandler = func; -} diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index 5327c48..a1e8d2c 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -70,7 +70,7 @@ void USART::flushOutputBuffer() void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) { int n = read(file_desc, buffer + offset, len); - if (n != len) + if (n != len && false) throw USARTException( std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); } From d3a229d61f42ee87c6a06a88f88b895fdae205e5 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Tue, 4 Jun 2019 11:04:22 +0200 Subject: [PATCH 15/35] broken again --- control/src/.idea/workspace.xml | 297 +++++++++++++++++++++++++------- control/src/drv/usart.cpp | 61 +++---- control/src/drv/usart.h | 3 +- 3 files changed, 266 insertions(+), 95 deletions(-) diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml index 65a8c7a..7fb803a 100644 --- a/control/src/.idea/workspace.xml +++ b/control/src/.idea/workspace.xml @@ -12,11 +12,203 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -205,12 +385,12 @@
    - @@ -264,37 +444,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -302,5 +451,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index a1e8d2c..1bb0591 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -1,14 +1,12 @@ #include "usart.h" -USART::~USART() -{ +USART::~USART() { closeDevice(); } -void USART::openDevice(std::string device) -{ +void USART::openDevice(std::string device) { // Benutze blockierenden Modus - file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); + file_desc = open(device.c_str(), O_RDWR | O_NOCTTY);// | O_NDELAY if (file_desc <= 0) throw USARTException("Fehler beim Öffnen des Gerätes"); @@ -21,7 +19,7 @@ void USART::openDevice(std::string device) options.c_iflag = IGNPAR; options.c_oflag = 0; options.c_lflag = 0; - options.c_cc[VMIN] = 0; // #bytes read returns at least + options.c_cc[VMIN] = 1; // #bytes read returns at least options.c_cc[VTIME] = timeout; code = cfsetspeed(&options, baudrate); if (code) @@ -31,14 +29,16 @@ void USART::openDevice(std::string device) if (code) throw USARTException("Fehler beim Setzen der Geräteparameter"); + code = fcntl(file_desc, F_SETFL, 0); // blockierender Modus + if (code) + throw USARTException("Fehler beim Aktivieren des blockierenden Modus'"); + clearOutputBuffer(); clearInputBuffer(); } -void USART::closeDevice() -{ - if (file_desc > 0) - { +void USART::closeDevice() { + if (file_desc > 0) { int code = close(file_desc); if (code) throw USARTException("Fehler beim Schließen des Gerätes"); @@ -46,59 +46,52 @@ void USART::closeDevice() } } -void USART::clearInputBuffer() -{ +void USART::clearInputBuffer() { int code = tcflush(file_desc, TCIFLUSH); if (code) throw USARTException("Fehler beim Leeren des Eingangspuffers"); } -void USART::clearOutputBuffer() -{ +void USART::clearOutputBuffer() { int code = tcflush(file_desc, TCOFLUSH); if (code) throw USARTException("Fehler beim Leeren des Ausgangspuffers"); } -void USART::flushOutputBuffer() -{ +void USART::flushOutputBuffer() { int code = tcdrain(file_desc); if (code) throw USARTException("Fehler beim Versenden des Ausgangspuffers"); } -void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) -{ - int n = read(file_desc, buffer + offset, len); - if (n != len && false) +void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) { + int code = read(file_desc, buffer + offset, len); + if (code != len) throw USARTException( - std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); } -void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) -{ - int n = write(file_desc, buffer + offset, len); - if (n != len) +void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) { + int code = write(file_desc, buffer + offset, len); + if (code != len) throw USARTException( - std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__)); + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); } -uint32_t USART::getBaudrate() -{ +uint32_t USART::getBaudrate() { return baudrate; } -uint8_t USART::getTimeout() -{ +uint8_t USART::getTimeout() { return timeout; } -void USART::setBaudrate(uint32_t baudrate) -{ +void USART::setBaudrate(uint32_t baudrate) { this->baudrate = baudrate; } -void USART::setTimeout(uint8_t timeout) -{ +void USART::setTimeout(uint8_t timeout) { this->timeout = timeout; } diff --git a/control/src/drv/usart.h b/control/src/drv/usart.h index 014297e..f69928a 100644 --- a/control/src/drv/usart.h +++ b/control/src/drv/usart.h @@ -6,6 +6,7 @@ #include #include #include +#include #include "usartexception.h" /*! C++ Wrapper class for termios usart library. */ @@ -123,7 +124,7 @@ private: int file_desc = -1; //!< Linux Dateideskriptor uint32_t baudrate = 9600; //!< Standard-Baudrate, sollte mit setBaudrate() überschrieben werden! - uint8_t timeout = 10; //!< in Dezisekunden + uint8_t timeout = 100; //!< in Dezisekunden }; #endif // USART_H From 2fd7fe5529cb75bb210df553ad4f69021b397341 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Thu, 6 Jun 2019 10:12:21 +0200 Subject: [PATCH 16/35] handbuch: installation --- control/src/README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/control/src/README.md b/control/src/README.md index 99a8a8d..0ed70ab 100644 --- a/control/src/README.md +++ b/control/src/README.md @@ -1,3 +1,30 @@ +# B15F Benutzerhandbuch +*Hinweis*: Terminal-Befehle sind **fett** gedruckt + +## Installation + +### 1. Abhängigkeiten installieren + (a) **sudo apt-get update** + (b) **sudo apt-get install git** + +### 2. Das Repository klonen + (a) **cd /tmp** + (b) **git clone "https://github.com/devfix/b15f.git"** + +### 3. Die Firmware installieren + (a) **cd "/tmp/b15f/firmware"** + (b) **make** + + Wenn udev richtig konfiguriert wurde: + (c) **make upload** + Sonst: + (c) **sudo make upload** + +### 4. Die Steuersoftware (Bibliothek & CLI) installieren + (a) **cd "/tmp/b15f/control/src"** + (b) **make** + (c) **sudo make install** + # Einführung Die wichtigste Klasse für die Steuerung des Board 15 ist [B15F](classB15F.html). Dort befindet sich auch eine Übersicht der verfügbaren Befehle. From 7c380d8ad7d504dd3278522899f42cd743ee6997 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Thu, 6 Jun 2019 10:50:18 +0200 Subject: [PATCH 17/35] handbuch update --- control/src/README.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/control/src/README.md b/control/src/README.md index 0ed70ab..0ce177d 100644 --- a/control/src/README.md +++ b/control/src/README.md @@ -5,7 +5,7 @@ ### 1. Abhängigkeiten installieren (a) **sudo apt-get update** - (b) **sudo apt-get install git** + (b) **sudo apt-get install git avr-libc avrdude libncurses5-dev g++** ### 2. Das Repository klonen (a) **cd /tmp** @@ -13,18 +13,24 @@ ### 3. Die Firmware installieren (a) **cd "/tmp/b15f/firmware"** - (b) **make** + + (b) Passen Sie in der Datei *Makefile* die Option "MCU = ..." an die MCU des vorliegenden Boards an + (*atmega1284* und *atmega1284p* sind nicht identisch!) + + (c) **make** Wenn udev richtig konfiguriert wurde: - (c) **make upload** + (d I) **make upload** Sonst: - (c) **sudo make upload** + (d II) **sudo make upload** ### 4. Die Steuersoftware (Bibliothek & CLI) installieren (a) **cd "/tmp/b15f/control/src"** (b) **make** + (Die Warnungen durch doxygen können ignoriert werden.) + (c) **sudo make install** -# Einführung +## Einführung Die wichtigste Klasse für die Steuerung des Board 15 ist [B15F](classB15F.html). Dort befindet sich auch eine Übersicht der verfügbaren Befehle. From d8aada03de9a19b8a65c2fc22c6be122e35eb2fd Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Thu, 6 Jun 2019 11:22:00 +0200 Subject: [PATCH 18/35] handbuch update --- control/src/README.md | 57 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/control/src/README.md b/control/src/README.md index 0ce177d..f4b0b4a 100644 --- a/control/src/README.md +++ b/control/src/README.md @@ -13,10 +13,10 @@ ### 3. Die Firmware installieren (a) **cd "/tmp/b15f/firmware"** - + (b) Passen Sie in der Datei *Makefile* die Option "MCU = ..." an die MCU des vorliegenden Boards an (*atmega1284* und *atmega1284p* sind nicht identisch!) - + (c) **make** Wenn udev richtig konfiguriert wurde: @@ -31,6 +31,55 @@ (c) **sudo make install** -## Einführung +## Das CommandLineInterface (CLI) benutzen + (a) Öffnen Sie ein Terminal und maximieren Sie das Fenster + (b) Start des CLI erfolgt durch **b15fcli** + (c) Die Navigation erolgt durch <Tab>, die Pfeiltasten und <Enter> oder die Maus + (d) Mit <Strg + c> kann das Programm sofort verlassen werden + +## Eigene Programme mit B15F schreiben + +### Grundsätzliches Die wichtigste Klasse für die Steuerung des Board 15 ist [B15F](classB15F.html). -Dort befindet sich auch eine Übersicht der verfügbaren Befehle. +Dort befindet sich auch eine Übersicht der verfügbaren Befehle. + +### Beispiele +In dem Verzeichnis [b15f/control/examples](https://github.com/devfix/b15f/tree/master/control/examples) sind einige Beispiele für die Verwendung einzelner B15F Funktionen. +Zu jedem Beispiel gehört eine *main.cpp* mit dem Quellcode und eine *Makefile*-Datei. +Das Beispiel kann mit **make** kompiliert und mit **./main.elf** gestartet werden. + +### Den B15F Treiber verwenden +Benötigt wird der B15F-Header: +`#include ` +und der Header für die plottyfile-Generierung, falls mit Kennlinien gearbeitet werden soll: +`#include ` + +Für die Interaktion wird eine Referenz auf die aktuelle Treiberinstanz gespeichert: +`B15F& drv = B15F::getInstance();` +Falls noch keine existiert, wird automatisch eine erzeugt und Verbindung zum Board hergestellt. + +Ab jetzt können auf dem Object `drv` verschiedene Methoden angewand werden, siehe [B15F](classB15F.html). + +### Kennlinien mit plottyfile generieren +Die Beschreibung zu Plottyfile befindet sich [hier](classPlottyFile.html). +Nach dem Include von plottyfile kann ein neues Objekt erzeugt und konfiguriert werden: +```C++ +PlottyFile pf; +pf.setUnitX("V"); +pf.setUnitY("V"); +pf.setUnitPara("V"); +pf.setDescX("U_{OUT}"); +pf.setDescY("U_{IN}"); +pf.setDescPara(""); +pf.setRefX(5); +pf.setRefY(5); +pf.setParaFirstCurve(0); +pf.setParaStepWidth(0); +``` +Messpunkte können anschließend hinzugefügt werden. +Dabei gehören Punkte mit dem gleichen Index für `curve` (*uint8_t*) zur selben Kurve und erhalten durch Plotty automatisch die gleiche Farbe. +```C++ +pf.addDot(Dot(x, y, curve)); +``` +`x` und `y` sind *uint16_t*, also keine Gleitkommazahlen. + From 3f0fe49644081ebf1992312dc004f07c0ba2b7c5 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Thu, 6 Jun 2019 11:47:13 +0200 Subject: [PATCH 19/35] fixed --- control/src/.idea/workspace.xml | 276 +++--------------- control/src/drv/usart.cpp | 63 ++-- control/src/drv/usart.cpp.orig | 121 ++++++++ control/src/drv/usart.h | 1 + docs/html/CMakeCCompilerId_8c_source.html | 2 +- docs/html/CMakeCXXCompilerId_8cpp_source.html | 2 +- docs/html/annotated.html | 2 +- docs/html/b15f_8cpp_source.html | 56 ++-- docs/html/b15f_8h_source.html | 44 +-- docs/html/backup_8cpp_source.html | 2 +- docs/html/classB15F-members.html | 2 +- docs/html/classB15F.html | 44 +-- docs/html/classDot-members.html | 2 +- docs/html/classDot.html | 2 +- docs/html/classDriverException-members.html | 2 +- docs/html/classDriverException.html | 2 +- docs/html/classPlottyFile-members.html | 2 +- docs/html/classPlottyFile.html | 2 +- docs/html/classTimeoutException-members.html | 2 +- docs/html/classTimeoutException.html | 2 +- docs/html/classUSART-members.html | 2 +- docs/html/classUSART.html | 28 +- docs/html/classUSARTException-members.html | 2 +- docs/html/classUSARTException.html | 2 +- docs/html/classView-members.html | 2 +- docs/html/classView.html | 2 +- docs/html/classViewInfo-members.html | 2 +- docs/html/classViewInfo.html | 2 +- docs/html/classViewMonitor-members.html | 2 +- docs/html/classViewMonitor.html | 2 +- docs/html/classViewPromt-members.html | 2 +- docs/html/classViewPromt.html | 2 +- docs/html/classViewSelection-members.html | 2 +- docs/html/classViewSelection.html | 2 +- docs/html/classes.html | 2 +- docs/html/cli_8cpp_source.html | 6 +- .../dir_1788f8309b1a812dcb800a185471cf6c.html | 2 +- .../dir_19f2f1b99f19c12fa55b8d312cf373ed.html | 2 +- .../dir_3d3c8ff3ebf9841b39117ac899f41936.html | 2 +- .../dir_587c94d866dbb2f408f78cf41f9b2f8d.html | 2 +- .../dir_90e361ec3542f3dd076ea3ad19547437.html | 2 +- .../dir_95e29a8b8ee7c54052c171a88bb95675.html | 2 +- .../dir_f89abcb304c928c7d889aa5625570de5.html | 2 +- docs/html/dot_8cpp_source.html | 2 +- docs/html/dot_8h_source.html | 2 +- docs/html/driverexception_8h_source.html | 2 +- docs/html/feature__tests_8c_source.html | 2 +- docs/html/feature__tests_8cxx_source.html | 2 +- docs/html/files.html | 2 +- docs/html/functions.html | 2 +- docs/html/functions_func.html | 2 +- docs/html/functions_vars.html | 2 +- docs/html/hierarchy.html | 2 +- docs/html/index.html | 75 ++++- docs/html/plottyfile_8cpp_source.html | 2 +- docs/html/plottyfile_8h_source.html | 2 +- docs/html/search/all_1.js | 3 +- docs/html/search/all_4.js | 3 +- docs/html/search/pages_0.js | 2 +- docs/html/search/searchdata.js | 2 +- docs/html/timeoutexception_8h_source.html | 2 +- docs/html/ui_8cpp_source.html | 16 +- docs/html/ui_8h_source.html | 2 +- docs/html/usart_8cpp_source.html | 28 +- docs/html/usart_8h_source.html | 30 +- docs/html/usartexception_8h_source.html | 2 +- docs/html/view_8cpp_source.html | 4 +- docs/html/view_8h_source.html | 2 +- docs/html/view__info_8cpp_source.html | 2 +- docs/html/view__info_8h_source.html | 2 +- docs/html/view__monitor_8cpp_source.html | 16 +- docs/html/view__monitor_8h_source.html | 2 +- docs/html/view__promt_8cpp_source.html | 2 +- docs/html/view__promt_8h_source.html | 2 +- docs/html/view__selection_8cpp_source.html | 2 +- docs/html/view__selection_8h_source.html | 2 +- 76 files changed, 481 insertions(+), 451 deletions(-) create mode 100644 control/src/drv/usart.cpp.orig diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml index 7fb803a..0d20e09 100644 --- a/control/src/.idea/workspace.xml +++ b/control/src/.idea/workspace.xml @@ -14,201 +14,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - + @@ -423,13 +235,6 @@ - - - - - - - @@ -437,13 +242,6 @@ - - - - - - - @@ -451,31 +249,51 @@ - + - - + + - + - - + + - + + + + + + + + + + + + + + + + + + - - + + + + + diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index 1bb0591..568cdd7 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -1,10 +1,13 @@ +#include #include "usart.h" -USART::~USART() { +USART::~USART() +{ closeDevice(); } -void USART::openDevice(std::string device) { +void USART::openDevice(std::string device) +{ // Benutze blockierenden Modus file_desc = open(device.c_str(), O_RDWR | O_NOCTTY);// | O_NDELAY if (file_desc <= 0) @@ -19,7 +22,7 @@ void USART::openDevice(std::string device) { options.c_iflag = IGNPAR; options.c_oflag = 0; options.c_lflag = 0; - options.c_cc[VMIN] = 1; // #bytes read returns at least + options.c_cc[VMIN] = 0; options.c_cc[VTIME] = timeout; code = cfsetspeed(&options, baudrate); if (code) @@ -37,8 +40,10 @@ void USART::openDevice(std::string device) { clearInputBuffer(); } -void USART::closeDevice() { - if (file_desc > 0) { +void USART::closeDevice() +{ + if (file_desc > 0) + { int code = close(file_desc); if (code) throw USARTException("Fehler beim Schließen des Gerätes"); @@ -46,52 +51,72 @@ void USART::closeDevice() { } } -void USART::clearInputBuffer() { +void USART::clearInputBuffer() +{ int code = tcflush(file_desc, TCIFLUSH); if (code) throw USARTException("Fehler beim Leeren des Eingangspuffers"); } -void USART::clearOutputBuffer() { +void USART::clearOutputBuffer() +{ int code = tcflush(file_desc, TCOFLUSH); if (code) throw USARTException("Fehler beim Leeren des Ausgangspuffers"); } -void USART::flushOutputBuffer() { +void USART::flushOutputBuffer() +{ int code = tcdrain(file_desc); if (code) throw USARTException("Fehler beim Versenden des Ausgangspuffers"); } -void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) { - int code = read(file_desc, buffer + offset, len); +void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) +{ + int bytes_avail, code; + do + { + code = ioctl(file_desc, FIONREAD, &bytes_avail); + if(code) + throw USARTException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + ")"); + } + while(bytes_avail < len); + + code = read(file_desc, buffer + offset, len); if (code != len) throw USARTException( - std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + - ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); } -void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) { +void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) +{ int code = write(file_desc, buffer + offset, len); if (code != len) throw USARTException( - std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + - ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); } -uint32_t USART::getBaudrate() { +uint32_t USART::getBaudrate() +{ return baudrate; } -uint8_t USART::getTimeout() { +uint8_t USART::getTimeout() +{ return timeout; } -void USART::setBaudrate(uint32_t baudrate) { +void USART::setBaudrate(uint32_t baudrate) +{ this->baudrate = baudrate; } -void USART::setTimeout(uint8_t timeout) { +void USART::setTimeout(uint8_t timeout) +{ this->timeout = timeout; } diff --git a/control/src/drv/usart.cpp.orig b/control/src/drv/usart.cpp.orig new file mode 100644 index 0000000..7893c7c --- /dev/null +++ b/control/src/drv/usart.cpp.orig @@ -0,0 +1,121 @@ +#include +#include "usart.h" + +USART::~USART() +{ + closeDevice(); +} + +void USART::openDevice(std::string device) +{ + // Benutze blockierenden Modus + file_desc = open(device.c_str(), O_RDWR | O_NOCTTY);// | O_NDELAY + if (file_desc <= 0) + throw USARTException("Fehler beim Öffnen des Gerätes"); + + struct termios options; + int code = tcgetattr(file_desc, &options); + if (code) + throw USARTException("Fehler beim Lesen der Geräteparameter"); + + options.c_cflag = CS8 | CLOCAL | CREAD; + options.c_iflag = IGNPAR; + options.c_oflag = 0; + options.c_lflag = 0; + options.c_cc[VMIN] = 0; + options.c_cc[VTIME] = timeout; + code = cfsetspeed(&options, baudrate); + if (code) + throw USARTException("Fehler beim Setzen der Baudrate"); + + code = tcsetattr(file_desc, TCSANOW, &options); + if (code) + throw USARTException("Fehler beim Setzen der Geräteparameter"); + + code = fcntl(file_desc, F_SETFL, 0); // blockierender Modus + if (code) + throw USARTException("Fehler beim Aktivieren des blockierenden Modus'"); + + clearOutputBuffer(); + clearInputBuffer(); +} + +void USART::closeDevice() +{ + if (file_desc > 0) + { + int code = close(file_desc); + if (code) + throw USARTException("Fehler beim Schließen des Gerätes"); + file_desc = -1; + } +} + +void USART::clearInputBuffer() +{ + int code = tcflush(file_desc, TCIFLUSH); + if (code) + throw USARTException("Fehler beim Leeren des Eingangspuffers"); +} + +void USART::clearOutputBuffer() +{ + int code = tcflush(file_desc, TCOFLUSH); + if (code) + throw USARTException("Fehler beim Leeren des Ausgangspuffers"); +} + +void USART::flushOutputBuffer() +{ + int code = tcdrain(file_desc); + if (code) + throw USARTException("Fehler beim Versenden des Ausgangspuffers"); +} + +void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) +{ + int bytes_avail, code; + do + { + code = ioctl(file_desc, FIONREAD, &bytes_avail); + if(code) + throw USARTException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + ")"); + } while(bytes_avail < len); + + code = read(file_desc, buffer + offset, len); + if (code != len) + throw USARTException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); +} + +void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) +{ + int code = write(file_desc, buffer + offset, len); + if (code != len) + throw USARTException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); +} + +uint32_t USART::getBaudrate() +{ + return baudrate; +} + +uint8_t USART::getTimeout() +{ + return timeout; +} + +void USART::setBaudrate(uint32_t baudrate) +{ + this->baudrate = baudrate; +} + +void USART::setTimeout(uint8_t timeout) +{ + this->timeout = timeout; +} diff --git a/control/src/drv/usart.h b/control/src/drv/usart.h index f69928a..ac42f7f 100644 --- a/control/src/drv/usart.h +++ b/control/src/drv/usart.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include "usartexception.h" diff --git a/docs/html/CMakeCCompilerId_8c_source.html b/docs/html/CMakeCCompilerId_8c_source.html index 81263ee..7c52db9 100644 --- a/docs/html/CMakeCCompilerId_8c_source.html +++ b/docs/html/CMakeCCompilerId_8c_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #ifdef __cplusplus
    2 # error "A C++ compiler has been selected for C."
    3 #endif
    4 
    5 #if defined(__18CXX)
    6 # define ID_VOID_MAIN
    7 #endif
    8 #if defined(__CLASSIC_C__)
    9 /* cv-qualifiers did not exist in K&R C */
    10 # define const
    11 # define volatile
    12 #endif
    13 
    14 
    15 /* Version number components: V=Version, R=Revision, P=Patch
    16  Version date components: YYYY=Year, MM=Month, DD=Day */
    17 
    18 #if defined(__INTEL_COMPILER) || defined(__ICC)
    19 # define COMPILER_ID "Intel"
    20 # if defined(_MSC_VER)
    21 # define SIMULATE_ID "MSVC"
    22 # endif
    23 /* __INTEL_COMPILER = VRP */
    24 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
    25 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
    26 # if defined(__INTEL_COMPILER_UPDATE)
    27 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
    28 # else
    29 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
    30 # endif
    31 # if defined(__INTEL_COMPILER_BUILD_DATE)
    32 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
    33 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
    34 # endif
    35 # if defined(_MSC_VER)
    36 /* _MSC_VER = VVRR */
    37 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    38 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    39 # endif
    40 
    41 #elif defined(__PATHCC__)
    42 # define COMPILER_ID "PathScale"
    43 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
    44 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
    45 # if defined(__PATHCC_PATCHLEVEL__)
    46 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
    47 # endif
    48 
    49 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
    50 # define COMPILER_ID "Embarcadero"
    51 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
    52 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
    53 # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
    54 
    55 #elif defined(__BORLANDC__)
    56 # define COMPILER_ID "Borland"
    57 /* __BORLANDC__ = 0xVRR */
    58 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
    59 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
    60 
    61 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
    62 # define COMPILER_ID "Watcom"
    63 /* __WATCOMC__ = VVRR */
    64 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
    65 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    66 # if (__WATCOMC__ % 10) > 0
    67 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    68 # endif
    69 
    70 #elif defined(__WATCOMC__)
    71 # define COMPILER_ID "OpenWatcom"
    72 /* __WATCOMC__ = VVRP + 1100 */
    73 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
    74 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    75 # if (__WATCOMC__ % 10) > 0
    76 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    77 # endif
    78 
    79 #elif defined(__SUNPRO_C)
    80 # define COMPILER_ID "SunPro"
    81 # if __SUNPRO_C >= 0x5100
    82 /* __SUNPRO_C = 0xVRRP */
    83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12)
    84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF)
    85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
    86 # else
    87 /* __SUNPRO_CC = 0xVRP */
    88 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8)
    89 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF)
    90 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
    91 # endif
    92 
    93 #elif defined(__HP_cc)
    94 # define COMPILER_ID "HP"
    95 /* __HP_cc = VVRRPP */
    96 # define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000)
    97 # define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100)
    98 # define COMPILER_VERSION_PATCH DEC(__HP_cc % 100)
    99 
    100 #elif defined(__DECC)
    101 # define COMPILER_ID "Compaq"
    102 /* __DECC_VER = VVRRTPPPP */
    103 # define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000)
    104 # define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100)
    105 # define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000)
    106 
    107 #elif defined(__IBMC__) && defined(__COMPILER_VER__)
    108 # define COMPILER_ID "zOS"
    109 # if defined(__ibmxl__)
    110 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    111 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    112 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    113 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    114 # else
    115 /* __IBMC__ = VRP */
    116 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    117 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    118 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    119 # endif
    120 
    121 
    122 #elif defined(__ibmxl__) || (defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800)
    123 # define COMPILER_ID "XL"
    124 # if defined(__ibmxl__)
    125 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    126 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    127 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    128 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    129 # else
    130 /* __IBMC__ = VRP */
    131 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    132 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    133 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    134 # endif
    135 
    136 
    137 #elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800
    138 # define COMPILER_ID "VisualAge"
    139 # if defined(__ibmxl__)
    140 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    141 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    142 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    143 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    144 # else
    145 /* __IBMC__ = VRP */
    146 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    147 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    148 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    149 # endif
    150 
    151 
    152 #elif defined(__PGI)
    153 # define COMPILER_ID "PGI"
    154 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
    155 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
    156 # if defined(__PGIC_PATCHLEVEL__)
    157 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
    158 # endif
    159 
    160 #elif defined(_CRAYC)
    161 # define COMPILER_ID "Cray"
    162 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
    163 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
    164 
    165 #elif defined(__TI_COMPILER_VERSION__)
    166 # define COMPILER_ID "TI"
    167 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
    168 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
    169 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
    170 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
    171 
    172 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
    173 # define COMPILER_ID "Fujitsu"
    174 
    175 #elif defined(__ghs__)
    176 # define COMPILER_ID "GHS"
    177 /* __GHS_VERSION_NUMBER = VVVVRP */
    178 # ifdef __GHS_VERSION_NUMBER
    179 # define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
    180 # define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
    181 # define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
    182 # endif
    183 
    184 #elif defined(__TINYC__)
    185 # define COMPILER_ID "TinyCC"
    186 
    187 #elif defined(__BCC__)
    188 # define COMPILER_ID "Bruce"
    189 
    190 #elif defined(__SCO_VERSION__)
    191 # define COMPILER_ID "SCO"
    192 
    193 #elif defined(__ARMCC_VERSION) && !defined(__clang__)
    194 # define COMPILER_ID "ARMCC"
    195 #if __ARMCC_VERSION >= 1000000
    196 /* __ARMCC_VERSION = VRRPPPP */
    197 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
    198 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
    199 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    200 #else
    201 /* __ARMCC_VERSION = VRPPPP */
    202 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
    203 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
    204 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    205 #endif
    206 
    207 
    208 #elif defined(__clang__) && defined(__apple_build_version__)
    209 # define COMPILER_ID "AppleClang"
    210 # if defined(_MSC_VER)
    211 # define SIMULATE_ID "MSVC"
    212 # endif
    213 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    214 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    215 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    216 # if defined(_MSC_VER)
    217 /* _MSC_VER = VVRR */
    218 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    219 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    220 # endif
    221 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
    222 
    223 #elif defined(__clang__)
    224 # define COMPILER_ID "Clang"
    225 # if defined(_MSC_VER)
    226 # define SIMULATE_ID "MSVC"
    227 # endif
    228 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    229 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    230 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    231 # if defined(_MSC_VER)
    232 /* _MSC_VER = VVRR */
    233 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    234 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    235 # endif
    236 
    237 #elif defined(__GNUC__)
    238 # define COMPILER_ID "GNU"
    239 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
    240 # if defined(__GNUC_MINOR__)
    241 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
    242 # endif
    243 # if defined(__GNUC_PATCHLEVEL__)
    244 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
    245 # endif
    246 
    247 #elif defined(_MSC_VER)
    248 # define COMPILER_ID "MSVC"
    249 /* _MSC_VER = VVRR */
    250 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
    251 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
    252 # if defined(_MSC_FULL_VER)
    253 # if _MSC_VER >= 1400
    254 /* _MSC_FULL_VER = VVRRPPPPP */
    255 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
    256 # else
    257 /* _MSC_FULL_VER = VVRRPPPP */
    258 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
    259 # endif
    260 # endif
    261 # if defined(_MSC_BUILD)
    262 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
    263 # endif
    264 
    265 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
    266 # define COMPILER_ID "ADSP"
    267 #if defined(__VISUALDSPVERSION__)
    268 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
    269 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
    270 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
    271 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
    272 #endif
    273 
    274 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    275 # define COMPILER_ID "IAR"
    276 # if defined(__VER__) && defined(__ICCARM__)
    277 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
    278 # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
    279 # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
    280 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    281 # elif defined(__VER__) && defined(__ICCAVR__)
    282 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
    283 # define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
    284 # define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
    285 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    286 # endif
    287 
    288 #elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC)
    289 # define COMPILER_ID "SDCC"
    290 # if defined(__SDCC_VERSION_MAJOR)
    291 # define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR)
    292 # define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR)
    293 # define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH)
    294 # else
    295 /* SDCC = VRP */
    296 # define COMPILER_VERSION_MAJOR DEC(SDCC/100)
    297 # define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10)
    298 # define COMPILER_VERSION_PATCH DEC(SDCC % 10)
    299 # endif
    300 
    301 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
    302 # define COMPILER_ID "MIPSpro"
    303 # if defined(_SGI_COMPILER_VERSION)
    304 /* _SGI_COMPILER_VERSION = VRP */
    305 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
    306 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
    307 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
    308 # else
    309 /* _COMPILER_VERSION = VRP */
    310 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
    311 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
    312 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
    313 # endif
    314 
    315 
    316 /* These compilers are either not known or too old to define an
    317  identification macro. Try to identify the platform and guess that
    318  it is the native compiler. */
    319 #elif defined(__hpux) || defined(__hpua)
    320 # define COMPILER_ID "HP"
    321 
    322 #else /* unknown compiler */
    323 # define COMPILER_ID ""
    324 #endif
    325 
    326 /* Construct the string literal in pieces to prevent the source from
    327  getting matched. Store it in a pointer rather than an array
    328  because some compilers will just produce instructions to fill the
    329  array rather than assigning a pointer to a static array. */
    330 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
    331 #ifdef SIMULATE_ID
    332 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
    333 #endif
    334 
    335 #ifdef __QNXNTO__
    336 char const* qnxnto = "INFO" ":" "qnxnto[]";
    337 #endif
    338 
    339 #if defined(__CRAYXE) || defined(__CRAYXC)
    340 char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
    341 #endif
    342 
    343 #define STRINGIFY_HELPER(X) #X
    344 #define STRINGIFY(X) STRINGIFY_HELPER(X)
    345 
    346 /* Identify known platforms by name. */
    347 #if defined(__linux) || defined(__linux__) || defined(linux)
    348 # define PLATFORM_ID "Linux"
    349 
    350 #elif defined(__CYGWIN__)
    351 # define PLATFORM_ID "Cygwin"
    352 
    353 #elif defined(__MINGW32__)
    354 # define PLATFORM_ID "MinGW"
    355 
    356 #elif defined(__APPLE__)
    357 # define PLATFORM_ID "Darwin"
    358 
    359 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
    360 # define PLATFORM_ID "Windows"
    361 
    362 #elif defined(__FreeBSD__) || defined(__FreeBSD)
    363 # define PLATFORM_ID "FreeBSD"
    364 
    365 #elif defined(__NetBSD__) || defined(__NetBSD)
    366 # define PLATFORM_ID "NetBSD"
    367 
    368 #elif defined(__OpenBSD__) || defined(__OPENBSD)
    369 # define PLATFORM_ID "OpenBSD"
    370 
    371 #elif defined(__sun) || defined(sun)
    372 # define PLATFORM_ID "SunOS"
    373 
    374 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
    375 # define PLATFORM_ID "AIX"
    376 
    377 #elif defined(__hpux) || defined(__hpux__)
    378 # define PLATFORM_ID "HP-UX"
    379 
    380 #elif defined(__HAIKU__)
    381 # define PLATFORM_ID "Haiku"
    382 
    383 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
    384 # define PLATFORM_ID "BeOS"
    385 
    386 #elif defined(__QNX__) || defined(__QNXNTO__)
    387 # define PLATFORM_ID "QNX"
    388 
    389 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
    390 # define PLATFORM_ID "Tru64"
    391 
    392 #elif defined(__riscos) || defined(__riscos__)
    393 # define PLATFORM_ID "RISCos"
    394 
    395 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
    396 # define PLATFORM_ID "SINIX"
    397 
    398 #elif defined(__UNIX_SV__)
    399 # define PLATFORM_ID "UNIX_SV"
    400 
    401 #elif defined(__bsdos__)
    402 # define PLATFORM_ID "BSDOS"
    403 
    404 #elif defined(_MPRAS) || defined(MPRAS)
    405 # define PLATFORM_ID "MP-RAS"
    406 
    407 #elif defined(__osf) || defined(__osf__)
    408 # define PLATFORM_ID "OSF1"
    409 
    410 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
    411 # define PLATFORM_ID "SCO_SV"
    412 
    413 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
    414 # define PLATFORM_ID "ULTRIX"
    415 
    416 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
    417 # define PLATFORM_ID "Xenix"
    418 
    419 #elif defined(__WATCOMC__)
    420 # if defined(__LINUX__)
    421 # define PLATFORM_ID "Linux"
    422 
    423 # elif defined(__DOS__)
    424 # define PLATFORM_ID "DOS"
    425 
    426 # elif defined(__OS2__)
    427 # define PLATFORM_ID "OS2"
    428 
    429 # elif defined(__WINDOWS__)
    430 # define PLATFORM_ID "Windows3x"
    431 
    432 # else /* unknown platform */
    433 # define PLATFORM_ID
    434 # endif
    435 
    436 #elif defined(__INTEGRITY)
    437 # if defined(INT_178B)
    438 # define PLATFORM_ID "Integrity178"
    439 
    440 # else /* regular Integrity */
    441 # define PLATFORM_ID "Integrity"
    442 # endif
    443 
    444 #else /* unknown platform */
    445 # define PLATFORM_ID
    446 
    447 #endif
    448 
    449 /* For windows compilers MSVC and Intel we can determine
    450  the architecture of the compiler being used. This is because
    451  the compilers do not have flags that can change the architecture,
    452  but rather depend on which compiler is being used
    453 */
    454 #if defined(_WIN32) && defined(_MSC_VER)
    455 # if defined(_M_IA64)
    456 # define ARCHITECTURE_ID "IA64"
    457 
    458 # elif defined(_M_X64) || defined(_M_AMD64)
    459 # define ARCHITECTURE_ID "x64"
    460 
    461 # elif defined(_M_IX86)
    462 # define ARCHITECTURE_ID "X86"
    463 
    464 # elif defined(_M_ARM64)
    465 # define ARCHITECTURE_ID "ARM64"
    466 
    467 # elif defined(_M_ARM)
    468 # if _M_ARM == 4
    469 # define ARCHITECTURE_ID "ARMV4I"
    470 # elif _M_ARM == 5
    471 # define ARCHITECTURE_ID "ARMV5I"
    472 # else
    473 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
    474 # endif
    475 
    476 # elif defined(_M_MIPS)
    477 # define ARCHITECTURE_ID "MIPS"
    478 
    479 # elif defined(_M_SH)
    480 # define ARCHITECTURE_ID "SHx"
    481 
    482 # else /* unknown architecture */
    483 # define ARCHITECTURE_ID ""
    484 # endif
    485 
    486 #elif defined(__WATCOMC__)
    487 # if defined(_M_I86)
    488 # define ARCHITECTURE_ID "I86"
    489 
    490 # elif defined(_M_IX86)
    491 # define ARCHITECTURE_ID "X86"
    492 
    493 # else /* unknown architecture */
    494 # define ARCHITECTURE_ID ""
    495 # endif
    496 
    497 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    498 # if defined(__ICCARM__)
    499 # define ARCHITECTURE_ID "ARM"
    500 
    501 # elif defined(__ICCAVR__)
    502 # define ARCHITECTURE_ID "AVR"
    503 
    504 # else /* unknown architecture */
    505 # define ARCHITECTURE_ID ""
    506 # endif
    507 
    508 #elif defined(__ghs__)
    509 # if defined(__PPC64__)
    510 # define ARCHITECTURE_ID "PPC64"
    511 
    512 # elif defined(__ppc__)
    513 # define ARCHITECTURE_ID "PPC"
    514 
    515 # elif defined(__ARM__)
    516 # define ARCHITECTURE_ID "ARM"
    517 
    518 # elif defined(__x86_64__)
    519 # define ARCHITECTURE_ID "x64"
    520 
    521 # elif defined(__i386__)
    522 # define ARCHITECTURE_ID "X86"
    523 
    524 # else /* unknown architecture */
    525 # define ARCHITECTURE_ID ""
    526 # endif
    527 #else
    528 # define ARCHITECTURE_ID
    529 #endif
    530 
    531 /* Convert integer to decimal digit literals. */
    532 #define DEC(n) \
    533  ('0' + (((n) / 10000000)%10)), \
    534  ('0' + (((n) / 1000000)%10)), \
    535  ('0' + (((n) / 100000)%10)), \
    536  ('0' + (((n) / 10000)%10)), \
    537  ('0' + (((n) / 1000)%10)), \
    538  ('0' + (((n) / 100)%10)), \
    539  ('0' + (((n) / 10)%10)), \
    540  ('0' + ((n) % 10))
    541 
    542 /* Convert integer to hex digit literals. */
    543 #define HEX(n) \
    544  ('0' + ((n)>>28 & 0xF)), \
    545  ('0' + ((n)>>24 & 0xF)), \
    546  ('0' + ((n)>>20 & 0xF)), \
    547  ('0' + ((n)>>16 & 0xF)), \
    548  ('0' + ((n)>>12 & 0xF)), \
    549  ('0' + ((n)>>8 & 0xF)), \
    550  ('0' + ((n)>>4 & 0xF)), \
    551  ('0' + ((n) & 0xF))
    552 
    553 /* Construct a string literal encoding the version number components. */
    554 #ifdef COMPILER_VERSION_MAJOR
    555 char const info_version[] =
    556 {
    557  'I', 'N', 'F', 'O', ':',
    558  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
    559  COMPILER_VERSION_MAJOR,
    560 # ifdef COMPILER_VERSION_MINOR
    561  '.', COMPILER_VERSION_MINOR,
    562 # ifdef COMPILER_VERSION_PATCH
    563  '.', COMPILER_VERSION_PATCH,
    564 # ifdef COMPILER_VERSION_TWEAK
    565  '.', COMPILER_VERSION_TWEAK,
    566 # endif
    567 # endif
    568 # endif
    569  ']','\0'
    570 };
    571 #endif
    572 
    573 /* Construct a string literal encoding the internal version number. */
    574 #ifdef COMPILER_VERSION_INTERNAL
    575 char const info_version_internal[] =
    576 {
    577  'I', 'N', 'F', 'O', ':',
    578  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
    579  'i','n','t','e','r','n','a','l','[',
    580  COMPILER_VERSION_INTERNAL,']','\0'
    581 };
    582 #endif
    583 
    584 /* Construct a string literal encoding the version number components. */
    585 #ifdef SIMULATE_VERSION_MAJOR
    586 char const info_simulate_version[] =
    587 {
    588  'I', 'N', 'F', 'O', ':',
    589  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
    590  SIMULATE_VERSION_MAJOR,
    591 # ifdef SIMULATE_VERSION_MINOR
    592  '.', SIMULATE_VERSION_MINOR,
    593 # ifdef SIMULATE_VERSION_PATCH
    594  '.', SIMULATE_VERSION_PATCH,
    595 # ifdef SIMULATE_VERSION_TWEAK
    596  '.', SIMULATE_VERSION_TWEAK,
    597 # endif
    598 # endif
    599 # endif
    600  ']','\0'
    601 };
    602 #endif
    603 
    604 /* Construct the string literal in pieces to prevent the source from
    605  getting matched. Store it in a pointer rather than an array
    606  because some compilers will just produce instructions to fill the
    607  array rather than assigning a pointer to a static array. */
    608 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
    609 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
    610 
    611 
    612 
    613 
    614 #if !defined(__STDC__)
    615 # if (defined(_MSC_VER) && !defined(__clang__)) \
    616  || (defined(__ibmxl__) || defined(__IBMC__))
    617 # define C_DIALECT "90"
    618 # else
    619 # define C_DIALECT
    620 # endif
    621 #elif __STDC_VERSION__ >= 201000L
    622 # define C_DIALECT "11"
    623 #elif __STDC_VERSION__ >= 199901L
    624 # define C_DIALECT "99"
    625 #else
    626 # define C_DIALECT "90"
    627 #endif
    628 const char* info_language_dialect_default =
    629  "INFO" ":" "dialect_default[" C_DIALECT "]";
    630 
    631 /*--------------------------------------------------------------------------*/
    632 
    633 #ifdef ID_VOID_MAIN
    634 void main() {}
    635 #else
    636 # if defined(__CLASSIC_C__)
    637 int main(argc, argv) int argc;
    638 char *argv[];
    639 # else
    640 int main(int argc, char* argv[])
    641 # endif
    642 {
    643  int require = 0;
    644  require += info_compiler[argc];
    645  require += info_platform[argc];
    646  require += info_arch[argc];
    647 #ifdef COMPILER_VERSION_MAJOR
    648  require += info_version[argc];
    649 #endif
    650 #ifdef COMPILER_VERSION_INTERNAL
    651  require += info_version_internal[argc];
    652 #endif
    653 #ifdef SIMULATE_ID
    654  require += info_simulate[argc];
    655 #endif
    656 #ifdef SIMULATE_VERSION_MAJOR
    657  require += info_simulate_version[argc];
    658 #endif
    659 #if defined(__CRAYXE) || defined(__CRAYXC)
    660  require += info_cray[argc];
    661 #endif
    662  require += info_language_dialect_default[argc];
    663  (void)argv;
    664  return require;
    665 }
    666 #endif
    diff --git a/docs/html/CMakeCXXCompilerId_8cpp_source.html b/docs/html/CMakeCXXCompilerId_8cpp_source.html index 3c38e14..3389bb2 100644 --- a/docs/html/CMakeCXXCompilerId_8cpp_source.html +++ b/docs/html/CMakeCXXCompilerId_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 /* This source file must have a .cpp extension so that all C++ compilers
    2  recognize the extension without flags. Borland does not know .cxx for
    3  example. */
    4 #ifndef __cplusplus
    5 # error "A C compiler has been selected for C++."
    6 #endif
    7 
    8 
    9 /* Version number components: V=Version, R=Revision, P=Patch
    10  Version date components: YYYY=Year, MM=Month, DD=Day */
    11 
    12 #if defined(__COMO__)
    13 # define COMPILER_ID "Comeau"
    14 /* __COMO_VERSION__ = VRR */
    15 # define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
    16 # define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
    17 
    18 #elif defined(__INTEL_COMPILER) || defined(__ICC)
    19 # define COMPILER_ID "Intel"
    20 # if defined(_MSC_VER)
    21 # define SIMULATE_ID "MSVC"
    22 # endif
    23 /* __INTEL_COMPILER = VRP */
    24 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
    25 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
    26 # if defined(__INTEL_COMPILER_UPDATE)
    27 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
    28 # else
    29 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
    30 # endif
    31 # if defined(__INTEL_COMPILER_BUILD_DATE)
    32 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
    33 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
    34 # endif
    35 # if defined(_MSC_VER)
    36 /* _MSC_VER = VVRR */
    37 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    38 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    39 # endif
    40 
    41 #elif defined(__PATHCC__)
    42 # define COMPILER_ID "PathScale"
    43 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
    44 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
    45 # if defined(__PATHCC_PATCHLEVEL__)
    46 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
    47 # endif
    48 
    49 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
    50 # define COMPILER_ID "Embarcadero"
    51 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
    52 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
    53 # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
    54 
    55 #elif defined(__BORLANDC__)
    56 # define COMPILER_ID "Borland"
    57 /* __BORLANDC__ = 0xVRR */
    58 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
    59 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
    60 
    61 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
    62 # define COMPILER_ID "Watcom"
    63 /* __WATCOMC__ = VVRR */
    64 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
    65 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    66 # if (__WATCOMC__ % 10) > 0
    67 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    68 # endif
    69 
    70 #elif defined(__WATCOMC__)
    71 # define COMPILER_ID "OpenWatcom"
    72 /* __WATCOMC__ = VVRP + 1100 */
    73 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
    74 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    75 # if (__WATCOMC__ % 10) > 0
    76 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    77 # endif
    78 
    79 #elif defined(__SUNPRO_CC)
    80 # define COMPILER_ID "SunPro"
    81 # if __SUNPRO_CC >= 0x5100
    82 /* __SUNPRO_CC = 0xVRRP */
    83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
    84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
    85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
    86 # else
    87 /* __SUNPRO_CC = 0xVRP */
    88 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
    89 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
    90 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
    91 # endif
    92 
    93 #elif defined(__HP_aCC)
    94 # define COMPILER_ID "HP"
    95 /* __HP_aCC = VVRRPP */
    96 # define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
    97 # define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
    98 # define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
    99 
    100 #elif defined(__DECCXX)
    101 # define COMPILER_ID "Compaq"
    102 /* __DECCXX_VER = VVRRTPPPP */
    103 # define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
    104 # define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100)
    105 # define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
    106 
    107 #elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
    108 # define COMPILER_ID "zOS"
    109 # if defined(__ibmxl__)
    110 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    111 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    112 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    113 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    114 # else
    115 /* __IBMCPP__ = VRP */
    116 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    117 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    118 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    119 # endif
    120 
    121 
    122 #elif defined(__ibmxl__) || (defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800)
    123 # define COMPILER_ID "XL"
    124 # if defined(__ibmxl__)
    125 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    126 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    127 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    128 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    129 # else
    130 /* __IBMCPP__ = VRP */
    131 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    132 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    133 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    134 # endif
    135 
    136 
    137 #elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
    138 # define COMPILER_ID "VisualAge"
    139 # if defined(__ibmxl__)
    140 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    141 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    142 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    143 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    144 # else
    145 /* __IBMCPP__ = VRP */
    146 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    147 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    148 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    149 # endif
    150 
    151 
    152 #elif defined(__PGI)
    153 # define COMPILER_ID "PGI"
    154 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
    155 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
    156 # if defined(__PGIC_PATCHLEVEL__)
    157 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
    158 # endif
    159 
    160 #elif defined(_CRAYC)
    161 # define COMPILER_ID "Cray"
    162 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
    163 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
    164 
    165 #elif defined(__TI_COMPILER_VERSION__)
    166 # define COMPILER_ID "TI"
    167 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
    168 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
    169 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
    170 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
    171 
    172 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
    173 # define COMPILER_ID "Fujitsu"
    174 
    175 #elif defined(__ghs__)
    176 # define COMPILER_ID "GHS"
    177 /* __GHS_VERSION_NUMBER = VVVVRP */
    178 # ifdef __GHS_VERSION_NUMBER
    179 # define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
    180 # define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
    181 # define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
    182 # endif
    183 
    184 #elif defined(__SCO_VERSION__)
    185 # define COMPILER_ID "SCO"
    186 
    187 #elif defined(__ARMCC_VERSION) && !defined(__clang__)
    188 # define COMPILER_ID "ARMCC"
    189 #if __ARMCC_VERSION >= 1000000
    190 /* __ARMCC_VERSION = VRRPPPP */
    191 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
    192 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
    193 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    194 #else
    195 /* __ARMCC_VERSION = VRPPPP */
    196 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
    197 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
    198 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    199 #endif
    200 
    201 
    202 #elif defined(__clang__) && defined(__apple_build_version__)
    203 # define COMPILER_ID "AppleClang"
    204 # if defined(_MSC_VER)
    205 # define SIMULATE_ID "MSVC"
    206 # endif
    207 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    208 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    209 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    210 # if defined(_MSC_VER)
    211 /* _MSC_VER = VVRR */
    212 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    213 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    214 # endif
    215 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
    216 
    217 #elif defined(__clang__)
    218 # define COMPILER_ID "Clang"
    219 # if defined(_MSC_VER)
    220 # define SIMULATE_ID "MSVC"
    221 # endif
    222 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    223 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    224 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    225 # if defined(_MSC_VER)
    226 /* _MSC_VER = VVRR */
    227 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    228 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    229 # endif
    230 
    231 #elif defined(__GNUC__) || defined(__GNUG__)
    232 # define COMPILER_ID "GNU"
    233 # if defined(__GNUC__)
    234 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
    235 # else
    236 # define COMPILER_VERSION_MAJOR DEC(__GNUG__)
    237 # endif
    238 # if defined(__GNUC_MINOR__)
    239 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
    240 # endif
    241 # if defined(__GNUC_PATCHLEVEL__)
    242 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
    243 # endif
    244 
    245 #elif defined(_MSC_VER)
    246 # define COMPILER_ID "MSVC"
    247 /* _MSC_VER = VVRR */
    248 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
    249 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
    250 # if defined(_MSC_FULL_VER)
    251 # if _MSC_VER >= 1400
    252 /* _MSC_FULL_VER = VVRRPPPPP */
    253 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
    254 # else
    255 /* _MSC_FULL_VER = VVRRPPPP */
    256 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
    257 # endif
    258 # endif
    259 # if defined(_MSC_BUILD)
    260 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
    261 # endif
    262 
    263 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
    264 # define COMPILER_ID "ADSP"
    265 #if defined(__VISUALDSPVERSION__)
    266 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
    267 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
    268 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
    269 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
    270 #endif
    271 
    272 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    273 # define COMPILER_ID "IAR"
    274 # if defined(__VER__) && defined(__ICCARM__)
    275 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
    276 # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
    277 # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
    278 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    279 # elif defined(__VER__) && defined(__ICCAVR__)
    280 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
    281 # define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
    282 # define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
    283 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    284 # endif
    285 
    286 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
    287 # define COMPILER_ID "MIPSpro"
    288 # if defined(_SGI_COMPILER_VERSION)
    289 /* _SGI_COMPILER_VERSION = VRP */
    290 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
    291 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
    292 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
    293 # else
    294 /* _COMPILER_VERSION = VRP */
    295 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
    296 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
    297 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
    298 # endif
    299 
    300 
    301 /* These compilers are either not known or too old to define an
    302  identification macro. Try to identify the platform and guess that
    303  it is the native compiler. */
    304 #elif defined(__hpux) || defined(__hpua)
    305 # define COMPILER_ID "HP"
    306 
    307 #else /* unknown compiler */
    308 # define COMPILER_ID ""
    309 #endif
    310 
    311 /* Construct the string literal in pieces to prevent the source from
    312  getting matched. Store it in a pointer rather than an array
    313  because some compilers will just produce instructions to fill the
    314  array rather than assigning a pointer to a static array. */
    315 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
    316 #ifdef SIMULATE_ID
    317 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
    318 #endif
    319 
    320 #ifdef __QNXNTO__
    321 char const* qnxnto = "INFO" ":" "qnxnto[]";
    322 #endif
    323 
    324 #if defined(__CRAYXE) || defined(__CRAYXC)
    325 char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
    326 #endif
    327 
    328 #define STRINGIFY_HELPER(X) #X
    329 #define STRINGIFY(X) STRINGIFY_HELPER(X)
    330 
    331 /* Identify known platforms by name. */
    332 #if defined(__linux) || defined(__linux__) || defined(linux)
    333 # define PLATFORM_ID "Linux"
    334 
    335 #elif defined(__CYGWIN__)
    336 # define PLATFORM_ID "Cygwin"
    337 
    338 #elif defined(__MINGW32__)
    339 # define PLATFORM_ID "MinGW"
    340 
    341 #elif defined(__APPLE__)
    342 # define PLATFORM_ID "Darwin"
    343 
    344 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
    345 # define PLATFORM_ID "Windows"
    346 
    347 #elif defined(__FreeBSD__) || defined(__FreeBSD)
    348 # define PLATFORM_ID "FreeBSD"
    349 
    350 #elif defined(__NetBSD__) || defined(__NetBSD)
    351 # define PLATFORM_ID "NetBSD"
    352 
    353 #elif defined(__OpenBSD__) || defined(__OPENBSD)
    354 # define PLATFORM_ID "OpenBSD"
    355 
    356 #elif defined(__sun) || defined(sun)
    357 # define PLATFORM_ID "SunOS"
    358 
    359 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
    360 # define PLATFORM_ID "AIX"
    361 
    362 #elif defined(__hpux) || defined(__hpux__)
    363 # define PLATFORM_ID "HP-UX"
    364 
    365 #elif defined(__HAIKU__)
    366 # define PLATFORM_ID "Haiku"
    367 
    368 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
    369 # define PLATFORM_ID "BeOS"
    370 
    371 #elif defined(__QNX__) || defined(__QNXNTO__)
    372 # define PLATFORM_ID "QNX"
    373 
    374 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
    375 # define PLATFORM_ID "Tru64"
    376 
    377 #elif defined(__riscos) || defined(__riscos__)
    378 # define PLATFORM_ID "RISCos"
    379 
    380 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
    381 # define PLATFORM_ID "SINIX"
    382 
    383 #elif defined(__UNIX_SV__)
    384 # define PLATFORM_ID "UNIX_SV"
    385 
    386 #elif defined(__bsdos__)
    387 # define PLATFORM_ID "BSDOS"
    388 
    389 #elif defined(_MPRAS) || defined(MPRAS)
    390 # define PLATFORM_ID "MP-RAS"
    391 
    392 #elif defined(__osf) || defined(__osf__)
    393 # define PLATFORM_ID "OSF1"
    394 
    395 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
    396 # define PLATFORM_ID "SCO_SV"
    397 
    398 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
    399 # define PLATFORM_ID "ULTRIX"
    400 
    401 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
    402 # define PLATFORM_ID "Xenix"
    403 
    404 #elif defined(__WATCOMC__)
    405 # if defined(__LINUX__)
    406 # define PLATFORM_ID "Linux"
    407 
    408 # elif defined(__DOS__)
    409 # define PLATFORM_ID "DOS"
    410 
    411 # elif defined(__OS2__)
    412 # define PLATFORM_ID "OS2"
    413 
    414 # elif defined(__WINDOWS__)
    415 # define PLATFORM_ID "Windows3x"
    416 
    417 # else /* unknown platform */
    418 # define PLATFORM_ID
    419 # endif
    420 
    421 #elif defined(__INTEGRITY)
    422 # if defined(INT_178B)
    423 # define PLATFORM_ID "Integrity178"
    424 
    425 # else /* regular Integrity */
    426 # define PLATFORM_ID "Integrity"
    427 # endif
    428 
    429 #else /* unknown platform */
    430 # define PLATFORM_ID
    431 
    432 #endif
    433 
    434 /* For windows compilers MSVC and Intel we can determine
    435  the architecture of the compiler being used. This is because
    436  the compilers do not have flags that can change the architecture,
    437  but rather depend on which compiler is being used
    438 */
    439 #if defined(_WIN32) && defined(_MSC_VER)
    440 # if defined(_M_IA64)
    441 # define ARCHITECTURE_ID "IA64"
    442 
    443 # elif defined(_M_X64) || defined(_M_AMD64)
    444 # define ARCHITECTURE_ID "x64"
    445 
    446 # elif defined(_M_IX86)
    447 # define ARCHITECTURE_ID "X86"
    448 
    449 # elif defined(_M_ARM64)
    450 # define ARCHITECTURE_ID "ARM64"
    451 
    452 # elif defined(_M_ARM)
    453 # if _M_ARM == 4
    454 # define ARCHITECTURE_ID "ARMV4I"
    455 # elif _M_ARM == 5
    456 # define ARCHITECTURE_ID "ARMV5I"
    457 # else
    458 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
    459 # endif
    460 
    461 # elif defined(_M_MIPS)
    462 # define ARCHITECTURE_ID "MIPS"
    463 
    464 # elif defined(_M_SH)
    465 # define ARCHITECTURE_ID "SHx"
    466 
    467 # else /* unknown architecture */
    468 # define ARCHITECTURE_ID ""
    469 # endif
    470 
    471 #elif defined(__WATCOMC__)
    472 # if defined(_M_I86)
    473 # define ARCHITECTURE_ID "I86"
    474 
    475 # elif defined(_M_IX86)
    476 # define ARCHITECTURE_ID "X86"
    477 
    478 # else /* unknown architecture */
    479 # define ARCHITECTURE_ID ""
    480 # endif
    481 
    482 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    483 # if defined(__ICCARM__)
    484 # define ARCHITECTURE_ID "ARM"
    485 
    486 # elif defined(__ICCAVR__)
    487 # define ARCHITECTURE_ID "AVR"
    488 
    489 # else /* unknown architecture */
    490 # define ARCHITECTURE_ID ""
    491 # endif
    492 
    493 #elif defined(__ghs__)
    494 # if defined(__PPC64__)
    495 # define ARCHITECTURE_ID "PPC64"
    496 
    497 # elif defined(__ppc__)
    498 # define ARCHITECTURE_ID "PPC"
    499 
    500 # elif defined(__ARM__)
    501 # define ARCHITECTURE_ID "ARM"
    502 
    503 # elif defined(__x86_64__)
    504 # define ARCHITECTURE_ID "x64"
    505 
    506 # elif defined(__i386__)
    507 # define ARCHITECTURE_ID "X86"
    508 
    509 # else /* unknown architecture */
    510 # define ARCHITECTURE_ID ""
    511 # endif
    512 #else
    513 # define ARCHITECTURE_ID
    514 #endif
    515 
    516 /* Convert integer to decimal digit literals. */
    517 #define DEC(n) \
    518  ('0' + (((n) / 10000000)%10)), \
    519  ('0' + (((n) / 1000000)%10)), \
    520  ('0' + (((n) / 100000)%10)), \
    521  ('0' + (((n) / 10000)%10)), \
    522  ('0' + (((n) / 1000)%10)), \
    523  ('0' + (((n) / 100)%10)), \
    524  ('0' + (((n) / 10)%10)), \
    525  ('0' + ((n) % 10))
    526 
    527 /* Convert integer to hex digit literals. */
    528 #define HEX(n) \
    529  ('0' + ((n)>>28 & 0xF)), \
    530  ('0' + ((n)>>24 & 0xF)), \
    531  ('0' + ((n)>>20 & 0xF)), \
    532  ('0' + ((n)>>16 & 0xF)), \
    533  ('0' + ((n)>>12 & 0xF)), \
    534  ('0' + ((n)>>8 & 0xF)), \
    535  ('0' + ((n)>>4 & 0xF)), \
    536  ('0' + ((n) & 0xF))
    537 
    538 /* Construct a string literal encoding the version number components. */
    539 #ifdef COMPILER_VERSION_MAJOR
    540 char const info_version[] =
    541 {
    542  'I', 'N', 'F', 'O', ':',
    543  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
    544  COMPILER_VERSION_MAJOR,
    545 # ifdef COMPILER_VERSION_MINOR
    546  '.', COMPILER_VERSION_MINOR,
    547 # ifdef COMPILER_VERSION_PATCH
    548  '.', COMPILER_VERSION_PATCH,
    549 # ifdef COMPILER_VERSION_TWEAK
    550  '.', COMPILER_VERSION_TWEAK,
    551 # endif
    552 # endif
    553 # endif
    554  ']','\0'
    555 };
    556 #endif
    557 
    558 /* Construct a string literal encoding the internal version number. */
    559 #ifdef COMPILER_VERSION_INTERNAL
    560 char const info_version_internal[] =
    561 {
    562  'I', 'N', 'F', 'O', ':',
    563  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
    564  'i','n','t','e','r','n','a','l','[',
    565  COMPILER_VERSION_INTERNAL,']','\0'
    566 };
    567 #endif
    568 
    569 /* Construct a string literal encoding the version number components. */
    570 #ifdef SIMULATE_VERSION_MAJOR
    571 char const info_simulate_version[] =
    572 {
    573  'I', 'N', 'F', 'O', ':',
    574  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
    575  SIMULATE_VERSION_MAJOR,
    576 # ifdef SIMULATE_VERSION_MINOR
    577  '.', SIMULATE_VERSION_MINOR,
    578 # ifdef SIMULATE_VERSION_PATCH
    579  '.', SIMULATE_VERSION_PATCH,
    580 # ifdef SIMULATE_VERSION_TWEAK
    581  '.', SIMULATE_VERSION_TWEAK,
    582 # endif
    583 # endif
    584 # endif
    585  ']','\0'
    586 };
    587 #endif
    588 
    589 /* Construct the string literal in pieces to prevent the source from
    590  getting matched. Store it in a pointer rather than an array
    591  because some compilers will just produce instructions to fill the
    592  array rather than assigning a pointer to a static array. */
    593 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
    594 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
    595 
    596 
    597 
    598 
    599 #if defined(_MSC_VER) && defined(_MSVC_LANG)
    600 #define CXX_STD _MSVC_LANG
    601 #else
    602 #define CXX_STD __cplusplus
    603 #endif
    604 
    605 const char* info_language_dialect_default = "INFO" ":" "dialect_default["
    606 #if CXX_STD > 201703L
    607  "20"
    608 #elif CXX_STD >= 201703L
    609  "17"
    610 #elif CXX_STD >= 201402L
    611  "14"
    612 #elif CXX_STD >= 201103L
    613  "11"
    614 #else
    615  "98"
    616 #endif
    617  "]";
    618 
    619 /*--------------------------------------------------------------------------*/
    620 
    621 int main(int argc, char* argv[])
    622 {
    623  int require = 0;
    624  require += info_compiler[argc];
    625  require += info_platform[argc];
    626 #ifdef COMPILER_VERSION_MAJOR
    627  require += info_version[argc];
    628 #endif
    629 #ifdef COMPILER_VERSION_INTERNAL
    630  require += info_version_internal[argc];
    631 #endif
    632 #ifdef SIMULATE_ID
    633  require += info_simulate[argc];
    634 #endif
    635 #ifdef SIMULATE_VERSION_MAJOR
    636  require += info_simulate_version[argc];
    637 #endif
    638 #if defined(__CRAYXE) || defined(__CRAYXC)
    639  require += info_cray[argc];
    640 #endif
    641  require += info_language_dialect_default[argc];
    642  (void)argv;
    643  return require;
    644 }
    diff --git a/docs/html/annotated.html b/docs/html/annotated.html index 5ac1c23..c07dd4e 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -85,7 +85,7 @@ $(function() { diff --git a/docs/html/b15f_8cpp_source.html b/docs/html/b15f_8cpp_source.html index 2b0aafd..acfab44 100644 --- a/docs/html/b15f_8cpp_source.html +++ b/docs/html/b15f_8cpp_source.html @@ -70,48 +70,48 @@ $(function() {
    b15f.cpp
    -
    1 #include "b15f.h"
    2 
    3 B15F *B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while (device.find(' ') != std::string::npos || device.find('\n') != std::string::npos ||
    16  device.find('\t') != std::string::npos)
    17  device.pop_back();
    18 
    19  if (device.length() == 0)
    20  abort("Adapter nicht gefunden");
    21 
    22  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31  std::cout << PRE << "Teste Verbindung... " << std::flush;
    32  uint8_t tries = 3;
    33  while (tries--)
    34  {
    35  // verwerfe Daten, die µC noch hat
    36  //discard();
    37 
    38  if (!testConnection())
    39  continue;
    40 
    41  if (!testIntConv())
    42  continue;
    43 
    44  break;
    45  }
    46  if (tries == 0)
    47  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    48  std::cout << "OK" << std::endl;
    49 
    50 
    51  // Gib board info aus
    52  std::vector<std::string> info = getBoardInfo();
    53  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")"
    54  << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while (tries--)
    61  {
    63  discard();
    64 
    65  if (testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  uint8_t rq[] =
    77  {
    78  RQ_DISC
    79  };
    80 
    81  usart.clearOutputBuffer();
    82  for (uint8_t i = 0; i < 16; i++)
    83  {
    84  usart.transmit(&rq[0], 0, sizeof(rq)); // sende discard Befehl (verwerfe input)
    85  delay_ms(4);
    86  }
    87  usart.clearInputBuffer();
    88  }
    89  catch (std::exception &ex)
    90  {
    91  abort(ex);
    92  }
    93 }
    94 
    96 {
    97  // erzeuge zufälliges Byte
    98  srand(time(NULL));
    99  uint8_t dummy = rand() % 256;
    100 
    101  uint8_t rq[] =
    102  {
    103  RQ_TEST,
    104  dummy
    105  };
    106  usart.transmit(&rq[0], 0, sizeof(rq));
    107 
    108  uint8_t aw[2];
    109  usart.receive(&aw[0], 0, sizeof(aw));
    110 
    111  return aw[0] == MSG_OK && aw[1] == dummy;
    112 }
    113 
    115 {
    116  srand(time(NULL));
    117  uint16_t dummy = rand() % (0xFFFF / 3);
    118 
    119  uint8_t rq[] =
    120  {
    121  RQ_INT,
    122  static_cast<uint8_t >(dummy & 0xFF),
    123  static_cast<uint8_t >(dummy >> 8)
    124  };
    125  usart.transmit(&rq[0], 0, sizeof(rq));
    126 
    127  uint16_t aw;
    128  usart.receive(reinterpret_cast<uint8_t*>(&aw), 0, sizeof(aw));
    129 
    130  return aw == dummy * 3;
    131 }
    132 
    133 
    134 std::vector<std::string> B15F::getBoardInfo(void)
    135 {
    136  std::vector<std::string> info;
    137 
    138  uint8_t rq[] =
    139  {
    140  RQ_INFO
    141  };
    142  usart.transmit(&rq[0], 0, sizeof(rq));
    143 
    144  uint8_t n;
    145  usart.receive(&n, 0, sizeof(n));
    146 
    147  while (n--)
    148  {
    149  uint8_t len;
    150  usart.receive(&len, 0, sizeof(len));
    151 
    152  char str[len + 1];
    153  str[len] = '\0';
    154  usart.receive(reinterpret_cast<uint8_t *>(&str[0]), 0, len);
    155 
    156  info.push_back(std::string(str));
    157  }
    158 
    159  uint8_t aw;
    160  usart.receive(&aw, 0, sizeof(aw));
    161  if (aw != MSG_OK)
    162  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    163 
    164  return info;
    165 }
    166 
    168 {
    169  uint8_t rq[] =
    170  {
    171  RQ_ST
    172  };
    173  usart.transmit(&rq[0], 0, sizeof(rq));
    174 
    175  uint8_t aw;
    176  usart.receive(&aw, 0, sizeof(aw));
    177  return aw == MSG_OK;
    178 }
    179 
    180 bool B15F::digitalWrite0(uint8_t port)
    181 {
    182  uint8_t rq[] =
    183  {
    184  RQ_BA0,
    185  port
    186  };
    187  usart.transmit(&rq[0], 0, sizeof(rq));
    188 
    189  uint8_t aw;
    190  usart.receive(&aw, 0, sizeof(aw));
    191  return aw == MSG_OK;
    192 }
    193 
    194 bool B15F::digitalWrite1(uint8_t port)
    195 {
    196  uint8_t rq[] =
    197  {
    198  RQ_BA1,
    199  port
    200  };
    201  usart.transmit(&rq[0], 0, sizeof(rq));
    202 
    203  uint8_t aw;
    204  usart.receive(&aw, 0, sizeof(aw));
    205  return aw == MSG_OK;
    206 }
    207 
    209 {
    210  usart.clearInputBuffer();
    211  uint8_t rq[] =
    212  {
    213  RQ_BE0
    214  };
    215  usart.transmit(&rq[0], 0, sizeof(rq));
    216 
    217  uint8_t aw;
    218  usart.receive(&aw, 0, sizeof(aw));
    219  return aw;
    220 }
    221 
    223 {
    224  usart.clearInputBuffer();
    225  uint8_t rq[] =
    226  {
    227  RQ_BE1
    228  };
    229  usart.transmit(&rq[0], 0, sizeof(rq));
    230 
    231  uint8_t aw;
    232  usart.receive(&aw, 0, sizeof(aw));
    233  return aw;
    234 }
    235 
    237 {
    238  usart.clearInputBuffer();
    239  uint8_t rq[] =
    240  {
    241  RQ_DSW
    242  };
    243  usart.transmit(&rq[0], 0, sizeof(rq));
    244 
    245  uint8_t aw;
    246  usart.receive(&aw, 0, sizeof(aw));
    247  return aw;
    248 }
    249 
    250 bool B15F::analogWrite0(uint16_t value)
    251 {
    252  uint8_t rq[] =
    253  {
    254  RQ_AA0,
    255  static_cast<uint8_t >(value & 0xFF),
    256  static_cast<uint8_t >(value >> 8)
    257  };
    258  usart.transmit(&rq[0], 0, sizeof(rq));
    259 
    260  uint8_t aw;
    261  usart.receive(&aw, 0, sizeof(aw));
    262  return aw == MSG_OK;
    263 }
    264 
    265 bool B15F::analogWrite1(uint16_t value)
    266 {
    267  uint8_t rq[] =
    268  {
    269  RQ_AA1,
    270  static_cast<uint8_t >(value & 0xFF),
    271  static_cast<uint8_t >(value >> 8)
    272  };
    273  usart.transmit(&rq[0], 0, sizeof(rq));
    274 
    275  uint8_t aw;
    276  usart.receive(&aw, 0, sizeof(aw));
    277  return aw == MSG_OK;
    278 }
    279 
    280 uint16_t B15F::analogRead(uint8_t channel)
    281 {
    282  usart.clearInputBuffer();
    283  if (channel > 7)
    284  abort("Bad ADC channel: " + std::to_string(channel));
    285 
    286  uint8_t rq[] =
    287  {
    288  RQ_ADC,
    289  channel
    290  };
    291 
    292  usart.transmit(&rq[0], 0, sizeof(rq));
    293 
    294  uint16_t aw;
    295  usart.receive(reinterpret_cast<uint8_t*>(&aw), 0, sizeof(aw));
    296 
    297  if (aw > 1023)
    298  abort("Bad ADC data detected (1)");
    299  return aw;
    300 }
    301 
    302 void
    303 B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b,
    304  uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    305 {
    306  /*
    307  // prepare pointers
    308  buffer_a += offset_a;
    309  buffer_b += offset_b;
    310 
    311 
    312  usart.clearInputBuffer();
    313  usart.writeByte(RQ_ADC_DAC_STROKE);
    314  usart.writeByte(channel_a);
    315  usart.writeByte(channel_b);
    316  usart.writeInt(start);
    317  usart.writeInt(static_cast<uint16_t>(delta));
    318  usart.writeInt(count);
    319 
    320  for (uint16_t i = 0; i < count; i++) {
    321  if (buffer_a) {
    322  buffer_a[i] = usart.readInt();
    323 
    324  if (buffer_a[i] > 1023) // check for broken usart connection
    325  abort("Bad ADC data detected (2)");
    326  } else {
    327  usart.readInt();
    328  }
    329 
    330  if (buffer_b) {
    331  buffer_b[i] = usart.readInt();
    332 
    333  if (buffer_b[i] > 1023) // check for broken usart connection
    334  abort("Bad ADC data detected (3)");
    335  } else {
    336  usart.readInt();
    337  }
    338  }
    339 
    340  uint8_t aw = usart.readByte();
    341  if (aw != MSG_OK)
    342  abort("Sequenz unterbrochen");
    343 
    344  delay_us(10);*/
    345 }
    346 
    347 uint8_t B15F::pwmSetFrequency(uint32_t freq)
    348 {
    349  usart.clearInputBuffer();
    350 
    351  uint8_t rq[] =
    352  {
    353  RQ_PWM_SET_FREQ,
    354  static_cast<uint8_t>((freq >> 0) & 0xFF),
    355  static_cast<uint8_t>((freq >> 8) & 0xFF),
    356  static_cast<uint8_t>((freq >> 16) & 0xFF),
    357  static_cast<uint8_t>((freq >> 24) & 0xFF)
    358  };
    359 
    360  usart.transmit(&rq[0], 0, sizeof(rq));
    361 
    362  uint8_t aw;
    363  usart.receive(&aw, 0, sizeof(aw));
    364  return aw;
    365 }
    366 
    367 bool B15F::pwmSetValue(uint8_t value)
    368 {
    369  usart.clearInputBuffer();
    370 
    371  uint8_t rq[] =
    372  {
    373  RQ_PWM_SET_VALUE,
    374  value
    375  };
    376 
    377  usart.transmit(&rq[0], 0, sizeof(rq));
    378 
    379  uint8_t aw;
    380  usart.receive(&aw, 0, sizeof(aw));
    381  return aw == MSG_OK;
    382 }
    383 
    384 bool B15F::setRegister(uint8_t adr, uint8_t val)
    385 {
    386  usart.clearInputBuffer();
    387 
    388  uint8_t rq[] =
    389  {
    390  RQ_SET_REG,
    391  adr,
    392  val
    393  };
    394 
    395  usart.transmit(&rq[0], 0, sizeof(rq));
    396 
    397  uint8_t aw;
    398  usart.receive(&aw, 0, sizeof(aw));
    399  return aw == val;
    400 }
    401 
    402 uint8_t B15F::getRegister(uint8_t adr)
    403 {
    404  usart.clearInputBuffer();
    405 
    406  uint8_t rq[] =
    407  {
    408  RQ_GET_REG,
    409  adr
    410  };
    411 
    412  usart.transmit(&rq[0], 0, sizeof(rq));
    413 
    414  uint8_t aw;
    415  usart.receive(&aw, 0, sizeof(aw));
    416  return aw;
    417 }
    418 
    419 
    420 void B15F::delay_ms(uint16_t ms)
    421 {
    422  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    423 }
    424 
    425 void B15F::delay_us(uint16_t us)
    426 {
    427  std::this_thread::sleep_for(std::chrono::microseconds(us));
    428 }
    429 
    431 {
    432  if (!instance)
    433  instance = new B15F();
    434 
    435  return *instance;
    436 }
    437 
    438 // https://stackoverflow.com/a/478960
    439 std::string B15F::exec(std::string cmd)
    440 {
    441  std::array<char, 128> buffer;
    442  std::string result;
    443  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    444  if (!pipe)
    445  {
    446  throw std::runtime_error("popen() failed!");
    447  }
    448  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    449  {
    450  result += buffer.data();
    451  }
    452  return result;
    453 }
    454 
    455 void B15F::abort(std::string msg)
    456 {
    457  DriverException ex(msg);
    458  abort(ex);
    459 }
    460 
    461 void B15F::abort(std::exception &ex)
    462 {
    463  if (errorhandler)
    464  errorhandler(ex);
    465  else
    466  {
    467  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    468  std::cout << ex.what() << std::endl;
    469  throw DriverException(ex.what());
    470  }
    471 }
    472 
    473 void B15F::setAbortHandler(errorhandler_t func)
    474 {
    475  errorhandler = func;
    476 }
    -
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:439
    -
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:402
    -
    void delay_us(uint16_t us)
    Definition: b15f.cpp:425
    -
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:208
    -
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:347
    -
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:303
    +
    1 #include "b15f.h"
    2 
    3 B15F *B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while (device.find(' ') != std::string::npos || device.find('\n') != std::string::npos ||
    16  device.find('\t') != std::string::npos)
    17  device.pop_back();
    18 
    19  if (device.length() == 0)
    20  abort("Adapter nicht gefunden");
    21 
    22  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31  std::cout << PRE << "Teste Verbindung... " << std::flush;
    32  uint8_t tries = 3;
    33  while (tries--)
    34  {
    35  // verwerfe Daten, die µC noch hat
    36  //discard();
    37 
    38  if (!testConnection())
    39  continue;
    40 
    41  if (!testIntConv())
    42  continue;
    43 
    44  break;
    45  }
    46  if (tries == 0)
    47  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    48  std::cout << "OK" << std::endl;
    49 
    50 
    51  // Gib board info aus
    52  std::vector<std::string> info = getBoardInfo();
    53  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")"
    54  << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while (tries--)
    61  {
    63  discard();
    64 
    65  if (testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  uint8_t rq[] =
    77  {
    78  RQ_DISC
    79  };
    80 
    81  usart.clearOutputBuffer();
    82  for (uint8_t i = 0; i < 16; i++)
    83  {
    84  usart.transmit(&rq[0], 0, sizeof(rq)); // sende discard Befehl (verwerfe input)
    85  delay_ms(4);
    86  }
    87  usart.clearInputBuffer();
    88  }
    89  catch (std::exception &ex)
    90  {
    91  abort(ex);
    92  }
    93 }
    94 
    96 {
    97  // erzeuge zufälliges Byte
    98  srand(time(NULL));
    99  uint8_t dummy = rand() % 256;
    100 
    101  uint8_t rq[] =
    102  {
    103  RQ_TEST,
    104  dummy
    105  };
    106  usart.transmit(&rq[0], 0, sizeof(rq));
    107 
    108  uint8_t aw[2];
    109  usart.receive(&aw[0], 0, sizeof(aw));
    110 
    111  return aw[0] == MSG_OK && aw[1] == dummy;
    112 }
    113 
    115 {
    116  srand(time(NULL));
    117  uint16_t dummy = rand() % (0xFFFF / 3);
    118 
    119  uint8_t rq[] =
    120  {
    121  RQ_INT,
    122  static_cast<uint8_t >(dummy & 0xFF),
    123  static_cast<uint8_t >(dummy >> 8)
    124  };
    125  usart.transmit(&rq[0], 0, sizeof(rq));
    126 
    127  uint16_t aw;
    128  usart.receive(reinterpret_cast<uint8_t*>(&aw), 0, sizeof(aw));
    129 
    130  return aw == dummy * 3;
    131 }
    132 
    133 
    134 std::vector<std::string> B15F::getBoardInfo(void)
    135 {
    136  std::vector<std::string> info;
    137 
    138  uint8_t rq[] =
    139  {
    140  RQ_INFO
    141  };
    142  usart.transmit(&rq[0], 0, sizeof(rq));
    143 
    144  uint8_t n;
    145  usart.receive(&n, 0, sizeof(n));
    146  std::cout << "len: " << (int) n << std::endl << std::flush;
    147  while (n--)
    148  {
    149  uint8_t len;
    150  usart.receive(&len, 0, sizeof(len));
    151 
    152  char str[len + 1];
    153  str[len] = '\0';
    154  usart.receive(reinterpret_cast<uint8_t *>(&str[0]), 0, len);
    155 
    156  std::cout << &str[0] << std::endl;
    157 
    158  info.push_back(std::string(str));
    159  }
    160 
    161  uint8_t aw;
    162  usart.receive(&aw, 0, sizeof(aw));
    163  if (aw != MSG_OK)
    164  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    165 
    166  return info;
    167 }
    168 
    170 {
    171  uint8_t rq[] =
    172  {
    173  RQ_ST
    174  };
    175  usart.transmit(&rq[0], 0, sizeof(rq));
    176 
    177  uint8_t aw;
    178  usart.receive(&aw, 0, sizeof(aw));
    179  return aw == MSG_OK;
    180 }
    181 
    182 bool B15F::digitalWrite0(uint8_t port)
    183 {
    184  uint8_t rq[] =
    185  {
    186  RQ_BA0,
    187  port
    188  };
    189  usart.transmit(&rq[0], 0, sizeof(rq));
    190 
    191  uint8_t aw;
    192  usart.receive(&aw, 0, sizeof(aw));
    193  return aw == MSG_OK;
    194 }
    195 
    196 bool B15F::digitalWrite1(uint8_t port)
    197 {
    198  uint8_t rq[] =
    199  {
    200  RQ_BA1,
    201  port
    202  };
    203  usart.transmit(&rq[0], 0, sizeof(rq));
    204 
    205  uint8_t aw;
    206  usart.receive(&aw, 0, sizeof(aw));
    207  return aw == MSG_OK;
    208 }
    209 
    211 {
    212  usart.clearInputBuffer();
    213  uint8_t rq[] =
    214  {
    215  RQ_BE0
    216  };
    217  usart.transmit(&rq[0], 0, sizeof(rq));
    218 
    219  uint8_t aw;
    220  usart.receive(&aw, 0, sizeof(aw));
    221  return aw;
    222 }
    223 
    225 {
    226  usart.clearInputBuffer();
    227  uint8_t rq[] =
    228  {
    229  RQ_BE1
    230  };
    231  usart.transmit(&rq[0], 0, sizeof(rq));
    232 
    233  uint8_t aw;
    234  usart.receive(&aw, 0, sizeof(aw));
    235  return aw;
    236 }
    237 
    239 {
    240  usart.clearInputBuffer();
    241  uint8_t rq[] =
    242  {
    243  RQ_DSW
    244  };
    245  usart.transmit(&rq[0], 0, sizeof(rq));
    246 
    247  uint8_t aw;
    248  usart.receive(&aw, 0, sizeof(aw));
    249  return aw;
    250 }
    251 
    252 bool B15F::analogWrite0(uint16_t value)
    253 {
    254  uint8_t rq[] =
    255  {
    256  RQ_AA0,
    257  static_cast<uint8_t >(value & 0xFF),
    258  static_cast<uint8_t >(value >> 8)
    259  };
    260  usart.transmit(&rq[0], 0, sizeof(rq));
    261 
    262  uint8_t aw;
    263  usart.receive(&aw, 0, sizeof(aw));
    264  return aw == MSG_OK;
    265 }
    266 
    267 bool B15F::analogWrite1(uint16_t value)
    268 {
    269  uint8_t rq[] =
    270  {
    271  RQ_AA1,
    272  static_cast<uint8_t >(value & 0xFF),
    273  static_cast<uint8_t >(value >> 8)
    274  };
    275  usart.transmit(&rq[0], 0, sizeof(rq));
    276 
    277  uint8_t aw;
    278  usart.receive(&aw, 0, sizeof(aw));
    279  return aw == MSG_OK;
    280 }
    281 
    282 uint16_t B15F::analogRead(uint8_t channel)
    283 {
    284  usart.clearInputBuffer();
    285  if (channel > 7)
    286  abort("Bad ADC channel: " + std::to_string(channel));
    287 
    288  uint8_t rq[] =
    289  {
    290  RQ_ADC,
    291  channel
    292  };
    293 
    294  usart.transmit(&rq[0], 0, sizeof(rq));
    295 
    296  uint16_t aw;
    297  usart.receive(reinterpret_cast<uint8_t*>(&aw), 0, sizeof(aw));
    298 
    299  if (aw > 1023)
    300  abort("Bad ADC data detected (1)");
    301  return aw;
    302 }
    303 
    304 void
    305 B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b,
    306  uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    307 {
    308  /*
    309  // prepare pointers
    310  buffer_a += offset_a;
    311  buffer_b += offset_b;
    312 
    313 
    314  usart.clearInputBuffer();
    315  usart.writeByte(RQ_ADC_DAC_STROKE);
    316  usart.writeByte(channel_a);
    317  usart.writeByte(channel_b);
    318  usart.writeInt(start);
    319  usart.writeInt(static_cast<uint16_t>(delta));
    320  usart.writeInt(count);
    321 
    322  for (uint16_t i = 0; i < count; i++) {
    323  if (buffer_a) {
    324  buffer_a[i] = usart.readInt();
    325 
    326  if (buffer_a[i] > 1023) // check for broken usart connection
    327  abort("Bad ADC data detected (2)");
    328  } else {
    329  usart.readInt();
    330  }
    331 
    332  if (buffer_b) {
    333  buffer_b[i] = usart.readInt();
    334 
    335  if (buffer_b[i] > 1023) // check for broken usart connection
    336  abort("Bad ADC data detected (3)");
    337  } else {
    338  usart.readInt();
    339  }
    340  }
    341 
    342  uint8_t aw = usart.readByte();
    343  if (aw != MSG_OK)
    344  abort("Sequenz unterbrochen");
    345 
    346  delay_us(10);*/
    347 }
    348 
    349 uint8_t B15F::pwmSetFrequency(uint32_t freq)
    350 {
    351  usart.clearInputBuffer();
    352 
    353  uint8_t rq[] =
    354  {
    355  RQ_PWM_SET_FREQ,
    356  static_cast<uint8_t>((freq >> 0) & 0xFF),
    357  static_cast<uint8_t>((freq >> 8) & 0xFF),
    358  static_cast<uint8_t>((freq >> 16) & 0xFF),
    359  static_cast<uint8_t>((freq >> 24) & 0xFF)
    360  };
    361 
    362  usart.transmit(&rq[0], 0, sizeof(rq));
    363 
    364  uint8_t aw;
    365  usart.receive(&aw, 0, sizeof(aw));
    366  return aw;
    367 }
    368 
    369 bool B15F::pwmSetValue(uint8_t value)
    370 {
    371  usart.clearInputBuffer();
    372 
    373  uint8_t rq[] =
    374  {
    375  RQ_PWM_SET_VALUE,
    376  value
    377  };
    378 
    379  usart.transmit(&rq[0], 0, sizeof(rq));
    380 
    381  uint8_t aw;
    382  usart.receive(&aw, 0, sizeof(aw));
    383  return aw == MSG_OK;
    384 }
    385 
    386 bool B15F::setRegister(uint8_t adr, uint8_t val)
    387 {
    388  usart.clearInputBuffer();
    389 
    390  uint8_t rq[] =
    391  {
    392  RQ_SET_REG,
    393  adr,
    394  val
    395  };
    396 
    397  usart.transmit(&rq[0], 0, sizeof(rq));
    398 
    399  uint8_t aw;
    400  usart.receive(&aw, 0, sizeof(aw));
    401  return aw == val;
    402 }
    403 
    404 uint8_t B15F::getRegister(uint8_t adr)
    405 {
    406  usart.clearInputBuffer();
    407 
    408  uint8_t rq[] =
    409  {
    410  RQ_GET_REG,
    411  adr
    412  };
    413 
    414  usart.transmit(&rq[0], 0, sizeof(rq));
    415 
    416  uint8_t aw;
    417  usart.receive(&aw, 0, sizeof(aw));
    418  return aw;
    419 }
    420 
    421 
    422 void B15F::delay_ms(uint16_t ms)
    423 {
    424  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    425 }
    426 
    427 void B15F::delay_us(uint16_t us)
    428 {
    429  std::this_thread::sleep_for(std::chrono::microseconds(us));
    430 }
    431 
    433 {
    434  if (!instance)
    435  instance = new B15F();
    436 
    437  return *instance;
    438 }
    439 
    440 // https://stackoverflow.com/a/478960
    441 std::string B15F::exec(std::string cmd)
    442 {
    443  std::array<char, 128> buffer;
    444  std::string result;
    445  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    446  if (!pipe)
    447  {
    448  throw std::runtime_error("popen() failed!");
    449  }
    450  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    451  {
    452  result += buffer.data();
    453  }
    454  return result;
    455 }
    456 
    457 void B15F::abort(std::string msg)
    458 {
    459  DriverException ex(msg);
    460  abort(ex);
    461 }
    462 
    463 void B15F::abort(std::exception &ex)
    464 {
    465  if (errorhandler)
    466  errorhandler(ex);
    467  else
    468  {
    469  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    470  std::cout << ex.what() << std::endl;
    471  throw DriverException(ex.what());
    472  }
    473 }
    474 
    475 void B15F::setAbortHandler(errorhandler_t func)
    476 {
    477  errorhandler = func;
    478 }
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:441
    +
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:404
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:427
    +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:210
    +
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:349
    +
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:305
    bool testConnection(void)
    Definition: b15f.cpp:95
    -
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:236
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:420
    -
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:384
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:430
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:238
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:422
    +
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:386
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:432
    Definition: b15f.h:26
    -
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:78
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:455
    -
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:70
    -
    void clearInputBuffer(void)
    Definition: usart.cpp:49
    -
    void clearOutputBuffer(void)
    Definition: usart.cpp:56
    -
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:280
    -
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:180
    +
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:95
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:457
    +
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:75
    +
    void clearInputBuffer(void)
    Definition: usart.cpp:54
    +
    void clearOutputBuffer(void)
    Definition: usart.cpp:61
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:282
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:182
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:231
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:96
    -
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:167
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:114
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:169
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:134
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:234
    -
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:265
    -
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:194
    -
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:367
    +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:267
    +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:196
    +
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:369
    void discard(void)
    Definition: b15f.cpp:72
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:232
    -
    void openDevice(std::string device)
    Definition: usart.cpp:8
    -
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:222
    +
    void openDevice(std::string device)
    Definition: usart.cpp:9
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:224
    void reconnect(void)
    Definition: b15f.cpp:57
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:237
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:473
    -
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:250
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:475
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:252
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:236
    bool testIntConv(void)
    Definition: b15f.cpp:114
    diff --git a/docs/html/b15f_8h_source.html b/docs/html/b15f_8h_source.html index e07ff44..b307294 100644 --- a/docs/html/b15f_8h_source.html +++ b/docs/html/b15f_8h_source.html @@ -71,43 +71,43 @@ $(function() {
    1 #ifndef B15F_H
    2 #define B15F_H
    3 
    4 #include <iostream>
    5 #include <bits/stdc++.h>
    6 #include <string>
    7 #include <fstream>
    8 #include <cstdlib>
    9 #include <chrono>
    10 #include <cstdint>
    11 #include <vector>
    12 
    13 #include <unistd.h>
    14 #include <fcntl.h>
    15 #include <sys/ioctl.h>
    16 #include <termios.h>
    17 #include "usart.h"
    18 #include "driverexception.h"
    19 #include "timeoutexception.h"
    20 
    21 typedef std::function<void(std::exception&)> errorhandler_t;
    22 
    23 
    26 class B15F
    27 {
    28 private:
    29  // privater Konstruktor
    30  B15F(void);
    31 public:
    32 
    33  /*************************************
    34  * Grundfunktionen des B15F Treibers *
    35  *************************************/
    36 
    41  void reconnect(void);
    42 
    47  void discard(void);
    48 
    53  bool testConnection(void);
    54 
    59  bool testIntConv(void);
    60 
    65  std::vector<std::string> getBoardInfo(void);
    66 
    71  void delay_ms(uint16_t ms);
    72 
    77  void delay_us(uint16_t us);
    78 
    83  static B15F& getInstance(void);
    84 
    89  static std::string exec(std::string cmd);
    90 
    95  static void abort(std::string msg);
    96 
    101  static void abort(std::exception& ex);
    102 
    107  static void setAbortHandler(errorhandler_t func);
    108 
    109  /*************************************/
    110 
    111 
    112 
    113  /*************************
    114  * Steuerbefehle für B15 *
    115  *************************/
    116 
    122  bool activateSelfTestMode(void);
    123 
    129  bool digitalWrite0(uint8_t);
    130 
    136  bool digitalWrite1(uint8_t);
    137 
    143  uint8_t digitalRead0(void);
    144 
    150  uint8_t digitalRead1(void);
    151 
    157  uint8_t readDipSwitch(void);
    158 
    164  bool analogWrite0(uint16_t port);
    165 
    171  bool analogWrite1(uint16_t port);
    172 
    178  uint16_t analogRead(uint8_t channel);
    179 
    195  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
    196 
    204  uint8_t pwmSetFrequency(uint32_t freq);
    205 
    211  bool pwmSetValue(uint8_t value);
    212 
    220  bool setRegister(uint8_t adr, uint8_t val);
    221 
    227  uint8_t getRegister(uint8_t adr);
    228 
    229  /*************************/
    230 
    231 
    232  // CONSTANTS
    233  const std::string PRE = "[B15F] ";
    234  constexpr static uint8_t MSG_OK = 0xFF;
    235  constexpr static uint8_t MSG_FAIL = 0xFE;
    236  constexpr static uint16_t RECONNECT_TIMEOUT = 64;
    237  constexpr static uint16_t WDT_TIMEOUT = 15;
    238  constexpr static uint8_t RECONNECT_TRIES = 3;
    239  constexpr static uint32_t BAUDRATE = 57600;
    240 
    241 private:
    242 
    247  void init(void);
    248 
    249  USART usart;
    250  static B15F* instance;
    251  static errorhandler_t errorhandler;
    252 
    253  // REQUESTS
    254  constexpr static uint8_t RQ_DISC = 0;
    255  constexpr static uint8_t RQ_TEST = 1;
    256  constexpr static uint8_t RQ_INFO = 2;
    257  constexpr static uint8_t RQ_INT = 3;
    258  constexpr static uint8_t RQ_ST = 4;
    259  constexpr static uint8_t RQ_BA0 = 5;
    260  constexpr static uint8_t RQ_BA1 = 6;
    261  constexpr static uint8_t RQ_BE0 = 7;
    262  constexpr static uint8_t RQ_BE1 = 8;
    263  constexpr static uint8_t RQ_DSW = 9;
    264  constexpr static uint8_t RQ_AA0 = 10;
    265  constexpr static uint8_t RQ_AA1 = 11;
    266  constexpr static uint8_t RQ_ADC = 12;
    267  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
    268  constexpr static uint8_t RQ_PWM_SET_FREQ = 14;
    269  constexpr static uint8_t RQ_PWM_SET_VALUE = 15;
    270  constexpr static uint8_t RQ_SET_REG = 16;
    271  constexpr static uint8_t RQ_GET_REG = 17;
    272 };
    273 
    274 #endif // B15F_H
    -
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:439
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:441
    constexpr static uint8_t MSG_FAIL
    Value to reject a received command.
    Definition: b15f.h:233
    -
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:402
    -
    void delay_us(uint16_t us)
    Definition: b15f.cpp:425
    -
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:208
    -
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:347
    -
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:303
    +
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:404
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:427
    +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:210
    +
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:349
    +
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:305
    bool testConnection(void)
    Definition: b15f.cpp:95
    -
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:236
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:420
    -
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:384
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:430
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:238
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:422
    +
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:386
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:432
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:455
    -
    Definition: usart.h:13
    -
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:280
    -
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:180
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:457
    +
    Definition: usart.h:15
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:282
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:182
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:231
    -
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:167
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:169
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:134
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:234
    -
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:265
    -
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:194
    -
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:367
    +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:267
    +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:196
    +
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:369
    void discard(void)
    Definition: b15f.cpp:72
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:232
    -
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:222
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:224
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:235
    void reconnect(void)
    Definition: b15f.cpp:57
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:237
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:473
    -
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:250
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:475
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:252
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:236
    bool testIntConv(void)
    Definition: b15f.cpp:114
    diff --git a/docs/html/backup_8cpp_source.html b/docs/html/backup_8cpp_source.html index c5c60b4..80a5be1 100644 --- a/docs/html/backup_8cpp_source.html +++ b/docs/html/backup_8cpp_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/classB15F-members.html b/docs/html/classB15F-members.html index 4d727c9..490e7b1 100644 --- a/docs/html/classB15F-members.html +++ b/docs/html/classB15F-members.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/classB15F.html b/docs/html/classB15F.html index f5da455..fbb454d 100644 --- a/docs/html/classB15F.html +++ b/docs/html/classB15F.html @@ -202,7 +202,7 @@ constexpr static uint32_t  -

    Definition at line 461 of file b15f.cpp.

    +

    Definition at line 463 of file b15f.cpp.

    @@ -236,7 +236,7 @@ constexpr static uint32_t  -

    Definition at line 455 of file b15f.cpp.

    +

    Definition at line 457 of file b15f.cpp.

    @@ -262,7 +262,7 @@ constexpr static uint32_t  -

    Definition at line 167 of file b15f.cpp.

    +

    Definition at line 169 of file b15f.cpp.

    @@ -294,7 +294,7 @@ constexpr static uint32_t  -

    Definition at line 280 of file b15f.cpp.

    +

    Definition at line 282 of file b15f.cpp.

    @@ -386,7 +386,7 @@ constexpr static uint32_t  -

    Definition at line 303 of file b15f.cpp.

    +

    Definition at line 305 of file b15f.cpp.

    @@ -418,7 +418,7 @@ constexpr static uint32_t  -

    Definition at line 250 of file b15f.cpp.

    +

    Definition at line 252 of file b15f.cpp.

    @@ -450,7 +450,7 @@ constexpr static uint32_t  -

    Definition at line 265 of file b15f.cpp.

    +

    Definition at line 267 of file b15f.cpp.

    @@ -476,7 +476,7 @@ constexpr static uint32_t  -

    Definition at line 420 of file b15f.cpp.

    +

    Definition at line 422 of file b15f.cpp.

    @@ -502,7 +502,7 @@ constexpr static uint32_t  -

    Definition at line 425 of file b15f.cpp.

    +

    Definition at line 427 of file b15f.cpp.

    @@ -529,7 +529,7 @@ constexpr static uint32_t  -

    Definition at line 208 of file b15f.cpp.

    +

    Definition at line 210 of file b15f.cpp.

    @@ -556,7 +556,7 @@ constexpr static uint32_t  -

    Definition at line 222 of file b15f.cpp.

    +

    Definition at line 224 of file b15f.cpp.

    @@ -588,7 +588,7 @@ constexpr static uint32_t  -

    Definition at line 180 of file b15f.cpp.

    +

    Definition at line 182 of file b15f.cpp.

    @@ -620,7 +620,7 @@ constexpr static uint32_t  -

    Definition at line 194 of file b15f.cpp.

    +

    Definition at line 196 of file b15f.cpp.

    @@ -680,7 +680,7 @@ constexpr static uint32_t  -

    Definition at line 439 of file b15f.cpp.

    +

    Definition at line 441 of file b15f.cpp.

    @@ -740,7 +740,7 @@ constexpr static uint32_t  -

    Definition at line 430 of file b15f.cpp.

    +

    Definition at line 432 of file b15f.cpp.

    @@ -772,7 +772,7 @@ constexpr static uint32_t  -

    Definition at line 402 of file b15f.cpp.

    +

    Definition at line 404 of file b15f.cpp.

    @@ -805,7 +805,7 @@ constexpr static uint32_t  -

    Definition at line 347 of file b15f.cpp.

    +

    Definition at line 349 of file b15f.cpp.

    @@ -837,7 +837,7 @@ constexpr static uint32_t  -

    Definition at line 367 of file b15f.cpp.

    +

    Definition at line 369 of file b15f.cpp.

    @@ -864,7 +864,7 @@ constexpr static uint32_t  -

    Definition at line 236 of file b15f.cpp.

    +

    Definition at line 238 of file b15f.cpp.

    @@ -924,7 +924,7 @@ constexpr static uint32_t  -

    Definition at line 473 of file b15f.cpp.

    +

    Definition at line 475 of file b15f.cpp.

    @@ -967,7 +967,7 @@ constexpr static uint32_t  -

    Definition at line 384 of file b15f.cpp.

    +

    Definition at line 386 of file b15f.cpp.

    @@ -1030,7 +1030,7 @@ constexpr static uint32_t  diff --git a/docs/html/classDot-members.html b/docs/html/classDot-members.html index 90e9a67..3820c71 100644 --- a/docs/html/classDot-members.html +++ b/docs/html/classDot-members.html @@ -76,7 +76,7 @@ $(function() { diff --git a/docs/html/classDot.html b/docs/html/classDot.html index afdbc85..267d5c3 100644 --- a/docs/html/classDot.html +++ b/docs/html/classDot.html @@ -196,7 +196,7 @@ Public Member Functions diff --git a/docs/html/classDriverException-members.html b/docs/html/classDriverException-members.html index c31fd7a..abf231a 100644 --- a/docs/html/classDriverException-members.html +++ b/docs/html/classDriverException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classDriverException.html b/docs/html/classDriverException.html index dbd0544..4154dda 100644 --- a/docs/html/classDriverException.html +++ b/docs/html/classDriverException.html @@ -109,7 +109,7 @@ std::string msg_< diff --git a/docs/html/classPlottyFile-members.html b/docs/html/classPlottyFile-members.html index 0f5e431..99e9e31 100644 --- a/docs/html/classPlottyFile-members.html +++ b/docs/html/classPlottyFile-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/docs/html/classPlottyFile.html b/docs/html/classPlottyFile.html index cb1c533..54b5090 100644 --- a/docs/html/classPlottyFile.html +++ b/docs/html/classPlottyFile.html @@ -811,7 +811,7 @@ Public Member Functions diff --git a/docs/html/classTimeoutException-members.html b/docs/html/classTimeoutException-members.html index 820b7b2..f3a4a78 100644 --- a/docs/html/classTimeoutException-members.html +++ b/docs/html/classTimeoutException-members.html @@ -78,7 +78,7 @@ $(function() { diff --git a/docs/html/classTimeoutException.html b/docs/html/classTimeoutException.html index 66d4503..15f6df0 100644 --- a/docs/html/classTimeoutException.html +++ b/docs/html/classTimeoutException.html @@ -112,7 +112,7 @@ int m_timeout diff --git a/docs/html/classUSART-members.html b/docs/html/classUSART-members.html index 8366260..8450cc1 100644 --- a/docs/html/classUSART-members.html +++ b/docs/html/classUSART-members.html @@ -85,7 +85,7 @@ $(function() { diff --git a/docs/html/classUSART.html b/docs/html/classUSART.html index 4eb8a95..60ef1ed 100644 --- a/docs/html/classUSART.html +++ b/docs/html/classUSART.html @@ -104,7 +104,7 @@ Public Member Functions

    Detailed Description

    C++ Wrapper class for termios usart library.

    -

    Definition at line 13 of file usart.h.

    +

    Definition at line 15 of file usart.h.

    Constructor & Destructor Documentation

    ◆ USART()

    @@ -157,7 +157,7 @@ Public Member Functions

    Destructor, ruft automatisch closeDevice() auf

    -

    Definition at line 3 of file usart.cpp.

    +

    Definition at line 4 of file usart.cpp.

    @@ -184,7 +184,7 @@ Public Member Functions -

    Definition at line 49 of file usart.cpp.

    +

    Definition at line 54 of file usart.cpp.

    @@ -210,7 +210,7 @@ Public Member Functions -

    Definition at line 56 of file usart.cpp.

    +

    Definition at line 61 of file usart.cpp.

    @@ -236,7 +236,7 @@ Public Member Functions -

    Definition at line 38 of file usart.cpp.

    +

    Definition at line 43 of file usart.cpp.

    @@ -262,7 +262,7 @@ Public Member Functions -

    Definition at line 63 of file usart.cpp.

    +

    Definition at line 68 of file usart.cpp.

    @@ -283,7 +283,7 @@ Public Member Functions

    Liefert die eingestellte Baudrate Änderungen werden erst nach einem open() wirksam

    -

    Definition at line 86 of file usart.cpp.

    +

    Definition at line 104 of file usart.cpp.

    @@ -304,7 +304,7 @@ Public Member Functions

    Liefert den eingestellten Timeout (in Dezisekunden) Änderungen werden erst nach einem open() wirksam

    -

    Definition at line 91 of file usart.cpp.

    +

    Definition at line 109 of file usart.cpp.

    @@ -336,7 +336,7 @@ Public Member Functions -

    Definition at line 8 of file usart.cpp.

    +

    Definition at line 9 of file usart.cpp.

    @@ -386,7 +386,7 @@ Public Member Functions -

    Definition at line 70 of file usart.cpp.

    +

    Definition at line 75 of file usart.cpp.

    @@ -407,7 +407,7 @@ Public Member Functions

    Setzt die Baudrate Änderungen werden erst nach openDevice() wirksam

    -

    Definition at line 96 of file usart.cpp.

    +

    Definition at line 114 of file usart.cpp.

    @@ -428,7 +428,7 @@ Public Member Functions

    Setzt den Timeout (in Dezisekunden) Änderungen werden erst nach openDevice() wirksam

    -

    Definition at line 101 of file usart.cpp.

    +

    Definition at line 119 of file usart.cpp.

    @@ -478,7 +478,7 @@ Public Member Functions -

    Definition at line 78 of file usart.cpp.

    +

    Definition at line 95 of file usart.cpp.

    @@ -489,7 +489,7 @@ Public Member Functions diff --git a/docs/html/classUSARTException-members.html b/docs/html/classUSARTException-members.html index 72be017..6a4a596 100644 --- a/docs/html/classUSARTException-members.html +++ b/docs/html/classUSARTException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classUSARTException.html b/docs/html/classUSARTException.html index 3f7d649..2f3808a 100644 --- a/docs/html/classUSARTException.html +++ b/docs/html/classUSARTException.html @@ -239,7 +239,7 @@ std::string  diff --git a/docs/html/classView-members.html b/docs/html/classView-members.html index fc7095a..a3c83d2 100644 --- a/docs/html/classView-members.html +++ b/docs/html/classView-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/docs/html/classView.html b/docs/html/classView.html index bd00dda..09a1a4e 100644 --- a/docs/html/classView.html +++ b/docs/html/classView.html @@ -157,7 +157,7 @@ constexpr static int KEY_E diff --git a/docs/html/classViewInfo-members.html b/docs/html/classViewInfo-members.html index 73d04e5..bbe968c 100644 --- a/docs/html/classViewInfo-members.html +++ b/docs/html/classViewInfo-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/docs/html/classViewInfo.html b/docs/html/classViewInfo.html index 79587c4..6832ee2 100644 --- a/docs/html/classViewInfo.html +++ b/docs/html/classViewInfo.html @@ -185,7 +185,7 @@ static std::vector< std::string >  diff --git a/docs/html/classViewMonitor-members.html b/docs/html/classViewMonitor-members.html index 60da14d..516ac80 100644 --- a/docs/html/classViewMonitor-members.html +++ b/docs/html/classViewMonitor-members.html @@ -103,7 +103,7 @@ $(function() { diff --git a/docs/html/classViewMonitor.html b/docs/html/classViewMonitor.html index 4915a9b..886320b 100644 --- a/docs/html/classViewMonitor.html +++ b/docs/html/classViewMonitor.html @@ -197,7 +197,7 @@ constexpr static int KEY_E diff --git a/docs/html/classViewPromt-members.html b/docs/html/classViewPromt-members.html index 70dad1e..cac3125 100644 --- a/docs/html/classViewPromt-members.html +++ b/docs/html/classViewPromt-members.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/classViewPromt.html b/docs/html/classViewPromt.html index a74c7ff..2133932 100644 --- a/docs/html/classViewPromt.html +++ b/docs/html/classViewPromt.html @@ -205,7 +205,7 @@ static std::vector< std::string >  diff --git a/docs/html/classViewSelection-members.html b/docs/html/classViewSelection-members.html index b76a262..6e4c446 100644 --- a/docs/html/classViewSelection-members.html +++ b/docs/html/classViewSelection-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/docs/html/classViewSelection.html b/docs/html/classViewSelection.html index 9f4a292..65f267e 100644 --- a/docs/html/classViewSelection.html +++ b/docs/html/classViewSelection.html @@ -172,7 +172,7 @@ static std::vector< std::string >  diff --git a/docs/html/classes.html b/docs/html/classes.html index 5da6c23..446270b 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/cli_8cpp_source.html b/docs/html/cli_8cpp_source.html index c8a025e..525431d 100644 --- a/docs/html/cli_8cpp_source.html +++ b/docs/html/cli_8cpp_source.html @@ -68,11 +68,11 @@ $(function() {
    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
    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 }
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:430
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:473
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:432
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:475
    diff --git a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html index a908015..56c8278 100644 --- a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html +++ b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html b/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html index 24fcf59..3bc1fd3 100644 --- a/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html +++ b/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html b/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html index 5939e6f..0cced8a 100644 --- a/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html +++ b/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html @@ -77,7 +77,7 @@ Directories diff --git a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html index 7af269d..8fdcc74 100644 --- a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html +++ b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html b/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html index 38d6b31..44a759b 100644 --- a/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html +++ b/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html b/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html index 8c90198..b8dd610 100644 --- a/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html +++ b/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html @@ -77,7 +77,7 @@ Directories diff --git a/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html b/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html index aa7bba6..a5c7337 100644 --- a/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html +++ b/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dot_8cpp_source.html b/docs/html/dot_8cpp_source.html index 914f15a..8843565 100644 --- a/docs/html/dot_8cpp_source.html +++ b/docs/html/dot_8cpp_source.html @@ -77,7 +77,7 @@ $(function() {
    Dot(uint16_t x, uint16_t y, uint8_t curve)
    Definition: dot.cpp:3
    diff --git a/docs/html/dot_8h_source.html b/docs/html/dot_8h_source.html index 78c98a1..495eaf2 100644 --- a/docs/html/dot_8h_source.html +++ b/docs/html/dot_8h_source.html @@ -78,7 +78,7 @@ $(function() {
    Dot(uint16_t x, uint16_t y, uint8_t curve)
    Definition: dot.cpp:3
    diff --git a/docs/html/driverexception_8h_source.html b/docs/html/driverexception_8h_source.html index 4f01106..70cb66c 100644 --- a/docs/html/driverexception_8h_source.html +++ b/docs/html/driverexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/feature__tests_8c_source.html b/docs/html/feature__tests_8c_source.html index c666e6f..6782373 100644 --- a/docs/html/feature__tests_8c_source.html +++ b/docs/html/feature__tests_8c_source.html @@ -73,7 +73,7 @@ $(function() {
    1 
    2 const char features[] = {"\n"
    3  "C_FEATURE:"
    4 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304
    5  "1"
    6 #else
    7  "0"
    8 #endif
    9  "c_function_prototypes\n"
    10  "C_FEATURE:"
    11 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    12  "1"
    13 #else
    14  "0"
    15 #endif
    16  "c_restrict\n"
    17  "C_FEATURE:"
    18 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L
    19  "1"
    20 #else
    21  "0"
    22 #endif
    23  "c_static_assert\n"
    24  "C_FEATURE:"
    25 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    26  "1"
    27 #else
    28  "0"
    29 #endif
    30  "c_variadic_macros\n"
    31 
    32  };
    33 
    34 int main(int argc, char** argv)
    35 {
    36  (void)argv;
    37  return features[argc];
    38 }
    diff --git a/docs/html/feature__tests_8cxx_source.html b/docs/html/feature__tests_8cxx_source.html index aed34e6..260cda3 100644 --- a/docs/html/feature__tests_8cxx_source.html +++ b/docs/html/feature__tests_8cxx_source.html @@ -73,7 +73,7 @@ $(function() {
    1 
    2  const char features[] = {"\n"
    3 "CXX_FEATURE:"
    4 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
    5 "1"
    6 #else
    7 "0"
    8 #endif
    9 "cxx_aggregate_default_initializers\n"
    10 "CXX_FEATURE:"
    11 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    12 "1"
    13 #else
    14 "0"
    15 #endif
    16 "cxx_alias_templates\n"
    17 "CXX_FEATURE:"
    18 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    19 "1"
    20 #else
    21 "0"
    22 #endif
    23 "cxx_alignas\n"
    24 "CXX_FEATURE:"
    25 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    26 "1"
    27 #else
    28 "0"
    29 #endif
    30 "cxx_alignof\n"
    31 "CXX_FEATURE:"
    32 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    33 "1"
    34 #else
    35 "0"
    36 #endif
    37 "cxx_attributes\n"
    38 "CXX_FEATURE:"
    39 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    40 "1"
    41 #else
    42 "0"
    43 #endif
    44 "cxx_attribute_deprecated\n"
    45 "CXX_FEATURE:"
    46 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    47 "1"
    48 #else
    49 "0"
    50 #endif
    51 "cxx_auto_type\n"
    52 "CXX_FEATURE:"
    53 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    54 "1"
    55 #else
    56 "0"
    57 #endif
    58 "cxx_binary_literals\n"
    59 "CXX_FEATURE:"
    60 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    61 "1"
    62 #else
    63 "0"
    64 #endif
    65 "cxx_constexpr\n"
    66 "CXX_FEATURE:"
    67 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    68 "1"
    69 #else
    70 "0"
    71 #endif
    72 "cxx_contextual_conversions\n"
    73 "CXX_FEATURE:"
    74 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    75 "1"
    76 #else
    77 "0"
    78 #endif
    79 "cxx_decltype\n"
    80 "CXX_FEATURE:"
    81 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    82 "1"
    83 #else
    84 "0"
    85 #endif
    86 "cxx_decltype_auto\n"
    87 "CXX_FEATURE:"
    88 #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L
    89 "1"
    90 #else
    91 "0"
    92 #endif
    93 "cxx_decltype_incomplete_return_types\n"
    94 "CXX_FEATURE:"
    95 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    96 "1"
    97 #else
    98 "0"
    99 #endif
    100 "cxx_default_function_template_args\n"
    101 "CXX_FEATURE:"
    102 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    103 "1"
    104 #else
    105 "0"
    106 #endif
    107 "cxx_defaulted_functions\n"
    108 "CXX_FEATURE:"
    109 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    110 "1"
    111 #else
    112 "0"
    113 #endif
    114 "cxx_defaulted_move_initializers\n"
    115 "CXX_FEATURE:"
    116 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    117 "1"
    118 #else
    119 "0"
    120 #endif
    121 "cxx_delegating_constructors\n"
    122 "CXX_FEATURE:"
    123 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    124 "1"
    125 #else
    126 "0"
    127 #endif
    128 "cxx_deleted_functions\n"
    129 "CXX_FEATURE:"
    130 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    131 "1"
    132 #else
    133 "0"
    134 #endif
    135 "cxx_digit_separators\n"
    136 "CXX_FEATURE:"
    137 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    138 "1"
    139 #else
    140 "0"
    141 #endif
    142 "cxx_enum_forward_declarations\n"
    143 "CXX_FEATURE:"
    144 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    145 "1"
    146 #else
    147 "0"
    148 #endif
    149 "cxx_explicit_conversions\n"
    150 "CXX_FEATURE:"
    151 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    152 "1"
    153 #else
    154 "0"
    155 #endif
    156 "cxx_extended_friend_declarations\n"
    157 "CXX_FEATURE:"
    158 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    159 "1"
    160 #else
    161 "0"
    162 #endif
    163 "cxx_extern_templates\n"
    164 "CXX_FEATURE:"
    165 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    166 "1"
    167 #else
    168 "0"
    169 #endif
    170 "cxx_final\n"
    171 "CXX_FEATURE:"
    172 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    173 "1"
    174 #else
    175 "0"
    176 #endif
    177 "cxx_func_identifier\n"
    178 "CXX_FEATURE:"
    179 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    180 "1"
    181 #else
    182 "0"
    183 #endif
    184 "cxx_generalized_initializers\n"
    185 "CXX_FEATURE:"
    186 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    187 "1"
    188 #else
    189 "0"
    190 #endif
    191 "cxx_generic_lambdas\n"
    192 "CXX_FEATURE:"
    193 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    194 "1"
    195 #else
    196 "0"
    197 #endif
    198 "cxx_inheriting_constructors\n"
    199 "CXX_FEATURE:"
    200 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    201 "1"
    202 #else
    203 "0"
    204 #endif
    205 "cxx_inline_namespaces\n"
    206 "CXX_FEATURE:"
    207 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    208 "1"
    209 #else
    210 "0"
    211 #endif
    212 "cxx_lambdas\n"
    213 "CXX_FEATURE:"
    214 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    215 "1"
    216 #else
    217 "0"
    218 #endif
    219 "cxx_lambda_init_captures\n"
    220 "CXX_FEATURE:"
    221 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    222 "1"
    223 #else
    224 "0"
    225 #endif
    226 "cxx_local_type_template_args\n"
    227 "CXX_FEATURE:"
    228 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    229 "1"
    230 #else
    231 "0"
    232 #endif
    233 "cxx_long_long_type\n"
    234 "CXX_FEATURE:"
    235 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    236 "1"
    237 #else
    238 "0"
    239 #endif
    240 "cxx_noexcept\n"
    241 "CXX_FEATURE:"
    242 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    243 "1"
    244 #else
    245 "0"
    246 #endif
    247 "cxx_nonstatic_member_init\n"
    248 "CXX_FEATURE:"
    249 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    250 "1"
    251 #else
    252 "0"
    253 #endif
    254 "cxx_nullptr\n"
    255 "CXX_FEATURE:"
    256 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    257 "1"
    258 #else
    259 "0"
    260 #endif
    261 "cxx_override\n"
    262 "CXX_FEATURE:"
    263 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    264 "1"
    265 #else
    266 "0"
    267 #endif
    268 "cxx_range_for\n"
    269 "CXX_FEATURE:"
    270 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    271 "1"
    272 #else
    273 "0"
    274 #endif
    275 "cxx_raw_string_literals\n"
    276 "CXX_FEATURE:"
    277 #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L
    278 "1"
    279 #else
    280 "0"
    281 #endif
    282 "cxx_reference_qualified_functions\n"
    283 "CXX_FEATURE:"
    284 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
    285 "1"
    286 #else
    287 "0"
    288 #endif
    289 "cxx_relaxed_constexpr\n"
    290 "CXX_FEATURE:"
    291 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
    292 "1"
    293 #else
    294 "0"
    295 #endif
    296 "cxx_return_type_deduction\n"
    297 "CXX_FEATURE:"
    298 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    299 "1"
    300 #else
    301 "0"
    302 #endif
    303 "cxx_right_angle_brackets\n"
    304 "CXX_FEATURE:"
    305 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    306 "1"
    307 #else
    308 "0"
    309 #endif
    310 "cxx_rvalue_references\n"
    311 "CXX_FEATURE:"
    312 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    313 "1"
    314 #else
    315 "0"
    316 #endif
    317 "cxx_sizeof_member\n"
    318 "CXX_FEATURE:"
    319 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    320 "1"
    321 #else
    322 "0"
    323 #endif
    324 "cxx_static_assert\n"
    325 "CXX_FEATURE:"
    326 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    327 "1"
    328 #else
    329 "0"
    330 #endif
    331 "cxx_strong_enums\n"
    332 "CXX_FEATURE:"
    333 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus
    334 "1"
    335 #else
    336 "0"
    337 #endif
    338 "cxx_template_template_parameters\n"
    339 "CXX_FEATURE:"
    340 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
    341 "1"
    342 #else
    343 "0"
    344 #endif
    345 "cxx_thread_local\n"
    346 "CXX_FEATURE:"
    347 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    348 "1"
    349 #else
    350 "0"
    351 #endif
    352 "cxx_trailing_return_types\n"
    353 "CXX_FEATURE:"
    354 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    355 "1"
    356 #else
    357 "0"
    358 #endif
    359 "cxx_unicode_literals\n"
    360 "CXX_FEATURE:"
    361 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    362 "1"
    363 #else
    364 "0"
    365 #endif
    366 "cxx_uniform_initialization\n"
    367 "CXX_FEATURE:"
    368 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    369 "1"
    370 #else
    371 "0"
    372 #endif
    373 "cxx_unrestricted_unions\n"
    374 "CXX_FEATURE:"
    375 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
    376 "1"
    377 #else
    378 "0"
    379 #endif
    380 "cxx_user_literals\n"
    381 "CXX_FEATURE:"
    382 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
    383 "1"
    384 #else
    385 "0"
    386 #endif
    387 "cxx_variable_templates\n"
    388 "CXX_FEATURE:"
    389 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    390 "1"
    391 #else
    392 "0"
    393 #endif
    394 "cxx_variadic_macros\n"
    395 "CXX_FEATURE:"
    396 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
    397 "1"
    398 #else
    399 "0"
    400 #endif
    401 "cxx_variadic_templates\n"
    402 
    403 };
    404 
    405 int main(int argc, char** argv) { (void)argv; return features[argc]; }
    diff --git a/docs/html/files.html b/docs/html/files.html index 2e1ad56..2907cef 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -109,7 +109,7 @@ $(function() { diff --git a/docs/html/functions.html b/docs/html/functions.html index 82ac130..1392eed 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -369,7 +369,7 @@ $(function() { diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html index 0cf3285..6ba4bdd 100644 --- a/docs/html/functions_func.html +++ b/docs/html/functions_func.html @@ -337,7 +337,7 @@ $(function() { diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index 69c203a..2d91bb7 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -91,7 +91,7 @@ $(function() { diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html index e30ebdb..f062b1e 100644 --- a/docs/html/hierarchy.html +++ b/docs/html/hierarchy.html @@ -86,7 +86,7 @@ $(function() { diff --git a/docs/html/index.html b/docs/html/index.html index 92a0872..3a701c1 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -5,7 +5,7 @@ -B15F: Einführung +B15F: B15F Benutzerhandbuch @@ -63,16 +63,81 @@ $(function() {
    -
    Einführung
    +
    B15F Benutzerhandbuch
    -

    Die wichtigste Klasse für die Steuerung des Board 15 ist B15F.
    -Dort befindet sich auch eine Übersicht der verfügbaren Befehle.

    +

    Hinweis: Terminal-Befehle sind fett gedruckt

    +

    +Installation

    +

    +1. Abhängigkeiten installieren

    +

    (a) sudo apt-get update
    + (b) sudo apt-get install git avr-libc avrdude libncurses5-dev g++
    +

    +

    +2. Das Repository klonen

    +

    (a) cd /tmp
    + (b) git clone "https://github.com/devfix/b15f.git"
    +

    +

    +3. Die Firmware installieren

    +

    (a) cd "/tmp/b15f/firmware"
    + (b) Passen Sie in der Datei Makefile die Option "MCU = ..." an die MCU des vorliegenden Boards an
    + (atmega1284 und atmega1284p sind nicht identisch!)
    + (c) make
    + Wenn udev richtig konfiguriert wurde:
    + (d I) make upload
    + Sonst:
    + (d II) sudo make upload
    +

    +

    +4. Die Steuersoftware (Bibliothek & CLI) installieren

    +

    (a) cd "/tmp/b15f/control/src"
    + (b) make
    + (Die Warnungen durch doxygen können ignoriert werden.)

    +

    (c) sudo make install
    +

    +

    +Das CommandLineInterface (CLI) benutzen

    +

    (a) Öffnen Sie ein Terminal und maximieren Sie das Fenster
    + (b) Start des CLI erfolgt durch b15fcli
    + (c) Die Navigation erolgt durch <Tab>, die Pfeiltasten und <Enter> oder die Maus
    + (d) Mit <Strg + c> kann das Programm sofort verlassen werden

    +

    +Eigene Programme mit B15F schreiben

    +

    +Grundsätzliches

    +

    Die wichtigste Klasse für die Steuerung des Board 15 ist B15F.
    +Dort befindet sich auch eine Übersicht der verfügbaren Befehle.
    +

    +

    +Beispiele

    +

    In dem Verzeichnis b15f/control/examples sind einige Beispiele für die Verwendung einzelner B15F Funktionen.
    +Zu jedem Beispiel gehört eine main.cpp mit dem Quellcode und eine Makefile-Datei.
    +Das Beispiel kann mit make kompiliert und mit **./main.elf** gestartet werden.

    +

    +Den B15F Treiber verwenden

    +

    Benötigt wird der B15F-Header:
    +#include <b15f/b15f.h>
    +und der Header für die plottyfile-Generierung, falls mit Kennlinien gearbeitet werden soll:
    +#include <b15f/plottyfile.h>

    +

    Für die Interaktion wird eine Referenz auf die aktuelle Treiberinstanz gespeichert:
    +B15F& drv = B15F::getInstance();
    +Falls noch keine existiert, wird automatisch eine erzeugt und Verbindung zum Board hergestellt.
    + Ab jetzt können auf dem Object drv verschiedene Methoden angewand werden, siehe B15F.
    +

    +

    +Kennlinien mit plottyfile generieren

    +

    Die Beschreibung zu Plottyfile befindet sich hier.
    +Nach dem Include von plottyfile kann ein neues Objekt erzeugt und konfiguriert werden:
    +

    {C++}
    PlottyFile pf;
    pf.setUnitX("V");
    pf.setUnitY("V");
    pf.setUnitPara("V");
    pf.setDescX("U_{OUT}");
    pf.setDescY("U_{IN}");
    pf.setDescPara("");
    pf.setRefX(5);
    pf.setRefY(5);
    pf.setParaFirstCurve(0);
    pf.setParaStepWidth(0);

    Messpunkte können anschließend hinzugefügt werden.
    +Dabei gehören Punkte mit dem gleichen Index für curve (uint8_t) zur selben Kurve und erhalten durch Plotty automatisch die gleiche Farbe.
    +

    {C++}
    pf.addDot(Dot(x, y, curve));

    x und y sind uint16_t, also keine Gleitkommazahlen.

    diff --git a/docs/html/plottyfile_8cpp_source.html b/docs/html/plottyfile_8cpp_source.html index f354875..845e297 100644 --- a/docs/html/plottyfile_8cpp_source.html +++ b/docs/html/plottyfile_8cpp_source.html @@ -101,7 +101,7 @@ $(function() {
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    diff --git a/docs/html/plottyfile_8h_source.html b/docs/html/plottyfile_8h_source.html index d015346..de56b4f 100644 --- a/docs/html/plottyfile_8h_source.html +++ b/docs/html/plottyfile_8h_source.html @@ -102,7 +102,7 @@ $(function() {
    std::string getUnitX(void) const
    Definition: plottyfile.cpp:105
    diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js index 4a50fd7..5156238 100644 --- a/docs/html/search/all_1.js +++ b/docs/html/search/all_1.js @@ -1,5 +1,6 @@ var searchData= [ ['b15f',['B15F',['../classB15F.html',1,'']]], - ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]] + ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]], + ['b15f_20benutzerhandbuch',['B15F Benutzerhandbuch',['../index.html',1,'']]] ]; diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js index 4acd298..fb3f662 100644 --- a/docs/html/search/all_4.js +++ b/docs/html/search/all_4.js @@ -1,5 +1,4 @@ var searchData= [ - ['exec',['exec',['../classB15F.html#a1a7ac52984ed7ecac008a3e4060eee3a',1,'B15F']]], - ['einführung',['Einführung',['../index.html',1,'']]] + ['exec',['exec',['../classB15F.html#a1a7ac52984ed7ecac008a3e4060eee3a',1,'B15F']]] ]; diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js index abe03ca..31be983 100644 --- a/docs/html/search/pages_0.js +++ b/docs/html/search/pages_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['einführung',['Einführung',['../index.html',1,'']]] + ['b15f_20benutzerhandbuch',['B15F Benutzerhandbuch',['../index.html',1,'']]] ]; diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js index c2c426a..9ff7555 100644 --- a/docs/html/search/searchdata.js +++ b/docs/html/search/searchdata.js @@ -4,7 +4,7 @@ var indexSectionsWithContent = 1: "bdptuv", 2: "acdefgoprstuw~", 3: "bmprw", - 4: "e" + 4: "b" }; var indexSectionNames = diff --git a/docs/html/timeoutexception_8h_source.html b/docs/html/timeoutexception_8h_source.html index 5aac1f4..93a32f7 100644 --- a/docs/html/timeoutexception_8h_source.html +++ b/docs/html/timeoutexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/ui_8cpp_source.html b/docs/html/ui_8cpp_source.html index f460c1a..ce9aac2 100644 --- a/docs/html/ui_8cpp_source.html +++ b/docs/html/ui_8cpp_source.html @@ -73,22 +73,22 @@ $(function() {
    1 #include "ui.h"
    2 #include "../drv/b15f.h"
    3 
    4 std::vector<View*> win_stack;
    5 std::thread t_refresh;
    6 
    7 void show_main(int)
    8 {
    9  ViewSelection* view = new ViewSelection();
    10  view->setTitle("B15F - Command Line Interface");
    11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
    12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
    13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
    14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
    15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
    16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
    17  view->addChoice("[ Informationen ]", &show_info);
    18  view->addChoice("", nullptr);
    19  view->addChoice("[ Beenden ]", &finish);
    20  view->repaint();
    21 
    22  win_stack.push_back(view);
    23  input(0);
    24 }
    25 
    26 void input(int)
    27 {
    28  call_t nextCall;
    29  int key;
    30  do
    31  {
    32  key = wgetch(View::getWinContext());
    33  win_stack.back()->repaint();
    34  nextCall = win_stack.back()->keypress(key);
    35 
    36  if(key == -1)
    37  view_back(key);
    38 
    39  if(nextCall)
    40  nextCall(key);
    41  }
    42  while(win_stack.size());
    43 }
    44 
    45 void view_back(int)
    46 {
    47  if(win_stack.size())
    48  {
    49  delete win_stack.back();
    50  win_stack.pop_back();
    51  }
    52  if(win_stack.size())
    53  win_stack.back()->repaint();
    54 }
    55 
    56 void finish(int)
    57 {
    58  cleanup();
    59  exit(EXIT_SUCCESS);
    60 }
    61 
    62 void cleanup()
    63 {
    64  if(t_refresh.joinable())
    65  t_refresh.join();
    66  clrtoeol();
    67  refresh();
    68  endwin();
    69 }
    70 
    71 void show_info(int)
    72 {
    73  ViewInfo* view = new ViewInfo();
    74  view->setTitle("Info");
    75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
    76  view->setLabelClose("[ Zurueck ]");
    77  view->repaint();
    78 
    79  win_stack.push_back(view);
    80  input(0);
    81 }
    82 
    83 void show_monitor(int)
    84 {
    85  ViewMonitor* view = new ViewMonitor();
    86  view->setTitle("Monitor");
    87  view->setText("\nErfasse Messwerte...");
    88  view->setLabelClose("[ Zurueck ]");
    89  view->repaint();
    90 
    91  win_stack.push_back(view);
    92  input(0);
    93 }
    94 
    95 void show_invalid_port_input(int)
    96 {
    97  ViewInfo* view = new ViewInfo();
    98  view->setTitle("Falsche Eingabe");
    99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
    100  view->setLabelClose("[ Schliessen ]");
    101  view->repaint();
    102 
    103  win_stack.push_back(view);
    104  input(0);
    105 }
    106 
    107 void show_invalid_dac_input(int)
    108 {
    109  ViewInfo* view = new ViewInfo();
    110  view->setTitle("Falsche Eingabe");
    111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
    112  view->setLabelClose("[ Schliessen ]");
    113  view->repaint();
    114 
    115  win_stack.push_back(view);
    116  input(0);
    117 }
    118 
    119 void write_digital_output0(int)
    120 {
    121  try
    122  {
    123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    124  if(d > 255 || 0 > d)
    125  throw std::invalid_argument("bad value");
    126  uint8_t port = static_cast<uint8_t>(d);
    127 
    128  B15F& drv = B15F::getInstance();
    129  drv.digitalWrite0(port);
    130  view_back(0);
    131  }
    132  catch(std::invalid_argument& ex)
    133  {
    134  show_invalid_port_input(0);
    135  }
    136 }
    137 
    138 void write_digital_output1(int)
    139 {
    140  try
    141  {
    142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
    143  if(d > 255 || 0 > d)
    144  throw std::invalid_argument("bad value");
    145  uint8_t port = static_cast<uint8_t>(d);
    146 
    147  B15F& drv = B15F::getInstance();
    148  drv.digitalWrite1(port);
    149  view_back(0);
    150  }
    151  catch(std::invalid_argument& ex)
    152  {
    153  show_invalid_port_input(0);
    154  }
    155 }
    156 
    157 void write_analog_output0(int)
    158 {
    159  try
    160  {
    161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    162  if(port > 1023)
    163  throw std::invalid_argument("bad value");
    164 
    165  B15F& drv = B15F::getInstance();
    166  drv.analogWrite0(port);
    167  view_back(0);
    168  }
    169  catch(std::invalid_argument& ex)
    170  {
    171  show_invalid_dac_input(0);
    172  }
    173 }
    174 
    175 void write_analog_output1(int)
    176 {
    177  try
    178  {
    179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
    180  if(port > 1023)
    181  throw std::invalid_argument("bad value");
    182 
    183  B15F& drv = B15F::getInstance();
    184  drv.analogWrite1(port);
    185  view_back(0);
    186  }
    187  catch(std::invalid_argument& ex)
    188  {
    189  show_invalid_dac_input(0);
    190  }
    191 }
    192 
    193 void show_digital_output0(int)
    194 {
    195  ViewPromt* view = new ViewPromt();
    196  view->setTitle("Digitale Ausgabe BE0");
    197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    198  view->setCancel("[ Zurueck ]", true);
    199  view->setConfirm("[ OK ]", &write_digital_output0);
    200  view->repaint();
    201 
    202  win_stack.push_back(view);
    203  input(0);
    204 }
    205 
    206 void show_digital_output1(int)
    207 {
    208  ViewPromt* view = new ViewPromt();
    209  view->setTitle("Digitale Ausgabe BE1");
    210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
    211  view->setCancel("[ Zurueck ]", true);
    212  view->setConfirm("[ OK ]", &write_digital_output1);
    213  view->repaint();
    214 
    215  win_stack.push_back(view);
    216  input(0);
    217 }
    218 
    219 void show_analog_output0(int)
    220 {
    221  ViewPromt* view = new ViewPromt();
    222  view->setTitle("Analoge Ausgabe AA0");
    223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    224  view->setCancel("[ Zurueck ]", true);
    225  view->setConfirm("[ OK ]", &write_analog_output0);
    226  view->repaint();
    227 
    228  win_stack.push_back(view);
    229  input(0);
    230 }
    231 
    232 void show_analog_output1(int)
    233 {
    234  ViewPromt* view = new ViewPromt();
    235  view->setTitle("Analoge Ausgabe AA1");
    236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
    237  view->setCancel("[ Zurueck ]", true);
    238  view->setConfirm("[ OK ]", &write_analog_output1);
    239  view->repaint();
    240 
    241  win_stack.push_back(view);
    242  input(0);
    243 }
    244 
    245 void start_selftest(int)
    246 {
    247  B15F& drv = B15F::getInstance();
    248  drv.activateSelfTestMode();
    249 
    250  ViewInfo* view = new ViewInfo();
    251  view->setTitle("Selbsttest aktiv");
    252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
    253  view->setLabelClose("[ Selbsttest Beenden ]");
    254  view->setCall(&stop_selftest);
    255  view->repaint();
    256 
    257  win_stack.push_back(view);
    258  input(0);
    259 }
    260 
    261 void stop_selftest(int)
    262 {
    263  B15F& drv = B15F::getInstance();
    264  drv.discard();
    266  drv.reconnect();
    267  drv.digitalWrite0(0);
    268  drv.digitalWrite1(0);
    269 }
    270 
    271 void show_selftest_info(int)
    272 {
    273  ViewInfo* view = new ViewInfo();
    274  view->setTitle("Selbsttest");
    275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
    276  view->setLabelClose("[ Weiter ]");
    277  view->setCall(&start_selftest);
    278  view->repaint();
    279 
    280  win_stack.push_back(view);
    281  input(0);
    282 }
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:420
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:430
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:422
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:432
    Definition: b15f.h:26
    -
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:180
    -
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:167
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:182
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:169
    -
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:265
    +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:267
    -
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:194
    +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:196
    void discard(void)
    Definition: b15f.cpp:72
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:235
    void reconnect(void)
    Definition: b15f.cpp:57
    -
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:250
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:252
    diff --git a/docs/html/ui_8h_source.html b/docs/html/ui_8h_source.html index 832cfbe..5f300c9 100644 --- a/docs/html/ui_8h_source.html +++ b/docs/html/ui_8h_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #ifndef UI_H
    2 #define UI_H
    3 
    4 #include <vector>
    5 #include "view_selection.h"
    6 #include "view_info.h"
    7 #include "view_monitor.h"
    8 #include "view_promt.h"
    9 
    10 void show_main(int);
    11 void input(int);
    12 void view_back(int);
    13 void finish(int);
    14 void cleanup();
    15 
    16 void show_info(int);
    17 void show_monitor(int);
    18 void show_invalid_port_input(int);
    19 void show_invalid_dac_input(int);
    20 void write_digital_output0(int);
    21 void write_digital_output1(int);
    22 void write_analog_output0(int);
    23 void write_analog_output1(int);
    24 void show_digital_output0(int);
    25 void show_digital_output1(int);
    26 void show_analog_output0(int);
    27 void show_analog_output1(int);
    28 
    29 // selftest group
    30 void show_selftest_info(int);
    31 void start_selftest(int);
    32 void stop_selftest(int);
    33 
    34 
    35 extern std::vector<View*> win_stack;
    36 extern std::thread t_refresh;
    37 
    38 #endif // UI_H
    diff --git a/docs/html/usart_8cpp_source.html b/docs/html/usart_8cpp_source.html index b8f3416..e8912fd 100644 --- a/docs/html/usart_8cpp_source.html +++ b/docs/html/usart_8cpp_source.html @@ -70,23 +70,23 @@ $(function() {
    usart.cpp
    -
    1 #include "usart.h"
    2 
    4 {
    5  closeDevice();
    6 }
    7 
    8 void USART::openDevice(std::string device)
    9 {
    10  // Benutze blockierenden Modus
    11  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
    12  if (file_desc <= 0)
    13  throw USARTException("Fehler beim Öffnen des Gerätes");
    14 
    15  struct termios options;
    16  int code = tcgetattr(file_desc, &options);
    17  if (code)
    18  throw USARTException("Fehler beim Lesen der Geräteparameter");
    19 
    20  options.c_cflag = CS8 | CLOCAL | CREAD;
    21  options.c_iflag = IGNPAR;
    22  options.c_oflag = 0;
    23  options.c_lflag = 0;
    24  options.c_cc[VMIN] = 0; // #bytes read returns at least
    25  options.c_cc[VTIME] = timeout;
    26  code = cfsetspeed(&options, baudrate);
    27  if (code)
    28  throw USARTException("Fehler beim Setzen der Baudrate");
    29 
    30  code = tcsetattr(file_desc, TCSANOW, &options);
    31  if (code)
    32  throw USARTException("Fehler beim Setzen der Geräteparameter");
    33 
    36 }
    37 
    39 {
    40  if (file_desc > 0)
    41  {
    42  int code = close(file_desc);
    43  if (code)
    44  throw USARTException("Fehler beim Schließen des Gerätes");
    45  file_desc = -1;
    46  }
    47 }
    48 
    50 {
    51  int code = tcflush(file_desc, TCIFLUSH);
    52  if (code)
    53  throw USARTException("Fehler beim Leeren des Eingangspuffers");
    54 }
    55 
    57 {
    58  int code = tcflush(file_desc, TCOFLUSH);
    59  if (code)
    60  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
    61 }
    62 
    64 {
    65  int code = tcdrain(file_desc);
    66  if (code)
    67  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
    68 }
    69 
    70 void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    71 {
    72  int n = read(file_desc, buffer + offset, len);
    73  if (n != len)
    74  throw USARTException(
    75  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__));
    76 }
    77 
    78 void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    79 {
    80  int n = write(file_desc, buffer + offset, len);
    81  if (n != len)
    82  throw USARTException(
    83  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__));
    84 }
    85 
    87 {
    88  return baudrate;
    89 }
    90 
    92 {
    93  return timeout;
    94 }
    95 
    96 void USART::setBaudrate(uint32_t baudrate)
    97 {
    98  this->baudrate = baudrate;
    99 }
    100 
    101 void USART::setTimeout(uint8_t timeout)
    102 {
    103  this->timeout = timeout;
    104 }
    -
    uint32_t getBaudrate(void)
    Definition: usart.cpp:86
    +
    1 #include <stdexcept>
    2 #include "usart.h"
    3 
    5 {
    6  closeDevice();
    7 }
    8 
    9 void USART::openDevice(std::string device)
    10 {
    11  // Benutze blockierenden Modus
    12  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY);// | O_NDELAY
    13  if (file_desc <= 0)
    14  throw USARTException("Fehler beim Öffnen des Gerätes");
    15 
    16  struct termios options;
    17  int code = tcgetattr(file_desc, &options);
    18  if (code)
    19  throw USARTException("Fehler beim Lesen der Geräteparameter");
    20 
    21  options.c_cflag = CS8 | CLOCAL | CREAD;
    22  options.c_iflag = IGNPAR;
    23  options.c_oflag = 0;
    24  options.c_lflag = 0;
    25  options.c_cc[VMIN] = 0;
    26  options.c_cc[VTIME] = timeout;
    27  code = cfsetspeed(&options, baudrate);
    28  if (code)
    29  throw USARTException("Fehler beim Setzen der Baudrate");
    30 
    31  code = tcsetattr(file_desc, TCSANOW, &options);
    32  if (code)
    33  throw USARTException("Fehler beim Setzen der Geräteparameter");
    34 
    35  code = fcntl(file_desc, F_SETFL, 0); // blockierender Modus
    36  if (code)
    37  throw USARTException("Fehler beim Aktivieren des blockierenden Modus'");
    38 
    41 }
    42 
    44 {
    45  if (file_desc > 0)
    46  {
    47  int code = close(file_desc);
    48  if (code)
    49  throw USARTException("Fehler beim Schließen des Gerätes");
    50  file_desc = -1;
    51  }
    52 }
    53 
    55 {
    56  int code = tcflush(file_desc, TCIFLUSH);
    57  if (code)
    58  throw USARTException("Fehler beim Leeren des Eingangspuffers");
    59 }
    60 
    62 {
    63  int code = tcflush(file_desc, TCOFLUSH);
    64  if (code)
    65  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
    66 }
    67 
    69 {
    70  int code = tcdrain(file_desc);
    71  if (code)
    72  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
    73 }
    74 
    75 void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    76 {
    77  int bytes_avail, code;
    78  do
    79  {
    80  code = ioctl(file_desc, FIONREAD, &bytes_avail);
    81  if(code)
    82  throw USARTException(
    83  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
    84  ", " + strerror(code) + " (code " + std::to_string(code) + ")");
    85  }
    86  while(bytes_avail < len);
    87 
    88  code = read(file_desc, buffer + offset, len);
    89  if (code != len)
    90  throw USARTException(
    91  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
    92  ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")");
    93 }
    94 
    95 void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    96 {
    97  int code = write(file_desc, buffer + offset, len);
    98  if (code != len)
    99  throw USARTException(
    100  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
    101  ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")");
    102 }
    103 
    105 {
    106  return baudrate;
    107 }
    108 
    110 {
    111  return timeout;
    112 }
    113 
    114 void USART::setBaudrate(uint32_t baudrate)
    115 {
    116  this->baudrate = baudrate;
    117 }
    118 
    119 void USART::setTimeout(uint8_t timeout)
    120 {
    121  this->timeout = timeout;
    122 }
    +
    uint32_t getBaudrate(void)
    Definition: usart.cpp:104
    -
    void closeDevice(void)
    Definition: usart.cpp:38
    -
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:78
    -
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:70
    -
    void clearInputBuffer(void)
    Definition: usart.cpp:49
    -
    uint8_t getTimeout(void)
    Definition: usart.cpp:91
    -
    void clearOutputBuffer(void)
    Definition: usart.cpp:56
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:96
    -
    virtual ~USART(void)
    Definition: usart.cpp:3
    -
    void openDevice(std::string device)
    Definition: usart.cpp:8
    -
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:101
    -
    void flushOutputBuffer(void)
    Definition: usart.cpp:63
    +
    void closeDevice(void)
    Definition: usart.cpp:43
    +
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:95
    +
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:75
    +
    void clearInputBuffer(void)
    Definition: usart.cpp:54
    +
    uint8_t getTimeout(void)
    Definition: usart.cpp:109
    +
    void clearOutputBuffer(void)
    Definition: usart.cpp:61
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:114
    +
    virtual ~USART(void)
    Definition: usart.cpp:4
    +
    void openDevice(std::string device)
    Definition: usart.cpp:9
    +
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:119
    +
    void flushOutputBuffer(void)
    Definition: usart.cpp:68
    diff --git a/docs/html/usart_8h_source.html b/docs/html/usart_8h_source.html index e14235e..fdf1e0e 100644 --- a/docs/html/usart_8h_source.html +++ b/docs/html/usart_8h_source.html @@ -70,24 +70,24 @@ $(function() {
    usart.h
    -
    1 #ifndef USART_H
    2 #define USART_H
    3 
    4 #include <cstdint>
    5 #include <fcntl.h>
    6 #include <unistd.h>
    7 #include <termios.h>
    8 #include <sys/ioctl.h>
    9 #include "usartexception.h"
    10 
    13 class USART
    14 {
    15 public:
    16 
    17  /*************************************************
    18  * Methoden für die Verwaltung der Schnittstelle *
    19  *************************************************/
    20 
    24  explicit USART() = default;
    25 
    29  virtual ~USART(void);
    30 
    36  void openDevice(std::string device);
    37 
    42  void closeDevice(void);
    43 
    48  void clearInputBuffer(void);
    49 
    54  void clearOutputBuffer(void);
    55 
    60  void flushOutputBuffer(void);
    61 
    62  /*************************************************/
    63 
    64 
    65 
    66  /*************************************
    67  * Methoden für die Datenübertragung *
    68  *************************************/
    69 
    77  void transmit(uint8_t *buffer, uint16_t offset, uint8_t len);
    78 
    86  void receive(uint8_t *buffer, uint16_t offset, uint8_t len);
    87 
    88  /*************************************/
    89 
    90 
    91 
    92  /***************************************
    93  * Methoden für einstellbare Parameter *
    94  ***************************************/
    95 
    100  uint32_t getBaudrate(void);
    101 
    106  uint8_t getTimeout(void);
    107 
    112  void setBaudrate(uint32_t baudrate);
    113 
    118  void setTimeout(uint8_t timeout);
    119 
    120  /***************************************/
    121 
    122 private:
    123 
    124  int file_desc = -1;
    125  uint32_t baudrate = 9600;
    126  uint8_t timeout = 10;
    127 };
    128 
    129 #endif // USART_H
    -
    uint32_t getBaudrate(void)
    Definition: usart.cpp:86
    +
    1 #ifndef USART_H
    2 #define USART_H
    3 
    4 #include <cstdint>
    5 #include <fcntl.h>
    6 #include <unistd.h>
    7 #include <termios.h>
    8 #include <iostream>
    9 #include <sys/ioctl.h>
    10 #include <string.h>
    11 #include "usartexception.h"
    12 
    15 class USART
    16 {
    17 public:
    18 
    19  /*************************************************
    20  * Methoden für die Verwaltung der Schnittstelle *
    21  *************************************************/
    22 
    26  explicit USART() = default;
    27 
    31  virtual ~USART(void);
    32 
    38  void openDevice(std::string device);
    39 
    44  void closeDevice(void);
    45 
    50  void clearInputBuffer(void);
    51 
    56  void clearOutputBuffer(void);
    57 
    62  void flushOutputBuffer(void);
    63 
    64  /*************************************************/
    65 
    66 
    67 
    68  /*************************************
    69  * Methoden für die Datenübertragung *
    70  *************************************/
    71 
    79  void transmit(uint8_t *buffer, uint16_t offset, uint8_t len);
    80 
    88  void receive(uint8_t *buffer, uint16_t offset, uint8_t len);
    89 
    90  /*************************************/
    91 
    92 
    93 
    94  /***************************************
    95  * Methoden für einstellbare Parameter *
    96  ***************************************/
    97 
    102  uint32_t getBaudrate(void);
    103 
    108  uint8_t getTimeout(void);
    109 
    114  void setBaudrate(uint32_t baudrate);
    115 
    120  void setTimeout(uint8_t timeout);
    121 
    122  /***************************************/
    123 
    124 private:
    125 
    126  int file_desc = -1;
    127  uint32_t baudrate = 9600;
    128  uint8_t timeout = 100;
    129 };
    130 
    131 #endif // USART_H
    +
    uint32_t getBaudrate(void)
    Definition: usart.cpp:104
    USART()=default
    -
    void closeDevice(void)
    Definition: usart.cpp:38
    -
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:78
    -
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:70
    -
    void clearInputBuffer(void)
    Definition: usart.cpp:49
    -
    uint8_t getTimeout(void)
    Definition: usart.cpp:91
    -
    Definition: usart.h:13
    -
    void clearOutputBuffer(void)
    Definition: usart.cpp:56
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:96
    -
    virtual ~USART(void)
    Definition: usart.cpp:3
    -
    void openDevice(std::string device)
    Definition: usart.cpp:8
    -
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:101
    -
    void flushOutputBuffer(void)
    Definition: usart.cpp:63
    +
    void closeDevice(void)
    Definition: usart.cpp:43
    +
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:95
    +
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:75
    +
    void clearInputBuffer(void)
    Definition: usart.cpp:54
    +
    uint8_t getTimeout(void)
    Definition: usart.cpp:109
    +
    Definition: usart.h:15
    +
    void clearOutputBuffer(void)
    Definition: usart.cpp:61
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:114
    +
    virtual ~USART(void)
    Definition: usart.cpp:4
    +
    void openDevice(std::string device)
    Definition: usart.cpp:9
    +
    void setTimeout(uint8_t timeout)
    Definition: usart.cpp:119
    +
    void flushOutputBuffer(void)
    Definition: usart.cpp:68
    diff --git a/docs/html/usartexception_8h_source.html b/docs/html/usartexception_8h_source.html index f6ea1e0..4463697 100644 --- a/docs/html/usartexception_8h_source.html +++ b/docs/html/usartexception_8h_source.html @@ -79,7 +79,7 @@ $(function() {
    virtual ~USARTException()=default
    diff --git a/docs/html/view_8cpp_source.html b/docs/html/view_8cpp_source.html index 9c20ba1..d1568a6 100644 --- a/docs/html/view_8cpp_source.html +++ b/docs/html/view_8cpp_source.html @@ -71,10 +71,10 @@ $(function() {
    1 #include "view.h"
    2 
    3 WINDOW* View::win = nullptr;
    4 
    5 View::View()
    6 {
    7  if(!win)
    8  {
    9  B15F::abort("View::win not initialized, missing context");
    10  }
    11  getmaxyx(win, height, width); // init width and height
    12  keypad(win, TRUE);
    13 }
    14 
    15 View::~View()
    16 {
    17 }
    18 
    19 void View::setWinContext(WINDOW* win)
    20 {
    21  View::win = win;
    22 }
    23 
    24 WINDOW* View::getWinContext()
    25 {
    26  return win;
    27 }
    28 
    29 // from: https://stackoverflow.com/a/37454181
    30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
    31 {
    32  std::vector<std::string> tokens;
    33  size_t prev = 0, pos = 0;
    34  do
    35  {
    36  pos = str.find(delim, prev);
    37  if (pos == std::string::npos) pos = str.length();
    38  std::string token = str.substr(prev, pos-prev);
    39  if (!token.empty()) tokens.push_back(token);
    40  prev = pos + delim.length();
    41  }
    42  while (pos < str.length() && prev < str.length());
    43  return tokens;
    44 }
    45 
    46 
    47 void View::setTitle(std::string title)
    48 {
    49  this->title = title;
    50 }
    51 
    52 void View::repaint()
    53 {
    54  // get screen size
    55  struct winsize size;
    56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
    57  throw std::runtime_error("TIOCGWINSZ error");
    58 
    59 
    60  start_x = floor((size.ws_col - width) / 2.);
    61  start_y = floor((size.ws_row - height) / 2.);
    62 
    63  curs_set(0); // hide cursor
    64  mvwin(win, start_y, start_x);
    65  clear();
    66  wclear(win);
    67 
    68  // generic draw
    69  box(win, 0, 0);
    70  int offset_x = (width - title.length()) / 2;
    71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
    72 
    73  // specific draw
    74  draw();
    75 
    76  refresh();
    77  wrefresh(win);
    78 }
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:455
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:457
    diff --git a/docs/html/view_8h_source.html b/docs/html/view_8h_source.html index c435614..0943601 100644 --- a/docs/html/view_8h_source.html +++ b/docs/html/view_8h_source.html @@ -74,7 +74,7 @@ $(function() {
    Definition: view.h:19
    diff --git a/docs/html/view__info_8cpp_source.html b/docs/html/view__info_8cpp_source.html index 2a83349..c4e9cb5 100644 --- a/docs/html/view__info_8cpp_source.html +++ b/docs/html/view__info_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_info.h"
    2 
    3 ViewInfo::ViewInfo()
    4 {
    5  calls.push_back(nullptr);
    6 }
    7 
    8 void ViewInfo::setText(std::string text)
    9 {
    10  this->text = text;
    11 }
    12 
    13 void ViewInfo::setLabelClose(std::string label)
    14 {
    15  this->label_close = label;
    16 }
    17 
    18 void ViewInfo::setCall(call_t call)
    19 {
    20  calls[0] = call;
    21 }
    22 
    23 void ViewInfo::draw()
    24 {
    25  int li = 0;
    26  for(std::string line : str_split(text, "\n"))
    27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
    28 
    29  close_offset_x = (width - label_close.length()) / 2;
    30  close_offset_y = height - 2;
    31 
    32  wattron(win, A_REVERSE);
    33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
    34  wattroff(win, A_REVERSE);
    35 }
    36 
    37 call_t ViewInfo::keypress(int& key)
    38 {
    39  switch(key)
    40  {
    41 
    42  case KEY_MOUSE:
    43  {
    44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    45  MEVENT event;
    46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    47  {
    48  size_t column = start_x + close_offset_x;
    49  size_t row = start_y + close_offset_y;
    50  size_t mouse_x = event.x, mouse_y = event.y;
    51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    52  key = -1; // do return from view
    53  }
    54  break;
    55  }
    56  case KEY_ENT:
    57  key = -1; // do return from view
    58  break;
    59  default:
    60  break;
    61  }
    62  return calls[0];
    63 }
    diff --git a/docs/html/view__info_8h_source.html b/docs/html/view__info_8h_source.html index 22fae9d..d72a82a 100644 --- a/docs/html/view__info_8h_source.html +++ b/docs/html/view__info_8h_source.html @@ -75,7 +75,7 @@ $(function() {
    Definition: view.h:19
    diff --git a/docs/html/view__monitor_8cpp_source.html b/docs/html/view__monitor_8cpp_source.html index 3988fa5..cbb64e7 100644 --- a/docs/html/view__monitor_8cpp_source.html +++ b/docs/html/view__monitor_8cpp_source.html @@ -72,19 +72,19 @@ $(function() {
    1 #include "view_monitor.h"
    2 
    3 ViewMonitor::ViewMonitor() : t_worker(&ViewMonitor::worker, this)
    4 {
    5 }
    6 
    7 call_t ViewMonitor::keypress(int& key)
    8 {
    9  switch(key)
    10  {
    11 
    12  case KEY_MOUSE:
    13  {
    14  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    15  MEVENT event;
    16  bool hit = false;
    17  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    18  {
    19  size_t column = start_x + close_offset_x;
    20  size_t row = start_y + close_offset_y;
    21  size_t mouse_x = event.x, mouse_y = event.y;
    22  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
    23  hit = true;
    24  }
    25  if(!hit)
    26  break;
    27 
    28  // fall through to next case
    29  [[fallthrough]];
    30  }
    31  case KEY_ENT:
    32  run_worker = false;
    33  key = -1; // do return from view
    34  wclear(win);
    35  wrefresh(win);
    36  t_worker.join();
    37  break;
    38  default:
    39  break;
    40  }
    41  return calls[0];
    42 }
    43 
    44 std::string ViewMonitor::fancyDigitalString(uint8_t& b)
    45 {
    46  std::stringstream str;
    47  str << std::bitset<8>(b).to_string();
    48  str << " ";
    49  str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec;
    50  return str.str();
    51 }
    52 
    53 std::string ViewMonitor::fancyAnalogString(uint16_t& v)
    54 {
    55  std::stringstream str;
    56  double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0;
    57 
    58  str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V ";
    59 
    60  str << "[";
    61  uint8_t p = round(v * 40.0 / 1023.0);
    62  for(uint8_t i = 0; i < p; i++)
    63  str << "X";
    64  for(uint8_t i = 0; i < 40 - p; i++)
    65  str << " ";
    66  str << "]" << std::endl;
    67 
    68  return str.str();
    69 }
    70 
    71 void ViewMonitor::worker()
    72 {
    73  B15F& drv = B15F::getInstance();
    74  while(run_worker)
    75  {
    76  try
    77  {
    78  std::this_thread::sleep_for(std::chrono::milliseconds(100));
    79 
    80  uint8_t be0 = drv.digitalRead0();
    81  uint8_t be1 = drv.digitalRead1();
    82  uint8_t dsw = drv.readDipSwitch();
    83  uint16_t adc[8];
    84  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    85  adc[i] = drv.analogRead(i);
    86 
    87 
    88  std::stringstream str;
    89 
    90  // hline
    91  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    92  if(i % 2 == 0)
    93  str << "-";
    94  else
    95  str << " ";
    96  str << std::endl;
    97 
    98  str << "Digitale Enigaenge:" << std::endl;
    99  str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl;
    100  str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl;
    101  str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl;
    102 
    103  // hline
    104  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
    105  if(i % 2 == 0)
    106  str << "-";
    107  else
    108  str << " ";
    109  str << std::endl;
    110 
    111  str << "Analoge Eingaenge:" << std::endl;
    112  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
    113  {
    114  str << "Kanal " << std::to_string((int) i) << ": ";
    115  str << fancyAnalogString(adc[i]) << std::endl;
    116  }
    117 
    118  text = str.str();
    119  repaint();
    120  }
    121  catch(DriverException& ex)
    122  {
    123  std::cout << "DriverException: " << ex.what() << std::endl;
    124  drv.delay_ms(1000);
    125  }
    126  catch(...)
    127  {
    128  try
    129  {
    130  drv.reconnect();
    131  }
    132  catch(...)
    133  {
    134  B15F::abort("yoho meine dudes");
    135  return;
    136  }
    137  }
    138  }
    139 }
    -
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:208
    -
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:236
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:420
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:430
    +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:210
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:238
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:422
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:432
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:455
    -
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:280
    -
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:222
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:457
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:282
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:224
    void reconnect(void)
    Definition: b15f.cpp:57
    diff --git a/docs/html/view__monitor_8h_source.html b/docs/html/view__monitor_8h_source.html index 5908596..505b418 100644 --- a/docs/html/view__monitor_8h_source.html +++ b/docs/html/view__monitor_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/view__promt_8cpp_source.html b/docs/html/view__promt_8cpp_source.html index c02be54..9d55b9c 100644 --- a/docs/html/view__promt_8cpp_source.html +++ b/docs/html/view__promt_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_promt.h"
    2 
    3 void ViewPromt::draw()
    4 {
    5  curs_set(1); // show cursor
    6 
    7  int li = text_offset_y;
    8  int ci = 0;
    9  for(std::string line : str_split(message + input, "\n"))
    10  {
    11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
    12  ci = line.length() + text_offset_x;
    13  }
    14 
    15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
    16  button_offset_y = height - text_offset_y;
    17 
    18  if(selection == 0)
    19  {
    20  wattron(win, A_REVERSE);
    21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    22  wattroff(win, A_REVERSE);
    23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    25  }
    26  else
    27  {
    28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
    29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
    30  wattron(win, A_REVERSE);
    31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
    32  wattroff(win, A_REVERSE);
    33  }
    34  wmove(win, li, ci);
    35 }
    36 
    37 void ViewPromt::setMessage(std::string message)
    38 {
    39  this->message = message;
    40 }
    41 
    42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
    43 {
    44  label_confirm = name;
    45  call_confirm = call;
    46 }
    47 
    48 void ViewPromt::setCancel(std::string name, bool cancelable)
    49 {
    50  label_cancel = name;
    51  this->cancelable = cancelable;
    52 }
    53 
    54 std::string ViewPromt::getInput()
    55 {
    56  return input;
    57 }
    58 
    59 std::function<void(int)> ViewPromt::keypress(int& key)
    60 {
    61  std::function<void(int)> ret = nullptr;
    62  switch(key)
    63  {
    64  case KEY_BACKSPACE:
    65  if(input.length())
    66  input.pop_back();
    67  break;
    68  case '\t':
    69  case KEY_LEFT:
    70  case KEY_RIGHT:
    71  selection = (selection + 1 ) % 2;
    72  break;
    73  case KEY_MOUSE:
    74  {
    75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    76  MEVENT event;
    77  bool hit = false;
    78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    79  {
    80  size_t column_start = start_x + button_offset_x;
    81  size_t row_start = start_y + button_offset_y;
    82  size_t mouse_x = event.x, mouse_y = event.y;
    83  if(mouse_y == row_start)
    84  {
    85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
    86  {
    87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    88  hit = true;
    89  selection = 0;
    90  }
    91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
    92  {
    93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
    94  hit = true;
    95  selection = 1;
    96  }
    97  }
    98  }
    99  if(!hit)
    100  break;
    101 
    102  // fall through to next case
    103  [[fallthrough]];
    104  }
    105  case KEY_ENT:
    106  if(selection == 0) // exit
    107  key = -1; // do return from view
    108  else
    109  ret = call_confirm;
    110  break;
    111  default:
    112  break;
    113  }
    114 
    115  if(key >= ' ' && key <= '~')
    116  input += (char) key;
    117 
    118  if(key != KEY_ENT)
    119  repaint();
    120  return ret;
    121 }
    diff --git a/docs/html/view__promt_8h_source.html b/docs/html/view__promt_8h_source.html index 5ac13df..52166f8 100644 --- a/docs/html/view__promt_8h_source.html +++ b/docs/html/view__promt_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/view__selection_8cpp_source.html b/docs/html/view__selection_8cpp_source.html index 96c404a..4ee7ee7 100644 --- a/docs/html/view__selection_8cpp_source.html +++ b/docs/html/view__selection_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #include "view_selection.h"
    2 
    3 void ViewSelection::draw()
    4 {
    5  //curs_set(0); // hide cursor
    6  for(size_t i = 0; i < choices.size(); i++)
    7  {
    8  if(selection == i)
    9  wattron(win, A_REVERSE);
    10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
    11  if(selection == i)
    12  wattroff(win, A_REVERSE);
    13  }
    14 }
    15 
    16 void ViewSelection::addChoice(std::string name, call_t call)
    17 {
    18  choices.push_back(name);
    19  calls.push_back(call);
    20 }
    21 
    22 call_t ViewSelection::keypress(int& key)
    23 {
    24  call_t ret = nullptr;
    25  switch(key)
    26  {
    27  case KEY_UP:
    28  do
    29  selection = (selection - 1 + choices.size()) % choices.size();
    30  while(!choices[selection].length() && choices.size());
    31  break;
    32 
    33  case '\t':
    34  case KEY_DOWN:
    35  do
    36  selection = (selection + 1) % choices.size();
    37  while(!choices[selection].length() && choices.size());
    38  break;
    39 
    40  case KEY_MOUSE:
    41  {
    42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
    43  MEVENT event;
    44  bool hit = false;
    45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
    46  {
    47  size_t column_start = start_x + choice_offset_x;
    48  size_t row_start = start_y + choice_offset_y;
    49  size_t mouse_x = event.x, mouse_y = event.y;
    50  for(size_t i = 0; i < choices.size(); i++)
    51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
    52  {
    53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
    54  hit = true;
    55  selection = i;
    56  }
    57  }
    58  if(!hit)
    59  break;
    60 
    61  // fall through to next case
    62  [[fallthrough]];
    63  }
    64 
    65  case KEY_ENT:
    66  if(selection == choices.size() - 1) // exit
    67  key = -1; // do return from view
    68  else
    69  ret = calls[selection];
    70  break;
    71  default:
    72  break;
    73  }
    74  repaint();
    75  return ret;
    76 }
    diff --git a/docs/html/view__selection_8h_source.html b/docs/html/view__selection_8h_source.html index c091b4d..80ca8c5 100644 --- a/docs/html/view__selection_8h_source.html +++ b/docs/html/view__selection_8h_source.html @@ -75,7 +75,7 @@ $(function() { From ff84de538ae57a46051c71095a0843e63c6cd4dd Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Thu, 6 Jun 2019 12:00:52 +0200 Subject: [PATCH 20/35] usart revised --- control/src/.idea/workspace.xml | 133 +++++++++++++++++++---------- control/src/cli.cpp | 2 +- control/src/drv/b15f.cpp | 3 - control/src/drv/timeoutexception.h | 33 ++++--- control/src/drv/usart.cpp | 14 ++- control/src/drv/usart.cpp.orig | 121 -------------------------- control/src/drv/usart.h | 5 +- 7 files changed, 127 insertions(+), 184 deletions(-) delete mode 100644 control/src/drv/usart.cpp.orig diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml index 0d20e09..54240d5 100644 --- a/control/src/.idea/workspace.xml +++ b/control/src/.idea/workspace.xml @@ -12,7 +12,11 @@
    + + + + @@ -40,7 +44,7 @@ - + @@ -48,13 +52,25 @@ - - + + - - + + - + + + + + + + + + + + + + @@ -63,7 +79,7 @@ - + @@ -72,7 +88,7 @@ - + @@ -81,8 +97,17 @@ - - + + + + + + + + + + + @@ -110,10 +135,12 @@ @@ -197,18 +224,18 @@ 1559118962147 - + - - + @@ -220,7 +247,7 @@ - + @@ -235,13 +262,6 @@ - - - - - - - @@ -256,46 +276,73 @@ - - - - - - - - - - - - - - - + - + - - + + - + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/control/src/cli.cpp b/control/src/cli.cpp index 5f76d3c..6abc7a2 100644 --- a/control/src/cli.cpp +++ b/control/src/cli.cpp @@ -1,4 +1,4 @@ -#define B15F_CLI_DEBUG +//#define B15F_CLI_DEBUG #include #include // sudo apt-get install libncurses5-dev diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index b4a47a0..a000db6 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -143,7 +143,6 @@ std::vector B15F::getBoardInfo(void) uint8_t n; usart.receive(&n, 0, sizeof(n)); - std::cout << "len: " << (int) n << std::endl << std::flush; while (n--) { uint8_t len; @@ -153,8 +152,6 @@ std::vector B15F::getBoardInfo(void) str[len] = '\0'; usart.receive(reinterpret_cast(&str[0]), 0, len); - std::cout << &str[0] << std::endl; - info.push_back(std::string(str)); } diff --git a/control/src/drv/timeoutexception.h b/control/src/drv/timeoutexception.h index a0be40f..d59fe24 100644 --- a/control/src/drv/timeoutexception.h +++ b/control/src/drv/timeoutexception.h @@ -2,36 +2,45 @@ #define TIMEOUTEXCEPTION_H #include - -// SOURCE: https://stackoverflow.com/a/8152888 +#include /*! Exception for USART related timeouts. */ class TimeoutException: public std::exception { public: - explicit TimeoutException(const char* message, int timeout) : TimeoutException(std::string(message), timeout) + /** + * Constructor + * @param message as c-string + */ + explicit TimeoutException(const char* message) : msg(message) { } - explicit TimeoutException(const std::string& message, int timeout) : msg(message), m_timeout(timeout) - { - if(!msg.length()) - msg = "Timeout reached (" + std::to_string(m_timeout) + ")"; - } - - virtual ~TimeoutException() throw () + /** + * Constructor + * @param message as c++-string + */ + explicit TimeoutException(const std::string& message) : msg(message) { } + /** + * Standard-destructor + */ + virtual ~TimeoutException() = default; + + /** + * Get failure description + * @return error message as c-string + */ virtual const char* what() const throw () { return msg.c_str(); } protected: - std::string msg; - int m_timeout; + std::string msg; //!< failure description }; #endif // TIMEOUTEXCEPTION_H diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index 568cdd7..28cbdf8 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -75,15 +75,25 @@ void USART::flushOutputBuffer() void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) { int bytes_avail, code; + auto start = std::chrono::steady_clock::now(); + auto end = std::chrono::steady_clock::now(); do { code = ioctl(file_desc, FIONREAD, &bytes_avail); - if(code) + if (code) throw USARTException( std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + ", " + strerror(code) + " (code " + std::to_string(code) + ")"); + + end = std::chrono::steady_clock::now(); + long elapsed = + std::chrono::duration_cast(end - start).count() / 100; // in Dezisekunden + if (elapsed >= timeout) + throw TimeoutException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + std::to_string(elapsed) + " / " + std::to_string(timeout) + " ds"); } - while(bytes_avail < len); + while (bytes_avail < len); code = read(file_desc, buffer + offset, len); if (code != len) diff --git a/control/src/drv/usart.cpp.orig b/control/src/drv/usart.cpp.orig deleted file mode 100644 index 7893c7c..0000000 --- a/control/src/drv/usart.cpp.orig +++ /dev/null @@ -1,121 +0,0 @@ -#include -#include "usart.h" - -USART::~USART() -{ - closeDevice(); -} - -void USART::openDevice(std::string device) -{ - // Benutze blockierenden Modus - file_desc = open(device.c_str(), O_RDWR | O_NOCTTY);// | O_NDELAY - if (file_desc <= 0) - throw USARTException("Fehler beim Öffnen des Gerätes"); - - struct termios options; - int code = tcgetattr(file_desc, &options); - if (code) - throw USARTException("Fehler beim Lesen der Geräteparameter"); - - options.c_cflag = CS8 | CLOCAL | CREAD; - options.c_iflag = IGNPAR; - options.c_oflag = 0; - options.c_lflag = 0; - options.c_cc[VMIN] = 0; - options.c_cc[VTIME] = timeout; - code = cfsetspeed(&options, baudrate); - if (code) - throw USARTException("Fehler beim Setzen der Baudrate"); - - code = tcsetattr(file_desc, TCSANOW, &options); - if (code) - throw USARTException("Fehler beim Setzen der Geräteparameter"); - - code = fcntl(file_desc, F_SETFL, 0); // blockierender Modus - if (code) - throw USARTException("Fehler beim Aktivieren des blockierenden Modus'"); - - clearOutputBuffer(); - clearInputBuffer(); -} - -void USART::closeDevice() -{ - if (file_desc > 0) - { - int code = close(file_desc); - if (code) - throw USARTException("Fehler beim Schließen des Gerätes"); - file_desc = -1; - } -} - -void USART::clearInputBuffer() -{ - int code = tcflush(file_desc, TCIFLUSH); - if (code) - throw USARTException("Fehler beim Leeren des Eingangspuffers"); -} - -void USART::clearOutputBuffer() -{ - int code = tcflush(file_desc, TCOFLUSH); - if (code) - throw USARTException("Fehler beim Leeren des Ausgangspuffers"); -} - -void USART::flushOutputBuffer() -{ - int code = tcdrain(file_desc); - if (code) - throw USARTException("Fehler beim Versenden des Ausgangspuffers"); -} - -void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) -{ - int bytes_avail, code; - do - { - code = ioctl(file_desc, FIONREAD, &bytes_avail); - if(code) - throw USARTException( - std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + - ", " + strerror(code) + " (code " + std::to_string(code) + ")"); - } while(bytes_avail < len); - - code = read(file_desc, buffer + offset, len); - if (code != len) - throw USARTException( - std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + - ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); -} - -void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) -{ - int code = write(file_desc, buffer + offset, len); - if (code != len) - throw USARTException( - std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + - ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); -} - -uint32_t USART::getBaudrate() -{ - return baudrate; -} - -uint8_t USART::getTimeout() -{ - return timeout; -} - -void USART::setBaudrate(uint32_t baudrate) -{ - this->baudrate = baudrate; -} - -void USART::setTimeout(uint8_t timeout) -{ - this->timeout = timeout; -} diff --git a/control/src/drv/usart.h b/control/src/drv/usart.h index ac42f7f..752f945 100644 --- a/control/src/drv/usart.h +++ b/control/src/drv/usart.h @@ -2,13 +2,14 @@ #define USART_H #include +#include #include #include #include -#include #include #include #include "usartexception.h" +#include "timeoutexception.h" /*! C++ Wrapper class for termios usart library. */ @@ -125,7 +126,7 @@ private: int file_desc = -1; //!< Linux Dateideskriptor uint32_t baudrate = 9600; //!< Standard-Baudrate, sollte mit setBaudrate() überschrieben werden! - uint8_t timeout = 100; //!< in Dezisekunden + uint8_t timeout = 10; //!< in Dezisekunden }; #endif // USART_H From bff5ff42e9495ca44e2c07925949688299e833df Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Thu, 6 Jun 2019 12:10:17 +0200 Subject: [PATCH 21/35] analogSequence repaired --- control/bin/b15fcli | Bin 89776 -> 89800 bytes control/src/.idea/workspace.xml | 168 +++++-- control/src/drv/b15f.cpp | 57 ++- control/src/drv/b15f.cpp.orig | 444 ++++++++++++++++++ control/src/drv/usart.cpp | 19 +- control/src/drv/usart.cpp.orig | 139 ++++++ control/src/drv/usart.h | 7 + docs/html/CMakeCCompilerId_8c_source.html | 2 +- docs/html/CMakeCXXCompilerId_8cpp_source.html | 2 +- docs/html/annotated.html | 2 +- docs/html/b15f_8cpp_source.html | 51 +- docs/html/b15f_8h_source.html | 44 +- docs/html/backup_8cpp_source.html | 4 +- docs/html/classB15F-members.html | 2 +- docs/html/classB15F.html | 44 +- docs/html/classDot-members.html | 2 +- docs/html/classDot.html | 2 +- docs/html/classDriverException-members.html | 2 +- docs/html/classDriverException.html | 2 +- docs/html/classPlottyFile-members.html | 2 +- docs/html/classPlottyFile.html | 2 +- docs/html/classTimeoutException-members.html | 13 +- docs/html/classTimeoutException.html | 157 ++++++- docs/html/classUSART-members.html | 23 +- docs/html/classUSART.html | 50 +- docs/html/classUSARTException-members.html | 2 +- docs/html/classUSARTException.html | 2 +- docs/html/classView-members.html | 2 +- docs/html/classView.html | 2 +- docs/html/classViewInfo-members.html | 2 +- docs/html/classViewInfo.html | 2 +- docs/html/classViewMonitor-members.html | 2 +- docs/html/classViewMonitor.html | 2 +- docs/html/classViewPromt-members.html | 2 +- docs/html/classViewPromt.html | 2 +- docs/html/classViewSelection-members.html | 2 +- docs/html/classViewSelection.html | 2 +- docs/html/classes.html | 2 +- docs/html/cli_8cpp_source.html | 8 +- .../dir_1788f8309b1a812dcb800a185471cf6c.html | 2 +- .../dir_19f2f1b99f19c12fa55b8d312cf373ed.html | 2 +- .../dir_3d3c8ff3ebf9841b39117ac899f41936.html | 2 +- .../dir_587c94d866dbb2f408f78cf41f9b2f8d.html | 2 +- .../dir_90e361ec3542f3dd076ea3ad19547437.html | 2 +- .../dir_95e29a8b8ee7c54052c171a88bb95675.html | 2 +- .../dir_f89abcb304c928c7d889aa5625570de5.html | 2 +- docs/html/dot_8cpp_source.html | 2 +- docs/html/dot_8h_source.html | 2 +- docs/html/driverexception_8h_source.html | 2 +- docs/html/feature__tests_8c_source.html | 2 +- docs/html/feature__tests_8cxx_source.html | 2 +- docs/html/files.html | 2 +- docs/html/functions.html | 17 +- docs/html/functions_func.html | 14 +- docs/html/functions_vars.html | 5 +- docs/html/hierarchy.html | 2 +- docs/html/index.html | 2 +- docs/html/plottyfile_8cpp_source.html | 2 +- docs/html/plottyfile_8h_source.html | 2 +- docs/html/search/all_10.js | 1 + docs/html/search/all_3.js | 3 +- docs/html/search/all_7.js | 2 +- docs/html/search/all_c.js | 2 +- docs/html/search/all_f.js | 2 +- docs/html/search/functions_2.js | 3 +- docs/html/search/functions_a.js | 1 + docs/html/search/functions_c.js | 2 +- docs/html/search/functions_d.js | 1 + docs/html/search/variables_1.js | 2 +- docs/html/timeoutexception_8h_source.html | 11 +- docs/html/ui_8cpp_source.html | 16 +- docs/html/ui_8h_source.html | 2 +- docs/html/usart_8cpp_source.html | 18 +- docs/html/usart_8h_source.html | 19 +- docs/html/usartexception_8h_source.html | 2 +- docs/html/view_8cpp_source.html | 4 +- docs/html/view_8h_source.html | 2 +- docs/html/view__info_8cpp_source.html | 2 +- docs/html/view__info_8h_source.html | 2 +- docs/html/view__monitor_8cpp_source.html | 16 +- docs/html/view__monitor_8h_source.html | 2 +- docs/html/view__promt_8cpp_source.html | 2 +- docs/html/view__promt_8h_source.html | 2 +- docs/html/view__selection_8cpp_source.html | 2 +- docs/html/view__selection_8h_source.html | 2 +- 85 files changed, 1180 insertions(+), 287 deletions(-) create mode 100644 control/src/drv/b15f.cpp.orig create mode 100644 control/src/drv/usart.cpp.orig diff --git a/control/bin/b15fcli b/control/bin/b15fcli index 65fe6788a7403dc068f3ec4d196a91e1345ea8ac..652d2d066107f68983fcd85c124825284139b756 100755 GIT binary patch delta 23592 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 delta 23237 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 ZaTJRkDRq?QDx*hA-K3Msx{*?|{|7#dGV%Zb diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml index 54240d5..a8e2aae 100644 --- a/control/src/.idea/workspace.xml +++ b/control/src/.idea/workspace.xml @@ -12,12 +12,86 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -224,18 +310,18 @@ 1559118962147 - + - - + @@ -247,7 +333,7 @@ - + @@ -303,44 +389,44 @@ - + - - + + - + - - - - - + + - - + + - + - - + + + + + - + - - + + diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index a000db6..cf44ccc 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -125,7 +125,7 @@ bool B15F::testIntConv() usart.transmit(&rq[0], 0, sizeof(rq)); uint16_t aw; - usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); + usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); return aw == dummy * 3; } @@ -291,7 +291,7 @@ uint16_t B15F::analogRead(uint8_t channel) usart.transmit(&rq[0], 0, sizeof(rq)); uint16_t aw; - usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); + usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); if (aw > 1023) abort("Bad ADC data detected (1)"); @@ -302,45 +302,58 @@ void B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count) { - /* // prepare pointers buffer_a += offset_a; buffer_b += offset_b; usart.clearInputBuffer(); - usart.writeByte(RQ_ADC_DAC_STROKE); - usart.writeByte(channel_a); - usart.writeByte(channel_b); - usart.writeInt(start); - usart.writeInt(static_cast(delta)); - usart.writeInt(count); + uint8_t rq[] = + { + RQ_ADC_DAC_STROKE, + channel_a, + channel_b, + static_cast(start & 0xFF), + static_cast(start >> 8), + static_cast(delta & 0xFF), + static_cast(delta >> 8), + static_cast(count & 0xFF), + static_cast(count >> 8) + }; - for (uint16_t i = 0; i < count; i++) { - if (buffer_a) { - buffer_a[i] = usart.readInt(); + usart.transmit(&rq[0], 0, sizeof(rq)); + + for (uint16_t i = 0; i < count; i++) + { + if (buffer_a) + { + usart.receive(reinterpret_cast(&buffer_a[i]), 0, 2); if (buffer_a[i] > 1023) // check for broken usart connection abort("Bad ADC data detected (2)"); - } else { - usart.readInt(); + } + else + { + usart.drop(2); } - if (buffer_b) { - buffer_b[i] = usart.readInt(); + if (buffer_b) + { + usart.receive(reinterpret_cast(&buffer_b[i]), 0, 2); if (buffer_b[i] > 1023) // check for broken usart connection abort("Bad ADC data detected (3)"); - } else { - usart.readInt(); + } + else + { + usart.drop(2); } } - uint8_t aw = usart.readByte(); - if (aw != MSG_OK) + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + if(aw != MSG_OK) abort("Sequenz unterbrochen"); - - delay_us(10);*/ } uint8_t B15F::pwmSetFrequency(uint32_t freq) diff --git a/control/src/drv/b15f.cpp.orig b/control/src/drv/b15f.cpp.orig new file mode 100644 index 0000000..9a634d1 --- /dev/null +++ b/control/src/drv/b15f.cpp.orig @@ -0,0 +1,444 @@ +#include "b15f.h" + +B15F *B15F::instance = nullptr; +errorhandler_t B15F::errorhandler = nullptr; + +B15F::B15F() { + init(); +} + +void B15F::init() { + + std::string device = exec("bash -c 'ls /dev/ttyUSB*'"); + while (device.find(' ') != std::string::npos || device.find('\n') != std::string::npos || + device.find('\t') != std::string::npos) + device.pop_back(); + + if (device.length() == 0) + abort("Adapter nicht gefunden"); + + std::cout << PRE << "Verwende Adapter: " << device << std::endl; + + + std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush; + usart.setBaudrate(BAUDRATE); + usart.openDevice(device); + std::cout << "OK" << std::endl; + + + std::cout << PRE << "Teste Verbindung... " << std::flush; + uint8_t tries = 3; + while (tries--) { + // verwerfe Daten, die µC noch hat + //discard(); + + if (!testConnection()) + continue; + + if (!testIntConv()) + continue; + + break; + } + if (tries == 0) + abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?"); + std::cout << "OK" << std::endl; + + + // Gib board info aus + std::vector info = getBoardInfo(); + std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")" + << std::endl; +} + +void B15F::reconnect() { + uint8_t tries = RECONNECT_TRIES; + while (tries--) { + delay_ms(RECONNECT_TIMEOUT); + discard(); + + if (testConnection()) + return; + } + + abort("Verbindung kann nicht repariert werden"); +} + +void B15F::discard(void) { + try { + uint8_t rq[] = + { + RQ_DISC + }; + + usart.clearOutputBuffer(); + for (uint8_t i = 0; i < 16; i++) { + usart.transmit(&rq[0], 0, sizeof(rq)); // sende discard Befehl (verwerfe input) + delay_ms(4); + } + usart.clearInputBuffer(); + } + catch (std::exception &ex) { + abort(ex); + } +} + +bool B15F::testConnection() { + // erzeuge zufälliges Byte + srand(time(NULL)); + uint8_t dummy = rand() % 256; + + uint8_t rq[] = + { + RQ_TEST, + dummy + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw[2]; + usart.receive(&aw[0], 0, sizeof(aw)); + + return aw[0] == MSG_OK && aw[1] == dummy; +} + +bool B15F::testIntConv() { + srand(time(NULL)); + uint16_t dummy = rand() % (0xFFFF / 3); + + uint8_t rq[] = + { + RQ_INT, + static_cast(dummy & 0xFF), + static_cast(dummy >> 8) + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint16_t aw; + usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); + + return aw == dummy * 3; +} + + +std::vector B15F::getBoardInfo(void) { + std::vector info; + + uint8_t rq[] = + { + RQ_INFO + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t n; + usart.receive(&n, 0, sizeof(n)); + while (n--) { + uint8_t len; + usart.receive(&len, 0, sizeof(len)); + + char str[len + 1]; + str[len] = '\0'; + usart.receive(reinterpret_cast(&str[0]), 0, len); + + info.push_back(std::string(str)); + } + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + if (aw != MSG_OK) + abort("Board Info fehlerhalft: code " + std::to_string((int) aw)); + + return info; +} + +bool B15F::activateSelfTestMode() { + uint8_t rq[] = + { + RQ_ST + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +bool B15F::digitalWrite0(uint8_t port) { + uint8_t rq[] = + { + RQ_BA0, + port + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +bool B15F::digitalWrite1(uint8_t port) { + uint8_t rq[] = + { + RQ_BA1, + port + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +uint8_t B15F::digitalRead0() { + usart.clearInputBuffer(); + uint8_t rq[] = + { + RQ_BE0 + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; +} + +uint8_t B15F::digitalRead1() { + usart.clearInputBuffer(); + uint8_t rq[] = + { + RQ_BE1 + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; +} + +uint8_t B15F::readDipSwitch() { + usart.clearInputBuffer(); + uint8_t rq[] = + { + RQ_DSW + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; +} + +bool B15F::analogWrite0(uint16_t value) { + uint8_t rq[] = + { + RQ_AA0, + static_cast(value & 0xFF), + static_cast(value >> 8) + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +bool B15F::analogWrite1(uint16_t value) { + uint8_t rq[] = + { + RQ_AA1, + static_cast(value & 0xFF), + static_cast(value >> 8) + }; + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +uint16_t B15F::analogRead(uint8_t channel) { + usart.clearInputBuffer(); + if (channel > 7) + abort("Bad ADC channel: " + std::to_string(channel)); + + uint8_t rq[] = + { + RQ_ADC, + channel + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint16_t aw; + usart.receive(reinterpret_cast(&aw), 0, sizeof(aw)); + + if (aw > 1023) + abort("Bad ADC data detected (1)"); + return aw; +} + +void +B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, + uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count) { + // prepare pointers + buffer_a += offset_a; + buffer_b += offset_b; + + + usart.clearInputBuffer(); + uint8_t rq[] = + { + RQ_ADC_DAC_STROKE, + channel_a, + channel_b, + static_cast(start & 0xFF), + static_cast(start >> 8), + static_cast(delta & 0xFF), + static_cast(delta >> 8), + static_cast(count & 0xFF), + static_cast(count >> 8) + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + for (uint16_t i = 0; i < count; i++) { + if (buffer_a) { + usart.receive(reinterpret_cast(&buffer_a[i]), 0, 2); + + if (buffer_a[i] > 1023) // check for broken usart connection + abort("Bad ADC data detected (2)"); + } else { + usart.drop(2); + } + + if (buffer_b) { + usart.receive(reinterpret_cast(&buffer_b[i]), 0, 2); + + if (buffer_b[i] > 1023) // check for broken usart connection + abort("Bad ADC data detected (3)"); + } else { + usart.drop(2); + } + } + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + if(aw != MSG_OK) + abort("Sequenz unterbrochen"); +} + +uint8_t B15F::pwmSetFrequency(uint32_t freq) { + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_PWM_SET_FREQ, + static_cast((freq >> 0) & 0xFF), + static_cast((freq >> 8) & 0xFF), + static_cast((freq >> 16) & 0xFF), + static_cast((freq >> 24) & 0xFF) + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; +} + +bool B15F::pwmSetValue(uint8_t value) { + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_PWM_SET_VALUE, + value + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == MSG_OK; +} + +bool B15F::setRegister(uint8_t adr, uint8_t val) { + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_SET_REG, + adr, + val + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw == val; +} + +uint8_t B15F::getRegister(uint8_t adr) { + usart.clearInputBuffer(); + + uint8_t rq[] = + { + RQ_GET_REG, + adr + }; + + usart.transmit(&rq[0], 0, sizeof(rq)); + + uint8_t aw; + usart.receive(&aw, 0, sizeof(aw)); + return aw; +} + + +void B15F::delay_ms(uint16_t ms) { + std::this_thread::sleep_for(std::chrono::milliseconds(ms)); +} + +void B15F::delay_us(uint16_t us) { + std::this_thread::sleep_for(std::chrono::microseconds(us)); +} + +B15F &B15F::getInstance(void) { + if (!instance) + instance = new B15F(); + + return *instance; +} + +// https://stackoverflow.com/a/478960 +std::string B15F::exec(std::string cmd) { + std::array buffer; + std::string result; + std::unique_ptr pipe(popen(cmd.c_str(), "r"), pclose); + if (!pipe) { + throw std::runtime_error("popen() failed!"); + } + while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) { + result += buffer.data(); + } + return result; +} + +void B15F::abort(std::string msg) { + DriverException ex(msg); + abort(ex); +} + +void B15F::abort(std::exception &ex) { + if (errorhandler) + errorhandler(ex); + else { + std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl; + std::cout << ex.what() << std::endl; + throw DriverException(ex.what()); + } +} + +void B15F::setAbortHandler(errorhandler_t func) { + errorhandler = func; +} diff --git a/control/src/drv/usart.cpp b/control/src/drv/usart.cpp index 28cbdf8..259fbdb 100644 --- a/control/src/drv/usart.cpp +++ b/control/src/drv/usart.cpp @@ -72,6 +72,15 @@ void USART::flushOutputBuffer() throw USARTException("Fehler beim Versenden des Ausgangspuffers"); } +void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) +{ + int code = write(file_desc, buffer + offset, len); + if (code != len) + throw USARTException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); +} + void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) { int bytes_avail, code; @@ -102,13 +111,11 @@ void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); } -void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) +void USART::drop(uint8_t len) { - int code = write(file_desc, buffer + offset, len); - if (code != len) - throw USARTException( - std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + - ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); + // Kann bestimmt noch eleganter gelöst werden + uint8_t dummy[len]; + receive(&dummy[0], 0, len); } uint32_t USART::getBaudrate() diff --git a/control/src/drv/usart.cpp.orig b/control/src/drv/usart.cpp.orig new file mode 100644 index 0000000..f523be0 --- /dev/null +++ b/control/src/drv/usart.cpp.orig @@ -0,0 +1,139 @@ +#include +#include "usart.h" + +USART::~USART() +{ + closeDevice(); +} + +void USART::openDevice(std::string device) +{ + // Benutze blockierenden Modus + file_desc = open(device.c_str(), O_RDWR | O_NOCTTY);// | O_NDELAY + if (file_desc <= 0) + throw USARTException("Fehler beim Öffnen des Gerätes"); + + struct termios options; + int code = tcgetattr(file_desc, &options); + if (code) + throw USARTException("Fehler beim Lesen der Geräteparameter"); + + options.c_cflag = CS8 | CLOCAL | CREAD; + options.c_iflag = IGNPAR; + options.c_oflag = 0; + options.c_lflag = 0; + options.c_cc[VMIN] = 0; + options.c_cc[VTIME] = timeout; + code = cfsetspeed(&options, baudrate); + if (code) + throw USARTException("Fehler beim Setzen der Baudrate"); + + code = tcsetattr(file_desc, TCSANOW, &options); + if (code) + throw USARTException("Fehler beim Setzen der Geräteparameter"); + + code = fcntl(file_desc, F_SETFL, 0); // blockierender Modus + if (code) + throw USARTException("Fehler beim Aktivieren des blockierenden Modus'"); + + clearOutputBuffer(); + clearInputBuffer(); +} + +void USART::closeDevice() +{ + if (file_desc > 0) + { + int code = close(file_desc); + if (code) + throw USARTException("Fehler beim Schließen des Gerätes"); + file_desc = -1; + } +} + +void USART::clearInputBuffer() +{ + int code = tcflush(file_desc, TCIFLUSH); + if (code) + throw USARTException("Fehler beim Leeren des Eingangspuffers"); +} + +void USART::clearOutputBuffer() +{ + int code = tcflush(file_desc, TCOFLUSH); + if (code) + throw USARTException("Fehler beim Leeren des Ausgangspuffers"); +} + +void USART::flushOutputBuffer() +{ + int code = tcdrain(file_desc); + if (code) + throw USARTException("Fehler beim Versenden des Ausgangspuffers"); +} + +void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len) +{ + int code = write(file_desc, buffer + offset, len); + if (code != len) + throw USARTException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); +} + +void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len) +{ + int bytes_avail, code; + auto start = std::chrono::steady_clock::now(); + auto end = std::chrono::steady_clock::now(); + do + { + code = ioctl(file_desc, FIONREAD, &bytes_avail); + if (code) + throw USARTException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + ")"); + + end = std::chrono::steady_clock::now(); + long elapsed = + std::chrono::duration_cast(end - start).count() / 100; // in Dezisekunden + if (elapsed >= timeout) + throw TimeoutException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + std::to_string(elapsed) + " / " + std::to_string(timeout) + " ds"); + } + while (bytes_avail < len); + + code = read(file_desc, buffer + offset, len); + if (code != len) + throw USARTException( + std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) + + ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")"); +} + +void USART::drop(uint8_t len) +{ + // Kann bestimmt noch eleganter gelöst werden + uint8_t dummy[len]; + receive(&dummy[0], 0, len); +} + +uint32_t USART::getBaudrate() +{ + return baudrate; +} + +uint8_t USART::getTimeout() +{ + return timeout; +} + +void USART::setBaudrate(uint32_t baudrate) +{ + this->baudrate = baudrate; +} + +void USART::setTimeout(uint8_t timeout) +{ + this->timeout = timeout; +} diff --git a/control/src/drv/usart.h b/control/src/drv/usart.h index 752f945..8ba889c 100644 --- a/control/src/drv/usart.h +++ b/control/src/drv/usart.h @@ -88,6 +88,13 @@ public: */ void receive(uint8_t *buffer, uint16_t offset, uint8_t len); + /** + * Receives n bytes but discards them + * \param len count of bytes to receive + * \throws USARTException + */ + void drop(uint8_t len); + /*************************************/ diff --git a/docs/html/CMakeCCompilerId_8c_source.html b/docs/html/CMakeCCompilerId_8c_source.html index 7c52db9..dc288c6 100644 --- a/docs/html/CMakeCCompilerId_8c_source.html +++ b/docs/html/CMakeCCompilerId_8c_source.html @@ -73,7 +73,7 @@ $(function() {
    1 #ifdef __cplusplus
    2 # error "A C++ compiler has been selected for C."
    3 #endif
    4 
    5 #if defined(__18CXX)
    6 # define ID_VOID_MAIN
    7 #endif
    8 #if defined(__CLASSIC_C__)
    9 /* cv-qualifiers did not exist in K&R C */
    10 # define const
    11 # define volatile
    12 #endif
    13 
    14 
    15 /* Version number components: V=Version, R=Revision, P=Patch
    16  Version date components: YYYY=Year, MM=Month, DD=Day */
    17 
    18 #if defined(__INTEL_COMPILER) || defined(__ICC)
    19 # define COMPILER_ID "Intel"
    20 # if defined(_MSC_VER)
    21 # define SIMULATE_ID "MSVC"
    22 # endif
    23 /* __INTEL_COMPILER = VRP */
    24 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
    25 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
    26 # if defined(__INTEL_COMPILER_UPDATE)
    27 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
    28 # else
    29 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
    30 # endif
    31 # if defined(__INTEL_COMPILER_BUILD_DATE)
    32 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
    33 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
    34 # endif
    35 # if defined(_MSC_VER)
    36 /* _MSC_VER = VVRR */
    37 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    38 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    39 # endif
    40 
    41 #elif defined(__PATHCC__)
    42 # define COMPILER_ID "PathScale"
    43 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
    44 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
    45 # if defined(__PATHCC_PATCHLEVEL__)
    46 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
    47 # endif
    48 
    49 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
    50 # define COMPILER_ID "Embarcadero"
    51 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
    52 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
    53 # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
    54 
    55 #elif defined(__BORLANDC__)
    56 # define COMPILER_ID "Borland"
    57 /* __BORLANDC__ = 0xVRR */
    58 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
    59 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
    60 
    61 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
    62 # define COMPILER_ID "Watcom"
    63 /* __WATCOMC__ = VVRR */
    64 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
    65 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    66 # if (__WATCOMC__ % 10) > 0
    67 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    68 # endif
    69 
    70 #elif defined(__WATCOMC__)
    71 # define COMPILER_ID "OpenWatcom"
    72 /* __WATCOMC__ = VVRP + 1100 */
    73 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
    74 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    75 # if (__WATCOMC__ % 10) > 0
    76 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    77 # endif
    78 
    79 #elif defined(__SUNPRO_C)
    80 # define COMPILER_ID "SunPro"
    81 # if __SUNPRO_C >= 0x5100
    82 /* __SUNPRO_C = 0xVRRP */
    83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12)
    84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF)
    85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
    86 # else
    87 /* __SUNPRO_CC = 0xVRP */
    88 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8)
    89 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF)
    90 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
    91 # endif
    92 
    93 #elif defined(__HP_cc)
    94 # define COMPILER_ID "HP"
    95 /* __HP_cc = VVRRPP */
    96 # define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000)
    97 # define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100)
    98 # define COMPILER_VERSION_PATCH DEC(__HP_cc % 100)
    99 
    100 #elif defined(__DECC)
    101 # define COMPILER_ID "Compaq"
    102 /* __DECC_VER = VVRRTPPPP */
    103 # define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000)
    104 # define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100)
    105 # define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000)
    106 
    107 #elif defined(__IBMC__) && defined(__COMPILER_VER__)
    108 # define COMPILER_ID "zOS"
    109 # if defined(__ibmxl__)
    110 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    111 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    112 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    113 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    114 # else
    115 /* __IBMC__ = VRP */
    116 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    117 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    118 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    119 # endif
    120 
    121 
    122 #elif defined(__ibmxl__) || (defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800)
    123 # define COMPILER_ID "XL"
    124 # if defined(__ibmxl__)
    125 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    126 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    127 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    128 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    129 # else
    130 /* __IBMC__ = VRP */
    131 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    132 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    133 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    134 # endif
    135 
    136 
    137 #elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800
    138 # define COMPILER_ID "VisualAge"
    139 # if defined(__ibmxl__)
    140 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    141 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    142 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    143 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    144 # else
    145 /* __IBMC__ = VRP */
    146 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
    147 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
    148 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
    149 # endif
    150 
    151 
    152 #elif defined(__PGI)
    153 # define COMPILER_ID "PGI"
    154 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
    155 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
    156 # if defined(__PGIC_PATCHLEVEL__)
    157 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
    158 # endif
    159 
    160 #elif defined(_CRAYC)
    161 # define COMPILER_ID "Cray"
    162 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
    163 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
    164 
    165 #elif defined(__TI_COMPILER_VERSION__)
    166 # define COMPILER_ID "TI"
    167 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
    168 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
    169 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
    170 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
    171 
    172 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
    173 # define COMPILER_ID "Fujitsu"
    174 
    175 #elif defined(__ghs__)
    176 # define COMPILER_ID "GHS"
    177 /* __GHS_VERSION_NUMBER = VVVVRP */
    178 # ifdef __GHS_VERSION_NUMBER
    179 # define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
    180 # define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
    181 # define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
    182 # endif
    183 
    184 #elif defined(__TINYC__)
    185 # define COMPILER_ID "TinyCC"
    186 
    187 #elif defined(__BCC__)
    188 # define COMPILER_ID "Bruce"
    189 
    190 #elif defined(__SCO_VERSION__)
    191 # define COMPILER_ID "SCO"
    192 
    193 #elif defined(__ARMCC_VERSION) && !defined(__clang__)
    194 # define COMPILER_ID "ARMCC"
    195 #if __ARMCC_VERSION >= 1000000
    196 /* __ARMCC_VERSION = VRRPPPP */
    197 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
    198 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
    199 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    200 #else
    201 /* __ARMCC_VERSION = VRPPPP */
    202 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
    203 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
    204 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    205 #endif
    206 
    207 
    208 #elif defined(__clang__) && defined(__apple_build_version__)
    209 # define COMPILER_ID "AppleClang"
    210 # if defined(_MSC_VER)
    211 # define SIMULATE_ID "MSVC"
    212 # endif
    213 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    214 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    215 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    216 # if defined(_MSC_VER)
    217 /* _MSC_VER = VVRR */
    218 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    219 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    220 # endif
    221 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
    222 
    223 #elif defined(__clang__)
    224 # define COMPILER_ID "Clang"
    225 # if defined(_MSC_VER)
    226 # define SIMULATE_ID "MSVC"
    227 # endif
    228 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    229 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    230 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    231 # if defined(_MSC_VER)
    232 /* _MSC_VER = VVRR */
    233 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    234 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    235 # endif
    236 
    237 #elif defined(__GNUC__)
    238 # define COMPILER_ID "GNU"
    239 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
    240 # if defined(__GNUC_MINOR__)
    241 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
    242 # endif
    243 # if defined(__GNUC_PATCHLEVEL__)
    244 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
    245 # endif
    246 
    247 #elif defined(_MSC_VER)
    248 # define COMPILER_ID "MSVC"
    249 /* _MSC_VER = VVRR */
    250 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
    251 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
    252 # if defined(_MSC_FULL_VER)
    253 # if _MSC_VER >= 1400
    254 /* _MSC_FULL_VER = VVRRPPPPP */
    255 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
    256 # else
    257 /* _MSC_FULL_VER = VVRRPPPP */
    258 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
    259 # endif
    260 # endif
    261 # if defined(_MSC_BUILD)
    262 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
    263 # endif
    264 
    265 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
    266 # define COMPILER_ID "ADSP"
    267 #if defined(__VISUALDSPVERSION__)
    268 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
    269 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
    270 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
    271 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
    272 #endif
    273 
    274 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    275 # define COMPILER_ID "IAR"
    276 # if defined(__VER__) && defined(__ICCARM__)
    277 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
    278 # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
    279 # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
    280 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    281 # elif defined(__VER__) && defined(__ICCAVR__)
    282 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
    283 # define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
    284 # define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
    285 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    286 # endif
    287 
    288 #elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC)
    289 # define COMPILER_ID "SDCC"
    290 # if defined(__SDCC_VERSION_MAJOR)
    291 # define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR)
    292 # define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR)
    293 # define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH)
    294 # else
    295 /* SDCC = VRP */
    296 # define COMPILER_VERSION_MAJOR DEC(SDCC/100)
    297 # define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10)
    298 # define COMPILER_VERSION_PATCH DEC(SDCC % 10)
    299 # endif
    300 
    301 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
    302 # define COMPILER_ID "MIPSpro"
    303 # if defined(_SGI_COMPILER_VERSION)
    304 /* _SGI_COMPILER_VERSION = VRP */
    305 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
    306 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
    307 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
    308 # else
    309 /* _COMPILER_VERSION = VRP */
    310 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
    311 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
    312 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
    313 # endif
    314 
    315 
    316 /* These compilers are either not known or too old to define an
    317  identification macro. Try to identify the platform and guess that
    318  it is the native compiler. */
    319 #elif defined(__hpux) || defined(__hpua)
    320 # define COMPILER_ID "HP"
    321 
    322 #else /* unknown compiler */
    323 # define COMPILER_ID ""
    324 #endif
    325 
    326 /* Construct the string literal in pieces to prevent the source from
    327  getting matched. Store it in a pointer rather than an array
    328  because some compilers will just produce instructions to fill the
    329  array rather than assigning a pointer to a static array. */
    330 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
    331 #ifdef SIMULATE_ID
    332 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
    333 #endif
    334 
    335 #ifdef __QNXNTO__
    336 char const* qnxnto = "INFO" ":" "qnxnto[]";
    337 #endif
    338 
    339 #if defined(__CRAYXE) || defined(__CRAYXC)
    340 char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
    341 #endif
    342 
    343 #define STRINGIFY_HELPER(X) #X
    344 #define STRINGIFY(X) STRINGIFY_HELPER(X)
    345 
    346 /* Identify known platforms by name. */
    347 #if defined(__linux) || defined(__linux__) || defined(linux)
    348 # define PLATFORM_ID "Linux"
    349 
    350 #elif defined(__CYGWIN__)
    351 # define PLATFORM_ID "Cygwin"
    352 
    353 #elif defined(__MINGW32__)
    354 # define PLATFORM_ID "MinGW"
    355 
    356 #elif defined(__APPLE__)
    357 # define PLATFORM_ID "Darwin"
    358 
    359 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
    360 # define PLATFORM_ID "Windows"
    361 
    362 #elif defined(__FreeBSD__) || defined(__FreeBSD)
    363 # define PLATFORM_ID "FreeBSD"
    364 
    365 #elif defined(__NetBSD__) || defined(__NetBSD)
    366 # define PLATFORM_ID "NetBSD"
    367 
    368 #elif defined(__OpenBSD__) || defined(__OPENBSD)
    369 # define PLATFORM_ID "OpenBSD"
    370 
    371 #elif defined(__sun) || defined(sun)
    372 # define PLATFORM_ID "SunOS"
    373 
    374 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
    375 # define PLATFORM_ID "AIX"
    376 
    377 #elif defined(__hpux) || defined(__hpux__)
    378 # define PLATFORM_ID "HP-UX"
    379 
    380 #elif defined(__HAIKU__)
    381 # define PLATFORM_ID "Haiku"
    382 
    383 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
    384 # define PLATFORM_ID "BeOS"
    385 
    386 #elif defined(__QNX__) || defined(__QNXNTO__)
    387 # define PLATFORM_ID "QNX"
    388 
    389 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
    390 # define PLATFORM_ID "Tru64"
    391 
    392 #elif defined(__riscos) || defined(__riscos__)
    393 # define PLATFORM_ID "RISCos"
    394 
    395 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
    396 # define PLATFORM_ID "SINIX"
    397 
    398 #elif defined(__UNIX_SV__)
    399 # define PLATFORM_ID "UNIX_SV"
    400 
    401 #elif defined(__bsdos__)
    402 # define PLATFORM_ID "BSDOS"
    403 
    404 #elif defined(_MPRAS) || defined(MPRAS)
    405 # define PLATFORM_ID "MP-RAS"
    406 
    407 #elif defined(__osf) || defined(__osf__)
    408 # define PLATFORM_ID "OSF1"
    409 
    410 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
    411 # define PLATFORM_ID "SCO_SV"
    412 
    413 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
    414 # define PLATFORM_ID "ULTRIX"
    415 
    416 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
    417 # define PLATFORM_ID "Xenix"
    418 
    419 #elif defined(__WATCOMC__)
    420 # if defined(__LINUX__)
    421 # define PLATFORM_ID "Linux"
    422 
    423 # elif defined(__DOS__)
    424 # define PLATFORM_ID "DOS"
    425 
    426 # elif defined(__OS2__)
    427 # define PLATFORM_ID "OS2"
    428 
    429 # elif defined(__WINDOWS__)
    430 # define PLATFORM_ID "Windows3x"
    431 
    432 # else /* unknown platform */
    433 # define PLATFORM_ID
    434 # endif
    435 
    436 #elif defined(__INTEGRITY)
    437 # if defined(INT_178B)
    438 # define PLATFORM_ID "Integrity178"
    439 
    440 # else /* regular Integrity */
    441 # define PLATFORM_ID "Integrity"
    442 # endif
    443 
    444 #else /* unknown platform */
    445 # define PLATFORM_ID
    446 
    447 #endif
    448 
    449 /* For windows compilers MSVC and Intel we can determine
    450  the architecture of the compiler being used. This is because
    451  the compilers do not have flags that can change the architecture,
    452  but rather depend on which compiler is being used
    453 */
    454 #if defined(_WIN32) && defined(_MSC_VER)
    455 # if defined(_M_IA64)
    456 # define ARCHITECTURE_ID "IA64"
    457 
    458 # elif defined(_M_X64) || defined(_M_AMD64)
    459 # define ARCHITECTURE_ID "x64"
    460 
    461 # elif defined(_M_IX86)
    462 # define ARCHITECTURE_ID "X86"
    463 
    464 # elif defined(_M_ARM64)
    465 # define ARCHITECTURE_ID "ARM64"
    466 
    467 # elif defined(_M_ARM)
    468 # if _M_ARM == 4
    469 # define ARCHITECTURE_ID "ARMV4I"
    470 # elif _M_ARM == 5
    471 # define ARCHITECTURE_ID "ARMV5I"
    472 # else
    473 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
    474 # endif
    475 
    476 # elif defined(_M_MIPS)
    477 # define ARCHITECTURE_ID "MIPS"
    478 
    479 # elif defined(_M_SH)
    480 # define ARCHITECTURE_ID "SHx"
    481 
    482 # else /* unknown architecture */
    483 # define ARCHITECTURE_ID ""
    484 # endif
    485 
    486 #elif defined(__WATCOMC__)
    487 # if defined(_M_I86)
    488 # define ARCHITECTURE_ID "I86"
    489 
    490 # elif defined(_M_IX86)
    491 # define ARCHITECTURE_ID "X86"
    492 
    493 # else /* unknown architecture */
    494 # define ARCHITECTURE_ID ""
    495 # endif
    496 
    497 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    498 # if defined(__ICCARM__)
    499 # define ARCHITECTURE_ID "ARM"
    500 
    501 # elif defined(__ICCAVR__)
    502 # define ARCHITECTURE_ID "AVR"
    503 
    504 # else /* unknown architecture */
    505 # define ARCHITECTURE_ID ""
    506 # endif
    507 
    508 #elif defined(__ghs__)
    509 # if defined(__PPC64__)
    510 # define ARCHITECTURE_ID "PPC64"
    511 
    512 # elif defined(__ppc__)
    513 # define ARCHITECTURE_ID "PPC"
    514 
    515 # elif defined(__ARM__)
    516 # define ARCHITECTURE_ID "ARM"
    517 
    518 # elif defined(__x86_64__)
    519 # define ARCHITECTURE_ID "x64"
    520 
    521 # elif defined(__i386__)
    522 # define ARCHITECTURE_ID "X86"
    523 
    524 # else /* unknown architecture */
    525 # define ARCHITECTURE_ID ""
    526 # endif
    527 #else
    528 # define ARCHITECTURE_ID
    529 #endif
    530 
    531 /* Convert integer to decimal digit literals. */
    532 #define DEC(n) \
    533  ('0' + (((n) / 10000000)%10)), \
    534  ('0' + (((n) / 1000000)%10)), \
    535  ('0' + (((n) / 100000)%10)), \
    536  ('0' + (((n) / 10000)%10)), \
    537  ('0' + (((n) / 1000)%10)), \
    538  ('0' + (((n) / 100)%10)), \
    539  ('0' + (((n) / 10)%10)), \
    540  ('0' + ((n) % 10))
    541 
    542 /* Convert integer to hex digit literals. */
    543 #define HEX(n) \
    544  ('0' + ((n)>>28 & 0xF)), \
    545  ('0' + ((n)>>24 & 0xF)), \
    546  ('0' + ((n)>>20 & 0xF)), \
    547  ('0' + ((n)>>16 & 0xF)), \
    548  ('0' + ((n)>>12 & 0xF)), \
    549  ('0' + ((n)>>8 & 0xF)), \
    550  ('0' + ((n)>>4 & 0xF)), \
    551  ('0' + ((n) & 0xF))
    552 
    553 /* Construct a string literal encoding the version number components. */
    554 #ifdef COMPILER_VERSION_MAJOR
    555 char const info_version[] =
    556 {
    557  'I', 'N', 'F', 'O', ':',
    558  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
    559  COMPILER_VERSION_MAJOR,
    560 # ifdef COMPILER_VERSION_MINOR
    561  '.', COMPILER_VERSION_MINOR,
    562 # ifdef COMPILER_VERSION_PATCH
    563  '.', COMPILER_VERSION_PATCH,
    564 # ifdef COMPILER_VERSION_TWEAK
    565  '.', COMPILER_VERSION_TWEAK,
    566 # endif
    567 # endif
    568 # endif
    569  ']','\0'
    570 };
    571 #endif
    572 
    573 /* Construct a string literal encoding the internal version number. */
    574 #ifdef COMPILER_VERSION_INTERNAL
    575 char const info_version_internal[] =
    576 {
    577  'I', 'N', 'F', 'O', ':',
    578  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
    579  'i','n','t','e','r','n','a','l','[',
    580  COMPILER_VERSION_INTERNAL,']','\0'
    581 };
    582 #endif
    583 
    584 /* Construct a string literal encoding the version number components. */
    585 #ifdef SIMULATE_VERSION_MAJOR
    586 char const info_simulate_version[] =
    587 {
    588  'I', 'N', 'F', 'O', ':',
    589  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
    590  SIMULATE_VERSION_MAJOR,
    591 # ifdef SIMULATE_VERSION_MINOR
    592  '.', SIMULATE_VERSION_MINOR,
    593 # ifdef SIMULATE_VERSION_PATCH
    594  '.', SIMULATE_VERSION_PATCH,
    595 # ifdef SIMULATE_VERSION_TWEAK
    596  '.', SIMULATE_VERSION_TWEAK,
    597 # endif
    598 # endif
    599 # endif
    600  ']','\0'
    601 };
    602 #endif
    603 
    604 /* Construct the string literal in pieces to prevent the source from
    605  getting matched. Store it in a pointer rather than an array
    606  because some compilers will just produce instructions to fill the
    607  array rather than assigning a pointer to a static array. */
    608 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
    609 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
    610 
    611 
    612 
    613 
    614 #if !defined(__STDC__)
    615 # if (defined(_MSC_VER) && !defined(__clang__)) \
    616  || (defined(__ibmxl__) || defined(__IBMC__))
    617 # define C_DIALECT "90"
    618 # else
    619 # define C_DIALECT
    620 # endif
    621 #elif __STDC_VERSION__ >= 201000L
    622 # define C_DIALECT "11"
    623 #elif __STDC_VERSION__ >= 199901L
    624 # define C_DIALECT "99"
    625 #else
    626 # define C_DIALECT "90"
    627 #endif
    628 const char* info_language_dialect_default =
    629  "INFO" ":" "dialect_default[" C_DIALECT "]";
    630 
    631 /*--------------------------------------------------------------------------*/
    632 
    633 #ifdef ID_VOID_MAIN
    634 void main() {}
    635 #else
    636 # if defined(__CLASSIC_C__)
    637 int main(argc, argv) int argc;
    638 char *argv[];
    639 # else
    640 int main(int argc, char* argv[])
    641 # endif
    642 {
    643  int require = 0;
    644  require += info_compiler[argc];
    645  require += info_platform[argc];
    646  require += info_arch[argc];
    647 #ifdef COMPILER_VERSION_MAJOR
    648  require += info_version[argc];
    649 #endif
    650 #ifdef COMPILER_VERSION_INTERNAL
    651  require += info_version_internal[argc];
    652 #endif
    653 #ifdef SIMULATE_ID
    654  require += info_simulate[argc];
    655 #endif
    656 #ifdef SIMULATE_VERSION_MAJOR
    657  require += info_simulate_version[argc];
    658 #endif
    659 #if defined(__CRAYXE) || defined(__CRAYXC)
    660  require += info_cray[argc];
    661 #endif
    662  require += info_language_dialect_default[argc];
    663  (void)argv;
    664  return require;
    665 }
    666 #endif
    diff --git a/docs/html/CMakeCXXCompilerId_8cpp_source.html b/docs/html/CMakeCXXCompilerId_8cpp_source.html index 3389bb2..8805234 100644 --- a/docs/html/CMakeCXXCompilerId_8cpp_source.html +++ b/docs/html/CMakeCXXCompilerId_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
    1 /* This source file must have a .cpp extension so that all C++ compilers
    2  recognize the extension without flags. Borland does not know .cxx for
    3  example. */
    4 #ifndef __cplusplus
    5 # error "A C compiler has been selected for C++."
    6 #endif
    7 
    8 
    9 /* Version number components: V=Version, R=Revision, P=Patch
    10  Version date components: YYYY=Year, MM=Month, DD=Day */
    11 
    12 #if defined(__COMO__)
    13 # define COMPILER_ID "Comeau"
    14 /* __COMO_VERSION__ = VRR */
    15 # define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
    16 # define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
    17 
    18 #elif defined(__INTEL_COMPILER) || defined(__ICC)
    19 # define COMPILER_ID "Intel"
    20 # if defined(_MSC_VER)
    21 # define SIMULATE_ID "MSVC"
    22 # endif
    23 /* __INTEL_COMPILER = VRP */
    24 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
    25 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
    26 # if defined(__INTEL_COMPILER_UPDATE)
    27 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
    28 # else
    29 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
    30 # endif
    31 # if defined(__INTEL_COMPILER_BUILD_DATE)
    32 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
    33 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
    34 # endif
    35 # if defined(_MSC_VER)
    36 /* _MSC_VER = VVRR */
    37 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    38 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    39 # endif
    40 
    41 #elif defined(__PATHCC__)
    42 # define COMPILER_ID "PathScale"
    43 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
    44 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
    45 # if defined(__PATHCC_PATCHLEVEL__)
    46 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
    47 # endif
    48 
    49 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
    50 # define COMPILER_ID "Embarcadero"
    51 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
    52 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
    53 # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
    54 
    55 #elif defined(__BORLANDC__)
    56 # define COMPILER_ID "Borland"
    57 /* __BORLANDC__ = 0xVRR */
    58 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
    59 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
    60 
    61 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
    62 # define COMPILER_ID "Watcom"
    63 /* __WATCOMC__ = VVRR */
    64 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
    65 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    66 # if (__WATCOMC__ % 10) > 0
    67 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    68 # endif
    69 
    70 #elif defined(__WATCOMC__)
    71 # define COMPILER_ID "OpenWatcom"
    72 /* __WATCOMC__ = VVRP + 1100 */
    73 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
    74 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
    75 # if (__WATCOMC__ % 10) > 0
    76 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
    77 # endif
    78 
    79 #elif defined(__SUNPRO_CC)
    80 # define COMPILER_ID "SunPro"
    81 # if __SUNPRO_CC >= 0x5100
    82 /* __SUNPRO_CC = 0xVRRP */
    83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
    84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
    85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
    86 # else
    87 /* __SUNPRO_CC = 0xVRP */
    88 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
    89 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
    90 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
    91 # endif
    92 
    93 #elif defined(__HP_aCC)
    94 # define COMPILER_ID "HP"
    95 /* __HP_aCC = VVRRPP */
    96 # define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
    97 # define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
    98 # define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
    99 
    100 #elif defined(__DECCXX)
    101 # define COMPILER_ID "Compaq"
    102 /* __DECCXX_VER = VVRRTPPPP */
    103 # define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
    104 # define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100)
    105 # define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
    106 
    107 #elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
    108 # define COMPILER_ID "zOS"
    109 # if defined(__ibmxl__)
    110 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    111 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    112 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    113 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    114 # else
    115 /* __IBMCPP__ = VRP */
    116 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    117 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    118 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    119 # endif
    120 
    121 
    122 #elif defined(__ibmxl__) || (defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800)
    123 # define COMPILER_ID "XL"
    124 # if defined(__ibmxl__)
    125 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    126 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    127 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    128 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    129 # else
    130 /* __IBMCPP__ = VRP */
    131 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    132 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    133 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    134 # endif
    135 
    136 
    137 #elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
    138 # define COMPILER_ID "VisualAge"
    139 # if defined(__ibmxl__)
    140 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
    141 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
    142 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
    143 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
    144 # else
    145 /* __IBMCPP__ = VRP */
    146 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
    147 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
    148 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
    149 # endif
    150 
    151 
    152 #elif defined(__PGI)
    153 # define COMPILER_ID "PGI"
    154 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
    155 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
    156 # if defined(__PGIC_PATCHLEVEL__)
    157 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
    158 # endif
    159 
    160 #elif defined(_CRAYC)
    161 # define COMPILER_ID "Cray"
    162 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
    163 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
    164 
    165 #elif defined(__TI_COMPILER_VERSION__)
    166 # define COMPILER_ID "TI"
    167 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
    168 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
    169 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
    170 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
    171 
    172 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
    173 # define COMPILER_ID "Fujitsu"
    174 
    175 #elif defined(__ghs__)
    176 # define COMPILER_ID "GHS"
    177 /* __GHS_VERSION_NUMBER = VVVVRP */
    178 # ifdef __GHS_VERSION_NUMBER
    179 # define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
    180 # define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
    181 # define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
    182 # endif
    183 
    184 #elif defined(__SCO_VERSION__)
    185 # define COMPILER_ID "SCO"
    186 
    187 #elif defined(__ARMCC_VERSION) && !defined(__clang__)
    188 # define COMPILER_ID "ARMCC"
    189 #if __ARMCC_VERSION >= 1000000
    190 /* __ARMCC_VERSION = VRRPPPP */
    191 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
    192 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
    193 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    194 #else
    195 /* __ARMCC_VERSION = VRPPPP */
    196 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
    197 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
    198 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
    199 #endif
    200 
    201 
    202 #elif defined(__clang__) && defined(__apple_build_version__)
    203 # define COMPILER_ID "AppleClang"
    204 # if defined(_MSC_VER)
    205 # define SIMULATE_ID "MSVC"
    206 # endif
    207 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    208 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    209 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    210 # if defined(_MSC_VER)
    211 /* _MSC_VER = VVRR */
    212 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    213 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    214 # endif
    215 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
    216 
    217 #elif defined(__clang__)
    218 # define COMPILER_ID "Clang"
    219 # if defined(_MSC_VER)
    220 # define SIMULATE_ID "MSVC"
    221 # endif
    222 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
    223 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
    224 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
    225 # if defined(_MSC_VER)
    226 /* _MSC_VER = VVRR */
    227 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
    228 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
    229 # endif
    230 
    231 #elif defined(__GNUC__) || defined(__GNUG__)
    232 # define COMPILER_ID "GNU"
    233 # if defined(__GNUC__)
    234 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
    235 # else
    236 # define COMPILER_VERSION_MAJOR DEC(__GNUG__)
    237 # endif
    238 # if defined(__GNUC_MINOR__)
    239 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
    240 # endif
    241 # if defined(__GNUC_PATCHLEVEL__)
    242 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
    243 # endif
    244 
    245 #elif defined(_MSC_VER)
    246 # define COMPILER_ID "MSVC"
    247 /* _MSC_VER = VVRR */
    248 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
    249 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
    250 # if defined(_MSC_FULL_VER)
    251 # if _MSC_VER >= 1400
    252 /* _MSC_FULL_VER = VVRRPPPPP */
    253 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
    254 # else
    255 /* _MSC_FULL_VER = VVRRPPPP */
    256 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
    257 # endif
    258 # endif
    259 # if defined(_MSC_BUILD)
    260 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
    261 # endif
    262 
    263 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
    264 # define COMPILER_ID "ADSP"
    265 #if defined(__VISUALDSPVERSION__)
    266 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
    267 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
    268 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
    269 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
    270 #endif
    271 
    272 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    273 # define COMPILER_ID "IAR"
    274 # if defined(__VER__) && defined(__ICCARM__)
    275 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
    276 # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
    277 # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
    278 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    279 # elif defined(__VER__) && defined(__ICCAVR__)
    280 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
    281 # define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
    282 # define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
    283 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
    284 # endif
    285 
    286 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
    287 # define COMPILER_ID "MIPSpro"
    288 # if defined(_SGI_COMPILER_VERSION)
    289 /* _SGI_COMPILER_VERSION = VRP */
    290 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
    291 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
    292 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
    293 # else
    294 /* _COMPILER_VERSION = VRP */
    295 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
    296 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
    297 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
    298 # endif
    299 
    300 
    301 /* These compilers are either not known or too old to define an
    302  identification macro. Try to identify the platform and guess that
    303  it is the native compiler. */
    304 #elif defined(__hpux) || defined(__hpua)
    305 # define COMPILER_ID "HP"
    306 
    307 #else /* unknown compiler */
    308 # define COMPILER_ID ""
    309 #endif
    310 
    311 /* Construct the string literal in pieces to prevent the source from
    312  getting matched. Store it in a pointer rather than an array
    313  because some compilers will just produce instructions to fill the
    314  array rather than assigning a pointer to a static array. */
    315 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
    316 #ifdef SIMULATE_ID
    317 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
    318 #endif
    319 
    320 #ifdef __QNXNTO__
    321 char const* qnxnto = "INFO" ":" "qnxnto[]";
    322 #endif
    323 
    324 #if defined(__CRAYXE) || defined(__CRAYXC)
    325 char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
    326 #endif
    327 
    328 #define STRINGIFY_HELPER(X) #X
    329 #define STRINGIFY(X) STRINGIFY_HELPER(X)
    330 
    331 /* Identify known platforms by name. */
    332 #if defined(__linux) || defined(__linux__) || defined(linux)
    333 # define PLATFORM_ID "Linux"
    334 
    335 #elif defined(__CYGWIN__)
    336 # define PLATFORM_ID "Cygwin"
    337 
    338 #elif defined(__MINGW32__)
    339 # define PLATFORM_ID "MinGW"
    340 
    341 #elif defined(__APPLE__)
    342 # define PLATFORM_ID "Darwin"
    343 
    344 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
    345 # define PLATFORM_ID "Windows"
    346 
    347 #elif defined(__FreeBSD__) || defined(__FreeBSD)
    348 # define PLATFORM_ID "FreeBSD"
    349 
    350 #elif defined(__NetBSD__) || defined(__NetBSD)
    351 # define PLATFORM_ID "NetBSD"
    352 
    353 #elif defined(__OpenBSD__) || defined(__OPENBSD)
    354 # define PLATFORM_ID "OpenBSD"
    355 
    356 #elif defined(__sun) || defined(sun)
    357 # define PLATFORM_ID "SunOS"
    358 
    359 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
    360 # define PLATFORM_ID "AIX"
    361 
    362 #elif defined(__hpux) || defined(__hpux__)
    363 # define PLATFORM_ID "HP-UX"
    364 
    365 #elif defined(__HAIKU__)
    366 # define PLATFORM_ID "Haiku"
    367 
    368 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
    369 # define PLATFORM_ID "BeOS"
    370 
    371 #elif defined(__QNX__) || defined(__QNXNTO__)
    372 # define PLATFORM_ID "QNX"
    373 
    374 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
    375 # define PLATFORM_ID "Tru64"
    376 
    377 #elif defined(__riscos) || defined(__riscos__)
    378 # define PLATFORM_ID "RISCos"
    379 
    380 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
    381 # define PLATFORM_ID "SINIX"
    382 
    383 #elif defined(__UNIX_SV__)
    384 # define PLATFORM_ID "UNIX_SV"
    385 
    386 #elif defined(__bsdos__)
    387 # define PLATFORM_ID "BSDOS"
    388 
    389 #elif defined(_MPRAS) || defined(MPRAS)
    390 # define PLATFORM_ID "MP-RAS"
    391 
    392 #elif defined(__osf) || defined(__osf__)
    393 # define PLATFORM_ID "OSF1"
    394 
    395 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
    396 # define PLATFORM_ID "SCO_SV"
    397 
    398 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
    399 # define PLATFORM_ID "ULTRIX"
    400 
    401 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
    402 # define PLATFORM_ID "Xenix"
    403 
    404 #elif defined(__WATCOMC__)
    405 # if defined(__LINUX__)
    406 # define PLATFORM_ID "Linux"
    407 
    408 # elif defined(__DOS__)
    409 # define PLATFORM_ID "DOS"
    410 
    411 # elif defined(__OS2__)
    412 # define PLATFORM_ID "OS2"
    413 
    414 # elif defined(__WINDOWS__)
    415 # define PLATFORM_ID "Windows3x"
    416 
    417 # else /* unknown platform */
    418 # define PLATFORM_ID
    419 # endif
    420 
    421 #elif defined(__INTEGRITY)
    422 # if defined(INT_178B)
    423 # define PLATFORM_ID "Integrity178"
    424 
    425 # else /* regular Integrity */
    426 # define PLATFORM_ID "Integrity"
    427 # endif
    428 
    429 #else /* unknown platform */
    430 # define PLATFORM_ID
    431 
    432 #endif
    433 
    434 /* For windows compilers MSVC and Intel we can determine
    435  the architecture of the compiler being used. This is because
    436  the compilers do not have flags that can change the architecture,
    437  but rather depend on which compiler is being used
    438 */
    439 #if defined(_WIN32) && defined(_MSC_VER)
    440 # if defined(_M_IA64)
    441 # define ARCHITECTURE_ID "IA64"
    442 
    443 # elif defined(_M_X64) || defined(_M_AMD64)
    444 # define ARCHITECTURE_ID "x64"
    445 
    446 # elif defined(_M_IX86)
    447 # define ARCHITECTURE_ID "X86"
    448 
    449 # elif defined(_M_ARM64)
    450 # define ARCHITECTURE_ID "ARM64"
    451 
    452 # elif defined(_M_ARM)
    453 # if _M_ARM == 4
    454 # define ARCHITECTURE_ID "ARMV4I"
    455 # elif _M_ARM == 5
    456 # define ARCHITECTURE_ID "ARMV5I"
    457 # else
    458 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
    459 # endif
    460 
    461 # elif defined(_M_MIPS)
    462 # define ARCHITECTURE_ID "MIPS"
    463 
    464 # elif defined(_M_SH)
    465 # define ARCHITECTURE_ID "SHx"
    466 
    467 # else /* unknown architecture */
    468 # define ARCHITECTURE_ID ""
    469 # endif
    470 
    471 #elif defined(__WATCOMC__)
    472 # if defined(_M_I86)
    473 # define ARCHITECTURE_ID "I86"
    474 
    475 # elif defined(_M_IX86)
    476 # define ARCHITECTURE_ID "X86"
    477 
    478 # else /* unknown architecture */
    479 # define ARCHITECTURE_ID ""
    480 # endif
    481 
    482 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
    483 # if defined(__ICCARM__)
    484 # define ARCHITECTURE_ID "ARM"
    485 
    486 # elif defined(__ICCAVR__)
    487 # define ARCHITECTURE_ID "AVR"
    488 
    489 # else /* unknown architecture */
    490 # define ARCHITECTURE_ID ""
    491 # endif
    492 
    493 #elif defined(__ghs__)
    494 # if defined(__PPC64__)
    495 # define ARCHITECTURE_ID "PPC64"
    496 
    497 # elif defined(__ppc__)
    498 # define ARCHITECTURE_ID "PPC"
    499 
    500 # elif defined(__ARM__)
    501 # define ARCHITECTURE_ID "ARM"
    502 
    503 # elif defined(__x86_64__)
    504 # define ARCHITECTURE_ID "x64"
    505 
    506 # elif defined(__i386__)
    507 # define ARCHITECTURE_ID "X86"
    508 
    509 # else /* unknown architecture */
    510 # define ARCHITECTURE_ID ""
    511 # endif
    512 #else
    513 # define ARCHITECTURE_ID
    514 #endif
    515 
    516 /* Convert integer to decimal digit literals. */
    517 #define DEC(n) \
    518  ('0' + (((n) / 10000000)%10)), \
    519  ('0' + (((n) / 1000000)%10)), \
    520  ('0' + (((n) / 100000)%10)), \
    521  ('0' + (((n) / 10000)%10)), \
    522  ('0' + (((n) / 1000)%10)), \
    523  ('0' + (((n) / 100)%10)), \
    524  ('0' + (((n) / 10)%10)), \
    525  ('0' + ((n) % 10))
    526 
    527 /* Convert integer to hex digit literals. */
    528 #define HEX(n) \
    529  ('0' + ((n)>>28 & 0xF)), \
    530  ('0' + ((n)>>24 & 0xF)), \
    531  ('0' + ((n)>>20 & 0xF)), \
    532  ('0' + ((n)>>16 & 0xF)), \
    533  ('0' + ((n)>>12 & 0xF)), \
    534  ('0' + ((n)>>8 & 0xF)), \
    535  ('0' + ((n)>>4 & 0xF)), \
    536  ('0' + ((n) & 0xF))
    537 
    538 /* Construct a string literal encoding the version number components. */
    539 #ifdef COMPILER_VERSION_MAJOR
    540 char const info_version[] =
    541 {
    542  'I', 'N', 'F', 'O', ':',
    543  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
    544  COMPILER_VERSION_MAJOR,
    545 # ifdef COMPILER_VERSION_MINOR
    546  '.', COMPILER_VERSION_MINOR,
    547 # ifdef COMPILER_VERSION_PATCH
    548  '.', COMPILER_VERSION_PATCH,
    549 # ifdef COMPILER_VERSION_TWEAK
    550  '.', COMPILER_VERSION_TWEAK,
    551 # endif
    552 # endif
    553 # endif
    554  ']','\0'
    555 };
    556 #endif
    557 
    558 /* Construct a string literal encoding the internal version number. */
    559 #ifdef COMPILER_VERSION_INTERNAL
    560 char const info_version_internal[] =
    561 {
    562  'I', 'N', 'F', 'O', ':',
    563  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
    564  'i','n','t','e','r','n','a','l','[',
    565  COMPILER_VERSION_INTERNAL,']','\0'
    566 };
    567 #endif
    568 
    569 /* Construct a string literal encoding the version number components. */
    570 #ifdef SIMULATE_VERSION_MAJOR
    571 char const info_simulate_version[] =
    572 {
    573  'I', 'N', 'F', 'O', ':',
    574  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
    575  SIMULATE_VERSION_MAJOR,
    576 # ifdef SIMULATE_VERSION_MINOR
    577  '.', SIMULATE_VERSION_MINOR,
    578 # ifdef SIMULATE_VERSION_PATCH
    579  '.', SIMULATE_VERSION_PATCH,
    580 # ifdef SIMULATE_VERSION_TWEAK
    581  '.', SIMULATE_VERSION_TWEAK,
    582 # endif
    583 # endif
    584 # endif
    585  ']','\0'
    586 };
    587 #endif
    588 
    589 /* Construct the string literal in pieces to prevent the source from
    590  getting matched. Store it in a pointer rather than an array
    591  because some compilers will just produce instructions to fill the
    592  array rather than assigning a pointer to a static array. */
    593 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
    594 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
    595 
    596 
    597 
    598 
    599 #if defined(_MSC_VER) && defined(_MSVC_LANG)
    600 #define CXX_STD _MSVC_LANG
    601 #else
    602 #define CXX_STD __cplusplus
    603 #endif
    604 
    605 const char* info_language_dialect_default = "INFO" ":" "dialect_default["
    606 #if CXX_STD > 201703L
    607  "20"
    608 #elif CXX_STD >= 201703L
    609  "17"
    610 #elif CXX_STD >= 201402L
    611  "14"
    612 #elif CXX_STD >= 201103L
    613  "11"
    614 #else
    615  "98"
    616 #endif
    617  "]";
    618 
    619 /*--------------------------------------------------------------------------*/
    620 
    621 int main(int argc, char* argv[])
    622 {
    623  int require = 0;
    624  require += info_compiler[argc];
    625  require += info_platform[argc];
    626 #ifdef COMPILER_VERSION_MAJOR
    627  require += info_version[argc];
    628 #endif
    629 #ifdef COMPILER_VERSION_INTERNAL
    630  require += info_version_internal[argc];
    631 #endif
    632 #ifdef SIMULATE_ID
    633  require += info_simulate[argc];
    634 #endif
    635 #ifdef SIMULATE_VERSION_MAJOR
    636  require += info_simulate_version[argc];
    637 #endif
    638 #if defined(__CRAYXE) || defined(__CRAYXC)
    639  require += info_cray[argc];
    640 #endif
    641  require += info_language_dialect_default[argc];
    642  (void)argv;
    643  return require;
    644 }
    diff --git a/docs/html/annotated.html b/docs/html/annotated.html index c07dd4e..5954645 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -85,7 +85,7 @@ $(function() { diff --git a/docs/html/b15f_8cpp_source.html b/docs/html/b15f_8cpp_source.html index acfab44..78bcd55 100644 --- a/docs/html/b15f_8cpp_source.html +++ b/docs/html/b15f_8cpp_source.html @@ -70,48 +70,49 @@ $(function() {
    b15f.cpp
    -
    1 #include "b15f.h"
    2 
    3 B15F *B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while (device.find(' ') != std::string::npos || device.find('\n') != std::string::npos ||
    16  device.find('\t') != std::string::npos)
    17  device.pop_back();
    18 
    19  if (device.length() == 0)
    20  abort("Adapter nicht gefunden");
    21 
    22  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31  std::cout << PRE << "Teste Verbindung... " << std::flush;
    32  uint8_t tries = 3;
    33  while (tries--)
    34  {
    35  // verwerfe Daten, die µC noch hat
    36  //discard();
    37 
    38  if (!testConnection())
    39  continue;
    40 
    41  if (!testIntConv())
    42  continue;
    43 
    44  break;
    45  }
    46  if (tries == 0)
    47  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    48  std::cout << "OK" << std::endl;
    49 
    50 
    51  // Gib board info aus
    52  std::vector<std::string> info = getBoardInfo();
    53  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")"
    54  << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while (tries--)
    61  {
    63  discard();
    64 
    65  if (testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  uint8_t rq[] =
    77  {
    78  RQ_DISC
    79  };
    80 
    81  usart.clearOutputBuffer();
    82  for (uint8_t i = 0; i < 16; i++)
    83  {
    84  usart.transmit(&rq[0], 0, sizeof(rq)); // sende discard Befehl (verwerfe input)
    85  delay_ms(4);
    86  }
    87  usart.clearInputBuffer();
    88  }
    89  catch (std::exception &ex)
    90  {
    91  abort(ex);
    92  }
    93 }
    94 
    96 {
    97  // erzeuge zufälliges Byte
    98  srand(time(NULL));
    99  uint8_t dummy = rand() % 256;
    100 
    101  uint8_t rq[] =
    102  {
    103  RQ_TEST,
    104  dummy
    105  };
    106  usart.transmit(&rq[0], 0, sizeof(rq));
    107 
    108  uint8_t aw[2];
    109  usart.receive(&aw[0], 0, sizeof(aw));
    110 
    111  return aw[0] == MSG_OK && aw[1] == dummy;
    112 }
    113 
    115 {
    116  srand(time(NULL));
    117  uint16_t dummy = rand() % (0xFFFF / 3);
    118 
    119  uint8_t rq[] =
    120  {
    121  RQ_INT,
    122  static_cast<uint8_t >(dummy & 0xFF),
    123  static_cast<uint8_t >(dummy >> 8)
    124  };
    125  usart.transmit(&rq[0], 0, sizeof(rq));
    126 
    127  uint16_t aw;
    128  usart.receive(reinterpret_cast<uint8_t*>(&aw), 0, sizeof(aw));
    129 
    130  return aw == dummy * 3;
    131 }
    132 
    133 
    134 std::vector<std::string> B15F::getBoardInfo(void)
    135 {
    136  std::vector<std::string> info;
    137 
    138  uint8_t rq[] =
    139  {
    140  RQ_INFO
    141  };
    142  usart.transmit(&rq[0], 0, sizeof(rq));
    143 
    144  uint8_t n;
    145  usart.receive(&n, 0, sizeof(n));
    146  std::cout << "len: " << (int) n << std::endl << std::flush;
    147  while (n--)
    148  {
    149  uint8_t len;
    150  usart.receive(&len, 0, sizeof(len));
    151 
    152  char str[len + 1];
    153  str[len] = '\0';
    154  usart.receive(reinterpret_cast<uint8_t *>(&str[0]), 0, len);
    155 
    156  std::cout << &str[0] << std::endl;
    157 
    158  info.push_back(std::string(str));
    159  }
    160 
    161  uint8_t aw;
    162  usart.receive(&aw, 0, sizeof(aw));
    163  if (aw != MSG_OK)
    164  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    165 
    166  return info;
    167 }
    168 
    170 {
    171  uint8_t rq[] =
    172  {
    173  RQ_ST
    174  };
    175  usart.transmit(&rq[0], 0, sizeof(rq));
    176 
    177  uint8_t aw;
    178  usart.receive(&aw, 0, sizeof(aw));
    179  return aw == MSG_OK;
    180 }
    181 
    182 bool B15F::digitalWrite0(uint8_t port)
    183 {
    184  uint8_t rq[] =
    185  {
    186  RQ_BA0,
    187  port
    188  };
    189  usart.transmit(&rq[0], 0, sizeof(rq));
    190 
    191  uint8_t aw;
    192  usart.receive(&aw, 0, sizeof(aw));
    193  return aw == MSG_OK;
    194 }
    195 
    196 bool B15F::digitalWrite1(uint8_t port)
    197 {
    198  uint8_t rq[] =
    199  {
    200  RQ_BA1,
    201  port
    202  };
    203  usart.transmit(&rq[0], 0, sizeof(rq));
    204 
    205  uint8_t aw;
    206  usart.receive(&aw, 0, sizeof(aw));
    207  return aw == MSG_OK;
    208 }
    209 
    211 {
    212  usart.clearInputBuffer();
    213  uint8_t rq[] =
    214  {
    215  RQ_BE0
    216  };
    217  usart.transmit(&rq[0], 0, sizeof(rq));
    218 
    219  uint8_t aw;
    220  usart.receive(&aw, 0, sizeof(aw));
    221  return aw;
    222 }
    223 
    225 {
    226  usart.clearInputBuffer();
    227  uint8_t rq[] =
    228  {
    229  RQ_BE1
    230  };
    231  usart.transmit(&rq[0], 0, sizeof(rq));
    232 
    233  uint8_t aw;
    234  usart.receive(&aw, 0, sizeof(aw));
    235  return aw;
    236 }
    237 
    239 {
    240  usart.clearInputBuffer();
    241  uint8_t rq[] =
    242  {
    243  RQ_DSW
    244  };
    245  usart.transmit(&rq[0], 0, sizeof(rq));
    246 
    247  uint8_t aw;
    248  usart.receive(&aw, 0, sizeof(aw));
    249  return aw;
    250 }
    251 
    252 bool B15F::analogWrite0(uint16_t value)
    253 {
    254  uint8_t rq[] =
    255  {
    256  RQ_AA0,
    257  static_cast<uint8_t >(value & 0xFF),
    258  static_cast<uint8_t >(value >> 8)
    259  };
    260  usart.transmit(&rq[0], 0, sizeof(rq));
    261 
    262  uint8_t aw;
    263  usart.receive(&aw, 0, sizeof(aw));
    264  return aw == MSG_OK;
    265 }
    266 
    267 bool B15F::analogWrite1(uint16_t value)
    268 {
    269  uint8_t rq[] =
    270  {
    271  RQ_AA1,
    272  static_cast<uint8_t >(value & 0xFF),
    273  static_cast<uint8_t >(value >> 8)
    274  };
    275  usart.transmit(&rq[0], 0, sizeof(rq));
    276 
    277  uint8_t aw;
    278  usart.receive(&aw, 0, sizeof(aw));
    279  return aw == MSG_OK;
    280 }
    281 
    282 uint16_t B15F::analogRead(uint8_t channel)
    283 {
    284  usart.clearInputBuffer();
    285  if (channel > 7)
    286  abort("Bad ADC channel: " + std::to_string(channel));
    287 
    288  uint8_t rq[] =
    289  {
    290  RQ_ADC,
    291  channel
    292  };
    293 
    294  usart.transmit(&rq[0], 0, sizeof(rq));
    295 
    296  uint16_t aw;
    297  usart.receive(reinterpret_cast<uint8_t*>(&aw), 0, sizeof(aw));
    298 
    299  if (aw > 1023)
    300  abort("Bad ADC data detected (1)");
    301  return aw;
    302 }
    303 
    304 void
    305 B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b,
    306  uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    307 {
    308  /*
    309  // prepare pointers
    310  buffer_a += offset_a;
    311  buffer_b += offset_b;
    312 
    313 
    314  usart.clearInputBuffer();
    315  usart.writeByte(RQ_ADC_DAC_STROKE);
    316  usart.writeByte(channel_a);
    317  usart.writeByte(channel_b);
    318  usart.writeInt(start);
    319  usart.writeInt(static_cast<uint16_t>(delta));
    320  usart.writeInt(count);
    321 
    322  for (uint16_t i = 0; i < count; i++) {
    323  if (buffer_a) {
    324  buffer_a[i] = usart.readInt();
    325 
    326  if (buffer_a[i] > 1023) // check for broken usart connection
    327  abort("Bad ADC data detected (2)");
    328  } else {
    329  usart.readInt();
    330  }
    331 
    332  if (buffer_b) {
    333  buffer_b[i] = usart.readInt();
    334 
    335  if (buffer_b[i] > 1023) // check for broken usart connection
    336  abort("Bad ADC data detected (3)");
    337  } else {
    338  usart.readInt();
    339  }
    340  }
    341 
    342  uint8_t aw = usart.readByte();
    343  if (aw != MSG_OK)
    344  abort("Sequenz unterbrochen");
    345 
    346  delay_us(10);*/
    347 }
    348 
    349 uint8_t B15F::pwmSetFrequency(uint32_t freq)
    350 {
    351  usart.clearInputBuffer();
    352 
    353  uint8_t rq[] =
    354  {
    355  RQ_PWM_SET_FREQ,
    356  static_cast<uint8_t>((freq >> 0) & 0xFF),
    357  static_cast<uint8_t>((freq >> 8) & 0xFF),
    358  static_cast<uint8_t>((freq >> 16) & 0xFF),
    359  static_cast<uint8_t>((freq >> 24) & 0xFF)
    360  };
    361 
    362  usart.transmit(&rq[0], 0, sizeof(rq));
    363 
    364  uint8_t aw;
    365  usart.receive(&aw, 0, sizeof(aw));
    366  return aw;
    367 }
    368 
    369 bool B15F::pwmSetValue(uint8_t value)
    370 {
    371  usart.clearInputBuffer();
    372 
    373  uint8_t rq[] =
    374  {
    375  RQ_PWM_SET_VALUE,
    376  value
    377  };
    378 
    379  usart.transmit(&rq[0], 0, sizeof(rq));
    380 
    381  uint8_t aw;
    382  usart.receive(&aw, 0, sizeof(aw));
    383  return aw == MSG_OK;
    384 }
    385 
    386 bool B15F::setRegister(uint8_t adr, uint8_t val)
    387 {
    388  usart.clearInputBuffer();
    389 
    390  uint8_t rq[] =
    391  {
    392  RQ_SET_REG,
    393  adr,
    394  val
    395  };
    396 
    397  usart.transmit(&rq[0], 0, sizeof(rq));
    398 
    399  uint8_t aw;
    400  usart.receive(&aw, 0, sizeof(aw));
    401  return aw == val;
    402 }
    403 
    404 uint8_t B15F::getRegister(uint8_t adr)
    405 {
    406  usart.clearInputBuffer();
    407 
    408  uint8_t rq[] =
    409  {
    410  RQ_GET_REG,
    411  adr
    412  };
    413 
    414  usart.transmit(&rq[0], 0, sizeof(rq));
    415 
    416  uint8_t aw;
    417  usart.receive(&aw, 0, sizeof(aw));
    418  return aw;
    419 }
    420 
    421 
    422 void B15F::delay_ms(uint16_t ms)
    423 {
    424  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    425 }
    426 
    427 void B15F::delay_us(uint16_t us)
    428 {
    429  std::this_thread::sleep_for(std::chrono::microseconds(us));
    430 }
    431 
    433 {
    434  if (!instance)
    435  instance = new B15F();
    436 
    437  return *instance;
    438 }
    439 
    440 // https://stackoverflow.com/a/478960
    441 std::string B15F::exec(std::string cmd)
    442 {
    443  std::array<char, 128> buffer;
    444  std::string result;
    445  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    446  if (!pipe)
    447  {
    448  throw std::runtime_error("popen() failed!");
    449  }
    450  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    451  {
    452  result += buffer.data();
    453  }
    454  return result;
    455 }
    456 
    457 void B15F::abort(std::string msg)
    458 {
    459  DriverException ex(msg);
    460  abort(ex);
    461 }
    462 
    463 void B15F::abort(std::exception &ex)
    464 {
    465  if (errorhandler)
    466  errorhandler(ex);
    467  else
    468  {
    469  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    470  std::cout << ex.what() << std::endl;
    471  throw DriverException(ex.what());
    472  }
    473 }
    474 
    475 void B15F::setAbortHandler(errorhandler_t func)
    476 {
    477  errorhandler = func;
    478 }
    -
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:441
    -
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:404
    -
    void delay_us(uint16_t us)
    Definition: b15f.cpp:427
    -
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:210
    -
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:349
    -
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:305
    +
    1 #include "b15f.h"
    2 
    3 B15F *B15F::instance = nullptr;
    4 errorhandler_t B15F::errorhandler = nullptr;
    5 
    6 B15F::B15F()
    7 {
    8  init();
    9 }
    10 
    11 void B15F::init()
    12 {
    13 
    14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
    15  while (device.find(' ') != std::string::npos || device.find('\n') != std::string::npos ||
    16  device.find('\t') != std::string::npos)
    17  device.pop_back();
    18 
    19  if (device.length() == 0)
    20  abort("Adapter nicht gefunden");
    21 
    22  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
    23 
    24 
    25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
    26  usart.setBaudrate(BAUDRATE);
    27  usart.openDevice(device);
    28  std::cout << "OK" << std::endl;
    29 
    30 
    31  std::cout << PRE << "Teste Verbindung... " << std::flush;
    32  uint8_t tries = 3;
    33  while (tries--)
    34  {
    35  // verwerfe Daten, die µC noch hat
    36  //discard();
    37 
    38  if (!testConnection())
    39  continue;
    40 
    41  if (!testIntConv())
    42  continue;
    43 
    44  break;
    45  }
    46  if (tries == 0)
    47  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
    48  std::cout << "OK" << std::endl;
    49 
    50 
    51  // Gib board info aus
    52  std::vector<std::string> info = getBoardInfo();
    53  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")"
    54  << std::endl;
    55 }
    56 
    58 {
    59  uint8_t tries = RECONNECT_TRIES;
    60  while (tries--)
    61  {
    63  discard();
    64 
    65  if (testConnection())
    66  return;
    67  }
    68 
    69  abort("Verbindung kann nicht repariert werden");
    70 }
    71 
    72 void B15F::discard(void)
    73 {
    74  try
    75  {
    76  uint8_t rq[] =
    77  {
    78  RQ_DISC
    79  };
    80 
    81  usart.clearOutputBuffer();
    82  for (uint8_t i = 0; i < 16; i++)
    83  {
    84  usart.transmit(&rq[0], 0, sizeof(rq)); // sende discard Befehl (verwerfe input)
    85  delay_ms(4);
    86  }
    87  usart.clearInputBuffer();
    88  }
    89  catch (std::exception &ex)
    90  {
    91  abort(ex);
    92  }
    93 }
    94 
    96 {
    97  // erzeuge zufälliges Byte
    98  srand(time(NULL));
    99  uint8_t dummy = rand() % 256;
    100 
    101  uint8_t rq[] =
    102  {
    103  RQ_TEST,
    104  dummy
    105  };
    106  usart.transmit(&rq[0], 0, sizeof(rq));
    107 
    108  uint8_t aw[2];
    109  usart.receive(&aw[0], 0, sizeof(aw));
    110 
    111  return aw[0] == MSG_OK && aw[1] == dummy;
    112 }
    113 
    115 {
    116  srand(time(NULL));
    117  uint16_t dummy = rand() % (0xFFFF / 3);
    118 
    119  uint8_t rq[] =
    120  {
    121  RQ_INT,
    122  static_cast<uint8_t >(dummy & 0xFF),
    123  static_cast<uint8_t >(dummy >> 8)
    124  };
    125  usart.transmit(&rq[0], 0, sizeof(rq));
    126 
    127  uint16_t aw;
    128  usart.receive(reinterpret_cast<uint8_t *>(&aw), 0, sizeof(aw));
    129 
    130  return aw == dummy * 3;
    131 }
    132 
    133 
    134 std::vector<std::string> B15F::getBoardInfo(void)
    135 {
    136  std::vector<std::string> info;
    137 
    138  uint8_t rq[] =
    139  {
    140  RQ_INFO
    141  };
    142  usart.transmit(&rq[0], 0, sizeof(rq));
    143 
    144  uint8_t n;
    145  usart.receive(&n, 0, sizeof(n));
    146  while (n--)
    147  {
    148  uint8_t len;
    149  usart.receive(&len, 0, sizeof(len));
    150 
    151  char str[len + 1];
    152  str[len] = '\0';
    153  usart.receive(reinterpret_cast<uint8_t *>(&str[0]), 0, len);
    154 
    155  info.push_back(std::string(str));
    156  }
    157 
    158  uint8_t aw;
    159  usart.receive(&aw, 0, sizeof(aw));
    160  if (aw != MSG_OK)
    161  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
    162 
    163  return info;
    164 }
    165 
    167 {
    168  uint8_t rq[] =
    169  {
    170  RQ_ST
    171  };
    172  usart.transmit(&rq[0], 0, sizeof(rq));
    173 
    174  uint8_t aw;
    175  usart.receive(&aw, 0, sizeof(aw));
    176  return aw == MSG_OK;
    177 }
    178 
    179 bool B15F::digitalWrite0(uint8_t port)
    180 {
    181  uint8_t rq[] =
    182  {
    183  RQ_BA0,
    184  port
    185  };
    186  usart.transmit(&rq[0], 0, sizeof(rq));
    187 
    188  uint8_t aw;
    189  usart.receive(&aw, 0, sizeof(aw));
    190  return aw == MSG_OK;
    191 }
    192 
    193 bool B15F::digitalWrite1(uint8_t port)
    194 {
    195  uint8_t rq[] =
    196  {
    197  RQ_BA1,
    198  port
    199  };
    200  usart.transmit(&rq[0], 0, sizeof(rq));
    201 
    202  uint8_t aw;
    203  usart.receive(&aw, 0, sizeof(aw));
    204  return aw == MSG_OK;
    205 }
    206 
    208 {
    209  usart.clearInputBuffer();
    210  uint8_t rq[] =
    211  {
    212  RQ_BE0
    213  };
    214  usart.transmit(&rq[0], 0, sizeof(rq));
    215 
    216  uint8_t aw;
    217  usart.receive(&aw, 0, sizeof(aw));
    218  return aw;
    219 }
    220 
    222 {
    223  usart.clearInputBuffer();
    224  uint8_t rq[] =
    225  {
    226  RQ_BE1
    227  };
    228  usart.transmit(&rq[0], 0, sizeof(rq));
    229 
    230  uint8_t aw;
    231  usart.receive(&aw, 0, sizeof(aw));
    232  return aw;
    233 }
    234 
    236 {
    237  usart.clearInputBuffer();
    238  uint8_t rq[] =
    239  {
    240  RQ_DSW
    241  };
    242  usart.transmit(&rq[0], 0, sizeof(rq));
    243 
    244  uint8_t aw;
    245  usart.receive(&aw, 0, sizeof(aw));
    246  return aw;
    247 }
    248 
    249 bool B15F::analogWrite0(uint16_t value)
    250 {
    251  uint8_t rq[] =
    252  {
    253  RQ_AA0,
    254  static_cast<uint8_t >(value & 0xFF),
    255  static_cast<uint8_t >(value >> 8)
    256  };
    257  usart.transmit(&rq[0], 0, sizeof(rq));
    258 
    259  uint8_t aw;
    260  usart.receive(&aw, 0, sizeof(aw));
    261  return aw == MSG_OK;
    262 }
    263 
    264 bool B15F::analogWrite1(uint16_t value)
    265 {
    266  uint8_t rq[] =
    267  {
    268  RQ_AA1,
    269  static_cast<uint8_t >(value & 0xFF),
    270  static_cast<uint8_t >(value >> 8)
    271  };
    272  usart.transmit(&rq[0], 0, sizeof(rq));
    273 
    274  uint8_t aw;
    275  usart.receive(&aw, 0, sizeof(aw));
    276  return aw == MSG_OK;
    277 }
    278 
    279 uint16_t B15F::analogRead(uint8_t channel)
    280 {
    281  usart.clearInputBuffer();
    282  if (channel > 7)
    283  abort("Bad ADC channel: " + std::to_string(channel));
    284 
    285  uint8_t rq[] =
    286  {
    287  RQ_ADC,
    288  channel
    289  };
    290 
    291  usart.transmit(&rq[0], 0, sizeof(rq));
    292 
    293  uint16_t aw;
    294  usart.receive(reinterpret_cast<uint8_t *>(&aw), 0, sizeof(aw));
    295 
    296  if (aw > 1023)
    297  abort("Bad ADC data detected (1)");
    298  return aw;
    299 }
    300 
    301 void
    302 B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b,
    303  uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    304 {
    305  // prepare pointers
    306  buffer_a += offset_a;
    307  buffer_b += offset_b;
    308 
    309 
    310  usart.clearInputBuffer();
    311  uint8_t rq[] =
    312  {
    313  RQ_ADC_DAC_STROKE,
    314  channel_a,
    315  channel_b,
    316  static_cast<uint8_t >(start & 0xFF),
    317  static_cast<uint8_t >(start >> 8),
    318  static_cast<uint8_t >(delta & 0xFF),
    319  static_cast<uint8_t >(delta >> 8),
    320  static_cast<uint8_t >(count & 0xFF),
    321  static_cast<uint8_t >(count >> 8)
    322  };
    323 
    324  usart.transmit(&rq[0], 0, sizeof(rq));
    325 
    326  for (uint16_t i = 0; i < count; i++)
    327  {
    328  if (buffer_a)
    329  {
    330  usart.receive(reinterpret_cast<uint8_t *>(&buffer_a[i]), 0, 2);
    331 
    332  if (buffer_a[i] > 1023) // check for broken usart connection
    333  abort("Bad ADC data detected (2)");
    334  }
    335  else
    336  {
    337  usart.drop(2);
    338  }
    339 
    340  if (buffer_b)
    341  {
    342  usart.receive(reinterpret_cast<uint8_t *>(&buffer_b[i]), 0, 2);
    343 
    344  if (buffer_b[i] > 1023) // check for broken usart connection
    345  abort("Bad ADC data detected (3)");
    346  }
    347  else
    348  {
    349  usart.drop(2);
    350  }
    351  }
    352 
    353  uint8_t aw;
    354  usart.receive(&aw, 0, sizeof(aw));
    355  if(aw != MSG_OK)
    356  abort("Sequenz unterbrochen");
    357 }
    358 
    359 uint8_t B15F::pwmSetFrequency(uint32_t freq)
    360 {
    361  usart.clearInputBuffer();
    362 
    363  uint8_t rq[] =
    364  {
    365  RQ_PWM_SET_FREQ,
    366  static_cast<uint8_t>((freq >> 0) & 0xFF),
    367  static_cast<uint8_t>((freq >> 8) & 0xFF),
    368  static_cast<uint8_t>((freq >> 16) & 0xFF),
    369  static_cast<uint8_t>((freq >> 24) & 0xFF)
    370  };
    371 
    372  usart.transmit(&rq[0], 0, sizeof(rq));
    373 
    374  uint8_t aw;
    375  usart.receive(&aw, 0, sizeof(aw));
    376  return aw;
    377 }
    378 
    379 bool B15F::pwmSetValue(uint8_t value)
    380 {
    381  usart.clearInputBuffer();
    382 
    383  uint8_t rq[] =
    384  {
    385  RQ_PWM_SET_VALUE,
    386  value
    387  };
    388 
    389  usart.transmit(&rq[0], 0, sizeof(rq));
    390 
    391  uint8_t aw;
    392  usart.receive(&aw, 0, sizeof(aw));
    393  return aw == MSG_OK;
    394 }
    395 
    396 bool B15F::setRegister(uint8_t adr, uint8_t val)
    397 {
    398  usart.clearInputBuffer();
    399 
    400  uint8_t rq[] =
    401  {
    402  RQ_SET_REG,
    403  adr,
    404  val
    405  };
    406 
    407  usart.transmit(&rq[0], 0, sizeof(rq));
    408 
    409  uint8_t aw;
    410  usart.receive(&aw, 0, sizeof(aw));
    411  return aw == val;
    412 }
    413 
    414 uint8_t B15F::getRegister(uint8_t adr)
    415 {
    416  usart.clearInputBuffer();
    417 
    418  uint8_t rq[] =
    419  {
    420  RQ_GET_REG,
    421  adr
    422  };
    423 
    424  usart.transmit(&rq[0], 0, sizeof(rq));
    425 
    426  uint8_t aw;
    427  usart.receive(&aw, 0, sizeof(aw));
    428  return aw;
    429 }
    430 
    431 
    432 void B15F::delay_ms(uint16_t ms)
    433 {
    434  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
    435 }
    436 
    437 void B15F::delay_us(uint16_t us)
    438 {
    439  std::this_thread::sleep_for(std::chrono::microseconds(us));
    440 }
    441 
    443 {
    444  if (!instance)
    445  instance = new B15F();
    446 
    447  return *instance;
    448 }
    449 
    450 // https://stackoverflow.com/a/478960
    451 std::string B15F::exec(std::string cmd)
    452 {
    453  std::array<char, 128> buffer;
    454  std::string result;
    455  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
    456  if (!pipe)
    457  {
    458  throw std::runtime_error("popen() failed!");
    459  }
    460  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
    461  {
    462  result += buffer.data();
    463  }
    464  return result;
    465 }
    466 
    467 void B15F::abort(std::string msg)
    468 {
    469  DriverException ex(msg);
    470  abort(ex);
    471 }
    472 
    473 void B15F::abort(std::exception &ex)
    474 {
    475  if (errorhandler)
    476  errorhandler(ex);
    477  else
    478  {
    479  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
    480  std::cout << ex.what() << std::endl;
    481  throw DriverException(ex.what());
    482  }
    483 }
    484 
    485 void B15F::setAbortHandler(errorhandler_t func)
    486 {
    487  errorhandler = func;
    488 }
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:451
    +
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:414
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:437
    +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:207
    +
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:359
    +
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:302
    bool testConnection(void)
    Definition: b15f.cpp:95
    -
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:238
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:422
    -
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:386
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:432
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:235
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:432
    +
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:396
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:442
    Definition: b15f.h:26
    -
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:95
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:457
    -
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:75
    +
    void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:75
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:467
    +
    void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
    Definition: usart.cpp:84
    void clearInputBuffer(void)
    Definition: usart.cpp:54
    void clearOutputBuffer(void)
    Definition: usart.cpp:61
    -
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:282
    -
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:182
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:279
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:179
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:231
    -
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:114
    -
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:169
    +
    void setBaudrate(uint32_t baudrate)
    Definition: usart.cpp:131
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:166
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:134
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:234
    -
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:267
    -
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:196
    -
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:369
    +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:264
    +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:193
    +
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:379
    void discard(void)
    Definition: b15f.cpp:72
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:232
    void openDevice(std::string device)
    Definition: usart.cpp:9
    -
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:224
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:221
    void reconnect(void)
    Definition: b15f.cpp:57
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:237
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:475
    -
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:252
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:485
    +
    void drop(uint8_t len)
    Definition: usart.cpp:114
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:249
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:236
    bool testIntConv(void)
    Definition: b15f.cpp:114
    diff --git a/docs/html/b15f_8h_source.html b/docs/html/b15f_8h_source.html index b307294..0dc1366 100644 --- a/docs/html/b15f_8h_source.html +++ b/docs/html/b15f_8h_source.html @@ -71,43 +71,43 @@ $(function() {
    1 #ifndef B15F_H
    2 #define B15F_H
    3 
    4 #include <iostream>
    5 #include <bits/stdc++.h>
    6 #include <string>
    7 #include <fstream>
    8 #include <cstdlib>
    9 #include <chrono>
    10 #include <cstdint>
    11 #include <vector>
    12 
    13 #include <unistd.h>
    14 #include <fcntl.h>
    15 #include <sys/ioctl.h>
    16 #include <termios.h>
    17 #include "usart.h"
    18 #include "driverexception.h"
    19 #include "timeoutexception.h"
    20 
    21 typedef std::function<void(std::exception&)> errorhandler_t;
    22 
    23 
    26 class B15F
    27 {
    28 private:
    29  // privater Konstruktor
    30  B15F(void);
    31 public:
    32 
    33  /*************************************
    34  * Grundfunktionen des B15F Treibers *
    35  *************************************/
    36 
    41  void reconnect(void);
    42 
    47  void discard(void);
    48 
    53  bool testConnection(void);
    54 
    59  bool testIntConv(void);
    60 
    65  std::vector<std::string> getBoardInfo(void);
    66 
    71  void delay_ms(uint16_t ms);
    72 
    77  void delay_us(uint16_t us);
    78 
    83  static B15F& getInstance(void);
    84 
    89  static std::string exec(std::string cmd);
    90 
    95  static void abort(std::string msg);
    96 
    101  static void abort(std::exception& ex);
    102 
    107  static void setAbortHandler(errorhandler_t func);
    108 
    109  /*************************************/
    110 
    111 
    112 
    113  /*************************
    114  * Steuerbefehle für B15 *
    115  *************************/
    116 
    122  bool activateSelfTestMode(void);
    123 
    129  bool digitalWrite0(uint8_t);
    130 
    136  bool digitalWrite1(uint8_t);
    137 
    143  uint8_t digitalRead0(void);
    144 
    150  uint8_t digitalRead1(void);
    151 
    157  uint8_t readDipSwitch(void);
    158 
    164  bool analogWrite0(uint16_t port);
    165 
    171  bool analogWrite1(uint16_t port);
    172 
    178  uint16_t analogRead(uint8_t channel);
    179 
    195  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
    196 
    204  uint8_t pwmSetFrequency(uint32_t freq);
    205 
    211  bool pwmSetValue(uint8_t value);
    212 
    220  bool setRegister(uint8_t adr, uint8_t val);
    221 
    227  uint8_t getRegister(uint8_t adr);
    228 
    229  /*************************/
    230 
    231 
    232  // CONSTANTS
    233  const std::string PRE = "[B15F] ";
    234  constexpr static uint8_t MSG_OK = 0xFF;
    235  constexpr static uint8_t MSG_FAIL = 0xFE;
    236  constexpr static uint16_t RECONNECT_TIMEOUT = 64;
    237  constexpr static uint16_t WDT_TIMEOUT = 15;
    238  constexpr static uint8_t RECONNECT_TRIES = 3;
    239  constexpr static uint32_t BAUDRATE = 57600;
    240 
    241 private:
    242 
    247  void init(void);
    248 
    249  USART usart;
    250  static B15F* instance;
    251  static errorhandler_t errorhandler;
    252 
    253  // REQUESTS
    254  constexpr static uint8_t RQ_DISC = 0;
    255  constexpr static uint8_t RQ_TEST = 1;
    256  constexpr static uint8_t RQ_INFO = 2;
    257  constexpr static uint8_t RQ_INT = 3;
    258  constexpr static uint8_t RQ_ST = 4;
    259  constexpr static uint8_t RQ_BA0 = 5;
    260  constexpr static uint8_t RQ_BA1 = 6;
    261  constexpr static uint8_t RQ_BE0 = 7;
    262  constexpr static uint8_t RQ_BE1 = 8;
    263  constexpr static uint8_t RQ_DSW = 9;
    264  constexpr static uint8_t RQ_AA0 = 10;
    265  constexpr static uint8_t RQ_AA1 = 11;
    266  constexpr static uint8_t RQ_ADC = 12;
    267  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
    268  constexpr static uint8_t RQ_PWM_SET_FREQ = 14;
    269  constexpr static uint8_t RQ_PWM_SET_VALUE = 15;
    270  constexpr static uint8_t RQ_SET_REG = 16;
    271  constexpr static uint8_t RQ_GET_REG = 17;
    272 };
    273 
    274 #endif // B15F_H
    -
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:441
    +
    static std::string exec(std::string cmd)
    Definition: b15f.cpp:451
    constexpr static uint8_t MSG_FAIL
    Value to reject a received command.
    Definition: b15f.h:233
    -
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:404
    -
    void delay_us(uint16_t us)
    Definition: b15f.cpp:427
    -
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:210
    -
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:349
    -
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:305
    +
    uint8_t getRegister(uint8_t adr)
    Definition: b15f.cpp:414
    +
    void delay_us(uint16_t us)
    Definition: b15f.cpp:437
    +
    uint8_t digitalRead0(void)
    Definition: b15f.cpp:207
    +
    uint8_t pwmSetFrequency(uint32_t freq)
    Definition: b15f.cpp:359
    +
    void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
    Definition: b15f.cpp:302
    bool testConnection(void)
    Definition: b15f.cpp:95
    -
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:238
    -
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:422
    -
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:386
    -
    static B15F & getInstance(void)
    Definition: b15f.cpp:432
    +
    uint8_t readDipSwitch(void)
    Definition: b15f.cpp:235
    +
    void delay_ms(uint16_t ms)
    Definition: b15f.cpp:432
    +
    bool setRegister(uint8_t adr, uint8_t val)
    Definition: b15f.cpp:396
    +
    static B15F & getInstance(void)
    Definition: b15f.cpp:442
    Definition: b15f.h:26
    -
    static void abort(std::string msg)
    Definition: b15f.cpp:457
    -
    Definition: usart.h:15
    -
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:282
    -
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:182
    +
    static void abort(std::string msg)
    Definition: b15f.cpp:467
    +
    Definition: usart.h:16
    +
    uint16_t analogRead(uint8_t channel)
    Definition: b15f.cpp:279
    +
    bool digitalWrite0(uint8_t)
    Definition: b15f.cpp:179
    const std::string PRE
    B15F stdout prefix.
    Definition: b15f.h:231
    -
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:169
    +
    bool activateSelfTestMode(void)
    Definition: b15f.cpp:166
    std::vector< std::string > getBoardInfo(void)
    Definition: b15f.cpp:134
    constexpr static uint16_t RECONNECT_TIMEOUT
    Time in ms after which a reconnect attempt aborts.
    Definition: b15f.h:234
    -
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:267
    -
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:196
    -
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:369
    +
    bool analogWrite1(uint16_t port)
    Definition: b15f.cpp:264
    +
    bool digitalWrite1(uint8_t)
    Definition: b15f.cpp:193
    +
    bool pwmSetValue(uint8_t value)
    Definition: b15f.cpp:379
    void discard(void)
    Definition: b15f.cpp:72
    constexpr static uint8_t MSG_OK
    Value to acknowledge a received command.
    Definition: b15f.h:232
    -
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:224
    +
    uint8_t digitalRead1(void)
    Definition: b15f.cpp:221
    constexpr static uint16_t WDT_TIMEOUT
    Time in ms after which the watch dog timer resets the MCU.
    Definition: b15f.h:235
    void reconnect(void)
    Definition: b15f.cpp:57
    constexpr static uint32_t BAUDRATE
    USART baudrate for communication with the MCU.
    Definition: b15f.h:237
    -
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:475
    -
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:252
    +
    static void setAbortHandler(errorhandler_t func)
    Definition: b15f.cpp:485
    +
    bool analogWrite0(uint16_t port)
    Definition: b15f.cpp:249
    constexpr static uint8_t RECONNECT_TRIES
    Maximum count of reconnect attempts after which the driver stops.
    Definition: b15f.h:236
    bool testIntConv(void)
    Definition: b15f.cpp:114
    diff --git a/docs/html/backup_8cpp_source.html b/docs/html/backup_8cpp_source.html index 80a5be1..a942111 100644 --- a/docs/html/backup_8cpp_source.html +++ b/docs/html/backup_8cpp_source.html @@ -72,10 +72,10 @@ $(function() {
    1 
    2 void USART::writeByte(uint8_t b)
    3 {
    4  int sent = write(file_desc, &b, 1);
    5  if (sent != 1)
    6  {
    7  std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl;
    8  usleep(100000);
    9  sent = write(file_desc, &b, 1);
    10  if (sent != 1)
    11  throw USARTException("Fehler beim Senden: writeByte()");
    12  }
    13 
    14 }
    15 
    16 void USART::writeInt(uint16_t d)
    17 {
    18  int sent = write(file_desc, reinterpret_cast<char *>(&d), 2);
    19  if (sent != 2)
    20  throw USARTException("Fehler beim Senden: writeInt()");
    21 }
    22 
    23 void USART::writeU32(uint32_t w)
    24 {
    25  int sent = write(file_desc, reinterpret_cast<char *>(&w), 4);
    26  if (sent != 4)
    27  throw USARTException("Fehler beim Senden: writeU32()");
    28 }
    29 
    30 uint8_t USART::readByte(void)
    31 {
    32  char b;
    33  auto start = std::chrono::steady_clock::now();
    34  auto end = start;
    35  uint16_t elapsed = 0;
    36  while (elapsed < timeout * 100)
    37  {
    38  int code = read(file_desc, &b, 1);
    39  if (code > 0)
    40  return static_cast<uint8_t>(b);
    41 
    42  end = std::chrono::steady_clock::now();
    43  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    44  }
    45 
    46  throw TimeoutException("Verbindung unterbrochen.", timeout);
    47 }
    48 
    49 uint16_t USART::readInt(void)
    50 {
    51  return readByte() | readByte() << 8;
    52 }
    - + diff --git a/docs/html/classB15F-members.html b/docs/html/classB15F-members.html index 490e7b1..82d47d9 100644 --- a/docs/html/classB15F-members.html +++ b/docs/html/classB15F-members.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/classB15F.html b/docs/html/classB15F.html index fbb454d..36594a4 100644 --- a/docs/html/classB15F.html +++ b/docs/html/classB15F.html @@ -202,7 +202,7 @@ constexpr static uint32_t  -

    Definition at line 463 of file b15f.cpp.

    +

    Definition at line 473 of file b15f.cpp.

    @@ -236,7 +236,7 @@ constexpr static uint32_t  -

    Definition at line 457 of file b15f.cpp.

    +

    Definition at line 467 of file b15f.cpp.

    @@ -262,7 +262,7 @@ constexpr static uint32_t  -

    Definition at line 169 of file b15f.cpp.

    +

    Definition at line 166 of file b15f.cpp.

    @@ -294,7 +294,7 @@ constexpr static uint32_t  -

    Definition at line 282 of file b15f.cpp.

    +

    Definition at line 279 of file b15f.cpp.

    @@ -386,7 +386,7 @@ constexpr static uint32_t  -

    Definition at line 305 of file b15f.cpp.

    +

    Definition at line 302 of file b15f.cpp.

    @@ -418,7 +418,7 @@ constexpr static uint32_t  -

    Definition at line 252 of file b15f.cpp.

    +

    Definition at line 249 of file b15f.cpp.

    @@ -450,7 +450,7 @@ constexpr static uint32_t  -

    Definition at line 267 of file b15f.cpp.

    +

    Definition at line 264 of file b15f.cpp.

    @@ -476,7 +476,7 @@ constexpr static uint32_t  -

    Definition at line 422 of file b15f.cpp.

    +

    Definition at line 432 of file b15f.cpp.

    @@ -502,7 +502,7 @@ constexpr static uint32_t  -

    Definition at line 427 of file b15f.cpp.

    +

    Definition at line 437 of file b15f.cpp.

    @@ -529,7 +529,7 @@ constexpr static uint32_t  -

    Definition at line 210 of file b15f.cpp.

    +

    Definition at line 207 of file b15f.cpp.

    @@ -556,7 +556,7 @@ constexpr static uint32_t  -

    Definition at line 224 of file b15f.cpp.

    +

    Definition at line 221 of file b15f.cpp.

    @@ -588,7 +588,7 @@ constexpr static uint32_t  -

    Definition at line 182 of file b15f.cpp.

    +

    Definition at line 179 of file b15f.cpp.

    @@ -620,7 +620,7 @@ constexpr static uint32_t  -

    Definition at line 196 of file b15f.cpp.

    +

    Definition at line 193 of file b15f.cpp.

    @@ -680,7 +680,7 @@ constexpr static uint32_t  -

    Definition at line 441 of file b15f.cpp.

    +

    Definition at line 451 of file b15f.cpp.

    @@ -740,7 +740,7 @@ constexpr static uint32_t  -

    Definition at line 432 of file b15f.cpp.

    +

    Definition at line 442 of file b15f.cpp.

    @@ -772,7 +772,7 @@ constexpr static uint32_t  -

    Definition at line 404 of file b15f.cpp.

    +

    Definition at line 414 of file b15f.cpp.

    @@ -805,7 +805,7 @@ constexpr static uint32_t  -

    Definition at line 349 of file b15f.cpp.

    +

    Definition at line 359 of file b15f.cpp.

    @@ -837,7 +837,7 @@ constexpr static uint32_t  -

    Definition at line 369 of file b15f.cpp.

    +

    Definition at line 379 of file b15f.cpp.

    @@ -864,7 +864,7 @@ constexpr static uint32_t  -

    Definition at line 238 of file b15f.cpp.

    +

    Definition at line 235 of file b15f.cpp.

    @@ -924,7 +924,7 @@ constexpr static uint32_t  -

    Definition at line 475 of file b15f.cpp.

    +

    Definition at line 485 of file b15f.cpp.

    @@ -967,7 +967,7 @@ constexpr static uint32_t  -

    Definition at line 386 of file b15f.cpp.

    +

    Definition at line 396 of file b15f.cpp.

    @@ -1030,7 +1030,7 @@ constexpr static uint32_t  diff --git a/docs/html/classDot-members.html b/docs/html/classDot-members.html index 3820c71..cce29ff 100644 --- a/docs/html/classDot-members.html +++ b/docs/html/classDot-members.html @@ -76,7 +76,7 @@ $(function() { diff --git a/docs/html/classDot.html b/docs/html/classDot.html index 267d5c3..1570169 100644 --- a/docs/html/classDot.html +++ b/docs/html/classDot.html @@ -196,7 +196,7 @@ Public Member Functions diff --git a/docs/html/classDriverException-members.html b/docs/html/classDriverException-members.html index abf231a..08b2107 100644 --- a/docs/html/classDriverException-members.html +++ b/docs/html/classDriverException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classDriverException.html b/docs/html/classDriverException.html index 4154dda..9db6f34 100644 --- a/docs/html/classDriverException.html +++ b/docs/html/classDriverException.html @@ -109,7 +109,7 @@ std::string msg_< diff --git a/docs/html/classPlottyFile-members.html b/docs/html/classPlottyFile-members.html index 99e9e31..0423709 100644 --- a/docs/html/classPlottyFile-members.html +++ b/docs/html/classPlottyFile-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/docs/html/classPlottyFile.html b/docs/html/classPlottyFile.html index 54b5090..24c926b 100644 --- a/docs/html/classPlottyFile.html +++ b/docs/html/classPlottyFile.html @@ -811,7 +811,7 @@ Public Member Functions diff --git a/docs/html/classTimeoutException-members.html b/docs/html/classTimeoutException-members.html index f3a4a78..36a9dfa 100644 --- a/docs/html/classTimeoutException-members.html +++ b/docs/html/classTimeoutException-members.html @@ -69,16 +69,15 @@ $(function() {

    This is the complete list of members for TimeoutException, including all inherited members.

    - - - - - - + + + + +
    m_timeout (defined in TimeoutException)TimeoutExceptionprotected
    msg (defined in TimeoutException)TimeoutExceptionprotected
    TimeoutException(const char *message, int timeout) (defined in TimeoutException)TimeoutExceptioninlineexplicit
    TimeoutException(const std::string &message, int timeout) (defined in TimeoutException)TimeoutExceptioninlineexplicit
    what() const (defined in TimeoutException)TimeoutExceptioninlinevirtual
    ~TimeoutException() (defined in TimeoutException)TimeoutExceptioninlinevirtual
    msgTimeoutExceptionprotected
    TimeoutException(const char *message)TimeoutExceptioninlineexplicit
    TimeoutException(const std::string &message)TimeoutExceptioninlineexplicit
    what() constTimeoutExceptioninlinevirtual
    ~TimeoutException()=defaultTimeoutExceptionvirtual
    diff --git a/docs/html/classTimeoutException.html b/docs/html/classTimeoutException.html index 15f6df0..4f26688 100644 --- a/docs/html/classTimeoutException.html +++ b/docs/html/classTimeoutException.html @@ -83,36 +83,163 @@ $(function() { - - - - - + + + + + + +

    Public Member Functions

    TimeoutException (const char *message, int timeout)
     
    TimeoutException (const std::string &message, int timeout)
     
    -virtual const char * what () const throw ()
     TimeoutException (const char *message)
     
     TimeoutException (const std::string &message)
     
    virtual ~TimeoutException ()=default
     
    virtual const char * what () const throw ()
     
    +std::string  + - -

    Protected Attributes

    -std::string msg
    msg
     failure description
     
    -int m_timeout
     

    Detailed Description

    Exception for USART related timeouts.

    -

    Definition at line 10 of file timeoutexception.h.

    -

    The documentation for this class was generated from the following file:
      +

      Definition at line 9 of file timeoutexception.h.

      +

      Constructor & Destructor Documentation

      + +

      ◆ TimeoutException() [1/2]

      + +
      +
      + + + + + +
      + + + + + + + + +
      TimeoutException::TimeoutException (const char * message)
      +
      +inlineexplicit
      +
      +

      Constructor

      Parameters
      + + +
      messageas c-string
      +
      +
      + +

      Definition at line 16 of file timeoutexception.h.

      + +
      +
      + +

      ◆ TimeoutException() [2/2]

      + +
      +
      + + + + + +
      + + + + + + + + +
      TimeoutException::TimeoutException (const std::string & message)
      +
      +inlineexplicit
      +
      +

      Constructor

      Parameters
      + + +
      messageas c++-string
      +
      +
      + +

      Definition at line 24 of file timeoutexception.h.

      + +
      +
      + +

      ◆ ~TimeoutException()

      + +
      +
      + + + + + +
      + + + + + + + +
      virtual TimeoutException::~TimeoutException ()
      +
      +virtualdefault
      +
      +

      Standard-destructor

      + +
      +
      +

      Member Function Documentation

      + +

      ◆ what()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + +
      virtual const char* TimeoutException::what () const
      throw (
      )
      +
      +inlinevirtual
      +
      +

      Get failure description

      Returns
      error message as c-string
      + +

      Definition at line 37 of file timeoutexception.h.

      + +
      +
      +
      The documentation for this class was generated from the following file: diff --git a/docs/html/classUSART-members.html b/docs/html/classUSART-members.html index 8450cc1..f3e4a2f 100644 --- a/docs/html/classUSART-members.html +++ b/docs/html/classUSART-members.html @@ -72,20 +72,21 @@ $(function() { clearInputBuffer(void)USART clearOutputBuffer(void)USART closeDevice(void)USART - flushOutputBuffer(void)USART - getBaudrate(void)USART - getTimeout(void)USART - openDevice(std::string device)USART - receive(uint8_t *buffer, uint16_t offset, uint8_t len)USART - setBaudrate(uint32_t baudrate)USART - setTimeout(uint8_t timeout)USART - transmit(uint8_t *buffer, uint16_t offset, uint8_t len)USART - USART()=defaultUSARTexplicit - ~USART(void)USARTvirtual + drop(uint8_t len)USART + flushOutputBuffer(void)USART + getBaudrate(void)USART + getTimeout(void)USART + openDevice(std::string device)USART + receive(uint8_t *buffer, uint16_t offset, uint8_t len)USART + setBaudrate(uint32_t baudrate)USART + setTimeout(uint8_t timeout)USART + transmit(uint8_t *buffer, uint16_t offset, uint8_t len)USART + USART()=defaultUSARTexplicit + ~USART(void)USARTvirtual diff --git a/docs/html/classUSART.html b/docs/html/classUSART.html index 60ef1ed..faa30ab 100644 --- a/docs/html/classUSART.html +++ b/docs/html/classUSART.html @@ -92,6 +92,8 @@ Public Member Functions   void receive (uint8_t *buffer, uint16_t offset, uint8_t len)   +void drop (uint8_t len) +  uint32_t getBaudrate (void)   uint8_t getTimeout (void) @@ -104,7 +106,7 @@ Public Member Functions

      Detailed Description

      C++ Wrapper class for termios usart library.

      -

      Definition at line 15 of file usart.h.

      +

      Definition at line 16 of file usart.h.

      Constructor & Destructor Documentation

      ◆ USART()

      @@ -238,6 +240,38 @@ Public Member Functions

      Definition at line 43 of file usart.cpp.

      + + + +

      ◆ drop()

      + +
      +
      + + + + + + + + +
      void USART::drop (uint8_t len)
      +
      +

      Receives n bytes but discards them

      Parameters
      + + +
      lencount of bytes to receive
      +
      +
      +
      Exceptions
      + + +
      USARTException
      +
      +
      + +

      Definition at line 114 of file usart.cpp.

      +
      @@ -283,7 +317,7 @@ Public Member Functions

      Liefert die eingestellte Baudrate Änderungen werden erst nach einem open() wirksam

      -

      Definition at line 104 of file usart.cpp.

      +

      Definition at line 121 of file usart.cpp.

      @@ -304,7 +338,7 @@ Public Member Functions

      Liefert den eingestellten Timeout (in Dezisekunden) Änderungen werden erst nach einem open() wirksam

      -

      Definition at line 109 of file usart.cpp.

      +

      Definition at line 126 of file usart.cpp.

      @@ -386,7 +420,7 @@ Public Member Functions -

      Definition at line 75 of file usart.cpp.

      +

      Definition at line 84 of file usart.cpp.

      @@ -407,7 +441,7 @@ Public Member Functions

      Setzt die Baudrate Änderungen werden erst nach openDevice() wirksam

      -

      Definition at line 114 of file usart.cpp.

      +

      Definition at line 131 of file usart.cpp.

      @@ -428,7 +462,7 @@ Public Member Functions

      Setzt den Timeout (in Dezisekunden) Änderungen werden erst nach openDevice() wirksam

      -

      Definition at line 119 of file usart.cpp.

      +

      Definition at line 136 of file usart.cpp.

      @@ -478,7 +512,7 @@ Public Member Functions -

      Definition at line 95 of file usart.cpp.

      +

      Definition at line 75 of file usart.cpp.

      @@ -489,7 +523,7 @@ Public Member Functions diff --git a/docs/html/classUSARTException-members.html b/docs/html/classUSARTException-members.html index 6a4a596..a16faa5 100644 --- a/docs/html/classUSARTException-members.html +++ b/docs/html/classUSARTException-members.html @@ -77,7 +77,7 @@ $(function() { diff --git a/docs/html/classUSARTException.html b/docs/html/classUSARTException.html index 2f3808a..fe3c898 100644 --- a/docs/html/classUSARTException.html +++ b/docs/html/classUSARTException.html @@ -239,7 +239,7 @@ std::string  diff --git a/docs/html/classView-members.html b/docs/html/classView-members.html index a3c83d2..1941828 100644 --- a/docs/html/classView-members.html +++ b/docs/html/classView-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/docs/html/classView.html b/docs/html/classView.html index 09a1a4e..3e35fc6 100644 --- a/docs/html/classView.html +++ b/docs/html/classView.html @@ -157,7 +157,7 @@ constexpr static int KEY_E diff --git a/docs/html/classViewInfo-members.html b/docs/html/classViewInfo-members.html index bbe968c..b756c1e 100644 --- a/docs/html/classViewInfo-members.html +++ b/docs/html/classViewInfo-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/docs/html/classViewInfo.html b/docs/html/classViewInfo.html index 6832ee2..0ca0846 100644 --- a/docs/html/classViewInfo.html +++ b/docs/html/classViewInfo.html @@ -185,7 +185,7 @@ static std::vector< std::string >  diff --git a/docs/html/classViewMonitor-members.html b/docs/html/classViewMonitor-members.html index 516ac80..0b71d2e 100644 --- a/docs/html/classViewMonitor-members.html +++ b/docs/html/classViewMonitor-members.html @@ -103,7 +103,7 @@ $(function() { diff --git a/docs/html/classViewMonitor.html b/docs/html/classViewMonitor.html index 886320b..c689040 100644 --- a/docs/html/classViewMonitor.html +++ b/docs/html/classViewMonitor.html @@ -197,7 +197,7 @@ constexpr static int KEY_E diff --git a/docs/html/classViewPromt-members.html b/docs/html/classViewPromt-members.html index cac3125..3d9dc18 100644 --- a/docs/html/classViewPromt-members.html +++ b/docs/html/classViewPromt-members.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/classViewPromt.html b/docs/html/classViewPromt.html index 2133932..4b49506 100644 --- a/docs/html/classViewPromt.html +++ b/docs/html/classViewPromt.html @@ -205,7 +205,7 @@ static std::vector< std::string >  diff --git a/docs/html/classViewSelection-members.html b/docs/html/classViewSelection-members.html index 6e4c446..6555992 100644 --- a/docs/html/classViewSelection-members.html +++ b/docs/html/classViewSelection-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/docs/html/classViewSelection.html b/docs/html/classViewSelection.html index 65f267e..fe63998 100644 --- a/docs/html/classViewSelection.html +++ b/docs/html/classViewSelection.html @@ -172,7 +172,7 @@ static std::vector< std::string >  diff --git a/docs/html/classes.html b/docs/html/classes.html index 446270b..87c806e 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -105,7 +105,7 @@ $(function() { diff --git a/docs/html/cli_8cpp_source.html b/docs/html/cli_8cpp_source.html index 525431d..b4f80ce 100644 --- a/docs/html/cli_8cpp_source.html +++ b/docs/html/cli_8cpp_source.html @@ -66,13 +66,13 @@ $(function() {
      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
      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 }
      +
      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
      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 }
      -
      static B15F & getInstance(void)
      Definition: b15f.cpp:432
      -
      static void setAbortHandler(errorhandler_t func)
      Definition: b15f.cpp:475
      +
      static B15F & getInstance(void)
      Definition: b15f.cpp:442
      +
      static void setAbortHandler(errorhandler_t func)
      Definition: b15f.cpp:485
      diff --git a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html index 56c8278..2262cc8 100644 --- a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html +++ b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html b/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html index 3bc1fd3..2ea82d4 100644 --- a/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html +++ b/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html b/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html index 0cced8a..33d8d0e 100644 --- a/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html +++ b/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html @@ -77,7 +77,7 @@ Directories diff --git a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html index 8fdcc74..966a7a3 100644 --- a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html +++ b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html b/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html index 44a759b..14a474b 100644 --- a/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html +++ b/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html b/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html index b8dd610..725e942 100644 --- a/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html +++ b/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html @@ -77,7 +77,7 @@ Directories diff --git a/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html b/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html index a5c7337..2128dc2 100644 --- a/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html +++ b/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html @@ -73,7 +73,7 @@ $(function() { diff --git a/docs/html/dot_8cpp_source.html b/docs/html/dot_8cpp_source.html index 8843565..1b3c965 100644 --- a/docs/html/dot_8cpp_source.html +++ b/docs/html/dot_8cpp_source.html @@ -77,7 +77,7 @@ $(function() {
      Dot(uint16_t x, uint16_t y, uint8_t curve)
      Definition: dot.cpp:3
      diff --git a/docs/html/dot_8h_source.html b/docs/html/dot_8h_source.html index 495eaf2..c50d107 100644 --- a/docs/html/dot_8h_source.html +++ b/docs/html/dot_8h_source.html @@ -78,7 +78,7 @@ $(function() {
      Dot(uint16_t x, uint16_t y, uint8_t curve)
      Definition: dot.cpp:3
      diff --git a/docs/html/driverexception_8h_source.html b/docs/html/driverexception_8h_source.html index 70cb66c..6b94aa6 100644 --- a/docs/html/driverexception_8h_source.html +++ b/docs/html/driverexception_8h_source.html @@ -74,7 +74,7 @@ $(function() { diff --git a/docs/html/feature__tests_8c_source.html b/docs/html/feature__tests_8c_source.html index 6782373..01a251f 100644 --- a/docs/html/feature__tests_8c_source.html +++ b/docs/html/feature__tests_8c_source.html @@ -73,7 +73,7 @@ $(function() {
      1 
      2 const char features[] = {"\n"
      3  "C_FEATURE:"
      4 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304
      5  "1"
      6 #else
      7  "0"
      8 #endif
      9  "c_function_prototypes\n"
      10  "C_FEATURE:"
      11 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
      12  "1"
      13 #else
      14  "0"
      15 #endif
      16  "c_restrict\n"
      17  "C_FEATURE:"
      18 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L
      19  "1"
      20 #else
      21  "0"
      22 #endif
      23  "c_static_assert\n"
      24  "C_FEATURE:"
      25 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
      26  "1"
      27 #else
      28  "0"
      29 #endif
      30  "c_variadic_macros\n"
      31 
      32  };
      33 
      34 int main(int argc, char** argv)
      35 {
      36  (void)argv;
      37  return features[argc];
      38 }
      diff --git a/docs/html/feature__tests_8cxx_source.html b/docs/html/feature__tests_8cxx_source.html index 260cda3..e4b0d1a 100644 --- a/docs/html/feature__tests_8cxx_source.html +++ b/docs/html/feature__tests_8cxx_source.html @@ -73,7 +73,7 @@ $(function() {
      1 
      2  const char features[] = {"\n"
      3 "CXX_FEATURE:"
      4 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
      5 "1"
      6 #else
      7 "0"
      8 #endif
      9 "cxx_aggregate_default_initializers\n"
      10 "CXX_FEATURE:"
      11 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
      12 "1"
      13 #else
      14 "0"
      15 #endif
      16 "cxx_alias_templates\n"
      17 "CXX_FEATURE:"
      18 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
      19 "1"
      20 #else
      21 "0"
      22 #endif
      23 "cxx_alignas\n"
      24 "CXX_FEATURE:"
      25 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
      26 "1"
      27 #else
      28 "0"
      29 #endif
      30 "cxx_alignof\n"
      31 "CXX_FEATURE:"
      32 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
      33 "1"
      34 #else
      35 "0"
      36 #endif
      37 "cxx_attributes\n"
      38 "CXX_FEATURE:"
      39 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
      40 "1"
      41 #else
      42 "0"
      43 #endif
      44 "cxx_attribute_deprecated\n"
      45 "CXX_FEATURE:"
      46 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      47 "1"
      48 #else
      49 "0"
      50 #endif
      51 "cxx_auto_type\n"
      52 "CXX_FEATURE:"
      53 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
      54 "1"
      55 #else
      56 "0"
      57 #endif
      58 "cxx_binary_literals\n"
      59 "CXX_FEATURE:"
      60 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      61 "1"
      62 #else
      63 "0"
      64 #endif
      65 "cxx_constexpr\n"
      66 "CXX_FEATURE:"
      67 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
      68 "1"
      69 #else
      70 "0"
      71 #endif
      72 "cxx_contextual_conversions\n"
      73 "CXX_FEATURE:"
      74 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      75 "1"
      76 #else
      77 "0"
      78 #endif
      79 "cxx_decltype\n"
      80 "CXX_FEATURE:"
      81 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
      82 "1"
      83 #else
      84 "0"
      85 #endif
      86 "cxx_decltype_auto\n"
      87 "CXX_FEATURE:"
      88 #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L
      89 "1"
      90 #else
      91 "0"
      92 #endif
      93 "cxx_decltype_incomplete_return_types\n"
      94 "CXX_FEATURE:"
      95 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      96 "1"
      97 #else
      98 "0"
      99 #endif
      100 "cxx_default_function_template_args\n"
      101 "CXX_FEATURE:"
      102 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      103 "1"
      104 #else
      105 "0"
      106 #endif
      107 "cxx_defaulted_functions\n"
      108 "CXX_FEATURE:"
      109 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      110 "1"
      111 #else
      112 "0"
      113 #endif
      114 "cxx_defaulted_move_initializers\n"
      115 "CXX_FEATURE:"
      116 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
      117 "1"
      118 #else
      119 "0"
      120 #endif
      121 "cxx_delegating_constructors\n"
      122 "CXX_FEATURE:"
      123 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      124 "1"
      125 #else
      126 "0"
      127 #endif
      128 "cxx_deleted_functions\n"
      129 "CXX_FEATURE:"
      130 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
      131 "1"
      132 #else
      133 "0"
      134 #endif
      135 "cxx_digit_separators\n"
      136 "CXX_FEATURE:"
      137 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      138 "1"
      139 #else
      140 "0"
      141 #endif
      142 "cxx_enum_forward_declarations\n"
      143 "CXX_FEATURE:"
      144 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      145 "1"
      146 #else
      147 "0"
      148 #endif
      149 "cxx_explicit_conversions\n"
      150 "CXX_FEATURE:"
      151 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
      152 "1"
      153 #else
      154 "0"
      155 #endif
      156 "cxx_extended_friend_declarations\n"
      157 "CXX_FEATURE:"
      158 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      159 "1"
      160 #else
      161 "0"
      162 #endif
      163 "cxx_extern_templates\n"
      164 "CXX_FEATURE:"
      165 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
      166 "1"
      167 #else
      168 "0"
      169 #endif
      170 "cxx_final\n"
      171 "CXX_FEATURE:"
      172 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      173 "1"
      174 #else
      175 "0"
      176 #endif
      177 "cxx_func_identifier\n"
      178 "CXX_FEATURE:"
      179 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      180 "1"
      181 #else
      182 "0"
      183 #endif
      184 "cxx_generalized_initializers\n"
      185 "CXX_FEATURE:"
      186 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
      187 "1"
      188 #else
      189 "0"
      190 #endif
      191 "cxx_generic_lambdas\n"
      192 "CXX_FEATURE:"
      193 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
      194 "1"
      195 #else
      196 "0"
      197 #endif
      198 "cxx_inheriting_constructors\n"
      199 "CXX_FEATURE:"
      200 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      201 "1"
      202 #else
      203 "0"
      204 #endif
      205 "cxx_inline_namespaces\n"
      206 "CXX_FEATURE:"
      207 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      208 "1"
      209 #else
      210 "0"
      211 #endif
      212 "cxx_lambdas\n"
      213 "CXX_FEATURE:"
      214 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
      215 "1"
      216 #else
      217 "0"
      218 #endif
      219 "cxx_lambda_init_captures\n"
      220 "CXX_FEATURE:"
      221 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      222 "1"
      223 #else
      224 "0"
      225 #endif
      226 "cxx_local_type_template_args\n"
      227 "CXX_FEATURE:"
      228 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      229 "1"
      230 #else
      231 "0"
      232 #endif
      233 "cxx_long_long_type\n"
      234 "CXX_FEATURE:"
      235 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      236 "1"
      237 #else
      238 "0"
      239 #endif
      240 "cxx_noexcept\n"
      241 "CXX_FEATURE:"
      242 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
      243 "1"
      244 #else
      245 "0"
      246 #endif
      247 "cxx_nonstatic_member_init\n"
      248 "CXX_FEATURE:"
      249 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      250 "1"
      251 #else
      252 "0"
      253 #endif
      254 "cxx_nullptr\n"
      255 "CXX_FEATURE:"
      256 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
      257 "1"
      258 #else
      259 "0"
      260 #endif
      261 "cxx_override\n"
      262 "CXX_FEATURE:"
      263 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      264 "1"
      265 #else
      266 "0"
      267 #endif
      268 "cxx_range_for\n"
      269 "CXX_FEATURE:"
      270 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      271 "1"
      272 #else
      273 "0"
      274 #endif
      275 "cxx_raw_string_literals\n"
      276 "CXX_FEATURE:"
      277 #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L
      278 "1"
      279 #else
      280 "0"
      281 #endif
      282 "cxx_reference_qualified_functions\n"
      283 "CXX_FEATURE:"
      284 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
      285 "1"
      286 #else
      287 "0"
      288 #endif
      289 "cxx_relaxed_constexpr\n"
      290 "CXX_FEATURE:"
      291 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
      292 "1"
      293 #else
      294 "0"
      295 #endif
      296 "cxx_return_type_deduction\n"
      297 "CXX_FEATURE:"
      298 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      299 "1"
      300 #else
      301 "0"
      302 #endif
      303 "cxx_right_angle_brackets\n"
      304 "CXX_FEATURE:"
      305 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      306 "1"
      307 #else
      308 "0"
      309 #endif
      310 "cxx_rvalue_references\n"
      311 "CXX_FEATURE:"
      312 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      313 "1"
      314 #else
      315 "0"
      316 #endif
      317 "cxx_sizeof_member\n"
      318 "CXX_FEATURE:"
      319 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      320 "1"
      321 #else
      322 "0"
      323 #endif
      324 "cxx_static_assert\n"
      325 "CXX_FEATURE:"
      326 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      327 "1"
      328 #else
      329 "0"
      330 #endif
      331 "cxx_strong_enums\n"
      332 "CXX_FEATURE:"
      333 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus
      334 "1"
      335 #else
      336 "0"
      337 #endif
      338 "cxx_template_template_parameters\n"
      339 "CXX_FEATURE:"
      340 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
      341 "1"
      342 #else
      343 "0"
      344 #endif
      345 "cxx_thread_local\n"
      346 "CXX_FEATURE:"
      347 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      348 "1"
      349 #else
      350 "0"
      351 #endif
      352 "cxx_trailing_return_types\n"
      353 "CXX_FEATURE:"
      354 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      355 "1"
      356 #else
      357 "0"
      358 #endif
      359 "cxx_unicode_literals\n"
      360 "CXX_FEATURE:"
      361 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      362 "1"
      363 #else
      364 "0"
      365 #endif
      366 "cxx_uniform_initialization\n"
      367 "CXX_FEATURE:"
      368 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      369 "1"
      370 #else
      371 "0"
      372 #endif
      373 "cxx_unrestricted_unions\n"
      374 "CXX_FEATURE:"
      375 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
      376 "1"
      377 #else
      378 "0"
      379 #endif
      380 "cxx_user_literals\n"
      381 "CXX_FEATURE:"
      382 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
      383 "1"
      384 #else
      385 "0"
      386 #endif
      387 "cxx_variable_templates\n"
      388 "CXX_FEATURE:"
      389 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      390 "1"
      391 #else
      392 "0"
      393 #endif
      394 "cxx_variadic_macros\n"
      395 "CXX_FEATURE:"
      396 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
      397 "1"
      398 #else
      399 "0"
      400 #endif
      401 "cxx_variadic_templates\n"
      402 
      403 };
      404 
      405 int main(int argc, char** argv) { (void)argv; return features[argc]; }
      diff --git a/docs/html/files.html b/docs/html/files.html index 2907cef..039cca8 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -109,7 +109,7 @@ $(function() { diff --git a/docs/html/functions.html b/docs/html/functions.html index 1392eed..30f0fa8 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -134,6 +134,9 @@ $(function() {
    • Dot() : Dot
    • +
    • drop() +: USART +
    @@ -217,7 +220,8 @@ $(function() {

    - m -

    • msg -: USARTException +: TimeoutException +, USARTException
    • MSG_FAIL : B15F @@ -329,6 +333,9 @@ $(function() {
    • testIntConv() : B15F
    • +
    • TimeoutException() +: TimeoutException +
    • transmit() : USART
    • @@ -350,7 +357,8 @@ $(function() { : B15F
    • what() -: USARTException +: TimeoutException +, USARTException
    • writeToFile() : PlottyFile @@ -359,6 +367,9 @@ $(function() {

      - ~ -

        +
      • ~TimeoutException() +: TimeoutException +
      • ~USART() : USART
      • @@ -369,7 +380,7 @@ $(function() { diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html index 6ba4bdd..4922bf1 100644 --- a/docs/html/functions_func.html +++ b/docs/html/functions_func.html @@ -127,6 +127,9 @@ $(function() {
      • Dot() : Dot
      • +
      • drop() +: USART +
      @@ -300,6 +303,9 @@ $(function() {
    • testIntConv() : B15F
    • +
    • TimeoutException() +: TimeoutException +
    • transmit() : USART
    • @@ -318,7 +324,8 @@ $(function() {

      - w -

      • what() -: USARTException +: TimeoutException +, USARTException
      • writeToFile() : PlottyFile @@ -327,6 +334,9 @@ $(function() {

        - ~ -

          +
        • ~TimeoutException() +: TimeoutException +
        • ~USART() : USART
        • @@ -337,7 +347,7 @@ $(function() { diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index 2d91bb7..906e3fd 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -67,7 +67,8 @@ $(function() { : B15F
        • msg -: USARTException +: TimeoutException +, USARTException
        • MSG_FAIL : B15F @@ -91,7 +92,7 @@ $(function() { diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html index f062b1e..2f4a5cf 100644 --- a/docs/html/hierarchy.html +++ b/docs/html/hierarchy.html @@ -86,7 +86,7 @@ $(function() { diff --git a/docs/html/index.html b/docs/html/index.html index 3a701c1..04713b4 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -137,7 +137,7 @@ Dabei gehören Punkte mit dem gleichen Index für curve (uint8_ diff --git a/docs/html/plottyfile_8cpp_source.html b/docs/html/plottyfile_8cpp_source.html index 845e297..1c79cc6 100644 --- a/docs/html/plottyfile_8cpp_source.html +++ b/docs/html/plottyfile_8cpp_source.html @@ -101,7 +101,7 @@ $(function() {
          std::string getUnitX(void) const
          Definition: plottyfile.cpp:105
          diff --git a/docs/html/plottyfile_8h_source.html b/docs/html/plottyfile_8h_source.html index de56b4f..7770c6e 100644 --- a/docs/html/plottyfile_8h_source.html +++ b/docs/html/plottyfile_8h_source.html @@ -102,7 +102,7 @@ $(function() {
          std::string getUnitX(void) const
          Definition: plottyfile.cpp:105
          diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js index 8c65e1c..f5a3874 100644 --- a/docs/html/search/all_10.js +++ b/docs/html/search/all_10.js @@ -1,5 +1,6 @@ var searchData= [ + ['_7etimeoutexception',['~TimeoutException',['../classTimeoutException.html#a2f686b262d2ccffa0090fda9b44ab540',1,'TimeoutException']]], ['_7eusart',['~USART',['../classUSART.html#a0c8eb1a939ca00921e22f6cbcc7bb749',1,'USART']]], ['_7eusartexception',['~USARTException',['../classUSARTException.html#a0e008b3cb4974859e6bc8c8f8eb480be',1,'USARTException']]] ]; diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js index 08afc23..937a08b 100644 --- a/docs/html/search/all_3.js +++ b/docs/html/search/all_3.js @@ -8,5 +8,6 @@ var searchData= ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], ['dot',['Dot',['../classDot.html',1,'Dot'],['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot::Dot()']]], - ['driverexception',['DriverException',['../classDriverException.html',1,'']]] + ['driverexception',['DriverException',['../classDriverException.html',1,'']]], + ['drop',['drop',['../classUSART.html#a038d00c0b3d8c0c13c3e7eae5dad7813',1,'USART']]] ]; diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js index 7c761ff..66df4a3 100644 --- a/docs/html/search/all_7.js +++ b/docs/html/search/all_7.js @@ -1,6 +1,6 @@ var searchData= [ - ['msg',['msg',['../classUSARTException.html#a14c80df95f216d221aa97cffbcd8dd79',1,'USARTException']]], + ['msg',['msg',['../classTimeoutException.html#aa625fc0fae48a67737a98eafb91c9624',1,'TimeoutException::msg()'],['../classUSARTException.html#a14c80df95f216d221aa97cffbcd8dd79',1,'USARTException::msg()']]], ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] ]; diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js index 9b03a67..37e3d29 100644 --- a/docs/html/search/all_c.js +++ b/docs/html/search/all_c.js @@ -2,6 +2,6 @@ var searchData= [ ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], - ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'']]], + ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'TimeoutException'],['../classTimeoutException.html#aa45912234da11ffc9dd3594a1bbc0218',1,'TimeoutException::TimeoutException(const char *message)'],['../classTimeoutException.html#ad6e5c200fbfd276f48a6c1163e2d2988',1,'TimeoutException::TimeoutException(const std::string &message)']]], ['transmit',['transmit',['../classUSART.html#a41b19dd58f307015b73e154048cd74ca',1,'USART']]] ]; diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js index 511b30a..38b315c 100644 --- a/docs/html/search/all_f.js +++ b/docs/html/search/all_f.js @@ -1,6 +1,6 @@ var searchData= [ ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]], - ['what',['what',['../classUSARTException.html#a2af5e3c00cd0585c7427c2e0420a8f15',1,'USARTException']]], + ['what',['what',['../classTimeoutException.html#a97eaf01fc39ddb94b060020b42fefd6e',1,'TimeoutException::what()'],['../classUSARTException.html#a2af5e3c00cd0585c7427c2e0420a8f15',1,'USARTException::what()']]], ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] ]; diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js index 7c01e06..06f50ef 100644 --- a/docs/html/search/functions_2.js +++ b/docs/html/search/functions_2.js @@ -7,5 +7,6 @@ var searchData= ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], - ['dot',['Dot',['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot']]] + ['dot',['Dot',['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot']]], + ['drop',['drop',['../classUSART.html#a038d00c0b3d8c0c13c3e7eae5dad7813',1,'USART']]] ]; diff --git a/docs/html/search/functions_a.js b/docs/html/search/functions_a.js index a8ec38d..c417073 100644 --- a/docs/html/search/functions_a.js +++ b/docs/html/search/functions_a.js @@ -2,5 +2,6 @@ var searchData= [ ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], + ['timeoutexception',['TimeoutException',['../classTimeoutException.html#aa45912234da11ffc9dd3594a1bbc0218',1,'TimeoutException::TimeoutException(const char *message)'],['../classTimeoutException.html#ad6e5c200fbfd276f48a6c1163e2d2988',1,'TimeoutException::TimeoutException(const std::string &message)']]], ['transmit',['transmit',['../classUSART.html#a41b19dd58f307015b73e154048cd74ca',1,'USART']]] ]; diff --git a/docs/html/search/functions_c.js b/docs/html/search/functions_c.js index 1a80ade..b730bff 100644 --- a/docs/html/search/functions_c.js +++ b/docs/html/search/functions_c.js @@ -1,5 +1,5 @@ var searchData= [ - ['what',['what',['../classUSARTException.html#a2af5e3c00cd0585c7427c2e0420a8f15',1,'USARTException']]], + ['what',['what',['../classTimeoutException.html#a97eaf01fc39ddb94b060020b42fefd6e',1,'TimeoutException::what()'],['../classUSARTException.html#a2af5e3c00cd0585c7427c2e0420a8f15',1,'USARTException::what()']]], ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] ]; diff --git a/docs/html/search/functions_d.js b/docs/html/search/functions_d.js index 8c65e1c..f5a3874 100644 --- a/docs/html/search/functions_d.js +++ b/docs/html/search/functions_d.js @@ -1,5 +1,6 @@ var searchData= [ + ['_7etimeoutexception',['~TimeoutException',['../classTimeoutException.html#a2f686b262d2ccffa0090fda9b44ab540',1,'TimeoutException']]], ['_7eusart',['~USART',['../classUSART.html#a0c8eb1a939ca00921e22f6cbcc7bb749',1,'USART']]], ['_7eusartexception',['~USARTException',['../classUSARTException.html#a0e008b3cb4974859e6bc8c8f8eb480be',1,'USARTException']]] ]; diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js index 7c761ff..66df4a3 100644 --- a/docs/html/search/variables_1.js +++ b/docs/html/search/variables_1.js @@ -1,6 +1,6 @@ var searchData= [ - ['msg',['msg',['../classUSARTException.html#a14c80df95f216d221aa97cffbcd8dd79',1,'USARTException']]], + ['msg',['msg',['../classTimeoutException.html#aa625fc0fae48a67737a98eafb91c9624',1,'TimeoutException::msg()'],['../classUSARTException.html#a14c80df95f216d221aa97cffbcd8dd79',1,'USARTException::msg()']]], ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] ]; diff --git a/docs/html/timeoutexception_8h_source.html b/docs/html/timeoutexception_8h_source.html index 93a32f7..9e21b38 100644 --- a/docs/html/timeoutexception_8h_source.html +++ b/docs/html/timeoutexception_8h_source.html @@ -70,11 +70,16 @@ $(function() {
          timeoutexception.h
          -
          1 #ifndef TIMEOUTEXCEPTION_H
          2 #define TIMEOUTEXCEPTION_H
          3 
          4 #include <exception>
          5 
          6 // SOURCE: https://stackoverflow.com/a/8152888
          7 
          10 class TimeoutException: public std::exception
          11 {
          12 public:
          13  explicit TimeoutException(const char* message, int timeout) : TimeoutException(std::string(message), timeout)
          14  {
          15  }
          16 
          17  explicit TimeoutException(const std::string& message, int timeout) : msg(message), m_timeout(timeout)
          18  {
          19  if(!msg.length())
          20  msg = "Timeout reached (" + std::to_string(m_timeout) + ")";
          21  }
          22 
          23  virtual ~TimeoutException() throw ()
          24  {
          25  }
          26 
          27  virtual const char* what() const throw ()
          28  {
          29  return msg.c_str();
          30  }
          31 
          32 protected:
          33  std::string msg;
          34  int m_timeout;
          35 };
          36 
          37 #endif // TIMEOUTEXCEPTION_H
          - +
          1 #ifndef TIMEOUTEXCEPTION_H
          2 #define TIMEOUTEXCEPTION_H
          3 
          4 #include <exception>
          5 #include <string>
          6 
          9 class TimeoutException: public std::exception
          10 {
          11 public:
          16  explicit TimeoutException(const char* message) : msg(message)
          17  {
          18  }
          19 
          24  explicit TimeoutException(const std::string& message) : msg(message)
          25  {
          26  }
          27 
          31  virtual ~TimeoutException() = default;
          32 
          37  virtual const char* what() const throw ()
          38  {
          39  return msg.c_str();
          40  }
          41 
          42 protected:
          43  std::string msg;
          44 };
          45 
          46 #endif // TIMEOUTEXCEPTION_H
          +
          virtual ~TimeoutException()=default
          +
          std::string msg
          failure description
          +
          virtual const char * what() const
          +
          TimeoutException(const char *message)
          + +
          TimeoutException(const std::string &message)
          diff --git a/docs/html/ui_8cpp_source.html b/docs/html/ui_8cpp_source.html index ce9aac2..2b38b03 100644 --- a/docs/html/ui_8cpp_source.html +++ b/docs/html/ui_8cpp_source.html @@ -73,22 +73,22 @@ $(function() {
          1 #include "ui.h"
          2 #include "../drv/b15f.h"
          3 
          4 std::vector<View*> win_stack;
          5 std::thread t_refresh;
          6 
          7 void show_main(int)
          8 {
          9  ViewSelection* view = new ViewSelection();
          10  view->setTitle("B15F - Command Line Interface");
          11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
          12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
          13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
          14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
          15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
          16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
          17  view->addChoice("[ Informationen ]", &show_info);
          18  view->addChoice("", nullptr);
          19  view->addChoice("[ Beenden ]", &finish);
          20  view->repaint();
          21 
          22  win_stack.push_back(view);
          23  input(0);
          24 }
          25 
          26 void input(int)
          27 {
          28  call_t nextCall;
          29  int key;
          30  do
          31  {
          32  key = wgetch(View::getWinContext());
          33  win_stack.back()->repaint();
          34  nextCall = win_stack.back()->keypress(key);
          35 
          36  if(key == -1)
          37  view_back(key);
          38 
          39  if(nextCall)
          40  nextCall(key);
          41  }
          42  while(win_stack.size());
          43 }
          44 
          45 void view_back(int)
          46 {
          47  if(win_stack.size())
          48  {
          49  delete win_stack.back();
          50  win_stack.pop_back();
          51  }
          52  if(win_stack.size())
          53  win_stack.back()->repaint();
          54 }
          55 
          56 void finish(int)
          57 {
          58  cleanup();
          59  exit(EXIT_SUCCESS);
          60 }
          61 
          62 void cleanup()
          63 {
          64  if(t_refresh.joinable())
          65  t_refresh.join();
          66  clrtoeol();
          67  refresh();
          68  endwin();
          69 }
          70 
          71 void show_info(int)
          72 {
          73  ViewInfo* view = new ViewInfo();
          74  view->setTitle("Info");
          75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
          76  view->setLabelClose("[ Zurueck ]");
          77  view->repaint();
          78 
          79  win_stack.push_back(view);
          80  input(0);
          81 }
          82 
          83 void show_monitor(int)
          84 {
          85  ViewMonitor* view = new ViewMonitor();
          86  view->setTitle("Monitor");
          87  view->setText("\nErfasse Messwerte...");
          88  view->setLabelClose("[ Zurueck ]");
          89  view->repaint();
          90 
          91  win_stack.push_back(view);
          92  input(0);
          93 }
          94 
          95 void show_invalid_port_input(int)
          96 {
          97  ViewInfo* view = new ViewInfo();
          98  view->setTitle("Falsche Eingabe");
          99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
          100  view->setLabelClose("[ Schliessen ]");
          101  view->repaint();
          102 
          103  win_stack.push_back(view);
          104  input(0);
          105 }
          106 
          107 void show_invalid_dac_input(int)
          108 {
          109  ViewInfo* view = new ViewInfo();
          110  view->setTitle("Falsche Eingabe");
          111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
          112  view->setLabelClose("[ Schliessen ]");
          113  view->repaint();
          114 
          115  win_stack.push_back(view);
          116  input(0);
          117 }
          118 
          119 void write_digital_output0(int)
          120 {
          121  try
          122  {
          123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
          124  if(d > 255 || 0 > d)
          125  throw std::invalid_argument("bad value");
          126  uint8_t port = static_cast<uint8_t>(d);
          127 
          128  B15F& drv = B15F::getInstance();
          129  drv.digitalWrite0(port);
          130  view_back(0);
          131  }
          132  catch(std::invalid_argument& ex)
          133  {
          134  show_invalid_port_input(0);
          135  }
          136 }
          137 
          138 void write_digital_output1(int)
          139 {
          140  try
          141  {
          142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
          143  if(d > 255 || 0 > d)
          144  throw std::invalid_argument("bad value");
          145  uint8_t port = static_cast<uint8_t>(d);
          146 
          147  B15F& drv = B15F::getInstance();
          148  drv.digitalWrite1(port);
          149  view_back(0);
          150  }
          151  catch(std::invalid_argument& ex)
          152  {
          153  show_invalid_port_input(0);
          154  }
          155 }
          156 
          157 void write_analog_output0(int)
          158 {
          159  try
          160  {
          161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
          162  if(port > 1023)
          163  throw std::invalid_argument("bad value");
          164 
          165  B15F& drv = B15F::getInstance();
          166  drv.analogWrite0(port);
          167  view_back(0);
          168  }
          169  catch(std::invalid_argument& ex)
          170  {
          171  show_invalid_dac_input(0);
          172  }
          173 }
          174 
          175 void write_analog_output1(int)
          176 {
          177  try
          178  {
          179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
          180  if(port > 1023)
          181  throw std::invalid_argument("bad value");
          182 
          183  B15F& drv = B15F::getInstance();
          184  drv.analogWrite1(port);
          185  view_back(0);
          186  }
          187  catch(std::invalid_argument& ex)
          188  {
          189  show_invalid_dac_input(0);
          190  }
          191 }
          192 
          193 void show_digital_output0(int)
          194 {
          195  ViewPromt* view = new ViewPromt();
          196  view->setTitle("Digitale Ausgabe BE0");
          197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
          198  view->setCancel("[ Zurueck ]", true);
          199  view->setConfirm("[ OK ]", &write_digital_output0);
          200  view->repaint();
          201 
          202  win_stack.push_back(view);
          203  input(0);
          204 }
          205 
          206 void show_digital_output1(int)
          207 {
          208  ViewPromt* view = new ViewPromt();
          209  view->setTitle("Digitale Ausgabe BE1");
          210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
          211  view->setCancel("[ Zurueck ]", true);
          212  view->setConfirm("[ OK ]", &write_digital_output1);
          213  view->repaint();
          214 
          215  win_stack.push_back(view);
          216  input(0);
          217 }
          218 
          219 void show_analog_output0(int)
          220 {
          221  ViewPromt* view = new ViewPromt();
          222  view->setTitle("Analoge Ausgabe AA0");
          223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
          224  view->setCancel("[ Zurueck ]", true);
          225  view->setConfirm("[ OK ]", &write_analog_output0);
          226  view->repaint();
          227 
          228  win_stack.push_back(view);
          229  input(0);
          230 }
          231 
          232 void show_analog_output1(int)
          233 {
          234  ViewPromt* view = new ViewPromt();
          235  view->setTitle("Analoge Ausgabe AA1");
          236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
          237  view->setCancel("[ Zurueck ]", true);
          238  view->setConfirm("[ OK ]", &write_analog_output1);
          239  view->repaint();
          240 
          241  win_stack.push_back(view);
          242  input(0);
          243 }
          244 
          245 void start_selftest(int)
          246 {
          247  B15F& drv = B15F::getInstance();
          248  drv.activateSelfTestMode();
          249 
          250  ViewInfo* view = new ViewInfo();
          251  view->setTitle("Selbsttest aktiv");
          252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
          253  view->setLabelClose("[ Selbsttest Beenden ]");
          254  view->setCall(&stop_selftest);
          255  view->repaint();
          256 
          257  win_stack.push_back(view);
          258  input(0);
          259 }
          260 
          261 void stop_selftest(int)
          262 {
          263  B15F& drv = B15F::getInstance();
          264  drv.discard();
          266  drv.reconnect();
          267  drv.digitalWrite0(0);
          268  drv.digitalWrite1(0);
          269 }
          270 
          271 void show_selftest_info(int)
          272 {
          273  ViewInfo* view = new ViewInfo();
          274  view->setTitle("Selbsttest");
          275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
          276  view->setLabelClose("[ Weiter ]");
          277  view->setCall(&start_selftest);
          278  view->repaint();
          279 
          280  win_stack.push_back(view);
          281  input(0);
          282 }
          -
          void delay_ms(uint16_t ms)
          Definition: b15f.cpp:422
          -
          static B15F & getInstance(void)
          Definition: b15f.cpp:432
          +
          void delay_ms(uint16_t ms)
          Definition: b15f.cpp:432
          +
          static B15F & getInstance(void)
          Definition: b15f.cpp:442
          Definition: b15f.h:26
          -
          bool digitalWrite0(uint8_t)
          Definition: b15f.cpp:182
          -
          bool activateSelfTestMode(void)
          Definition: b15f.cpp:169
          +
          bool digitalWrite0(uint8_t)
          Definition: b15f.cpp:179
          +
          bool activateSelfTestMode(void)
          Definition: b15f.cpp:166
          -
          bool analogWrite1(uint16_t port)
          Definition: b15f.cpp:267
          +
          bool analogWrite1(uint16_t port)
          Definition: b15f.cpp:264
          -
          bool digitalWrite1(uint8_t)
          Definition: b15f.cpp:196
          +
          bool digitalWrite1(uint8_t)
          Definition: b15f.cpp:193
          void discard(void)
          Definition: b15f.cpp:72
          constexpr static uint16_t WDT_TIMEOUT
          Time in ms after which the watch dog timer resets the MCU.
          Definition: b15f.h:235
          void reconnect(void)
          Definition: b15f.cpp:57
          -
          bool analogWrite0(uint16_t port)
          Definition: b15f.cpp:252
          +
          bool analogWrite0(uint16_t port)
          Definition: b15f.cpp:249
          diff --git a/docs/html/ui_8h_source.html b/docs/html/ui_8h_source.html index 5f300c9..6abbc9e 100644 --- a/docs/html/ui_8h_source.html +++ b/docs/html/ui_8h_source.html @@ -73,7 +73,7 @@ $(function() {
          1 #ifndef UI_H
          2 #define UI_H
          3 
          4 #include <vector>
          5 #include "view_selection.h"
          6 #include "view_info.h"
          7 #include "view_monitor.h"
          8 #include "view_promt.h"
          9 
          10 void show_main(int);
          11 void input(int);
          12 void view_back(int);
          13 void finish(int);
          14 void cleanup();
          15 
          16 void show_info(int);
          17 void show_monitor(int);
          18 void show_invalid_port_input(int);
          19 void show_invalid_dac_input(int);
          20 void write_digital_output0(int);
          21 void write_digital_output1(int);
          22 void write_analog_output0(int);
          23 void write_analog_output1(int);
          24 void show_digital_output0(int);
          25 void show_digital_output1(int);
          26 void show_analog_output0(int);
          27 void show_analog_output1(int);
          28 
          29 // selftest group
          30 void show_selftest_info(int);
          31 void start_selftest(int);
          32 void stop_selftest(int);
          33 
          34 
          35 extern std::vector<View*> win_stack;
          36 extern std::thread t_refresh;
          37 
          38 #endif // UI_H
          diff --git a/docs/html/usart_8cpp_source.html b/docs/html/usart_8cpp_source.html index e8912fd..5df9380 100644 --- a/docs/html/usart_8cpp_source.html +++ b/docs/html/usart_8cpp_source.html @@ -70,23 +70,25 @@ $(function() {
          usart.cpp
          -
          1 #include <stdexcept>
          2 #include "usart.h"
          3 
          5 {
          6  closeDevice();
          7 }
          8 
          9 void USART::openDevice(std::string device)
          10 {
          11  // Benutze blockierenden Modus
          12  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY);// | O_NDELAY
          13  if (file_desc <= 0)
          14  throw USARTException("Fehler beim Öffnen des Gerätes");
          15 
          16  struct termios options;
          17  int code = tcgetattr(file_desc, &options);
          18  if (code)
          19  throw USARTException("Fehler beim Lesen der Geräteparameter");
          20 
          21  options.c_cflag = CS8 | CLOCAL | CREAD;
          22  options.c_iflag = IGNPAR;
          23  options.c_oflag = 0;
          24  options.c_lflag = 0;
          25  options.c_cc[VMIN] = 0;
          26  options.c_cc[VTIME] = timeout;
          27  code = cfsetspeed(&options, baudrate);
          28  if (code)
          29  throw USARTException("Fehler beim Setzen der Baudrate");
          30 
          31  code = tcsetattr(file_desc, TCSANOW, &options);
          32  if (code)
          33  throw USARTException("Fehler beim Setzen der Geräteparameter");
          34 
          35  code = fcntl(file_desc, F_SETFL, 0); // blockierender Modus
          36  if (code)
          37  throw USARTException("Fehler beim Aktivieren des blockierenden Modus'");
          38 
          41 }
          42 
          44 {
          45  if (file_desc > 0)
          46  {
          47  int code = close(file_desc);
          48  if (code)
          49  throw USARTException("Fehler beim Schließen des Gerätes");
          50  file_desc = -1;
          51  }
          52 }
          53 
          55 {
          56  int code = tcflush(file_desc, TCIFLUSH);
          57  if (code)
          58  throw USARTException("Fehler beim Leeren des Eingangspuffers");
          59 }
          60 
          62 {
          63  int code = tcflush(file_desc, TCOFLUSH);
          64  if (code)
          65  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
          66 }
          67 
          69 {
          70  int code = tcdrain(file_desc);
          71  if (code)
          72  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
          73 }
          74 
          75 void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          76 {
          77  int bytes_avail, code;
          78  do
          79  {
          80  code = ioctl(file_desc, FIONREAD, &bytes_avail);
          81  if(code)
          82  throw USARTException(
          83  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          84  ", " + strerror(code) + " (code " + std::to_string(code) + ")");
          85  }
          86  while(bytes_avail < len);
          87 
          88  code = read(file_desc, buffer + offset, len);
          89  if (code != len)
          90  throw USARTException(
          91  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          92  ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")");
          93 }
          94 
          95 void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          96 {
          97  int code = write(file_desc, buffer + offset, len);
          98  if (code != len)
          99  throw USARTException(
          100  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          101  ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")");
          102 }
          103 
          105 {
          106  return baudrate;
          107 }
          108 
          110 {
          111  return timeout;
          112 }
          113 
          114 void USART::setBaudrate(uint32_t baudrate)
          115 {
          116  this->baudrate = baudrate;
          117 }
          118 
          119 void USART::setTimeout(uint8_t timeout)
          120 {
          121  this->timeout = timeout;
          122 }
          -
          uint32_t getBaudrate(void)
          Definition: usart.cpp:104
          +
          1 #include <stdexcept>
          2 #include "usart.h"
          3 
          5 {
          6  closeDevice();
          7 }
          8 
          9 void USART::openDevice(std::string device)
          10 {
          11  // Benutze blockierenden Modus
          12  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY);// | O_NDELAY
          13  if (file_desc <= 0)
          14  throw USARTException("Fehler beim Öffnen des Gerätes");
          15 
          16  struct termios options;
          17  int code = tcgetattr(file_desc, &options);
          18  if (code)
          19  throw USARTException("Fehler beim Lesen der Geräteparameter");
          20 
          21  options.c_cflag = CS8 | CLOCAL | CREAD;
          22  options.c_iflag = IGNPAR;
          23  options.c_oflag = 0;
          24  options.c_lflag = 0;
          25  options.c_cc[VMIN] = 0;
          26  options.c_cc[VTIME] = timeout;
          27  code = cfsetspeed(&options, baudrate);
          28  if (code)
          29  throw USARTException("Fehler beim Setzen der Baudrate");
          30 
          31  code = tcsetattr(file_desc, TCSANOW, &options);
          32  if (code)
          33  throw USARTException("Fehler beim Setzen der Geräteparameter");
          34 
          35  code = fcntl(file_desc, F_SETFL, 0); // blockierender Modus
          36  if (code)
          37  throw USARTException("Fehler beim Aktivieren des blockierenden Modus'");
          38 
          41 }
          42 
          44 {
          45  if (file_desc > 0)
          46  {
          47  int code = close(file_desc);
          48  if (code)
          49  throw USARTException("Fehler beim Schließen des Gerätes");
          50  file_desc = -1;
          51  }
          52 }
          53 
          55 {
          56  int code = tcflush(file_desc, TCIFLUSH);
          57  if (code)
          58  throw USARTException("Fehler beim Leeren des Eingangspuffers");
          59 }
          60 
          62 {
          63  int code = tcflush(file_desc, TCOFLUSH);
          64  if (code)
          65  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
          66 }
          67 
          69 {
          70  int code = tcdrain(file_desc);
          71  if (code)
          72  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
          73 }
          74 
          75 void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          76 {
          77  int code = write(file_desc, buffer + offset, len);
          78  if (code != len)
          79  throw USARTException(
          80  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          81  ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")");
          82 }
          83 
          84 void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          85 {
          86  int bytes_avail, code;
          87  auto start = std::chrono::steady_clock::now();
          88  auto end = std::chrono::steady_clock::now();
          89  do
          90  {
          91  code = ioctl(file_desc, FIONREAD, &bytes_avail);
          92  if (code)
          93  throw USARTException(
          94  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          95  ", " + strerror(code) + " (code " + std::to_string(code) + ")");
          96 
          97  end = std::chrono::steady_clock::now();
          98  long elapsed =
          99  std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() / 100; // in Dezisekunden
          100  if (elapsed >= timeout)
          101  throw TimeoutException(
          102  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          103  ", " + std::to_string(elapsed) + " / " + std::to_string(timeout) + " ds");
          104  }
          105  while (bytes_avail < len);
          106 
          107  code = read(file_desc, buffer + offset, len);
          108  if (code != len)
          109  throw USARTException(
          110  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          111  ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")");
          112 }
          113 
          114 void USART::drop(uint8_t len)
          115 {
          116  // Kann bestimmt noch eleganter gelöst werden
          117  uint8_t dummy[len];
          118  receive(&dummy[0], 0, len);
          119 }
          120 
          122 {
          123  return baudrate;
          124 }
          125 
          127 {
          128  return timeout;
          129 }
          130 
          131 void USART::setBaudrate(uint32_t baudrate)
          132 {
          133  this->baudrate = baudrate;
          134 }
          135 
          136 void USART::setTimeout(uint8_t timeout)
          137 {
          138  this->timeout = timeout;
          139 }
          +
          uint32_t getBaudrate(void)
          Definition: usart.cpp:121
          void closeDevice(void)
          Definition: usart.cpp:43
          -
          void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:95
          -
          void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:75
          +
          void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:75
          +
          void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:84
          void clearInputBuffer(void)
          Definition: usart.cpp:54
          -
          uint8_t getTimeout(void)
          Definition: usart.cpp:109
          +
          uint8_t getTimeout(void)
          Definition: usart.cpp:126
          void clearOutputBuffer(void)
          Definition: usart.cpp:61
          -
          void setBaudrate(uint32_t baudrate)
          Definition: usart.cpp:114
          +
          void setBaudrate(uint32_t baudrate)
          Definition: usart.cpp:131
          virtual ~USART(void)
          Definition: usart.cpp:4
          void openDevice(std::string device)
          Definition: usart.cpp:9
          -
          void setTimeout(uint8_t timeout)
          Definition: usart.cpp:119
          +
          void drop(uint8_t len)
          Definition: usart.cpp:114
          +
          void setTimeout(uint8_t timeout)
          Definition: usart.cpp:136
          void flushOutputBuffer(void)
          Definition: usart.cpp:68
          + diff --git a/docs/html/usart_8h_source.html b/docs/html/usart_8h_source.html index fdf1e0e..ea270ec 100644 --- a/docs/html/usart_8h_source.html +++ b/docs/html/usart_8h_source.html @@ -70,24 +70,25 @@ $(function() {
          usart.h
          -
          1 #ifndef USART_H
          2 #define USART_H
          3 
          4 #include <cstdint>
          5 #include <fcntl.h>
          6 #include <unistd.h>
          7 #include <termios.h>
          8 #include <iostream>
          9 #include <sys/ioctl.h>
          10 #include <string.h>
          11 #include "usartexception.h"
          12 
          15 class USART
          16 {
          17 public:
          18 
          19  /*************************************************
          20  * Methoden für die Verwaltung der Schnittstelle *
          21  *************************************************/
          22 
          26  explicit USART() = default;
          27 
          31  virtual ~USART(void);
          32 
          38  void openDevice(std::string device);
          39 
          44  void closeDevice(void);
          45 
          50  void clearInputBuffer(void);
          51 
          56  void clearOutputBuffer(void);
          57 
          62  void flushOutputBuffer(void);
          63 
          64  /*************************************************/
          65 
          66 
          67 
          68  /*************************************
          69  * Methoden für die Datenübertragung *
          70  *************************************/
          71 
          79  void transmit(uint8_t *buffer, uint16_t offset, uint8_t len);
          80 
          88  void receive(uint8_t *buffer, uint16_t offset, uint8_t len);
          89 
          90  /*************************************/
          91 
          92 
          93 
          94  /***************************************
          95  * Methoden für einstellbare Parameter *
          96  ***************************************/
          97 
          102  uint32_t getBaudrate(void);
          103 
          108  uint8_t getTimeout(void);
          109 
          114  void setBaudrate(uint32_t baudrate);
          115 
          120  void setTimeout(uint8_t timeout);
          121 
          122  /***************************************/
          123 
          124 private:
          125 
          126  int file_desc = -1;
          127  uint32_t baudrate = 9600;
          128  uint8_t timeout = 100;
          129 };
          130 
          131 #endif // USART_H
          -
          uint32_t getBaudrate(void)
          Definition: usart.cpp:104
          +
          1 #ifndef USART_H
          2 #define USART_H
          3 
          4 #include <cstdint>
          5 #include <chrono>
          6 #include <fcntl.h>
          7 #include <unistd.h>
          8 #include <termios.h>
          9 #include <sys/ioctl.h>
          10 #include <string.h>
          11 #include "usartexception.h"
          12 #include "timeoutexception.h"
          13 
          16 class USART
          17 {
          18 public:
          19 
          20  /*************************************************
          21  * Methoden für die Verwaltung der Schnittstelle *
          22  *************************************************/
          23 
          27  explicit USART() = default;
          28 
          32  virtual ~USART(void);
          33 
          39  void openDevice(std::string device);
          40 
          45  void closeDevice(void);
          46 
          51  void clearInputBuffer(void);
          52 
          57  void clearOutputBuffer(void);
          58 
          63  void flushOutputBuffer(void);
          64 
          65  /*************************************************/
          66 
          67 
          68 
          69  /*************************************
          70  * Methoden für die Datenübertragung *
          71  *************************************/
          72 
          80  void transmit(uint8_t *buffer, uint16_t offset, uint8_t len);
          81 
          89  void receive(uint8_t *buffer, uint16_t offset, uint8_t len);
          90 
          96  void drop(uint8_t len);
          97 
          98  /*************************************/
          99 
          100 
          101 
          102  /***************************************
          103  * Methoden für einstellbare Parameter *
          104  ***************************************/
          105 
          110  uint32_t getBaudrate(void);
          111 
          116  uint8_t getTimeout(void);
          117 
          122  void setBaudrate(uint32_t baudrate);
          123 
          128  void setTimeout(uint8_t timeout);
          129 
          130  /***************************************/
          131 
          132 private:
          133 
          134  int file_desc = -1;
          135  uint32_t baudrate = 9600;
          136  uint8_t timeout = 10;
          137 };
          138 
          139 #endif // USART_H
          +
          uint32_t getBaudrate(void)
          Definition: usart.cpp:121
          USART()=default
          void closeDevice(void)
          Definition: usart.cpp:43
          -
          void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:95
          -
          void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:75
          +
          void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:75
          +
          void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:84
          void clearInputBuffer(void)
          Definition: usart.cpp:54
          -
          uint8_t getTimeout(void)
          Definition: usart.cpp:109
          -
          Definition: usart.h:15
          +
          uint8_t getTimeout(void)
          Definition: usart.cpp:126
          +
          Definition: usart.h:16
          void clearOutputBuffer(void)
          Definition: usart.cpp:61
          -
          void setBaudrate(uint32_t baudrate)
          Definition: usart.cpp:114
          +
          void setBaudrate(uint32_t baudrate)
          Definition: usart.cpp:131
          virtual ~USART(void)
          Definition: usart.cpp:4
          void openDevice(std::string device)
          Definition: usart.cpp:9
          -
          void setTimeout(uint8_t timeout)
          Definition: usart.cpp:119
          +
          void drop(uint8_t len)
          Definition: usart.cpp:114
          +
          void setTimeout(uint8_t timeout)
          Definition: usart.cpp:136
          void flushOutputBuffer(void)
          Definition: usart.cpp:68
          diff --git a/docs/html/usartexception_8h_source.html b/docs/html/usartexception_8h_source.html index 4463697..d01d386 100644 --- a/docs/html/usartexception_8h_source.html +++ b/docs/html/usartexception_8h_source.html @@ -79,7 +79,7 @@ $(function() {
          virtual ~USARTException()=default
          diff --git a/docs/html/view_8cpp_source.html b/docs/html/view_8cpp_source.html index d1568a6..410eb35 100644 --- a/docs/html/view_8cpp_source.html +++ b/docs/html/view_8cpp_source.html @@ -71,10 +71,10 @@ $(function() {
          1 #include "view.h"
          2 
          3 WINDOW* View::win = nullptr;
          4 
          5 View::View()
          6 {
          7  if(!win)
          8  {
          9  B15F::abort("View::win not initialized, missing context");
          10  }
          11  getmaxyx(win, height, width); // init width and height
          12  keypad(win, TRUE);
          13 }
          14 
          15 View::~View()
          16 {
          17 }
          18 
          19 void View::setWinContext(WINDOW* win)
          20 {
          21  View::win = win;
          22 }
          23 
          24 WINDOW* View::getWinContext()
          25 {
          26  return win;
          27 }
          28 
          29 // from: https://stackoverflow.com/a/37454181
          30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
          31 {
          32  std::vector<std::string> tokens;
          33  size_t prev = 0, pos = 0;
          34  do
          35  {
          36  pos = str.find(delim, prev);
          37  if (pos == std::string::npos) pos = str.length();
          38  std::string token = str.substr(prev, pos-prev);
          39  if (!token.empty()) tokens.push_back(token);
          40  prev = pos + delim.length();
          41  }
          42  while (pos < str.length() && prev < str.length());
          43  return tokens;
          44 }
          45 
          46 
          47 void View::setTitle(std::string title)
          48 {
          49  this->title = title;
          50 }
          51 
          52 void View::repaint()
          53 {
          54  // get screen size
          55  struct winsize size;
          56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
          57  throw std::runtime_error("TIOCGWINSZ error");
          58 
          59 
          60  start_x = floor((size.ws_col - width) / 2.);
          61  start_y = floor((size.ws_row - height) / 2.);
          62 
          63  curs_set(0); // hide cursor
          64  mvwin(win, start_y, start_x);
          65  clear();
          66  wclear(win);
          67 
          68  // generic draw
          69  box(win, 0, 0);
          70  int offset_x = (width - title.length()) / 2;
          71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
          72 
          73  // specific draw
          74  draw();
          75 
          76  refresh();
          77  wrefresh(win);
          78 }
          -
          static void abort(std::string msg)
          Definition: b15f.cpp:457
          +
          static void abort(std::string msg)
          Definition: b15f.cpp:467
          diff --git a/docs/html/view_8h_source.html b/docs/html/view_8h_source.html index 0943601..d460954 100644 --- a/docs/html/view_8h_source.html +++ b/docs/html/view_8h_source.html @@ -74,7 +74,7 @@ $(function() {
          Definition: view.h:19
          diff --git a/docs/html/view__info_8cpp_source.html b/docs/html/view__info_8cpp_source.html index c4e9cb5..9c529cb 100644 --- a/docs/html/view__info_8cpp_source.html +++ b/docs/html/view__info_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
          1 #include "view_info.h"
          2 
          3 ViewInfo::ViewInfo()
          4 {
          5  calls.push_back(nullptr);
          6 }
          7 
          8 void ViewInfo::setText(std::string text)
          9 {
          10  this->text = text;
          11 }
          12 
          13 void ViewInfo::setLabelClose(std::string label)
          14 {
          15  this->label_close = label;
          16 }
          17 
          18 void ViewInfo::setCall(call_t call)
          19 {
          20  calls[0] = call;
          21 }
          22 
          23 void ViewInfo::draw()
          24 {
          25  int li = 0;
          26  for(std::string line : str_split(text, "\n"))
          27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
          28 
          29  close_offset_x = (width - label_close.length()) / 2;
          30  close_offset_y = height - 2;
          31 
          32  wattron(win, A_REVERSE);
          33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
          34  wattroff(win, A_REVERSE);
          35 }
          36 
          37 call_t ViewInfo::keypress(int& key)
          38 {
          39  switch(key)
          40  {
          41 
          42  case KEY_MOUSE:
          43  {
          44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          45  MEVENT event;
          46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          47  {
          48  size_t column = start_x + close_offset_x;
          49  size_t row = start_y + close_offset_y;
          50  size_t mouse_x = event.x, mouse_y = event.y;
          51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
          52  key = -1; // do return from view
          53  }
          54  break;
          55  }
          56  case KEY_ENT:
          57  key = -1; // do return from view
          58  break;
          59  default:
          60  break;
          61  }
          62  return calls[0];
          63 }
          diff --git a/docs/html/view__info_8h_source.html b/docs/html/view__info_8h_source.html index d72a82a..a7fc792 100644 --- a/docs/html/view__info_8h_source.html +++ b/docs/html/view__info_8h_source.html @@ -75,7 +75,7 @@ $(function() {
          Definition: view.h:19
          diff --git a/docs/html/view__monitor_8cpp_source.html b/docs/html/view__monitor_8cpp_source.html index cbb64e7..2bff2ac 100644 --- a/docs/html/view__monitor_8cpp_source.html +++ b/docs/html/view__monitor_8cpp_source.html @@ -72,19 +72,19 @@ $(function() {
          1 #include "view_monitor.h"
          2 
          3 ViewMonitor::ViewMonitor() : t_worker(&ViewMonitor::worker, this)
          4 {
          5 }
          6 
          7 call_t ViewMonitor::keypress(int& key)
          8 {
          9  switch(key)
          10  {
          11 
          12  case KEY_MOUSE:
          13  {
          14  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          15  MEVENT event;
          16  bool hit = false;
          17  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          18  {
          19  size_t column = start_x + close_offset_x;
          20  size_t row = start_y + close_offset_y;
          21  size_t mouse_x = event.x, mouse_y = event.y;
          22  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
          23  hit = true;
          24  }
          25  if(!hit)
          26  break;
          27 
          28  // fall through to next case
          29  [[fallthrough]];
          30  }
          31  case KEY_ENT:
          32  run_worker = false;
          33  key = -1; // do return from view
          34  wclear(win);
          35  wrefresh(win);
          36  t_worker.join();
          37  break;
          38  default:
          39  break;
          40  }
          41  return calls[0];
          42 }
          43 
          44 std::string ViewMonitor::fancyDigitalString(uint8_t& b)
          45 {
          46  std::stringstream str;
          47  str << std::bitset<8>(b).to_string();
          48  str << " ";
          49  str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec;
          50  return str.str();
          51 }
          52 
          53 std::string ViewMonitor::fancyAnalogString(uint16_t& v)
          54 {
          55  std::stringstream str;
          56  double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0;
          57 
          58  str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V ";
          59 
          60  str << "[";
          61  uint8_t p = round(v * 40.0 / 1023.0);
          62  for(uint8_t i = 0; i < p; i++)
          63  str << "X";
          64  for(uint8_t i = 0; i < 40 - p; i++)
          65  str << " ";
          66  str << "]" << std::endl;
          67 
          68  return str.str();
          69 }
          70 
          71 void ViewMonitor::worker()
          72 {
          73  B15F& drv = B15F::getInstance();
          74  while(run_worker)
          75  {
          76  try
          77  {
          78  std::this_thread::sleep_for(std::chrono::milliseconds(100));
          79 
          80  uint8_t be0 = drv.digitalRead0();
          81  uint8_t be1 = drv.digitalRead1();
          82  uint8_t dsw = drv.readDipSwitch();
          83  uint16_t adc[8];
          84  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
          85  adc[i] = drv.analogRead(i);
          86 
          87 
          88  std::stringstream str;
          89 
          90  // hline
          91  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
          92  if(i % 2 == 0)
          93  str << "-";
          94  else
          95  str << " ";
          96  str << std::endl;
          97 
          98  str << "Digitale Enigaenge:" << std::endl;
          99  str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl;
          100  str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl;
          101  str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl;
          102 
          103  // hline
          104  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
          105  if(i % 2 == 0)
          106  str << "-";
          107  else
          108  str << " ";
          109  str << std::endl;
          110 
          111  str << "Analoge Eingaenge:" << std::endl;
          112  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
          113  {
          114  str << "Kanal " << std::to_string((int) i) << ": ";
          115  str << fancyAnalogString(adc[i]) << std::endl;
          116  }
          117 
          118  text = str.str();
          119  repaint();
          120  }
          121  catch(DriverException& ex)
          122  {
          123  std::cout << "DriverException: " << ex.what() << std::endl;
          124  drv.delay_ms(1000);
          125  }
          126  catch(...)
          127  {
          128  try
          129  {
          130  drv.reconnect();
          131  }
          132  catch(...)
          133  {
          134  B15F::abort("yoho meine dudes");
          135  return;
          136  }
          137  }
          138  }
          139 }
          -
          uint8_t digitalRead0(void)
          Definition: b15f.cpp:210
          -
          uint8_t readDipSwitch(void)
          Definition: b15f.cpp:238
          -
          void delay_ms(uint16_t ms)
          Definition: b15f.cpp:422
          -
          static B15F & getInstance(void)
          Definition: b15f.cpp:432
          +
          uint8_t digitalRead0(void)
          Definition: b15f.cpp:207
          +
          uint8_t readDipSwitch(void)
          Definition: b15f.cpp:235
          +
          void delay_ms(uint16_t ms)
          Definition: b15f.cpp:432
          +
          static B15F & getInstance(void)
          Definition: b15f.cpp:442
          Definition: b15f.h:26
          -
          static void abort(std::string msg)
          Definition: b15f.cpp:457
          -
          uint16_t analogRead(uint8_t channel)
          Definition: b15f.cpp:282
          -
          uint8_t digitalRead1(void)
          Definition: b15f.cpp:224
          +
          static void abort(std::string msg)
          Definition: b15f.cpp:467
          +
          uint16_t analogRead(uint8_t channel)
          Definition: b15f.cpp:279
          +
          uint8_t digitalRead1(void)
          Definition: b15f.cpp:221
          void reconnect(void)
          Definition: b15f.cpp:57
          diff --git a/docs/html/view__monitor_8h_source.html b/docs/html/view__monitor_8h_source.html index 505b418..ce253ad 100644 --- a/docs/html/view__monitor_8h_source.html +++ b/docs/html/view__monitor_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/view__promt_8cpp_source.html b/docs/html/view__promt_8cpp_source.html index 9d55b9c..8d05c1e 100644 --- a/docs/html/view__promt_8cpp_source.html +++ b/docs/html/view__promt_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
          1 #include "view_promt.h"
          2 
          3 void ViewPromt::draw()
          4 {
          5  curs_set(1); // show cursor
          6 
          7  int li = text_offset_y;
          8  int ci = 0;
          9  for(std::string line : str_split(message + input, "\n"))
          10  {
          11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
          12  ci = line.length() + text_offset_x;
          13  }
          14 
          15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
          16  button_offset_y = height - text_offset_y;
          17 
          18  if(selection == 0)
          19  {
          20  wattron(win, A_REVERSE);
          21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
          22  wattroff(win, A_REVERSE);
          23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
          24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
          25  }
          26  else
          27  {
          28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
          29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
          30  wattron(win, A_REVERSE);
          31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
          32  wattroff(win, A_REVERSE);
          33  }
          34  wmove(win, li, ci);
          35 }
          36 
          37 void ViewPromt::setMessage(std::string message)
          38 {
          39  this->message = message;
          40 }
          41 
          42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
          43 {
          44  label_confirm = name;
          45  call_confirm = call;
          46 }
          47 
          48 void ViewPromt::setCancel(std::string name, bool cancelable)
          49 {
          50  label_cancel = name;
          51  this->cancelable = cancelable;
          52 }
          53 
          54 std::string ViewPromt::getInput()
          55 {
          56  return input;
          57 }
          58 
          59 std::function<void(int)> ViewPromt::keypress(int& key)
          60 {
          61  std::function<void(int)> ret = nullptr;
          62  switch(key)
          63  {
          64  case KEY_BACKSPACE:
          65  if(input.length())
          66  input.pop_back();
          67  break;
          68  case '\t':
          69  case KEY_LEFT:
          70  case KEY_RIGHT:
          71  selection = (selection + 1 ) % 2;
          72  break;
          73  case KEY_MOUSE:
          74  {
          75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          76  MEVENT event;
          77  bool hit = false;
          78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          79  {
          80  size_t column_start = start_x + button_offset_x;
          81  size_t row_start = start_y + button_offset_y;
          82  size_t mouse_x = event.x, mouse_y = event.y;
          83  if(mouse_y == row_start)
          84  {
          85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
          86  {
          87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
          88  hit = true;
          89  selection = 0;
          90  }
          91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
          92  {
          93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
          94  hit = true;
          95  selection = 1;
          96  }
          97  }
          98  }
          99  if(!hit)
          100  break;
          101 
          102  // fall through to next case
          103  [[fallthrough]];
          104  }
          105  case KEY_ENT:
          106  if(selection == 0) // exit
          107  key = -1; // do return from view
          108  else
          109  ret = call_confirm;
          110  break;
          111  default:
          112  break;
          113  }
          114 
          115  if(key >= ' ' && key <= '~')
          116  input += (char) key;
          117 
          118  if(key != KEY_ENT)
          119  repaint();
          120  return ret;
          121 }
          diff --git a/docs/html/view__promt_8h_source.html b/docs/html/view__promt_8h_source.html index 52166f8..eba626e 100644 --- a/docs/html/view__promt_8h_source.html +++ b/docs/html/view__promt_8h_source.html @@ -75,7 +75,7 @@ $(function() { diff --git a/docs/html/view__selection_8cpp_source.html b/docs/html/view__selection_8cpp_source.html index 4ee7ee7..12158d9 100644 --- a/docs/html/view__selection_8cpp_source.html +++ b/docs/html/view__selection_8cpp_source.html @@ -73,7 +73,7 @@ $(function() {
          1 #include "view_selection.h"
          2 
          3 void ViewSelection::draw()
          4 {
          5  //curs_set(0); // hide cursor
          6  for(size_t i = 0; i < choices.size(); i++)
          7  {
          8  if(selection == i)
          9  wattron(win, A_REVERSE);
          10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
          11  if(selection == i)
          12  wattroff(win, A_REVERSE);
          13  }
          14 }
          15 
          16 void ViewSelection::addChoice(std::string name, call_t call)
          17 {
          18  choices.push_back(name);
          19  calls.push_back(call);
          20 }
          21 
          22 call_t ViewSelection::keypress(int& key)
          23 {
          24  call_t ret = nullptr;
          25  switch(key)
          26  {
          27  case KEY_UP:
          28  do
          29  selection = (selection - 1 + choices.size()) % choices.size();
          30  while(!choices[selection].length() && choices.size());
          31  break;
          32 
          33  case '\t':
          34  case KEY_DOWN:
          35  do
          36  selection = (selection + 1) % choices.size();
          37  while(!choices[selection].length() && choices.size());
          38  break;
          39 
          40  case KEY_MOUSE:
          41  {
          42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          43  MEVENT event;
          44  bool hit = false;
          45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          46  {
          47  size_t column_start = start_x + choice_offset_x;
          48  size_t row_start = start_y + choice_offset_y;
          49  size_t mouse_x = event.x, mouse_y = event.y;
          50  for(size_t i = 0; i < choices.size(); i++)
          51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
          52  {
          53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
          54  hit = true;
          55  selection = i;
          56  }
          57  }
          58  if(!hit)
          59  break;
          60 
          61  // fall through to next case
          62  [[fallthrough]];
          63  }
          64 
          65  case KEY_ENT:
          66  if(selection == choices.size() - 1) // exit
          67  key = -1; // do return from view
          68  else
          69  ret = calls[selection];
          70  break;
          71  default:
          72  break;
          73  }
          74  repaint();
          75  return ret;
          76 }
          diff --git a/docs/html/view__selection_8h_source.html b/docs/html/view__selection_8h_source.html index 80ca8c5..f5d97af 100644 --- a/docs/html/view__selection_8h_source.html +++ b/docs/html/view__selection_8h_source.html @@ -75,7 +75,7 @@ $(function() { From 800bb65c3b5350edc146659d6c730c15ca9b9306 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Thu, 6 Jun 2019 12:13:31 +0200 Subject: [PATCH 22/35] gitignore --- .gitignore | 3 + control/src/.idea/misc.xml | 7 - control/src/.idea/modules.xml | 8 - control/src/.idea/src.iml | 2 - control/src/.idea/vcs.xml | 6 - control/src/.idea/workspace.xml | 434 -------------------------------- 6 files changed, 3 insertions(+), 457 deletions(-) delete mode 100644 control/src/.idea/misc.xml delete mode 100644 control/src/.idea/modules.xml delete mode 100644 control/src/.idea/src.iml delete mode 100644 control/src/.idea/vcs.xml delete mode 100644 control/src/.idea/workspace.xml diff --git a/.gitignore b/.gitignore index ccc8fe3..d91ab15 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# IDE stuff +control/src/.idea + # Prerequisites *.d gnuplotscript.gp diff --git a/control/src/.idea/misc.xml b/control/src/.idea/misc.xml deleted file mode 100644 index 8822db8..0000000 --- a/control/src/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/control/src/.idea/modules.xml b/control/src/.idea/modules.xml deleted file mode 100644 index f669a0e..0000000 --- a/control/src/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/control/src/.idea/src.iml b/control/src/.idea/src.iml deleted file mode 100644 index f08604b..0000000 --- a/control/src/.idea/src.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/control/src/.idea/vcs.xml b/control/src/.idea/vcs.xml deleted file mode 100644 index b2bdec2..0000000 --- a/control/src/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/control/src/.idea/workspace.xml b/control/src/.idea/workspace.xml deleted file mode 100644 index a8e2aae..0000000 --- a/control/src/.idea/workspace.xml +++ /dev/null @@ -1,434 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - read - read_timeout - write_timeout - RQ_ADC_DAC_STROKE - - - ::read_timeout - USART::read_timeout - USART::write_timeout - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
          "],col:[2,"","
          "],tr:[2,"","
          "],td:[3,"","
          "],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          plottyfile.cpp
          -
          -
          -
          1 #include "plottyfile.h"
          2 
          4 {
          5  dots.push_back(dot);
          6 }
          7 
          9 {
          10  dots.push_back(dot);
          11 }
          12 
          13 void PlottyFile::setFunctionType(FunctionType function_type)
          14 {
          15  this->function_type = function_type;
          16 }
          17 
          18 void PlottyFile::setQuadrant(uint8_t quadrant)
          19 {
          20  if(quadrant < 1 || quadrant > 4)
          21  throw std::range_error("Ungueltiger Quadrant");
          22  this->quadrant = quadrant;
          23 }
          24 
          25 void PlottyFile::setRefX(uint16_t ref_x)
          26 {
          27  this->ref_x = ref_x;
          28 }
          29 
          30 void PlottyFile::setRefY(uint16_t ref_y)
          31 {
          32  this->ref_y = ref_y;
          33 }
          34 
          35 void PlottyFile::setParaFirstCurve(uint16_t para_first)
          36 {
          37  this->para_first = para_first;
          38 }
          39 
          40 void PlottyFile::setParaStepWidth(uint16_t para_stepwidth)
          41 {
          42  this->para_stepwidth = para_stepwidth;
          43 }
          44 
          45 void PlottyFile::setUnitX(std::string unit_x)
          46 {
          47  this->unit_x = unit_x;
          48 }
          49 
          50 void PlottyFile::setDescX(std::string desc_x)
          51 {
          52  this->desc_x = desc_x;
          53 }
          54 
          55 void PlottyFile::setUnitY(std::string unit_y)
          56 {
          57  this->unit_y = unit_y;
          58 }
          59 
          60 void PlottyFile::setDescY(std::string desc_y)
          61 {
          62  this->desc_y = desc_y;
          63 }
          64 
          65 void PlottyFile::setUnitPara(std::string unit_para)
          66 {
          67  this->unit_para = unit_para;
          68 }
          69 
          70 void PlottyFile::setDescPara(std::string desc_para)
          71 {
          72  this->desc_para = desc_para;
          73 }
          74 
          75 FunctionType PlottyFile::getFunctionType() const
          76 {
          77  return function_type;
          78 }
          79 
          80 uint8_t PlottyFile::getQuadrant() const
          81 {
          82  return quadrant;
          83 }
          84 
          85 uint16_t PlottyFile::getRefX() const
          86 {
          87  return ref_x;
          88 }
          89 
          90 uint16_t PlottyFile::getRefY() const
          91 {
          92  return ref_y;
          93 }
          94 
          96 {
          97  return para_first;
          98 }
          99 
          101 {
          102  return para_stepwidth;
          103 }
          104 
          105 std::string PlottyFile::getUnitX() const
          106 {
          107  return unit_x;
          108 }
          109 
          110 std::string PlottyFile::getDescX() const
          111 {
          112  return desc_x;
          113 }
          114 
          115 std::string PlottyFile::getUnitY() const
          116 {
          117  return unit_y;
          118 }
          119 
          120 std::string PlottyFile::getDescY() const
          121 {
          122  return desc_y;
          123 }
          124 
          125 std::string PlottyFile::getUnitPara() const
          126 {
          127  return unit_para;
          128 }
          129 
          130 std::string PlottyFile::getDescPara() const
          131 {
          132  return desc_para;
          133 }
          134 
          135 void PlottyFile::prepStr(std::string& str, uint8_t len)
          136 {
          137  if(str.length() > len)
          138  throw std::runtime_error("Zu grosser String.");
          139 
          140  if(str.length() != len)
          141  str += '\n';
          142 
          143  while(str.length() < len)
          144  str += '\0';
          145 }
          146 
          147 void PlottyFile::writeToFile(std::string filename)
          148 {
          149  prepStr(unit_x, STR_LEN_SHORT);
          150  prepStr(desc_x, STR_LEN_LARGE);
          151  prepStr(unit_y, STR_LEN_SHORT);
          152  prepStr(desc_y, STR_LEN_LARGE);
          153  prepStr(unit_para, STR_LEN_SHORT);
          154  prepStr(desc_para, STR_LEN_LARGE);
          155 
          156  std::ofstream file(filename);
          157 
          158  // write file header
          159  file.write(reinterpret_cast<char*>(&command), 1);
          160  file.write(head.c_str(), head.length());
          161  file.write(filetype.c_str(), filetype.length());
          162  file.write(reinterpret_cast<char*>(&version), 2);
          163  file.write(reinterpret_cast<char*>(&subversion), 2);
          164  file.put(static_cast<uint8_t>(function_type));
          165  file.write(reinterpret_cast<char*>(&quadrant), 1);
          166  file.write(reinterpret_cast<char*>(&ref_x), 2);
          167  file.write(reinterpret_cast<char*>(&ref_y), 2);
          168  file.write(reinterpret_cast<char*>(&para_first), 2);
          169  file.write(reinterpret_cast<char*>(&para_stepwidth), 2);
          170  file.write(unit_x.c_str(), unit_x.length());
          171  file.write(desc_x.c_str(), desc_x.length());
          172  file.write(unit_y.c_str(), unit_y.length());
          173  file.write(desc_y.c_str(), desc_y.length());
          174  file.write(unit_para.c_str(), unit_para.length());
          175  file.write(desc_para.c_str(), desc_para.length());
          176  file.write(reinterpret_cast<const char*>(&eof), 1);
          177 
          178  // make sure header size is 256 Byte
          179  while(file.tellp() < 256)
          180  file.put(0);
          181 
          182  for(Dot& dot : dots)
          183  {
          184  file.put((dot.getX() >> 8) | (static_cast<uint8_t>(dot.getCurve()) << 2));
          185  file.put(dot.getX() & 0xFF);
          186  file.put(dot.getY() >> 8);
          187  file.put(dot.getY() & 0xFF);
          188  }
          189 
          190  file.close();
          191 }
          192 
          193 void PlottyFile::startPlotty(std::string filename)
          194 {
          195  int code = system(("plotty --in " + filename).c_str());
          196  if(code)
          197  throw std::runtime_error("Fehler beim Aufruf von plotty");
          198 }
          -
          void setParaStepWidth(uint16_t para_stepwidth)
          Definition: plottyfile.cpp:40
          -
          uint8_t getQuadrant(void) const
          Definition: plottyfile.cpp:80
          -
          void startPlotty(std::string filename)
          Definition: plottyfile.cpp:193
          -
          void writeToFile(std::string filename)
          Definition: plottyfile.cpp:147
          -
          void setUnitX(std::string unit_x)
          Definition: plottyfile.cpp:45
          -
          void setUnitPara(std::string unit_para)
          Definition: plottyfile.cpp:65
          -
          void setDescY(std::string desc_y)
          Definition: plottyfile.cpp:60
          -
          void setQuadrant(uint8_t quadrant)
          Definition: plottyfile.cpp:18
          -
          std::string getDescY(void) const
          Definition: plottyfile.cpp:120
          -
          void setRefY(uint16_t ref_y)
          Definition: plottyfile.cpp:30
          -
          std::string getDescX(void) const
          Definition: plottyfile.cpp:110
          -
          void setFunctionType(FunctionType function_type)
          Definition: plottyfile.cpp:13
          -
          void setDescX(std::string desc_x)
          Definition: plottyfile.cpp:50
          -
          Definition: dot.h:12
          -
          void setRefX(uint16_t ref_x)
          Definition: plottyfile.cpp:25
          -
          void setUnitY(std::string unit_y)
          Definition: plottyfile.cpp:55
          -
          void addDot(Dot &dot)
          Definition: plottyfile.cpp:3
          -
          void setDescPara(std::string desc_para)
          Definition: plottyfile.cpp:70
          -
          uint16_t getParaStepWidth(void) const
          Definition: plottyfile.cpp:100
          -
          std::string getDescPara(void) const
          Definition: plottyfile.cpp:130
          -
          void setParaFirstCurve(uint16_t para_first)
          Definition: plottyfile.cpp:35
          -
          std::string getUnitY(void) const
          Definition: plottyfile.cpp:115
          -
          uint16_t getParaFirstCurve(void) const
          Definition: plottyfile.cpp:95
          -
          uint16_t getRefX(void) const
          Definition: plottyfile.cpp:85
          -
          std::string getUnitPara(void) const
          Definition: plottyfile.cpp:125
          -
          FunctionType getFunctionType(void) const
          Definition: plottyfile.cpp:75
          -
          uint16_t getRefY(void) const
          Definition: plottyfile.cpp:90
          -
          std::string getUnitX(void) const
          Definition: plottyfile.cpp:105
          - - - - diff --git a/docs/html/plottyfile_8h_source.html b/docs/html/plottyfile_8h_source.html deleted file mode 100644 index 4c80d79..0000000 --- a/docs/html/plottyfile_8h_source.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - -B15F: drv/plottyfile.h Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          plottyfile.h
          -
          -
          -
          1 #ifndef PLOTTYFILE_H
          2 #define PLOTTYFILE_H
          3 
          4 #include <iostream>
          5 #include <fstream>
          6 #include <exception>
          7 #include <vector>
          8 #include "dot.h"
          9 
          10 enum FunctionType
          11 {
          12  CurveFamily = 'S',
          13  Curve = 'C',
          14  Level = 'P'
          15 };
          16 
          20 {
          21 public:
          26  void addDot(Dot& dot);
          27 
          32  void addDot(Dot dot);
          33 
          38  void setFunctionType(FunctionType function_type);
          39 
          44  void setQuadrant(uint8_t quadrant);
          45 
          50  void setRefX(uint16_t ref_x);
          51 
          56  void setRefY(uint16_t ref_y);
          57 
          63  void setParaFirstCurve(uint16_t para_first);
          64 
          69  void setParaStepWidth(uint16_t para_stepwidth);
          70 
          75  void setUnitX(std::string unit_x);
          76 
          81  void setDescX(std::string desc_x);
          82 
          87  void setUnitY(std::string unit_y);
          88 
          93  void setDescY(std::string desc_y);
          94 
          99  void setUnitPara(std::string unit_para);
          104  void setDescPara(std::string desc_para);
          105 
          106 
          107 
          111  FunctionType getFunctionType(void) const;
          112 
          116  uint8_t getQuadrant(void) const;
          117 
          121  uint16_t getRefX(void) const;
          122 
          126  uint16_t getRefY(void) const;
          127 
          131  uint16_t getParaFirstCurve(void) const;
          132 
          136  uint16_t getParaStepWidth(void) const;
          137 
          141  std::string getUnitX(void) const;
          142 
          146  std::string getDescX(void) const;
          147 
          151  std::string getUnitY(void) const;
          152 
          156  std::string getDescY(void) const;
          157 
          161  std::string getUnitPara(void) const;
          162 
          166  std::string getDescPara(void) const;
          167 
          168 
          173  void writeToFile(std::string filename);
          174 
          179  void startPlotty(std::string filename);
          180 private:
          181  void prepStr(std::string& str, uint8_t len);
          182 
          183  std::vector<Dot> dots;
          184 
          185  int8_t command = 0x1D;
          186  const std::string head = "HTWK-HWLab";
          187  const std::string filetype = "MD";
          188  int16_t version = 1;
          189  int16_t subversion = 0;
          190  FunctionType function_type = FunctionType::Curve;
          191  uint8_t quadrant = 1;
          192  uint16_t ref_x = 1023;
          193  uint16_t ref_y = 1023;
          194  uint16_t para_first = 1;
          195  uint16_t para_stepwidth = 1;
          196  std::string unit_x;
          197  std::string desc_x;
          198  std::string unit_y;
          199  std::string desc_y;
          200  std::string unit_para;
          201  std::string desc_para;
          202  const uint8_t eof = 0xD;
          203 
          204  constexpr static uint8_t STR_LEN_SHORT = 10;
          205  constexpr static uint8_t STR_LEN_LARGE = 20;
          206 };
          207 
          208 #endif // PLOTTYFILE_H
          -
          void setParaStepWidth(uint16_t para_stepwidth)
          Definition: plottyfile.cpp:40
          -
          uint8_t getQuadrant(void) const
          Definition: plottyfile.cpp:80
          -
          void startPlotty(std::string filename)
          Definition: plottyfile.cpp:193
          -
          void writeToFile(std::string filename)
          Definition: plottyfile.cpp:147
          -
          void setUnitX(std::string unit_x)
          Definition: plottyfile.cpp:45
          -
          void setUnitPara(std::string unit_para)
          Definition: plottyfile.cpp:65
          -
          void setDescY(std::string desc_y)
          Definition: plottyfile.cpp:60
          -
          void setQuadrant(uint8_t quadrant)
          Definition: plottyfile.cpp:18
          -
          std::string getDescY(void) const
          Definition: plottyfile.cpp:120
          - -
          void setRefY(uint16_t ref_y)
          Definition: plottyfile.cpp:30
          -
          std::string getDescX(void) const
          Definition: plottyfile.cpp:110
          -
          void setFunctionType(FunctionType function_type)
          Definition: plottyfile.cpp:13
          -
          void setDescX(std::string desc_x)
          Definition: plottyfile.cpp:50
          -
          Definition: dot.h:12
          -
          void setRefX(uint16_t ref_x)
          Definition: plottyfile.cpp:25
          -
          void setUnitY(std::string unit_y)
          Definition: plottyfile.cpp:55
          -
          void addDot(Dot &dot)
          Definition: plottyfile.cpp:3
          -
          void setDescPara(std::string desc_para)
          Definition: plottyfile.cpp:70
          -
          uint16_t getParaStepWidth(void) const
          Definition: plottyfile.cpp:100
          -
          std::string getDescPara(void) const
          Definition: plottyfile.cpp:130
          -
          void setParaFirstCurve(uint16_t para_first)
          Definition: plottyfile.cpp:35
          -
          std::string getUnitY(void) const
          Definition: plottyfile.cpp:115
          -
          uint16_t getParaFirstCurve(void) const
          Definition: plottyfile.cpp:95
          -
          uint16_t getRefX(void) const
          Definition: plottyfile.cpp:85
          -
          std::string getUnitPara(void) const
          Definition: plottyfile.cpp:125
          -
          FunctionType getFunctionType(void) const
          Definition: plottyfile.cpp:75
          -
          uint16_t getRefY(void) const
          Definition: plottyfile.cpp:90
          -
          std::string getUnitX(void) const
          Definition: plottyfile.cpp:105
          - - - - diff --git a/docs/html/search/all_0.html b/docs/html/search/all_0.html deleted file mode 100644 index a52d5f0..0000000 --- a/docs/html/search/all_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js deleted file mode 100644 index c4bd927..0000000 --- a/docs/html/search/all_0.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['abort',['abort',['../classB15F.html#a3f09a418f9e3be5d1d750e4515c96f1e',1,'B15F::abort(std::string msg)'],['../classB15F.html#ac962a6a49bddd0e261a8c7d3aded23f8',1,'B15F::abort(std::exception &ex)']]], - ['activateselftestmode',['activateSelfTestMode',['../classB15F.html#ad9bf80ee2485fb5aac9926c6ef0731f1',1,'B15F']]], - ['adddot',['addDot',['../classPlottyFile.html#ae091e6eaaca16302f17572ac7dec6f7c',1,'PlottyFile::addDot(Dot &dot)'],['../classPlottyFile.html#a80e4b45219b4e9571992edfc28a28568',1,'PlottyFile::addDot(Dot dot)']]], - ['analogread',['analogRead',['../classB15F.html#ae0bd1f69751e2dc3c462db9213fc4627',1,'B15F']]], - ['analogsequence',['analogSequence',['../classB15F.html#ab82a324426c3063318c6cafb3089ae02',1,'B15F']]], - ['analogwrite0',['analogWrite0',['../classB15F.html#afc55fd590c7fa5c942d100cb60c4b0d3',1,'B15F']]], - ['analogwrite1',['analogWrite1',['../classB15F.html#a7f1becceac744f5cd2ad529748fd836f',1,'B15F']]] -]; diff --git a/docs/html/search/all_1.html b/docs/html/search/all_1.html deleted file mode 100644 index 0fcb704..0000000 --- a/docs/html/search/all_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js deleted file mode 100644 index 5156238..0000000 --- a/docs/html/search/all_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['b15f',['B15F',['../classB15F.html',1,'']]], - ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]], - ['b15f_20benutzerhandbuch',['B15F Benutzerhandbuch',['../index.html',1,'']]] -]; diff --git a/docs/html/search/all_10.html b/docs/html/search/all_10.html deleted file mode 100644 index c234738..0000000 --- a/docs/html/search/all_10.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js deleted file mode 100644 index f5a3874..0000000 --- a/docs/html/search/all_10.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['_7etimeoutexception',['~TimeoutException',['../classTimeoutException.html#a2f686b262d2ccffa0090fda9b44ab540',1,'TimeoutException']]], - ['_7eusart',['~USART',['../classUSART.html#a0c8eb1a939ca00921e22f6cbcc7bb749',1,'USART']]], - ['_7eusartexception',['~USARTException',['../classUSARTException.html#a0e008b3cb4974859e6bc8c8f8eb480be',1,'USARTException']]] -]; diff --git a/docs/html/search/all_2.html b/docs/html/search/all_2.html deleted file mode 100644 index 19c530f..0000000 --- a/docs/html/search/all_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js deleted file mode 100644 index 7200182..0000000 --- a/docs/html/search/all_2.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['clearinputbuffer',['clearInputBuffer',['../classUSART.html#a28a2b4c5ed66b2c3a81196f76884f156',1,'USART']]], - ['clearoutputbuffer',['clearOutputBuffer',['../classUSART.html#a756d268a8762c316f91ca3238972b0c1',1,'USART']]], - ['closedevice',['closeDevice',['../classUSART.html#af80d6291ac1d2df04cfa1d8d27458cc5',1,'USART']]] -]; diff --git a/docs/html/search/all_3.html b/docs/html/search/all_3.html deleted file mode 100644 index 1ae887f..0000000 --- a/docs/html/search/all_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js deleted file mode 100644 index 937a08b..0000000 --- a/docs/html/search/all_3.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['delay_5fms',['delay_ms',['../classB15F.html#aaffce20afb9f06bc4b7556c70ce76416',1,'B15F']]], - ['delay_5fus',['delay_us',['../classB15F.html#adcaac8ae8db3c28eccb499fbd720361f',1,'B15F']]], - ['digitalread0',['digitalRead0',['../classB15F.html#ae0df6d423deeb2fd610968bd1c72060e',1,'B15F']]], - ['digitalread1',['digitalRead1',['../classB15F.html#afc76b612dd4faeee0ac02a66b65af5f2',1,'B15F']]], - ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], - ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], - ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], - ['dot',['Dot',['../classDot.html',1,'Dot'],['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot::Dot()']]], - ['driverexception',['DriverException',['../classDriverException.html',1,'']]], - ['drop',['drop',['../classUSART.html#a038d00c0b3d8c0c13c3e7eae5dad7813',1,'USART']]] -]; diff --git a/docs/html/search/all_4.html b/docs/html/search/all_4.html deleted file mode 100644 index 14c90ef..0000000 --- a/docs/html/search/all_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js deleted file mode 100644 index fb3f662..0000000 --- a/docs/html/search/all_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['exec',['exec',['../classB15F.html#a1a7ac52984ed7ecac008a3e4060eee3a',1,'B15F']]] -]; diff --git a/docs/html/search/all_5.html b/docs/html/search/all_5.html deleted file mode 100644 index 60fa53e..0000000 --- a/docs/html/search/all_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js deleted file mode 100644 index 3641ddc..0000000 --- a/docs/html/search/all_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['flushoutputbuffer',['flushOutputBuffer',['../classUSART.html#adb6ff4d1cf1af79ca255c5a81780200d',1,'USART']]] -]; diff --git a/docs/html/search/all_6.html b/docs/html/search/all_6.html deleted file mode 100644 index 7180363..0000000 --- a/docs/html/search/all_6.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js deleted file mode 100644 index 9518d98..0000000 --- a/docs/html/search/all_6.js +++ /dev/null @@ -1,23 +0,0 @@ -var searchData= -[ - ['getbaudrate',['getBaudrate',['../classUSART.html#a4918672d8069df205378a528b1892db3',1,'USART']]], - ['getboardinfo',['getBoardInfo',['../classB15F.html#a4f01677e73d6d172a2c1cae9427a591b',1,'B15F']]], - ['getcurve',['getCurve',['../classDot.html#ad0ae7dc1a9be3d8d985affc089b34396',1,'Dot']]], - ['getdescpara',['getDescPara',['../classPlottyFile.html#a536967daae3b382a5d6575f55450e198',1,'PlottyFile']]], - ['getdescx',['getDescX',['../classPlottyFile.html#a9cf7baa569be308c2cf6e07cadded09d',1,'PlottyFile']]], - ['getdescy',['getDescY',['../classPlottyFile.html#ab4a847fd71a804182f211233e194df45',1,'PlottyFile']]], - ['getfunctiontype',['getFunctionType',['../classPlottyFile.html#a88bb7d8350ed5fbc7a40e8d903c94bdb',1,'PlottyFile']]], - ['getinstance',['getInstance',['../classB15F.html#a8b4533d232c55ef2aa967e39e2d23380',1,'B15F']]], - ['getparafirstcurve',['getParaFirstCurve',['../classPlottyFile.html#a40828c93d66fe80166c4f603d5bdfa48',1,'PlottyFile']]], - ['getparastepwidth',['getParaStepWidth',['../classPlottyFile.html#a9da23f2bb8e6eb1837fc992ffd4057db',1,'PlottyFile']]], - ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], - ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], - ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], - ['getregister',['getRegister',['../classB15F.html#a43b477a9e2e5b1b2142958fa5e1a78b3',1,'B15F']]], - ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], - ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], - ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], - ['getunity',['getUnitY',['../classPlottyFile.html#a746b96036872dbece204e9739f3413b6',1,'PlottyFile']]], - ['getx',['getX',['../classDot.html#a029f0cc99c474122b77a708a317e7f77',1,'Dot']]], - ['gety',['getY',['../classDot.html#a8fcb987e6308d8184d1a2c8692227e58',1,'Dot']]] -]; diff --git a/docs/html/search/all_7.html b/docs/html/search/all_7.html deleted file mode 100644 index ee6d2e4..0000000 --- a/docs/html/search/all_7.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js deleted file mode 100644 index 66df4a3..0000000 --- a/docs/html/search/all_7.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['msg',['msg',['../classTimeoutException.html#aa625fc0fae48a67737a98eafb91c9624',1,'TimeoutException::msg()'],['../classUSARTException.html#a14c80df95f216d221aa97cffbcd8dd79',1,'USARTException::msg()']]], - ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], - ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] -]; diff --git a/docs/html/search/all_8.html b/docs/html/search/all_8.html deleted file mode 100644 index 7829aa4..0000000 --- a/docs/html/search/all_8.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js deleted file mode 100644 index bd75d34..0000000 --- a/docs/html/search/all_8.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['opendevice',['openDevice',['../classUSART.html#a5f7e2abda2ec4a68a5fdb8ee2f8a940a',1,'USART']]] -]; diff --git a/docs/html/search/all_9.html b/docs/html/search/all_9.html deleted file mode 100644 index e4242c7..0000000 --- a/docs/html/search/all_9.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js deleted file mode 100644 index 1695de2..0000000 --- a/docs/html/search/all_9.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]], - ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]], - ['pwmsetfrequency',['pwmSetFrequency',['../classB15F.html#ac6f6532bb9550a0632c28b98c157d0a1',1,'B15F']]], - ['pwmsetvalue',['pwmSetValue',['../classB15F.html#af9aad3c0db5d5a8b37219d713e1977ee',1,'B15F']]] -]; diff --git a/docs/html/search/all_a.html b/docs/html/search/all_a.html deleted file mode 100644 index 47a4a78..0000000 --- a/docs/html/search/all_a.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js deleted file mode 100644 index 7ca61ac..0000000 --- a/docs/html/search/all_a.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['readdipswitch',['readDipSwitch',['../classB15F.html#a6f858f21ea81d491b5031b3644a2239a',1,'B15F']]], - ['receive',['receive',['../classUSART.html#a0fdc238203852f00bd750127602b2a6a',1,'USART']]], - ['reconnect',['reconnect',['../classB15F.html#a52557b375443c180a044e7d4e80a1ae7',1,'B15F']]], - ['reconnect_5ftimeout',['RECONNECT_TIMEOUT',['../classB15F.html#a040951746fbfd632e12bd1ad14578816',1,'B15F']]], - ['reconnect_5ftries',['RECONNECT_TRIES',['../classB15F.html#a6c4895bdbcd71ff6743becf97985c2dc',1,'B15F']]] -]; diff --git a/docs/html/search/all_b.html b/docs/html/search/all_b.html deleted file mode 100644 index 1320a43..0000000 --- a/docs/html/search/all_b.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js deleted file mode 100644 index 552513c..0000000 --- a/docs/html/search/all_b.js +++ /dev/null @@ -1,20 +0,0 @@ -var searchData= -[ - ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], - ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], - ['setdescpara',['setDescPara',['../classPlottyFile.html#a431904143c3c1164a2e8b8cfec3c77ab',1,'PlottyFile']]], - ['setdescx',['setDescX',['../classPlottyFile.html#aa0449c290265d55d6223b19cf0a88b0a',1,'PlottyFile']]], - ['setdescy',['setDescY',['../classPlottyFile.html#a38a3a4dfc76bc70523727584bf01d590',1,'PlottyFile']]], - ['setfunctiontype',['setFunctionType',['../classPlottyFile.html#a4e5ab1ebb012a5cc1a3d6458a4cd512f',1,'PlottyFile']]], - ['setparafirstcurve',['setParaFirstCurve',['../classPlottyFile.html#aa676414793becb975506f48d6e949dd0',1,'PlottyFile']]], - ['setparastepwidth',['setParaStepWidth',['../classPlottyFile.html#a6caebd31e04e2e7081cc007047350355',1,'PlottyFile']]], - ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], - ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], - ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], - ['setregister',['setRegister',['../classB15F.html#a2735424cf98bd0e2892b5a9b6eb24582',1,'B15F']]], - ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], - ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], - ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], - ['setunity',['setUnitY',['../classPlottyFile.html#abb18c814f435926f741f7ceb310f3059',1,'PlottyFile']]], - ['startplotty',['startPlotty',['../classPlottyFile.html#a08a115ef10458cadfe76077d623313df',1,'PlottyFile']]] -]; diff --git a/docs/html/search/all_c.html b/docs/html/search/all_c.html deleted file mode 100644 index 32a3a1b..0000000 --- a/docs/html/search/all_c.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js deleted file mode 100644 index 37e3d29..0000000 --- a/docs/html/search/all_c.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], - ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], - ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'TimeoutException'],['../classTimeoutException.html#aa45912234da11ffc9dd3594a1bbc0218',1,'TimeoutException::TimeoutException(const char *message)'],['../classTimeoutException.html#ad6e5c200fbfd276f48a6c1163e2d2988',1,'TimeoutException::TimeoutException(const std::string &message)']]], - ['transmit',['transmit',['../classUSART.html#a41b19dd58f307015b73e154048cd74ca',1,'USART']]] -]; diff --git a/docs/html/search/all_d.html b/docs/html/search/all_d.html deleted file mode 100644 index a386096..0000000 --- a/docs/html/search/all_d.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js deleted file mode 100644 index 7e9d9bc..0000000 --- a/docs/html/search/all_d.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['usart',['USART',['../classUSART.html',1,'USART'],['../classUSART.html#a5daed20dc595c43d87c4c28bb08a7449',1,'USART::USART()']]], - ['usartexception',['USARTException',['../classUSARTException.html',1,'USARTException'],['../classUSARTException.html#a3c359db129825703b91392d5128cf93d',1,'USARTException::USARTException(const char *message)'],['../classUSARTException.html#a643c0a8b7f0d81e2f1693a75b378e6c2',1,'USARTException::USARTException(const std::string &message)']]] -]; diff --git a/docs/html/search/all_e.html b/docs/html/search/all_e.html deleted file mode 100644 index 2931618..0000000 --- a/docs/html/search/all_e.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js deleted file mode 100644 index 27f785f..0000000 --- a/docs/html/search/all_e.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['view',['View',['../classView.html',1,'']]], - ['viewinfo',['ViewInfo',['../classViewInfo.html',1,'']]], - ['viewmonitor',['ViewMonitor',['../classViewMonitor.html',1,'']]], - ['viewpromt',['ViewPromt',['../classViewPromt.html',1,'']]], - ['viewselection',['ViewSelection',['../classViewSelection.html',1,'']]] -]; diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html deleted file mode 100644 index ca42a52..0000000 --- a/docs/html/search/all_f.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js deleted file mode 100644 index 38b315c..0000000 --- a/docs/html/search/all_f.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]], - ['what',['what',['../classTimeoutException.html#a97eaf01fc39ddb94b060020b42fefd6e',1,'TimeoutException::what()'],['../classUSARTException.html#a2af5e3c00cd0585c7427c2e0420a8f15',1,'USARTException::what()']]], - ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] -]; diff --git a/docs/html/search/classes_0.html b/docs/html/search/classes_0.html deleted file mode 100644 index d585e6a..0000000 --- a/docs/html/search/classes_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js deleted file mode 100644 index 7622f87..0000000 --- a/docs/html/search/classes_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['b15f',['B15F',['../classB15F.html',1,'']]] -]; diff --git a/docs/html/search/classes_1.html b/docs/html/search/classes_1.html deleted file mode 100644 index baeb182..0000000 --- a/docs/html/search/classes_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/classes_1.js b/docs/html/search/classes_1.js deleted file mode 100644 index c2d5cc3..0000000 --- a/docs/html/search/classes_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['dot',['Dot',['../classDot.html',1,'']]], - ['driverexception',['DriverException',['../classDriverException.html',1,'']]] -]; diff --git a/docs/html/search/classes_2.html b/docs/html/search/classes_2.html deleted file mode 100644 index d267279..0000000 --- a/docs/html/search/classes_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/classes_2.js b/docs/html/search/classes_2.js deleted file mode 100644 index ca8950f..0000000 --- a/docs/html/search/classes_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]] -]; diff --git a/docs/html/search/classes_3.html b/docs/html/search/classes_3.html deleted file mode 100644 index 8a5cbe1..0000000 --- a/docs/html/search/classes_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/classes_3.js b/docs/html/search/classes_3.js deleted file mode 100644 index b7d0b63..0000000 --- a/docs/html/search/classes_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'']]] -]; diff --git a/docs/html/search/classes_4.html b/docs/html/search/classes_4.html deleted file mode 100644 index 300b9ab..0000000 --- a/docs/html/search/classes_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/classes_4.js b/docs/html/search/classes_4.js deleted file mode 100644 index c030e1b..0000000 --- a/docs/html/search/classes_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['usart',['USART',['../classUSART.html',1,'']]], - ['usartexception',['USARTException',['../classUSARTException.html',1,'']]] -]; diff --git a/docs/html/search/classes_5.html b/docs/html/search/classes_5.html deleted file mode 100644 index e7afb2c..0000000 --- a/docs/html/search/classes_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/classes_5.js b/docs/html/search/classes_5.js deleted file mode 100644 index 27f785f..0000000 --- a/docs/html/search/classes_5.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['view',['View',['../classView.html',1,'']]], - ['viewinfo',['ViewInfo',['../classViewInfo.html',1,'']]], - ['viewmonitor',['ViewMonitor',['../classViewMonitor.html',1,'']]], - ['viewpromt',['ViewPromt',['../classViewPromt.html',1,'']]], - ['viewselection',['ViewSelection',['../classViewSelection.html',1,'']]] -]; diff --git a/docs/html/search/close.png b/docs/html/search/close.png deleted file mode 100644 index 9342d3dfeea7b7c4ee610987e717804b5a42ceb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN diff --git a/docs/html/search/functions_0.html b/docs/html/search/functions_0.html deleted file mode 100644 index 8a729f7..0000000 --- a/docs/html/search/functions_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js deleted file mode 100644 index c4bd927..0000000 --- a/docs/html/search/functions_0.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['abort',['abort',['../classB15F.html#a3f09a418f9e3be5d1d750e4515c96f1e',1,'B15F::abort(std::string msg)'],['../classB15F.html#ac962a6a49bddd0e261a8c7d3aded23f8',1,'B15F::abort(std::exception &ex)']]], - ['activateselftestmode',['activateSelfTestMode',['../classB15F.html#ad9bf80ee2485fb5aac9926c6ef0731f1',1,'B15F']]], - ['adddot',['addDot',['../classPlottyFile.html#ae091e6eaaca16302f17572ac7dec6f7c',1,'PlottyFile::addDot(Dot &dot)'],['../classPlottyFile.html#a80e4b45219b4e9571992edfc28a28568',1,'PlottyFile::addDot(Dot dot)']]], - ['analogread',['analogRead',['../classB15F.html#ae0bd1f69751e2dc3c462db9213fc4627',1,'B15F']]], - ['analogsequence',['analogSequence',['../classB15F.html#ab82a324426c3063318c6cafb3089ae02',1,'B15F']]], - ['analogwrite0',['analogWrite0',['../classB15F.html#afc55fd590c7fa5c942d100cb60c4b0d3',1,'B15F']]], - ['analogwrite1',['analogWrite1',['../classB15F.html#a7f1becceac744f5cd2ad529748fd836f',1,'B15F']]] -]; diff --git a/docs/html/search/functions_1.html b/docs/html/search/functions_1.html deleted file mode 100644 index d4929aa..0000000 --- a/docs/html/search/functions_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_1.js b/docs/html/search/functions_1.js deleted file mode 100644 index 7200182..0000000 --- a/docs/html/search/functions_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['clearinputbuffer',['clearInputBuffer',['../classUSART.html#a28a2b4c5ed66b2c3a81196f76884f156',1,'USART']]], - ['clearoutputbuffer',['clearOutputBuffer',['../classUSART.html#a756d268a8762c316f91ca3238972b0c1',1,'USART']]], - ['closedevice',['closeDevice',['../classUSART.html#af80d6291ac1d2df04cfa1d8d27458cc5',1,'USART']]] -]; diff --git a/docs/html/search/functions_2.html b/docs/html/search/functions_2.html deleted file mode 100644 index 07e3fda..0000000 --- a/docs/html/search/functions_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js deleted file mode 100644 index 06f50ef..0000000 --- a/docs/html/search/functions_2.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['delay_5fms',['delay_ms',['../classB15F.html#aaffce20afb9f06bc4b7556c70ce76416',1,'B15F']]], - ['delay_5fus',['delay_us',['../classB15F.html#adcaac8ae8db3c28eccb499fbd720361f',1,'B15F']]], - ['digitalread0',['digitalRead0',['../classB15F.html#ae0df6d423deeb2fd610968bd1c72060e',1,'B15F']]], - ['digitalread1',['digitalRead1',['../classB15F.html#afc76b612dd4faeee0ac02a66b65af5f2',1,'B15F']]], - ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], - ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], - ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], - ['dot',['Dot',['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot']]], - ['drop',['drop',['../classUSART.html#a038d00c0b3d8c0c13c3e7eae5dad7813',1,'USART']]] -]; diff --git a/docs/html/search/functions_3.html b/docs/html/search/functions_3.html deleted file mode 100644 index 40bd389..0000000 --- a/docs/html/search/functions_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_3.js b/docs/html/search/functions_3.js deleted file mode 100644 index fb3f662..0000000 --- a/docs/html/search/functions_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['exec',['exec',['../classB15F.html#a1a7ac52984ed7ecac008a3e4060eee3a',1,'B15F']]] -]; diff --git a/docs/html/search/functions_4.html b/docs/html/search/functions_4.html deleted file mode 100644 index 8a4df4c..0000000 --- a/docs/html/search/functions_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js deleted file mode 100644 index 3641ddc..0000000 --- a/docs/html/search/functions_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['flushoutputbuffer',['flushOutputBuffer',['../classUSART.html#adb6ff4d1cf1af79ca255c5a81780200d',1,'USART']]] -]; diff --git a/docs/html/search/functions_5.html b/docs/html/search/functions_5.html deleted file mode 100644 index 2b983b2..0000000 --- a/docs/html/search/functions_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js deleted file mode 100644 index 9518d98..0000000 --- a/docs/html/search/functions_5.js +++ /dev/null @@ -1,23 +0,0 @@ -var searchData= -[ - ['getbaudrate',['getBaudrate',['../classUSART.html#a4918672d8069df205378a528b1892db3',1,'USART']]], - ['getboardinfo',['getBoardInfo',['../classB15F.html#a4f01677e73d6d172a2c1cae9427a591b',1,'B15F']]], - ['getcurve',['getCurve',['../classDot.html#ad0ae7dc1a9be3d8d985affc089b34396',1,'Dot']]], - ['getdescpara',['getDescPara',['../classPlottyFile.html#a536967daae3b382a5d6575f55450e198',1,'PlottyFile']]], - ['getdescx',['getDescX',['../classPlottyFile.html#a9cf7baa569be308c2cf6e07cadded09d',1,'PlottyFile']]], - ['getdescy',['getDescY',['../classPlottyFile.html#ab4a847fd71a804182f211233e194df45',1,'PlottyFile']]], - ['getfunctiontype',['getFunctionType',['../classPlottyFile.html#a88bb7d8350ed5fbc7a40e8d903c94bdb',1,'PlottyFile']]], - ['getinstance',['getInstance',['../classB15F.html#a8b4533d232c55ef2aa967e39e2d23380',1,'B15F']]], - ['getparafirstcurve',['getParaFirstCurve',['../classPlottyFile.html#a40828c93d66fe80166c4f603d5bdfa48',1,'PlottyFile']]], - ['getparastepwidth',['getParaStepWidth',['../classPlottyFile.html#a9da23f2bb8e6eb1837fc992ffd4057db',1,'PlottyFile']]], - ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], - ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], - ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], - ['getregister',['getRegister',['../classB15F.html#a43b477a9e2e5b1b2142958fa5e1a78b3',1,'B15F']]], - ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], - ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], - ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], - ['getunity',['getUnitY',['../classPlottyFile.html#a746b96036872dbece204e9739f3413b6',1,'PlottyFile']]], - ['getx',['getX',['../classDot.html#a029f0cc99c474122b77a708a317e7f77',1,'Dot']]], - ['gety',['getY',['../classDot.html#a8fcb987e6308d8184d1a2c8692227e58',1,'Dot']]] -]; diff --git a/docs/html/search/functions_6.html b/docs/html/search/functions_6.html deleted file mode 100644 index f7d283d..0000000 --- a/docs/html/search/functions_6.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_6.js b/docs/html/search/functions_6.js deleted file mode 100644 index bd75d34..0000000 --- a/docs/html/search/functions_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['opendevice',['openDevice',['../classUSART.html#a5f7e2abda2ec4a68a5fdb8ee2f8a940a',1,'USART']]] -]; diff --git a/docs/html/search/functions_7.html b/docs/html/search/functions_7.html deleted file mode 100644 index a74fe44..0000000 --- a/docs/html/search/functions_7.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_7.js b/docs/html/search/functions_7.js deleted file mode 100644 index b0de2bf..0000000 --- a/docs/html/search/functions_7.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['pwmsetfrequency',['pwmSetFrequency',['../classB15F.html#ac6f6532bb9550a0632c28b98c157d0a1',1,'B15F']]], - ['pwmsetvalue',['pwmSetValue',['../classB15F.html#af9aad3c0db5d5a8b37219d713e1977ee',1,'B15F']]] -]; diff --git a/docs/html/search/functions_8.html b/docs/html/search/functions_8.html deleted file mode 100644 index 75fc0be..0000000 --- a/docs/html/search/functions_8.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_8.js b/docs/html/search/functions_8.js deleted file mode 100644 index b57cb64..0000000 --- a/docs/html/search/functions_8.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['readdipswitch',['readDipSwitch',['../classB15F.html#a6f858f21ea81d491b5031b3644a2239a',1,'B15F']]], - ['receive',['receive',['../classUSART.html#a0fdc238203852f00bd750127602b2a6a',1,'USART']]], - ['reconnect',['reconnect',['../classB15F.html#a52557b375443c180a044e7d4e80a1ae7',1,'B15F']]] -]; diff --git a/docs/html/search/functions_9.html b/docs/html/search/functions_9.html deleted file mode 100644 index 7541c9e..0000000 --- a/docs/html/search/functions_9.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_9.js b/docs/html/search/functions_9.js deleted file mode 100644 index 552513c..0000000 --- a/docs/html/search/functions_9.js +++ /dev/null @@ -1,20 +0,0 @@ -var searchData= -[ - ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], - ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], - ['setdescpara',['setDescPara',['../classPlottyFile.html#a431904143c3c1164a2e8b8cfec3c77ab',1,'PlottyFile']]], - ['setdescx',['setDescX',['../classPlottyFile.html#aa0449c290265d55d6223b19cf0a88b0a',1,'PlottyFile']]], - ['setdescy',['setDescY',['../classPlottyFile.html#a38a3a4dfc76bc70523727584bf01d590',1,'PlottyFile']]], - ['setfunctiontype',['setFunctionType',['../classPlottyFile.html#a4e5ab1ebb012a5cc1a3d6458a4cd512f',1,'PlottyFile']]], - ['setparafirstcurve',['setParaFirstCurve',['../classPlottyFile.html#aa676414793becb975506f48d6e949dd0',1,'PlottyFile']]], - ['setparastepwidth',['setParaStepWidth',['../classPlottyFile.html#a6caebd31e04e2e7081cc007047350355',1,'PlottyFile']]], - ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], - ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], - ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], - ['setregister',['setRegister',['../classB15F.html#a2735424cf98bd0e2892b5a9b6eb24582',1,'B15F']]], - ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], - ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], - ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], - ['setunity',['setUnitY',['../classPlottyFile.html#abb18c814f435926f741f7ceb310f3059',1,'PlottyFile']]], - ['startplotty',['startPlotty',['../classPlottyFile.html#a08a115ef10458cadfe76077d623313df',1,'PlottyFile']]] -]; diff --git a/docs/html/search/functions_a.html b/docs/html/search/functions_a.html deleted file mode 100644 index 5a5be63..0000000 --- a/docs/html/search/functions_a.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_a.js b/docs/html/search/functions_a.js deleted file mode 100644 index c417073..0000000 --- a/docs/html/search/functions_a.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], - ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], - ['timeoutexception',['TimeoutException',['../classTimeoutException.html#aa45912234da11ffc9dd3594a1bbc0218',1,'TimeoutException::TimeoutException(const char *message)'],['../classTimeoutException.html#ad6e5c200fbfd276f48a6c1163e2d2988',1,'TimeoutException::TimeoutException(const std::string &message)']]], - ['transmit',['transmit',['../classUSART.html#a41b19dd58f307015b73e154048cd74ca',1,'USART']]] -]; diff --git a/docs/html/search/functions_b.html b/docs/html/search/functions_b.html deleted file mode 100644 index fc2d5aa..0000000 --- a/docs/html/search/functions_b.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_b.js b/docs/html/search/functions_b.js deleted file mode 100644 index 7419b81..0000000 --- a/docs/html/search/functions_b.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['usart',['USART',['../classUSART.html#a5daed20dc595c43d87c4c28bb08a7449',1,'USART']]], - ['usartexception',['USARTException',['../classUSARTException.html#a3c359db129825703b91392d5128cf93d',1,'USARTException::USARTException(const char *message)'],['../classUSARTException.html#a643c0a8b7f0d81e2f1693a75b378e6c2',1,'USARTException::USARTException(const std::string &message)']]] -]; diff --git a/docs/html/search/functions_c.html b/docs/html/search/functions_c.html deleted file mode 100644 index a1a1437..0000000 --- a/docs/html/search/functions_c.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_c.js b/docs/html/search/functions_c.js deleted file mode 100644 index b730bff..0000000 --- a/docs/html/search/functions_c.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['what',['what',['../classTimeoutException.html#a97eaf01fc39ddb94b060020b42fefd6e',1,'TimeoutException::what()'],['../classUSARTException.html#a2af5e3c00cd0585c7427c2e0420a8f15',1,'USARTException::what()']]], - ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] -]; diff --git a/docs/html/search/functions_d.html b/docs/html/search/functions_d.html deleted file mode 100644 index 4375535..0000000 --- a/docs/html/search/functions_d.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/functions_d.js b/docs/html/search/functions_d.js deleted file mode 100644 index f5a3874..0000000 --- a/docs/html/search/functions_d.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['_7etimeoutexception',['~TimeoutException',['../classTimeoutException.html#a2f686b262d2ccffa0090fda9b44ab540',1,'TimeoutException']]], - ['_7eusart',['~USART',['../classUSART.html#a0c8eb1a939ca00921e22f6cbcc7bb749',1,'USART']]], - ['_7eusartexception',['~USARTException',['../classUSARTException.html#a0e008b3cb4974859e6bc8c8f8eb480be',1,'USARTException']]] -]; diff --git a/docs/html/search/mag_sel.png b/docs/html/search/mag_sel.png deleted file mode 100644 index 39c0ed52a25dd9d080ee0d42ae6c6042bdfa04d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!2%?$TA$hhDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~NU84L`?eGCi_EEpJ?t}-xGu`@87+QPtK?83kxQ`TapwHK(CDaqU2h2ejD|C#+j z9%q3^WHAE+w=f7ZGR&GI0Tg5}@$_|Nf5gMiEhFgvHvB$N=!mC_V~EE2vzPXI9ZnEo zd+1zHor@dYLod2Y{ z@R$7$Z!PXTbY$|@#T!bMzm?`b<(R`cbw(gxJHzu zB$lLFB^RXvDF!10LknF)BV7aY5JN*NBMU1-b8Q0yD+2>vd*|CI8glbfGSez?Ylunu RoetE%;OXk;vd$@?2>>CYplSdB diff --git a/docs/html/search/nomatches.html b/docs/html/search/nomatches.html deleted file mode 100644 index 4377320..0000000 --- a/docs/html/search/nomatches.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - -
          -
          No Matches
          -
          - - diff --git a/docs/html/search/pages_0.html b/docs/html/search/pages_0.html deleted file mode 100644 index 32cbf49..0000000 --- a/docs/html/search/pages_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js deleted file mode 100644 index 31be983..0000000 --- a/docs/html/search/pages_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['b15f_20benutzerhandbuch',['B15F Benutzerhandbuch',['../index.html',1,'']]] -]; diff --git a/docs/html/search/search.css b/docs/html/search/search.css deleted file mode 100644 index 3cf9df9..0000000 --- a/docs/html/search/search.css +++ /dev/null @@ -1,271 +0,0 @@ -/*---------------- Search Box */ - -#FSearchBox { - float: left; -} - -#MSearchBox { - white-space : nowrap; - float: none; - margin-top: 8px; - right: 0px; - width: 170px; - height: 24px; - z-index: 102; -} - -#MSearchBox .left -{ - display:block; - position:absolute; - left:10px; - width:20px; - height:19px; - background:url('search_l.png') no-repeat; - background-position:right; -} - -#MSearchSelect { - display:block; - position:absolute; - width:20px; - height:19px; -} - -.left #MSearchSelect { - left:4px; -} - -.right #MSearchSelect { - right:5px; -} - -#MSearchField { - display:block; - position:absolute; - height:19px; - background:url('search_m.png') repeat-x; - border:none; - width:115px; - margin-left:20px; - padding-left:4px; - color: #909090; - outline: none; - font: 9pt Arial, Verdana, sans-serif; - -webkit-border-radius: 0px; -} - -#FSearchBox #MSearchField { - margin-left:15px; -} - -#MSearchBox .right { - display:block; - position:absolute; - right:10px; - top:8px; - width:20px; - height:19px; - background:url('search_r.png') no-repeat; - background-position:left; -} - -#MSearchClose { - display: none; - position: absolute; - top: 4px; - background : none; - border: none; - margin: 0px 4px 0px 0px; - padding: 0px 0px; - outline: none; -} - -.left #MSearchClose { - left: 6px; -} - -.right #MSearchClose { - right: 2px; -} - -.MSearchBoxActive #MSearchField { - color: #000000; -} - -/*---------------- Search filter selection */ - -#MSearchSelectWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #90A5CE; - background-color: #F9FAFC; - z-index: 10001; - padding-top: 4px; - padding-bottom: 4px; - -moz-border-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -.SelectItem { - font: 8pt Arial, Verdana, sans-serif; - padding-left: 2px; - padding-right: 12px; - border: 0px; -} - -span.SelectionMark { - margin-right: 4px; - font-family: monospace; - outline-style: none; - text-decoration: none; -} - -a.SelectItem { - display: block; - outline-style: none; - color: #000000; - text-decoration: none; - padding-left: 6px; - padding-right: 12px; -} - -a.SelectItem:focus, -a.SelectItem:active { - color: #000000; - outline-style: none; - text-decoration: none; -} - -a.SelectItem:hover { - color: #FFFFFF; - background-color: #3D578C; - outline-style: none; - text-decoration: none; - cursor: pointer; - display: block; -} - -/*---------------- Search results window */ - -iframe#MSearchResults { - width: 60ex; - height: 15em; -} - -#MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #000; - background-color: #EEF1F7; - z-index:10000; -} - -/* ----------------------------------- */ - - -#SRIndex { - clear:both; - padding-bottom: 15px; -} - -.SREntry { - font-size: 10pt; - padding-left: 1ex; -} - -.SRPage .SREntry { - font-size: 8pt; - padding: 1px 5px; -} - -body.SRPage { - margin: 5px 2px; -} - -.SRChildren { - padding-left: 3ex; padding-bottom: .5em -} - -.SRPage .SRChildren { - display: none; -} - -.SRSymbol { - font-weight: bold; - color: #425E97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRScope { - display: block; - color: #425E97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRSymbol:focus, a.SRSymbol:active, -a.SRScope:focus, a.SRScope:active { - text-decoration: underline; -} - -span.SRScope { - padding-left: 4px; -} - -.SRPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; -} - -.SRResult { - display: none; -} - -DIV.searchresults { - margin-left: 10px; - margin-right: 10px; -} - -/*---------------- External search page results */ - -.searchresult { - background-color: #F0F3F8; -} - -.pages b { - color: white; - padding: 5px 5px 3px 5px; - background-image: url("../tab_a.png"); - background-repeat: repeat-x; - text-shadow: 0 1px 1px #000000; -} - -.pages { - line-height: 17px; - margin-left: 4px; - text-decoration: none; -} - -.hl { - font-weight: bold; -} - -#searchresults { - margin-bottom: 20px; -} - -.searchpages { - margin-top: 10px; -} - diff --git a/docs/html/search/search.js b/docs/html/search/search.js deleted file mode 100644 index a554ab9..0000000 --- a/docs/html/search/search.js +++ /dev/null @@ -1,814 +0,0 @@ -/* - @licstart The following is the entire license notice for the - JavaScript code in this file. - - Copyright (C) 1997-2017 by Dimitri van Heesch - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - @licend The above is the entire license notice - for the JavaScript code in this file - */ -function convertToId(search) -{ - var result = ''; - for (i=0;i do a search - { - this.Search(); - } - } - - this.OnSearchSelectKey = function(evt) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 && this.searchIndex0) // Up - { - this.searchIndex--; - this.OnSelectItem(this.searchIndex); - } - else if (e.keyCode==13 || e.keyCode==27) - { - this.OnSelectItem(this.searchIndex); - this.CloseSelectionWindow(); - this.DOMSearchField().focus(); - } - return false; - } - - // --------- Actions - - // Closes the results window. - this.CloseResultsWindow = function() - { - this.DOMPopupSearchResultsWindow().style.display = 'none'; - this.DOMSearchClose().style.display = 'none'; - this.Activate(false); - } - - this.CloseSelectionWindow = function() - { - this.DOMSearchSelectWindow().style.display = 'none'; - } - - // Performs a search. - this.Search = function() - { - this.keyTimeout = 0; - - // strip leading whitespace - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - - var code = searchValue.toLowerCase().charCodeAt(0); - var idxChar = searchValue.substr(0, 1).toLowerCase(); - if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair - { - idxChar = searchValue.substr(0, 2); - } - - var resultsPage; - var resultsPageWithSearch; - var hasResultsPage; - - var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); - if (idx!=-1) - { - var hexCode=idx.toString(16); - resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; - resultsPageWithSearch = resultsPage+'?'+escape(searchValue); - hasResultsPage = true; - } - else // nothing available for this search term - { - resultsPage = this.resultsPath + '/nomatches.html'; - resultsPageWithSearch = resultsPage; - hasResultsPage = false; - } - - window.frames.MSearchResults.location = resultsPageWithSearch; - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - - if (domPopupSearchResultsWindow.style.display!='block') - { - var domSearchBox = this.DOMSearchBox(); - this.DOMSearchClose().style.display = 'inline'; - if (this.insideFrame) - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - domPopupSearchResultsWindow.style.position = 'relative'; - domPopupSearchResultsWindow.style.display = 'block'; - var width = document.body.clientWidth - 8; // the -8 is for IE :-( - domPopupSearchResultsWindow.style.width = width + 'px'; - domPopupSearchResults.style.width = width + 'px'; - } - else - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; - var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; - domPopupSearchResultsWindow.style.display = 'block'; - left -= domPopupSearchResults.offsetWidth; - domPopupSearchResultsWindow.style.top = top + 'px'; - domPopupSearchResultsWindow.style.left = left + 'px'; - } - } - - this.lastSearchValue = searchValue; - this.lastResultsPage = resultsPage; - } - - // -------- Activation Functions - - // Activates or deactivates the search panel, resetting things to - // their default values if necessary. - this.Activate = function(isActive) - { - if (isActive || // open it - this.DOMPopupSearchResultsWindow().style.display == 'block' - ) - { - this.DOMSearchBox().className = 'MSearchBoxActive'; - - var searchField = this.DOMSearchField(); - - if (searchField.value == this.searchLabel) // clear "Search" term upon entry - { - searchField.value = ''; - this.searchActive = true; - } - } - else if (!isActive) // directly remove the panel - { - this.DOMSearchBox().className = 'MSearchBoxInactive'; - this.DOMSearchField().value = this.searchLabel; - this.searchActive = false; - this.lastSearchValue = '' - this.lastResultsPage = ''; - } - } -} - -// ----------------------------------------------------------------------- - -// The class that handles everything on the search results page. -function SearchResults(name) -{ - // The number of matches from the last run of . - this.lastMatchCount = 0; - this.lastKey = 0; - this.repeatOn = false; - - // Toggles the visibility of the passed element ID. - this.FindChildElement = function(id) - { - var parentElement = document.getElementById(id); - var element = parentElement.firstChild; - - while (element && element!=parentElement) - { - if (element.nodeName == 'DIV' && element.className == 'SRChildren') - { - return element; - } - - if (element.nodeName == 'DIV' && element.hasChildNodes()) - { - element = element.firstChild; - } - else if (element.nextSibling) - { - element = element.nextSibling; - } - else - { - do - { - element = element.parentNode; - } - while (element && element!=parentElement && !element.nextSibling); - - if (element && element!=parentElement) - { - element = element.nextSibling; - } - } - } - } - - this.Toggle = function(id) - { - var element = this.FindChildElement(id); - if (element) - { - if (element.style.display == 'block') - { - element.style.display = 'none'; - } - else - { - element.style.display = 'block'; - } - } - } - - // Searches for the passed string. If there is no parameter, - // it takes it from the URL query. - // - // Always returns true, since other documents may try to call it - // and that may or may not be possible. - this.Search = function(search) - { - if (!search) // get search word from URL - { - search = window.location.search; - search = search.substring(1); // Remove the leading '?' - search = unescape(search); - } - - search = search.replace(/^ +/, ""); // strip leading spaces - search = search.replace(/ +$/, ""); // strip trailing spaces - search = search.toLowerCase(); - search = convertToId(search); - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' - - if (search.length<=rowMatchName.length && - rowMatchName.substr(0, search.length)==search) - { - row.style.display = 'block'; - matches++; - } - else - { - row.style.display = 'none'; - } - } - i++; - } - document.getElementById("Searching").style.display='none'; - if (matches == 0) // no results - { - document.getElementById("NoMatches").style.display='block'; - } - else // at least one result - { - document.getElementById("NoMatches").style.display='none'; - } - this.lastMatchCount = matches; - return true; - } - - // return the first item with index index or higher that is visible - this.NavNext = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index++; - } - return focusItem; - } - - this.NavPrev = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index--; - } - return focusItem; - } - - this.ProcessKeys = function(e) - { - if (e.type == "keydown") - { - this.repeatOn = false; - this.lastKey = e.keyCode; - } - else if (e.type == "keypress") - { - if (!this.repeatOn) - { - if (this.lastKey) this.repeatOn = true; - return false; // ignore first keypress after keydown - } - } - else if (e.type == "keyup") - { - this.lastKey = 0; - this.repeatOn = false; - } - return this.lastKey!=0; - } - - this.Nav = function(evt,itemIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - var newIndex = itemIndex-1; - var focusItem = this.NavPrev(newIndex); - if (focusItem) - { - var child = this.FindChildElement(focusItem.parentNode.parentNode.id); - if (child && child.style.display == 'block') // children visible - { - var n=0; - var tmpElem; - while (1) // search for last child - { - tmpElem = document.getElementById('Item'+newIndex+'_c'+n); - if (tmpElem) - { - focusItem = tmpElem; - } - else // found it! - { - break; - } - n++; - } - } - } - if (focusItem) - { - focusItem.focus(); - } - else // return focus to search field - { - parent.document.getElementById("MSearchField").focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = itemIndex+1; - var focusItem; - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem && elem.style.display == 'block') // children visible - { - focusItem = document.getElementById('Item'+itemIndex+'_c0'); - } - if (!focusItem) focusItem = this.NavNext(newIndex); - if (focusItem) focusItem.focus(); - } - else if (this.lastKey==39) // Right - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'block'; - } - else if (this.lastKey==37) // Left - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'none'; - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } - - this.NavChild = function(evt,itemIndex,childIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - if (childIndex>0) - { - var newIndex = childIndex-1; - document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); - } - else // already at first child, jump to parent - { - document.getElementById('Item'+itemIndex).focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = childIndex+1; - var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); - if (!elem) // last child, jump to parent next parent - { - elem = this.NavNext(itemIndex+1); - } - if (elem) - { - elem.focus(); - } - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } -} - -function setKeyActions(elem,action) -{ - elem.setAttribute('onkeydown',action); - elem.setAttribute('onkeypress',action); - elem.setAttribute('onkeyup',action); -} - -function setClassAttr(elem,attr) -{ - elem.setAttribute('class',attr); - elem.setAttribute('className',attr); -} - -function createResults() -{ - var results = document.getElementById("SRResults"); - for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W diff --git a/docs/html/search/search_r.png b/docs/html/search/search_r.png deleted file mode 100644 index 1af5d21ee13e070d7600f1c4657fde843b953a69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js deleted file mode 100644 index 9ff7555..0000000 --- a/docs/html/search/searchdata.js +++ /dev/null @@ -1,27 +0,0 @@ -var indexSectionsWithContent = -{ - 0: "abcdefgmoprstuvw~", - 1: "bdptuv", - 2: "acdefgoprstuw~", - 3: "bmprw", - 4: "b" -}; - -var indexSectionNames = -{ - 0: "all", - 1: "classes", - 2: "functions", - 3: "variables", - 4: "pages" -}; - -var indexSectionLabels = -{ - 0: "All", - 1: "Classes", - 2: "Functions", - 3: "Variables", - 4: "Pages" -}; - diff --git a/docs/html/search/variables_0.html b/docs/html/search/variables_0.html deleted file mode 100644 index a2a3ae6..0000000 --- a/docs/html/search/variables_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js deleted file mode 100644 index d1fd2cf..0000000 --- a/docs/html/search/variables_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]] -]; diff --git a/docs/html/search/variables_1.html b/docs/html/search/variables_1.html deleted file mode 100644 index b243c42..0000000 --- a/docs/html/search/variables_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js deleted file mode 100644 index 66df4a3..0000000 --- a/docs/html/search/variables_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['msg',['msg',['../classTimeoutException.html#aa625fc0fae48a67737a98eafb91c9624',1,'TimeoutException::msg()'],['../classUSARTException.html#a14c80df95f216d221aa97cffbcd8dd79',1,'USARTException::msg()']]], - ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], - ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] -]; diff --git a/docs/html/search/variables_2.html b/docs/html/search/variables_2.html deleted file mode 100644 index 647df20..0000000 --- a/docs/html/search/variables_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js deleted file mode 100644 index 570beea..0000000 --- a/docs/html/search/variables_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]] -]; diff --git a/docs/html/search/variables_3.html b/docs/html/search/variables_3.html deleted file mode 100644 index 9dc9b89..0000000 --- a/docs/html/search/variables_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js deleted file mode 100644 index fbf0a47..0000000 --- a/docs/html/search/variables_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['reconnect_5ftimeout',['RECONNECT_TIMEOUT',['../classB15F.html#a040951746fbfd632e12bd1ad14578816',1,'B15F']]], - ['reconnect_5ftries',['RECONNECT_TRIES',['../classB15F.html#a6c4895bdbcd71ff6743becf97985c2dc',1,'B15F']]] -]; diff --git a/docs/html/search/variables_4.html b/docs/html/search/variables_4.html deleted file mode 100644 index 78cc2c7..0000000 --- a/docs/html/search/variables_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
          -
          Loading...
          -
          - -
          Searching...
          -
          No Matches
          - -
          - - diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js deleted file mode 100644 index 9a9c561..0000000 --- a/docs/html/search/variables_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]] -]; diff --git a/docs/html/splitbar.png b/docs/html/splitbar.png deleted file mode 100644 index fe895f2c58179b471a22d8320b39a4bd7312ec8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T diff --git a/docs/html/sync_off.png b/docs/html/sync_off.png deleted file mode 100644 index 3b443fc62892114406e3d399421b2a881b897acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* diff --git a/docs/html/sync_on.png b/docs/html/sync_on.png deleted file mode 100644 index e08320fb64e6fa33b573005ed6d8fe294e19db76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 diff --git a/docs/html/tab_a.png b/docs/html/tab_a.png deleted file mode 100644 index 3b725c41c5a527a3a3e40097077d0e206a681247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 diff --git a/docs/html/tab_b.png b/docs/html/tab_b.png deleted file mode 100644 index e2b4a8638cb3496a016eaed9e16ffc12846dea18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ diff --git a/docs/html/tabs.css b/docs/html/tabs.css deleted file mode 100644 index 85a0cd5..0000000 --- a/docs/html/tabs.css +++ /dev/null @@ -1 +0,0 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/docs/html/timeoutexception_8h_source.html b/docs/html/timeoutexception_8h_source.html deleted file mode 100644 index da53844..0000000 --- a/docs/html/timeoutexception_8h_source.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - -B15F: drv/timeoutexception.h Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          timeoutexception.h
          -
          -
          -
          1 #ifndef TIMEOUTEXCEPTION_H
          2 #define TIMEOUTEXCEPTION_H
          3 
          4 #include <exception>
          5 #include <string>
          6 
          9 class TimeoutException: public std::exception
          10 {
          11 public:
          16  explicit TimeoutException(const char* message) : msg(message)
          17  {
          18  }
          19 
          24  explicit TimeoutException(const std::string& message) : msg(message)
          25  {
          26  }
          27 
          31  virtual ~TimeoutException() = default;
          32 
          37  virtual const char* what() const throw ()
          38  {
          39  return msg.c_str();
          40  }
          41 
          42 protected:
          43  std::string msg;
          44 };
          45 
          46 #endif // TIMEOUTEXCEPTION_H
          -
          virtual ~TimeoutException()=default
          -
          std::string msg
          failure description
          -
          virtual const char * what() const
          -
          TimeoutException(const char *message)
          - -
          TimeoutException(const std::string &message)
          - - - - diff --git a/docs/html/ui_8cpp_source.html b/docs/html/ui_8cpp_source.html deleted file mode 100644 index 68fade6..0000000 --- a/docs/html/ui_8cpp_source.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - -B15F: ui/ui.cpp Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          ui.cpp
          -
          -
          -
          1 #include "ui.h"
          2 #include "../drv/b15f.h"
          3 
          4 std::vector<View*> win_stack;
          5 std::thread t_refresh;
          6 
          7 void show_main(int)
          8 {
          9  ViewSelection* view = new ViewSelection();
          10  view->setTitle("B15F - Command Line Interface");
          11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
          12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
          13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
          14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
          15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
          16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
          17  view->addChoice("[ Informationen ]", &show_info);
          18  view->addChoice("", nullptr);
          19  view->addChoice("[ Beenden ]", &finish);
          20  view->repaint();
          21 
          22  win_stack.push_back(view);
          23  input(0);
          24 }
          25 
          26 void input(int)
          27 {
          28  call_t nextCall;
          29  int key;
          30  do
          31  {
          32  key = wgetch(View::getWinContext());
          33  win_stack.back()->repaint();
          34  nextCall = win_stack.back()->keypress(key);
          35 
          36  if(key == -1)
          37  view_back(key);
          38 
          39  if(nextCall)
          40  nextCall(key);
          41  }
          42  while(win_stack.size());
          43 }
          44 
          45 void view_back(int)
          46 {
          47  if(win_stack.size())
          48  {
          49  delete win_stack.back();
          50  win_stack.pop_back();
          51  }
          52  if(win_stack.size())
          53  win_stack.back()->repaint();
          54 }
          55 
          56 void finish(int)
          57 {
          58  cleanup();
          59  exit(EXIT_SUCCESS);
          60 }
          61 
          62 void cleanup()
          63 {
          64  if(t_refresh.joinable())
          65  t_refresh.join();
          66  clrtoeol();
          67  refresh();
          68  endwin();
          69 }
          70 
          71 void show_info(int)
          72 {
          73  ViewInfo* view = new ViewInfo();
          74  view->setTitle("Info");
          75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
          76  view->setLabelClose("[ Zurueck ]");
          77  view->repaint();
          78 
          79  win_stack.push_back(view);
          80  input(0);
          81 }
          82 
          83 void show_monitor(int)
          84 {
          85  ViewMonitor* view = new ViewMonitor();
          86  view->setTitle("Monitor");
          87  view->setText("\nErfasse Messwerte...");
          88  view->setLabelClose("[ Zurueck ]");
          89  view->repaint();
          90 
          91  win_stack.push_back(view);
          92  input(0);
          93 }
          94 
          95 void show_invalid_port_input(int)
          96 {
          97  ViewInfo* view = new ViewInfo();
          98  view->setTitle("Falsche Eingabe");
          99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
          100  view->setLabelClose("[ Schliessen ]");
          101  view->repaint();
          102 
          103  win_stack.push_back(view);
          104  input(0);
          105 }
          106 
          107 void show_invalid_dac_input(int)
          108 {
          109  ViewInfo* view = new ViewInfo();
          110  view->setTitle("Falsche Eingabe");
          111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
          112  view->setLabelClose("[ Schliessen ]");
          113  view->repaint();
          114 
          115  win_stack.push_back(view);
          116  input(0);
          117 }
          118 
          119 void write_digital_output0(int)
          120 {
          121  try
          122  {
          123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
          124  if(d > 255 || 0 > d)
          125  throw std::invalid_argument("bad value");
          126  uint8_t port = static_cast<uint8_t>(d);
          127 
          128  B15F& drv = B15F::getInstance();
          129  drv.digitalWrite0(port);
          130  view_back(0);
          131  }
          132  catch(std::invalid_argument& ex)
          133  {
          134  show_invalid_port_input(0);
          135  }
          136 }
          137 
          138 void write_digital_output1(int)
          139 {
          140  try
          141  {
          142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
          143  if(d > 255 || 0 > d)
          144  throw std::invalid_argument("bad value");
          145  uint8_t port = static_cast<uint8_t>(d);
          146 
          147  B15F& drv = B15F::getInstance();
          148  drv.digitalWrite1(port);
          149  view_back(0);
          150  }
          151  catch(std::invalid_argument& ex)
          152  {
          153  show_invalid_port_input(0);
          154  }
          155 }
          156 
          157 void write_analog_output0(int)
          158 {
          159  try
          160  {
          161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
          162  if(port > 1023)
          163  throw std::invalid_argument("bad value");
          164 
          165  B15F& drv = B15F::getInstance();
          166  drv.analogWrite0(port);
          167  view_back(0);
          168  }
          169  catch(std::invalid_argument& ex)
          170  {
          171  show_invalid_dac_input(0);
          172  }
          173 }
          174 
          175 void write_analog_output1(int)
          176 {
          177  try
          178  {
          179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
          180  if(port > 1023)
          181  throw std::invalid_argument("bad value");
          182 
          183  B15F& drv = B15F::getInstance();
          184  drv.analogWrite1(port);
          185  view_back(0);
          186  }
          187  catch(std::invalid_argument& ex)
          188  {
          189  show_invalid_dac_input(0);
          190  }
          191 }
          192 
          193 void show_digital_output0(int)
          194 {
          195  ViewPromt* view = new ViewPromt();
          196  view->setTitle("Digitale Ausgabe BE0");
          197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
          198  view->setCancel("[ Zurueck ]", true);
          199  view->setConfirm("[ OK ]", &write_digital_output0);
          200  view->repaint();
          201 
          202  win_stack.push_back(view);
          203  input(0);
          204 }
          205 
          206 void show_digital_output1(int)
          207 {
          208  ViewPromt* view = new ViewPromt();
          209  view->setTitle("Digitale Ausgabe BE1");
          210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
          211  view->setCancel("[ Zurueck ]", true);
          212  view->setConfirm("[ OK ]", &write_digital_output1);
          213  view->repaint();
          214 
          215  win_stack.push_back(view);
          216  input(0);
          217 }
          218 
          219 void show_analog_output0(int)
          220 {
          221  ViewPromt* view = new ViewPromt();
          222  view->setTitle("Analoge Ausgabe AA0");
          223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
          224  view->setCancel("[ Zurueck ]", true);
          225  view->setConfirm("[ OK ]", &write_analog_output0);
          226  view->repaint();
          227 
          228  win_stack.push_back(view);
          229  input(0);
          230 }
          231 
          232 void show_analog_output1(int)
          233 {
          234  ViewPromt* view = new ViewPromt();
          235  view->setTitle("Analoge Ausgabe AA1");
          236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
          237  view->setCancel("[ Zurueck ]", true);
          238  view->setConfirm("[ OK ]", &write_analog_output1);
          239  view->repaint();
          240 
          241  win_stack.push_back(view);
          242  input(0);
          243 }
          244 
          245 void start_selftest(int)
          246 {
          247  B15F& drv = B15F::getInstance();
          248  drv.activateSelfTestMode();
          249 
          250  ViewInfo* view = new ViewInfo();
          251  view->setTitle("Selbsttest aktiv");
          252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
          253  view->setLabelClose("[ Selbsttest Beenden ]");
          254  view->setCall(&stop_selftest);
          255  view->repaint();
          256 
          257  win_stack.push_back(view);
          258  input(0);
          259 }
          260 
          261 void stop_selftest(int)
          262 {
          263  B15F& drv = B15F::getInstance();
          264  drv.discard();
          266  drv.reconnect();
          267  drv.digitalWrite0(0);
          268  drv.digitalWrite1(0);
          269 }
          270 
          271 void show_selftest_info(int)
          272 {
          273  ViewInfo* view = new ViewInfo();
          274  view->setTitle("Selbsttest");
          275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
          276  view->setLabelClose("[ Weiter ]");
          277  view->setCall(&start_selftest);
          278  view->repaint();
          279 
          280  win_stack.push_back(view);
          281  input(0);
          282 }
          - - -
          void delay_ms(uint16_t ms)
          Definition: b15f.cpp:432
          -
          static B15F & getInstance(void)
          Definition: b15f.cpp:442
          -
          Definition: b15f.h:26
          -
          bool digitalWrite0(uint8_t)
          Definition: b15f.cpp:179
          -
          bool activateSelfTestMode(void)
          Definition: b15f.cpp:166
          - -
          bool analogWrite1(uint16_t port)
          Definition: b15f.cpp:264
          - -
          bool digitalWrite1(uint8_t)
          Definition: b15f.cpp:193
          -
          void discard(void)
          Definition: b15f.cpp:72
          -
          constexpr static uint16_t WDT_TIMEOUT
          Time in ms after which the watch dog timer resets the MCU.
          Definition: b15f.h:235
          -
          void reconnect(void)
          Definition: b15f.cpp:57
          -
          bool analogWrite0(uint16_t port)
          Definition: b15f.cpp:249
          - - - - diff --git a/docs/html/ui_8h_source.html b/docs/html/ui_8h_source.html deleted file mode 100644 index b3032df..0000000 --- a/docs/html/ui_8h_source.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -B15F: ui/ui.h Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          ui.h
          -
          -
          -
          1 #ifndef UI_H
          2 #define UI_H
          3 
          4 #include <vector>
          5 #include "view_selection.h"
          6 #include "view_info.h"
          7 #include "view_monitor.h"
          8 #include "view_promt.h"
          9 
          10 void show_main(int);
          11 void input(int);
          12 void view_back(int);
          13 void finish(int);
          14 void cleanup();
          15 
          16 void show_info(int);
          17 void show_monitor(int);
          18 void show_invalid_port_input(int);
          19 void show_invalid_dac_input(int);
          20 void write_digital_output0(int);
          21 void write_digital_output1(int);
          22 void write_analog_output0(int);
          23 void write_analog_output1(int);
          24 void show_digital_output0(int);
          25 void show_digital_output1(int);
          26 void show_analog_output0(int);
          27 void show_analog_output1(int);
          28 
          29 // selftest group
          30 void show_selftest_info(int);
          31 void start_selftest(int);
          32 void stop_selftest(int);
          33 
          34 
          35 extern std::vector<View*> win_stack;
          36 extern std::thread t_refresh;
          37 
          38 #endif // UI_H
          - - - - diff --git a/docs/html/usart_8cpp_source.html b/docs/html/usart_8cpp_source.html deleted file mode 100644 index 5c713bb..0000000 --- a/docs/html/usart_8cpp_source.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - -B15F: drv/usart.cpp Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          usart.cpp
          -
          -
          -
          1 #include <stdexcept>
          2 #include "usart.h"
          3 
          5 {
          6  closeDevice();
          7 }
          8 
          9 void USART::openDevice(std::string device)
          10 {
          11  // Benutze blockierenden Modus
          12  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY);// | O_NDELAY
          13  if (file_desc <= 0)
          14  throw USARTException("Fehler beim Öffnen des Gerätes");
          15 
          16  struct termios options;
          17  int code = tcgetattr(file_desc, &options);
          18  if (code)
          19  throw USARTException("Fehler beim Lesen der Geräteparameter");
          20 
          21  options.c_cflag = CS8 | CLOCAL | CREAD;
          22  options.c_iflag = IGNPAR;
          23  options.c_oflag = 0;
          24  options.c_lflag = 0;
          25  options.c_cc[VMIN] = 0;
          26  options.c_cc[VTIME] = timeout;
          27  code = cfsetspeed(&options, baudrate);
          28  if (code)
          29  throw USARTException("Fehler beim Setzen der Baudrate");
          30 
          31  code = tcsetattr(file_desc, TCSANOW, &options);
          32  if (code)
          33  throw USARTException("Fehler beim Setzen der Geräteparameter");
          34 
          35  code = fcntl(file_desc, F_SETFL, 0); // blockierender Modus
          36  if (code)
          37  throw USARTException("Fehler beim Aktivieren des blockierenden Modus'");
          38 
          41 }
          42 
          44 {
          45  if (file_desc > 0)
          46  {
          47  int code = close(file_desc);
          48  if (code)
          49  throw USARTException("Fehler beim Schließen des Gerätes");
          50  file_desc = -1;
          51  }
          52 }
          53 
          55 {
          56  int code = tcflush(file_desc, TCIFLUSH);
          57  if (code)
          58  throw USARTException("Fehler beim Leeren des Eingangspuffers");
          59 }
          60 
          62 {
          63  int code = tcflush(file_desc, TCOFLUSH);
          64  if (code)
          65  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
          66 }
          67 
          69 {
          70  int code = tcdrain(file_desc);
          71  if (code)
          72  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
          73 }
          74 
          75 void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          76 {
          77  int code = write(file_desc, buffer + offset, len);
          78  if (code != len)
          79  throw USARTException(
          80  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          81  ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")");
          82 }
          83 
          84 void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          85 {
          86  int bytes_avail, code;
          87  auto start = std::chrono::steady_clock::now();
          88  auto end = std::chrono::steady_clock::now();
          89  do
          90  {
          91  code = ioctl(file_desc, FIONREAD, &bytes_avail);
          92  if (code)
          93  throw USARTException(
          94  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          95  ", " + strerror(code) + " (code " + std::to_string(code) + ")");
          96 
          97  end = std::chrono::steady_clock::now();
          98  long elapsed =
          99  std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() / 100; // in Dezisekunden
          100  if (elapsed >= timeout)
          101  throw TimeoutException(
          102  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          103  ", " + std::to_string(elapsed) + " / " + std::to_string(timeout) + " ds");
          104  }
          105  while (bytes_avail < len);
          106 
          107  code = read(file_desc, buffer + offset, len);
          108  if (code != len)
          109  throw USARTException(
          110  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          111  ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")");
          112 }
          113 
          114 void USART::drop(uint8_t len)
          115 {
          116  // Kann bestimmt noch eleganter gelöst werden
          117  uint8_t dummy[len];
          118  receive(&dummy[0], 0, len);
          119 }
          120 
          122 {
          123  return baudrate;
          124 }
          125 
          127 {
          128  return timeout;
          129 }
          130 
          131 void USART::setBaudrate(uint32_t baudrate)
          132 {
          133  this->baudrate = baudrate;
          134 }
          135 
          136 void USART::setTimeout(uint8_t timeout)
          137 {
          138  this->timeout = timeout;
          139 }
          -
          uint32_t getBaudrate(void)
          Definition: usart.cpp:121
          - -
          void closeDevice(void)
          Definition: usart.cpp:43
          -
          void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:75
          -
          void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:84
          -
          void clearInputBuffer(void)
          Definition: usart.cpp:54
          -
          uint8_t getTimeout(void)
          Definition: usart.cpp:126
          -
          void clearOutputBuffer(void)
          Definition: usart.cpp:61
          -
          void setBaudrate(uint32_t baudrate)
          Definition: usart.cpp:131
          -
          virtual ~USART(void)
          Definition: usart.cpp:4
          -
          void openDevice(std::string device)
          Definition: usart.cpp:9
          -
          void drop(uint8_t len)
          Definition: usart.cpp:114
          -
          void setTimeout(uint8_t timeout)
          Definition: usart.cpp:136
          -
          void flushOutputBuffer(void)
          Definition: usart.cpp:68
          - - - - - diff --git a/docs/html/usart_8h_source.html b/docs/html/usart_8h_source.html deleted file mode 100644 index ab505fa..0000000 --- a/docs/html/usart_8h_source.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - -B15F: drv/usart.h Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          usart.h
          -
          -
          -
          1 #ifndef USART_H
          2 #define USART_H
          3 
          4 #include <cstdint>
          5 #include <chrono>
          6 #include <fcntl.h>
          7 #include <unistd.h>
          8 #include <termios.h>
          9 #include <sys/ioctl.h>
          10 #include <string.h>
          11 #include "usartexception.h"
          12 #include "timeoutexception.h"
          13 
          16 class USART
          17 {
          18 public:
          19 
          20  /*************************************************
          21  * Methoden für die Verwaltung der Schnittstelle *
          22  *************************************************/
          23 
          27  explicit USART() = default;
          28 
          32  virtual ~USART(void);
          33 
          39  void openDevice(std::string device);
          40 
          45  void closeDevice(void);
          46 
          51  void clearInputBuffer(void);
          52 
          57  void clearOutputBuffer(void);
          58 
          63  void flushOutputBuffer(void);
          64 
          65  /*************************************************/
          66 
          67 
          68 
          69  /*************************************
          70  * Methoden für die Datenübertragung *
          71  *************************************/
          72 
          80  void transmit(uint8_t *buffer, uint16_t offset, uint8_t len);
          81 
          89  void receive(uint8_t *buffer, uint16_t offset, uint8_t len);
          90 
          96  void drop(uint8_t len);
          97 
          98  /*************************************/
          99 
          100 
          101 
          102  /***************************************
          103  * Methoden für einstellbare Parameter *
          104  ***************************************/
          105 
          110  uint32_t getBaudrate(void);
          111 
          116  uint8_t getTimeout(void);
          117 
          122  void setBaudrate(uint32_t baudrate);
          123 
          128  void setTimeout(uint8_t timeout);
          129 
          130  /***************************************/
          131 
          132 private:
          133 
          134  int file_desc = -1;
          135  uint32_t baudrate = 9600;
          136  uint8_t timeout = 10;
          137 };
          138 
          139 #endif // USART_H
          -
          uint32_t getBaudrate(void)
          Definition: usart.cpp:121
          -
          USART()=default
          -
          void closeDevice(void)
          Definition: usart.cpp:43
          -
          void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:75
          -
          void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:84
          -
          void clearInputBuffer(void)
          Definition: usart.cpp:54
          -
          uint8_t getTimeout(void)
          Definition: usart.cpp:126
          -
          Definition: usart.h:16
          -
          void clearOutputBuffer(void)
          Definition: usart.cpp:61
          -
          void setBaudrate(uint32_t baudrate)
          Definition: usart.cpp:131
          -
          virtual ~USART(void)
          Definition: usart.cpp:4
          -
          void openDevice(std::string device)
          Definition: usart.cpp:9
          -
          void drop(uint8_t len)
          Definition: usart.cpp:114
          -
          void setTimeout(uint8_t timeout)
          Definition: usart.cpp:136
          -
          void flushOutputBuffer(void)
          Definition: usart.cpp:68
          - - - - diff --git a/docs/html/usartexception_8h_source.html b/docs/html/usartexception_8h_source.html deleted file mode 100644 index 07c7b7e..0000000 --- a/docs/html/usartexception_8h_source.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - -B15F: drv/usartexception.h Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          usartexception.h
          -
          -
          -
          1 #ifndef USARTEXCEPTION_H
          2 #define USARTEXCEPTION_H
          3 
          4 #include <exception>
          5 #include <string>
          6 
          9 class USARTException: public std::exception
          10 {
          11 public:
          16  explicit USARTException(const char* message) : msg(message)
          17  {
          18  }
          19 
          24  explicit USARTException(const std::string& message) : msg(message)
          25  {
          26  }
          27 
          31  virtual ~USARTException() = default;
          32 
          37  virtual const char* what() const throw ()
          38  {
          39  return msg.c_str();
          40  }
          41 
          42 protected:
          43  std::string msg;
          44 };
          45 
          46 #endif // USARTEXCEPTION_H
          -
          USARTException(const char *message)
          - -
          virtual const char * what() const
          -
          std::string msg
          failure description
          -
          USARTException(const std::string &message)
          -
          virtual ~USARTException()=default
          - - - - diff --git a/docs/html/view_8cpp_source.html b/docs/html/view_8cpp_source.html deleted file mode 100644 index fd4c097..0000000 --- a/docs/html/view_8cpp_source.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -B15F: ui/view.cpp Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          view.cpp
          -
          -
          -
          1 #include "view.h"
          2 
          3 WINDOW* View::win = nullptr;
          4 
          5 View::View()
          6 {
          7  if(!win)
          8  {
          9  B15F::abort("View::win not initialized, missing context");
          10  }
          11  getmaxyx(win, height, width); // init width and height
          12  keypad(win, TRUE);
          13 }
          14 
          15 View::~View()
          16 {
          17 }
          18 
          19 void View::setWinContext(WINDOW* win)
          20 {
          21  View::win = win;
          22 }
          23 
          24 WINDOW* View::getWinContext()
          25 {
          26  return win;
          27 }
          28 
          29 // from: https://stackoverflow.com/a/37454181
          30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
          31 {
          32  std::vector<std::string> tokens;
          33  size_t prev = 0, pos = 0;
          34  do
          35  {
          36  pos = str.find(delim, prev);
          37  if (pos == std::string::npos) pos = str.length();
          38  std::string token = str.substr(prev, pos-prev);
          39  if (!token.empty()) tokens.push_back(token);
          40  prev = pos + delim.length();
          41  }
          42  while (pos < str.length() && prev < str.length());
          43  return tokens;
          44 }
          45 
          46 
          47 void View::setTitle(std::string title)
          48 {
          49  this->title = title;
          50 }
          51 
          52 void View::repaint()
          53 {
          54  // get screen size
          55  struct winsize size;
          56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
          57  throw std::runtime_error("TIOCGWINSZ error");
          58 
          59 
          60  start_x = floor((size.ws_col - width) / 2.);
          61  start_y = floor((size.ws_row - height) / 2.);
          62 
          63  curs_set(0); // hide cursor
          64  mvwin(win, start_y, start_x);
          65  clear();
          66  wclear(win);
          67 
          68  // generic draw
          69  box(win, 0, 0);
          70  int offset_x = (width - title.length()) / 2;
          71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
          72 
          73  // specific draw
          74  draw();
          75 
          76  refresh();
          77  wrefresh(win);
          78 }
          -
          static void abort(std::string msg)
          Definition: b15f.cpp:467
          - - - - diff --git a/docs/html/view_8h_source.html b/docs/html/view_8h_source.html deleted file mode 100644 index 55faaae..0000000 --- a/docs/html/view_8h_source.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -B15F: ui/view.h Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          view.h
          -
          -
          -
          1 #ifndef VIEW_H
          2 #define VIEW_H
          3 
          4 #include <iostream>
          5 #include <cmath>
          6 #include <vector>
          7 #include <functional>
          8 #include <ncurses.h> // sudo apt-get install libncurses5-dev
          9 #include <sys/ioctl.h>
          10 #include <unistd.h>
          11 #include <signal.h>
          12 #include "../drv/b15f.h"
          13 
          14 extern std::string ERR_MSG;
          15 typedef std::function<void(int)> call_t;
          16 
          19 class View
          20 {
          21 public:
          22  View(void);
          23  virtual ~View(void);
          24 
          25  static void setWinContext(WINDOW* win);
          26  static WINDOW* getWinContext(void);
          27  static std::vector<std::string> str_split(const std::string& str, const std::string delim);
          28 
          29  virtual void setTitle(std::string title);
          30 
          31  virtual void repaint(void);
          32 
          33  virtual void draw(void) = 0;
          34  virtual call_t keypress(int& key) = 0;
          35 
          36 
          37 protected:
          38  int width, height;
          39  int start_x = 0, start_y = 0;
          40  std::string title;
          41  std::vector<call_t> calls;
          42 
          43  static WINDOW* win;
          44  constexpr static int KEY_ENT = 10;
          45 };
          46 
          47 #endif // VIEW_H
          -
          Definition: view.h:19
          - - - - diff --git a/docs/html/view__info_8cpp_source.html b/docs/html/view__info_8cpp_source.html deleted file mode 100644 index 48bea84..0000000 --- a/docs/html/view__info_8cpp_source.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -B15F: ui/view_info.cpp Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          view_info.cpp
          -
          -
          -
          1 #include "view_info.h"
          2 
          3 ViewInfo::ViewInfo()
          4 {
          5  calls.push_back(nullptr);
          6 }
          7 
          8 void ViewInfo::setText(std::string text)
          9 {
          10  this->text = text;
          11 }
          12 
          13 void ViewInfo::setLabelClose(std::string label)
          14 {
          15  this->label_close = label;
          16 }
          17 
          18 void ViewInfo::setCall(call_t call)
          19 {
          20  calls[0] = call;
          21 }
          22 
          23 void ViewInfo::draw()
          24 {
          25  int li = 0;
          26  for(std::string line : str_split(text, "\n"))
          27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
          28 
          29  close_offset_x = (width - label_close.length()) / 2;
          30  close_offset_y = height - 2;
          31 
          32  wattron(win, A_REVERSE);
          33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
          34  wattroff(win, A_REVERSE);
          35 }
          36 
          37 call_t ViewInfo::keypress(int& key)
          38 {
          39  switch(key)
          40  {
          41 
          42  case KEY_MOUSE:
          43  {
          44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          45  MEVENT event;
          46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          47  {
          48  size_t column = start_x + close_offset_x;
          49  size_t row = start_y + close_offset_y;
          50  size_t mouse_x = event.x, mouse_y = event.y;
          51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
          52  key = -1; // do return from view
          53  }
          54  break;
          55  }
          56  case KEY_ENT:
          57  key = -1; // do return from view
          58  break;
          59  default:
          60  break;
          61  }
          62  return calls[0];
          63 }
          - - - - diff --git a/docs/html/view__info_8h_source.html b/docs/html/view__info_8h_source.html deleted file mode 100644 index 4d82ee3..0000000 --- a/docs/html/view__info_8h_source.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -B15F: ui/view_info.h Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          view_info.h
          -
          -
          -
          1 #ifndef VIEW_INFO
          2 #define VIEW_INFO
          3 
          4 #include "view.h"
          5 
          8 class ViewInfo : public View
          9 {
          10 public:
          11  ViewInfo(void);
          12  virtual void setText(std::string text);
          13  virtual void setLabelClose(std::string label);;
          14  virtual void setCall(call_t call);
          15  virtual void draw(void) override;
          16  virtual call_t keypress(int& key) override;
          17 
          18 protected:
          19  std::string text;
          20  std::string label_close;
          21  int close_offset_x = 0;
          22  int close_offset_y = 0;
          23  constexpr static int text_offset_x = 2;
          24  constexpr static int text_offset_y = 3;
          25 };
          26 
          27 #endif // VIEW_INFO
          - -
          Definition: view.h:19
          - - - - diff --git a/docs/html/view__monitor_8cpp_source.html b/docs/html/view__monitor_8cpp_source.html deleted file mode 100644 index 332b8eb..0000000 --- a/docs/html/view__monitor_8cpp_source.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - -B15F: ui/view_monitor.cpp Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          view_monitor.cpp
          -
          -
          -
          1 #include "view_monitor.h"
          2 
          3 ViewMonitor::ViewMonitor() : t_worker(&ViewMonitor::worker, this)
          4 {
          5 }
          6 
          7 call_t ViewMonitor::keypress(int& key)
          8 {
          9  switch(key)
          10  {
          11 
          12  case KEY_MOUSE:
          13  {
          14  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          15  MEVENT event;
          16  bool hit = false;
          17  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          18  {
          19  size_t column = start_x + close_offset_x;
          20  size_t row = start_y + close_offset_y;
          21  size_t mouse_x = event.x, mouse_y = event.y;
          22  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
          23  hit = true;
          24  }
          25  if(!hit)
          26  break;
          27 
          28  // fall through to next case
          29  [[fallthrough]];
          30  }
          31  case KEY_ENT:
          32  run_worker = false;
          33  key = -1; // do return from view
          34  wclear(win);
          35  wrefresh(win);
          36  t_worker.join();
          37  break;
          38  default:
          39  break;
          40  }
          41  return calls[0];
          42 }
          43 
          44 std::string ViewMonitor::fancyDigitalString(uint8_t& b)
          45 {
          46  std::stringstream str;
          47  str << std::bitset<8>(b).to_string();
          48  str << " ";
          49  str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec;
          50  return str.str();
          51 }
          52 
          53 std::string ViewMonitor::fancyAnalogString(uint16_t& v)
          54 {
          55  std::stringstream str;
          56  double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0;
          57 
          58  str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V ";
          59 
          60  str << "[";
          61  uint8_t p = round(v * 40.0 / 1023.0);
          62  for(uint8_t i = 0; i < p; i++)
          63  str << "X";
          64  for(uint8_t i = 0; i < 40 - p; i++)
          65  str << " ";
          66  str << "]" << std::endl;
          67 
          68  return str.str();
          69 }
          70 
          71 void ViewMonitor::worker()
          72 {
          73  B15F& drv = B15F::getInstance();
          74  while(run_worker)
          75  {
          76  try
          77  {
          78  std::this_thread::sleep_for(std::chrono::milliseconds(100));
          79 
          80  uint8_t be0 = drv.digitalRead0();
          81  uint8_t be1 = drv.digitalRead1();
          82  uint8_t dsw = drv.readDipSwitch();
          83  uint16_t adc[8];
          84  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
          85  adc[i] = drv.analogRead(i);
          86 
          87 
          88  std::stringstream str;
          89 
          90  // hline
          91  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
          92  if(i % 2 == 0)
          93  str << "-";
          94  else
          95  str << " ";
          96  str << std::endl;
          97 
          98  str << "Digitale Enigaenge:" << std::endl;
          99  str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl;
          100  str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl;
          101  str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl;
          102 
          103  // hline
          104  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
          105  if(i % 2 == 0)
          106  str << "-";
          107  else
          108  str << " ";
          109  str << std::endl;
          110 
          111  str << "Analoge Eingaenge:" << std::endl;
          112  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
          113  {
          114  str << "Kanal " << std::to_string((int) i) << ": ";
          115  str << fancyAnalogString(adc[i]) << std::endl;
          116  }
          117 
          118  text = str.str();
          119  repaint();
          120  }
          121  catch(DriverException& ex)
          122  {
          123  std::cout << "DriverException: " << ex.what() << std::endl;
          124  drv.delay_ms(1000);
          125  }
          126  catch(...)
          127  {
          128  try
          129  {
          130  drv.reconnect();
          131  }
          132  catch(...)
          133  {
          134  B15F::abort("yoho meine dudes");
          135  return;
          136  }
          137  }
          138  }
          139 }
          - -
          uint8_t digitalRead0(void)
          Definition: b15f.cpp:207
          -
          uint8_t readDipSwitch(void)
          Definition: b15f.cpp:235
          -
          void delay_ms(uint16_t ms)
          Definition: b15f.cpp:432
          -
          static B15F & getInstance(void)
          Definition: b15f.cpp:442
          -
          Definition: b15f.h:26
          -
          static void abort(std::string msg)
          Definition: b15f.cpp:467
          -
          uint16_t analogRead(uint8_t channel)
          Definition: b15f.cpp:279
          -
          uint8_t digitalRead1(void)
          Definition: b15f.cpp:221
          -
          void reconnect(void)
          Definition: b15f.cpp:57
          - - - - - diff --git a/docs/html/view__monitor_8h_source.html b/docs/html/view__monitor_8h_source.html deleted file mode 100644 index c879d5e..0000000 --- a/docs/html/view__monitor_8h_source.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -B15F: ui/view_monitor.h Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          view_monitor.h
          -
          -
          -
          1 #ifndef VIEW_MONITOR_H
          2 #define VIEW_MONITOR_H
          3 
          4 #include <thread>
          5 #include <chrono>
          6 #include <sstream>
          7 #include <bitset>
          8 #include "view_info.h"
          9 #include "../drv/b15f.h"
          10 
          13 class ViewMonitor : public ViewInfo
          14 {
          15 
          16 public:
          17  ViewMonitor(void);
          18  virtual call_t keypress(int& key) override;
          19 
          20 private:
          21  std::string fancyDigitalString(uint8_t& b);
          22  std::string fancyAnalogString(uint16_t& v);
          23 
          24 protected:
          25  virtual void worker(void);
          26  volatile bool run_worker = true;
          27  std::thread t_worker;
          28 
          29 };
          30 
          31 #endif // VIEW_MONITOR_H
          - - - - - - diff --git a/docs/html/view__promt_8cpp_source.html b/docs/html/view__promt_8cpp_source.html deleted file mode 100644 index 0ecf34f..0000000 --- a/docs/html/view__promt_8cpp_source.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -B15F: ui/view_promt.cpp Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          view_promt.cpp
          -
          -
          -
          1 #include "view_promt.h"
          2 
          3 void ViewPromt::draw()
          4 {
          5  curs_set(1); // show cursor
          6 
          7  int li = text_offset_y;
          8  int ci = 0;
          9  for(std::string line : str_split(message + input, "\n"))
          10  {
          11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
          12  ci = line.length() + text_offset_x;
          13  }
          14 
          15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
          16  button_offset_y = height - text_offset_y;
          17 
          18  if(selection == 0)
          19  {
          20  wattron(win, A_REVERSE);
          21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
          22  wattroff(win, A_REVERSE);
          23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
          24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
          25  }
          26  else
          27  {
          28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
          29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
          30  wattron(win, A_REVERSE);
          31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
          32  wattroff(win, A_REVERSE);
          33  }
          34  wmove(win, li, ci);
          35 }
          36 
          37 void ViewPromt::setMessage(std::string message)
          38 {
          39  this->message = message;
          40 }
          41 
          42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
          43 {
          44  label_confirm = name;
          45  call_confirm = call;
          46 }
          47 
          48 void ViewPromt::setCancel(std::string name, bool cancelable)
          49 {
          50  label_cancel = name;
          51  this->cancelable = cancelable;
          52 }
          53 
          54 std::string ViewPromt::getInput()
          55 {
          56  return input;
          57 }
          58 
          59 std::function<void(int)> ViewPromt::keypress(int& key)
          60 {
          61  std::function<void(int)> ret = nullptr;
          62  switch(key)
          63  {
          64  case KEY_BACKSPACE:
          65  if(input.length())
          66  input.pop_back();
          67  break;
          68  case '\t':
          69  case KEY_LEFT:
          70  case KEY_RIGHT:
          71  selection = (selection + 1 ) % 2;
          72  break;
          73  case KEY_MOUSE:
          74  {
          75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          76  MEVENT event;
          77  bool hit = false;
          78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          79  {
          80  size_t column_start = start_x + button_offset_x;
          81  size_t row_start = start_y + button_offset_y;
          82  size_t mouse_x = event.x, mouse_y = event.y;
          83  if(mouse_y == row_start)
          84  {
          85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
          86  {
          87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
          88  hit = true;
          89  selection = 0;
          90  }
          91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
          92  {
          93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
          94  hit = true;
          95  selection = 1;
          96  }
          97  }
          98  }
          99  if(!hit)
          100  break;
          101 
          102  // fall through to next case
          103  [[fallthrough]];
          104  }
          105  case KEY_ENT:
          106  if(selection == 0) // exit
          107  key = -1; // do return from view
          108  else
          109  ret = call_confirm;
          110  break;
          111  default:
          112  break;
          113  }
          114 
          115  if(key >= ' ' && key <= '~')
          116  input += (char) key;
          117 
          118  if(key != KEY_ENT)
          119  repaint();
          120  return ret;
          121 }
          - - - - diff --git a/docs/html/view__promt_8h_source.html b/docs/html/view__promt_8h_source.html deleted file mode 100644 index b7dc921..0000000 --- a/docs/html/view__promt_8h_source.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -B15F: ui/view_promt.h Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          view_promt.h
          -
          -
          -
          1 #ifndef VIEW_PROMT_H
          2 #define VIEW_PROMT_H
          3 
          4 #include <vector>
          5 #include <string>
          6 #include "view.h"
          7 
          10 class ViewPromt : public View
          11 {
          12 public:
          13  virtual void draw(void) override;
          14  virtual void setMessage(std::string message);
          15  virtual void setConfirm(std::string name, call_t call);
          16  virtual void setCancel(std::string name, bool cancelable);
          17  virtual std::string getInput(void);
          18  virtual call_t keypress(int& key) override;
          19 
          20 protected:
          21  size_t selection = 1;
          22  std::string input;
          23  std::string message = "Input";
          24  std::string label_confirm = "[ OK ]";
          25  std::string sep = " ";
          26  std::string label_cancel = "[ Cancel ]";
          27  call_t call_confirm = nullptr;
          28  bool cancelable = true;
          29  int button_offset_x = 0, button_offset_y = 0;
          30  constexpr static int text_offset_x = 2;
          31  constexpr static int text_offset_y = 2;
          32 };
          33 
          34 #endif // VIEW_PROMT_H
          -
          Definition: view.h:19
          - - - - - diff --git a/docs/html/view__selection_8cpp_source.html b/docs/html/view__selection_8cpp_source.html deleted file mode 100644 index 4e14b24..0000000 --- a/docs/html/view__selection_8cpp_source.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -B15F: ui/view_selection.cpp Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          view_selection.cpp
          -
          -
          -
          1 #include "view_selection.h"
          2 
          3 void ViewSelection::draw()
          4 {
          5  //curs_set(0); // hide cursor
          6  for(size_t i = 0; i < choices.size(); i++)
          7  {
          8  if(selection == i)
          9  wattron(win, A_REVERSE);
          10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
          11  if(selection == i)
          12  wattroff(win, A_REVERSE);
          13  }
          14 }
          15 
          16 void ViewSelection::addChoice(std::string name, call_t call)
          17 {
          18  choices.push_back(name);
          19  calls.push_back(call);
          20 }
          21 
          22 call_t ViewSelection::keypress(int& key)
          23 {
          24  call_t ret = nullptr;
          25  switch(key)
          26  {
          27  case KEY_UP:
          28  do
          29  selection = (selection - 1 + choices.size()) % choices.size();
          30  while(!choices[selection].length() && choices.size());
          31  break;
          32 
          33  case '\t':
          34  case KEY_DOWN:
          35  do
          36  selection = (selection + 1) % choices.size();
          37  while(!choices[selection].length() && choices.size());
          38  break;
          39 
          40  case KEY_MOUSE:
          41  {
          42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          43  MEVENT event;
          44  bool hit = false;
          45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          46  {
          47  size_t column_start = start_x + choice_offset_x;
          48  size_t row_start = start_y + choice_offset_y;
          49  size_t mouse_x = event.x, mouse_y = event.y;
          50  for(size_t i = 0; i < choices.size(); i++)
          51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
          52  {
          53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
          54  hit = true;
          55  selection = i;
          56  }
          57  }
          58  if(!hit)
          59  break;
          60 
          61  // fall through to next case
          62  [[fallthrough]];
          63  }
          64 
          65  case KEY_ENT:
          66  if(selection == choices.size() - 1) // exit
          67  key = -1; // do return from view
          68  else
          69  ret = calls[selection];
          70  break;
          71  default:
          72  break;
          73  }
          74  repaint();
          75  return ret;
          76 }
          - - - - diff --git a/docs/html/view__selection_8h_source.html b/docs/html/view__selection_8h_source.html deleted file mode 100644 index d82f6d0..0000000 --- a/docs/html/view__selection_8h_source.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -B15F: ui/view_selection.h Source File - - - - - - - - - -
          -
          - - - - - - -
          -
          B15F -
          -
          Board 15 Famulus Edition
          -
          -
          - - - - - - - - -
          -
          - - -
          - -
          - - -
          -
          -
          -
          view_selection.h
          -
          -
          -
          1 #ifndef VIEW_SELECTION_H
          2 #define VIEW_SELECTION_H
          3 
          4 #include <vector>
          5 #include <string>
          6 #include "view.h"
          7 
          10 class ViewSelection : public View
          11 {
          12 public:
          13  virtual void draw(void) override;
          14  virtual void addChoice(std::string name, call_t call);
          15  virtual call_t keypress(int& key) override;
          16 
          17 
          18 protected:
          19  size_t selection = 0;
          20  std::vector<std::string> choices;
          21 
          22  constexpr static int choice_offset_x = 2;
          23  constexpr static int choice_offset_y = 3;
          24 };
          25 
          26 #endif // VIEW_SELECTION_H
          -
          Definition: view.h:19
          - - - - - From 72c34b6ba439f32023a1cb8d35ced98832bedd4c Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 7 Jun 2019 10:34:08 +0200 Subject: [PATCH 29/35] =?UTF-8?q?register=20zugriff=20versch=C3=B6nert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- control/examples/register/main.cpp | 29 ++++++++++++++--------------- control/src/drv/b15f.cpp | 8 ++++---- control/src/drv/b15f.h | 9 +++++++-- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/control/examples/register/main.cpp b/control/examples/register/main.cpp index 27a15ba..ec23afc 100644 --- a/control/examples/register/main.cpp +++ b/control/examples/register/main.cpp @@ -5,31 +5,30 @@ const char PLOT_FILE[] = "plot.bin"; -constexpr uint8_t SFR_OFFSET = 0x20; -constexpr uint8_t SFR_DDRB = 0x04; -constexpr uint8_t SFR_WDTCSR = 0x60; -constexpr uint8_t SFR_PORTB = 0x05; - /* * Dieses Beispiel erzeugt einen 300ms langen Impuls an PB0. * */ int main() { - uint8_t DDRB, PORTB; + uint8_t tmp; B15F& drv = B15F::getInstance(); - DDRB = drv.getRegister(SFR_DDRB + SFR_OFFSET); - DDRB |= (1<<0); - drv.setRegister(SFR_DDRB + SFR_OFFSET, DDRB); - PORTB = drv.getRegister(SFR_PORTB + SFR_OFFSET); - PORTB |= (1<<0); - drv.setRegister(SFR_PORTB + SFR_OFFSET, PORTB); + tmp = drv.getRegister(&DDRB); + tmp |= (1<<0); + drv.setRegister(&DDRB, tmp); + + + tmp = drv.getRegister(&PORTB); + tmp |= (1<<0); + drv.setRegister(&PORTB, tmp); + drv.delay_ms(300); - PORTB = drv.getRegister(SFR_PORTB + SFR_OFFSET); - PORTB &= ~(1<<0); - drv.setRegister(SFR_PORTB + SFR_OFFSET, PORTB); + + tmp = drv.getRegister(&PORTB); + tmp &= ~(1<<0); + drv.setRegister(&PORTB, tmp); } diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index cf44ccc..b07cbbc 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -393,14 +393,14 @@ bool B15F::pwmSetValue(uint8_t value) return aw == MSG_OK; } -bool B15F::setRegister(uint8_t adr, uint8_t val) +bool B15F::setRegister(volatile uint8_t* adr, uint8_t val) { usart.clearInputBuffer(); uint8_t rq[] = { RQ_SET_REG, - adr, + static_cast(reinterpret_cast(adr)), val }; @@ -411,14 +411,14 @@ bool B15F::setRegister(uint8_t adr, uint8_t val) return aw == val; } -uint8_t B15F::getRegister(uint8_t adr) +uint8_t B15F::getRegister(volatile uint8_t* adr) { usart.clearInputBuffer(); uint8_t rq[] = { RQ_GET_REG, - adr + static_cast(reinterpret_cast(adr)) }; usart.transmit(&rq[0], 0, sizeof(rq)); diff --git a/control/src/drv/b15f.h b/control/src/drv/b15f.h index bedca64..3580058 100644 --- a/control/src/drv/b15f.h +++ b/control/src/drv/b15f.h @@ -18,6 +18,11 @@ #include "driverexception.h" #include "timeoutexception.h" +// wichtig für die Register-Zugriffe +#define _AVR_IO_H_ 1 // Erzwinge die Inklusion +#include "/usr/lib/avr/include/avr/sfr_defs.h" +#include "/usr/lib/avr/include/avr/iom1284p.h" + typedef std::function errorhandler_t; @@ -217,14 +222,14 @@ public: * \param val Neuer Wert für das Register * \throws DriverException */ - bool setRegister(uint8_t adr, uint8_t val); + bool setRegister(volatile uint8_t* adr, uint8_t val); /** * Liefert den Wert eines MCU Registers. * \param adr Speicheradresse des Registers * \throws DriverException */ - uint8_t getRegister(uint8_t adr); + uint8_t getRegister(volatile uint8_t* adr); /*************************/ From 198feef12febdc555fc2727960b0d905bbc0772c Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 7 Jun 2019 10:47:34 +0200 Subject: [PATCH 30/35] PWM update --- control/examples/pwm/main.cpp | 10 ++++++---- control/examples/register/main.cpp | 4 ---- control/src/drv/b15f.h | 1 + 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/control/examples/pwm/main.cpp b/control/examples/pwm/main.cpp index dd8af86..349ccab 100644 --- a/control/examples/pwm/main.cpp +++ b/control/examples/pwm/main.cpp @@ -3,12 +3,14 @@ #include #include -const char PLOT_FILE[] = "plot.bin"; - +/* + * Erzeugt ein PWM Signal an PB4 mit 100KHz. + * Beste Frequenz: 31300 + */ int main() { B15F& drv = B15F::getInstance(); - std::cout << "TOP: " << (int) drv.pwmSetFrequency(100000) << std::endl; - drv.pwmSetValue(40); + std::cout << "TOP: " << (int) drv.pwmSetFrequency(31300) << std::endl; + drv.pwmSetValue(127); } diff --git a/control/examples/register/main.cpp b/control/examples/register/main.cpp index ec23afc..b90fe5f 100644 --- a/control/examples/register/main.cpp +++ b/control/examples/register/main.cpp @@ -1,10 +1,6 @@ -#include -#include #include #include -const char PLOT_FILE[] = "plot.bin"; - /* * Dieses Beispiel erzeugt einen 300ms langen Impuls an PB0. * diff --git a/control/src/drv/b15f.h b/control/src/drv/b15f.h index 3580058..b708e3e 100644 --- a/control/src/drv/b15f.h +++ b/control/src/drv/b15f.h @@ -202,6 +202,7 @@ public: /** * Setzt die Register so, dass näherungsweise die gewünschte Frequenz erzeugt wird. * Ist freq == 0 wird PWM deaktiviert. + * Standardfrequenz: 31300 (empfohlen, da dann TOP == 255) * \param freq PWM Frequenz * \return Top Wert des PWM Value für die gesetzte Frequenz * \throws DriverException From 22a5b466db8f5f48d61390a4c1be4979d83120dc Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 7 Jun 2019 11:02:46 +0200 Subject: [PATCH 31/35] leeres plottyfile wirft exception --- control/examples/diode/main.cpp | 1 + control/examples/pegel/main.cpp | 5 + control/src/drv/b15f.h | 2 +- control/src/drv/b15f.h.orig | 280 ++++++++++++++++++++++++++++ control/src/drv/plottyfile.cpp | 3 + control/src/drv/plottyfile.cpp.orig | 201 ++++++++++++++++++++ control/src/drv/plottyfile.h | 1 + 7 files changed, 492 insertions(+), 1 deletion(-) create mode 100644 control/src/drv/b15f.h.orig create mode 100644 control/src/drv/plottyfile.cpp.orig diff --git a/control/examples/diode/main.cpp b/control/examples/diode/main.cpp index 694664d..1e96a1b 100644 --- a/control/examples/diode/main.cpp +++ b/control/examples/diode/main.cpp @@ -103,6 +103,7 @@ void kennlinieZweiterQuadrant() if(ba[k] > bb[k] && bb[k] % 50 == 0 && bb[k] != 0) { uint16_t i_d = ba[k] - bb[k]; + std::cout << "added" << std::endl; pf.addDot(Dot(u_gs, i_d, bb[k] / 50)); } curve++; diff --git a/control/examples/pegel/main.cpp b/control/examples/pegel/main.cpp index b2624fd..e216b02 100644 --- a/control/examples/pegel/main.cpp +++ b/control/examples/pegel/main.cpp @@ -3,6 +3,11 @@ #include #include +/* + * Inkrementiert DAC 0 von 0 bis 1023 und speichert zu jeder Ausgabe den Wert von ADC 0 in einem Puffer. + * Die Funktion ADC 0 abhängig von DAC 0 wird als Graph geplottet. + */ + const char PLOT_FILE[] = "plot.bin"; int main() diff --git a/control/src/drv/b15f.h b/control/src/drv/b15f.h index b708e3e..9eb8e35 100644 --- a/control/src/drv/b15f.h +++ b/control/src/drv/b15f.h @@ -202,7 +202,7 @@ public: /** * Setzt die Register so, dass näherungsweise die gewünschte Frequenz erzeugt wird. * Ist freq == 0 wird PWM deaktiviert. - * Standardfrequenz: 31300 (empfohlen, da dann TOP == 255) + * Standardfrequenz: 31300 (empfohlen, da dann TOP == 255) * \param freq PWM Frequenz * \return Top Wert des PWM Value für die gesetzte Frequenz * \throws DriverException diff --git a/control/src/drv/b15f.h.orig b/control/src/drv/b15f.h.orig new file mode 100644 index 0000000..b708e3e --- /dev/null +++ b/control/src/drv/b15f.h.orig @@ -0,0 +1,280 @@ +#ifndef B15F_H +#define B15F_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include "usart.h" +#include "driverexception.h" +#include "timeoutexception.h" + +// wichtig für die Register-Zugriffe +#define _AVR_IO_H_ 1 // Erzwinge die Inklusion +#include "/usr/lib/avr/include/avr/sfr_defs.h" +#include "/usr/lib/avr/include/avr/iom1284p.h" + +typedef std::function errorhandler_t; + + +/*! main driver class */ + +class B15F +{ +private: + // privater Konstruktor + B15F(void); +public: + + /************************************* + * Grundfunktionen des B15F Treibers * + *************************************/ + + /** + * Versucht die Verbindung zum B15 wiederherzustellen + * \throws DriverException + */ + void reconnect(void); + + /** + * Verwirft Daten im USART Puffer auf dieser Maschine und B15 + * \throws DriverException + */ + void discard(void); + + /** + * Testet die USART Verbindung auf Funktion + * \throws DriverException + */ + bool testConnection(void); + + /** + * Testet die Integer Konvertierung der USART Verbindung + * \throws DriverException + */ + bool testIntConv(void); + + /** + * Liefert Informationen zur aktuellen Firmware des B15 + * \throws DriverException + */ + std::vector getBoardInfo(void); + + /** + * Lässt den Treiber für eine angegebene Zeit pausieren + * \param ms Verzögerung in Millisekunden + */ + void delay_ms(uint16_t ms); + + /** + * Lässt den Treiber für eine angegebene Zeit pausieren + * \param us Verzögerung in Microsekunden + */ + void delay_us(uint16_t us); + + /** + * Liefert eine Referenz zur aktuellen Treiber-Instanz + * @throws DriverException + */ + static B15F& getInstance(void); + + /** + * Führt ein Befehl auf dieser Maschine aus und liefert stdout zurück + * \param cmd Der Befehl + */ + static std::string exec(std::string cmd); + + /** + * Multithread sicherer Abbruch des B15F-Treibers + * \param msg Beschreibung der Abbruchursache + */ + static void abort(std::string msg); + + /** + * Multithread sicherer Abbruch des B15F-Treibers + * \param ex Exception als Abbruchursache + */ + static void abort(std::exception& ex); + + /** + * Setzt eine Fehlerbehandlungsroutine für den Treiberabbruch (abort) + * \param func Funktion, die Exception als Parameter bekommt + */ + static void setAbortHandler(errorhandler_t func); + + /*************************************/ + + + + /************************* + * Steuerbefehle für B15 * + *************************/ + + /** + * Versetzt das Board in den Selbsttest-Modus + * WICHTIG: Es darf dabei nichts an den Klemmen angeschlossen sein! + * \throws DriverException + */ + bool activateSelfTestMode(void); + + /** + * Setzt den Wert des digitalen Ausgabeports 0 + * \param port Wert für gesamten Port + * \throws DriverException + */ + bool digitalWrite0(uint8_t); + + /** + * Setzt den Wert des digitalen Ausgabeports 1 + * \param port Wert für gesamten Port + * \throws DriverException + */ + bool digitalWrite1(uint8_t); + + /** + * Liest den Wert des digitalen Eingabeports 0 + * \return Wert für gesamten Port + * \throws DriverException + */ + uint8_t digitalRead0(void); + + /** + * Liest den Wert des digitalen Eingabeports 1 + * \return Wert für gesamten Port + * \throws DriverException + */ + uint8_t digitalRead1(void); + + /** + * Liest den Wert des digitalen Eingabeports, an dem der DIP-switch angeschlossen ist (S7) + * \return Wert für gesamten Port + * \throws DriverException + */ + uint8_t readDipSwitch(void); + + /** + * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 0 + * \param port 10-Bit Wert + * \throws DriverException + */ + bool analogWrite0(uint16_t port); + + /** + * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 1 + * \param port 10-Bit Wert + * \throws DriverException + */ + bool analogWrite1(uint16_t port); + + /** + * Liest den Wert des Analog-Digital-Converters (ADC / ADU) + * \param channel Kanalwahl von 0 - 7 + * \throws DriverException + */ + uint16_t analogRead(uint8_t channel); + + /** + * DAC 0 wird auf den Startwert gesetzt und dann schrittweise um Delta inkrementiert. + * Für jeden eingestelleten DAC-Wert werden zwei ADCs (channel_a und channel_b) angesprochen und die Werte übermittelt. + * Die Werte werden in buffer_a für Kanal a und buffer_b für Kanal b gespeichert. + * \param channel_a Auswahl des ADC a, von 0 - 7 + * \param buffer_a Speichertort für Werte des Kanals a + * \param offset_a Anzahl an Werten des Kanals a, die im Speicher übersprungen werden sollen + * \param channel_b Auswahl des ADC b, von 0 - 7 + * \param buffer_b Speichertort für Werte des Kanals b + * \param offset_b Anzahl an Werten des Kanals b, die im Speicher übersprungen werden + * \param start Startwert des DACs + * \param delta Schrittweite, mit welcher der DAC inkrementiert wird + * \param count Anzahl an Inkrementierungen + * \throws DriverException + */ + void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count); + + /** + * Setzt die Register so, dass näherungsweise die gewünschte Frequenz erzeugt wird. + * Ist freq == 0 wird PWM deaktiviert. + * Standardfrequenz: 31300 (empfohlen, da dann TOP == 255) + * \param freq PWM Frequenz + * \return Top Wert des PWM Value für die gesetzte Frequenz + * \throws DriverException + */ + uint8_t pwmSetFrequency(uint32_t freq); + + /** + * Setzt den PWM Wert. + * \param value PWM Wert [0..0xFF] + * \throws DriverException + */ + bool pwmSetValue(uint8_t value); + + /** + * Setzt direkt den Wert eines MCU Registers. + * *Wichtig:* bei einer falschen Adresse kann das Board 15 ernsthaften Schaden nehmen! + * \param adr Speicheradresse des Registers + * \param val Neuer Wert für das Register + * \throws DriverException + */ + bool setRegister(volatile uint8_t* adr, uint8_t val); + + /** + * Liefert den Wert eines MCU Registers. + * \param adr Speicheradresse des Registers + * \throws DriverException + */ + uint8_t getRegister(volatile uint8_t* adr); + + /*************************/ + + + // CONSTANTS + const std::string PRE = "[B15F] "; //!< B15F stdout prefix + constexpr static uint8_t MSG_OK = 0xFF; //!< Value to acknowledge a received command + constexpr static uint8_t MSG_FAIL = 0xFE; //!< Value to reject a received command + constexpr static uint16_t RECONNECT_TIMEOUT = 64; //!< Time in ms after which a reconnect attempt aborts + constexpr static uint16_t WDT_TIMEOUT = 15; //!< Time in ms after which the watch dog timer resets the MCU + constexpr static uint8_t RECONNECT_TRIES = 3; //!< Maximum count of reconnect attempts after which the driver stops + constexpr static uint32_t BAUDRATE = 57600; //!< USART baudrate for communication with the MCU + +private: + + /** + * Initialisiert und testet die Verbindung zum B15 + * \throws DriverException + */ + void init(void); + + USART usart; + static B15F* instance; + static errorhandler_t errorhandler; + + // REQUESTS + constexpr static uint8_t RQ_DISC = 0; + constexpr static uint8_t RQ_TEST = 1; + constexpr static uint8_t RQ_INFO = 2; + constexpr static uint8_t RQ_INT = 3; + constexpr static uint8_t RQ_ST = 4; + constexpr static uint8_t RQ_BA0 = 5; + constexpr static uint8_t RQ_BA1 = 6; + constexpr static uint8_t RQ_BE0 = 7; + constexpr static uint8_t RQ_BE1 = 8; + constexpr static uint8_t RQ_DSW = 9; + constexpr static uint8_t RQ_AA0 = 10; + constexpr static uint8_t RQ_AA1 = 11; + constexpr static uint8_t RQ_ADC = 12; + constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; + constexpr static uint8_t RQ_PWM_SET_FREQ = 14; + constexpr static uint8_t RQ_PWM_SET_VALUE = 15; + constexpr static uint8_t RQ_SET_REG = 16; + constexpr static uint8_t RQ_GET_REG = 17; +}; + +#endif // B15F_H diff --git a/control/src/drv/plottyfile.cpp b/control/src/drv/plottyfile.cpp index c236531..f426fb4 100644 --- a/control/src/drv/plottyfile.cpp +++ b/control/src/drv/plottyfile.cpp @@ -146,6 +146,9 @@ void PlottyFile::prepStr(std::string& str, uint8_t len) void PlottyFile::writeToFile(std::string filename) { + if(dots.empty()) + throw std::length_error("Es wurden keine Punkte gespeichert."); + prepStr(unit_x, STR_LEN_SHORT); prepStr(desc_x, STR_LEN_LARGE); prepStr(unit_y, STR_LEN_SHORT); diff --git a/control/src/drv/plottyfile.cpp.orig b/control/src/drv/plottyfile.cpp.orig new file mode 100644 index 0000000..355abb8 --- /dev/null +++ b/control/src/drv/plottyfile.cpp.orig @@ -0,0 +1,201 @@ +#include "plottyfile.h" + +void PlottyFile::addDot(Dot& dot) +{ + dots.push_back(dot); +} + +void PlottyFile::addDot(Dot dot) +{ + dots.push_back(dot); +} + +void PlottyFile::setFunctionType(FunctionType function_type) +{ + this->function_type = function_type; +} + +void PlottyFile::setQuadrant(uint8_t quadrant) +{ + if(quadrant < 1 || quadrant > 4) + throw std::range_error("Ungueltiger Quadrant"); + this->quadrant = quadrant; +} + +void PlottyFile::setRefX(uint16_t ref_x) +{ + this->ref_x = ref_x; +} + +void PlottyFile::setRefY(uint16_t ref_y) +{ + this->ref_y = ref_y; +} + +void PlottyFile::setParaFirstCurve(uint16_t para_first) +{ + this->para_first = para_first; +} + +void PlottyFile::setParaStepWidth(uint16_t para_stepwidth) +{ + this->para_stepwidth = para_stepwidth; +} + +void PlottyFile::setUnitX(std::string unit_x) +{ + this->unit_x = unit_x; +} + +void PlottyFile::setDescX(std::string desc_x) +{ + this->desc_x = desc_x; +} + +void PlottyFile::setUnitY(std::string unit_y) +{ + this->unit_y = unit_y; +} + +void PlottyFile::setDescY(std::string desc_y) +{ + this->desc_y = desc_y; +} + +void PlottyFile::setUnitPara(std::string unit_para) +{ + this->unit_para = unit_para; +} + +void PlottyFile::setDescPara(std::string desc_para) +{ + this->desc_para = desc_para; +} + +FunctionType PlottyFile::getFunctionType() const +{ + return function_type; +} + +uint8_t PlottyFile::getQuadrant() const +{ + return quadrant; +} + +uint16_t PlottyFile::getRefX() const +{ + return ref_x; +} + +uint16_t PlottyFile::getRefY() const +{ + return ref_y; +} + +uint16_t PlottyFile::getParaFirstCurve() const +{ + return para_first; +} + +uint16_t PlottyFile::getParaStepWidth() const +{ + return para_stepwidth; +} + +std::string PlottyFile::getUnitX() const +{ + return unit_x; +} + +std::string PlottyFile::getDescX() const +{ + return desc_x; +} + +std::string PlottyFile::getUnitY() const +{ + return unit_y; +} + +std::string PlottyFile::getDescY() const +{ + return desc_y; +} + +std::string PlottyFile::getUnitPara() const +{ + return unit_para; +} + +std::string PlottyFile::getDescPara() const +{ + return desc_para; +} + +void PlottyFile::prepStr(std::string& str, uint8_t len) +{ + if(str.length() > len) + throw std::runtime_error("Zu grosser String."); + + if(str.length() != len) + str += '\n'; + + while(str.length() < len) + str += '\0'; +} + +void PlottyFile::writeToFile(std::string filename) +{ + if(dots.empty()) + throw std::length_error("Es wurden keine Punkte gespeichert."); + + prepStr(unit_x, STR_LEN_SHORT); + prepStr(desc_x, STR_LEN_LARGE); + prepStr(unit_y, STR_LEN_SHORT); + prepStr(desc_y, STR_LEN_LARGE); + prepStr(unit_para, STR_LEN_SHORT); + prepStr(desc_para, STR_LEN_LARGE); + + std::ofstream file(filename); + + // write file header + file.write(reinterpret_cast(&command), 1); + file.write(head.c_str(), head.length()); + file.write(filetype.c_str(), filetype.length()); + file.write(reinterpret_cast(&version), 2); + file.write(reinterpret_cast(&subversion), 2); + file.put(static_cast(function_type)); + file.write(reinterpret_cast(&quadrant), 1); + file.write(reinterpret_cast(&ref_x), 2); + file.write(reinterpret_cast(&ref_y), 2); + file.write(reinterpret_cast(¶_first), 2); + file.write(reinterpret_cast(¶_stepwidth), 2); + file.write(unit_x.c_str(), unit_x.length()); + file.write(desc_x.c_str(), desc_x.length()); + file.write(unit_y.c_str(), unit_y.length()); + file.write(desc_y.c_str(), desc_y.length()); + file.write(unit_para.c_str(), unit_para.length()); + file.write(desc_para.c_str(), desc_para.length()); + file.write(reinterpret_cast(&eof), 1); + + // make sure header size is 256 Byte + while(file.tellp() < 256) + file.put(0); + + for(Dot& dot : dots) + { + file.put((dot.getX() >> 8) | (static_cast(dot.getCurve()) << 2)); + file.put(dot.getX() & 0xFF); + file.put(dot.getY() >> 8); + file.put(dot.getY() & 0xFF); + } + + file.close(); +} + +void PlottyFile::startPlotty(std::string filename) +{ + int code = system(("plotty --in " + filename).c_str()); + if(code) + throw std::runtime_error("Fehler beim Aufruf von plotty"); +} diff --git a/control/src/drv/plottyfile.h b/control/src/drv/plottyfile.h index 6197bf2..16a38d3 100644 --- a/control/src/drv/plottyfile.h +++ b/control/src/drv/plottyfile.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "dot.h" enum FunctionType From 338f4a5a1cbb75201b542b1cdc7030222c137359 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 7 Jun 2019 11:03:25 +0200 Subject: [PATCH 32/35] doc update --- control/bin/b15fcli | Bin 89800 -> 0 bytes control/src/drv/b15f.h.orig | 280 --- control/src/drv/plottyfile.cpp.orig | 201 -- docs/html/CMakeCCompilerId_8c_source.html | 81 + docs/html/CMakeCXXCompilerId_8cpp_source.html | 81 + docs/html/annotated.html | 93 + docs/html/b15f_8cpp_source.html | 120 ++ docs/html/b15f_8h_source.html | 115 ++ docs/html/backup_8cpp_source.html | 83 + docs/html/bc_s.png | Bin 0 -> 676 bytes docs/html/bdwn.png | Bin 0 -> 147 bytes docs/html/classB15F-members.html | 113 ++ docs/html/classB15F.html | 1038 ++++++++++ docs/html/classDot-members.html | 84 + docs/html/classDot.html | 204 ++ docs/html/classDriverException-members.html | 85 + docs/html/classDriverException.html | 117 ++ docs/html/classDriverException.png | Bin 0 -> 481 bytes docs/html/classPlottyFile-members.html | 108 + docs/html/classPlottyFile.html | 819 ++++++++ docs/html/classTimeoutException-members.html | 85 + docs/html/classTimeoutException.html | 247 +++ docs/html/classTimeoutException.png | Bin 0 -> 480 bytes docs/html/classUSART-members.html | 94 + docs/html/classUSART.html | 531 +++++ docs/html/classUSARTException-members.html | 85 + docs/html/classUSARTException.html | 247 +++ docs/html/classUSARTException.png | Bin 0 -> 484 bytes docs/html/classView-members.html | 97 + docs/html/classView.html | 165 ++ docs/html/classView.png | Bin 0 -> 1094 bytes docs/html/classViewInfo-members.html | 107 + docs/html/classViewInfo.html | 193 ++ docs/html/classViewInfo.png | Bin 0 -> 556 bytes docs/html/classViewMonitor-members.html | 111 ++ docs/html/classViewMonitor.html | 205 ++ docs/html/classViewMonitor.png | Bin 0 -> 552 bytes docs/html/classViewPromt-members.html | 113 ++ docs/html/classViewPromt.html | 213 ++ docs/html/classViewPromt.png | Bin 0 -> 387 bytes docs/html/classViewSelection-members.html | 102 + docs/html/classViewSelection.html | 180 ++ docs/html/classViewSelection.png | Bin 0 -> 435 bytes docs/html/classes.html | 113 ++ docs/html/cli_8cpp_source.html | 80 + docs/html/closed.png | Bin 0 -> 132 bytes .../dir_1788f8309b1a812dcb800a185471cf6c.html | 81 + .../dir_19f2f1b99f19c12fa55b8d312cf373ed.html | 81 + .../dir_3d3c8ff3ebf9841b39117ac899f41936.html | 85 + .../dir_587c94d866dbb2f408f78cf41f9b2f8d.html | 81 + .../dir_90e361ec3542f3dd076ea3ad19547437.html | 81 + .../dir_95e29a8b8ee7c54052c171a88bb95675.html | 85 + .../dir_f89abcb304c928c7d889aa5625570de5.html | 81 + docs/html/doc.png | Bin 0 -> 746 bytes docs/html/dot_8cpp_source.html | 85 + docs/html/dot_8h_source.html | 86 + docs/html/doxygen.css | 1766 +++++++++++++++++ docs/html/doxygen.png | Bin 0 -> 3779 bytes docs/html/driverexception_8h_source.html | 82 + docs/html/dynsections.js | 127 ++ docs/html/feature__tests_8c_source.html | 81 + docs/html/feature__tests_8cxx_source.html | 81 + docs/html/files.html | 117 ++ docs/html/folderclosed.png | Bin 0 -> 616 bytes docs/html/folderopen.png | Bin 0 -> 597 bytes docs/html/functions.html | 388 ++++ docs/html/functions_func.html | 355 ++++ docs/html/functions_vars.html | 100 + docs/html/hierarchy.html | 94 + docs/html/index.html | 154 ++ docs/html/jquery.js | 35 + docs/html/menu.js | 50 + docs/html/menudata.js | 64 + docs/html/nav_f.png | Bin 0 -> 153 bytes docs/html/nav_g.png | Bin 0 -> 95 bytes docs/html/nav_h.png | Bin 0 -> 98 bytes docs/html/open.png | Bin 0 -> 123 bytes docs/html/plottyfile_8cpp_source.html | 109 + docs/html/plottyfile_8h_source.html | 110 + docs/html/search/all_0.html | 30 + docs/html/search/all_0.js | 10 + docs/html/search/all_1.html | 30 + docs/html/search/all_1.js | 6 + docs/html/search/all_10.html | 30 + docs/html/search/all_10.js | 6 + docs/html/search/all_2.html | 30 + docs/html/search/all_2.js | 6 + docs/html/search/all_3.html | 30 + docs/html/search/all_3.js | 13 + docs/html/search/all_4.html | 30 + docs/html/search/all_4.js | 4 + docs/html/search/all_5.html | 30 + docs/html/search/all_5.js | 4 + docs/html/search/all_6.html | 30 + docs/html/search/all_6.js | 23 + docs/html/search/all_7.html | 30 + docs/html/search/all_7.js | 6 + docs/html/search/all_8.html | 30 + docs/html/search/all_8.js | 4 + docs/html/search/all_9.html | 30 + docs/html/search/all_9.js | 7 + docs/html/search/all_a.html | 30 + docs/html/search/all_a.js | 8 + docs/html/search/all_b.html | 30 + docs/html/search/all_b.js | 20 + docs/html/search/all_c.html | 30 + docs/html/search/all_c.js | 7 + docs/html/search/all_d.html | 30 + docs/html/search/all_d.js | 5 + docs/html/search/all_e.html | 30 + docs/html/search/all_e.js | 8 + docs/html/search/all_f.html | 30 + docs/html/search/all_f.js | 6 + docs/html/search/classes_0.html | 30 + docs/html/search/classes_0.js | 4 + docs/html/search/classes_1.html | 30 + docs/html/search/classes_1.js | 5 + docs/html/search/classes_2.html | 30 + docs/html/search/classes_2.js | 4 + docs/html/search/classes_3.html | 30 + docs/html/search/classes_3.js | 4 + docs/html/search/classes_4.html | 30 + docs/html/search/classes_4.js | 5 + docs/html/search/classes_5.html | 30 + docs/html/search/classes_5.js | 8 + docs/html/search/close.png | Bin 0 -> 273 bytes docs/html/search/functions_0.html | 30 + docs/html/search/functions_0.js | 10 + docs/html/search/functions_1.html | 30 + docs/html/search/functions_1.js | 6 + docs/html/search/functions_2.html | 30 + docs/html/search/functions_2.js | 12 + docs/html/search/functions_3.html | 30 + docs/html/search/functions_3.js | 4 + docs/html/search/functions_4.html | 30 + docs/html/search/functions_4.js | 4 + docs/html/search/functions_5.html | 30 + docs/html/search/functions_5.js | 23 + docs/html/search/functions_6.html | 30 + docs/html/search/functions_6.js | 4 + docs/html/search/functions_7.html | 30 + docs/html/search/functions_7.js | 5 + docs/html/search/functions_8.html | 30 + docs/html/search/functions_8.js | 6 + docs/html/search/functions_9.html | 30 + docs/html/search/functions_9.js | 20 + docs/html/search/functions_a.html | 30 + docs/html/search/functions_a.js | 7 + docs/html/search/functions_b.html | 30 + docs/html/search/functions_b.js | 5 + docs/html/search/functions_c.html | 30 + docs/html/search/functions_c.js | 5 + docs/html/search/functions_d.html | 30 + docs/html/search/functions_d.js | 6 + docs/html/search/mag_sel.png | Bin 0 -> 465 bytes docs/html/search/nomatches.html | 12 + docs/html/search/pages_0.html | 30 + docs/html/search/pages_0.js | 4 + docs/html/search/search.css | 271 +++ docs/html/search/search.js | 814 ++++++++ docs/html/search/search_l.png | Bin 0 -> 567 bytes docs/html/search/search_m.png | Bin 0 -> 158 bytes docs/html/search/search_r.png | Bin 0 -> 553 bytes docs/html/search/searchdata.js | 27 + docs/html/search/variables_0.html | 30 + docs/html/search/variables_0.js | 4 + docs/html/search/variables_1.html | 30 + docs/html/search/variables_1.js | 6 + docs/html/search/variables_2.html | 30 + docs/html/search/variables_2.js | 4 + docs/html/search/variables_3.html | 30 + docs/html/search/variables_3.js | 5 + docs/html/search/variables_4.html | 30 + docs/html/search/variables_4.js | 4 + docs/html/splitbar.png | Bin 0 -> 314 bytes docs/html/sync_off.png | Bin 0 -> 853 bytes docs/html/sync_on.png | Bin 0 -> 845 bytes docs/html/tab_a.png | Bin 0 -> 142 bytes docs/html/tab_b.png | Bin 0 -> 169 bytes docs/html/tab_h.png | Bin 0 -> 177 bytes docs/html/tab_s.png | Bin 0 -> 184 bytes docs/html/tabs.css | 1 + docs/html/timeoutexception_8h_source.html | 87 + docs/html/ui_8cpp_source.html | 96 + docs/html/ui_8h_source.html | 81 + docs/html/usart_8cpp_source.html | 96 + docs/html/usart_8h_source.html | 96 + docs/html/usartexception_8h_source.html | 87 + docs/html/view_8cpp_source.html | 82 + docs/html/view_8h_source.html | 82 + docs/html/view__info_8cpp_source.html | 81 + docs/html/view__info_8h_source.html | 83 + docs/html/view__monitor_8cpp_source.html | 92 + docs/html/view__monitor_8h_source.html | 83 + docs/html/view__promt_8cpp_source.html | 81 + docs/html/view__promt_8h_source.html | 83 + docs/html/view__selection_8cpp_source.html | 81 + docs/html/view__selection_8h_source.html | 83 + 198 files changed, 14674 insertions(+), 481 deletions(-) delete mode 100755 control/bin/b15fcli delete mode 100644 control/src/drv/b15f.h.orig delete mode 100644 control/src/drv/plottyfile.cpp.orig create mode 100644 docs/html/CMakeCCompilerId_8c_source.html create mode 100644 docs/html/CMakeCXXCompilerId_8cpp_source.html create mode 100644 docs/html/annotated.html create mode 100644 docs/html/b15f_8cpp_source.html create mode 100644 docs/html/b15f_8h_source.html create mode 100644 docs/html/backup_8cpp_source.html create mode 100644 docs/html/bc_s.png create mode 100644 docs/html/bdwn.png create mode 100644 docs/html/classB15F-members.html create mode 100644 docs/html/classB15F.html create mode 100644 docs/html/classDot-members.html create mode 100644 docs/html/classDot.html create mode 100644 docs/html/classDriverException-members.html create mode 100644 docs/html/classDriverException.html create mode 100644 docs/html/classDriverException.png create mode 100644 docs/html/classPlottyFile-members.html create mode 100644 docs/html/classPlottyFile.html create mode 100644 docs/html/classTimeoutException-members.html create mode 100644 docs/html/classTimeoutException.html create mode 100644 docs/html/classTimeoutException.png create mode 100644 docs/html/classUSART-members.html create mode 100644 docs/html/classUSART.html create mode 100644 docs/html/classUSARTException-members.html create mode 100644 docs/html/classUSARTException.html create mode 100644 docs/html/classUSARTException.png create mode 100644 docs/html/classView-members.html create mode 100644 docs/html/classView.html create mode 100644 docs/html/classView.png create mode 100644 docs/html/classViewInfo-members.html create mode 100644 docs/html/classViewInfo.html create mode 100644 docs/html/classViewInfo.png create mode 100644 docs/html/classViewMonitor-members.html create mode 100644 docs/html/classViewMonitor.html create mode 100644 docs/html/classViewMonitor.png create mode 100644 docs/html/classViewPromt-members.html create mode 100644 docs/html/classViewPromt.html create mode 100644 docs/html/classViewPromt.png create mode 100644 docs/html/classViewSelection-members.html create mode 100644 docs/html/classViewSelection.html create mode 100644 docs/html/classViewSelection.png create mode 100644 docs/html/classes.html create mode 100644 docs/html/cli_8cpp_source.html create mode 100644 docs/html/closed.png create mode 100644 docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html create mode 100644 docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html create mode 100644 docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html create mode 100644 docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html create mode 100644 docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html create mode 100644 docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html create mode 100644 docs/html/dir_f89abcb304c928c7d889aa5625570de5.html create mode 100644 docs/html/doc.png create mode 100644 docs/html/dot_8cpp_source.html create mode 100644 docs/html/dot_8h_source.html create mode 100644 docs/html/doxygen.css create mode 100644 docs/html/doxygen.png create mode 100644 docs/html/driverexception_8h_source.html create mode 100644 docs/html/dynsections.js create mode 100644 docs/html/feature__tests_8c_source.html create mode 100644 docs/html/feature__tests_8cxx_source.html create mode 100644 docs/html/files.html create mode 100644 docs/html/folderclosed.png create mode 100644 docs/html/folderopen.png create mode 100644 docs/html/functions.html create mode 100644 docs/html/functions_func.html create mode 100644 docs/html/functions_vars.html create mode 100644 docs/html/hierarchy.html create mode 100644 docs/html/index.html create mode 100644 docs/html/jquery.js create mode 100644 docs/html/menu.js create mode 100644 docs/html/menudata.js create mode 100644 docs/html/nav_f.png create mode 100644 docs/html/nav_g.png create mode 100644 docs/html/nav_h.png create mode 100644 docs/html/open.png create mode 100644 docs/html/plottyfile_8cpp_source.html create mode 100644 docs/html/plottyfile_8h_source.html create mode 100644 docs/html/search/all_0.html create mode 100644 docs/html/search/all_0.js create mode 100644 docs/html/search/all_1.html create mode 100644 docs/html/search/all_1.js create mode 100644 docs/html/search/all_10.html create mode 100644 docs/html/search/all_10.js create mode 100644 docs/html/search/all_2.html create mode 100644 docs/html/search/all_2.js create mode 100644 docs/html/search/all_3.html create mode 100644 docs/html/search/all_3.js create mode 100644 docs/html/search/all_4.html create mode 100644 docs/html/search/all_4.js create mode 100644 docs/html/search/all_5.html create mode 100644 docs/html/search/all_5.js create mode 100644 docs/html/search/all_6.html create mode 100644 docs/html/search/all_6.js create mode 100644 docs/html/search/all_7.html create mode 100644 docs/html/search/all_7.js create mode 100644 docs/html/search/all_8.html create mode 100644 docs/html/search/all_8.js create mode 100644 docs/html/search/all_9.html create mode 100644 docs/html/search/all_9.js create mode 100644 docs/html/search/all_a.html create mode 100644 docs/html/search/all_a.js create mode 100644 docs/html/search/all_b.html create mode 100644 docs/html/search/all_b.js create mode 100644 docs/html/search/all_c.html create mode 100644 docs/html/search/all_c.js create mode 100644 docs/html/search/all_d.html create mode 100644 docs/html/search/all_d.js create mode 100644 docs/html/search/all_e.html create mode 100644 docs/html/search/all_e.js create mode 100644 docs/html/search/all_f.html create mode 100644 docs/html/search/all_f.js create mode 100644 docs/html/search/classes_0.html create mode 100644 docs/html/search/classes_0.js create mode 100644 docs/html/search/classes_1.html create mode 100644 docs/html/search/classes_1.js create mode 100644 docs/html/search/classes_2.html create mode 100644 docs/html/search/classes_2.js create mode 100644 docs/html/search/classes_3.html create mode 100644 docs/html/search/classes_3.js create mode 100644 docs/html/search/classes_4.html create mode 100644 docs/html/search/classes_4.js create mode 100644 docs/html/search/classes_5.html create mode 100644 docs/html/search/classes_5.js create mode 100644 docs/html/search/close.png create mode 100644 docs/html/search/functions_0.html create mode 100644 docs/html/search/functions_0.js create mode 100644 docs/html/search/functions_1.html create mode 100644 docs/html/search/functions_1.js create mode 100644 docs/html/search/functions_2.html create mode 100644 docs/html/search/functions_2.js create mode 100644 docs/html/search/functions_3.html create mode 100644 docs/html/search/functions_3.js create mode 100644 docs/html/search/functions_4.html create mode 100644 docs/html/search/functions_4.js create mode 100644 docs/html/search/functions_5.html create mode 100644 docs/html/search/functions_5.js create mode 100644 docs/html/search/functions_6.html create mode 100644 docs/html/search/functions_6.js create mode 100644 docs/html/search/functions_7.html create mode 100644 docs/html/search/functions_7.js create mode 100644 docs/html/search/functions_8.html create mode 100644 docs/html/search/functions_8.js create mode 100644 docs/html/search/functions_9.html create mode 100644 docs/html/search/functions_9.js create mode 100644 docs/html/search/functions_a.html create mode 100644 docs/html/search/functions_a.js create mode 100644 docs/html/search/functions_b.html create mode 100644 docs/html/search/functions_b.js create mode 100644 docs/html/search/functions_c.html create mode 100644 docs/html/search/functions_c.js create mode 100644 docs/html/search/functions_d.html create mode 100644 docs/html/search/functions_d.js create mode 100644 docs/html/search/mag_sel.png create mode 100644 docs/html/search/nomatches.html create mode 100644 docs/html/search/pages_0.html create mode 100644 docs/html/search/pages_0.js create mode 100644 docs/html/search/search.css create mode 100644 docs/html/search/search.js create mode 100644 docs/html/search/search_l.png create mode 100644 docs/html/search/search_m.png create mode 100644 docs/html/search/search_r.png create mode 100644 docs/html/search/searchdata.js create mode 100644 docs/html/search/variables_0.html create mode 100644 docs/html/search/variables_0.js create mode 100644 docs/html/search/variables_1.html create mode 100644 docs/html/search/variables_1.js create mode 100644 docs/html/search/variables_2.html create mode 100644 docs/html/search/variables_2.js create mode 100644 docs/html/search/variables_3.html create mode 100644 docs/html/search/variables_3.js create mode 100644 docs/html/search/variables_4.html create mode 100644 docs/html/search/variables_4.js create mode 100644 docs/html/splitbar.png create mode 100644 docs/html/sync_off.png create mode 100644 docs/html/sync_on.png create mode 100644 docs/html/tab_a.png create mode 100644 docs/html/tab_b.png create mode 100644 docs/html/tab_h.png create mode 100644 docs/html/tab_s.png create mode 100644 docs/html/tabs.css create mode 100644 docs/html/timeoutexception_8h_source.html create mode 100644 docs/html/ui_8cpp_source.html create mode 100644 docs/html/ui_8h_source.html create mode 100644 docs/html/usart_8cpp_source.html create mode 100644 docs/html/usart_8h_source.html create mode 100644 docs/html/usartexception_8h_source.html create mode 100644 docs/html/view_8cpp_source.html create mode 100644 docs/html/view_8h_source.html create mode 100644 docs/html/view__info_8cpp_source.html create mode 100644 docs/html/view__info_8h_source.html create mode 100644 docs/html/view__monitor_8cpp_source.html create mode 100644 docs/html/view__monitor_8h_source.html create mode 100644 docs/html/view__promt_8cpp_source.html create mode 100644 docs/html/view__promt_8h_source.html create mode 100644 docs/html/view__selection_8cpp_source.html create mode 100644 docs/html/view__selection_8h_source.html diff --git a/control/bin/b15fcli b/control/bin/b15fcli deleted file mode 100755 index 087f64b81177a53dbc40e3862486e82a252e5acb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89800 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�qW(Z*Q2>d6)ocgUUfqz4I0^xRn?$7hz8M)+&K-BYZC5R)N1q_&mZ50^dNGp@3B(a3kS-!leR#moTS(%P;U; z!kqH09D%<>m{Yyw75H+(oZ_tvfiEJ=sonAjJdH4?bgS=k8Gpil!aV{{Aj~P;>Js=2 z!koITc7abJ%qiPiEAa7zIaOP$1wN86r)X=Hz@rFHC)_IVFv6Uwtpb2Gi{1d{n2(K3SF2bB@tyKcwM)(TCtpb0K z@Rfuc1ipbVr&_B*;6}n%5iS+@yM#HlTK@R+npJ@1M?Y_V0{5HSZ+0~x&ig4I<+h8n zr+?RDQzt{$w;r3k%_;u^q%ZUzamshW9#Q@>RsK7w{5?+j`cCD@KaxqAY}^VjOe zEPVn(^965i;VrW-GN|0Ot4#Qk>5M2hKtv@tEkB;mwO;;4JAX_L{?6KxR9JZWvW3Q=0 z`+Dy*b3xyH@^%lXpZJ(ipM3wl9?u5GDv*gh=QZ$2fBz;1aONLagQ-7QH;@IPpq`Rt=*XI2~E|Fe`+UrYP9;a1wV$2vQvG%qia@~PyDOD zKb)7^jNZOUZh8qH=nuW?s!Um?{SXawfb&?|dUhrXIZVk2jnbnx91yWU1>M8cJklN_ zGaDj|>!a|SH;B=!+;%e!GSH)E-_b?N#rWTE>e2hM`Y5Wl*R{yqkWcH4c^)ltChoM2 zO@$Qn-j7ks=rpgS$YPVP_z_AQTQ_8gfIH1DAv#p1}!-ThtK#y;z}0O0Q-)-_VT*yFD7SE=xlRM@L3bOJC(gDZ0eD;V3!!VnT5$!hdj zEWhB&f-4GU7t9J6U(TMn3Fg45sAZ5oEPy^drg{dV=7vcq6T8~yf4sWU-POo0D z2t@T*p;Fo+pTEY?Q)$^c-Fruo?+TB3B-SLfT)&jd?+m4x7lLX4>J@~EdxOT_lGxIW z{!+3WG(tYF7UA385GV)M{N6|CRQP}vFt+K@Nj`1Gbr@D4Qnbj;7!Xv_+V~cA(3t1T zD(px--J`F^Nb+}cFbZ5Sy9dRO(QbW=6(JjMAa-d+34F}48#H!2e@7@ykIwSt1oB_e zR%`)LTIc)sfM!b11{@Cabow(E;^bM4Q94c=>*??xGhUC)%n(}SI7>HX`O>F#6nT$D z1L#*2y^s+G-e1zTpB>R6rNZSW=GuL(9-*SPqK+MrE^TwVRAYBZhvH4^NIeDe*bDFM z!-90MF!xbDv{iCM-+^NOJaXihkw6bQ5~UueW_W9cp5KjOSnt#{_V$-%vd{0{4L&f& z8DdVo;|Asj^BW%y_D>fRrhhUkS5T~H|K_h=>AW&?m(REeT~a>dJeSXSqK~@TX`V`9 z#3on#AnuVd>|4$IgttR|#xN2SpRob`(l(0EFzak$uYf7k7Tsc}s8Y~fEwUUfv$e@m z-~-**LW4XnNh7r=%|=4GP6K1?2AWY{%@I-5g&)_}jaXUa%du|4ge`F+jI57c!ic!- zcHCdQp3q|$9I@Hn-{Q{PF+{oDn6$M>7L?a1YkdO%{6V*QuaqC;Kc14}54-)x&z1j( zjrrI2J)VN~$3jfGF9eNugGRskLv+k40IQgWE*cCLOs-5PA#KR!` z)(z4viJw|hbYqgwd_bN}@^NN{?auS%pdKrY!UIu!s}a7lKnbSQ$`cCE42)%qsi$;D zmwLm`rkFp4{H&Ylx-Mh4=(XSs0^!b#V17T8lln#>J;E`HO+5;oF+2C7_$erEo``>f zMqh83aUCD+#v|Mp^S+1oVkA^`P|oje{zLDdpco*yk-pB{Bjed^&L(xEOHv#ORkX-= zA$ao#C@C41-tGZws99z7Z5;ri2bg+wq>jR9flHzjq~uJW)=N$5N=TU?5MfE%+W})sFj|7n0T<+~5*ix_f03fK{S6c`#3=Bcn~Dv&9-y5O3EYYWODP3Yytu}K%8&D3DZv%!>C1K}@I znnzRhM)v+mo(GNh$pTs@$r`(LGz_r!&VeBel2z(4+04{c6-r{FR3Q#rXNW+6wnjjZ zw0Fn=tgjrYMJ@!!T8w|7h7aBW9XoE%pm=NJQM2fSKF`H$wi{uzE7DHK!qeDgwxGk9 z%~r0&IBI_`@(rue_C9@PVfsETW9l1sO5}6m$G8HX{1UD;T2}8q?Tj7!w5y)O{ag6| z`5JB3KWnt{A8RW{fyzGZtSunYZWLx{e@^wCSvVTy+flv~Wq08JE|mWZ%73V>z`BX$ z+jIMk!g1ysU>?!z~csSEMINo#u)l`!I&2%ca! z`*g5Id7$&Bb%S_~Hv8{Dp21#xxKG>CHv%^u=+3r%+SNpEuF?#ri!ciYi++qy8)iE9)iHhghz7+1d#2B+C`^+r8i~Hu=36M^NUchu_6`#|u34yXcU)nPP#Z02@K{0=ShQ*=`q|IJx6ez9(e&LPTr zXkA@;N&c5&Ho8$@R|Ep;lLX$x3rj+ab18yR)5fbC?=H4?PcW1qcC`~usH%~){*hue> zopn}hc}l?ez`UJ3joz3E7ZniyJ%@<4Jwan3%)cp1i_8N}>mvLE`-ntgAD>#Xii$u0 z5P?LaSf1Bs$(l91J0}=BZQVA=wQ~j+5`!02SgXL3{`m=t9YX4y;boDI8Cfiz$9r7; zat*g<;9i$|V`LzDfsd=X3$;x%QngK2jtIA>gtw#^g`7uCSW|LiUNAX(Q|BzyM zTaF{ntpVemO=kibh!tasL6{naLNJ7?;zINBy7^wbIvc9q&=LY@=-v+h86Jd=h#<2> zl&L-zp3cGumov^FeXfXkqmA`vn7v|L7x)6Zeu09|vf4kR*oufHo0-sbIn6GI5q;{5wl zRONu`P`)%X1_*qcr-3UBaqsU6WCtP@-s>T(-@DB$X>xg{9^MXB-y1rd(zcESwq_M? zW&Q*KkZ*pdciXC(RRjK;N@LEab|K4A3L(z14nsw((v^OJ+uAK&3`O2nS-Atgig47U zV47fYZois-KNkDb^-gZLP?IE4fvYH@9=#|%$P7gwdNmUdNK?R@PqOnSAzxlDf~avA zU&%W~Q++|>v!L;w9?da3RGcsFK`ZLj4KtX1Adug!t>AayN}^}^g4v%3Vpl+jm>o+} zzQi=HYcqBR4Ma{mLx*9i(IP$}^0}t1I2M)k@aI?w74xp`^+0TThStV!ap}g@zRZr) zOgvxa%k(tg90YMjI2kMxh?b=5`JGsQjq!wh<{#dpW}!2|{4WFAw7q)%KblTu8H;Kr z{TTeXS6gu^WsP+XatIUczSDtgZLPx8Hr+85nW-UYJk+CQNLG|(Xp!GhuCi_%9wbx2 z=pu#*2ZJdeu$TQ>7fzS6nhZSV~sdH!&(QdO^=bm zJ}9xd3yfL6m*Pc=os~Z$hj4`EtrS!)n4x8wG8`aOg z6>jzZx8V(@l9AZdbBTB!2;67zzD?bKllPDFUJZ+F^AC|2to%apfYg<62Sm0#nE#0u z34v3y4JEAalIOOkgNR6*j}7E^>7DJs^y^yT7MQ5&-vC;>brr;aKz5fNyWpr`{$`F1V!bU(OP_*>A&0+kvdjKk?7m;{8VC+}^ z;AL@gGWC9>V)0`cj_cW7f$UfG%?HxJl@|F_v~3bX@ID<$fpqQG6|_`(^&W}`dY*31 zgV51|l9Yo~Fwx0?F@g)$lIUVMlMbRX#SDb#9U!61fGb~R25Zoen89+=r}~x{b&f5} z#>~D;i`*y7OoJM}tB1FEb?^zVxeQbP_W*K%0C&%9HQNekj>B!NKxY=Q}6U2 z00GG}8vZ`Gb+4ZPO6YPuhH|W-_v!hYo40(V)nm4rmeIRKx+%l9d7dvl%{l@-mh~{$ z%hc9+3Rc3LN(I?U%CHUFKhB0Tt@DEE(6T@bec?nD%tk2ws=j$|njX7yn7(-zhVvCz z)PTPq#K{gV@-S!$XBf#X-VOpb-^N9K;CCmww37{^tEQg6uX!UPuoO%`>H6lLv_Q)C zV6@sp^EzGGJ11IU2W~PnjXasgE({%}p0`np&Q?uYO~3|?<(}Yh3~$g_jQ^J(x>CW& zZL{aC&33ReHS2YTCnt*r!(4D+6~kcimS-do@pDxj_;wX>Ux z!2VDUQwLGdHP3~up;R|Z-M~^*zTQ?WCC%UR5hn5BRPgAx^?bOG(6i<&RO{_TJ~Mh{ znVx@Tg%71VR*tC=+yu5DhADC}x^TTK6(XZq{dJxbwtiE3or#KG+ z3&s}tyrL2k!6L5~z?vSbpIN><72-xqAZ0}7(PCg{Grx&x9rG3!_c^dP`RT$>uNIkqIJ^XHZ!BgxKloP5@Eb(v(mToka790QS?GeN?P50{gO;9HwwW1GtZ(|NH&w2zcnY;f1=8=+u!RKHM z?9CN~QCJl)u?#uKu{wh*V&M)x?v{GJ|47&`<9aV(yj(B~_8+aUK=iIpsb8Q)wm~Gi ztf{z~JvSJwfkXW;nDQ3G!u?vr#B-#ew54^Dh>H9bFcMYGOM*rmU%DdMWR>{axglT;Sn1X_y{apY46v3;*+lE#hc-nY}(kd>=Z^ z_ICrpTP|^7PlJ%W8k^m9vlBsUK)whV+T2CY->yK zW_+S&zbdOYXY!ygepFn`SqP#`?bc2JfzIuW-njT(L)kNm3m6>%Bwd3kpQ!rI!Vng4 zoUK|1)ox4rM+I8_j0|n;46M0QeR}>*E%JR(MFQ4~5Ej8InATHXMc^7hwBw3zI;V-s zO6Y}%2L9@z9{l6)(Z=dMdbF_*Q39?A#EgbMzy}a9;EJfiXyE+;9C2uV9QpK=z~=YT zN>V-vz=Nd&#xT7Zs=*2ZK_Q~ePjGS}XdGayrTjVfwREh(x3Wz{QwaS!3;SpTx>1T2 zW*z{(utzs8KA?@g7}ru<{XKgAN6lLpQw6Y;vxBP6K=cIkxi{onh51TMZ~h^906cGg zE5Ow$Qd)>a_nO|<5O<{ftHhY(E8*&zP6r87drP&%SmeuSzA_;hTp(+Pz~*<-Ec)kF zN%gw&HY@K`7PyY;o>>IS*K3d}95bj&3*_mwdN)yMjS(?OEM; zPPw(GUSa+Hp)o<@6SH9_>U~3$1F2y>sw(ZVx1Uudq*f3l-741GZN7=?z*vjj+xxN9 z+?VMM!@Cg$xN^jK%y_Nf<^?AC(6nIm54;b?HgPpTHz|ojrV2;u(G^4n^0#R#-o_1l zm)7&Y$1SKdNjiys`jj&vz z;S7O(z>CbS5S7fW)SD=m51d}JIK4vu!$gEM&aN4@U@*IKWSKxnm0(9}>tU^MLhhgy zNcwz4>*qFK8qak8mi@P~VVjg6`?&H~z%aL2lK*kjx1HSP)FE@5-?IHW>>57YEWvmN zql)A!)E{y6C0IOhC1?H~kM-yiY!TTn#scZga*i^a*CKa-j#Xsy z$Eh^S;zqyu3)YEEZCwI){;!vCuclRmCIizdcIzm5OrVcIxsd6CWwl7Y__v^~^2M80 z^7fFFaf_2OrXH}!K-T#D!CB*laak^G(T(4>lHAaVV?PvRkG8T6C7j&xbVt5LL&_Hi zsYuVY&X)Y~JLoU+$1S~gCghKUFH^!dw#4(t-ylNr$1RX3`=LdygfJx~1@RR$LwxIA zbk;WoSHe1WqLfM`7Z|V5l4wSmw3qx~^dUZly_mRAM7F(rA@(B3{OwD1G}(MAgwaD% z9jRw|idH_7Nkvb{4>0vUppVG$MIRvj-fd35D6hMK3C1{??4dsH;kxbm3taMg3LWC_ z=HAoe`uHC6>`$R%Hc6`v1u*{1v+q&rcoMZH`UD%4QxS1>d>7S3J4JHB5wwz>(<0vj z8LJroKzOOhN}Jce0J=_m4*klIV2rDqk?<#oZLh5e8gJ<-uZ7Z}-Jxb=8nvb8G2e)D zb8W9TPs5&Ex}+EllW`0}B|r0L!*^jmgQO9na37NpURWP3;~l=5IhPD!-7 zB@q2xD=WbH(dCJsN@tM@daTm*qkyZyT?Hmdu!)E_X!PhQCPUD-waB70ssl5Vm!`@c zGLw%{McVeTg4Q;RXv|W1lAV-;BForvafRp{2M9})k}^I2)j;g593DQw9z4ucTk#G~ zeQ+<;t7F3EfsnRSK@6LWD`Cwb5?@czpJ1{?BbZP-QqMs|0nchqmJ~V)V*ayFdAtB= zu>nj>%OC`1=p}Qw0eGH|fn!JRHITnsi#&(cRZ+>~Llz}WgGgo=A%e<4V;#4SLL%fF#c2$Z3S00DlxsAcWtlhQ9N$jN&s2DGHONvmo%{xU;K?1)0Yg-n0s-s zNamg*V?U#`DduCsJo%n-fe)q1im=GSe#DnuSkX&L1#GV-Su~(ys1i9=yZFo~w^b_L zKjk{8&{NNG+9-mJYwJ>d$oKj=bk=nEXFD!t{`gDuPIUJ7Xilh;duR#r$CBDThIle> zod)8z{*MH?3We2xRrDxnOrr>0AnDL)h=-PgG-lQOPAzf{wI{sYYo5+-+aOOQd(%&h#YsVcft8s}n94s&%^ODl@?+3!mOFad~J=_UUYo?ND z8{GwVW+$TmFpD{$SrC;H1;Z7|*qCGS3?7m+O)GulC6XY5K3Is**30D zt-r;`&7uFr-w>dwKHI%S*Yn7t>K9pQH?J7X)Qnxm^5&Pl1agZJ4e!{sZPrb{brTZ~4FrACc+|STE zYFLhS_vfmfI&ERL$paF6T^@M2r=^TEcH)AEydLWzCi;-lSNeE0_3@1m7D=u>h1Dd2 z_+R!EUR#X8yX3EkTP&M4^pYEdHxNX$ex!_~<8lxk$=R~2rEr4RX?~{nZ@n)n*Coyf zrNdib1Fve4g^-GQI%-+AomQ~nm;ZuBVpHpQe;Akm=e=vh&f@+b$$6}Cx!(Kglw2D0 z>E?>5sWge$?;v5MytK%Jax<#ARuA7)>e1S^;c-D{u?O5h!kmwIHcp2NWK!+~iBmBf zXl;^vADomUUsFedKqyyb`NlEJHvwbFl_k$tz<_ZQxF`JCwM&YTYzsZq`%@=gh)%Cy z02tMAQdl>xfCIUrtfOdHztrh{Mvss2B104_S>POJ zEWw^WPYldn5P)b`a7S+1$`f*=sIj~P2NiQtgs!y|-Bjx%Xj8_T(OTpxV50ZXj|`tZ zZVDzDt!=uX=u3vr&S-s#;gCnK3i;4NtcUl}r`iSe0;aP3eM`>MQ$E#Go?-g>d!s1F z;o_n2NW1kjSSrqKm!^a+Uz6T^2{JRKBxmgcJ{U_K70B;f(#`_dP#c}6Mc&85a1S;s zpJh=19_@P{<6nJvY&9?WA8NP0%^S$>PYyNaBcg4xOo^utIRrmsK|}#wJ@(iE+}rCM z9K6+|_sDWa)e5MiK9C4Ai8#}M#9~7F5X<_}GU2HFVSzT5Cp`JqL1F?i9XQ7C%gYMZ zv#UHijB|G8C|NKTmsypp#7tZ73UpKZ-f~)~(>=haLxk1>BGHGoa@<&t;ve&>XMo~r zg#IDEc2MhUW<$aL0NUB+r^Qy-hV;h35)}NUo%~b#eF3$JkJW=n5R}L2u}vZ`#0Rhl z$!$pVsmH<$E>%EL`!xIU1Sb#Rcf|3RDLiKZ;Mc_Q`GUW(1;~|gq)#EsFdZ*YWRE1q z=$>QY%n&D2+yBSXuKUS<$M54ihUWJd3V#T{hTs$U4Jo9H-?_xVxBvZ3xo*tDpwF?E z0Xrb>npMu~1gl@yA|J@99{Y9?)*(@=TA8^K}lxO~0k% zpZIv$xJkg7t2-$fD6UEg4L+w&1>FRW67t1ZpOnh__ov`Xt$%N>ICSw_>MVZYn`TrD ztbDP-o#eb!Db7okC0X_sL0 z)qE5J&{cwCNN?0_z5s1d=U?GjIHK6AD1~{1cQ4RmIFzqatW?)Q{VZcXY#La5kru+W zT%OEJjF#dnIKSzWv^=8|uH|Imvl((sSoj>nKtGBVguU*;V(lzv-QzlWBfbm8xbi62 zNM{&~wPdLIQ`S8)!N`G}ZM3zv*O6J(+GH;t3kR$RaULf&=8x5Q7CZ5^|4}QSoWV<; zEnrV#LUj)MC~}+sjuyF%%^@8sym9d)>oT&UP6ug`78sYD3#i8pqNcog(3%&waE2!@ z+Dh)5$$I9^tsE838(<4@rE?x;I`N!O;`@8fc^JP!PX=Y_?^mv8{=m+2J#z)cmKN`e-B77dD3hL2qPcp(_Q^AFjfEL3ABa5av8| zvLrgaK?U?}(t-FYqr>h`*??}=LpK);T2QotkgzN3iHYc;Rf2!)bztno-1`tV`zg}I zu=%1vVRJ3mi-*nk&jrKBZict}6VbE)s24;1ffab3Jn1&O>=B27Ft9#Z(0k3t1r6Pn zTCPx;L7VwGXv=Y9htC-eiTOcx>`)g8NvR{H%n!22fR{|3A8de^Y)RrJNrQg!|3rRp zdpk8_VZ$N$!L!g^_{)a4zx*5}mA`C2evmv2&JUhki2?ZGCTAS&^QDp#j4iAP#vWi5 zIGLP5UIi1dc^xy4v9#On^1>%H!8#U}V(KkJaZg8K1#GaYLB?=O6HW*gwh*ry!#l#Q za@QHAeyUrzPTquWfOkE@dB+ujJ%dTd&Eo9 zU*&gCb^I<*$gA@UIHwAW=We6P^GUty%u^sZY+wyg6gNJwlM5N=e*rc831r6^N*w^b zoe-j$R3^%?=Wzm*)E&?8JmvQj;<1|>5Zbk(RpoaB4#8LAgn`m@MZA;v6VLxH(n|TCvY_eL{0!=w%<_z`9o(H2(JHU?BTB zJ$py|WEbD~(PN{r7ueC$57PNNv|C>X4uaq?ArFTaV{Q|6@L~)mN*rZb;6-XSfVYBi zZlNUQJ>A~V<9?tPh+c|C1>V|-PUFNo4BK^?+SpM*F?>T#YAjCa^o8nzF^s&iFPOar zFFOZPy0B9b*lekNx_`4jc!O(yu%%C44vp^*wjAL8U@*VE`SGBEUiPGw#1^H(!!O4= z>yuEW9-EH6!Oj3vemM1L1~!{WQQ}al>W)Mf^trnQ;Kb^v!Rj1&n8{qJx~pTFE;b;sM;Y8!@oG_r~MZ zf&D@pbkkNGi5l46YJRHVDKBba*RVMEZTWDB`NEUX-BnO4L|FEg!y!J!4(jo)7zy#Tk!hpc#2X zegl=IvyIifxC`JD1G>?c1yGN*`AN)pud~gEn;bmGqa56tpFYm#7iZ{IeR}vH(lm!_ zkze9@_&|Ci_8hn^GBd;25{NDv2LoI-_5j}4gm>R{04Ii0b_BBj8tys3vM1o0`?T>~ zcyoG5H1&e~%|Rpe{KmcZJRdzA=@xPh<-fo_Bh~~Dw6h~M*VBBp9;@z~Q*d?sdjV@w znj1@&)*FSEgz14(HhC$f&hTnn_)}5#aI;JVcJ#@& zd!eqsUCk#34v2U9GXlKt^k?D%98#XxJY;l^T%iFsboB4P@5Op(JsN_>F>1mrDqjSE zS4fY01$p(I?+=;d*%FIF16`$KX}`P;Z6mC(SsFB7{aEN@0*ucuD~Q4T(l2S*z2>n> zse9L{^-I8b#hzbo*?j;i#8gv-Zd~AV$tdD8@q}xaCtA@t^W(?JS=#nhTnn7mflKcG zj)H+z#I0N2Yn&0?|Xn*X1CMh_43^C3D3GJDmr(?{V&tP6lT< zaxEF!ViRZLQY#pQED*xc<$P1q>_mS{(1160KMqHkLDa&OzHGRp#j>zZ$od)PY7}F0 zSefv&M(oB?zH?@i$FZszHu-4Uc=S)pj`&*93b@bY{VLvrP6fnpg#CQAdcHunJA+3b z-RWf&KZ`a1enP=e2y7deW8i&&JQwx#SW~7gUCIxXs792;4qW+zEW3DBgO2JLVFb94 zI*{fIf5wSe?a$w4ANCb!XLRCqxwJ2@;>&T)^;&_=9gp_+@6)bL>%l|LM_{Ye)MJZ| zLXz|?Hn2|{3;E(b^;9(4)&oqAyd538F{20@NS%??R^af^V?IgMicJocAuGv+C9?cb zR`Z^9>{l@;WpJcm2W%qceFP4ODAKWP^_=!O=BDtDRAXAEIYLo6i&U^nNh;>$B!Lz| z{dnT30_Id8;RNu`8#<|82~5kCK3oAw z?b$1BYCImi8+shxo>GwaLG#=2CEE+0%0fE@+1rcT_S|$vFxDg${TQ9ecMa70#C%lM z^P@^pzPYT&<}~D#F@GQiBEsdjC>~C&KnJ+mh>RG4w_4>@@V$_Oyr~WT%(;I;f6?z} z&;vb+o%vV;48)%fcJStY2I2$^Ld3TkAOa38G7aJeUD3lJuJ`f*PJgY~j2rnvf$ZEP zJb|Wpk=sDqZFfSt!R$S18@PfL^w{Y9GmsYl!MdLv@Jk1-LKOn+$P>7@ehEcwu1gsv;H2eM!a6FEbsend1dLL!?g#5Zn{_`~$8xI3rzf!P zSLqI)j9OY6=Y;5(gP270=###76sEt>!<#`t`HEe925RZ}AP8+E-0pT4XOV!N&4EiQ zY|xHjA?&thLzl4jc!FvIR|T)pKuUJm7IPS^n%*p(=ZSM{Pa^<@-Y!!DW-U8a3%P4;w{a+L*~V$a70M38 z%S@B5WEbEZ+}{~^7>#L>kFcAF66*UP?*dpAjQ*|2l@q_o`=1DH zZ`qwGDte!<6#|nr{-79+6YoF_m-8@NNlRg0qGu1oMPfJ!w%idI;*PhV!4iuw3gnNy z#;ZpX!u2^ggd!f?Lw1rMmZQ=9FOJHj3?n78p^Vxxh(SqYD2U*9XrnOeoib0n^L|`#@cQsns&{tuq6a> ztI-m=A_3i6-lGexyhhW`w~MqBw4Jo-UD`=_1eBkpB@B$Fz1=1#D1Ss|VsoOHblTM{ zIw-Q+33{2NiO!n1@&^gi%ZXGS3Qlm>1HAb!Q3yD9zQ9|dZ_KfO+zD$CC!LOBd;=Gs z%xQu7%HUT-+OJOoq9J#UKg65sa@Tm}rZIO-hTJseu1S}hQ0|&kxoOT_gOf@qyd-x` zirg&C4aAlp4!bd916wiIi{32rRmiJ=k`X(NC>5+Nyu=CCRt+GpC6X#&-YAtFxiRhx zBJOvGI2(S!_r_%t(Gni<~pSooP?MrkHzgn<1{bU_E+iPqu4VO?;LDukA>>SBoo9`sQg z7*?(4HNOYnSK7t6*?Gh;0-h=FgU^1m^sL&$U4un+jGI+fX46BgpEZ#AsN@o$Uy+A(Z zyh$L)mr7yrc7pYlUn^Ut-HVrj ztYOE+m@=7S7PChbi5oa@rlF&0(eHVo6k{TCdD7Pdx-@J(b{&KiH|lCW=F#ZE!Iy2< zf8bLIbf6f6gD<79h`*+gH5GsL-QpCtZT{xpkZoa=?#7-UFv{SRag}mEYDsFlF`n4a zjYm`IMi`4>vFbR;xU;HYJ1*C#SX92&{OPaQ=6yc8cEn;Q*e89keHY-++_H@`f-4k@ zpWFE(Jr3Tbq&RS3cIyXT3g`E}e%t4xva);jsQcpODdu+BOpzG|?Z8ysID zw&FVL!DFF`vn5(-1yRwhl`o=AiKj-aK_@VfC_2xFeG$BzB=J<;L+l(>)wy2K2A-RRq6dm2tCoF`xX?V)#OB${_2Ark!(>H!(V+g`4#cs16;A4sp$63NdiwqBo8#xasx&9tC=TjZUpD28}7` zlq=uMBOL)_ApTk@W*AQ`Mtm(mAiFq^vJmGLgJ03ZuSCU49{ z+O^2O!=P~T-OVxl+h2SwrL^~`xIZ_i+^@cGcO(bJi=zl;Eiw4Q-P=6<2U&NUuS&nW zR~Gp$F>jQC;QgiM%_xbR(%e09dZdzxm;YX3vDnqViW(yo--6tZw>ZB{=YGaAUzYjF zFYqv$wqu!>kxMChh{%yL(|L;@u$S?cxH22Z`wHitP8RS22gZGaa}RGVl8C0&qXB+l z1O9yhqRj?+eyGXA5-bIw72?8B_kgsD_V7HIf+C&fRth|tb{0tF?q^&N0u|o4i={rm zg`{!nNJkkcV3r+9rkg8N-M$-%hl6IeDHvUVSs6|vc0Gn~3&$x(G}X9Uv7zWNsLbFv z+CimP#?&6@Xxcj<$s#$b$O2AHc4wbqYj#j+&qsGE6ud#imyR0dn;eyB+DKuTGY5wQ z{nzo(i7Cr)&mYF1g10hT#IA!PC?a~Spn>8aWsm$NJk5(%$htRjPN zb`${u$h{_W%)_|{o7L{Hy3&dW$Wy+_n>U=3v!;( zSrfp(kp=5RtC9tKe~gm_3sA%HK}4Rczyk874D-sLqnjARO{-z2^oFs?r-1N=qrjqh zK1kD9D;XtFeSNe;bt^*E!BkUhs)nQ2E1FryD*=Cl7%%*;KMnQ|91d#2f< z5oWgI2_@mRnQ8k_!7j<%PqA{R>`=-47Gv#5COXnBnZ-6UFH=H;CG!IK6V<#4`;Aab zY+Pb@I-?hFz$v{P0}d(OY&1;0EC_E)f#-ZlDdy<~`?uMO`66Wda)B!R1*rBu@1EZW zG$|N;Q1nwqbDwK8j~x-`Ij*CR+^59&4RCJj=(A{J!;#d{ABt>~P`<-OxeW^kTTkMY zud*p`hHMyR73U&cM?fn5R>zNGlbhKV*n$K;F~23vO)gvNg}sjXryq|p@Cb8vv0-BJ zng37sXtBn>DDT+h<4A>mm)7>yp<{3fQTAISd(EzQ++;Xh>E^@iK2K#hqdp>T4>78p zZ4b@EKb(|ayH80%VC&pwhlA9C;&`5THAFidbEoLv0I$d^fSx?!&7vT$XR{MK=3C>VQCHdG|dEN2Gq78tKU zj>1z{s(BsB$aijokh!dj!YIP2XeXLvra6Fl9sc-Hp}^d)@WMsiEv!NYkuhayJ$kpV zhgZHr^Qh2+6zp7t@u;e3+%BEejk~3XTI2y1G@exC;l70eL_v!DNj7~O8c{`p`R~EI z+#v$CNrHty^yX4FPx;C6?V40hgE(;t-c}0|Jgo#$R-H2{0>;u(#J6PuffqQ02?K`BXKErUK({ZGNw$x298@puXQT^39l#_0 z9A4NR^R;{7zXl?{wz2!kvx*$!d%{}VMKCA6R|Io)E$19#QFihs($&_BUr6vDk(M}d zXF>>ki{G7ZzW^L*k$MzG36*c33t$y(Vl8TlO;AYaEMa^9=oWbI`2JB3SW){&$H1B} ztBVb2ZSNBg(^!vs+(U|+1_=!^4XG!laksBs9^Njs#5DM4*rA61-Za*;AkDW~$!TynY`Ks;WieAf?A?~UtN?{A;F z>a_z{#qukMDF3jOf9?}k`7Hoeas5?>@`!8)?UyW*@+YB4e81#Kr+n5B<%3fG$5bt6 zf8}-n!p{LHV4{AUAmy(*;Nm9;K+5kJqWta#_V+$F|91*MSUP*v()m=Vg|<$44X&P* z8=_01hfynNkh2nxo^Xr zL&-Dz>__as+D4~__COs5c40hx3bwj{wY(T*(&zcmCaI78n``a*Yo*@9O4Imun`A56 zf5`gEUaZeWx9oiK%8La+fUY`z9Sv$9|!T|=Q2Qy zzr)+XBtC}v62I4(X4Xg*o;(D@aKU|z}GXu?;Suc8ri0(8kbvJZFZ zWD8%}@QQYIn=QDSM>$o@>jCz5S%vJ|KS(g97QiID=Pnp%4BIfVsms6%^B8^Tws{X- zqHL6J)mHG6lq!0;kax`Lw(th3%EG#FpG-{PoCp2QY_b6@kY^N>h^UY}-vmz0>+z3_ z?4Uw8DK6!{!E#ry+-1_OZu8d!d?E=--1-5A0^OCMo_Xjzm}aK=5xj%54~J=&Xyi-D zgRI%P4o_$IWVXcPKkry51jE8X^}#kF@@0mD}0TpT^Rxd4tYdo7bZZ#z8WZ zbF9O`*MNH@y{n`=35GYVhCV=`Bby8GV09H5;uk8$`e+eG=znXsTA@omD^vxeJ`-~o~0kdmpw zH%`V>85+lUP(JN_ZTurGXW~tS^d#?KaDHuB=6svwKmV?G38Wc}p4od}TtDS|BOjQL z;sM@riNAIcAz#McYPMaHF$VaXY;Ddba&Wpg~c%UD_7!LGzX}8`5{0T@ z1p53Y=*33SR8;RS$$pP-${!&gbH?X+_L{#Il_*ZXI2N3W{lv~db~nE7g_mXd2Mj*L zd${HbmM}IW4{}lLg!~Zv?t5k-$m6KG2Oqd1=eW(Vzp~s420R5D)A6r-L{7yUkApw{ zPSW$A(N@gCog6;jg8)Rm@PhOEsmL728%hHPF%vJC-8-KmD}-M;3Ox)>!XMx`fQ10w zA+Zn3sz)(=Gc5mke9tQ#yhmI5kS2l?@Mrepk6C!;*ne*<{{BpOTdV6R1UAWW4g!ap zykwqK11#GgvMdPh>=2sfLEZAj2Yc8r{RX{`Gq(q z*$o=zT*>fvnm0rtJbWLd#_M6$Ms)-oAn!v8A);QAl+A*W&wf$H z{x%ax`B63gXQmLk;#>{7nT{iPV=zve@PEJAgh|Odh<}{;ksP2}!l$sh$XZK$nc6%C zPNLOO=dI@A+o?%1*AHDA24z6A&`5;6mG{0jHQ+`J2!!KXDG(A;S#MCf#@5G?-sDLZ zqx&Nrf0L%$3^73&OMC2UFVZ^meEv;1V50_!>SwgrCvr&upxztit=~@|ToOsP6Ee=t0XI0zXHq^h8p`jm{hM z#h-y81Rj1xU7UIUZNv?yx_LL9f>PLp9EjGa;UhcUigDqv$hV zjE21C8z4ajAB4|hkV+&Q%{iH^d=6)iW{@*DmxS>gZF83Da8^+8-^%RAE5DA+@X3BPntwlvoGm(pvqq4i z%)WcJEwh4x|5j%GE54F591-9b`6fA>H5^CILWgj+6J*F)&soS`d#~X~uS)UB5?BH) zg2r$RD0TWXywh?gE1M8yBNl%HjaGZ84OD$KZ$~QLE^v5z2@5POn;&>WyMD1JGGJa{ z^EL~-4YJR%AmG?%hO$qE>hAE59YXV8y!ESOrN?H&A;5KaW5&zj4B+(Lc6iPiYY4;s z18QDjQvA@;ucp0mj(1vhb=|ybbO3T5hXbByMyG39d^~%>qgik@hq{3EbzX?L`1osT z@LgJw`Qem#k#CBJA5Emgi7zPkwS8p=4g94Y9HGIQneTdMnh)%kzkqla;vShW2d13E z5koZ>G2>%ql;f+?$a z*P(Sjhz!U;i(H3!cThd692i!`cgPaCdt^}6a}TNNOJ22QP*uK$F}PI=m?W)E9aOdb zkgELq5=p8K8&tLJkg5zgl2q*sfJXpxH!sha1m>JNmm4PtC%nm6)IJTX_Ix;0M9 z@Z7L`0@!?jG!YFS4qI@a=a@BH{;DJwJN`k@M;@Y&Yo(IB;Zn5)^3TohR0_=+wSb9Gm(ZhW+ zi@w)eU0b)fa?$t=<2gyN02}h2k7{Zz&4B|%x&%$(ZM*uk1K&b1vceJ_{_|zl=Yzd? zfC#`_(2u=(v?crqFV!|L`r~uF-)U}auC7w#aLf|v8M4LLlTEK*=mpV2nm9h%!d7e( zKhx9yf}+T@gCra@hbnVoV$4|iAj&ph*(b(a{xK!s{*ZXzmE#jz=M^<;(P#`V>@WxD}{0{NE9d z;a`+y|K@lvy%@z>P>f)W5q%gJ`^{49>!S4U@h_T@7f(@)Om&2x!M|P67zvXPsKUVKtSE%W>AXC2nbno(bs_gdHwo@ESgsT<3dpS{Qw>IX>+0pWqmQtHFnsOM^NB z7v;P*&`GJN#V>pzWbsS9gih4pk1EKCB?c-&+4f);+d+zpa*3kMC1nP9@Ny*ihn&y8 z!YeY!M;6)hny z+A9Mo-+tMS5tI!7duBc=!GPao5?kg|+NU{_q+s4ppiaVkn%sVmkV=Qz@2{AEilxmc zfmE5B`G5BNZ|!&M4a$Dc6wSBoH}~J$@0m<@4z}MikQ&;4ueBR_fn}r-1#Qb0Z%o+VAzKbg2FQfTUo*pJRx>w*6irl@7JvcbWE!rL71+s{e`o z%GC1z&-r)wQf0qUOmhY63knb>6yX)*4*!ukTx&C}cN8^pV6wyvqvm1Wm{pR)8#E8E zTEgKUE}6!`^Y9Pxgdym7H0Df;GzVk|mD)=d(JPZ9Q7n5T$_}Iuv4Fs&F1jUizE8Eq z@XA>~sO*GpPr!I7)}EFB!zuWgX6eNtCj6UApj<8!{u5!h38(xQCOlgj{n{ox;$1P} zJKrO#$xOIXXeOF)Z%EZiV#14{7KfVfI#fE;gu6%zCY*;l@qGGM#?N<1jYIACbS5`r zX`RIo>Ho7|DEhyTp9`CmN&N*W?ZNhom!rRi{XQT$xk2{Z)yT0Q%6?zL6WU}Q8vDBT zdpXJ`x8HfHt^W)5J4#VL#D3quXt4e6BkZ={507By{&yktJ;gs#X<%E#n z5D*n_?O?$d6w(<;ARx85lR$u!L_pA<49O%JnaoUQCJ9irsVGVTjn*Rd(#CqDed+hc zw-oVGO>3oEZ)v?(EvZ_KwN@-vt=P`@Tl+FI=j0qj>i7NSd7hbd&f06Qz4uycuYEoH z919k-MtvqApRpSLrNGo+m(srfK_E?LJizCe)ALF{014U6a?DC#>Vb|GL4wqz;8Qo; zn|iTMA>1n63?IWM?NDYu3&K79JW7UUHfS7aoZ0v)4?1oy8YFCr!SDop$whnl2Y+#F z&$i+lDQx2#Sp7!paokO4@N1_1vu4^8-~J`h{PIlLBUbV313ll0thIcA|3f8EkkrpC2`=lL$5*r&4&`vcf~!vR1(#$6ZfSf=SjaJ^GMTeD}te9FfNj@m?ss}OLC4hU2ru= zN=4(<>8-FRH4LiYV^Rb+sK=@0^YqEm>M;Sv_qU!EN~OMiC8~PK9-7TFY>dN={*Ye@XqvwaN3Z3;qXVT zJP|r7Y4~qo@Yc0pcRsP}LE(oFf&KyBc9(Hk6fZy!GDqc)ap96-F~$2vU>2 z4%@z84B3D+nu6htx8c_4KdH{~_MQ9DtoA+aKNnf~&qvhMRZZG|zEAlj|2cB$^ALi_ z^L=Ry#Bh(-@0&Rb9u&&~zI!67xmSHvTHiD-eg2DtM@>BiWiNfchX89wdV$Q#XYNSH zDaK|;`usE8A_C8m5bPZ3EFRnJNPp2n3VLVw99Rt+UV|h39S_?-JQrb^{d9+~pEJ&e zX&t71z8oMckp7f9F$RAcMIJNt^VbMg{xm$opRTg;r*AbQx2T{l=}ynW^Vqw%JM{`r z_a?+;lGBLld44YHlMmVXr0RJg*rTRos^@>Bgs7gckvsh%81U-pA$I;XKN$s#>>s`ga4hXI&GdIZsr{q0 z4x_IbO-RXBUk{)#|Ea#tLRqr)wFP34`WiwIL^=0q5{tpEN9gOPST`H)L3Tb#UyqU0 zv-NdI=ZO@NJADTXxW2wl?7oe%4}T1Lp|5f-isBjsNqxnrf^0c%{XDL(?*Nd#{sJZ@ zeYH{4EO&Z2C)q!|A26dTt~qS$-EwwnC|%$1rdIMx@o^hJa(3cu-yFP`;2*$=_E4HO ztqAF+pEu7z0N$6tIZD{tocrdhNE37iAIwgmly{mtod+M}{ov@=N2D*#AK~ARuG=W>$IGwAZc0uiuM(+%7*_t)+&gS+)){qRu zlRW77GfLAnm{7dtS6Fjbi3!x3&djBZpQNR#I`e{EA}=7*LKplypWx7#u?tK zl@(R>jkQacc=2S4t}oV`NFc1Y2O=%uU_4ZHPPnT|ui_VD^+%Y2p6xq$PBc?~%rb+BDi*9j zZdQ4N@pv@OrX)-Ru*y(d zC>aO`F+C7!3j`x=!FjAa6bS_5K*7`k*p%!;y*K0hz*UA~G>{5}F{t-WZJ09+xH2d% z+9u-)c8dbQfjS=Q3dXCH-GFv|v_0zWz*eoGx23Zsm=O8(7n>*rn)&@y5ZYptgpxAX zr!=p{20qnYT~+lBv(m#~4u)ET^YYH%Db`1^=>*%- z`Js)|qGvtoACK^UCLpd?C-oYQE7h-VvbM zf%sGvGEW;I|7alI;)MpQ109`^jkl@=bu1dmt4esg1M$2nyv2Z-0Po^pBGDa;8&h8s z%;Tw|nvkSstO%;yD0Dj9@0(E`A`05Y?nOsJE5z01PL{Ed;(F!XOPo!)wFAjt(Hm4Auk_$v`j}Y70j41i!Z6 z8p(^4AHmcdauq<~TY??@4URa}7WS_8O?RB^I%|xJu_mbP!17dTCGPvrOQm`M2LSus z@MeG$P#X%+Tn?eTR|>cl?_|UP2QiN51DuZultI9Wn4n>3mM3G%xCd}5`1IymG5CZ4*|}{vk$BG)Qvp=Sc0Bz z>4ktOU*API4h+xUi&Lq+fW3gjfc4)-d@BD&&|whJi$#GO0S7NbIAG5vlml|<*@|)j z4qlZ??F4;KFXV&p(yLP`H->YuYf>pXB&i24mF@8`JO+P~O2q){cc)Un1}yyz z^h@-BVZa{19>9LUrvVEdMtXz?oDV*|fIWbNfHwkqAAuYQ{uc3}=O(}#0s9_B{s0dE z=HkTw`tEEap!Zqi7w`ZEc7uTZm{-WfRC4TP=n2sGC-4V6@LDQ$A7KA5^Z@963m@db zN=WQ&=ozpdum^Ae@LIsWcT%ax0PEjHxoL~y!Bpxzzyt3g9I)^GRO%(b`VYZ}@(EZ8 z*bBH4upjUWz(GK~{=iEAiDz2kzy-Gaa%@<}9P0`kCyyDG+v^xrKzQ14SHC)yI#ZDF ze`|WiCQJI>2G}myrl+9VGjZYA{O;Ty_SKWlI%C%4(})4Zuf%WaxsVMZv*Y0-S9%8mz^xi&e(K>QF(4fTt8Nx+-srCGEc!KXPIZ>Mpvb$v@6du5r{HR zZaM69DrjjjY&ZPI9k@5rI=`PLF3ab<$Ggp4?wPt(tMvFb<&=3!Hjb+IG`U8B zZ%LWQSLT^o?(u>YQOZ5J)%ldh^WgF86;h^)JOy7z8YRF_2YxI3S`l>W?u8L$(gBkZ z>C}4qDKkQb?YJF)o}5m^y$*3RGF;;Exz5OxvogO4an1u>Ut20gpCV>UEy`1!E)R6z zth6ak%#-`zzQ-Pa;>j9M>Bdo;a<*#Q+*i7;a&o)-7`*G+;pYL}Cy4S~NpjofLV32j zA)HNGmB+U+XMv~5d2JpSS6P<0pu_pdUM2Fn8~%AC?%l7!0wI^J&Kl3eO)gMxbURlI zB|^Xp^2^fql`t1ZwpjxscVjk{)+|Xb8=YU{wn?_!g0NhK5iMPWTPNuiE(Y9I;Cvma z)P5q0r{$H=3zRMOU+JlLCaknyr9@SqEvh;zQdWm#<|EA;k>(Q0&q36-j6GCY*u!Gj z-4v&#qAK(2Wf|r}jy~e|=qK{4^z=AfXImRGmo3@yt!~uGbBwl3I=c^eAKJuwaL?*J z1=~pPTU|9C? z$~WCmK5KpSIGi6@>Z2x~d@F4RZ9;mxDZK;eaESEop!Ax6`xxOqOlF^C^iQ>EyEpo$ zg_cQG<*&2zPvp~^&@cNd(wIYOaDCO1PtTMm)Awch$*g;-pVPsk?wg{&=^h%BZ9`Uhs`CsuTu-|!b5*PCvIjgr z?7@KmRF59{M4r4J#VuJ@@wV$)=x4{*j5fsEf8f1Wrc&ipey+<-?qjFp(T%X8%g{F< zTh@_>Oxr|qO$afF2EGaO9}+!mzq?LdIXCy-T+feGb>T)()Hd zp(aWnefpa39C1B>XR_#a)Y#X9I;3$cWZ{M^zD{*pv&na+eIwuXg0=6e&aVW&_rPyA z^4v)J{sjsE`Hg7zx$jzrc7JeWyI-Bp+iixdoVV0yYhcgY=u;3jv^SNaqX+0Jz|RNV zUx7n6pI@YBYN$R0ZVF+zU9RMINqVMnRTwr~Mfp5aS>9U=|+23=h zJXURH#_kq)`rWPtIhH9cf>?MRjDhD$jA1*8=R-%pbI|P?Z_Sg}LCWW^!Sm8vFb>7= z!F|^e@Ep)wfjrB6LMvii_7a-B{yL*=lg?>OKJg9sKHSqqxLh>16M!q^7-|2&`G7-~ z_(l5k0k;cwc@|+{7aN_z2NRDvgn2=aUN}7z)BrRAN8gm2O?H@(eWtC+$R1;W78D51 z%QT`PA(74R0#dDSG}35YkH4Eu#tY8C*E+b@9K zk=@hW%v9j%p74~$wRo5e+#gAYldRL&W=ezFwZ{XV{-12nS6FYrC}WtVoH#(wOcbaf89Mq7;g*R^rD-%5nIDD8&h z??Zf-6Z6-15&DSv-!RE>Tr(nE?QlNscJ*l5k2LmEP2}Jr&Yt*>+w5@O=fuZDFG0qh zcTxf=2Typ1!+FTXZgN4uJKP!k+-bPq?$qwiXRo`od-K`-?jm#-2Xa1wmL3|dU764R zJX-r8pS_)@0lzsP@bEzES2P zZ@zPvgFQkhM4hxk`=iD-JGJX_kk6BD)z~fWIWR#@!|fpr%^8T?0YNW~V z54fMt{rNa{h3A5Y$FUp6e$R=A2gmIIvscEC1M0)^dBAKwmhO?4vOhVr*Tz$h?;cO0 zx^o;m=+^#Gz;4hk+BJ^dam;!93fO;pZgAq^)dJ+=s&S_RvwJ*l4~*Av3tfNcaJ=F8 zFJP{5Ed0e3*AAEV^knU6m-g6~wEH#fuG6%?XdgIsou<7rs{Bo__CoG)xc@k}{M9Mi z>!ay@b6)uiQ?yI+FL&Z$&oL+dc8d1aF&geu$CTgsMQzu37w&I4ZZhs4J>fju|7_x9 zFnV=jBkmtOaWWzwJaIDEZ9Td5+9}$uFKVE?!s~z7%O3PDqYdq|Y zTo*cb4~*8HJBEEQ+O_i-_H>@}pJUhy`A&2sw~WC-OYeb@c4%|m`iLbHF_&AcJ?CbNk;=u|Gj6tvg+%wbMKQlDuz$*fDMPHI5IQj=wsz zcO9;sPVE{OyVptgFFCc3ovyz-HH6+ovO#5sg}!v0_o(9CO7YUh^Cac$ahbCor|VG{ z`-9U76MCN;1<%*jj`y98w;b95hwBcfcC`y1qoDg2o!TL%>s_aY&>J)Ps!ZqW)5RNu zc%NUNOW<<}d@g~{CGfcfK9|7f68KyKpG)9#3H<+)Kp$W1L3;FJ7A~KJO%nD>I3VEx z3B7#b0P6xOzKG5yj+(^p`XzoqLf_evKmy-$#^)x}vkL7u;d3Q_72fu|x)ZS86s|&> z_+kUreQFfO8V*Q)WVMFNKg$(zI}jF>eH}8s zDc^m~GCU+;ZHUaJO=i4B{?eZ79TBRu9M9IHL^6!(d zNkT>4_M*BIFl>6>EBQDinHdh5@M9!_qN_GN(?{0mQsJ-BVqn%Yy*HWtJPzxQbV6#z_Q)`|l$miIZ;zr>I zzbKwnzWZdtSnB21LH?i}@R`CKmvQ}S7*b3i`hqXYct0i16VXK5)5^j=kyM(t(xJSZ$5k_^%VNS6~?|2DMmvFX( z)eFlV+*U&7NRoGoFsgv%vtm9R^~O%iUG z@OBCJNVreJXC-`H!uKW2nIqGe@N@}hOIR)8atT`{?2>Skgxe*&UBW#Q?vwCY3164+ zeF<|)Wcm`GF5zqmt0i16VXK5)5^j=kyM(t(xJSZ$5k_^%AbFbVib$-Z_Oug}xd7PX6S-*k4lUE1D*-ivDoW1us^j9B3Ay zi#b`NCEmr7mUuT){yvKhb1`^-<*>5?TxbPUdys_&=_scBq!FLXlz%niM>FNejrcsK z{JjyMpKkYz_%Vzx=4T^u?_$TWK?^%`F%KKE#E)gF9nEIt!m4r4v)LGN?_%Sa_hl>m zc;*|j!XL{94qD+SU@gRGH$>$^>#5r5>{u>#JR7p4KLMxaSn-*dZf}izPQ(TxEBceL z_reOVdJ`EgKXYJRp1qsOV8k8JutE=0;{@4#V2!{#vhqJwM!emI{+|-B#u+MCbx45t zt8vF2lFzLYuf{ut5`Qo74t5foFUy5Te*Ko?k57+lCQAG%s3#8SU5#6oO8iB@Ta`Bg zJkO6DKbh05F{S%G8$O#PA2mKR^QkrQxyy#nPRU1&@63D_n)p0p!)Kr5qsE73K8s9z z`1=wT_VB9Y)ALOsNWR|@w;}i!lA9WLn)%n6_z!{JO8%QApB`xld>l|Mo-9XQZFm$>}GI@K<+ByxG4!#`%o&ORoU0 z_AzEl`VjDw;5U5IzctCgW6(rd(Vq$YX|O9bo?k2J%WddefFGBgpuFE=gTG($SL1o* ze+Ge{6BUAZ{|@8vrb@cN!Kh*Kqg;4wi*`^@Mn0lt8p z$fipE0?XJ}CH+vTz|ebRbkPYNlx}R1c$Tk;v9%m8aM}M?*x+~C;2*HTzryjJ^n3#C z_owR>3_!iezq#ExB}rwG&N80Z;4m)U;Q$(U%*6!ReoB5C%LKlpJOHcT{iSD0Z;N&^N`ps#jkfc zJ=!U$M|y9LuCt*~s$XipYLv9|%OqaS=kfQ(L4Uo(tNA>7hl;L`I9}Xm|4+e$5AiSf zxxmt1W4h*WytvQ)Zv=iEM1il78SRL3p#w&w~O>fa^9HU$)(FH@oJuvzmElcgyT7h;qN9%-}_sEo+U$n z3_R&k%`d8c-Muz^elO|OJfG70i@+JxGS*9Lz)oWOWC zavZb@^j7WZH*EOy+TeHDv=>95CqJO(k5L?c{hi~XM>&pGdUQZRyxyHF=;+-@x>|rA zhyGQmN&az8FKDv=x7grsk^K8Yf|}l$qw5zo^nb9y9|E5H?OR2B{+z9S{TaH}NxZpVv5oU7U}_x%+2hyElKz0~XZoc)vGtV8 zd1$eqgPY>llfYBC)O?H-5Bm$Jmqb}04~4ZV?_`dLfBU^4zFDSww!{za5qNr6g09<9 zK9Yl)S5fw`lG6*C?Em{EAFs^+Mj8014gG%LiN9JOQu2AzhF(L1LUK^^QD~<5RS!Jb zvs&Lmbbhr0Pj)-_ka(tdBIw${@!~%F|4KCG5Nz0~$61#v3_Qu9{~1B3^0rmt&HaIwC0?zQDY^X(cokPB z$-%L3NyJ~R6Ut#NI|F#qyIN0@-EcMwcq={&Z14kEZy1l49@RRJO1s&HzK7${&%atw z(t8wiT@O6<2h8Jz+im!`PO#2rkqy3)YJB-=TZ?(bSW`n=m2LF@|{vgMD zSpEGXKlH8>U1Q)V$j;R|C%uf>Y#ji~*qH??1dz>{B6>zRnouZw}_{-jeptA4^&l24K3Bh|wCBz?d1 zhY%OPe#-e5FtvWI{QP~APm|=M(%r}T$jDjXEl!_>khf0hXNF`yjo!DS>x;l!$)OQ= zF8^l)ouUZ>PxVW!KP#DkQ}S2q|8({VT~~6vxX=C{0-nav=5grTz*D-hYC+Ar%H2WIpiGTlX0;8sNu9SRwC7+ct!i~U_ zeoKEQ5RXW?{e@+ zZ14|oJj#2A$jw&B|_I;;8k4^81er$ z=aY>Q_s3wJ+)6K1Huw%3{3XC!+3f>1^e@`rKeoY7@e2K_{XQ5b@axMQe>_wBbCmz7 z0G{O5dyk+~{loJ)Uf{C-yMU+sd%q^I`(@x>;H~82m}HHgVuSw*$3u_55{y;5v)qQh z19-A$wa-MAx0~aSXKMe9D(_{$Bda5>n}Mftsr5`uTk&f@@K)vezy?3&G$GHXXGMHz zZtN7`t?aEFcuH68*9psXS8zV^Aq#v%(wqBZSKH7(Bk9$CrKOVB>k{85$5T@zeh&9z zki#N@Q1hIX60i0#sd4xBZ2aDC8~jtiQ+fNO-_~Th?*VTmpYfBe^)(52;-l7=l^?hg zcq@I~XM=y%2LBJ>y)tjvU@Qbh{fE7Bo}oqtehGM9t`33NE%C*`Tji$)c&qa2Huy_8 zAM~SSyRXJm+id7x0G{%5;5LzwTA82YPq)rbkqw^dt3KtCu7^D_xN>Gy7g#nf|16nS zeb$-u^Gtr0S*-MZ<}7F9aOikvg!nF~TUuULr|UQxS+CWb!=b|FSPVjGNY<6;dMHZA z6qD3(tnz1h_%k>*e8wD&CF#Nu!=fl7@p?j?v205bqhptCLqj-uR?2C~TwQOAbn4CP z*7;}ZdNQi76GwZKz~<;2@AuElKAXF?xgqKIh;y3 z`bMALQNO66M6dVH()F%@9u6gvdNR;f)zMI{Zz$wPdn1#v!lGic5~=8Vhd5qY&Xrn6OQRkFkNqn>TO{h`y19E|qewTH47L=` znLT%oHIa^Um_vFX9uKV7acpjUJ!_2zI)ZvjXGh0+M9F&6$xaQVx?a7kY%xw7Us9>- zAYQQK9KEVWB5Nv_F}?EKC1s0iD-dRg++sxFyxllzfV85e)zuA9QDa$oT@|>(!9{1q zI+In+rKJn%YRfBDuGD807Ey&+ZaAJAJaHy@B&vs_&HVggNw3c=oLLABu3BO`{hNC` zo;Hqg4@cvrrAsQ#S=Lb1pcfbV3jK5E&ZR?#O*M12IF-H1keR}nGkJb+*1NF6P!tw7 z(gcmMC`*|G$a!umR}{vBt%c+a5PNng!Vi;&(Azq3JTZ9*e@UV}+D+A~HHm|YA=g$M z9ZiMHKJvRlIP#hP?l`_8rniWL%k^ky5|Z?RKG+gS28i9Pz#1IItd5U2oK{a^gAZc{12#C_hm)Buh|g*mxpHsT;#1fk-qF4hCaJoiwk(N%w0ra)%47UTT*9 zlJueMC2NE0V{x1;UA2sgJeNzNBLLGfWq@R9%z$3I6yF1A2}ShIL=fh;s*@#puz|p zqQk-cv*_CaIBdS5JCtm0NAp863$$eNW-Vi`XaB53Fu5WWsfgn9ck7Z>^>cK}e1hx_ z(gJVn=L^9*@U#D674?gZm6BvZ{y3nop>x`G)WhcX(o$5}vhrHpUr3b+jFg{*$+UJx z_(}Y=bl5q$=!Ti(GUrh18N{L5(Pmh90_SbRZ&FBAS9WUv=O3Z-$-_E*D=)x(FUT5- zK*^mem$UeqKs<`Wy^ZGA-4^8ev#$2M9B_~P0|Lf~u#j*tV#IX>JDNL8_MKIoN1oI# zL?J%*Aic^6yOoZmVZ>(~$m&U$8UIm&!qi4ky~~TKp;T422%o+PTiG&NAZS$BeN>t} zysl5LYM8AXELQ+$@V}tQsqnoyS?%>sJ7_`ZamTpz=SanSWakIK-x zKw=mz$Vw4y!&iWKTQyQQ!n?s25xu}!=nDu3%sU!0Wv6l(`WtfiEP5b* z-VmW*jhbe5goYkmB-jm>_LAi6X8Ho?AatRbz?VK+8`0%m9Bq+&4U&-!OS)R2&xM{P zA2DDAKqCffp=0YaI6ogmkdgB0X6!-x=d_{#>%|938u*u_RKvQA_lFFL%N{b6W%|Gn ze6RTnO{6o~-GZdDx?9{`EyBm0n#sH|SS`V*t~-Pel~gsejwm{=9f3qvZ`shxluau7 zZJ}hQh+^Pl>3V4tuxh4{Hw+`k2fUjmTl`{l#>6m5AgWNwe4UZdH#&oQEE%V7Q>jrA zLW){~t%1&PQg6WwKr$%Cz>sm5aquI0HbM}xg%Ca162!w`v?EbPVs5Mzy|<38!EX5$SoIxlSFe?lWf^dZ%Bp{G%z&HY*=;Wnj6uPE7nIk zK7)rk!rl_e3~m=+8Y7t%k(?sk9R_a&l&J!h@Cqcq0A#8`?NWZ=k#XOJbBPIxXB=mY zaEwHiZbYb~P=TH#jM6li02v=+9i2NiTPp@OyiQn7@d)3OU1yHu<86oQC5t{&rkK2n zGhm-7H<@P0Rublgaj(n9Ex% zoFqTuxNfj2S$$+nqU!x8cfKV>F$Y9#NUZMI**U=#x6p85v2lK)+_hhXz&A=EQ?B zOh%xlQE5MM29yuX@EJkNkqxHHO{L>4v*>*Y_Gxc^gf>Y{S4Ss(NVBQ~)BVjIVAI%; zRvSGn&r%96LOPAi;0s@Ov>AMfIYHS1G%nBPEb6J4p@r*9MwRoDQ_`VmbJB$3>CdJa z>~PSs;S<%_Cn`Vny{pKsGa5Uh&xRhxsQk>;9i}v>qxu?*7kTdu$zjeUJ$}zFk>1*oM5#6ytgmn; z9~7fwp(eJAYEe+C=>|H6ZanXv+j{JbdgLf299q+?HzzuI8zuDTFUoXaX%Za`Svi1? z4?SWGjzuLtLyF-r>{+0w+n4FS@{Sp*Rf)b>1nW@@@cBXrC14tum^-5xzdxcMb=XN+ zqfX^f4BiU!nt>jc)l9j?9F3{+Amx#3L{?s-u|bTY zr~xz?0&K%_5XfidEIKqkJ}g^;E?2tHN9c)*=##IsWY9rA7IBUp9jJ?^wup+#ND*m@DsTqxtPO>Kp+=$-n~O^x*+NcJmv%woQ*cvSPOWE^SX zs_cAby*9;=R|qu&nNE(cfYsqU&SB^LD2?bimkqXJIQ^R6R zBmCK7f}d)S)NAIW;wF9SZP=F}xr^m<%*lLW(_-?8hiztPvd6BOLCA;3`3N(~Y^rUEc3$CVO*icqkG%J2?DdL?-=pKC3W)k5I*}uLE8JxoyEG%) z3|5#}-;oTg0Yt}@!*+GYM_Vygh)=8s3$d^}1AAuV6SnCTuIUVgTV{k>SRp;N2Qcs| zY*`-xKLPP|cpiceoG0iT?AZ@G!s3|!qX_aY7EZE4>R_@$+!nS)aYL)qtdM)T!g!Q# zWhe}`%grk7EnuRaz`Yr30Q^Jh*xN%cnKKjnSOgDsPkbnKu;e)nbcC95LmMRu(TQZ( zsY4%$PRhM{{|UghbLPO$DVeDAZ4|^daKlBk*%!8B^0UKK{6=}Bpf{Ts_iod(AJ4Rh zR>e=s8wIhw(r}sMS0WUj1y-+hrO(w-=j*h~*qVgueKEy!32x}!3za?&ff1L4JF)Ma zF4`|lWmoalKH=rS5vhu=&goH5ozn&qewpR>bztcXG!ROif5 ze2Qa^eisJP)%!9cbfo=kMnHCabuN*D11jT^f!YtN;I*ds>ii-FRen|a z>RG{?O!3t@M+#nYqlzh@N>^cTF~wKsAt@+d-&5ox>d%j5e5Jo0xu0CYJ|$Sm!JFnJ zZtesi`KkEod?f|x8}iwgx&A$X!0hAwiP2S1ffb?(WI9OBAYDgV#>sq__m13`G@IUQe}|Ma|!ujmv9^{n7Q1W-yUeRWRM zkczJYBm)&s@uSG3B1NXolNuf^^4}yCqtvM4D?8eOxY_Bea~^Btftc#O2$i0SuOKCp z9Y6hkR)I)=s){I~il@+HK}I;0e|65zR2jcs5lX1?t`aXq_P{p5S!i!vqJW~)o zE8EQ`T`AKq!TT?C;dLNJ@A9hrEB{6HOXVH6>8tn4BBgUrPowyaN?&1VZ@yLhH_s82 Lr -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include "usart.h" -#include "driverexception.h" -#include "timeoutexception.h" - -// wichtig für die Register-Zugriffe -#define _AVR_IO_H_ 1 // Erzwinge die Inklusion -#include "/usr/lib/avr/include/avr/sfr_defs.h" -#include "/usr/lib/avr/include/avr/iom1284p.h" - -typedef std::function errorhandler_t; - - -/*! main driver class */ - -class B15F -{ -private: - // privater Konstruktor - B15F(void); -public: - - /************************************* - * Grundfunktionen des B15F Treibers * - *************************************/ - - /** - * Versucht die Verbindung zum B15 wiederherzustellen - * \throws DriverException - */ - void reconnect(void); - - /** - * Verwirft Daten im USART Puffer auf dieser Maschine und B15 - * \throws DriverException - */ - void discard(void); - - /** - * Testet die USART Verbindung auf Funktion - * \throws DriverException - */ - bool testConnection(void); - - /** - * Testet die Integer Konvertierung der USART Verbindung - * \throws DriverException - */ - bool testIntConv(void); - - /** - * Liefert Informationen zur aktuellen Firmware des B15 - * \throws DriverException - */ - std::vector getBoardInfo(void); - - /** - * Lässt den Treiber für eine angegebene Zeit pausieren - * \param ms Verzögerung in Millisekunden - */ - void delay_ms(uint16_t ms); - - /** - * Lässt den Treiber für eine angegebene Zeit pausieren - * \param us Verzögerung in Microsekunden - */ - void delay_us(uint16_t us); - - /** - * Liefert eine Referenz zur aktuellen Treiber-Instanz - * @throws DriverException - */ - static B15F& getInstance(void); - - /** - * Führt ein Befehl auf dieser Maschine aus und liefert stdout zurück - * \param cmd Der Befehl - */ - static std::string exec(std::string cmd); - - /** - * Multithread sicherer Abbruch des B15F-Treibers - * \param msg Beschreibung der Abbruchursache - */ - static void abort(std::string msg); - - /** - * Multithread sicherer Abbruch des B15F-Treibers - * \param ex Exception als Abbruchursache - */ - static void abort(std::exception& ex); - - /** - * Setzt eine Fehlerbehandlungsroutine für den Treiberabbruch (abort) - * \param func Funktion, die Exception als Parameter bekommt - */ - static void setAbortHandler(errorhandler_t func); - - /*************************************/ - - - - /************************* - * Steuerbefehle für B15 * - *************************/ - - /** - * Versetzt das Board in den Selbsttest-Modus - * WICHTIG: Es darf dabei nichts an den Klemmen angeschlossen sein! - * \throws DriverException - */ - bool activateSelfTestMode(void); - - /** - * Setzt den Wert des digitalen Ausgabeports 0 - * \param port Wert für gesamten Port - * \throws DriverException - */ - bool digitalWrite0(uint8_t); - - /** - * Setzt den Wert des digitalen Ausgabeports 1 - * \param port Wert für gesamten Port - * \throws DriverException - */ - bool digitalWrite1(uint8_t); - - /** - * Liest den Wert des digitalen Eingabeports 0 - * \return Wert für gesamten Port - * \throws DriverException - */ - uint8_t digitalRead0(void); - - /** - * Liest den Wert des digitalen Eingabeports 1 - * \return Wert für gesamten Port - * \throws DriverException - */ - uint8_t digitalRead1(void); - - /** - * Liest den Wert des digitalen Eingabeports, an dem der DIP-switch angeschlossen ist (S7) - * \return Wert für gesamten Port - * \throws DriverException - */ - uint8_t readDipSwitch(void); - - /** - * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 0 - * \param port 10-Bit Wert - * \throws DriverException - */ - bool analogWrite0(uint16_t port); - - /** - * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 1 - * \param port 10-Bit Wert - * \throws DriverException - */ - bool analogWrite1(uint16_t port); - - /** - * Liest den Wert des Analog-Digital-Converters (ADC / ADU) - * \param channel Kanalwahl von 0 - 7 - * \throws DriverException - */ - uint16_t analogRead(uint8_t channel); - - /** - * DAC 0 wird auf den Startwert gesetzt und dann schrittweise um Delta inkrementiert. - * Für jeden eingestelleten DAC-Wert werden zwei ADCs (channel_a und channel_b) angesprochen und die Werte übermittelt. - * Die Werte werden in buffer_a für Kanal a und buffer_b für Kanal b gespeichert. - * \param channel_a Auswahl des ADC a, von 0 - 7 - * \param buffer_a Speichertort für Werte des Kanals a - * \param offset_a Anzahl an Werten des Kanals a, die im Speicher übersprungen werden sollen - * \param channel_b Auswahl des ADC b, von 0 - 7 - * \param buffer_b Speichertort für Werte des Kanals b - * \param offset_b Anzahl an Werten des Kanals b, die im Speicher übersprungen werden - * \param start Startwert des DACs - * \param delta Schrittweite, mit welcher der DAC inkrementiert wird - * \param count Anzahl an Inkrementierungen - * \throws DriverException - */ - void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count); - - /** - * Setzt die Register so, dass näherungsweise die gewünschte Frequenz erzeugt wird. - * Ist freq == 0 wird PWM deaktiviert. - * Standardfrequenz: 31300 (empfohlen, da dann TOP == 255) - * \param freq PWM Frequenz - * \return Top Wert des PWM Value für die gesetzte Frequenz - * \throws DriverException - */ - uint8_t pwmSetFrequency(uint32_t freq); - - /** - * Setzt den PWM Wert. - * \param value PWM Wert [0..0xFF] - * \throws DriverException - */ - bool pwmSetValue(uint8_t value); - - /** - * Setzt direkt den Wert eines MCU Registers. - * *Wichtig:* bei einer falschen Adresse kann das Board 15 ernsthaften Schaden nehmen! - * \param adr Speicheradresse des Registers - * \param val Neuer Wert für das Register - * \throws DriverException - */ - bool setRegister(volatile uint8_t* adr, uint8_t val); - - /** - * Liefert den Wert eines MCU Registers. - * \param adr Speicheradresse des Registers - * \throws DriverException - */ - uint8_t getRegister(volatile uint8_t* adr); - - /*************************/ - - - // CONSTANTS - const std::string PRE = "[B15F] "; //!< B15F stdout prefix - constexpr static uint8_t MSG_OK = 0xFF; //!< Value to acknowledge a received command - constexpr static uint8_t MSG_FAIL = 0xFE; //!< Value to reject a received command - constexpr static uint16_t RECONNECT_TIMEOUT = 64; //!< Time in ms after which a reconnect attempt aborts - constexpr static uint16_t WDT_TIMEOUT = 15; //!< Time in ms after which the watch dog timer resets the MCU - constexpr static uint8_t RECONNECT_TRIES = 3; //!< Maximum count of reconnect attempts after which the driver stops - constexpr static uint32_t BAUDRATE = 57600; //!< USART baudrate for communication with the MCU - -private: - - /** - * Initialisiert und testet die Verbindung zum B15 - * \throws DriverException - */ - void init(void); - - USART usart; - static B15F* instance; - static errorhandler_t errorhandler; - - // REQUESTS - constexpr static uint8_t RQ_DISC = 0; - constexpr static uint8_t RQ_TEST = 1; - constexpr static uint8_t RQ_INFO = 2; - constexpr static uint8_t RQ_INT = 3; - constexpr static uint8_t RQ_ST = 4; - constexpr static uint8_t RQ_BA0 = 5; - constexpr static uint8_t RQ_BA1 = 6; - constexpr static uint8_t RQ_BE0 = 7; - constexpr static uint8_t RQ_BE1 = 8; - constexpr static uint8_t RQ_DSW = 9; - constexpr static uint8_t RQ_AA0 = 10; - constexpr static uint8_t RQ_AA1 = 11; - constexpr static uint8_t RQ_ADC = 12; - constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; - constexpr static uint8_t RQ_PWM_SET_FREQ = 14; - constexpr static uint8_t RQ_PWM_SET_VALUE = 15; - constexpr static uint8_t RQ_SET_REG = 16; - constexpr static uint8_t RQ_GET_REG = 17; -}; - -#endif // B15F_H diff --git a/control/src/drv/plottyfile.cpp.orig b/control/src/drv/plottyfile.cpp.orig deleted file mode 100644 index 355abb8..0000000 --- a/control/src/drv/plottyfile.cpp.orig +++ /dev/null @@ -1,201 +0,0 @@ -#include "plottyfile.h" - -void PlottyFile::addDot(Dot& dot) -{ - dots.push_back(dot); -} - -void PlottyFile::addDot(Dot dot) -{ - dots.push_back(dot); -} - -void PlottyFile::setFunctionType(FunctionType function_type) -{ - this->function_type = function_type; -} - -void PlottyFile::setQuadrant(uint8_t quadrant) -{ - if(quadrant < 1 || quadrant > 4) - throw std::range_error("Ungueltiger Quadrant"); - this->quadrant = quadrant; -} - -void PlottyFile::setRefX(uint16_t ref_x) -{ - this->ref_x = ref_x; -} - -void PlottyFile::setRefY(uint16_t ref_y) -{ - this->ref_y = ref_y; -} - -void PlottyFile::setParaFirstCurve(uint16_t para_first) -{ - this->para_first = para_first; -} - -void PlottyFile::setParaStepWidth(uint16_t para_stepwidth) -{ - this->para_stepwidth = para_stepwidth; -} - -void PlottyFile::setUnitX(std::string unit_x) -{ - this->unit_x = unit_x; -} - -void PlottyFile::setDescX(std::string desc_x) -{ - this->desc_x = desc_x; -} - -void PlottyFile::setUnitY(std::string unit_y) -{ - this->unit_y = unit_y; -} - -void PlottyFile::setDescY(std::string desc_y) -{ - this->desc_y = desc_y; -} - -void PlottyFile::setUnitPara(std::string unit_para) -{ - this->unit_para = unit_para; -} - -void PlottyFile::setDescPara(std::string desc_para) -{ - this->desc_para = desc_para; -} - -FunctionType PlottyFile::getFunctionType() const -{ - return function_type; -} - -uint8_t PlottyFile::getQuadrant() const -{ - return quadrant; -} - -uint16_t PlottyFile::getRefX() const -{ - return ref_x; -} - -uint16_t PlottyFile::getRefY() const -{ - return ref_y; -} - -uint16_t PlottyFile::getParaFirstCurve() const -{ - return para_first; -} - -uint16_t PlottyFile::getParaStepWidth() const -{ - return para_stepwidth; -} - -std::string PlottyFile::getUnitX() const -{ - return unit_x; -} - -std::string PlottyFile::getDescX() const -{ - return desc_x; -} - -std::string PlottyFile::getUnitY() const -{ - return unit_y; -} - -std::string PlottyFile::getDescY() const -{ - return desc_y; -} - -std::string PlottyFile::getUnitPara() const -{ - return unit_para; -} - -std::string PlottyFile::getDescPara() const -{ - return desc_para; -} - -void PlottyFile::prepStr(std::string& str, uint8_t len) -{ - if(str.length() > len) - throw std::runtime_error("Zu grosser String."); - - if(str.length() != len) - str += '\n'; - - while(str.length() < len) - str += '\0'; -} - -void PlottyFile::writeToFile(std::string filename) -{ - if(dots.empty()) - throw std::length_error("Es wurden keine Punkte gespeichert."); - - prepStr(unit_x, STR_LEN_SHORT); - prepStr(desc_x, STR_LEN_LARGE); - prepStr(unit_y, STR_LEN_SHORT); - prepStr(desc_y, STR_LEN_LARGE); - prepStr(unit_para, STR_LEN_SHORT); - prepStr(desc_para, STR_LEN_LARGE); - - std::ofstream file(filename); - - // write file header - file.write(reinterpret_cast(&command), 1); - file.write(head.c_str(), head.length()); - file.write(filetype.c_str(), filetype.length()); - file.write(reinterpret_cast(&version), 2); - file.write(reinterpret_cast(&subversion), 2); - file.put(static_cast(function_type)); - file.write(reinterpret_cast(&quadrant), 1); - file.write(reinterpret_cast(&ref_x), 2); - file.write(reinterpret_cast(&ref_y), 2); - file.write(reinterpret_cast(¶_first), 2); - file.write(reinterpret_cast(¶_stepwidth), 2); - file.write(unit_x.c_str(), unit_x.length()); - file.write(desc_x.c_str(), desc_x.length()); - file.write(unit_y.c_str(), unit_y.length()); - file.write(desc_y.c_str(), desc_y.length()); - file.write(unit_para.c_str(), unit_para.length()); - file.write(desc_para.c_str(), desc_para.length()); - file.write(reinterpret_cast(&eof), 1); - - // make sure header size is 256 Byte - while(file.tellp() < 256) - file.put(0); - - for(Dot& dot : dots) - { - file.put((dot.getX() >> 8) | (static_cast(dot.getCurve()) << 2)); - file.put(dot.getX() & 0xFF); - file.put(dot.getY() >> 8); - file.put(dot.getY() & 0xFF); - } - - file.close(); -} - -void PlottyFile::startPlotty(std::string filename) -{ - int code = system(("plotty --in " + filename).c_str()); - if(code) - throw std::runtime_error("Fehler beim Aufruf von plotty"); -} diff --git a/docs/html/CMakeCCompilerId_8c_source.html b/docs/html/CMakeCCompilerId_8c_source.html new file mode 100644 index 0000000..c74d885 --- /dev/null +++ b/docs/html/CMakeCCompilerId_8c_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/3.14.3/CompilerIdC/CMakeCCompilerId.c Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          CMakeCCompilerId.c
          +
          +
          +
          1 #ifdef __cplusplus
          2 # error "A C++ compiler has been selected for C."
          3 #endif
          4 
          5 #if defined(__18CXX)
          6 # define ID_VOID_MAIN
          7 #endif
          8 #if defined(__CLASSIC_C__)
          9 /* cv-qualifiers did not exist in K&R C */
          10 # define const
          11 # define volatile
          12 #endif
          13 
          14 
          15 /* Version number components: V=Version, R=Revision, P=Patch
          16  Version date components: YYYY=Year, MM=Month, DD=Day */
          17 
          18 #if defined(__INTEL_COMPILER) || defined(__ICC)
          19 # define COMPILER_ID "Intel"
          20 # if defined(_MSC_VER)
          21 # define SIMULATE_ID "MSVC"
          22 # endif
          23 /* __INTEL_COMPILER = VRP */
          24 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
          25 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
          26 # if defined(__INTEL_COMPILER_UPDATE)
          27 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
          28 # else
          29 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
          30 # endif
          31 # if defined(__INTEL_COMPILER_BUILD_DATE)
          32 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
          33 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
          34 # endif
          35 # if defined(_MSC_VER)
          36 /* _MSC_VER = VVRR */
          37 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
          38 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
          39 # endif
          40 
          41 #elif defined(__PATHCC__)
          42 # define COMPILER_ID "PathScale"
          43 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
          44 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
          45 # if defined(__PATHCC_PATCHLEVEL__)
          46 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
          47 # endif
          48 
          49 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
          50 # define COMPILER_ID "Embarcadero"
          51 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
          52 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
          53 # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
          54 
          55 #elif defined(__BORLANDC__)
          56 # define COMPILER_ID "Borland"
          57 /* __BORLANDC__ = 0xVRR */
          58 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
          59 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
          60 
          61 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
          62 # define COMPILER_ID "Watcom"
          63 /* __WATCOMC__ = VVRR */
          64 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
          65 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
          66 # if (__WATCOMC__ % 10) > 0
          67 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
          68 # endif
          69 
          70 #elif defined(__WATCOMC__)
          71 # define COMPILER_ID "OpenWatcom"
          72 /* __WATCOMC__ = VVRP + 1100 */
          73 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
          74 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
          75 # if (__WATCOMC__ % 10) > 0
          76 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
          77 # endif
          78 
          79 #elif defined(__SUNPRO_C)
          80 # define COMPILER_ID "SunPro"
          81 # if __SUNPRO_C >= 0x5100
          82 /* __SUNPRO_C = 0xVRRP */
          83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12)
          84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF)
          85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
          86 # else
          87 /* __SUNPRO_CC = 0xVRP */
          88 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8)
          89 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF)
          90 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
          91 # endif
          92 
          93 #elif defined(__HP_cc)
          94 # define COMPILER_ID "HP"
          95 /* __HP_cc = VVRRPP */
          96 # define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000)
          97 # define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100)
          98 # define COMPILER_VERSION_PATCH DEC(__HP_cc % 100)
          99 
          100 #elif defined(__DECC)
          101 # define COMPILER_ID "Compaq"
          102 /* __DECC_VER = VVRRTPPPP */
          103 # define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000)
          104 # define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100)
          105 # define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000)
          106 
          107 #elif defined(__IBMC__) && defined(__COMPILER_VER__)
          108 # define COMPILER_ID "zOS"
          109 # if defined(__ibmxl__)
          110 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
          111 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
          112 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
          113 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
          114 # else
          115 /* __IBMC__ = VRP */
          116 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
          117 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
          118 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
          119 # endif
          120 
          121 
          122 #elif defined(__ibmxl__) || (defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800)
          123 # define COMPILER_ID "XL"
          124 # if defined(__ibmxl__)
          125 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
          126 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
          127 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
          128 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
          129 # else
          130 /* __IBMC__ = VRP */
          131 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
          132 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
          133 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
          134 # endif
          135 
          136 
          137 #elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800
          138 # define COMPILER_ID "VisualAge"
          139 # if defined(__ibmxl__)
          140 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
          141 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
          142 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
          143 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
          144 # else
          145 /* __IBMC__ = VRP */
          146 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
          147 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
          148 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
          149 # endif
          150 
          151 
          152 #elif defined(__PGI)
          153 # define COMPILER_ID "PGI"
          154 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
          155 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
          156 # if defined(__PGIC_PATCHLEVEL__)
          157 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
          158 # endif
          159 
          160 #elif defined(_CRAYC)
          161 # define COMPILER_ID "Cray"
          162 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
          163 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
          164 
          165 #elif defined(__TI_COMPILER_VERSION__)
          166 # define COMPILER_ID "TI"
          167 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
          168 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
          169 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
          170 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
          171 
          172 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
          173 # define COMPILER_ID "Fujitsu"
          174 
          175 #elif defined(__ghs__)
          176 # define COMPILER_ID "GHS"
          177 /* __GHS_VERSION_NUMBER = VVVVRP */
          178 # ifdef __GHS_VERSION_NUMBER
          179 # define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
          180 # define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
          181 # define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
          182 # endif
          183 
          184 #elif defined(__TINYC__)
          185 # define COMPILER_ID "TinyCC"
          186 
          187 #elif defined(__BCC__)
          188 # define COMPILER_ID "Bruce"
          189 
          190 #elif defined(__SCO_VERSION__)
          191 # define COMPILER_ID "SCO"
          192 
          193 #elif defined(__ARMCC_VERSION) && !defined(__clang__)
          194 # define COMPILER_ID "ARMCC"
          195 #if __ARMCC_VERSION >= 1000000
          196 /* __ARMCC_VERSION = VRRPPPP */
          197 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
          198 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
          199 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
          200 #else
          201 /* __ARMCC_VERSION = VRPPPP */
          202 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
          203 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
          204 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
          205 #endif
          206 
          207 
          208 #elif defined(__clang__) && defined(__apple_build_version__)
          209 # define COMPILER_ID "AppleClang"
          210 # if defined(_MSC_VER)
          211 # define SIMULATE_ID "MSVC"
          212 # endif
          213 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
          214 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
          215 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
          216 # if defined(_MSC_VER)
          217 /* _MSC_VER = VVRR */
          218 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
          219 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
          220 # endif
          221 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
          222 
          223 #elif defined(__clang__)
          224 # define COMPILER_ID "Clang"
          225 # if defined(_MSC_VER)
          226 # define SIMULATE_ID "MSVC"
          227 # endif
          228 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
          229 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
          230 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
          231 # if defined(_MSC_VER)
          232 /* _MSC_VER = VVRR */
          233 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
          234 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
          235 # endif
          236 
          237 #elif defined(__GNUC__)
          238 # define COMPILER_ID "GNU"
          239 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
          240 # if defined(__GNUC_MINOR__)
          241 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
          242 # endif
          243 # if defined(__GNUC_PATCHLEVEL__)
          244 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
          245 # endif
          246 
          247 #elif defined(_MSC_VER)
          248 # define COMPILER_ID "MSVC"
          249 /* _MSC_VER = VVRR */
          250 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
          251 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
          252 # if defined(_MSC_FULL_VER)
          253 # if _MSC_VER >= 1400
          254 /* _MSC_FULL_VER = VVRRPPPPP */
          255 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
          256 # else
          257 /* _MSC_FULL_VER = VVRRPPPP */
          258 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
          259 # endif
          260 # endif
          261 # if defined(_MSC_BUILD)
          262 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
          263 # endif
          264 
          265 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
          266 # define COMPILER_ID "ADSP"
          267 #if defined(__VISUALDSPVERSION__)
          268 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
          269 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
          270 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
          271 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
          272 #endif
          273 
          274 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
          275 # define COMPILER_ID "IAR"
          276 # if defined(__VER__) && defined(__ICCARM__)
          277 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
          278 # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
          279 # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
          280 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
          281 # elif defined(__VER__) && defined(__ICCAVR__)
          282 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
          283 # define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
          284 # define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
          285 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
          286 # endif
          287 
          288 #elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC)
          289 # define COMPILER_ID "SDCC"
          290 # if defined(__SDCC_VERSION_MAJOR)
          291 # define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR)
          292 # define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR)
          293 # define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH)
          294 # else
          295 /* SDCC = VRP */
          296 # define COMPILER_VERSION_MAJOR DEC(SDCC/100)
          297 # define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10)
          298 # define COMPILER_VERSION_PATCH DEC(SDCC % 10)
          299 # endif
          300 
          301 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
          302 # define COMPILER_ID "MIPSpro"
          303 # if defined(_SGI_COMPILER_VERSION)
          304 /* _SGI_COMPILER_VERSION = VRP */
          305 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
          306 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
          307 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
          308 # else
          309 /* _COMPILER_VERSION = VRP */
          310 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
          311 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
          312 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
          313 # endif
          314 
          315 
          316 /* These compilers are either not known or too old to define an
          317  identification macro. Try to identify the platform and guess that
          318  it is the native compiler. */
          319 #elif defined(__hpux) || defined(__hpua)
          320 # define COMPILER_ID "HP"
          321 
          322 #else /* unknown compiler */
          323 # define COMPILER_ID ""
          324 #endif
          325 
          326 /* Construct the string literal in pieces to prevent the source from
          327  getting matched. Store it in a pointer rather than an array
          328  because some compilers will just produce instructions to fill the
          329  array rather than assigning a pointer to a static array. */
          330 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
          331 #ifdef SIMULATE_ID
          332 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
          333 #endif
          334 
          335 #ifdef __QNXNTO__
          336 char const* qnxnto = "INFO" ":" "qnxnto[]";
          337 #endif
          338 
          339 #if defined(__CRAYXE) || defined(__CRAYXC)
          340 char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
          341 #endif
          342 
          343 #define STRINGIFY_HELPER(X) #X
          344 #define STRINGIFY(X) STRINGIFY_HELPER(X)
          345 
          346 /* Identify known platforms by name. */
          347 #if defined(__linux) || defined(__linux__) || defined(linux)
          348 # define PLATFORM_ID "Linux"
          349 
          350 #elif defined(__CYGWIN__)
          351 # define PLATFORM_ID "Cygwin"
          352 
          353 #elif defined(__MINGW32__)
          354 # define PLATFORM_ID "MinGW"
          355 
          356 #elif defined(__APPLE__)
          357 # define PLATFORM_ID "Darwin"
          358 
          359 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
          360 # define PLATFORM_ID "Windows"
          361 
          362 #elif defined(__FreeBSD__) || defined(__FreeBSD)
          363 # define PLATFORM_ID "FreeBSD"
          364 
          365 #elif defined(__NetBSD__) || defined(__NetBSD)
          366 # define PLATFORM_ID "NetBSD"
          367 
          368 #elif defined(__OpenBSD__) || defined(__OPENBSD)
          369 # define PLATFORM_ID "OpenBSD"
          370 
          371 #elif defined(__sun) || defined(sun)
          372 # define PLATFORM_ID "SunOS"
          373 
          374 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
          375 # define PLATFORM_ID "AIX"
          376 
          377 #elif defined(__hpux) || defined(__hpux__)
          378 # define PLATFORM_ID "HP-UX"
          379 
          380 #elif defined(__HAIKU__)
          381 # define PLATFORM_ID "Haiku"
          382 
          383 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
          384 # define PLATFORM_ID "BeOS"
          385 
          386 #elif defined(__QNX__) || defined(__QNXNTO__)
          387 # define PLATFORM_ID "QNX"
          388 
          389 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
          390 # define PLATFORM_ID "Tru64"
          391 
          392 #elif defined(__riscos) || defined(__riscos__)
          393 # define PLATFORM_ID "RISCos"
          394 
          395 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
          396 # define PLATFORM_ID "SINIX"
          397 
          398 #elif defined(__UNIX_SV__)
          399 # define PLATFORM_ID "UNIX_SV"
          400 
          401 #elif defined(__bsdos__)
          402 # define PLATFORM_ID "BSDOS"
          403 
          404 #elif defined(_MPRAS) || defined(MPRAS)
          405 # define PLATFORM_ID "MP-RAS"
          406 
          407 #elif defined(__osf) || defined(__osf__)
          408 # define PLATFORM_ID "OSF1"
          409 
          410 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
          411 # define PLATFORM_ID "SCO_SV"
          412 
          413 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
          414 # define PLATFORM_ID "ULTRIX"
          415 
          416 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
          417 # define PLATFORM_ID "Xenix"
          418 
          419 #elif defined(__WATCOMC__)
          420 # if defined(__LINUX__)
          421 # define PLATFORM_ID "Linux"
          422 
          423 # elif defined(__DOS__)
          424 # define PLATFORM_ID "DOS"
          425 
          426 # elif defined(__OS2__)
          427 # define PLATFORM_ID "OS2"
          428 
          429 # elif defined(__WINDOWS__)
          430 # define PLATFORM_ID "Windows3x"
          431 
          432 # else /* unknown platform */
          433 # define PLATFORM_ID
          434 # endif
          435 
          436 #elif defined(__INTEGRITY)
          437 # if defined(INT_178B)
          438 # define PLATFORM_ID "Integrity178"
          439 
          440 # else /* regular Integrity */
          441 # define PLATFORM_ID "Integrity"
          442 # endif
          443 
          444 #else /* unknown platform */
          445 # define PLATFORM_ID
          446 
          447 #endif
          448 
          449 /* For windows compilers MSVC and Intel we can determine
          450  the architecture of the compiler being used. This is because
          451  the compilers do not have flags that can change the architecture,
          452  but rather depend on which compiler is being used
          453 */
          454 #if defined(_WIN32) && defined(_MSC_VER)
          455 # if defined(_M_IA64)
          456 # define ARCHITECTURE_ID "IA64"
          457 
          458 # elif defined(_M_X64) || defined(_M_AMD64)
          459 # define ARCHITECTURE_ID "x64"
          460 
          461 # elif defined(_M_IX86)
          462 # define ARCHITECTURE_ID "X86"
          463 
          464 # elif defined(_M_ARM64)
          465 # define ARCHITECTURE_ID "ARM64"
          466 
          467 # elif defined(_M_ARM)
          468 # if _M_ARM == 4
          469 # define ARCHITECTURE_ID "ARMV4I"
          470 # elif _M_ARM == 5
          471 # define ARCHITECTURE_ID "ARMV5I"
          472 # else
          473 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
          474 # endif
          475 
          476 # elif defined(_M_MIPS)
          477 # define ARCHITECTURE_ID "MIPS"
          478 
          479 # elif defined(_M_SH)
          480 # define ARCHITECTURE_ID "SHx"
          481 
          482 # else /* unknown architecture */
          483 # define ARCHITECTURE_ID ""
          484 # endif
          485 
          486 #elif defined(__WATCOMC__)
          487 # if defined(_M_I86)
          488 # define ARCHITECTURE_ID "I86"
          489 
          490 # elif defined(_M_IX86)
          491 # define ARCHITECTURE_ID "X86"
          492 
          493 # else /* unknown architecture */
          494 # define ARCHITECTURE_ID ""
          495 # endif
          496 
          497 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
          498 # if defined(__ICCARM__)
          499 # define ARCHITECTURE_ID "ARM"
          500 
          501 # elif defined(__ICCAVR__)
          502 # define ARCHITECTURE_ID "AVR"
          503 
          504 # else /* unknown architecture */
          505 # define ARCHITECTURE_ID ""
          506 # endif
          507 
          508 #elif defined(__ghs__)
          509 # if defined(__PPC64__)
          510 # define ARCHITECTURE_ID "PPC64"
          511 
          512 # elif defined(__ppc__)
          513 # define ARCHITECTURE_ID "PPC"
          514 
          515 # elif defined(__ARM__)
          516 # define ARCHITECTURE_ID "ARM"
          517 
          518 # elif defined(__x86_64__)
          519 # define ARCHITECTURE_ID "x64"
          520 
          521 # elif defined(__i386__)
          522 # define ARCHITECTURE_ID "X86"
          523 
          524 # else /* unknown architecture */
          525 # define ARCHITECTURE_ID ""
          526 # endif
          527 #else
          528 # define ARCHITECTURE_ID
          529 #endif
          530 
          531 /* Convert integer to decimal digit literals. */
          532 #define DEC(n) \
          533  ('0' + (((n) / 10000000)%10)), \
          534  ('0' + (((n) / 1000000)%10)), \
          535  ('0' + (((n) / 100000)%10)), \
          536  ('0' + (((n) / 10000)%10)), \
          537  ('0' + (((n) / 1000)%10)), \
          538  ('0' + (((n) / 100)%10)), \
          539  ('0' + (((n) / 10)%10)), \
          540  ('0' + ((n) % 10))
          541 
          542 /* Convert integer to hex digit literals. */
          543 #define HEX(n) \
          544  ('0' + ((n)>>28 & 0xF)), \
          545  ('0' + ((n)>>24 & 0xF)), \
          546  ('0' + ((n)>>20 & 0xF)), \
          547  ('0' + ((n)>>16 & 0xF)), \
          548  ('0' + ((n)>>12 & 0xF)), \
          549  ('0' + ((n)>>8 & 0xF)), \
          550  ('0' + ((n)>>4 & 0xF)), \
          551  ('0' + ((n) & 0xF))
          552 
          553 /* Construct a string literal encoding the version number components. */
          554 #ifdef COMPILER_VERSION_MAJOR
          555 char const info_version[] =
          556 {
          557  'I', 'N', 'F', 'O', ':',
          558  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
          559  COMPILER_VERSION_MAJOR,
          560 # ifdef COMPILER_VERSION_MINOR
          561  '.', COMPILER_VERSION_MINOR,
          562 # ifdef COMPILER_VERSION_PATCH
          563  '.', COMPILER_VERSION_PATCH,
          564 # ifdef COMPILER_VERSION_TWEAK
          565  '.', COMPILER_VERSION_TWEAK,
          566 # endif
          567 # endif
          568 # endif
          569  ']','\0'
          570 };
          571 #endif
          572 
          573 /* Construct a string literal encoding the internal version number. */
          574 #ifdef COMPILER_VERSION_INTERNAL
          575 char const info_version_internal[] =
          576 {
          577  'I', 'N', 'F', 'O', ':',
          578  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
          579  'i','n','t','e','r','n','a','l','[',
          580  COMPILER_VERSION_INTERNAL,']','\0'
          581 };
          582 #endif
          583 
          584 /* Construct a string literal encoding the version number components. */
          585 #ifdef SIMULATE_VERSION_MAJOR
          586 char const info_simulate_version[] =
          587 {
          588  'I', 'N', 'F', 'O', ':',
          589  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
          590  SIMULATE_VERSION_MAJOR,
          591 # ifdef SIMULATE_VERSION_MINOR
          592  '.', SIMULATE_VERSION_MINOR,
          593 # ifdef SIMULATE_VERSION_PATCH
          594  '.', SIMULATE_VERSION_PATCH,
          595 # ifdef SIMULATE_VERSION_TWEAK
          596  '.', SIMULATE_VERSION_TWEAK,
          597 # endif
          598 # endif
          599 # endif
          600  ']','\0'
          601 };
          602 #endif
          603 
          604 /* Construct the string literal in pieces to prevent the source from
          605  getting matched. Store it in a pointer rather than an array
          606  because some compilers will just produce instructions to fill the
          607  array rather than assigning a pointer to a static array. */
          608 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
          609 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
          610 
          611 
          612 
          613 
          614 #if !defined(__STDC__)
          615 # if (defined(_MSC_VER) && !defined(__clang__)) \
          616  || (defined(__ibmxl__) || defined(__IBMC__))
          617 # define C_DIALECT "90"
          618 # else
          619 # define C_DIALECT
          620 # endif
          621 #elif __STDC_VERSION__ >= 201000L
          622 # define C_DIALECT "11"
          623 #elif __STDC_VERSION__ >= 199901L
          624 # define C_DIALECT "99"
          625 #else
          626 # define C_DIALECT "90"
          627 #endif
          628 const char* info_language_dialect_default =
          629  "INFO" ":" "dialect_default[" C_DIALECT "]";
          630 
          631 /*--------------------------------------------------------------------------*/
          632 
          633 #ifdef ID_VOID_MAIN
          634 void main() {}
          635 #else
          636 # if defined(__CLASSIC_C__)
          637 int main(argc, argv) int argc;
          638 char *argv[];
          639 # else
          640 int main(int argc, char* argv[])
          641 # endif
          642 {
          643  int require = 0;
          644  require += info_compiler[argc];
          645  require += info_platform[argc];
          646  require += info_arch[argc];
          647 #ifdef COMPILER_VERSION_MAJOR
          648  require += info_version[argc];
          649 #endif
          650 #ifdef COMPILER_VERSION_INTERNAL
          651  require += info_version_internal[argc];
          652 #endif
          653 #ifdef SIMULATE_ID
          654  require += info_simulate[argc];
          655 #endif
          656 #ifdef SIMULATE_VERSION_MAJOR
          657  require += info_simulate_version[argc];
          658 #endif
          659 #if defined(__CRAYXE) || defined(__CRAYXC)
          660  require += info_cray[argc];
          661 #endif
          662  require += info_language_dialect_default[argc];
          663  (void)argv;
          664  return require;
          665 }
          666 #endif
          + + + + diff --git a/docs/html/CMakeCXXCompilerId_8cpp_source.html b/docs/html/CMakeCXXCompilerId_8cpp_source.html new file mode 100644 index 0000000..1965e96 --- /dev/null +++ b/docs/html/CMakeCXXCompilerId_8cpp_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/3.14.3/CompilerIdCXX/CMakeCXXCompilerId.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          CMakeCXXCompilerId.cpp
          +
          +
          +
          1 /* This source file must have a .cpp extension so that all C++ compilers
          2  recognize the extension without flags. Borland does not know .cxx for
          3  example. */
          4 #ifndef __cplusplus
          5 # error "A C compiler has been selected for C++."
          6 #endif
          7 
          8 
          9 /* Version number components: V=Version, R=Revision, P=Patch
          10  Version date components: YYYY=Year, MM=Month, DD=Day */
          11 
          12 #if defined(__COMO__)
          13 # define COMPILER_ID "Comeau"
          14 /* __COMO_VERSION__ = VRR */
          15 # define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
          16 # define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
          17 
          18 #elif defined(__INTEL_COMPILER) || defined(__ICC)
          19 # define COMPILER_ID "Intel"
          20 # if defined(_MSC_VER)
          21 # define SIMULATE_ID "MSVC"
          22 # endif
          23 /* __INTEL_COMPILER = VRP */
          24 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
          25 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
          26 # if defined(__INTEL_COMPILER_UPDATE)
          27 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
          28 # else
          29 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
          30 # endif
          31 # if defined(__INTEL_COMPILER_BUILD_DATE)
          32 /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
          33 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
          34 # endif
          35 # if defined(_MSC_VER)
          36 /* _MSC_VER = VVRR */
          37 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
          38 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
          39 # endif
          40 
          41 #elif defined(__PATHCC__)
          42 # define COMPILER_ID "PathScale"
          43 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
          44 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
          45 # if defined(__PATHCC_PATCHLEVEL__)
          46 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
          47 # endif
          48 
          49 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
          50 # define COMPILER_ID "Embarcadero"
          51 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
          52 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
          53 # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
          54 
          55 #elif defined(__BORLANDC__)
          56 # define COMPILER_ID "Borland"
          57 /* __BORLANDC__ = 0xVRR */
          58 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
          59 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
          60 
          61 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
          62 # define COMPILER_ID "Watcom"
          63 /* __WATCOMC__ = VVRR */
          64 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
          65 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
          66 # if (__WATCOMC__ % 10) > 0
          67 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
          68 # endif
          69 
          70 #elif defined(__WATCOMC__)
          71 # define COMPILER_ID "OpenWatcom"
          72 /* __WATCOMC__ = VVRP + 1100 */
          73 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
          74 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
          75 # if (__WATCOMC__ % 10) > 0
          76 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
          77 # endif
          78 
          79 #elif defined(__SUNPRO_CC)
          80 # define COMPILER_ID "SunPro"
          81 # if __SUNPRO_CC >= 0x5100
          82 /* __SUNPRO_CC = 0xVRRP */
          83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
          84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
          85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
          86 # else
          87 /* __SUNPRO_CC = 0xVRP */
          88 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
          89 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
          90 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
          91 # endif
          92 
          93 #elif defined(__HP_aCC)
          94 # define COMPILER_ID "HP"
          95 /* __HP_aCC = VVRRPP */
          96 # define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
          97 # define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
          98 # define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
          99 
          100 #elif defined(__DECCXX)
          101 # define COMPILER_ID "Compaq"
          102 /* __DECCXX_VER = VVRRTPPPP */
          103 # define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
          104 # define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100)
          105 # define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
          106 
          107 #elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
          108 # define COMPILER_ID "zOS"
          109 # if defined(__ibmxl__)
          110 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
          111 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
          112 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
          113 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
          114 # else
          115 /* __IBMCPP__ = VRP */
          116 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
          117 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
          118 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
          119 # endif
          120 
          121 
          122 #elif defined(__ibmxl__) || (defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800)
          123 # define COMPILER_ID "XL"
          124 # if defined(__ibmxl__)
          125 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
          126 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
          127 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
          128 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
          129 # else
          130 /* __IBMCPP__ = VRP */
          131 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
          132 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
          133 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
          134 # endif
          135 
          136 
          137 #elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
          138 # define COMPILER_ID "VisualAge"
          139 # if defined(__ibmxl__)
          140 # define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
          141 # define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
          142 # define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
          143 # define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
          144 # else
          145 /* __IBMCPP__ = VRP */
          146 # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
          147 # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
          148 # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
          149 # endif
          150 
          151 
          152 #elif defined(__PGI)
          153 # define COMPILER_ID "PGI"
          154 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
          155 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
          156 # if defined(__PGIC_PATCHLEVEL__)
          157 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
          158 # endif
          159 
          160 #elif defined(_CRAYC)
          161 # define COMPILER_ID "Cray"
          162 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
          163 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
          164 
          165 #elif defined(__TI_COMPILER_VERSION__)
          166 # define COMPILER_ID "TI"
          167 /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
          168 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
          169 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
          170 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
          171 
          172 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
          173 # define COMPILER_ID "Fujitsu"
          174 
          175 #elif defined(__ghs__)
          176 # define COMPILER_ID "GHS"
          177 /* __GHS_VERSION_NUMBER = VVVVRP */
          178 # ifdef __GHS_VERSION_NUMBER
          179 # define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
          180 # define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
          181 # define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
          182 # endif
          183 
          184 #elif defined(__SCO_VERSION__)
          185 # define COMPILER_ID "SCO"
          186 
          187 #elif defined(__ARMCC_VERSION) && !defined(__clang__)
          188 # define COMPILER_ID "ARMCC"
          189 #if __ARMCC_VERSION >= 1000000
          190 /* __ARMCC_VERSION = VRRPPPP */
          191 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
          192 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
          193 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
          194 #else
          195 /* __ARMCC_VERSION = VRPPPP */
          196 # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
          197 # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
          198 # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
          199 #endif
          200 
          201 
          202 #elif defined(__clang__) && defined(__apple_build_version__)
          203 # define COMPILER_ID "AppleClang"
          204 # if defined(_MSC_VER)
          205 # define SIMULATE_ID "MSVC"
          206 # endif
          207 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
          208 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
          209 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
          210 # if defined(_MSC_VER)
          211 /* _MSC_VER = VVRR */
          212 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
          213 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
          214 # endif
          215 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
          216 
          217 #elif defined(__clang__)
          218 # define COMPILER_ID "Clang"
          219 # if defined(_MSC_VER)
          220 # define SIMULATE_ID "MSVC"
          221 # endif
          222 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
          223 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
          224 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
          225 # if defined(_MSC_VER)
          226 /* _MSC_VER = VVRR */
          227 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
          228 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
          229 # endif
          230 
          231 #elif defined(__GNUC__) || defined(__GNUG__)
          232 # define COMPILER_ID "GNU"
          233 # if defined(__GNUC__)
          234 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
          235 # else
          236 # define COMPILER_VERSION_MAJOR DEC(__GNUG__)
          237 # endif
          238 # if defined(__GNUC_MINOR__)
          239 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
          240 # endif
          241 # if defined(__GNUC_PATCHLEVEL__)
          242 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
          243 # endif
          244 
          245 #elif defined(_MSC_VER)
          246 # define COMPILER_ID "MSVC"
          247 /* _MSC_VER = VVRR */
          248 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
          249 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
          250 # if defined(_MSC_FULL_VER)
          251 # if _MSC_VER >= 1400
          252 /* _MSC_FULL_VER = VVRRPPPPP */
          253 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
          254 # else
          255 /* _MSC_FULL_VER = VVRRPPPP */
          256 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
          257 # endif
          258 # endif
          259 # if defined(_MSC_BUILD)
          260 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
          261 # endif
          262 
          263 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
          264 # define COMPILER_ID "ADSP"
          265 #if defined(__VISUALDSPVERSION__)
          266 /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
          267 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
          268 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
          269 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
          270 #endif
          271 
          272 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
          273 # define COMPILER_ID "IAR"
          274 # if defined(__VER__) && defined(__ICCARM__)
          275 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
          276 # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
          277 # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
          278 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
          279 # elif defined(__VER__) && defined(__ICCAVR__)
          280 # define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
          281 # define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
          282 # define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
          283 # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
          284 # endif
          285 
          286 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
          287 # define COMPILER_ID "MIPSpro"
          288 # if defined(_SGI_COMPILER_VERSION)
          289 /* _SGI_COMPILER_VERSION = VRP */
          290 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
          291 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
          292 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
          293 # else
          294 /* _COMPILER_VERSION = VRP */
          295 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
          296 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
          297 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
          298 # endif
          299 
          300 
          301 /* These compilers are either not known or too old to define an
          302  identification macro. Try to identify the platform and guess that
          303  it is the native compiler. */
          304 #elif defined(__hpux) || defined(__hpua)
          305 # define COMPILER_ID "HP"
          306 
          307 #else /* unknown compiler */
          308 # define COMPILER_ID ""
          309 #endif
          310 
          311 /* Construct the string literal in pieces to prevent the source from
          312  getting matched. Store it in a pointer rather than an array
          313  because some compilers will just produce instructions to fill the
          314  array rather than assigning a pointer to a static array. */
          315 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
          316 #ifdef SIMULATE_ID
          317 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
          318 #endif
          319 
          320 #ifdef __QNXNTO__
          321 char const* qnxnto = "INFO" ":" "qnxnto[]";
          322 #endif
          323 
          324 #if defined(__CRAYXE) || defined(__CRAYXC)
          325 char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
          326 #endif
          327 
          328 #define STRINGIFY_HELPER(X) #X
          329 #define STRINGIFY(X) STRINGIFY_HELPER(X)
          330 
          331 /* Identify known platforms by name. */
          332 #if defined(__linux) || defined(__linux__) || defined(linux)
          333 # define PLATFORM_ID "Linux"
          334 
          335 #elif defined(__CYGWIN__)
          336 # define PLATFORM_ID "Cygwin"
          337 
          338 #elif defined(__MINGW32__)
          339 # define PLATFORM_ID "MinGW"
          340 
          341 #elif defined(__APPLE__)
          342 # define PLATFORM_ID "Darwin"
          343 
          344 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
          345 # define PLATFORM_ID "Windows"
          346 
          347 #elif defined(__FreeBSD__) || defined(__FreeBSD)
          348 # define PLATFORM_ID "FreeBSD"
          349 
          350 #elif defined(__NetBSD__) || defined(__NetBSD)
          351 # define PLATFORM_ID "NetBSD"
          352 
          353 #elif defined(__OpenBSD__) || defined(__OPENBSD)
          354 # define PLATFORM_ID "OpenBSD"
          355 
          356 #elif defined(__sun) || defined(sun)
          357 # define PLATFORM_ID "SunOS"
          358 
          359 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
          360 # define PLATFORM_ID "AIX"
          361 
          362 #elif defined(__hpux) || defined(__hpux__)
          363 # define PLATFORM_ID "HP-UX"
          364 
          365 #elif defined(__HAIKU__)
          366 # define PLATFORM_ID "Haiku"
          367 
          368 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
          369 # define PLATFORM_ID "BeOS"
          370 
          371 #elif defined(__QNX__) || defined(__QNXNTO__)
          372 # define PLATFORM_ID "QNX"
          373 
          374 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
          375 # define PLATFORM_ID "Tru64"
          376 
          377 #elif defined(__riscos) || defined(__riscos__)
          378 # define PLATFORM_ID "RISCos"
          379 
          380 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
          381 # define PLATFORM_ID "SINIX"
          382 
          383 #elif defined(__UNIX_SV__)
          384 # define PLATFORM_ID "UNIX_SV"
          385 
          386 #elif defined(__bsdos__)
          387 # define PLATFORM_ID "BSDOS"
          388 
          389 #elif defined(_MPRAS) || defined(MPRAS)
          390 # define PLATFORM_ID "MP-RAS"
          391 
          392 #elif defined(__osf) || defined(__osf__)
          393 # define PLATFORM_ID "OSF1"
          394 
          395 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
          396 # define PLATFORM_ID "SCO_SV"
          397 
          398 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
          399 # define PLATFORM_ID "ULTRIX"
          400 
          401 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
          402 # define PLATFORM_ID "Xenix"
          403 
          404 #elif defined(__WATCOMC__)
          405 # if defined(__LINUX__)
          406 # define PLATFORM_ID "Linux"
          407 
          408 # elif defined(__DOS__)
          409 # define PLATFORM_ID "DOS"
          410 
          411 # elif defined(__OS2__)
          412 # define PLATFORM_ID "OS2"
          413 
          414 # elif defined(__WINDOWS__)
          415 # define PLATFORM_ID "Windows3x"
          416 
          417 # else /* unknown platform */
          418 # define PLATFORM_ID
          419 # endif
          420 
          421 #elif defined(__INTEGRITY)
          422 # if defined(INT_178B)
          423 # define PLATFORM_ID "Integrity178"
          424 
          425 # else /* regular Integrity */
          426 # define PLATFORM_ID "Integrity"
          427 # endif
          428 
          429 #else /* unknown platform */
          430 # define PLATFORM_ID
          431 
          432 #endif
          433 
          434 /* For windows compilers MSVC and Intel we can determine
          435  the architecture of the compiler being used. This is because
          436  the compilers do not have flags that can change the architecture,
          437  but rather depend on which compiler is being used
          438 */
          439 #if defined(_WIN32) && defined(_MSC_VER)
          440 # if defined(_M_IA64)
          441 # define ARCHITECTURE_ID "IA64"
          442 
          443 # elif defined(_M_X64) || defined(_M_AMD64)
          444 # define ARCHITECTURE_ID "x64"
          445 
          446 # elif defined(_M_IX86)
          447 # define ARCHITECTURE_ID "X86"
          448 
          449 # elif defined(_M_ARM64)
          450 # define ARCHITECTURE_ID "ARM64"
          451 
          452 # elif defined(_M_ARM)
          453 # if _M_ARM == 4
          454 # define ARCHITECTURE_ID "ARMV4I"
          455 # elif _M_ARM == 5
          456 # define ARCHITECTURE_ID "ARMV5I"
          457 # else
          458 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
          459 # endif
          460 
          461 # elif defined(_M_MIPS)
          462 # define ARCHITECTURE_ID "MIPS"
          463 
          464 # elif defined(_M_SH)
          465 # define ARCHITECTURE_ID "SHx"
          466 
          467 # else /* unknown architecture */
          468 # define ARCHITECTURE_ID ""
          469 # endif
          470 
          471 #elif defined(__WATCOMC__)
          472 # if defined(_M_I86)
          473 # define ARCHITECTURE_ID "I86"
          474 
          475 # elif defined(_M_IX86)
          476 # define ARCHITECTURE_ID "X86"
          477 
          478 # else /* unknown architecture */
          479 # define ARCHITECTURE_ID ""
          480 # endif
          481 
          482 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
          483 # if defined(__ICCARM__)
          484 # define ARCHITECTURE_ID "ARM"
          485 
          486 # elif defined(__ICCAVR__)
          487 # define ARCHITECTURE_ID "AVR"
          488 
          489 # else /* unknown architecture */
          490 # define ARCHITECTURE_ID ""
          491 # endif
          492 
          493 #elif defined(__ghs__)
          494 # if defined(__PPC64__)
          495 # define ARCHITECTURE_ID "PPC64"
          496 
          497 # elif defined(__ppc__)
          498 # define ARCHITECTURE_ID "PPC"
          499 
          500 # elif defined(__ARM__)
          501 # define ARCHITECTURE_ID "ARM"
          502 
          503 # elif defined(__x86_64__)
          504 # define ARCHITECTURE_ID "x64"
          505 
          506 # elif defined(__i386__)
          507 # define ARCHITECTURE_ID "X86"
          508 
          509 # else /* unknown architecture */
          510 # define ARCHITECTURE_ID ""
          511 # endif
          512 #else
          513 # define ARCHITECTURE_ID
          514 #endif
          515 
          516 /* Convert integer to decimal digit literals. */
          517 #define DEC(n) \
          518  ('0' + (((n) / 10000000)%10)), \
          519  ('0' + (((n) / 1000000)%10)), \
          520  ('0' + (((n) / 100000)%10)), \
          521  ('0' + (((n) / 10000)%10)), \
          522  ('0' + (((n) / 1000)%10)), \
          523  ('0' + (((n) / 100)%10)), \
          524  ('0' + (((n) / 10)%10)), \
          525  ('0' + ((n) % 10))
          526 
          527 /* Convert integer to hex digit literals. */
          528 #define HEX(n) \
          529  ('0' + ((n)>>28 & 0xF)), \
          530  ('0' + ((n)>>24 & 0xF)), \
          531  ('0' + ((n)>>20 & 0xF)), \
          532  ('0' + ((n)>>16 & 0xF)), \
          533  ('0' + ((n)>>12 & 0xF)), \
          534  ('0' + ((n)>>8 & 0xF)), \
          535  ('0' + ((n)>>4 & 0xF)), \
          536  ('0' + ((n) & 0xF))
          537 
          538 /* Construct a string literal encoding the version number components. */
          539 #ifdef COMPILER_VERSION_MAJOR
          540 char const info_version[] =
          541 {
          542  'I', 'N', 'F', 'O', ':',
          543  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
          544  COMPILER_VERSION_MAJOR,
          545 # ifdef COMPILER_VERSION_MINOR
          546  '.', COMPILER_VERSION_MINOR,
          547 # ifdef COMPILER_VERSION_PATCH
          548  '.', COMPILER_VERSION_PATCH,
          549 # ifdef COMPILER_VERSION_TWEAK
          550  '.', COMPILER_VERSION_TWEAK,
          551 # endif
          552 # endif
          553 # endif
          554  ']','\0'
          555 };
          556 #endif
          557 
          558 /* Construct a string literal encoding the internal version number. */
          559 #ifdef COMPILER_VERSION_INTERNAL
          560 char const info_version_internal[] =
          561 {
          562  'I', 'N', 'F', 'O', ':',
          563  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
          564  'i','n','t','e','r','n','a','l','[',
          565  COMPILER_VERSION_INTERNAL,']','\0'
          566 };
          567 #endif
          568 
          569 /* Construct a string literal encoding the version number components. */
          570 #ifdef SIMULATE_VERSION_MAJOR
          571 char const info_simulate_version[] =
          572 {
          573  'I', 'N', 'F', 'O', ':',
          574  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
          575  SIMULATE_VERSION_MAJOR,
          576 # ifdef SIMULATE_VERSION_MINOR
          577  '.', SIMULATE_VERSION_MINOR,
          578 # ifdef SIMULATE_VERSION_PATCH
          579  '.', SIMULATE_VERSION_PATCH,
          580 # ifdef SIMULATE_VERSION_TWEAK
          581  '.', SIMULATE_VERSION_TWEAK,
          582 # endif
          583 # endif
          584 # endif
          585  ']','\0'
          586 };
          587 #endif
          588 
          589 /* Construct the string literal in pieces to prevent the source from
          590  getting matched. Store it in a pointer rather than an array
          591  because some compilers will just produce instructions to fill the
          592  array rather than assigning a pointer to a static array. */
          593 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
          594 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
          595 
          596 
          597 
          598 
          599 #if defined(_MSC_VER) && defined(_MSVC_LANG)
          600 #define CXX_STD _MSVC_LANG
          601 #else
          602 #define CXX_STD __cplusplus
          603 #endif
          604 
          605 const char* info_language_dialect_default = "INFO" ":" "dialect_default["
          606 #if CXX_STD > 201703L
          607  "20"
          608 #elif CXX_STD >= 201703L
          609  "17"
          610 #elif CXX_STD >= 201402L
          611  "14"
          612 #elif CXX_STD >= 201103L
          613  "11"
          614 #else
          615  "98"
          616 #endif
          617  "]";
          618 
          619 /*--------------------------------------------------------------------------*/
          620 
          621 int main(int argc, char* argv[])
          622 {
          623  int require = 0;
          624  require += info_compiler[argc];
          625  require += info_platform[argc];
          626 #ifdef COMPILER_VERSION_MAJOR
          627  require += info_version[argc];
          628 #endif
          629 #ifdef COMPILER_VERSION_INTERNAL
          630  require += info_version_internal[argc];
          631 #endif
          632 #ifdef SIMULATE_ID
          633  require += info_simulate[argc];
          634 #endif
          635 #ifdef SIMULATE_VERSION_MAJOR
          636  require += info_simulate_version[argc];
          637 #endif
          638 #if defined(__CRAYXE) || defined(__CRAYXC)
          639  require += info_cray[argc];
          640 #endif
          641  require += info_language_dialect_default[argc];
          642  (void)argv;
          643  return require;
          644 }
          + + + + diff --git a/docs/html/annotated.html b/docs/html/annotated.html new file mode 100644 index 0000000..deff929 --- /dev/null +++ b/docs/html/annotated.html @@ -0,0 +1,93 @@ + + + + + + + +B15F: Class List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + +
          + +
          +
          + + +
          + +
          + +
          +
          +
          Class List
          +
          +
          +
          Here are the classes, structs, unions and interfaces with brief descriptions:
          +
          + + + + diff --git a/docs/html/b15f_8cpp_source.html b/docs/html/b15f_8cpp_source.html new file mode 100644 index 0000000..4201243 --- /dev/null +++ b/docs/html/b15f_8cpp_source.html @@ -0,0 +1,120 @@ + + + + + + + +B15F: drv/b15f.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          b15f.cpp
          +
          +
          +
          1 #include "b15f.h"
          2 
          3 B15F *B15F::instance = nullptr;
          4 errorhandler_t B15F::errorhandler = nullptr;
          5 
          6 B15F::B15F()
          7 {
          8  init();
          9 }
          10 
          11 void B15F::init()
          12 {
          13 
          14  std::string device = exec("bash -c 'ls /dev/ttyUSB*'");
          15  while (device.find(' ') != std::string::npos || device.find('\n') != std::string::npos ||
          16  device.find('\t') != std::string::npos)
          17  device.pop_back();
          18 
          19  if (device.length() == 0)
          20  abort("Adapter nicht gefunden");
          21 
          22  std::cout << PRE << "Verwende Adapter: " << device << std::endl;
          23 
          24 
          25  std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush;
          26  usart.setBaudrate(BAUDRATE);
          27  usart.openDevice(device);
          28  std::cout << "OK" << std::endl;
          29 
          30 
          31  std::cout << PRE << "Teste Verbindung... " << std::flush;
          32  uint8_t tries = 3;
          33  while (tries--)
          34  {
          35  // verwerfe Daten, die µC noch hat
          36  //discard();
          37 
          38  if (!testConnection())
          39  continue;
          40 
          41  if (!testIntConv())
          42  continue;
          43 
          44  break;
          45  }
          46  if (tries == 0)
          47  abort("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
          48  std::cout << "OK" << std::endl;
          49 
          50 
          51  // Gib board info aus
          52  std::vector<std::string> info = getBoardInfo();
          53  std::cout << PRE << "AVR Firmware Version: " << info[0] << " um " << info[1] << " Uhr (" << info[2] << ")"
          54  << std::endl;
          55 }
          56 
          58 {
          59  uint8_t tries = RECONNECT_TRIES;
          60  while (tries--)
          61  {
          63  discard();
          64 
          65  if (testConnection())
          66  return;
          67  }
          68 
          69  abort("Verbindung kann nicht repariert werden");
          70 }
          71 
          72 void B15F::discard(void)
          73 {
          74  try
          75  {
          76  uint8_t rq[] =
          77  {
          78  RQ_DISC
          79  };
          80 
          81  usart.clearOutputBuffer();
          82  for (uint8_t i = 0; i < 16; i++)
          83  {
          84  usart.transmit(&rq[0], 0, sizeof(rq)); // sende discard Befehl (verwerfe input)
          85  delay_ms(4);
          86  }
          87  usart.clearInputBuffer();
          88  }
          89  catch (std::exception &ex)
          90  {
          91  abort(ex);
          92  }
          93 }
          94 
          96 {
          97  // erzeuge zufälliges Byte
          98  srand(time(NULL));
          99  uint8_t dummy = rand() % 256;
          100 
          101  uint8_t rq[] =
          102  {
          103  RQ_TEST,
          104  dummy
          105  };
          106  usart.transmit(&rq[0], 0, sizeof(rq));
          107 
          108  uint8_t aw[2];
          109  usart.receive(&aw[0], 0, sizeof(aw));
          110 
          111  return aw[0] == MSG_OK && aw[1] == dummy;
          112 }
          113 
          115 {
          116  srand(time(NULL));
          117  uint16_t dummy = rand() % (0xFFFF / 3);
          118 
          119  uint8_t rq[] =
          120  {
          121  RQ_INT,
          122  static_cast<uint8_t >(dummy & 0xFF),
          123  static_cast<uint8_t >(dummy >> 8)
          124  };
          125  usart.transmit(&rq[0], 0, sizeof(rq));
          126 
          127  uint16_t aw;
          128  usart.receive(reinterpret_cast<uint8_t *>(&aw), 0, sizeof(aw));
          129 
          130  return aw == dummy * 3;
          131 }
          132 
          133 
          134 std::vector<std::string> B15F::getBoardInfo(void)
          135 {
          136  std::vector<std::string> info;
          137 
          138  uint8_t rq[] =
          139  {
          140  RQ_INFO
          141  };
          142  usart.transmit(&rq[0], 0, sizeof(rq));
          143 
          144  uint8_t n;
          145  usart.receive(&n, 0, sizeof(n));
          146  while (n--)
          147  {
          148  uint8_t len;
          149  usart.receive(&len, 0, sizeof(len));
          150 
          151  char str[len + 1];
          152  str[len] = '\0';
          153  usart.receive(reinterpret_cast<uint8_t *>(&str[0]), 0, len);
          154 
          155  info.push_back(std::string(str));
          156  }
          157 
          158  uint8_t aw;
          159  usart.receive(&aw, 0, sizeof(aw));
          160  if (aw != MSG_OK)
          161  abort("Board Info fehlerhalft: code " + std::to_string((int) aw));
          162 
          163  return info;
          164 }
          165 
          167 {
          168  uint8_t rq[] =
          169  {
          170  RQ_ST
          171  };
          172  usart.transmit(&rq[0], 0, sizeof(rq));
          173 
          174  uint8_t aw;
          175  usart.receive(&aw, 0, sizeof(aw));
          176  return aw == MSG_OK;
          177 }
          178 
          179 bool B15F::digitalWrite0(uint8_t port)
          180 {
          181  uint8_t rq[] =
          182  {
          183  RQ_BA0,
          184  port
          185  };
          186  usart.transmit(&rq[0], 0, sizeof(rq));
          187 
          188  uint8_t aw;
          189  usart.receive(&aw, 0, sizeof(aw));
          190  return aw == MSG_OK;
          191 }
          192 
          193 bool B15F::digitalWrite1(uint8_t port)
          194 {
          195  uint8_t rq[] =
          196  {
          197  RQ_BA1,
          198  port
          199  };
          200  usart.transmit(&rq[0], 0, sizeof(rq));
          201 
          202  uint8_t aw;
          203  usart.receive(&aw, 0, sizeof(aw));
          204  return aw == MSG_OK;
          205 }
          206 
          208 {
          209  usart.clearInputBuffer();
          210  uint8_t rq[] =
          211  {
          212  RQ_BE0
          213  };
          214  usart.transmit(&rq[0], 0, sizeof(rq));
          215 
          216  uint8_t aw;
          217  usart.receive(&aw, 0, sizeof(aw));
          218  return aw;
          219 }
          220 
          222 {
          223  usart.clearInputBuffer();
          224  uint8_t rq[] =
          225  {
          226  RQ_BE1
          227  };
          228  usart.transmit(&rq[0], 0, sizeof(rq));
          229 
          230  uint8_t aw;
          231  usart.receive(&aw, 0, sizeof(aw));
          232  return aw;
          233 }
          234 
          236 {
          237  usart.clearInputBuffer();
          238  uint8_t rq[] =
          239  {
          240  RQ_DSW
          241  };
          242  usart.transmit(&rq[0], 0, sizeof(rq));
          243 
          244  uint8_t aw;
          245  usart.receive(&aw, 0, sizeof(aw));
          246  return aw;
          247 }
          248 
          249 bool B15F::analogWrite0(uint16_t value)
          250 {
          251  uint8_t rq[] =
          252  {
          253  RQ_AA0,
          254  static_cast<uint8_t >(value & 0xFF),
          255  static_cast<uint8_t >(value >> 8)
          256  };
          257  usart.transmit(&rq[0], 0, sizeof(rq));
          258 
          259  uint8_t aw;
          260  usart.receive(&aw, 0, sizeof(aw));
          261  return aw == MSG_OK;
          262 }
          263 
          264 bool B15F::analogWrite1(uint16_t value)
          265 {
          266  uint8_t rq[] =
          267  {
          268  RQ_AA1,
          269  static_cast<uint8_t >(value & 0xFF),
          270  static_cast<uint8_t >(value >> 8)
          271  };
          272  usart.transmit(&rq[0], 0, sizeof(rq));
          273 
          274  uint8_t aw;
          275  usart.receive(&aw, 0, sizeof(aw));
          276  return aw == MSG_OK;
          277 }
          278 
          279 uint16_t B15F::analogRead(uint8_t channel)
          280 {
          281  usart.clearInputBuffer();
          282  if (channel > 7)
          283  abort("Bad ADC channel: " + std::to_string(channel));
          284 
          285  uint8_t rq[] =
          286  {
          287  RQ_ADC,
          288  channel
          289  };
          290 
          291  usart.transmit(&rq[0], 0, sizeof(rq));
          292 
          293  uint16_t aw;
          294  usart.receive(reinterpret_cast<uint8_t *>(&aw), 0, sizeof(aw));
          295 
          296  if (aw > 1023)
          297  abort("Bad ADC data detected (1)");
          298  return aw;
          299 }
          300 
          301 void
          302 B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b,
          303  uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
          304 {
          305  // prepare pointers
          306  buffer_a += offset_a;
          307  buffer_b += offset_b;
          308 
          309 
          310  usart.clearInputBuffer();
          311  uint8_t rq[] =
          312  {
          313  RQ_ADC_DAC_STROKE,
          314  channel_a,
          315  channel_b,
          316  static_cast<uint8_t >(start & 0xFF),
          317  static_cast<uint8_t >(start >> 8),
          318  static_cast<uint8_t >(delta & 0xFF),
          319  static_cast<uint8_t >(delta >> 8),
          320  static_cast<uint8_t >(count & 0xFF),
          321  static_cast<uint8_t >(count >> 8)
          322  };
          323 
          324  usart.transmit(&rq[0], 0, sizeof(rq));
          325 
          326  for (uint16_t i = 0; i < count; i++)
          327  {
          328  if (buffer_a)
          329  {
          330  usart.receive(reinterpret_cast<uint8_t *>(&buffer_a[i]), 0, 2);
          331 
          332  if (buffer_a[i] > 1023) // check for broken usart connection
          333  abort("Bad ADC data detected (2)");
          334  }
          335  else
          336  {
          337  usart.drop(2);
          338  }
          339 
          340  if (buffer_b)
          341  {
          342  usart.receive(reinterpret_cast<uint8_t *>(&buffer_b[i]), 0, 2);
          343 
          344  if (buffer_b[i] > 1023) // check for broken usart connection
          345  abort("Bad ADC data detected (3)");
          346  }
          347  else
          348  {
          349  usart.drop(2);
          350  }
          351  }
          352 
          353  uint8_t aw;
          354  usart.receive(&aw, 0, sizeof(aw));
          355  if(aw != MSG_OK)
          356  abort("Sequenz unterbrochen");
          357 }
          358 
          359 uint8_t B15F::pwmSetFrequency(uint32_t freq)
          360 {
          361  usart.clearInputBuffer();
          362 
          363  uint8_t rq[] =
          364  {
          365  RQ_PWM_SET_FREQ,
          366  static_cast<uint8_t>((freq >> 0) & 0xFF),
          367  static_cast<uint8_t>((freq >> 8) & 0xFF),
          368  static_cast<uint8_t>((freq >> 16) & 0xFF),
          369  static_cast<uint8_t>((freq >> 24) & 0xFF)
          370  };
          371 
          372  usart.transmit(&rq[0], 0, sizeof(rq));
          373 
          374  uint8_t aw;
          375  usart.receive(&aw, 0, sizeof(aw));
          376  return aw;
          377 }
          378 
          379 bool B15F::pwmSetValue(uint8_t value)
          380 {
          381  usart.clearInputBuffer();
          382 
          383  uint8_t rq[] =
          384  {
          385  RQ_PWM_SET_VALUE,
          386  value
          387  };
          388 
          389  usart.transmit(&rq[0], 0, sizeof(rq));
          390 
          391  uint8_t aw;
          392  usart.receive(&aw, 0, sizeof(aw));
          393  return aw == MSG_OK;
          394 }
          395 
          396 bool B15F::setRegister(volatile uint8_t* adr, uint8_t val)
          397 {
          398  usart.clearInputBuffer();
          399 
          400  uint8_t rq[] =
          401  {
          402  RQ_SET_REG,
          403  static_cast<uint8_t>(reinterpret_cast<size_t>(adr)),
          404  val
          405  };
          406 
          407  usart.transmit(&rq[0], 0, sizeof(rq));
          408 
          409  uint8_t aw;
          410  usart.receive(&aw, 0, sizeof(aw));
          411  return aw == val;
          412 }
          413 
          414 uint8_t B15F::getRegister(volatile uint8_t* adr)
          415 {
          416  usart.clearInputBuffer();
          417 
          418  uint8_t rq[] =
          419  {
          420  RQ_GET_REG,
          421  static_cast<uint8_t>(reinterpret_cast<size_t>(adr))
          422  };
          423 
          424  usart.transmit(&rq[0], 0, sizeof(rq));
          425 
          426  uint8_t aw;
          427  usart.receive(&aw, 0, sizeof(aw));
          428  return aw;
          429 }
          430 
          431 
          432 void B15F::delay_ms(uint16_t ms)
          433 {
          434  std::this_thread::sleep_for(std::chrono::milliseconds(ms));
          435 }
          436 
          437 void B15F::delay_us(uint16_t us)
          438 {
          439  std::this_thread::sleep_for(std::chrono::microseconds(us));
          440 }
          441 
          443 {
          444  if (!instance)
          445  instance = new B15F();
          446 
          447  return *instance;
          448 }
          449 
          450 // https://stackoverflow.com/a/478960
          451 std::string B15F::exec(std::string cmd)
          452 {
          453  std::array<char, 128> buffer;
          454  std::string result;
          455  std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
          456  if (!pipe)
          457  {
          458  throw std::runtime_error("popen() failed!");
          459  }
          460  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
          461  {
          462  result += buffer.data();
          463  }
          464  return result;
          465 }
          466 
          467 void B15F::abort(std::string msg)
          468 {
          469  DriverException ex(msg);
          470  abort(ex);
          471 }
          472 
          473 void B15F::abort(std::exception &ex)
          474 {
          475  if (errorhandler)
          476  errorhandler(ex);
          477  else
          478  {
          479  std::cerr << "NOTICE: B15F::errorhandler not set" << std::endl;
          480  std::cout << ex.what() << std::endl;
          481  throw DriverException(ex.what());
          482  }
          483 }
          484 
          485 void B15F::setAbortHandler(errorhandler_t func)
          486 {
          487  errorhandler = func;
          488 }
          +
          static std::string exec(std::string cmd)
          Definition: b15f.cpp:451
          +
          void delay_us(uint16_t us)
          Definition: b15f.cpp:437
          +
          uint8_t digitalRead0(void)
          Definition: b15f.cpp:207
          +
          uint8_t pwmSetFrequency(uint32_t freq)
          Definition: b15f.cpp:359
          +
          void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
          Definition: b15f.cpp:302
          +
          bool testConnection(void)
          Definition: b15f.cpp:95
          +
          uint8_t readDipSwitch(void)
          Definition: b15f.cpp:235
          +
          uint8_t getRegister(volatile uint8_t *adr)
          Definition: b15f.cpp:414
          +
          void delay_ms(uint16_t ms)
          Definition: b15f.cpp:432
          +
          static B15F & getInstance(void)
          Definition: b15f.cpp:442
          +
          Definition: b15f.h:31
          +
          void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:75
          +
          static void abort(std::string msg)
          Definition: b15f.cpp:467
          +
          void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:84
          +
          void clearInputBuffer(void)
          Definition: usart.cpp:54
          +
          void clearOutputBuffer(void)
          Definition: usart.cpp:61
          +
          uint16_t analogRead(uint8_t channel)
          Definition: b15f.cpp:279
          +
          bool digitalWrite0(uint8_t)
          Definition: b15f.cpp:179
          +
          const std::string PRE
          B15F stdout prefix.
          Definition: b15f.h:237
          +
          void setBaudrate(uint32_t baudrate)
          Definition: usart.cpp:131
          +
          bool activateSelfTestMode(void)
          Definition: b15f.cpp:166
          +
          std::vector< std::string > getBoardInfo(void)
          Definition: b15f.cpp:134
          +
          constexpr static uint16_t RECONNECT_TIMEOUT
          Time in ms after which a reconnect attempt aborts.
          Definition: b15f.h:240
          +
          bool analogWrite1(uint16_t port)
          Definition: b15f.cpp:264
          +
          bool digitalWrite1(uint8_t)
          Definition: b15f.cpp:193
          +
          bool pwmSetValue(uint8_t value)
          Definition: b15f.cpp:379
          +
          void discard(void)
          Definition: b15f.cpp:72
          +
          bool setRegister(volatile uint8_t *adr, uint8_t val)
          Definition: b15f.cpp:396
          +
          constexpr static uint8_t MSG_OK
          Value to acknowledge a received command.
          Definition: b15f.h:238
          +
          void openDevice(std::string device)
          Definition: usart.cpp:9
          +
          uint8_t digitalRead1(void)
          Definition: b15f.cpp:221
          +
          void reconnect(void)
          Definition: b15f.cpp:57
          +
          constexpr static uint32_t BAUDRATE
          USART baudrate for communication with the MCU.
          Definition: b15f.h:243
          +
          static void setAbortHandler(errorhandler_t func)
          Definition: b15f.cpp:485
          +
          void drop(uint8_t len)
          Definition: usart.cpp:114
          +
          bool analogWrite0(uint16_t port)
          Definition: b15f.cpp:249
          +
          constexpr static uint8_t RECONNECT_TRIES
          Maximum count of reconnect attempts after which the driver stops.
          Definition: b15f.h:242
          +
          bool testIntConv(void)
          Definition: b15f.cpp:114
          + + + + + diff --git a/docs/html/b15f_8h_source.html b/docs/html/b15f_8h_source.html new file mode 100644 index 0000000..9729432 --- /dev/null +++ b/docs/html/b15f_8h_source.html @@ -0,0 +1,115 @@ + + + + + + + +B15F: drv/b15f.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          b15f.h
          +
          +
          +
          1 #ifndef B15F_H
          2 #define B15F_H
          3 
          4 #include <iostream>
          5 #include <bits/stdc++.h>
          6 #include <string>
          7 #include <fstream>
          8 #include <cstdlib>
          9 #include <chrono>
          10 #include <cstdint>
          11 #include <vector>
          12 
          13 #include <unistd.h>
          14 #include <fcntl.h>
          15 #include <sys/ioctl.h>
          16 #include <termios.h>
          17 #include "usart.h"
          18 #include "driverexception.h"
          19 #include "timeoutexception.h"
          20 
          21 // wichtig für die Register-Zugriffe
          22 #define _AVR_IO_H_ 1 // Erzwinge die Inklusion
          23 #include "/usr/lib/avr/include/avr/sfr_defs.h"
          24 #include "/usr/lib/avr/include/avr/iom1284p.h"
          25 
          26 typedef std::function<void(std::exception&)> errorhandler_t;
          27 
          28 
          31 class B15F
          32 {
          33 private:
          34  // privater Konstruktor
          35  B15F(void);
          36 public:
          37 
          38  /*************************************
          39  * Grundfunktionen des B15F Treibers *
          40  *************************************/
          41 
          46  void reconnect(void);
          47 
          52  void discard(void);
          53 
          58  bool testConnection(void);
          59 
          64  bool testIntConv(void);
          65 
          70  std::vector<std::string> getBoardInfo(void);
          71 
          76  void delay_ms(uint16_t ms);
          77 
          82  void delay_us(uint16_t us);
          83 
          88  static B15F& getInstance(void);
          89 
          94  static std::string exec(std::string cmd);
          95 
          100  static void abort(std::string msg);
          101 
          106  static void abort(std::exception& ex);
          107 
          112  static void setAbortHandler(errorhandler_t func);
          113 
          114  /*************************************/
          115 
          116 
          117 
          118  /*************************
          119  * Steuerbefehle für B15 *
          120  *************************/
          121 
          127  bool activateSelfTestMode(void);
          128 
          134  bool digitalWrite0(uint8_t);
          135 
          141  bool digitalWrite1(uint8_t);
          142 
          148  uint8_t digitalRead0(void);
          149 
          155  uint8_t digitalRead1(void);
          156 
          162  uint8_t readDipSwitch(void);
          163 
          169  bool analogWrite0(uint16_t port);
          170 
          176  bool analogWrite1(uint16_t port);
          177 
          183  uint16_t analogRead(uint8_t channel);
          184 
          200  void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
          201 
          210  uint8_t pwmSetFrequency(uint32_t freq);
          211 
          217  bool pwmSetValue(uint8_t value);
          218 
          226  bool setRegister(volatile uint8_t* adr, uint8_t val);
          227 
          233  uint8_t getRegister(volatile uint8_t* adr);
          234 
          235  /*************************/
          236 
          237 
          238  // CONSTANTS
          239  const std::string PRE = "[B15F] ";
          240  constexpr static uint8_t MSG_OK = 0xFF;
          241  constexpr static uint8_t MSG_FAIL = 0xFE;
          242  constexpr static uint16_t RECONNECT_TIMEOUT = 64;
          243  constexpr static uint16_t WDT_TIMEOUT = 15;
          244  constexpr static uint8_t RECONNECT_TRIES = 3;
          245  constexpr static uint32_t BAUDRATE = 57600;
          246 
          247 private:
          248 
          253  void init(void);
          254 
          255  USART usart;
          256  static B15F* instance;
          257  static errorhandler_t errorhandler;
          258 
          259  // REQUESTS
          260  constexpr static uint8_t RQ_DISC = 0;
          261  constexpr static uint8_t RQ_TEST = 1;
          262  constexpr static uint8_t RQ_INFO = 2;
          263  constexpr static uint8_t RQ_INT = 3;
          264  constexpr static uint8_t RQ_ST = 4;
          265  constexpr static uint8_t RQ_BA0 = 5;
          266  constexpr static uint8_t RQ_BA1 = 6;
          267  constexpr static uint8_t RQ_BE0 = 7;
          268  constexpr static uint8_t RQ_BE1 = 8;
          269  constexpr static uint8_t RQ_DSW = 9;
          270  constexpr static uint8_t RQ_AA0 = 10;
          271  constexpr static uint8_t RQ_AA1 = 11;
          272  constexpr static uint8_t RQ_ADC = 12;
          273  constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
          274  constexpr static uint8_t RQ_PWM_SET_FREQ = 14;
          275  constexpr static uint8_t RQ_PWM_SET_VALUE = 15;
          276  constexpr static uint8_t RQ_SET_REG = 16;
          277  constexpr static uint8_t RQ_GET_REG = 17;
          278 };
          279 
          280 #endif // B15F_H
          +
          static std::string exec(std::string cmd)
          Definition: b15f.cpp:451
          +
          constexpr static uint8_t MSG_FAIL
          Value to reject a received command.
          Definition: b15f.h:239
          +
          void delay_us(uint16_t us)
          Definition: b15f.cpp:437
          +
          uint8_t digitalRead0(void)
          Definition: b15f.cpp:207
          +
          uint8_t pwmSetFrequency(uint32_t freq)
          Definition: b15f.cpp:359
          +
          void analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
          Definition: b15f.cpp:302
          +
          bool testConnection(void)
          Definition: b15f.cpp:95
          +
          uint8_t readDipSwitch(void)
          Definition: b15f.cpp:235
          +
          uint8_t getRegister(volatile uint8_t *adr)
          Definition: b15f.cpp:414
          +
          void delay_ms(uint16_t ms)
          Definition: b15f.cpp:432
          +
          static B15F & getInstance(void)
          Definition: b15f.cpp:442
          +
          Definition: b15f.h:31
          +
          static void abort(std::string msg)
          Definition: b15f.cpp:467
          +
          Definition: usart.h:16
          +
          uint16_t analogRead(uint8_t channel)
          Definition: b15f.cpp:279
          +
          bool digitalWrite0(uint8_t)
          Definition: b15f.cpp:179
          +
          const std::string PRE
          B15F stdout prefix.
          Definition: b15f.h:237
          +
          bool activateSelfTestMode(void)
          Definition: b15f.cpp:166
          +
          std::vector< std::string > getBoardInfo(void)
          Definition: b15f.cpp:134
          +
          constexpr static uint16_t RECONNECT_TIMEOUT
          Time in ms after which a reconnect attempt aborts.
          Definition: b15f.h:240
          +
          bool analogWrite1(uint16_t port)
          Definition: b15f.cpp:264
          +
          bool digitalWrite1(uint8_t)
          Definition: b15f.cpp:193
          +
          bool pwmSetValue(uint8_t value)
          Definition: b15f.cpp:379
          +
          void discard(void)
          Definition: b15f.cpp:72
          +
          bool setRegister(volatile uint8_t *adr, uint8_t val)
          Definition: b15f.cpp:396
          +
          constexpr static uint8_t MSG_OK
          Value to acknowledge a received command.
          Definition: b15f.h:238
          +
          uint8_t digitalRead1(void)
          Definition: b15f.cpp:221
          +
          constexpr static uint16_t WDT_TIMEOUT
          Time in ms after which the watch dog timer resets the MCU.
          Definition: b15f.h:241
          +
          void reconnect(void)
          Definition: b15f.cpp:57
          +
          constexpr static uint32_t BAUDRATE
          USART baudrate for communication with the MCU.
          Definition: b15f.h:243
          +
          static void setAbortHandler(errorhandler_t func)
          Definition: b15f.cpp:485
          +
          bool analogWrite0(uint16_t port)
          Definition: b15f.cpp:249
          +
          constexpr static uint8_t RECONNECT_TRIES
          Maximum count of reconnect attempts after which the driver stops.
          Definition: b15f.h:242
          +
          bool testIntConv(void)
          Definition: b15f.cpp:114
          + + + + diff --git a/docs/html/backup_8cpp_source.html b/docs/html/backup_8cpp_source.html new file mode 100644 index 0000000..1ac6851 --- /dev/null +++ b/docs/html/backup_8cpp_source.html @@ -0,0 +1,83 @@ + + + + + + + +B15F: drv/backup.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          backup.cpp
          +
          +
          +
          1 
          2 void USART::writeByte(uint8_t b)
          3 {
          4  int sent = write(file_desc, &b, 1);
          5  if (sent != 1)
          6  {
          7  std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl;
          8  usleep(100000);
          9  sent = write(file_desc, &b, 1);
          10  if (sent != 1)
          11  throw USARTException("Fehler beim Senden: writeByte()");
          12  }
          13 
          14 }
          15 
          16 void USART::writeInt(uint16_t d)
          17 {
          18  int sent = write(file_desc, reinterpret_cast<char *>(&d), 2);
          19  if (sent != 2)
          20  throw USARTException("Fehler beim Senden: writeInt()");
          21 }
          22 
          23 void USART::writeU32(uint32_t w)
          24 {
          25  int sent = write(file_desc, reinterpret_cast<char *>(&w), 4);
          26  if (sent != 4)
          27  throw USARTException("Fehler beim Senden: writeU32()");
          28 }
          29 
          30 uint8_t USART::readByte(void)
          31 {
          32  char b;
          33  auto start = std::chrono::steady_clock::now();
          34  auto end = start;
          35  uint16_t elapsed = 0;
          36  while (elapsed < timeout * 100)
          37  {
          38  int code = read(file_desc, &b, 1);
          39  if (code > 0)
          40  return static_cast<uint8_t>(b);
          41 
          42  end = std::chrono::steady_clock::now();
          43  elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
          44  }
          45 
          46  throw TimeoutException("Verbindung unterbrochen.", timeout);
          47 }
          48 
          49 uint16_t USART::readInt(void)
          50 {
          51  return readByte() | readByte() << 8;
          52 }
          + + + + + + diff --git a/docs/html/bc_s.png b/docs/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/docs/html/bdwn.png b/docs/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          B15F Member List
          +
          +
          + +

          This is the complete list of members for B15F, including all inherited members.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          abort(std::string msg)B15Fstatic
          abort(std::exception &ex)B15Fstatic
          activateSelfTestMode(void)B15F
          analogRead(uint8_t channel)B15F
          analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)B15F
          analogWrite0(uint16_t port)B15F
          analogWrite1(uint16_t port)B15F
          BAUDRATEB15Fstatic
          delay_ms(uint16_t ms)B15F
          delay_us(uint16_t us)B15F
          digitalRead0(void)B15F
          digitalRead1(void)B15F
          digitalWrite0(uint8_t)B15F
          digitalWrite1(uint8_t)B15F
          discard(void)B15F
          exec(std::string cmd)B15Fstatic
          getBoardInfo(void)B15F
          getInstance(void)B15Fstatic
          getRegister(volatile uint8_t *adr)B15F
          MSG_FAILB15Fstatic
          MSG_OKB15Fstatic
          PREB15F
          pwmSetFrequency(uint32_t freq)B15F
          pwmSetValue(uint8_t value)B15F
          readDipSwitch(void)B15F
          reconnect(void)B15F
          RECONNECT_TIMEOUTB15Fstatic
          RECONNECT_TRIESB15Fstatic
          setAbortHandler(errorhandler_t func)B15Fstatic
          setRegister(volatile uint8_t *adr, uint8_t val)B15F
          testConnection(void)B15F
          testIntConv(void)B15F
          WDT_TIMEOUTB15Fstatic
          + + + + diff --git a/docs/html/classB15F.html b/docs/html/classB15F.html new file mode 100644 index 0000000..18bb42a --- /dev/null +++ b/docs/html/classB15F.html @@ -0,0 +1,1038 @@ + + + + + + + +B15F: B15F Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          + +
          + +

          #include <b15f.h>

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          +Public Member Functions

          void reconnect (void)
           
          void discard (void)
           
          bool testConnection (void)
           
          bool testIntConv (void)
           
          std::vector< std::string > getBoardInfo (void)
           
          void delay_ms (uint16_t ms)
           
          void delay_us (uint16_t us)
           
          bool activateSelfTestMode (void)
           
          bool digitalWrite0 (uint8_t)
           
          bool digitalWrite1 (uint8_t)
           
          uint8_t digitalRead0 (void)
           
          uint8_t digitalRead1 (void)
           
          uint8_t readDipSwitch (void)
           
          bool analogWrite0 (uint16_t port)
           
          bool analogWrite1 (uint16_t port)
           
          uint16_t analogRead (uint8_t channel)
           
          void analogSequence (uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
           
          uint8_t pwmSetFrequency (uint32_t freq)
           
          bool pwmSetValue (uint8_t value)
           
          bool setRegister (volatile uint8_t *adr, uint8_t val)
           
          uint8_t getRegister (volatile uint8_t *adr)
           
          + + + + + + + + + + + +

          +Static Public Member Functions

          static B15FgetInstance (void)
           
          static std::string exec (std::string cmd)
           
          static void abort (std::string msg)
           
          static void abort (std::exception &ex)
           
          static void setAbortHandler (errorhandler_t func)
           
          + + + + +

          +Public Attributes

          +const std::string PRE = "[B15F] "
           B15F stdout prefix.
           
          + + + + + + + + + + + + + + + + + + + +

          +Static Public Attributes

          +constexpr static uint8_t MSG_OK = 0xFF
           Value to acknowledge a received command.
           
          +constexpr static uint8_t MSG_FAIL = 0xFE
           Value to reject a received command.
           
          +constexpr static uint16_t RECONNECT_TIMEOUT = 64
           Time in ms after which a reconnect attempt aborts.
           
          +constexpr static uint16_t WDT_TIMEOUT = 15
           Time in ms after which the watch dog timer resets the MCU.
           
          +constexpr static uint8_t RECONNECT_TRIES = 3
           Maximum count of reconnect attempts after which the driver stops.
           
          +constexpr static uint32_t BAUDRATE = 57600
           USART baudrate for communication with the MCU.
           
          +

          Detailed Description

          +

          main driver class

          + +

          Definition at line 31 of file b15f.h.

          +

          Member Function Documentation

          + +

          ◆ abort() [1/2]

          + +
          +
          + + + + + +
          + + + + + + + + +
          void B15F::abort (std::exception & ex)
          +
          +static
          +
          +

          Multithread sicherer Abbruch des B15F-Treibers

          Parameters
          + + +
          exException als Abbruchursache
          +
          +
          + +

          Definition at line 473 of file b15f.cpp.

          + +
          +
          + +

          ◆ abort() [2/2]

          + +
          +
          + + + + + +
          + + + + + + + + +
          void B15F::abort (std::string msg)
          +
          +static
          +
          +

          Multithread sicherer Abbruch des B15F-Treibers

          Parameters
          + + +
          msgBeschreibung der Abbruchursache
          +
          +
          + +

          Definition at line 467 of file b15f.cpp.

          + +
          +
          + +

          ◆ activateSelfTestMode()

          + +
          +
          + + + + + + + + +
          bool B15F::activateSelfTestMode (void )
          +
          +

          Versetzt das Board in den Selbsttest-Modus WICHTIG: Es darf dabei nichts an den Klemmen angeschlossen sein!

          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 166 of file b15f.cpp.

          + +
          +
          + +

          ◆ analogRead()

          + +
          +
          + + + + + + + + +
          uint16_t B15F::analogRead (uint8_t channel)
          +
          +

          Liest den Wert des Analog-Digital-Converters (ADC / ADU)

          Parameters
          + + +
          channelKanalwahl von 0 - 7
          +
          +
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 279 of file b15f.cpp.

          + +
          +
          + +

          ◆ analogSequence()

          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          void B15F::analogSequence (uint8_t channel_a,
          uint16_t * buffer_a,
          uint32_t offset_a,
          uint8_t channel_b,
          uint16_t * buffer_b,
          uint32_t offset_b,
          uint16_t start,
          int16_t delta,
          uint16_t count 
          )
          +
          +

          DAC 0 wird auf den Startwert gesetzt und dann schrittweise um Delta inkrementiert. Für jeden eingestelleten DAC-Wert werden zwei ADCs (channel_a und channel_b) angesprochen und die Werte übermittelt. Die Werte werden in buffer_a für Kanal a und buffer_b für Kanal b gespeichert.

          Parameters
          + + + + + + + + + + +
          channel_aAuswahl des ADC a, von 0 - 7
          buffer_aSpeichertort für Werte des Kanals a
          offset_aAnzahl an Werten des Kanals a, die im Speicher übersprungen werden sollen
          channel_bAuswahl des ADC b, von 0 - 7
          buffer_bSpeichertort für Werte des Kanals b
          offset_bAnzahl an Werten des Kanals b, die im Speicher übersprungen werden
          startStartwert des DACs
          deltaSchrittweite, mit welcher der DAC inkrementiert wird
          countAnzahl an Inkrementierungen
          +
          +
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 302 of file b15f.cpp.

          + +
          +
          + +

          ◆ analogWrite0()

          + +
          +
          + + + + + + + + +
          bool B15F::analogWrite0 (uint16_t port)
          +
          +

          Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 0

          Parameters
          + + +
          port10-Bit Wert
          +
          +
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 249 of file b15f.cpp.

          + +
          +
          + +

          ◆ analogWrite1()

          + +
          +
          + + + + + + + + +
          bool B15F::analogWrite1 (uint16_t port)
          +
          +

          Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 1

          Parameters
          + + +
          port10-Bit Wert
          +
          +
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 264 of file b15f.cpp.

          + +
          +
          + +

          ◆ delay_ms()

          + +
          +
          + + + + + + + + +
          void B15F::delay_ms (uint16_t ms)
          +
          +

          Lässt den Treiber für eine angegebene Zeit pausieren

          Parameters
          + + +
          msVerzögerung in Millisekunden
          +
          +
          + +

          Definition at line 432 of file b15f.cpp.

          + +
          +
          + +

          ◆ delay_us()

          + +
          +
          + + + + + + + + +
          void B15F::delay_us (uint16_t us)
          +
          +

          Lässt den Treiber für eine angegebene Zeit pausieren

          Parameters
          + + +
          usVerzögerung in Microsekunden
          +
          +
          + +

          Definition at line 437 of file b15f.cpp.

          + +
          +
          + +

          ◆ digitalRead0()

          + +
          +
          + + + + + + + + +
          uint8_t B15F::digitalRead0 (void )
          +
          +

          Liest den Wert des digitalen Eingabeports 0

          Returns
          Wert für gesamten Port
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 207 of file b15f.cpp.

          + +
          +
          + +

          ◆ digitalRead1()

          + +
          +
          + + + + + + + + +
          uint8_t B15F::digitalRead1 (void )
          +
          +

          Liest den Wert des digitalen Eingabeports 1

          Returns
          Wert für gesamten Port
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 221 of file b15f.cpp.

          + +
          +
          + +

          ◆ digitalWrite0()

          + +
          +
          + + + + + + + + +
          bool B15F::digitalWrite0 (uint8_t port)
          +
          +

          Setzt den Wert des digitalen Ausgabeports 0

          Parameters
          + + +
          portWert für gesamten Port
          +
          +
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 179 of file b15f.cpp.

          + +
          +
          + +

          ◆ digitalWrite1()

          + +
          +
          + + + + + + + + +
          bool B15F::digitalWrite1 (uint8_t port)
          +
          +

          Setzt den Wert des digitalen Ausgabeports 1

          Parameters
          + + +
          portWert für gesamten Port
          +
          +
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 193 of file b15f.cpp.

          + +
          +
          + +

          ◆ discard()

          + +
          +
          + + + + + + + + +
          void B15F::discard (void )
          +
          +

          Verwirft Daten im USART Puffer auf dieser Maschine und B15

          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 72 of file b15f.cpp.

          + +
          +
          + +

          ◆ exec()

          + +
          +
          + + + + + +
          + + + + + + + + +
          std::string B15F::exec (std::string cmd)
          +
          +static
          +
          +

          Führt ein Befehl auf dieser Maschine aus und liefert stdout zurück

          Parameters
          + + +
          cmdDer Befehl
          +
          +
          + +

          Definition at line 451 of file b15f.cpp.

          + +
          +
          + +

          ◆ getBoardInfo()

          + +
          +
          + + + + + + + + +
          std::vector< std::string > B15F::getBoardInfo (void )
          +
          +

          Liefert Informationen zur aktuellen Firmware des B15

          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 134 of file b15f.cpp.

          + +
          +
          + +

          ◆ getInstance()

          + +
          +
          + + + + + +
          + + + + + + + + +
          B15F & B15F::getInstance (void )
          +
          +static
          +
          +

          Liefert eine Referenz zur aktuellen Treiber-Instanz

          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 442 of file b15f.cpp.

          + +
          +
          + +

          ◆ getRegister()

          + +
          +
          + + + + + + + + +
          uint8_t B15F::getRegister (volatile uint8_t * adr)
          +
          +

          Liefert den Wert eines MCU Registers.

          Parameters
          + + +
          adrSpeicheradresse des Registers
          +
          +
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 414 of file b15f.cpp.

          + +
          +
          + +

          ◆ pwmSetFrequency()

          + +
          +
          + + + + + + + + +
          uint8_t B15F::pwmSetFrequency (uint32_t freq)
          +
          +

          Setzt die Register so, dass näherungsweise die gewünschte Frequenz erzeugt wird. Ist freq == 0 wird PWM deaktiviert. Standardfrequenz: 31300 (empfohlen, da dann TOP == 255)

          Parameters
          + + +
          freqPWM Frequenz
          +
          +
          +
          Returns
          Top Wert des PWM Value für die gesetzte Frequenz
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 359 of file b15f.cpp.

          + +
          +
          + +

          ◆ pwmSetValue()

          + +
          +
          + + + + + + + + +
          bool B15F::pwmSetValue (uint8_t value)
          +
          +

          Setzt den PWM Wert.

          Parameters
          + + +
          valuePWM Wert [0..0xFF]
          +
          +
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 379 of file b15f.cpp.

          + +
          +
          + +

          ◆ readDipSwitch()

          + +
          +
          + + + + + + + + +
          uint8_t B15F::readDipSwitch (void )
          +
          +

          Liest den Wert des digitalen Eingabeports, an dem der DIP-switch angeschlossen ist (S7)

          Returns
          Wert für gesamten Port
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 235 of file b15f.cpp.

          + +
          +
          + +

          ◆ reconnect()

          + +
          +
          + + + + + + + + +
          void B15F::reconnect (void )
          +
          +

          Versucht die Verbindung zum B15 wiederherzustellen

          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 57 of file b15f.cpp.

          + +
          +
          + +

          ◆ setAbortHandler()

          + +
          +
          + + + + + +
          + + + + + + + + +
          void B15F::setAbortHandler (errorhandler_t func)
          +
          +static
          +
          +

          Setzt eine Fehlerbehandlungsroutine für den Treiberabbruch (abort)

          Parameters
          + + +
          funcFunktion, die Exception als Parameter bekommt
          +
          +
          + +

          Definition at line 485 of file b15f.cpp.

          + +
          +
          + +

          ◆ setRegister()

          + +
          +
          + + + + + + + + + + + + + + + + + + +
          bool B15F::setRegister (volatile uint8_t * adr,
          uint8_t val 
          )
          +
          +

          Setzt direkt den Wert eines MCU Registers. Wichtig: bei einer falschen Adresse kann das Board 15 ernsthaften Schaden nehmen!

          Parameters
          + + + +
          adrSpeicheradresse des Registers
          valNeuer Wert für das Register
          +
          +
          +
          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 396 of file b15f.cpp.

          + +
          +
          + +

          ◆ testConnection()

          + +
          +
          + + + + + + + + +
          bool B15F::testConnection (void )
          +
          +

          Testet die USART Verbindung auf Funktion

          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 95 of file b15f.cpp.

          + +
          +
          + +

          ◆ testIntConv()

          + +
          +
          + + + + + + + + +
          bool B15F::testIntConv (void )
          +
          +

          Testet die Integer Konvertierung der USART Verbindung

          Exceptions
          + + +
          DriverException
          +
          +
          + +

          Definition at line 114 of file b15f.cpp.

          + +
          +
          +
          The documentation for this class was generated from the following files: +
          + + + + diff --git a/docs/html/classDot-members.html b/docs/html/classDot-members.html new file mode 100644 index 0000000..b493400 --- /dev/null +++ b/docs/html/classDot-members.html @@ -0,0 +1,84 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          Dot Member List
          +
          +
          + +

          This is the complete list of members for Dot, including all inherited members.

          + + + + + +
          Dot(uint16_t x, uint16_t y, uint8_t curve)Dot
          getCurve(void) constDot
          getX(void) constDot
          getY(void) constDot
          + + + + diff --git a/docs/html/classDot.html b/docs/html/classDot.html new file mode 100644 index 0000000..4d8cd1d --- /dev/null +++ b/docs/html/classDot.html @@ -0,0 +1,204 @@ + + + + + + + +B15F: Dot Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          + +
          +
          Dot Class Reference
          +
          +
          + +

          #include <dot.h>

          + + + + + + + + + + +

          +Public Member Functions

           Dot (uint16_t x, uint16_t y, uint8_t curve)
           
          uint16_t getX (void) const
           
          uint16_t getY (void) const
           
          uint8_t getCurve (void) const
           
          +

          Detailed Description

          +

          Immutable dot class with x and y coordinate and curve index. Dots with the same curve index get the same color by plotty.

          + +

          Definition at line 12 of file dot.h.

          +

          Constructor & Destructor Documentation

          + +

          ◆ Dot()

          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + +
          Dot::Dot (uint16_t x,
          uint16_t y,
          uint8_t curve 
          )
          +
          +

          Constructor with x and y coordinate and curve index.

          + +

          Definition at line 3 of file dot.cpp.

          + +
          +
          +

          Member Function Documentation

          + +

          ◆ getCurve()

          + +
          +
          + + + + + + + + +
          uint8_t Dot::getCurve (void ) const
          +
          +

          Returns the curve index.

          + +

          Definition at line 19 of file dot.cpp.

          + +
          +
          + +

          ◆ getX()

          + +
          +
          + + + + + + + + +
          uint16_t Dot::getX (void ) const
          +
          +

          Returns the x coordinate.

          + +

          Definition at line 9 of file dot.cpp.

          + +
          +
          + +

          ◆ getY()

          + +
          +
          + + + + + + + + +
          uint16_t Dot::getY (void ) const
          +
          +

          Returns the y coordinate.

          + +

          Definition at line 14 of file dot.cpp.

          + +
          +
          +
          The documentation for this class was generated from the following files: +
          + + + + diff --git a/docs/html/classDriverException-members.html b/docs/html/classDriverException-members.html new file mode 100644 index 0000000..385458a --- /dev/null +++ b/docs/html/classDriverException-members.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          DriverException Member List
          +
          +
          + +

          This is the complete list of members for DriverException, including all inherited members.

          + + + + + + +
          DriverException(const char *message) (defined in DriverException)DriverExceptioninlineexplicit
          DriverException(const std::string &message) (defined in DriverException)DriverExceptioninlineexplicit
          msg_ (defined in DriverException)DriverExceptionprotected
          what() const (defined in DriverException)DriverExceptioninlinevirtual
          ~DriverException() (defined in DriverException)DriverExceptioninlinevirtual
          + + + + diff --git a/docs/html/classDriverException.html b/docs/html/classDriverException.html new file mode 100644 index 0000000..b3dd57e --- /dev/null +++ b/docs/html/classDriverException.html @@ -0,0 +1,117 @@ + + + + + + + +B15F: DriverException Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          + +
          +
          DriverException Class Reference
          +
          +
          + +

          #include <driverexception.h>

          +
          + + Inheritance diagram for DriverException:
          +
          +
          + + + + + + + + + +

          +Public Member Functions

          DriverException (const char *message)
           
          DriverException (const std::string &message)
           
          +virtual const char * what () const throw ()
           
          + + + +

          +Protected Attributes

          +std::string msg_
           
          +

          Detailed Description

          +

          Exception driver problems, for instance incompatible firmware version.

          + +

          Definition at line 10 of file driverexception.h.

          +

          The documentation for this class was generated from the following file: +
          + + + + diff --git a/docs/html/classDriverException.png b/docs/html/classDriverException.png new file mode 100644 index 0000000000000000000000000000000000000000..5b60bc759625925bd4e0cc75ebda8d9af2606396 GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^=|CL7!3-pgAI!c7q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXg3p`yMLn;{G&b>XUSwVocINb;}Jom2%dUf^9ZaL3ghbF3r)>dA>;&1-` zT+sag=gWP4CRNE)6cz2gb#BSGtfWa-9^RR}Jko7#$y`m3pmyc+U!tpv-jv(s2AaOM zycgv8s$f_CQa-&o=eN(hTs3>vwtM@&dIZVW`&Fo%^atYe4*fH4erBksWaLSh@cgTk zveXmLS&EAS=hcVjKV8jgdc9?pvqG3D8?EQIfX+{?^z zhp%t;|2x8WB|HDb^7Opr0W+`p#5s0u3$C)Cx% + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          PlottyFile Member List
          +
          +
          + +

          This is the complete list of members for PlottyFile, including all inherited members.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          addDot(Dot &dot)PlottyFile
          addDot(Dot dot)PlottyFile
          getDescPara(void) constPlottyFile
          getDescX(void) constPlottyFile
          getDescY(void) constPlottyFile
          getFunctionType(void) constPlottyFile
          getParaFirstCurve(void) constPlottyFile
          getParaStepWidth(void) constPlottyFile
          getQuadrant(void) constPlottyFile
          getRefX(void) constPlottyFile
          getRefY(void) constPlottyFile
          getUnitPara(void) constPlottyFile
          getUnitX(void) constPlottyFile
          getUnitY(void) constPlottyFile
          setDescPara(std::string desc_para)PlottyFile
          setDescX(std::string desc_x)PlottyFile
          setDescY(std::string desc_y)PlottyFile
          setFunctionType(FunctionType function_type)PlottyFile
          setParaFirstCurve(uint16_t para_first)PlottyFile
          setParaStepWidth(uint16_t para_stepwidth)PlottyFile
          setQuadrant(uint8_t quadrant)PlottyFile
          setRefX(uint16_t ref_x)PlottyFile
          setRefY(uint16_t ref_y)PlottyFile
          setUnitPara(std::string unit_para)PlottyFile
          setUnitX(std::string unit_x)PlottyFile
          setUnitY(std::string unit_y)PlottyFile
          startPlotty(std::string filename)PlottyFile
          writeToFile(std::string filename)PlottyFile
          + + + + diff --git a/docs/html/classPlottyFile.html b/docs/html/classPlottyFile.html new file mode 100644 index 0000000..3eb73ca --- /dev/null +++ b/docs/html/classPlottyFile.html @@ -0,0 +1,819 @@ + + + + + + + +B15F: PlottyFile Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          + +
          +
          PlottyFile Class Reference
          +
          +
          + +

          #include <plottyfile.h>

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          +Public Member Functions

          void addDot (Dot &dot)
           
          void addDot (Dot dot)
           
          void setFunctionType (FunctionType function_type)
           
          void setQuadrant (uint8_t quadrant)
           
          void setRefX (uint16_t ref_x)
           
          void setRefY (uint16_t ref_y)
           
          void setParaFirstCurve (uint16_t para_first)
           
          void setParaStepWidth (uint16_t para_stepwidth)
           
          void setUnitX (std::string unit_x)
           
          void setDescX (std::string desc_x)
           
          void setUnitY (std::string unit_y)
           
          void setDescY (std::string desc_y)
           
          void setUnitPara (std::string unit_para)
           
          void setDescPara (std::string desc_para)
           
          FunctionType getFunctionType (void) const
           
          uint8_t getQuadrant (void) const
           
          uint16_t getRefX (void) const
           
          uint16_t getRefY (void) const
           
          uint16_t getParaFirstCurve (void) const
           
          uint16_t getParaStepWidth (void) const
           
          std::string getUnitX (void) const
           
          std::string getDescX (void) const
           
          std::string getUnitY (void) const
           
          std::string getDescY (void) const
           
          std::string getUnitPara (void) const
           
          std::string getDescPara (void) const
           
          void writeToFile (std::string filename)
           
          void startPlotty (std::string filename)
           
          +

          Detailed Description

          +

          Wrapper class for convenient plot file creation, needed to display graphs using plotty.

          + +

          Definition at line 20 of file plottyfile.h.

          +

          Member Function Documentation

          + +

          ◆ addDot() [1/2]

          + +
          +
          + + + + + + + + +
          void PlottyFile::addDot (Dotdot)
          +
          +

          Adds a dot to the plotty file.

          Parameters
          + + +
          dotthe dot
          +
          +
          + +

          Definition at line 3 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ addDot() [2/2]

          + +
          +
          + + + + + + + + +
          void PlottyFile::addDot (Dot dot)
          +
          +

          Adds a dot by reference to the plotty file.

          Parameters
          + + +
          dotthe dot
          +
          +
          + +

          Definition at line 8 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getDescPara()

          + +
          +
          + + + + + + + + +
          std::string PlottyFile::getDescPara (void ) const
          +
          +
          Returns
          description of parameter
          + +

          Definition at line 130 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getDescX()

          + +
          +
          + + + + + + + + +
          std::string PlottyFile::getDescX (void ) const
          +
          +
          Returns
          description of x axis
          + +

          Definition at line 110 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getDescY()

          + +
          +
          + + + + + + + + +
          std::string PlottyFile::getDescY (void ) const
          +
          +
          Returns
          description of y axis
          + +

          Definition at line 120 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getFunctionType()

          + +
          +
          + + + + + + + + +
          FunctionType PlottyFile::getFunctionType (void ) const
          +
          +
          Returns
          the FunctionType
          + +

          Definition at line 75 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getParaFirstCurve()

          + +
          +
          + + + + + + + + +
          uint16_t PlottyFile::getParaFirstCurve (void ) const
          +
          +
          Returns
          initial parameter value
          + +

          Definition at line 95 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getParaStepWidth()

          + +
          +
          + + + + + + + + +
          uint16_t PlottyFile::getParaStepWidth (void ) const
          +
          +
          Returns
          parameter stepwith
          + +

          Definition at line 100 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getQuadrant()

          + +
          +
          + + + + + + + + +
          uint8_t PlottyFile::getQuadrant (void ) const
          +
          +
          Returns
          the quadrant
          + +

          Definition at line 80 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getRefX()

          + +
          +
          + + + + + + + + +
          uint16_t PlottyFile::getRefX (void ) const
          +
          +
          Returns
          x reference (max) value
          + +

          Definition at line 85 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getRefY()

          + +
          +
          + + + + + + + + +
          uint16_t PlottyFile::getRefY (void ) const
          +
          +
          Returns
          y reference (max) value
          + +

          Definition at line 90 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getUnitPara()

          + +
          +
          + + + + + + + + +
          std::string PlottyFile::getUnitPara (void ) const
          +
          +
          Returns
          unit of parameter
          + +

          Definition at line 125 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getUnitX()

          + +
          +
          + + + + + + + + +
          std::string PlottyFile::getUnitX (void ) const
          +
          +
          Returns
          unit of x axis
          + +

          Definition at line 105 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ getUnitY()

          + +
          +
          + + + + + + + + +
          std::string PlottyFile::getUnitY (void ) const
          +
          +
          Returns
          unit of y axis
          + +

          Definition at line 115 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setDescPara()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setDescPara (std::string desc_para)
          +
          +

          Sets the description of the parameter.

          Parameters
          + + +
          para_firstdescription
          +
          +
          + +

          Definition at line 70 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setDescX()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setDescX (std::string desc_x)
          +
          +

          Sets the description of the x axis.

          Parameters
          + + +
          para_firstdescription
          +
          +
          + +

          Definition at line 50 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setDescY()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setDescY (std::string desc_y)
          +
          +

          Sets the description of the y axis.

          Parameters
          + + +
          para_firstdescription
          +
          +
          + +

          Definition at line 60 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setFunctionType()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setFunctionType (FunctionType function_type)
          +
          +

          Sets the FunctionType of this plotty file.

          Parameters
          + + +
          function_typeenum value
          +
          +
          + +

          Definition at line 13 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setParaFirstCurve()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setParaFirstCurve (uint16_t para_first)
          +
          +

          Sets initial value of the parameter. Gets used together with the stepwith to label the curves.

          Parameters
          + + +
          para_firstinitial parameter value
          +
          +
          + +

          Definition at line 35 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setParaStepWidth()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setParaStepWidth (uint16_t para_stepwidth)
          +
          +

          Sets the stepwith the parameter got increased with each curve.

          Parameters
          + + +
          para_firstparameter stepwith
          +
          +
          + +

          Definition at line 40 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setQuadrant()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setQuadrant (uint8_t quadrant)
          +
          +

          Sets the quadrant of this plot.

          Parameters
          + + +
          quadrantquadrant number (1..4)
          +
          +
          + +

          Definition at line 18 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setRefX()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setRefX (uint16_t ref_x)
          +
          +

          Sets reference (max) value of the x axis

          Parameters
          + + +
          ref_xreference value
          +
          +
          + +

          Definition at line 25 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setRefY()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setRefY (uint16_t ref_y)
          +
          +

          Sets reference (max) value of the y axis

          Parameters
          + + +
          ref_yreference value
          +
          +
          + +

          Definition at line 30 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setUnitPara()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setUnitPara (std::string unit_para)
          +
          +

          Sets the unit of the parameter.

          Parameters
          + + +
          para_firstunit
          +
          +
          + +

          Definition at line 65 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setUnitX()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setUnitX (std::string unit_x)
          +
          +

          Sets the unit of the x axis.

          Parameters
          + + +
          para_firstunit
          +
          +
          + +

          Definition at line 45 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ setUnitY()

          + +
          +
          + + + + + + + + +
          void PlottyFile::setUnitY (std::string unit_y)
          +
          +

          Sets the unit of the y axis.

          Parameters
          + + +
          para_firstunit
          +
          +
          + +

          Definition at line 55 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ startPlotty()

          + +
          +
          + + + + + + + + +
          void PlottyFile::startPlotty (std::string filename)
          +
          +

          Starts plotty with a plot file.

          Parameters
          + + +
          filenameplot path
          +
          +
          + +

          Definition at line 196 of file plottyfile.cpp.

          + +
          +
          + +

          ◆ writeToFile()

          + +
          +
          + + + + + + + + +
          void PlottyFile::writeToFile (std::string filename)
          +
          +

          Saves the PlottyFile in a binary format, ready to open with plotty.

          Parameters
          + + +
          filenamedesired plot path
          +
          +
          + +

          Definition at line 147 of file plottyfile.cpp.

          + +
          +
          +
          The documentation for this class was generated from the following files: +
          + + + + diff --git a/docs/html/classTimeoutException-members.html b/docs/html/classTimeoutException-members.html new file mode 100644 index 0000000..15cc27f --- /dev/null +++ b/docs/html/classTimeoutException-members.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          TimeoutException Member List
          +
          +
          + +

          This is the complete list of members for TimeoutException, including all inherited members.

          + + + + + + +
          msgTimeoutExceptionprotected
          TimeoutException(const char *message)TimeoutExceptioninlineexplicit
          TimeoutException(const std::string &message)TimeoutExceptioninlineexplicit
          what() constTimeoutExceptioninlinevirtual
          ~TimeoutException()=defaultTimeoutExceptionvirtual
          + + + + diff --git a/docs/html/classTimeoutException.html b/docs/html/classTimeoutException.html new file mode 100644 index 0000000..015849c --- /dev/null +++ b/docs/html/classTimeoutException.html @@ -0,0 +1,247 @@ + + + + + + + +B15F: TimeoutException Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          + +
          +
          TimeoutException Class Reference
          +
          +
          + +

          #include <timeoutexception.h>

          +
          + + Inheritance diagram for TimeoutException:
          +
          +
          + + + + + + + + + + + +

          +Public Member Functions

           TimeoutException (const char *message)
           
           TimeoutException (const std::string &message)
           
          virtual ~TimeoutException ()=default
           
          virtual const char * what () const throw ()
           
          + + + + +

          +Protected Attributes

          +std::string msg
           failure description
           
          +

          Detailed Description

          +

          Exception for USART related timeouts.

          + +

          Definition at line 9 of file timeoutexception.h.

          +

          Constructor & Destructor Documentation

          + +

          ◆ TimeoutException() [1/2]

          + +
          +
          + + + + + +
          + + + + + + + + +
          TimeoutException::TimeoutException (const char * message)
          +
          +inlineexplicit
          +
          +

          Constructor

          Parameters
          + + +
          messageas c-string
          +
          +
          + +

          Definition at line 16 of file timeoutexception.h.

          + +
          +
          + +

          ◆ TimeoutException() [2/2]

          + +
          +
          + + + + + +
          + + + + + + + + +
          TimeoutException::TimeoutException (const std::string & message)
          +
          +inlineexplicit
          +
          +

          Constructor

          Parameters
          + + +
          messageas c++-string
          +
          +
          + +

          Definition at line 24 of file timeoutexception.h.

          + +
          +
          + +

          ◆ ~TimeoutException()

          + +
          +
          + + + + + +
          + + + + + + + +
          virtual TimeoutException::~TimeoutException ()
          +
          +virtualdefault
          +
          +

          Standard-destructor

          + +
          +
          +

          Member Function Documentation

          + +

          ◆ what()

          + +
          +
          + + + + + +
          + + + + + + + + + + + + + +
          virtual const char* TimeoutException::what () const
          throw (
          )
          +
          +inlinevirtual
          +
          +

          Get failure description

          Returns
          error message as c-string
          + +

          Definition at line 37 of file timeoutexception.h.

          + +
          +
          +
          The documentation for this class was generated from the following file: +
          + + + + diff --git a/docs/html/classTimeoutException.png b/docs/html/classTimeoutException.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f464dfd5052472436754ea90df9e19970149ba GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^c|aV%!3-qNf88Jgq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXg^F3W0Ln;{G&OKOkSb>K%eEOdM{~zCA zv!3DPBeclR`qYMn$2N&2E=@mk=Fb6@lie3QFRA>Sl~?(vmB+YblF5mwc|TV^neuv1 z+?&a|#lNa|Yh6=WdAL>YX+=+w(Mp-4vsAW9US8_^{KTnSH#$|e?!2^ie$@19`xa^6 zUcchqPfPEh*$WS!S!?v+o!yn#vS+_S%bvAcd1igSR=jZX63-UDNoo(*8ygohKakC1 zsQd9M&pdqo`n-*mzvh(w-(&2|ZqR*!(MPF-VKRs80Tm~9gHAZtp?Bs?d5H$`h0HUK z=)Y`}PUk$akiqtvM#C&8gRnGx!GNAPkF~cqz11w{&GZscFE}!P@wLo;t?RpXy)6sd zw(R)k-rHeZr-MjbiR{YZVw`b+&TTAs)--eZ6yLxc_>tDau@of%$620q{ zNIgf9w@rO{@~-0ZZ~tyCeSUGl+jD0&E}!@BRQ=TM9H1LqUNAs>@|f?@LC4!mnlfC0 P(ZS&9>gTe~DWM4f2U+LU literal 0 HcmV?d00001 diff --git a/docs/html/classUSART-members.html b/docs/html/classUSART-members.html new file mode 100644 index 0000000..56759ff --- /dev/null +++ b/docs/html/classUSART-members.html @@ -0,0 +1,94 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          USART Member List
          +
          +
          + +

          This is the complete list of members for USART, including all inherited members.

          + + + + + + + + + + + + + + + +
          clearInputBuffer(void)USART
          clearOutputBuffer(void)USART
          closeDevice(void)USART
          drop(uint8_t len)USART
          flushOutputBuffer(void)USART
          getBaudrate(void)USART
          getTimeout(void)USART
          openDevice(std::string device)USART
          receive(uint8_t *buffer, uint16_t offset, uint8_t len)USART
          setBaudrate(uint32_t baudrate)USART
          setTimeout(uint8_t timeout)USART
          transmit(uint8_t *buffer, uint16_t offset, uint8_t len)USART
          USART()=defaultUSARTexplicit
          ~USART(void)USARTvirtual
          + + + + diff --git a/docs/html/classUSART.html b/docs/html/classUSART.html new file mode 100644 index 0000000..556dd16 --- /dev/null +++ b/docs/html/classUSART.html @@ -0,0 +1,531 @@ + + + + + + + +B15F: USART Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          + +
          +
          USART Class Reference
          +
          +
          + +

          #include <usart.h>

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          +Public Member Functions

           USART ()=default
           
          virtual ~USART (void)
           
          void openDevice (std::string device)
           
          void closeDevice (void)
           
          void clearInputBuffer (void)
           
          void clearOutputBuffer (void)
           
          void flushOutputBuffer (void)
           
          void transmit (uint8_t *buffer, uint16_t offset, uint8_t len)
           
          void receive (uint8_t *buffer, uint16_t offset, uint8_t len)
           
          void drop (uint8_t len)
           
          uint32_t getBaudrate (void)
           
          uint8_t getTimeout (void)
           
          void setBaudrate (uint32_t baudrate)
           
          void setTimeout (uint8_t timeout)
           
          +

          Detailed Description

          +

          C++ Wrapper class for termios usart library.

          + +

          Definition at line 16 of file usart.h.

          +

          Constructor & Destructor Documentation

          + +

          ◆ USART()

          + +
          +
          + + + + + +
          + + + + + + + +
          USART::USART ()
          +
          +explicitdefault
          +
          +

          Standard-Konstruktor

          + +
          +
          + +

          ◆ ~USART()

          + +
          +
          + + + + + +
          + + + + + + + + +
          USART::~USART (void )
          +
          +virtual
          +
          +

          Destructor, ruft automatisch closeDevice() auf

          + +

          Definition at line 4 of file usart.cpp.

          + +
          +
          +

          Member Function Documentation

          + +

          ◆ clearInputBuffer()

          + +
          +
          + + + + + + + + +
          void USART::clearInputBuffer (void )
          +
          +

          Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gelesen wurden

          Exceptions
          + + +
          USARTException
          +
          +
          + +

          Definition at line 54 of file usart.cpp.

          + +
          +
          + +

          ◆ clearOutputBuffer()

          + +
          +
          + + + + + + + + +
          void USART::clearOutputBuffer (void )
          +
          +

          Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden

          Exceptions
          + + +
          USARTException
          +
          +
          + +

          Definition at line 61 of file usart.cpp.

          + +
          +
          + +

          ◆ closeDevice()

          + +
          +
          + + + + + + + + +
          void USART::closeDevice (void )
          +
          +

          Schließt die USART Schnittstelle

          Exceptions
          + + +
          USARTException
          +
          +
          + +

          Definition at line 43 of file usart.cpp.

          + +
          +
          + +

          ◆ drop()

          + +
          +
          + + + + + + + + +
          void USART::drop (uint8_t len)
          +
          +

          Receives n bytes but discards them

          Parameters
          + + +
          lencount of bytes to receive
          +
          +
          +
          Exceptions
          + + +
          USARTException
          +
          +
          + +

          Definition at line 114 of file usart.cpp.

          + +
          +
          + +

          ◆ flushOutputBuffer()

          + +
          +
          + + + + + + + + +
          void USART::flushOutputBuffer (void )
          +
          +

          Schreibt Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden

          Exceptions
          + + +
          USARTException
          +
          +
          + +

          Definition at line 68 of file usart.cpp.

          + +
          +
          + +

          ◆ getBaudrate()

          + +
          +
          + + + + + + + + +
          uint32_t USART::getBaudrate (void )
          +
          +

          Liefert die eingestellte Baudrate Änderungen werden erst nach einem open() wirksam

          + +

          Definition at line 121 of file usart.cpp.

          + +
          +
          + +

          ◆ getTimeout()

          + +
          +
          + + + + + + + + +
          uint8_t USART::getTimeout (void )
          +
          +

          Liefert den eingestellten Timeout (in Dezisekunden) Änderungen werden erst nach einem open() wirksam

          + +

          Definition at line 126 of file usart.cpp.

          + +
          +
          + +

          ◆ openDevice()

          + +
          +
          + + + + + + + + +
          void USART::openDevice (std::string device)
          +
          +

          Öffnet die USART Schnittstelle

          Parameters
          + + +
          deviceLinux-Gerätepfad
          +
          +
          +
          Exceptions
          + + +
          USARTException
          +
          +
          + +

          Definition at line 9 of file usart.cpp.

          + +
          +
          + +

          ◆ receive()

          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + +
          void USART::receive (uint8_t * buffer,
          uint16_t offset,
          uint8_t len 
          )
          +
          +

          Receives n bytes from USART and writes them into the buffer

          Parameters
          + + + + +
          buffertarget buffer
          offsetin buffer (mostly 0)
          lencount of bytes to receive
          +
          +
          +
          Exceptions
          + + +
          USARTException
          +
          +
          + +

          Definition at line 84 of file usart.cpp.

          + +
          +
          + +

          ◆ setBaudrate()

          + +
          +
          + + + + + + + + +
          void USART::setBaudrate (uint32_t baudrate)
          +
          +

          Setzt die Baudrate Änderungen werden erst nach openDevice() wirksam

          + +

          Definition at line 131 of file usart.cpp.

          + +
          +
          + +

          ◆ setTimeout()

          + +
          +
          + + + + + + + + +
          void USART::setTimeout (uint8_t timeout)
          +
          +

          Setzt den Timeout (in Dezisekunden) Änderungen werden erst nach openDevice() wirksam

          + +

          Definition at line 136 of file usart.cpp.

          + +
          +
          + +

          ◆ transmit()

          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + +
          void USART::transmit (uint8_t * buffer,
          uint16_t offset,
          uint8_t len 
          )
          +
          +

          Sends n bytes from the buffer over USART

          Parameters
          + + + + +
          buffertarget buffer
          offsetin buffer (mostly 0)
          lencount of bytes to send
          +
          +
          +
          Exceptions
          + + +
          USARTException
          +
          +
          + +

          Definition at line 75 of file usart.cpp.

          + +
          +
          +
          The documentation for this class was generated from the following files: +
          + + + + diff --git a/docs/html/classUSARTException-members.html b/docs/html/classUSARTException-members.html new file mode 100644 index 0000000..b634feb --- /dev/null +++ b/docs/html/classUSARTException-members.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          USARTException Member List
          +
          +
          + +

          This is the complete list of members for USARTException, including all inherited members.

          + + + + + + +
          msgUSARTExceptionprotected
          USARTException(const char *message)USARTExceptioninlineexplicit
          USARTException(const std::string &message)USARTExceptioninlineexplicit
          what() constUSARTExceptioninlinevirtual
          ~USARTException()=defaultUSARTExceptionvirtual
          + + + + diff --git a/docs/html/classUSARTException.html b/docs/html/classUSARTException.html new file mode 100644 index 0000000..83a3239 --- /dev/null +++ b/docs/html/classUSARTException.html @@ -0,0 +1,247 @@ + + + + + + + +B15F: USARTException Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          + +
          +
          USARTException Class Reference
          +
          +
          + +

          #include <usartexception.h>

          +
          + + Inheritance diagram for USARTException:
          +
          +
          + + + + + + + + + + + +

          +Public Member Functions

           USARTException (const char *message)
           
           USARTException (const std::string &message)
           
          virtual ~USARTException ()=default
           
          virtual const char * what () const throw ()
           
          + + + + +

          +Protected Attributes

          +std::string msg
           failure description
           
          +

          Detailed Description

          +

          Exception for USART problems, for instance buffer overflow.

          + +

          Definition at line 9 of file usartexception.h.

          +

          Constructor & Destructor Documentation

          + +

          ◆ USARTException() [1/2]

          + +
          +
          + + + + + +
          + + + + + + + + +
          USARTException::USARTException (const char * message)
          +
          +inlineexplicit
          +
          +

          Constructor

          Parameters
          + + +
          messageas c-string
          +
          +
          + +

          Definition at line 16 of file usartexception.h.

          + +
          +
          + +

          ◆ USARTException() [2/2]

          + +
          +
          + + + + + +
          + + + + + + + + +
          USARTException::USARTException (const std::string & message)
          +
          +inlineexplicit
          +
          +

          Constructor

          Parameters
          + + +
          messageas c++-string
          +
          +
          + +

          Definition at line 24 of file usartexception.h.

          + +
          +
          + +

          ◆ ~USARTException()

          + +
          +
          + + + + + +
          + + + + + + + +
          virtual USARTException::~USARTException ()
          +
          +virtualdefault
          +
          +

          Standard-destructor

          + +
          +
          +

          Member Function Documentation

          + +

          ◆ what()

          + +
          +
          + + + + + +
          + + + + + + + + + + + + + +
          virtual const char* USARTException::what () const
          throw (
          )
          +
          +inlinevirtual
          +
          +

          Get failure description

          Returns
          error message as c-string
          + +

          Definition at line 37 of file usartexception.h.

          + +
          +
          +
          The documentation for this class was generated from the following file: +
          + + + + diff --git a/docs/html/classUSARTException.png b/docs/html/classUSARTException.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9d8a0309fdd7afb6f89ea59a339d8db10bbbcc GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^*+3k?!3-od?^Fi>DTx4|5ZC|z{{xvX-h3_XKQsZz z0^Vow*xkP61Pb7PB|4S3kX^?$yrfBfi% zgfpvRsN3AKIUkh-+P?OmFiuPJOqev~P>E+ykNuMaSPXc_-p=(Z87q43w6#r)W<5%~uZYWuo{p0wz*BfMxS(U^vIL7VCf;tZDq4-z_`ycGQ SQS*RN!r + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          View Member List
          +
          +
          + +

          This is the complete list of members for View, including all inherited members.

          + + + + + + + + + + + + + + + + + + +
          calls (defined in View)Viewprotected
          draw(void)=0 (defined in View)Viewpure virtual
          getWinContext(void) (defined in View)Viewstatic
          height (defined in View)Viewprotected
          KEY_ENT (defined in View)Viewprotectedstatic
          keypress(int &key)=0 (defined in View)Viewpure virtual
          repaint(void) (defined in View)Viewvirtual
          setTitle(std::string title) (defined in View)Viewvirtual
          setWinContext(WINDOW *win) (defined in View)Viewstatic
          start_x (defined in View)Viewprotected
          start_y (defined in View)Viewprotected
          str_split(const std::string &str, const std::string delim) (defined in View)Viewstatic
          title (defined in View)Viewprotected
          View(void) (defined in View)View
          width (defined in View)Viewprotected
          win (defined in View)Viewprotectedstatic
          ~View(void) (defined in View)Viewvirtual
          + + + + diff --git a/docs/html/classView.html b/docs/html/classView.html new file mode 100644 index 0000000..38d7d02 --- /dev/null +++ b/docs/html/classView.html @@ -0,0 +1,165 @@ + + + + + + + +B15F: View Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          + +
          + +

          #include <view.h>

          +
          + + Inheritance diagram for View:
          +
          +
          + + + + + + + + + + + +

          +Public Member Functions

          +virtual void setTitle (std::string title)
           
          +virtual void repaint (void)
           
          +virtual void draw (void)=0
           
          +virtual call_t keypress (int &key)=0
           
          + + + + + + + +

          +Static Public Member Functions

          +static void setWinContext (WINDOW *win)
           
          +static WINDOW * getWinContext (void)
           
          +static std::vector< std::string > str_split (const std::string &str, const std::string delim)
           
          + + + + + + + + + + + + + +

          +Protected Attributes

          +int width
           
          +int height
           
          +int start_x = 0
           
          +int start_y = 0
           
          +std::string title
           
          +std::vector< call_t > calls
           
          + + + + + +

          +Static Protected Attributes

          +static WINDOW * win = nullptr
           
          +constexpr static int KEY_ENT = 10
           
          +

          Detailed Description

          +

          Base class for multiple views with the ncurses user interface.

          + +

          Definition at line 19 of file view.h.

          +

          The documentation for this class was generated from the following files: +
          + + + + diff --git a/docs/html/classView.png b/docs/html/classView.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf3f8ec4f16d3e0e3e78bbc7dee0f04ac962aaf GIT binary patch literal 1094 zcmeAS@N?(olHy`uVBq!ia0y~yVAKGzJ2;quWb&rALLem(;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z!i)&*QPIUC6svrKrsS^$GvBa;D_NJHQPhMqjOtMVTz z{{GnYo{RNEV0rbIdG33%+O}VlI1pyu_G&*XSHexERe21z@8(^7ecyTR+0WVm4B5U5 zUL7#t*l_jjf>(#Wf7{8o;dbxBU!nQ|4DmWBhBL7yh-fe@c3_l<)8^9yeRGo z4Bxm#4ix4}Yc?EaVlB9HSTl&hot5i=mJhPK5L$s!8bDLU8?tV1+v~%S{&jYBZDS;c zJi<#DQs!-1OGWl?n-cU!&(wS3lHyr$O)7IQuTSHgq9QA%;c3J*MMaX;Yf{g)1+zYG z{qGobSIznCsl4|>W$G1mo|mG!Wlu+bJ9l?(&GQ`T`cfWM&&{u1=uPGX(z`CMEv{z* zGSZ&MHBVaNI=lbgXZ|?b_l~kJ>Rz_(s@`1ty}?dzns_fZnWRB z{O-NDZ-3n{;}F@3+MpWoEX#x67hF4MTRyXc4+Xo+0cfC|{yM5OD-PM=2h3`!~I^&&f%cLdyOBqx><6net zX7QTD#|;fRU>LYHPEuLy;5jL9fy&7jjGZUteg1jtO#-C>@h#)uC@x&?~DMW-b z=mi5K92UVaXP$O4eVqNjdC9I`=kD0o?e~FRNi#isZtLFd&9Bz|xO#aBpU=Wwv5#+j zzWw>czlP)a=FL((S|PHM{TWMMntizURyK5h?`@{6vLmal*Hj&zeA(XX^Y$|`iAeF?cjOoI=Vxk;iVBUDW$}41u(QU8&-ee Ze<9&_e`9|{2Qbq!c)I$ztaD0e0stQD%u@gW literal 0 HcmV?d00001 diff --git a/docs/html/classViewInfo-members.html b/docs/html/classViewInfo-members.html new file mode 100644 index 0000000..fee337a --- /dev/null +++ b/docs/html/classViewInfo-members.html @@ -0,0 +1,107 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          ViewInfo Member List
          +
          +
          + +

          This is the complete list of members for ViewInfo, including all inherited members.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          calls (defined in View)Viewprotected
          close_offset_x (defined in ViewInfo)ViewInfoprotected
          close_offset_y (defined in ViewInfo)ViewInfoprotected
          draw(void) override (defined in ViewInfo)ViewInfovirtual
          getWinContext(void) (defined in View)Viewstatic
          height (defined in View)Viewprotected
          KEY_ENT (defined in View)Viewprotectedstatic
          keypress(int &key) override (defined in ViewInfo)ViewInfovirtual
          label_close (defined in ViewInfo)ViewInfoprotected
          repaint(void) (defined in View)Viewvirtual
          setCall(call_t call) (defined in ViewInfo)ViewInfovirtual
          setLabelClose(std::string label) (defined in ViewInfo)ViewInfovirtual
          setText(std::string text) (defined in ViewInfo)ViewInfovirtual
          setTitle(std::string title) (defined in View)Viewvirtual
          setWinContext(WINDOW *win) (defined in View)Viewstatic
          start_x (defined in View)Viewprotected
          start_y (defined in View)Viewprotected
          str_split(const std::string &str, const std::string delim) (defined in View)Viewstatic
          text (defined in ViewInfo)ViewInfoprotected
          text_offset_x (defined in ViewInfo)ViewInfoprotectedstatic
          text_offset_y (defined in ViewInfo)ViewInfoprotectedstatic
          title (defined in View)Viewprotected
          View(void) (defined in View)View
          ViewInfo(void) (defined in ViewInfo)ViewInfo
          width (defined in View)Viewprotected
          win (defined in View)Viewprotectedstatic
          ~View(void) (defined in View)Viewvirtual
          + + + + diff --git a/docs/html/classViewInfo.html b/docs/html/classViewInfo.html new file mode 100644 index 0000000..d5f9b57 --- /dev/null +++ b/docs/html/classViewInfo.html @@ -0,0 +1,193 @@ + + + + + + + +B15F: ViewInfo Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          + +
          + +

          #include <view_info.h>

          +
          + + Inheritance diagram for ViewInfo:
          +
          +
          + + + + + + + + + + + + + + + + + + +

          +Public Member Functions

          +virtual void setText (std::string text)
           
          +virtual void setLabelClose (std::string label)
           
          +virtual void setCall (call_t call)
           
          +virtual void draw (void) override
           
          +virtual call_t keypress (int &key) override
           
          - Public Member Functions inherited from View
          +virtual void setTitle (std::string title)
           
          +virtual void repaint (void)
           
          + + + + + + + + + + + + + + + + + + + + + + +

          +Protected Attributes

          +std::string text
           
          +std::string label_close
           
          +int close_offset_x = 0
           
          +int close_offset_y = 0
           
          - Protected Attributes inherited from View
          +int width
           
          +int height
           
          +int start_x = 0
           
          +int start_y = 0
           
          +std::string title
           
          +std::vector< call_t > calls
           
          + + + + + + + + + + +

          +Static Protected Attributes

          +constexpr static int text_offset_x = 2
           
          +constexpr static int text_offset_y = 3
           
          - Static Protected Attributes inherited from View
          +static WINDOW * win = nullptr
           
          +constexpr static int KEY_ENT = 10
           
          + + + + + + + + +

          +Additional Inherited Members

          - Static Public Member Functions inherited from View
          +static void setWinContext (WINDOW *win)
           
          +static WINDOW * getWinContext (void)
           
          +static std::vector< std::string > str_split (const std::string &str, const std::string delim)
           
          +

          Detailed Description

          +

          View for simple text message output.

          + +

          Definition at line 8 of file view_info.h.

          +

          The documentation for this class was generated from the following files: +
          + + + + diff --git a/docs/html/classViewInfo.png b/docs/html/classViewInfo.png new file mode 100644 index 0000000000000000000000000000000000000000..aad65ce79768ec3eed5393cc37cbd928531a73f8 GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^!9d)>!3-qVOjW-Jq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgcYC@xhEy=VoqKUovjUGRzq#?h|LW_z zI-*uxIo3XR*4le5mgMQ3vwInKDX744 zQq&jg&rdniWhY&Ew(9-PO_9d6d*+%(IC*9j{;Yc!w|rjwXW{gBySsxY*{RH#^yGNI z_1QBuj4zTI3Z5}OH~8T#U(n}O{!;i{{pIfkOcp|Z4EBdOAGljE{^3w>kblUsLuKid zIf{%sKoU{s=JXUlE}Wh5M*o2Ja=!*<)7tud&u%WyNYz@-_IbMHtkY+VH^_#cySk)TW2>HiI`1_3&+Cf+Tgm>o6=`+5tnNa2gFeU-`*%K?s__iJ zBpBvY9 + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          ViewMonitor Member List
          +
          +
          + +

          This is the complete list of members for ViewMonitor, including all inherited members.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          calls (defined in View)Viewprotected
          close_offset_x (defined in ViewInfo)ViewInfoprotected
          close_offset_y (defined in ViewInfo)ViewInfoprotected
          draw(void) override (defined in ViewInfo)ViewInfovirtual
          getWinContext(void) (defined in View)Viewstatic
          height (defined in View)Viewprotected
          KEY_ENT (defined in View)Viewprotectedstatic
          keypress(int &key) override (defined in ViewMonitor)ViewMonitorvirtual
          label_close (defined in ViewInfo)ViewInfoprotected
          repaint(void) (defined in View)Viewvirtual
          run_worker (defined in ViewMonitor)ViewMonitorprotected
          setCall(call_t call) (defined in ViewInfo)ViewInfovirtual
          setLabelClose(std::string label) (defined in ViewInfo)ViewInfovirtual
          setText(std::string text) (defined in ViewInfo)ViewInfovirtual
          setTitle(std::string title) (defined in View)Viewvirtual
          setWinContext(WINDOW *win) (defined in View)Viewstatic
          start_x (defined in View)Viewprotected
          start_y (defined in View)Viewprotected
          str_split(const std::string &str, const std::string delim) (defined in View)Viewstatic
          t_worker (defined in ViewMonitor)ViewMonitorprotected
          text (defined in ViewInfo)ViewInfoprotected
          text_offset_x (defined in ViewInfo)ViewInfoprotectedstatic
          text_offset_y (defined in ViewInfo)ViewInfoprotectedstatic
          title (defined in View)Viewprotected
          View(void) (defined in View)View
          ViewInfo(void) (defined in ViewInfo)ViewInfo
          ViewMonitor(void) (defined in ViewMonitor)ViewMonitor
          width (defined in View)Viewprotected
          win (defined in View)Viewprotectedstatic
          worker(void) (defined in ViewMonitor)ViewMonitorprotectedvirtual
          ~View(void) (defined in View)Viewvirtual
          + + + + diff --git a/docs/html/classViewMonitor.html b/docs/html/classViewMonitor.html new file mode 100644 index 0000000..d7bef95 --- /dev/null +++ b/docs/html/classViewMonitor.html @@ -0,0 +1,205 @@ + + + + + + + +B15F: ViewMonitor Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          + +
          + +

          #include <view_monitor.h>

          +
          + + Inheritance diagram for ViewMonitor:
          +
          +
          + + + + + + + + + + + + + + + + + + + +

          +Public Member Functions

          +virtual call_t keypress (int &key) override
           
          - Public Member Functions inherited from ViewInfo
          +virtual void setText (std::string text)
           
          +virtual void setLabelClose (std::string label)
           
          +virtual void setCall (call_t call)
           
          +virtual void draw (void) override
           
          - Public Member Functions inherited from View
          +virtual void setTitle (std::string title)
           
          +virtual void repaint (void)
           
          + + + +

          +Protected Member Functions

          +virtual void worker (void)
           
          + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          +Protected Attributes

          +volatile bool run_worker = true
           
          +std::thread t_worker
           
          - Protected Attributes inherited from ViewInfo
          +std::string text
           
          +std::string label_close
           
          +int close_offset_x = 0
           
          +int close_offset_y = 0
           
          - Protected Attributes inherited from View
          +int width
           
          +int height
           
          +int start_x = 0
           
          +int start_y = 0
           
          +std::string title
           
          +std::vector< call_t > calls
           
          + + + + + + + + + + + + + + + + + + +

          +Additional Inherited Members

          - Static Public Member Functions inherited from View
          +static void setWinContext (WINDOW *win)
           
          +static WINDOW * getWinContext (void)
           
          +static std::vector< std::string > str_split (const std::string &str, const std::string delim)
           
          - Static Protected Attributes inherited from ViewInfo
          +constexpr static int text_offset_x = 2
           
          +constexpr static int text_offset_y = 3
           
          - Static Protected Attributes inherited from View
          +static WINDOW * win = nullptr
           
          +constexpr static int KEY_ENT = 10
           
          +

          Detailed Description

          +

          View to display all B15 inputs.

          + +

          Definition at line 13 of file view_monitor.h.

          +

          The documentation for this class was generated from the following files: +
          + + + + diff --git a/docs/html/classViewMonitor.png b/docs/html/classViewMonitor.png new file mode 100644 index 0000000000000000000000000000000000000000..08ea716e04e938e5dddd2d9d3076d70a155ddce2 GIT binary patch literal 552 zcmeAS@N?(olHy`uVBq!ia0vp^!9d)>!3-qVOjW-Jq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgw|lxchEy=Vof|m0S%HVmJU;EufBT=S zIs*E`ULS2gw{$YA^h+t8+T(X^C1NHyc`jEu`te?7sgC%hlBUUio>pfM-b=sRww5(q zCG$vS`pkC)+a@eAbg$K)sypka@Y|eDQ%z50zVpv77g~KbvoD;suiZlRrSm0C&%!^& z%Xe4nFg%~Z(6sZQrSHc}(sTGzcYNV{e*KH>T!zLa!U}yQOh+dAHCSBY6mYj<6fP@c=sK4T_pGh@pn zpexPNXUaW(AZhyb^|jSctJM$m9e?>kZ9#YWxzu|z>hB5dE#4Vg{Mlr^4)?0;7ctY# z(@$R!Wvg8?b)u-16+1q@Rpyek(7u-*LDF7_AJRu6{1-oD!M<-|76z literal 0 HcmV?d00001 diff --git a/docs/html/classViewPromt-members.html b/docs/html/classViewPromt-members.html new file mode 100644 index 0000000..53bea32 --- /dev/null +++ b/docs/html/classViewPromt-members.html @@ -0,0 +1,113 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          ViewPromt Member List
          +
          +
          + +

          This is the complete list of members for ViewPromt, including all inherited members.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          button_offset_x (defined in ViewPromt)ViewPromtprotected
          button_offset_y (defined in ViewPromt)ViewPromtprotected
          call_confirm (defined in ViewPromt)ViewPromtprotected
          calls (defined in View)Viewprotected
          cancelable (defined in ViewPromt)ViewPromtprotected
          draw(void) override (defined in ViewPromt)ViewPromtvirtual
          getInput(void) (defined in ViewPromt)ViewPromtvirtual
          getWinContext(void) (defined in View)Viewstatic
          height (defined in View)Viewprotected
          input (defined in ViewPromt)ViewPromtprotected
          KEY_ENT (defined in View)Viewprotectedstatic
          keypress(int &key) override (defined in ViewPromt)ViewPromtvirtual
          label_cancel (defined in ViewPromt)ViewPromtprotected
          label_confirm (defined in ViewPromt)ViewPromtprotected
          message (defined in ViewPromt)ViewPromtprotected
          repaint(void) (defined in View)Viewvirtual
          selection (defined in ViewPromt)ViewPromtprotected
          sep (defined in ViewPromt)ViewPromtprotected
          setCancel(std::string name, bool cancelable) (defined in ViewPromt)ViewPromtvirtual
          setConfirm(std::string name, call_t call) (defined in ViewPromt)ViewPromtvirtual
          setMessage(std::string message) (defined in ViewPromt)ViewPromtvirtual
          setTitle(std::string title) (defined in View)Viewvirtual
          setWinContext(WINDOW *win) (defined in View)Viewstatic
          start_x (defined in View)Viewprotected
          start_y (defined in View)Viewprotected
          str_split(const std::string &str, const std::string delim) (defined in View)Viewstatic
          text_offset_x (defined in ViewPromt)ViewPromtprotectedstatic
          text_offset_y (defined in ViewPromt)ViewPromtprotectedstatic
          title (defined in View)Viewprotected
          View(void) (defined in View)View
          width (defined in View)Viewprotected
          win (defined in View)Viewprotectedstatic
          ~View(void) (defined in View)Viewvirtual
          + + + + diff --git a/docs/html/classViewPromt.html b/docs/html/classViewPromt.html new file mode 100644 index 0000000..fe120e6 --- /dev/null +++ b/docs/html/classViewPromt.html @@ -0,0 +1,213 @@ + + + + + + + +B15F: ViewPromt Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          + +
          + +

          #include <view_promt.h>

          +
          + + Inheritance diagram for ViewPromt:
          +
          +
          + + + + + + + + + + + + + + + + + + + + +

          +Public Member Functions

          +virtual void draw (void) override
           
          +virtual void setMessage (std::string message)
           
          +virtual void setConfirm (std::string name, call_t call)
           
          +virtual void setCancel (std::string name, bool cancelable)
           
          +virtual std::string getInput (void)
           
          +virtual call_t keypress (int &key) override
           
          - Public Member Functions inherited from View
          +virtual void setTitle (std::string title)
           
          +virtual void repaint (void)
           
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          +Protected Attributes

          +size_t selection = 1
           
          +std::string input
           
          +std::string message = "Input"
           
          +std::string label_confirm = "[ OK ]"
           
          +std::string sep = " "
           
          +std::string label_cancel = "[ Cancel ]"
           
          +call_t call_confirm = nullptr
           
          +bool cancelable = true
           
          +int button_offset_x = 0
           
          +int button_offset_y = 0
           
          - Protected Attributes inherited from View
          +int width
           
          +int height
           
          +int start_x = 0
           
          +int start_y = 0
           
          +std::string title
           
          +std::vector< call_t > calls
           
          + + + + + + + + + + +

          +Static Protected Attributes

          +constexpr static int text_offset_x = 2
           
          +constexpr static int text_offset_y = 2
           
          - Static Protected Attributes inherited from View
          +static WINDOW * win = nullptr
           
          +constexpr static int KEY_ENT = 10
           
          + + + + + + + + +

          +Additional Inherited Members

          - Static Public Member Functions inherited from View
          +static void setWinContext (WINDOW *win)
           
          +static WINDOW * getWinContext (void)
           
          +static std::vector< std::string > str_split (const std::string &str, const std::string delim)
           
          +

          Detailed Description

          +

          View for basic user text input.

          + +

          Definition at line 10 of file view_promt.h.

          +

          The documentation for this class was generated from the following files: +
          + + + + diff --git a/docs/html/classViewPromt.png b/docs/html/classViewPromt.png new file mode 100644 index 0000000000000000000000000000000000000000..525a1d7ad4319e9d11da58d27a0af6e1625f9d13 GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^9zYzx!3-pOw;gTc>RXezk_qR%(!5#&ICMi=hTe{o8%wj1Cje1KVJh2f?nD zzij-E?9^gVzw&o4$AaYUxS3TK&BCv-L@nsrmU>Q4|MYh5z}xq_XVt$wptM`CwztUb zc=@XrtFF~m-oLT`x5E{t`#1Z$`eZMB_6YGR)LIp~n%zQQ_W%RX?9KNQjW>V)!?59} WKw#*X`DMTmWAJqKb6Mw<&;$Sl$ELIZ literal 0 HcmV?d00001 diff --git a/docs/html/classViewSelection-members.html b/docs/html/classViewSelection-members.html new file mode 100644 index 0000000..a8ee44d --- /dev/null +++ b/docs/html/classViewSelection-members.html @@ -0,0 +1,102 @@ + + + + + + + +B15F: Member List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          +
          +
          +
          ViewSelection Member List
          +
          +
          + +

          This is the complete list of members for ViewSelection, including all inherited members.

          + + + + + + + + + + + + + + + + + + + + + + + +
          addChoice(std::string name, call_t call) (defined in ViewSelection)ViewSelectionvirtual
          calls (defined in View)Viewprotected
          choice_offset_x (defined in ViewSelection)ViewSelectionprotectedstatic
          choice_offset_y (defined in ViewSelection)ViewSelectionprotectedstatic
          choices (defined in ViewSelection)ViewSelectionprotected
          draw(void) override (defined in ViewSelection)ViewSelectionvirtual
          getWinContext(void) (defined in View)Viewstatic
          height (defined in View)Viewprotected
          KEY_ENT (defined in View)Viewprotectedstatic
          keypress(int &key) override (defined in ViewSelection)ViewSelectionvirtual
          repaint(void) (defined in View)Viewvirtual
          selection (defined in ViewSelection)ViewSelectionprotected
          setTitle(std::string title) (defined in View)Viewvirtual
          setWinContext(WINDOW *win) (defined in View)Viewstatic
          start_x (defined in View)Viewprotected
          start_y (defined in View)Viewprotected
          str_split(const std::string &str, const std::string delim) (defined in View)Viewstatic
          title (defined in View)Viewprotected
          View(void) (defined in View)View
          width (defined in View)Viewprotected
          win (defined in View)Viewprotectedstatic
          ~View(void) (defined in View)Viewvirtual
          + + + + diff --git a/docs/html/classViewSelection.html b/docs/html/classViewSelection.html new file mode 100644 index 0000000..4f5f2af --- /dev/null +++ b/docs/html/classViewSelection.html @@ -0,0 +1,180 @@ + + + + + + + +B15F: ViewSelection Class Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + +
          + +
          + +

          #include <view_selection.h>

          +
          + + Inheritance diagram for ViewSelection:
          +
          +
          + + + + + + + + + + + + + + +

          +Public Member Functions

          +virtual void draw (void) override
           
          +virtual void addChoice (std::string name, call_t call)
           
          +virtual call_t keypress (int &key) override
           
          - Public Member Functions inherited from View
          +virtual void setTitle (std::string title)
           
          +virtual void repaint (void)
           
          + + + + + + + + + + + + + + + + + + +

          +Protected Attributes

          +size_t selection = 0
           
          +std::vector< std::string > choices
           
          - Protected Attributes inherited from View
          +int width
           
          +int height
           
          +int start_x = 0
           
          +int start_y = 0
           
          +std::string title
           
          +std::vector< call_t > calls
           
          + + + + + + + + + + +

          +Static Protected Attributes

          +constexpr static int choice_offset_x = 2
           
          +constexpr static int choice_offset_y = 3
           
          - Static Protected Attributes inherited from View
          +static WINDOW * win = nullptr
           
          +constexpr static int KEY_ENT = 10
           
          + + + + + + + + +

          +Additional Inherited Members

          - Static Public Member Functions inherited from View
          +static void setWinContext (WINDOW *win)
           
          +static WINDOW * getWinContext (void)
           
          +static std::vector< std::string > str_split (const std::string &str, const std::string delim)
           
          +

          Detailed Description

          +

          View for user selection input.

          + +

          Definition at line 10 of file view_selection.h.

          +

          The documentation for this class was generated from the following files: +
          + + + + diff --git a/docs/html/classViewSelection.png b/docs/html/classViewSelection.png new file mode 100644 index 0000000000000000000000000000000000000000..53db457549061d2bf812fb126b706a61b545e1e8 GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^F+d!^!3-o9e|{tgq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgojhF}Ln;{G&SlJNRS;lpcYpM^|IT`a z72UdK^|wu8AFqf^o$yq)VNUV4CLK?^mY7LA`*r<)Z?*Bbq~iZ%(wB~z+t%E3TjhOY z;u34QQ>V{{-t+g|m9C}xG~WDv)sBPu;mDT>oo znz!3LpEH-C;sDcw*5x&kGH>U7ntuEIJFWkRGdV3ARG%=kO<}iy%?9#e46Q& z`0sYp3%_q~JGF3+_IIcF@XFd>AA(-{{&K042>$B)^K8rXEmw|jI%oAiarL>c-@e4$ z + + + + + + +B15F: Class Index + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + +
          + +
          +
          + + +
          + +
          + +
          +
          +
          Class Index
          +
          +
          +
          b | d | p | t | u | v
          + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            b  
          +
          DriverException   
            u  
          +
          ViewInfo   
            p  
          +
          ViewMonitor   
          B15F   USART   ViewPromt   
            d  
          +
          PlottyFile   USARTException   ViewSelection   
            t  
          +
            v  
          +
          Dot   
          TimeoutException   View   
          +
          b | d | p | t | u | v
          +
          + + + + diff --git a/docs/html/cli_8cpp_source.html b/docs/html/cli_8cpp_source.html new file mode 100644 index 0000000..a829e2a --- /dev/null +++ b/docs/html/cli_8cpp_source.html @@ -0,0 +1,80 @@ + + + + + + + +B15F: cli.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          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
          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 }
          + +
          static B15F & getInstance(void)
          Definition: b15f.cpp:442
          +
          static void setAbortHandler(errorhandler_t func)
          Definition: b15f.cpp:485
          + + + + diff --git a/docs/html/closed.png b/docs/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html new file mode 100644 index 0000000..df74479 --- /dev/null +++ b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: ui Directory Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          ui Directory Reference
          +
          +
          +
          + + + + diff --git a/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html b/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html new file mode 100644 index 0000000..09e2ed5 --- /dev/null +++ b/docs/html/dir_19f2f1b99f19c12fa55b8d312cf373ed.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/3.14.3/CompilerIdC Directory Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          CompilerIdC Directory Reference
          +
          +
          +
          + + + + diff --git a/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html b/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html new file mode 100644 index 0000000..f2f6a5f --- /dev/null +++ b/docs/html/dir_3d3c8ff3ebf9841b39117ac899f41936.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/3.14.3 Directory Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          3.14.3 Directory Reference
          +
          +
          + + +

          +Directories

          +
          + + + + diff --git a/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html new file mode 100644 index 0000000..d4aae6d --- /dev/null +++ b/docs/html/dir_587c94d866dbb2f408f78cf41f9b2f8d.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: drv Directory Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          drv Directory Reference
          +
          +
          +
          + + + + diff --git a/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html b/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html new file mode 100644 index 0000000..9bfc892 --- /dev/null +++ b/docs/html/dir_90e361ec3542f3dd076ea3ad19547437.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/3.14.3/CompilerIdCXX Directory Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          CompilerIdCXX Directory Reference
          +
          +
          +
          + + + + diff --git a/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html b/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html new file mode 100644 index 0000000..a5b199f --- /dev/null +++ b/docs/html/dir_95e29a8b8ee7c54052c171a88bb95675.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: cmake-build-debug Directory Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          cmake-build-debug Directory Reference
          +
          +
          + + +

          +Directories

          +
          + + + + diff --git a/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html b/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html new file mode 100644 index 0000000..a690f2b --- /dev/null +++ b/docs/html/dir_f89abcb304c928c7d889aa5625570de5.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles Directory Reference + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          CMakeFiles Directory Reference
          +
          +
          +
          + + + + diff --git a/docs/html/doc.png b/docs/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/docs/html/dot_8cpp_source.html b/docs/html/dot_8cpp_source.html new file mode 100644 index 0000000..acf3fde --- /dev/null +++ b/docs/html/dot_8cpp_source.html @@ -0,0 +1,85 @@ + + + + + + + +B15F: drv/dot.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          dot.cpp
          +
          +
          +
          1 #include "dot.h"
          2 
          3 Dot::Dot(uint16_t x, uint16_t y, uint8_t curve) : x(x), y(y), curve(curve)
          4 {
          5  if(curve >= 64)
          6  throw std::range_error("Kurvenindex muss im Bereich [0, 63] liegen");
          7 }
          8 
          9 uint16_t Dot::getX() const
          10 {
          11  return x;
          12 }
          13 
          14 uint16_t Dot::getY() const
          15 {
          16  return y;
          17 }
          18 
          19 uint8_t Dot::getCurve(void) const
          20 {
          21  return curve;
          22 }
          +
          uint16_t getX(void) const
          Definition: dot.cpp:9
          +
          uint16_t getY(void) const
          Definition: dot.cpp:14
          +
          uint8_t getCurve(void) const
          Definition: dot.cpp:19
          +
          Dot(uint16_t x, uint16_t y, uint8_t curve)
          Definition: dot.cpp:3
          + + + + diff --git a/docs/html/dot_8h_source.html b/docs/html/dot_8h_source.html new file mode 100644 index 0000000..51b1e8c --- /dev/null +++ b/docs/html/dot_8h_source.html @@ -0,0 +1,86 @@ + + + + + + + +B15F: drv/dot.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          dot.h
          +
          +
          +
          1 #ifndef DOT_H
          2 #define DOT_H
          3 
          4 #include <cstdint>
          5 #include <stdexcept>
          6 
          12 class Dot
          13 {
          14 public:
          18  Dot(uint16_t x, uint16_t y, uint8_t curve);
          19 
          23  uint16_t getX(void) const;
          24 
          28  uint16_t getY(void) const;
          29 
          33  uint8_t getCurve(void) const;
          34 
          35 private:
          36  uint16_t x, y;
          37  uint8_t curve;
          38 };
          39 
          40 
          41 #endif // DOT_H
          +
          uint16_t getX(void) const
          Definition: dot.cpp:9
          +
          Definition: dot.h:12
          +
          uint16_t getY(void) const
          Definition: dot.cpp:14
          +
          uint8_t getCurve(void) const
          Definition: dot.cpp:19
          +
          Dot(uint16_t x, uint16_t y, uint8_t curve)
          Definition: dot.cpp:3
          + + + + diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css new file mode 100644 index 0000000..5bc13aa --- /dev/null +++ b/docs/html/doxygen.css @@ -0,0 +1,1766 @@ +/* The standard CSS for doxygen 1.8.16 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #FFFFFF; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/docs/html/doxygen.png b/docs/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/docs/html/driverexception_8h_source.html b/docs/html/driverexception_8h_source.html new file mode 100644 index 0000000..ee33149 --- /dev/null +++ b/docs/html/driverexception_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +B15F: drv/driverexception.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          driverexception.h
          +
          +
          +
          1 #ifndef DRIVEREXCEPTION_H
          2 #define DRIVEREXCEPTION_H
          3 
          4 #include <exception>
          5 
          6 // SOURCE: https://stackoverflow.com/a/8152888
          7 
          10 class DriverException: public std::exception
          11 {
          12 public:
          13  explicit DriverException(const char* message) : msg_(message)
          14  {
          15  }
          16 
          17  explicit DriverException(const std::string& message) : msg_(message)
          18  {
          19  }
          20 
          21  virtual ~DriverException() throw ()
          22  {
          23  }
          24 
          25  virtual const char* what() const throw ()
          26  {
          27  return msg_.c_str();
          28  }
          29 
          30 protected:
          31  std::string msg_;
          32 };
          33 
          34 #endif // DRIVEREXCEPTION_H
          35 
          + + + + + diff --git a/docs/html/dynsections.js b/docs/html/dynsections.js new file mode 100644 index 0000000..c8e84aa --- /dev/null +++ b/docs/html/dynsections.js @@ -0,0 +1,127 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +B15F: cmake-build-debug/CMakeFiles/feature_tests.c Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          feature_tests.c
          +
          +
          +
          1 
          2 const char features[] = {"\n"
          3  "C_FEATURE:"
          4 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304
          5  "1"
          6 #else
          7  "0"
          8 #endif
          9  "c_function_prototypes\n"
          10  "C_FEATURE:"
          11 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
          12  "1"
          13 #else
          14  "0"
          15 #endif
          16  "c_restrict\n"
          17  "C_FEATURE:"
          18 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L
          19  "1"
          20 #else
          21  "0"
          22 #endif
          23  "c_static_assert\n"
          24  "C_FEATURE:"
          25 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
          26  "1"
          27 #else
          28  "0"
          29 #endif
          30  "c_variadic_macros\n"
          31 
          32  };
          33 
          34 int main(int argc, char** argv)
          35 {
          36  (void)argv;
          37  return features[argc];
          38 }
          + + + + diff --git a/docs/html/feature__tests_8cxx_source.html b/docs/html/feature__tests_8cxx_source.html new file mode 100644 index 0000000..aba4067 --- /dev/null +++ b/docs/html/feature__tests_8cxx_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: cmake-build-debug/CMakeFiles/feature_tests.cxx Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          feature_tests.cxx
          +
          +
          +
          1 
          2  const char features[] = {"\n"
          3 "CXX_FEATURE:"
          4 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
          5 "1"
          6 #else
          7 "0"
          8 #endif
          9 "cxx_aggregate_default_initializers\n"
          10 "CXX_FEATURE:"
          11 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
          12 "1"
          13 #else
          14 "0"
          15 #endif
          16 "cxx_alias_templates\n"
          17 "CXX_FEATURE:"
          18 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
          19 "1"
          20 #else
          21 "0"
          22 #endif
          23 "cxx_alignas\n"
          24 "CXX_FEATURE:"
          25 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
          26 "1"
          27 #else
          28 "0"
          29 #endif
          30 "cxx_alignof\n"
          31 "CXX_FEATURE:"
          32 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
          33 "1"
          34 #else
          35 "0"
          36 #endif
          37 "cxx_attributes\n"
          38 "CXX_FEATURE:"
          39 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
          40 "1"
          41 #else
          42 "0"
          43 #endif
          44 "cxx_attribute_deprecated\n"
          45 "CXX_FEATURE:"
          46 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          47 "1"
          48 #else
          49 "0"
          50 #endif
          51 "cxx_auto_type\n"
          52 "CXX_FEATURE:"
          53 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
          54 "1"
          55 #else
          56 "0"
          57 #endif
          58 "cxx_binary_literals\n"
          59 "CXX_FEATURE:"
          60 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          61 "1"
          62 #else
          63 "0"
          64 #endif
          65 "cxx_constexpr\n"
          66 "CXX_FEATURE:"
          67 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
          68 "1"
          69 #else
          70 "0"
          71 #endif
          72 "cxx_contextual_conversions\n"
          73 "CXX_FEATURE:"
          74 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          75 "1"
          76 #else
          77 "0"
          78 #endif
          79 "cxx_decltype\n"
          80 "CXX_FEATURE:"
          81 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
          82 "1"
          83 #else
          84 "0"
          85 #endif
          86 "cxx_decltype_auto\n"
          87 "CXX_FEATURE:"
          88 #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L
          89 "1"
          90 #else
          91 "0"
          92 #endif
          93 "cxx_decltype_incomplete_return_types\n"
          94 "CXX_FEATURE:"
          95 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          96 "1"
          97 #else
          98 "0"
          99 #endif
          100 "cxx_default_function_template_args\n"
          101 "CXX_FEATURE:"
          102 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          103 "1"
          104 #else
          105 "0"
          106 #endif
          107 "cxx_defaulted_functions\n"
          108 "CXX_FEATURE:"
          109 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          110 "1"
          111 #else
          112 "0"
          113 #endif
          114 "cxx_defaulted_move_initializers\n"
          115 "CXX_FEATURE:"
          116 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
          117 "1"
          118 #else
          119 "0"
          120 #endif
          121 "cxx_delegating_constructors\n"
          122 "CXX_FEATURE:"
          123 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          124 "1"
          125 #else
          126 "0"
          127 #endif
          128 "cxx_deleted_functions\n"
          129 "CXX_FEATURE:"
          130 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
          131 "1"
          132 #else
          133 "0"
          134 #endif
          135 "cxx_digit_separators\n"
          136 "CXX_FEATURE:"
          137 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          138 "1"
          139 #else
          140 "0"
          141 #endif
          142 "cxx_enum_forward_declarations\n"
          143 "CXX_FEATURE:"
          144 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          145 "1"
          146 #else
          147 "0"
          148 #endif
          149 "cxx_explicit_conversions\n"
          150 "CXX_FEATURE:"
          151 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
          152 "1"
          153 #else
          154 "0"
          155 #endif
          156 "cxx_extended_friend_declarations\n"
          157 "CXX_FEATURE:"
          158 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          159 "1"
          160 #else
          161 "0"
          162 #endif
          163 "cxx_extern_templates\n"
          164 "CXX_FEATURE:"
          165 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
          166 "1"
          167 #else
          168 "0"
          169 #endif
          170 "cxx_final\n"
          171 "CXX_FEATURE:"
          172 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          173 "1"
          174 #else
          175 "0"
          176 #endif
          177 "cxx_func_identifier\n"
          178 "CXX_FEATURE:"
          179 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          180 "1"
          181 #else
          182 "0"
          183 #endif
          184 "cxx_generalized_initializers\n"
          185 "CXX_FEATURE:"
          186 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
          187 "1"
          188 #else
          189 "0"
          190 #endif
          191 "cxx_generic_lambdas\n"
          192 "CXX_FEATURE:"
          193 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
          194 "1"
          195 #else
          196 "0"
          197 #endif
          198 "cxx_inheriting_constructors\n"
          199 "CXX_FEATURE:"
          200 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          201 "1"
          202 #else
          203 "0"
          204 #endif
          205 "cxx_inline_namespaces\n"
          206 "CXX_FEATURE:"
          207 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          208 "1"
          209 #else
          210 "0"
          211 #endif
          212 "cxx_lambdas\n"
          213 "CXX_FEATURE:"
          214 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
          215 "1"
          216 #else
          217 "0"
          218 #endif
          219 "cxx_lambda_init_captures\n"
          220 "CXX_FEATURE:"
          221 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          222 "1"
          223 #else
          224 "0"
          225 #endif
          226 "cxx_local_type_template_args\n"
          227 "CXX_FEATURE:"
          228 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          229 "1"
          230 #else
          231 "0"
          232 #endif
          233 "cxx_long_long_type\n"
          234 "CXX_FEATURE:"
          235 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          236 "1"
          237 #else
          238 "0"
          239 #endif
          240 "cxx_noexcept\n"
          241 "CXX_FEATURE:"
          242 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
          243 "1"
          244 #else
          245 "0"
          246 #endif
          247 "cxx_nonstatic_member_init\n"
          248 "CXX_FEATURE:"
          249 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          250 "1"
          251 #else
          252 "0"
          253 #endif
          254 "cxx_nullptr\n"
          255 "CXX_FEATURE:"
          256 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
          257 "1"
          258 #else
          259 "0"
          260 #endif
          261 "cxx_override\n"
          262 "CXX_FEATURE:"
          263 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          264 "1"
          265 #else
          266 "0"
          267 #endif
          268 "cxx_range_for\n"
          269 "CXX_FEATURE:"
          270 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          271 "1"
          272 #else
          273 "0"
          274 #endif
          275 "cxx_raw_string_literals\n"
          276 "CXX_FEATURE:"
          277 #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L
          278 "1"
          279 #else
          280 "0"
          281 #endif
          282 "cxx_reference_qualified_functions\n"
          283 "CXX_FEATURE:"
          284 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
          285 "1"
          286 #else
          287 "0"
          288 #endif
          289 "cxx_relaxed_constexpr\n"
          290 "CXX_FEATURE:"
          291 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L
          292 "1"
          293 #else
          294 "0"
          295 #endif
          296 "cxx_return_type_deduction\n"
          297 "CXX_FEATURE:"
          298 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          299 "1"
          300 #else
          301 "0"
          302 #endif
          303 "cxx_right_angle_brackets\n"
          304 "CXX_FEATURE:"
          305 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          306 "1"
          307 #else
          308 "0"
          309 #endif
          310 "cxx_rvalue_references\n"
          311 "CXX_FEATURE:"
          312 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          313 "1"
          314 #else
          315 "0"
          316 #endif
          317 "cxx_sizeof_member\n"
          318 "CXX_FEATURE:"
          319 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          320 "1"
          321 #else
          322 "0"
          323 #endif
          324 "cxx_static_assert\n"
          325 "CXX_FEATURE:"
          326 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          327 "1"
          328 #else
          329 "0"
          330 #endif
          331 "cxx_strong_enums\n"
          332 "CXX_FEATURE:"
          333 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus
          334 "1"
          335 #else
          336 "0"
          337 #endif
          338 "cxx_template_template_parameters\n"
          339 "CXX_FEATURE:"
          340 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L
          341 "1"
          342 #else
          343 "0"
          344 #endif
          345 "cxx_thread_local\n"
          346 "CXX_FEATURE:"
          347 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          348 "1"
          349 #else
          350 "0"
          351 #endif
          352 "cxx_trailing_return_types\n"
          353 "CXX_FEATURE:"
          354 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          355 "1"
          356 #else
          357 "0"
          358 #endif
          359 "cxx_unicode_literals\n"
          360 "CXX_FEATURE:"
          361 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          362 "1"
          363 #else
          364 "0"
          365 #endif
          366 "cxx_uniform_initialization\n"
          367 "CXX_FEATURE:"
          368 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          369 "1"
          370 #else
          371 "0"
          372 #endif
          373 "cxx_unrestricted_unions\n"
          374 "CXX_FEATURE:"
          375 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L
          376 "1"
          377 #else
          378 "0"
          379 #endif
          380 "cxx_user_literals\n"
          381 "CXX_FEATURE:"
          382 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L
          383 "1"
          384 #else
          385 "0"
          386 #endif
          387 "cxx_variable_templates\n"
          388 "CXX_FEATURE:"
          389 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          390 "1"
          391 #else
          392 "0"
          393 #endif
          394 "cxx_variadic_macros\n"
          395 "CXX_FEATURE:"
          396 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__))
          397 "1"
          398 #else
          399 "0"
          400 #endif
          401 "cxx_variadic_templates\n"
          402 
          403 };
          404 
          405 int main(int argc, char** argv) { (void)argv; return features[argc]; }
          + + + + diff --git a/docs/html/files.html b/docs/html/files.html new file mode 100644 index 0000000..3ad0f6b --- /dev/null +++ b/docs/html/files.html @@ -0,0 +1,117 @@ + + + + + + + +B15F: File List + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + +
          + +
          +
          + + +
          + +
          + +
          +
          +
          File List
          +
          +
          +
          Here is a list of all documented files with brief descriptions:
          +
          [detail level 12345]
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            cmake-build-debug
            CMakeFiles
            3.14.3
            CompilerIdC
           CMakeCCompilerId.c
            CompilerIdCXX
           CMakeCXXCompilerId.cpp
           feature_tests.c
           feature_tests.cxx
            drv
           b15f.cpp
           b15f.h
           backup.cpp
           dot.cpp
           dot.h
           driverexception.h
           plottyfile.cpp
           plottyfile.h
           timeoutexception.h
           usart.cpp
           usart.h
           usartexception.h
            ui
           ui.cpp
           ui.h
           view.cpp
           view.h
           view_info.cpp
           view_info.h
           view_monitor.cpp
           view_monitor.h
           view_promt.cpp
           view_promt.h
           view_selection.cpp
           view_selection.h
           cli.cpp
          +
          +
          + + + + diff --git a/docs/html/folderclosed.png b/docs/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/docs/html/functions.html b/docs/html/functions.html new file mode 100644 index 0000000..30bdf0a --- /dev/null +++ b/docs/html/functions.html @@ -0,0 +1,388 @@ + + + + + + + +B15F: Class Members + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + +
          + +
          +
          + + +
          + +
          + +
          +
          Here is a list of all documented class members with links to the class documentation for each member:
          + +

          - a -

            +
          • abort() +: B15F +
          • +
          • activateSelfTestMode() +: B15F +
          • +
          • addDot() +: PlottyFile +
          • +
          • analogRead() +: B15F +
          • +
          • analogSequence() +: B15F +
          • +
          • analogWrite0() +: B15F +
          • +
          • analogWrite1() +: B15F +
          • +
          + + +

          - b -

            +
          • BAUDRATE +: B15F +
          • +
          + + +

          - c -

            +
          • clearInputBuffer() +: USART +
          • +
          • clearOutputBuffer() +: USART +
          • +
          • closeDevice() +: USART +
          • +
          + + +

          - d -

            +
          • delay_ms() +: B15F +
          • +
          • delay_us() +: B15F +
          • +
          • digitalRead0() +: B15F +
          • +
          • digitalRead1() +: B15F +
          • +
          • digitalWrite0() +: B15F +
          • +
          • digitalWrite1() +: B15F +
          • +
          • discard() +: B15F +
          • +
          • Dot() +: Dot +
          • +
          • drop() +: USART +
          • +
          + + +

          - e -

            +
          • exec() +: B15F +
          • +
          + + +

          - f -

            +
          • flushOutputBuffer() +: USART +
          • +
          + + +

          - g -

          + + +

          - m -

          + + +

          - o -

            +
          • openDevice() +: USART +
          • +
          + + +

          - p -

            +
          • PRE +: B15F +
          • +
          • pwmSetFrequency() +: B15F +
          • +
          • pwmSetValue() +: B15F +
          • +
          + + +

          - r -

            +
          • readDipSwitch() +: B15F +
          • +
          • receive() +: USART +
          • +
          • reconnect() +: B15F +
          • +
          • RECONNECT_TIMEOUT +: B15F +
          • +
          • RECONNECT_TRIES +: B15F +
          • +
          + + +

          - s -

          + + +

          - t -

          + + +

          - u -

          + + +

          - w -

          + + +

          - ~ -

          +
          + + + + diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html new file mode 100644 index 0000000..f5b2bf5 --- /dev/null +++ b/docs/html/functions_func.html @@ -0,0 +1,355 @@ + + + + + + + +B15F: Class Members - Functions + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + +
          + +
          +
          + + +
          + +
          + +
          +  + +

          - a -

            +
          • abort() +: B15F +
          • +
          • activateSelfTestMode() +: B15F +
          • +
          • addDot() +: PlottyFile +
          • +
          • analogRead() +: B15F +
          • +
          • analogSequence() +: B15F +
          • +
          • analogWrite0() +: B15F +
          • +
          • analogWrite1() +: B15F +
          • +
          + + +

          - c -

            +
          • clearInputBuffer() +: USART +
          • +
          • clearOutputBuffer() +: USART +
          • +
          • closeDevice() +: USART +
          • +
          + + +

          - d -

            +
          • delay_ms() +: B15F +
          • +
          • delay_us() +: B15F +
          • +
          • digitalRead0() +: B15F +
          • +
          • digitalRead1() +: B15F +
          • +
          • digitalWrite0() +: B15F +
          • +
          • digitalWrite1() +: B15F +
          • +
          • discard() +: B15F +
          • +
          • Dot() +: Dot +
          • +
          • drop() +: USART +
          • +
          + + +

          - e -

            +
          • exec() +: B15F +
          • +
          + + +

          - f -

            +
          • flushOutputBuffer() +: USART +
          • +
          + + +

          - g -

          + + +

          - o -

            +
          • openDevice() +: USART +
          • +
          + + +

          - p -

            +
          • pwmSetFrequency() +: B15F +
          • +
          • pwmSetValue() +: B15F +
          • +
          + + +

          - r -

            +
          • readDipSwitch() +: B15F +
          • +
          • receive() +: USART +
          • +
          • reconnect() +: B15F +
          • +
          + + +

          - s -

          + + +

          - t -

          + + +

          - u -

          + + +

          - w -

          + + +

          - ~ -

          +
          + + + + diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html new file mode 100644 index 0000000..ae7d02a --- /dev/null +++ b/docs/html/functions_vars.html @@ -0,0 +1,100 @@ + + + + + + + +B15F: Class Members - Variables + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + +
          + +
          +
          + + +
          + +
          + +
          +
          + + + + diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html new file mode 100644 index 0000000..7eaae9a --- /dev/null +++ b/docs/html/hierarchy.html @@ -0,0 +1,94 @@ + + + + + + + +B15F: Class Hierarchy + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + +
          + +
          +
          + + +
          + +
          + +
          +
          +
          Class Hierarchy
          +
          +
          +
          This inheritance list is sorted roughly, but not completely, alphabetically:
          +
          [detail level 123]
          + + + + + + + + + + + + + +
           CB15F
           CDot
           Cexception
           CDriverException
           CTimeoutException
           CUSARTException
           CPlottyFile
           CUSART
           CView
           CViewInfo
           CViewMonitor
           CViewPromt
           CViewSelection
          +
          +
          + + + + diff --git a/docs/html/index.html b/docs/html/index.html new file mode 100644 index 0000000..b291453 --- /dev/null +++ b/docs/html/index.html @@ -0,0 +1,154 @@ + + + + + + + +B15F: B15F Benutzerhandbuch + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + +
          + +
          +
          + + +
          + +
          + +
          +
          +
          B15F Benutzerhandbuch
          +
          +
          +

          Hinweis: Terminal-Befehle sind fett gedruckt

          +

          +Installation

          +

          +1. Abhängigkeiten installieren

          +

          (a) sudo apt-get update
          + (b) sudo apt-get install git avr-libc avrdude libncurses5-dev g++
          +

          +

          +2. Das Repository klonen

          +

          (a) cd /home/famulus/
          + (b) git clone "https://github.com/devfix/b15f.git"
          +

          +

          +3. Die Firmware installieren

          +

          (a) cd "/home/famulus/b15f/firmware"
          + (b) Passen Sie in der Datei Makefile die Option "MCU = ..." an die MCU des vorliegenden Boards an
          + (atmega1284 und atmega1284p sind nicht identisch!)
          + (c) make
          + Wenn udev richtig konfiguriert wurde:
          + (d I) make upload
          + Sonst:
          + (d II) sudo make upload
          +

          +

          +4. Die Steuersoftware (Bibliothek & CLI) installieren

          +

          (a) cd "/home/famulus/b15f/control/src"
          + (b) make
          + (Die Warnungen durch doxygen können ignoriert werden.)

          +

          (c) sudo make install
          +

          +

          +Aktualisierung

          +

          (a) cd /home/famulus/b15f/
          + (b) git pull –prune
          + (c) cd "/home/famulus/b15f/firmware"
          + (d) make clean
          + (e) cd "/home/famulus/b15f/control/src"
          + (f) make clean
          + (g) Installation ab Schritt 3 wiederholen

          +

          +Das CommandLineInterface (CLI) benutzen

          +

          (a) Öffnen Sie ein Terminal und maximieren Sie das Fenster
          + (b) Start des CLI erfolgt durch b15fcli
          + (c) Die Navigation erfolgt durch <Tab>, die Pfeiltasten und <Enter> oder die Maus
          + (d) Mit <Strg + c> kann das Programm sofort verlassen werden

          +

          +Eigene Programme mit B15F schreiben

          +

          +Grundsätzliches

          +

          Die wichtigste Klasse für die Steuerung des Board 15 ist B15F.
          +Dort befindet sich auch eine Übersicht der verfügbaren Befehle.
          +

          +

          +Beispiele

          +

          In dem Verzeichnis b15f/control/examples sind einige Beispiele für die Verwendung einzelner B15F Funktionen.
          +Zu jedem Beispiel gehört eine main.cpp mit dem Quellcode und eine Makefile-Datei.
          +Das Beispiel kann mit make kompiliert und mit **./main.elf** gestartet werden.

          +

          +Den B15F Treiber verwenden

          +

          Benötigt wird der B15F-Header:
          +#include <b15f/b15f.h>
          +und der Header für die plottyfile-Generierung, falls mit Kennlinien gearbeitet werden soll:
          +#include <b15f/plottyfile.h>

          +

          Für die Interaktion wird eine Referenz auf die aktuelle Treiberinstanz gespeichert:
          +B15F& drv = B15F::getInstance();
          +Falls noch keine existiert, wird automatisch eine erzeugt und Verbindung zum Board hergestellt.
          + Ab jetzt können auf dem Object drv verschiedene Methoden angewand werden, siehe B15F.
          +

          +

          +Kennlinien mit plottyfile generieren

          +

          Die Beschreibung zu Plottyfile befindet sich hier.
          +Nach dem Include von plottyfile kann ein neues Objekt erzeugt und konfiguriert werden:
          +

          {C++}
          PlottyFile pf;
          pf.setUnitX("V");
          pf.setUnitY("V");
          pf.setUnitPara("V");
          pf.setDescX("U_{OUT}");
          pf.setDescY("U_{IN}");
          pf.setDescPara("");
          pf.setRefX(5);
          pf.setRefY(5);
          pf.setParaFirstCurve(0);
          pf.setParaStepWidth(0);

          Messpunkte können anschließend hinzugefügt werden.
          +Dabei gehören Punkte mit dem gleichen Index für curve (uint8_t) zur selben Kurve und erhalten durch Plotty automatisch die gleiche Farbe.
          +

          {C++}
          pf.addDot(Dot(x, y, curve));

          x und y sind uint16_t, also keine Gleitkommazahlen.

          +
          +
          + + + + diff --git a/docs/html/jquery.js b/docs/html/jquery.js new file mode 100644 index 0000000..64861eb --- /dev/null +++ b/docs/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
          "],col:[2,"","
          "],tr:[2,"","
          "],td:[3,"","
          "],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          plottyfile.cpp
          +
          +
          +
          1 #include "plottyfile.h"
          2 
          4 {
          5  dots.push_back(dot);
          6 }
          7 
          9 {
          10  dots.push_back(dot);
          11 }
          12 
          13 void PlottyFile::setFunctionType(FunctionType function_type)
          14 {
          15  this->function_type = function_type;
          16 }
          17 
          18 void PlottyFile::setQuadrant(uint8_t quadrant)
          19 {
          20  if(quadrant < 1 || quadrant > 4)
          21  throw std::range_error("Ungueltiger Quadrant");
          22  this->quadrant = quadrant;
          23 }
          24 
          25 void PlottyFile::setRefX(uint16_t ref_x)
          26 {
          27  this->ref_x = ref_x;
          28 }
          29 
          30 void PlottyFile::setRefY(uint16_t ref_y)
          31 {
          32  this->ref_y = ref_y;
          33 }
          34 
          35 void PlottyFile::setParaFirstCurve(uint16_t para_first)
          36 {
          37  this->para_first = para_first;
          38 }
          39 
          40 void PlottyFile::setParaStepWidth(uint16_t para_stepwidth)
          41 {
          42  this->para_stepwidth = para_stepwidth;
          43 }
          44 
          45 void PlottyFile::setUnitX(std::string unit_x)
          46 {
          47  this->unit_x = unit_x;
          48 }
          49 
          50 void PlottyFile::setDescX(std::string desc_x)
          51 {
          52  this->desc_x = desc_x;
          53 }
          54 
          55 void PlottyFile::setUnitY(std::string unit_y)
          56 {
          57  this->unit_y = unit_y;
          58 }
          59 
          60 void PlottyFile::setDescY(std::string desc_y)
          61 {
          62  this->desc_y = desc_y;
          63 }
          64 
          65 void PlottyFile::setUnitPara(std::string unit_para)
          66 {
          67  this->unit_para = unit_para;
          68 }
          69 
          70 void PlottyFile::setDescPara(std::string desc_para)
          71 {
          72  this->desc_para = desc_para;
          73 }
          74 
          75 FunctionType PlottyFile::getFunctionType() const
          76 {
          77  return function_type;
          78 }
          79 
          80 uint8_t PlottyFile::getQuadrant() const
          81 {
          82  return quadrant;
          83 }
          84 
          85 uint16_t PlottyFile::getRefX() const
          86 {
          87  return ref_x;
          88 }
          89 
          90 uint16_t PlottyFile::getRefY() const
          91 {
          92  return ref_y;
          93 }
          94 
          96 {
          97  return para_first;
          98 }
          99 
          101 {
          102  return para_stepwidth;
          103 }
          104 
          105 std::string PlottyFile::getUnitX() const
          106 {
          107  return unit_x;
          108 }
          109 
          110 std::string PlottyFile::getDescX() const
          111 {
          112  return desc_x;
          113 }
          114 
          115 std::string PlottyFile::getUnitY() const
          116 {
          117  return unit_y;
          118 }
          119 
          120 std::string PlottyFile::getDescY() const
          121 {
          122  return desc_y;
          123 }
          124 
          125 std::string PlottyFile::getUnitPara() const
          126 {
          127  return unit_para;
          128 }
          129 
          130 std::string PlottyFile::getDescPara() const
          131 {
          132  return desc_para;
          133 }
          134 
          135 void PlottyFile::prepStr(std::string& str, uint8_t len)
          136 {
          137  if(str.length() > len)
          138  throw std::runtime_error("Zu grosser String.");
          139 
          140  if(str.length() != len)
          141  str += '\n';
          142 
          143  while(str.length() < len)
          144  str += '\0';
          145 }
          146 
          147 void PlottyFile::writeToFile(std::string filename)
          148 {
          149  if(dots.empty())
          150  throw std::length_error("Es wurden keine Punkte gespeichert.");
          151 
          152  prepStr(unit_x, STR_LEN_SHORT);
          153  prepStr(desc_x, STR_LEN_LARGE);
          154  prepStr(unit_y, STR_LEN_SHORT);
          155  prepStr(desc_y, STR_LEN_LARGE);
          156  prepStr(unit_para, STR_LEN_SHORT);
          157  prepStr(desc_para, STR_LEN_LARGE);
          158 
          159  std::ofstream file(filename);
          160 
          161  // write file header
          162  file.write(reinterpret_cast<char*>(&command), 1);
          163  file.write(head.c_str(), head.length());
          164  file.write(filetype.c_str(), filetype.length());
          165  file.write(reinterpret_cast<char*>(&version), 2);
          166  file.write(reinterpret_cast<char*>(&subversion), 2);
          167  file.put(static_cast<uint8_t>(function_type));
          168  file.write(reinterpret_cast<char*>(&quadrant), 1);
          169  file.write(reinterpret_cast<char*>(&ref_x), 2);
          170  file.write(reinterpret_cast<char*>(&ref_y), 2);
          171  file.write(reinterpret_cast<char*>(&para_first), 2);
          172  file.write(reinterpret_cast<char*>(&para_stepwidth), 2);
          173  file.write(unit_x.c_str(), unit_x.length());
          174  file.write(desc_x.c_str(), desc_x.length());
          175  file.write(unit_y.c_str(), unit_y.length());
          176  file.write(desc_y.c_str(), desc_y.length());
          177  file.write(unit_para.c_str(), unit_para.length());
          178  file.write(desc_para.c_str(), desc_para.length());
          179  file.write(reinterpret_cast<const char*>(&eof), 1);
          180 
          181  // make sure header size is 256 Byte
          182  while(file.tellp() < 256)
          183  file.put(0);
          184 
          185  for(Dot& dot : dots)
          186  {
          187  file.put((dot.getX() >> 8) | (static_cast<uint8_t>(dot.getCurve()) << 2));
          188  file.put(dot.getX() & 0xFF);
          189  file.put(dot.getY() >> 8);
          190  file.put(dot.getY() & 0xFF);
          191  }
          192 
          193  file.close();
          194 }
          195 
          196 void PlottyFile::startPlotty(std::string filename)
          197 {
          198  int code = system(("plotty --in " + filename).c_str());
          199  if(code)
          200  throw std::runtime_error("Fehler beim Aufruf von plotty");
          201 }
          +
          void setParaStepWidth(uint16_t para_stepwidth)
          Definition: plottyfile.cpp:40
          +
          uint8_t getQuadrant(void) const
          Definition: plottyfile.cpp:80
          +
          void startPlotty(std::string filename)
          Definition: plottyfile.cpp:196
          +
          void writeToFile(std::string filename)
          Definition: plottyfile.cpp:147
          +
          void setUnitX(std::string unit_x)
          Definition: plottyfile.cpp:45
          +
          void setUnitPara(std::string unit_para)
          Definition: plottyfile.cpp:65
          +
          void setDescY(std::string desc_y)
          Definition: plottyfile.cpp:60
          +
          void setQuadrant(uint8_t quadrant)
          Definition: plottyfile.cpp:18
          +
          std::string getDescY(void) const
          Definition: plottyfile.cpp:120
          +
          void setRefY(uint16_t ref_y)
          Definition: plottyfile.cpp:30
          +
          std::string getDescX(void) const
          Definition: plottyfile.cpp:110
          +
          void setFunctionType(FunctionType function_type)
          Definition: plottyfile.cpp:13
          +
          void setDescX(std::string desc_x)
          Definition: plottyfile.cpp:50
          +
          Definition: dot.h:12
          +
          void setRefX(uint16_t ref_x)
          Definition: plottyfile.cpp:25
          +
          void setUnitY(std::string unit_y)
          Definition: plottyfile.cpp:55
          +
          void addDot(Dot &dot)
          Definition: plottyfile.cpp:3
          +
          void setDescPara(std::string desc_para)
          Definition: plottyfile.cpp:70
          +
          uint16_t getParaStepWidth(void) const
          Definition: plottyfile.cpp:100
          +
          std::string getDescPara(void) const
          Definition: plottyfile.cpp:130
          +
          void setParaFirstCurve(uint16_t para_first)
          Definition: plottyfile.cpp:35
          +
          std::string getUnitY(void) const
          Definition: plottyfile.cpp:115
          +
          uint16_t getParaFirstCurve(void) const
          Definition: plottyfile.cpp:95
          +
          uint16_t getRefX(void) const
          Definition: plottyfile.cpp:85
          +
          std::string getUnitPara(void) const
          Definition: plottyfile.cpp:125
          +
          FunctionType getFunctionType(void) const
          Definition: plottyfile.cpp:75
          +
          uint16_t getRefY(void) const
          Definition: plottyfile.cpp:90
          +
          std::string getUnitX(void) const
          Definition: plottyfile.cpp:105
          + + + + diff --git a/docs/html/plottyfile_8h_source.html b/docs/html/plottyfile_8h_source.html new file mode 100644 index 0000000..1f19f61 --- /dev/null +++ b/docs/html/plottyfile_8h_source.html @@ -0,0 +1,110 @@ + + + + + + + +B15F: drv/plottyfile.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          plottyfile.h
          +
          +
          +
          1 #ifndef PLOTTYFILE_H
          2 #define PLOTTYFILE_H
          3 
          4 #include <iostream>
          5 #include <fstream>
          6 #include <exception>
          7 #include <vector>
          8 #include <stdexcept>
          9 #include "dot.h"
          10 
          11 enum FunctionType
          12 {
          13  CurveFamily = 'S',
          14  Curve = 'C',
          15  Level = 'P'
          16 };
          17 
          21 {
          22 public:
          27  void addDot(Dot& dot);
          28 
          33  void addDot(Dot dot);
          34 
          39  void setFunctionType(FunctionType function_type);
          40 
          45  void setQuadrant(uint8_t quadrant);
          46 
          51  void setRefX(uint16_t ref_x);
          52 
          57  void setRefY(uint16_t ref_y);
          58 
          64  void setParaFirstCurve(uint16_t para_first);
          65 
          70  void setParaStepWidth(uint16_t para_stepwidth);
          71 
          76  void setUnitX(std::string unit_x);
          77 
          82  void setDescX(std::string desc_x);
          83 
          88  void setUnitY(std::string unit_y);
          89 
          94  void setDescY(std::string desc_y);
          95 
          100  void setUnitPara(std::string unit_para);
          105  void setDescPara(std::string desc_para);
          106 
          107 
          108 
          112  FunctionType getFunctionType(void) const;
          113 
          117  uint8_t getQuadrant(void) const;
          118 
          122  uint16_t getRefX(void) const;
          123 
          127  uint16_t getRefY(void) const;
          128 
          132  uint16_t getParaFirstCurve(void) const;
          133 
          137  uint16_t getParaStepWidth(void) const;
          138 
          142  std::string getUnitX(void) const;
          143 
          147  std::string getDescX(void) const;
          148 
          152  std::string getUnitY(void) const;
          153 
          157  std::string getDescY(void) const;
          158 
          162  std::string getUnitPara(void) const;
          163 
          167  std::string getDescPara(void) const;
          168 
          169 
          174  void writeToFile(std::string filename);
          175 
          180  void startPlotty(std::string filename);
          181 private:
          182  void prepStr(std::string& str, uint8_t len);
          183 
          184  std::vector<Dot> dots;
          185 
          186  int8_t command = 0x1D;
          187  const std::string head = "HTWK-HWLab";
          188  const std::string filetype = "MD";
          189  int16_t version = 1;
          190  int16_t subversion = 0;
          191  FunctionType function_type = FunctionType::Curve;
          192  uint8_t quadrant = 1;
          193  uint16_t ref_x = 1023;
          194  uint16_t ref_y = 1023;
          195  uint16_t para_first = 1;
          196  uint16_t para_stepwidth = 1;
          197  std::string unit_x;
          198  std::string desc_x;
          199  std::string unit_y;
          200  std::string desc_y;
          201  std::string unit_para;
          202  std::string desc_para;
          203  const uint8_t eof = 0xD;
          204 
          205  constexpr static uint8_t STR_LEN_SHORT = 10;
          206  constexpr static uint8_t STR_LEN_LARGE = 20;
          207 };
          208 
          209 #endif // PLOTTYFILE_H
          +
          void setParaStepWidth(uint16_t para_stepwidth)
          Definition: plottyfile.cpp:40
          +
          uint8_t getQuadrant(void) const
          Definition: plottyfile.cpp:80
          +
          void startPlotty(std::string filename)
          Definition: plottyfile.cpp:196
          +
          void writeToFile(std::string filename)
          Definition: plottyfile.cpp:147
          +
          void setUnitX(std::string unit_x)
          Definition: plottyfile.cpp:45
          +
          void setUnitPara(std::string unit_para)
          Definition: plottyfile.cpp:65
          +
          void setDescY(std::string desc_y)
          Definition: plottyfile.cpp:60
          +
          void setQuadrant(uint8_t quadrant)
          Definition: plottyfile.cpp:18
          +
          std::string getDescY(void) const
          Definition: plottyfile.cpp:120
          + +
          void setRefY(uint16_t ref_y)
          Definition: plottyfile.cpp:30
          +
          std::string getDescX(void) const
          Definition: plottyfile.cpp:110
          +
          void setFunctionType(FunctionType function_type)
          Definition: plottyfile.cpp:13
          +
          void setDescX(std::string desc_x)
          Definition: plottyfile.cpp:50
          +
          Definition: dot.h:12
          +
          void setRefX(uint16_t ref_x)
          Definition: plottyfile.cpp:25
          +
          void setUnitY(std::string unit_y)
          Definition: plottyfile.cpp:55
          +
          void addDot(Dot &dot)
          Definition: plottyfile.cpp:3
          +
          void setDescPara(std::string desc_para)
          Definition: plottyfile.cpp:70
          +
          uint16_t getParaStepWidth(void) const
          Definition: plottyfile.cpp:100
          +
          std::string getDescPara(void) const
          Definition: plottyfile.cpp:130
          +
          void setParaFirstCurve(uint16_t para_first)
          Definition: plottyfile.cpp:35
          +
          std::string getUnitY(void) const
          Definition: plottyfile.cpp:115
          +
          uint16_t getParaFirstCurve(void) const
          Definition: plottyfile.cpp:95
          +
          uint16_t getRefX(void) const
          Definition: plottyfile.cpp:85
          +
          std::string getUnitPara(void) const
          Definition: plottyfile.cpp:125
          +
          FunctionType getFunctionType(void) const
          Definition: plottyfile.cpp:75
          +
          uint16_t getRefY(void) const
          Definition: plottyfile.cpp:90
          +
          std::string getUnitX(void) const
          Definition: plottyfile.cpp:105
          + + + + diff --git a/docs/html/search/all_0.html b/docs/html/search/all_0.html new file mode 100644 index 0000000..a52d5f0 --- /dev/null +++ b/docs/html/search/all_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js new file mode 100644 index 0000000..c4bd927 --- /dev/null +++ b/docs/html/search/all_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['abort',['abort',['../classB15F.html#a3f09a418f9e3be5d1d750e4515c96f1e',1,'B15F::abort(std::string msg)'],['../classB15F.html#ac962a6a49bddd0e261a8c7d3aded23f8',1,'B15F::abort(std::exception &ex)']]], + ['activateselftestmode',['activateSelfTestMode',['../classB15F.html#ad9bf80ee2485fb5aac9926c6ef0731f1',1,'B15F']]], + ['adddot',['addDot',['../classPlottyFile.html#ae091e6eaaca16302f17572ac7dec6f7c',1,'PlottyFile::addDot(Dot &dot)'],['../classPlottyFile.html#a80e4b45219b4e9571992edfc28a28568',1,'PlottyFile::addDot(Dot dot)']]], + ['analogread',['analogRead',['../classB15F.html#ae0bd1f69751e2dc3c462db9213fc4627',1,'B15F']]], + ['analogsequence',['analogSequence',['../classB15F.html#ab82a324426c3063318c6cafb3089ae02',1,'B15F']]], + ['analogwrite0',['analogWrite0',['../classB15F.html#afc55fd590c7fa5c942d100cb60c4b0d3',1,'B15F']]], + ['analogwrite1',['analogWrite1',['../classB15F.html#a7f1becceac744f5cd2ad529748fd836f',1,'B15F']]] +]; diff --git a/docs/html/search/all_1.html b/docs/html/search/all_1.html new file mode 100644 index 0000000..0fcb704 --- /dev/null +++ b/docs/html/search/all_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js new file mode 100644 index 0000000..5156238 --- /dev/null +++ b/docs/html/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['b15f',['B15F',['../classB15F.html',1,'']]], + ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]], + ['b15f_20benutzerhandbuch',['B15F Benutzerhandbuch',['../index.html',1,'']]] +]; diff --git a/docs/html/search/all_10.html b/docs/html/search/all_10.html new file mode 100644 index 0000000..c234738 --- /dev/null +++ b/docs/html/search/all_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js new file mode 100644 index 0000000..f5a3874 --- /dev/null +++ b/docs/html/search/all_10.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['_7etimeoutexception',['~TimeoutException',['../classTimeoutException.html#a2f686b262d2ccffa0090fda9b44ab540',1,'TimeoutException']]], + ['_7eusart',['~USART',['../classUSART.html#a0c8eb1a939ca00921e22f6cbcc7bb749',1,'USART']]], + ['_7eusartexception',['~USARTException',['../classUSARTException.html#a0e008b3cb4974859e6bc8c8f8eb480be',1,'USARTException']]] +]; diff --git a/docs/html/search/all_2.html b/docs/html/search/all_2.html new file mode 100644 index 0000000..19c530f --- /dev/null +++ b/docs/html/search/all_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js new file mode 100644 index 0000000..7200182 --- /dev/null +++ b/docs/html/search/all_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['clearinputbuffer',['clearInputBuffer',['../classUSART.html#a28a2b4c5ed66b2c3a81196f76884f156',1,'USART']]], + ['clearoutputbuffer',['clearOutputBuffer',['../classUSART.html#a756d268a8762c316f91ca3238972b0c1',1,'USART']]], + ['closedevice',['closeDevice',['../classUSART.html#af80d6291ac1d2df04cfa1d8d27458cc5',1,'USART']]] +]; diff --git a/docs/html/search/all_3.html b/docs/html/search/all_3.html new file mode 100644 index 0000000..1ae887f --- /dev/null +++ b/docs/html/search/all_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js new file mode 100644 index 0000000..937a08b --- /dev/null +++ b/docs/html/search/all_3.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['delay_5fms',['delay_ms',['../classB15F.html#aaffce20afb9f06bc4b7556c70ce76416',1,'B15F']]], + ['delay_5fus',['delay_us',['../classB15F.html#adcaac8ae8db3c28eccb499fbd720361f',1,'B15F']]], + ['digitalread0',['digitalRead0',['../classB15F.html#ae0df6d423deeb2fd610968bd1c72060e',1,'B15F']]], + ['digitalread1',['digitalRead1',['../classB15F.html#afc76b612dd4faeee0ac02a66b65af5f2',1,'B15F']]], + ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], + ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], + ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], + ['dot',['Dot',['../classDot.html',1,'Dot'],['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot::Dot()']]], + ['driverexception',['DriverException',['../classDriverException.html',1,'']]], + ['drop',['drop',['../classUSART.html#a038d00c0b3d8c0c13c3e7eae5dad7813',1,'USART']]] +]; diff --git a/docs/html/search/all_4.html b/docs/html/search/all_4.html new file mode 100644 index 0000000..14c90ef --- /dev/null +++ b/docs/html/search/all_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js new file mode 100644 index 0000000..fb3f662 --- /dev/null +++ b/docs/html/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['exec',['exec',['../classB15F.html#a1a7ac52984ed7ecac008a3e4060eee3a',1,'B15F']]] +]; diff --git a/docs/html/search/all_5.html b/docs/html/search/all_5.html new file mode 100644 index 0000000..60fa53e --- /dev/null +++ b/docs/html/search/all_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js new file mode 100644 index 0000000..3641ddc --- /dev/null +++ b/docs/html/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['flushoutputbuffer',['flushOutputBuffer',['../classUSART.html#adb6ff4d1cf1af79ca255c5a81780200d',1,'USART']]] +]; diff --git a/docs/html/search/all_6.html b/docs/html/search/all_6.html new file mode 100644 index 0000000..7180363 --- /dev/null +++ b/docs/html/search/all_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js new file mode 100644 index 0000000..1982342 --- /dev/null +++ b/docs/html/search/all_6.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['getbaudrate',['getBaudrate',['../classUSART.html#a4918672d8069df205378a528b1892db3',1,'USART']]], + ['getboardinfo',['getBoardInfo',['../classB15F.html#a4f01677e73d6d172a2c1cae9427a591b',1,'B15F']]], + ['getcurve',['getCurve',['../classDot.html#ad0ae7dc1a9be3d8d985affc089b34396',1,'Dot']]], + ['getdescpara',['getDescPara',['../classPlottyFile.html#a536967daae3b382a5d6575f55450e198',1,'PlottyFile']]], + ['getdescx',['getDescX',['../classPlottyFile.html#a9cf7baa569be308c2cf6e07cadded09d',1,'PlottyFile']]], + ['getdescy',['getDescY',['../classPlottyFile.html#ab4a847fd71a804182f211233e194df45',1,'PlottyFile']]], + ['getfunctiontype',['getFunctionType',['../classPlottyFile.html#a88bb7d8350ed5fbc7a40e8d903c94bdb',1,'PlottyFile']]], + ['getinstance',['getInstance',['../classB15F.html#a8b4533d232c55ef2aa967e39e2d23380',1,'B15F']]], + ['getparafirstcurve',['getParaFirstCurve',['../classPlottyFile.html#a40828c93d66fe80166c4f603d5bdfa48',1,'PlottyFile']]], + ['getparastepwidth',['getParaStepWidth',['../classPlottyFile.html#a9da23f2bb8e6eb1837fc992ffd4057db',1,'PlottyFile']]], + ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], + ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], + ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], + ['getregister',['getRegister',['../classB15F.html#a9bd47da39928af6f51075bdc3fe73ddc',1,'B15F']]], + ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], + ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], + ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], + ['getunity',['getUnitY',['../classPlottyFile.html#a746b96036872dbece204e9739f3413b6',1,'PlottyFile']]], + ['getx',['getX',['../classDot.html#a029f0cc99c474122b77a708a317e7f77',1,'Dot']]], + ['gety',['getY',['../classDot.html#a8fcb987e6308d8184d1a2c8692227e58',1,'Dot']]] +]; diff --git a/docs/html/search/all_7.html b/docs/html/search/all_7.html new file mode 100644 index 0000000..ee6d2e4 --- /dev/null +++ b/docs/html/search/all_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js new file mode 100644 index 0000000..66df4a3 --- /dev/null +++ b/docs/html/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['msg',['msg',['../classTimeoutException.html#aa625fc0fae48a67737a98eafb91c9624',1,'TimeoutException::msg()'],['../classUSARTException.html#a14c80df95f216d221aa97cffbcd8dd79',1,'USARTException::msg()']]], + ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], + ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] +]; diff --git a/docs/html/search/all_8.html b/docs/html/search/all_8.html new file mode 100644 index 0000000..7829aa4 --- /dev/null +++ b/docs/html/search/all_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js new file mode 100644 index 0000000..bd75d34 --- /dev/null +++ b/docs/html/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['opendevice',['openDevice',['../classUSART.html#a5f7e2abda2ec4a68a5fdb8ee2f8a940a',1,'USART']]] +]; diff --git a/docs/html/search/all_9.html b/docs/html/search/all_9.html new file mode 100644 index 0000000..e4242c7 --- /dev/null +++ b/docs/html/search/all_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js new file mode 100644 index 0000000..1695de2 --- /dev/null +++ b/docs/html/search/all_9.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]], + ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]], + ['pwmsetfrequency',['pwmSetFrequency',['../classB15F.html#ac6f6532bb9550a0632c28b98c157d0a1',1,'B15F']]], + ['pwmsetvalue',['pwmSetValue',['../classB15F.html#af9aad3c0db5d5a8b37219d713e1977ee',1,'B15F']]] +]; diff --git a/docs/html/search/all_a.html b/docs/html/search/all_a.html new file mode 100644 index 0000000..47a4a78 --- /dev/null +++ b/docs/html/search/all_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js new file mode 100644 index 0000000..7ca61ac --- /dev/null +++ b/docs/html/search/all_a.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['readdipswitch',['readDipSwitch',['../classB15F.html#a6f858f21ea81d491b5031b3644a2239a',1,'B15F']]], + ['receive',['receive',['../classUSART.html#a0fdc238203852f00bd750127602b2a6a',1,'USART']]], + ['reconnect',['reconnect',['../classB15F.html#a52557b375443c180a044e7d4e80a1ae7',1,'B15F']]], + ['reconnect_5ftimeout',['RECONNECT_TIMEOUT',['../classB15F.html#a040951746fbfd632e12bd1ad14578816',1,'B15F']]], + ['reconnect_5ftries',['RECONNECT_TRIES',['../classB15F.html#a6c4895bdbcd71ff6743becf97985c2dc',1,'B15F']]] +]; diff --git a/docs/html/search/all_b.html b/docs/html/search/all_b.html new file mode 100644 index 0000000..1320a43 --- /dev/null +++ b/docs/html/search/all_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js new file mode 100644 index 0000000..db20ab4 --- /dev/null +++ b/docs/html/search/all_b.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], + ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], + ['setdescpara',['setDescPara',['../classPlottyFile.html#a431904143c3c1164a2e8b8cfec3c77ab',1,'PlottyFile']]], + ['setdescx',['setDescX',['../classPlottyFile.html#aa0449c290265d55d6223b19cf0a88b0a',1,'PlottyFile']]], + ['setdescy',['setDescY',['../classPlottyFile.html#a38a3a4dfc76bc70523727584bf01d590',1,'PlottyFile']]], + ['setfunctiontype',['setFunctionType',['../classPlottyFile.html#a4e5ab1ebb012a5cc1a3d6458a4cd512f',1,'PlottyFile']]], + ['setparafirstcurve',['setParaFirstCurve',['../classPlottyFile.html#aa676414793becb975506f48d6e949dd0',1,'PlottyFile']]], + ['setparastepwidth',['setParaStepWidth',['../classPlottyFile.html#a6caebd31e04e2e7081cc007047350355',1,'PlottyFile']]], + ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], + ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], + ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], + ['setregister',['setRegister',['../classB15F.html#ab446ecffab28d4515dfade79a8efc93d',1,'B15F']]], + ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], + ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], + ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], + ['setunity',['setUnitY',['../classPlottyFile.html#abb18c814f435926f741f7ceb310f3059',1,'PlottyFile']]], + ['startplotty',['startPlotty',['../classPlottyFile.html#a08a115ef10458cadfe76077d623313df',1,'PlottyFile']]] +]; diff --git a/docs/html/search/all_c.html b/docs/html/search/all_c.html new file mode 100644 index 0000000..32a3a1b --- /dev/null +++ b/docs/html/search/all_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js new file mode 100644 index 0000000..37e3d29 --- /dev/null +++ b/docs/html/search/all_c.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], + ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], + ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'TimeoutException'],['../classTimeoutException.html#aa45912234da11ffc9dd3594a1bbc0218',1,'TimeoutException::TimeoutException(const char *message)'],['../classTimeoutException.html#ad6e5c200fbfd276f48a6c1163e2d2988',1,'TimeoutException::TimeoutException(const std::string &message)']]], + ['transmit',['transmit',['../classUSART.html#a41b19dd58f307015b73e154048cd74ca',1,'USART']]] +]; diff --git a/docs/html/search/all_d.html b/docs/html/search/all_d.html new file mode 100644 index 0000000..a386096 --- /dev/null +++ b/docs/html/search/all_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js new file mode 100644 index 0000000..7e9d9bc --- /dev/null +++ b/docs/html/search/all_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usart',['USART',['../classUSART.html',1,'USART'],['../classUSART.html#a5daed20dc595c43d87c4c28bb08a7449',1,'USART::USART()']]], + ['usartexception',['USARTException',['../classUSARTException.html',1,'USARTException'],['../classUSARTException.html#a3c359db129825703b91392d5128cf93d',1,'USARTException::USARTException(const char *message)'],['../classUSARTException.html#a643c0a8b7f0d81e2f1693a75b378e6c2',1,'USARTException::USARTException(const std::string &message)']]] +]; diff --git a/docs/html/search/all_e.html b/docs/html/search/all_e.html new file mode 100644 index 0000000..2931618 --- /dev/null +++ b/docs/html/search/all_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js new file mode 100644 index 0000000..27f785f --- /dev/null +++ b/docs/html/search/all_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['view',['View',['../classView.html',1,'']]], + ['viewinfo',['ViewInfo',['../classViewInfo.html',1,'']]], + ['viewmonitor',['ViewMonitor',['../classViewMonitor.html',1,'']]], + ['viewpromt',['ViewPromt',['../classViewPromt.html',1,'']]], + ['viewselection',['ViewSelection',['../classViewSelection.html',1,'']]] +]; diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html new file mode 100644 index 0000000..ca42a52 --- /dev/null +++ b/docs/html/search/all_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js new file mode 100644 index 0000000..38b315c --- /dev/null +++ b/docs/html/search/all_f.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]], + ['what',['what',['../classTimeoutException.html#a97eaf01fc39ddb94b060020b42fefd6e',1,'TimeoutException::what()'],['../classUSARTException.html#a2af5e3c00cd0585c7427c2e0420a8f15',1,'USARTException::what()']]], + ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] +]; diff --git a/docs/html/search/classes_0.html b/docs/html/search/classes_0.html new file mode 100644 index 0000000..d585e6a --- /dev/null +++ b/docs/html/search/classes_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js new file mode 100644 index 0000000..7622f87 --- /dev/null +++ b/docs/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['b15f',['B15F',['../classB15F.html',1,'']]] +]; diff --git a/docs/html/search/classes_1.html b/docs/html/search/classes_1.html new file mode 100644 index 0000000..baeb182 --- /dev/null +++ b/docs/html/search/classes_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/classes_1.js b/docs/html/search/classes_1.js new file mode 100644 index 0000000..c2d5cc3 --- /dev/null +++ b/docs/html/search/classes_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['dot',['Dot',['../classDot.html',1,'']]], + ['driverexception',['DriverException',['../classDriverException.html',1,'']]] +]; diff --git a/docs/html/search/classes_2.html b/docs/html/search/classes_2.html new file mode 100644 index 0000000..d267279 --- /dev/null +++ b/docs/html/search/classes_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/classes_2.js b/docs/html/search/classes_2.js new file mode 100644 index 0000000..ca8950f --- /dev/null +++ b/docs/html/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['plottyfile',['PlottyFile',['../classPlottyFile.html',1,'']]] +]; diff --git a/docs/html/search/classes_3.html b/docs/html/search/classes_3.html new file mode 100644 index 0000000..8a5cbe1 --- /dev/null +++ b/docs/html/search/classes_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/classes_3.js b/docs/html/search/classes_3.js new file mode 100644 index 0000000..b7d0b63 --- /dev/null +++ b/docs/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['timeoutexception',['TimeoutException',['../classTimeoutException.html',1,'']]] +]; diff --git a/docs/html/search/classes_4.html b/docs/html/search/classes_4.html new file mode 100644 index 0000000..300b9ab --- /dev/null +++ b/docs/html/search/classes_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/classes_4.js b/docs/html/search/classes_4.js new file mode 100644 index 0000000..c030e1b --- /dev/null +++ b/docs/html/search/classes_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usart',['USART',['../classUSART.html',1,'']]], + ['usartexception',['USARTException',['../classUSARTException.html',1,'']]] +]; diff --git a/docs/html/search/classes_5.html b/docs/html/search/classes_5.html new file mode 100644 index 0000000..e7afb2c --- /dev/null +++ b/docs/html/search/classes_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/classes_5.js b/docs/html/search/classes_5.js new file mode 100644 index 0000000..27f785f --- /dev/null +++ b/docs/html/search/classes_5.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['view',['View',['../classView.html',1,'']]], + ['viewinfo',['ViewInfo',['../classViewInfo.html',1,'']]], + ['viewmonitor',['ViewMonitor',['../classViewMonitor.html',1,'']]], + ['viewpromt',['ViewPromt',['../classViewPromt.html',1,'']]], + ['viewselection',['ViewSelection',['../classViewSelection.html',1,'']]] +]; diff --git a/docs/html/search/close.png b/docs/html/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/docs/html/search/functions_0.html b/docs/html/search/functions_0.html new file mode 100644 index 0000000..8a729f7 --- /dev/null +++ b/docs/html/search/functions_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js new file mode 100644 index 0000000..c4bd927 --- /dev/null +++ b/docs/html/search/functions_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['abort',['abort',['../classB15F.html#a3f09a418f9e3be5d1d750e4515c96f1e',1,'B15F::abort(std::string msg)'],['../classB15F.html#ac962a6a49bddd0e261a8c7d3aded23f8',1,'B15F::abort(std::exception &ex)']]], + ['activateselftestmode',['activateSelfTestMode',['../classB15F.html#ad9bf80ee2485fb5aac9926c6ef0731f1',1,'B15F']]], + ['adddot',['addDot',['../classPlottyFile.html#ae091e6eaaca16302f17572ac7dec6f7c',1,'PlottyFile::addDot(Dot &dot)'],['../classPlottyFile.html#a80e4b45219b4e9571992edfc28a28568',1,'PlottyFile::addDot(Dot dot)']]], + ['analogread',['analogRead',['../classB15F.html#ae0bd1f69751e2dc3c462db9213fc4627',1,'B15F']]], + ['analogsequence',['analogSequence',['../classB15F.html#ab82a324426c3063318c6cafb3089ae02',1,'B15F']]], + ['analogwrite0',['analogWrite0',['../classB15F.html#afc55fd590c7fa5c942d100cb60c4b0d3',1,'B15F']]], + ['analogwrite1',['analogWrite1',['../classB15F.html#a7f1becceac744f5cd2ad529748fd836f',1,'B15F']]] +]; diff --git a/docs/html/search/functions_1.html b/docs/html/search/functions_1.html new file mode 100644 index 0000000..d4929aa --- /dev/null +++ b/docs/html/search/functions_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_1.js b/docs/html/search/functions_1.js new file mode 100644 index 0000000..7200182 --- /dev/null +++ b/docs/html/search/functions_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['clearinputbuffer',['clearInputBuffer',['../classUSART.html#a28a2b4c5ed66b2c3a81196f76884f156',1,'USART']]], + ['clearoutputbuffer',['clearOutputBuffer',['../classUSART.html#a756d268a8762c316f91ca3238972b0c1',1,'USART']]], + ['closedevice',['closeDevice',['../classUSART.html#af80d6291ac1d2df04cfa1d8d27458cc5',1,'USART']]] +]; diff --git a/docs/html/search/functions_2.html b/docs/html/search/functions_2.html new file mode 100644 index 0000000..07e3fda --- /dev/null +++ b/docs/html/search/functions_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js new file mode 100644 index 0000000..06f50ef --- /dev/null +++ b/docs/html/search/functions_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['delay_5fms',['delay_ms',['../classB15F.html#aaffce20afb9f06bc4b7556c70ce76416',1,'B15F']]], + ['delay_5fus',['delay_us',['../classB15F.html#adcaac8ae8db3c28eccb499fbd720361f',1,'B15F']]], + ['digitalread0',['digitalRead0',['../classB15F.html#ae0df6d423deeb2fd610968bd1c72060e',1,'B15F']]], + ['digitalread1',['digitalRead1',['../classB15F.html#afc76b612dd4faeee0ac02a66b65af5f2',1,'B15F']]], + ['digitalwrite0',['digitalWrite0',['../classB15F.html#a13797edea1c50278988373acbd110064',1,'B15F']]], + ['digitalwrite1',['digitalWrite1',['../classB15F.html#aa225e7fc813849634063e071ef25db1b',1,'B15F']]], + ['discard',['discard',['../classB15F.html#ae4740cd473f40a1a4121dfa66b25e1d5',1,'B15F']]], + ['dot',['Dot',['../classDot.html#ad975f119c0627a928790b3cd5ca6da05',1,'Dot']]], + ['drop',['drop',['../classUSART.html#a038d00c0b3d8c0c13c3e7eae5dad7813',1,'USART']]] +]; diff --git a/docs/html/search/functions_3.html b/docs/html/search/functions_3.html new file mode 100644 index 0000000..40bd389 --- /dev/null +++ b/docs/html/search/functions_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_3.js b/docs/html/search/functions_3.js new file mode 100644 index 0000000..fb3f662 --- /dev/null +++ b/docs/html/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['exec',['exec',['../classB15F.html#a1a7ac52984ed7ecac008a3e4060eee3a',1,'B15F']]] +]; diff --git a/docs/html/search/functions_4.html b/docs/html/search/functions_4.html new file mode 100644 index 0000000..8a4df4c --- /dev/null +++ b/docs/html/search/functions_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js new file mode 100644 index 0000000..3641ddc --- /dev/null +++ b/docs/html/search/functions_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['flushoutputbuffer',['flushOutputBuffer',['../classUSART.html#adb6ff4d1cf1af79ca255c5a81780200d',1,'USART']]] +]; diff --git a/docs/html/search/functions_5.html b/docs/html/search/functions_5.html new file mode 100644 index 0000000..2b983b2 --- /dev/null +++ b/docs/html/search/functions_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js new file mode 100644 index 0000000..1982342 --- /dev/null +++ b/docs/html/search/functions_5.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['getbaudrate',['getBaudrate',['../classUSART.html#a4918672d8069df205378a528b1892db3',1,'USART']]], + ['getboardinfo',['getBoardInfo',['../classB15F.html#a4f01677e73d6d172a2c1cae9427a591b',1,'B15F']]], + ['getcurve',['getCurve',['../classDot.html#ad0ae7dc1a9be3d8d985affc089b34396',1,'Dot']]], + ['getdescpara',['getDescPara',['../classPlottyFile.html#a536967daae3b382a5d6575f55450e198',1,'PlottyFile']]], + ['getdescx',['getDescX',['../classPlottyFile.html#a9cf7baa569be308c2cf6e07cadded09d',1,'PlottyFile']]], + ['getdescy',['getDescY',['../classPlottyFile.html#ab4a847fd71a804182f211233e194df45',1,'PlottyFile']]], + ['getfunctiontype',['getFunctionType',['../classPlottyFile.html#a88bb7d8350ed5fbc7a40e8d903c94bdb',1,'PlottyFile']]], + ['getinstance',['getInstance',['../classB15F.html#a8b4533d232c55ef2aa967e39e2d23380',1,'B15F']]], + ['getparafirstcurve',['getParaFirstCurve',['../classPlottyFile.html#a40828c93d66fe80166c4f603d5bdfa48',1,'PlottyFile']]], + ['getparastepwidth',['getParaStepWidth',['../classPlottyFile.html#a9da23f2bb8e6eb1837fc992ffd4057db',1,'PlottyFile']]], + ['getquadrant',['getQuadrant',['../classPlottyFile.html#a54e94e80061a27614f2d4d63697d3376',1,'PlottyFile']]], + ['getrefx',['getRefX',['../classPlottyFile.html#a7dd84b9f0826f3220fc6b5a4f1ce9890',1,'PlottyFile']]], + ['getrefy',['getRefY',['../classPlottyFile.html#ae6650c61a3b1a610ce716253418bd7f2',1,'PlottyFile']]], + ['getregister',['getRegister',['../classB15F.html#a9bd47da39928af6f51075bdc3fe73ddc',1,'B15F']]], + ['gettimeout',['getTimeout',['../classUSART.html#a19cf777956a038878fc2d2b58c3d2b41',1,'USART']]], + ['getunitpara',['getUnitPara',['../classPlottyFile.html#abcda4139adf8c5ab8a93b13b84ac097c',1,'PlottyFile']]], + ['getunitx',['getUnitX',['../classPlottyFile.html#af952ac5e2c40896acaf6a86063874fe3',1,'PlottyFile']]], + ['getunity',['getUnitY',['../classPlottyFile.html#a746b96036872dbece204e9739f3413b6',1,'PlottyFile']]], + ['getx',['getX',['../classDot.html#a029f0cc99c474122b77a708a317e7f77',1,'Dot']]], + ['gety',['getY',['../classDot.html#a8fcb987e6308d8184d1a2c8692227e58',1,'Dot']]] +]; diff --git a/docs/html/search/functions_6.html b/docs/html/search/functions_6.html new file mode 100644 index 0000000..f7d283d --- /dev/null +++ b/docs/html/search/functions_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_6.js b/docs/html/search/functions_6.js new file mode 100644 index 0000000..bd75d34 --- /dev/null +++ b/docs/html/search/functions_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['opendevice',['openDevice',['../classUSART.html#a5f7e2abda2ec4a68a5fdb8ee2f8a940a',1,'USART']]] +]; diff --git a/docs/html/search/functions_7.html b/docs/html/search/functions_7.html new file mode 100644 index 0000000..a74fe44 --- /dev/null +++ b/docs/html/search/functions_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_7.js b/docs/html/search/functions_7.js new file mode 100644 index 0000000..b0de2bf --- /dev/null +++ b/docs/html/search/functions_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['pwmsetfrequency',['pwmSetFrequency',['../classB15F.html#ac6f6532bb9550a0632c28b98c157d0a1',1,'B15F']]], + ['pwmsetvalue',['pwmSetValue',['../classB15F.html#af9aad3c0db5d5a8b37219d713e1977ee',1,'B15F']]] +]; diff --git a/docs/html/search/functions_8.html b/docs/html/search/functions_8.html new file mode 100644 index 0000000..75fc0be --- /dev/null +++ b/docs/html/search/functions_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_8.js b/docs/html/search/functions_8.js new file mode 100644 index 0000000..b57cb64 --- /dev/null +++ b/docs/html/search/functions_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['readdipswitch',['readDipSwitch',['../classB15F.html#a6f858f21ea81d491b5031b3644a2239a',1,'B15F']]], + ['receive',['receive',['../classUSART.html#a0fdc238203852f00bd750127602b2a6a',1,'USART']]], + ['reconnect',['reconnect',['../classB15F.html#a52557b375443c180a044e7d4e80a1ae7',1,'B15F']]] +]; diff --git a/docs/html/search/functions_9.html b/docs/html/search/functions_9.html new file mode 100644 index 0000000..7541c9e --- /dev/null +++ b/docs/html/search/functions_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_9.js b/docs/html/search/functions_9.js new file mode 100644 index 0000000..db20ab4 --- /dev/null +++ b/docs/html/search/functions_9.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['setaborthandler',['setAbortHandler',['../classB15F.html#a55b0cd1ea582bda53d6979442640f8e9',1,'B15F']]], + ['setbaudrate',['setBaudrate',['../classUSART.html#aac63918a8b97ae63ee607cfa39e6d88d',1,'USART']]], + ['setdescpara',['setDescPara',['../classPlottyFile.html#a431904143c3c1164a2e8b8cfec3c77ab',1,'PlottyFile']]], + ['setdescx',['setDescX',['../classPlottyFile.html#aa0449c290265d55d6223b19cf0a88b0a',1,'PlottyFile']]], + ['setdescy',['setDescY',['../classPlottyFile.html#a38a3a4dfc76bc70523727584bf01d590',1,'PlottyFile']]], + ['setfunctiontype',['setFunctionType',['../classPlottyFile.html#a4e5ab1ebb012a5cc1a3d6458a4cd512f',1,'PlottyFile']]], + ['setparafirstcurve',['setParaFirstCurve',['../classPlottyFile.html#aa676414793becb975506f48d6e949dd0',1,'PlottyFile']]], + ['setparastepwidth',['setParaStepWidth',['../classPlottyFile.html#a6caebd31e04e2e7081cc007047350355',1,'PlottyFile']]], + ['setquadrant',['setQuadrant',['../classPlottyFile.html#a1953ee0d9a87b7353c16139584e9c2ae',1,'PlottyFile']]], + ['setrefx',['setRefX',['../classPlottyFile.html#a80c2c2e97a454566f9c1f2c51e1d7f3e',1,'PlottyFile']]], + ['setrefy',['setRefY',['../classPlottyFile.html#a3a371228ddcc007e97eebe7cc04dffc2',1,'PlottyFile']]], + ['setregister',['setRegister',['../classB15F.html#ab446ecffab28d4515dfade79a8efc93d',1,'B15F']]], + ['settimeout',['setTimeout',['../classUSART.html#ad7fe866cebe920784d2b17602824c7ff',1,'USART']]], + ['setunitpara',['setUnitPara',['../classPlottyFile.html#abbac84109a1e0958a4ca5c270fac0986',1,'PlottyFile']]], + ['setunitx',['setUnitX',['../classPlottyFile.html#ab8d35a841ca9c325fca671cf34e03527',1,'PlottyFile']]], + ['setunity',['setUnitY',['../classPlottyFile.html#abb18c814f435926f741f7ceb310f3059',1,'PlottyFile']]], + ['startplotty',['startPlotty',['../classPlottyFile.html#a08a115ef10458cadfe76077d623313df',1,'PlottyFile']]] +]; diff --git a/docs/html/search/functions_a.html b/docs/html/search/functions_a.html new file mode 100644 index 0000000..5a5be63 --- /dev/null +++ b/docs/html/search/functions_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_a.js b/docs/html/search/functions_a.js new file mode 100644 index 0000000..c417073 --- /dev/null +++ b/docs/html/search/functions_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['testconnection',['testConnection',['../classB15F.html#af01983594f2af98ab2b1e514aa036a5d',1,'B15F']]], + ['testintconv',['testIntConv',['../classB15F.html#a7b8a0e2a9156f7dcb05d097f23666a78',1,'B15F']]], + ['timeoutexception',['TimeoutException',['../classTimeoutException.html#aa45912234da11ffc9dd3594a1bbc0218',1,'TimeoutException::TimeoutException(const char *message)'],['../classTimeoutException.html#ad6e5c200fbfd276f48a6c1163e2d2988',1,'TimeoutException::TimeoutException(const std::string &message)']]], + ['transmit',['transmit',['../classUSART.html#a41b19dd58f307015b73e154048cd74ca',1,'USART']]] +]; diff --git a/docs/html/search/functions_b.html b/docs/html/search/functions_b.html new file mode 100644 index 0000000..fc2d5aa --- /dev/null +++ b/docs/html/search/functions_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_b.js b/docs/html/search/functions_b.js new file mode 100644 index 0000000..7419b81 --- /dev/null +++ b/docs/html/search/functions_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usart',['USART',['../classUSART.html#a5daed20dc595c43d87c4c28bb08a7449',1,'USART']]], + ['usartexception',['USARTException',['../classUSARTException.html#a3c359db129825703b91392d5128cf93d',1,'USARTException::USARTException(const char *message)'],['../classUSARTException.html#a643c0a8b7f0d81e2f1693a75b378e6c2',1,'USARTException::USARTException(const std::string &message)']]] +]; diff --git a/docs/html/search/functions_c.html b/docs/html/search/functions_c.html new file mode 100644 index 0000000..a1a1437 --- /dev/null +++ b/docs/html/search/functions_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_c.js b/docs/html/search/functions_c.js new file mode 100644 index 0000000..b730bff --- /dev/null +++ b/docs/html/search/functions_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['what',['what',['../classTimeoutException.html#a97eaf01fc39ddb94b060020b42fefd6e',1,'TimeoutException::what()'],['../classUSARTException.html#a2af5e3c00cd0585c7427c2e0420a8f15',1,'USARTException::what()']]], + ['writetofile',['writeToFile',['../classPlottyFile.html#a82c348e7fade2edcbc907e7c2bc2e305',1,'PlottyFile']]] +]; diff --git a/docs/html/search/functions_d.html b/docs/html/search/functions_d.html new file mode 100644 index 0000000..4375535 --- /dev/null +++ b/docs/html/search/functions_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/functions_d.js b/docs/html/search/functions_d.js new file mode 100644 index 0000000..f5a3874 --- /dev/null +++ b/docs/html/search/functions_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['_7etimeoutexception',['~TimeoutException',['../classTimeoutException.html#a2f686b262d2ccffa0090fda9b44ab540',1,'TimeoutException']]], + ['_7eusart',['~USART',['../classUSART.html#a0c8eb1a939ca00921e22f6cbcc7bb749',1,'USART']]], + ['_7eusartexception',['~USARTException',['../classUSARTException.html#a0e008b3cb4974859e6bc8c8f8eb480be',1,'USARTException']]] +]; diff --git a/docs/html/search/mag_sel.png b/docs/html/search/mag_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..39c0ed52a25dd9d080ee0d42ae6c6042bdfa04d7 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!2%?$TA$hhDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~NU84L`?eGCi_EEpJ?t}-xGu`@87+QPtK?83kxQ`TapwHK(CDaqU2h2ejD|C#+j z9%q3^WHAE+w=f7ZGR&GI0Tg5}@$_|Nf5gMiEhFgvHvB$N=!mC_V~EE2vzPXI9ZnEo zd+1zHor@dYLod2Y{ z@R$7$Z!PXTbY$|@#T!bMzm?`b<(R`cbw(gxJHzu zB$lLFB^RXvDF!10LknF)BV7aY5JN*NBMU1-b8Q0yD+2>vd*|CI8glbfGSez?Ylunu RoetE%;OXk;vd$@?2>>CYplSdB literal 0 HcmV?d00001 diff --git a/docs/html/search/nomatches.html b/docs/html/search/nomatches.html new file mode 100644 index 0000000..4377320 --- /dev/null +++ b/docs/html/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
          +
          No Matches
          +
          + + diff --git a/docs/html/search/pages_0.html b/docs/html/search/pages_0.html new file mode 100644 index 0000000..32cbf49 --- /dev/null +++ b/docs/html/search/pages_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js new file mode 100644 index 0000000..31be983 --- /dev/null +++ b/docs/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['b15f_20benutzerhandbuch',['B15F Benutzerhandbuch',['../index.html',1,'']]] +]; diff --git a/docs/html/search/search.css b/docs/html/search/search.css new file mode 100644 index 0000000..3cf9df9 --- /dev/null +++ b/docs/html/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + float: none; + margin-top: 8px; + right: 0px; + width: 170px; + height: 24px; + z-index: 102; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:115px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:8px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/docs/html/search/search.js b/docs/html/search/search.js new file mode 100644 index 0000000..a554ab9 --- /dev/null +++ b/docs/html/search/search.js @@ -0,0 +1,814 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/docs/html/search/search_r.png b/docs/html/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5d21ee13e070d7600f1c4657fde843b953a69 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD literal 0 HcmV?d00001 diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js new file mode 100644 index 0000000..9ff7555 --- /dev/null +++ b/docs/html/search/searchdata.js @@ -0,0 +1,27 @@ +var indexSectionsWithContent = +{ + 0: "abcdefgmoprstuvw~", + 1: "bdptuv", + 2: "acdefgoprstuw~", + 3: "bmprw", + 4: "b" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "functions", + 3: "variables", + 4: "pages" +}; + +var indexSectionLabels = +{ + 0: "All", + 1: "Classes", + 2: "Functions", + 3: "Variables", + 4: "Pages" +}; + diff --git a/docs/html/search/variables_0.html b/docs/html/search/variables_0.html new file mode 100644 index 0000000..a2a3ae6 --- /dev/null +++ b/docs/html/search/variables_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js new file mode 100644 index 0000000..d1fd2cf --- /dev/null +++ b/docs/html/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['baudrate',['BAUDRATE',['../classB15F.html#a7d548d6861cfc69753161bf9cda14f87',1,'B15F']]] +]; diff --git a/docs/html/search/variables_1.html b/docs/html/search/variables_1.html new file mode 100644 index 0000000..b243c42 --- /dev/null +++ b/docs/html/search/variables_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js new file mode 100644 index 0000000..66df4a3 --- /dev/null +++ b/docs/html/search/variables_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['msg',['msg',['../classTimeoutException.html#aa625fc0fae48a67737a98eafb91c9624',1,'TimeoutException::msg()'],['../classUSARTException.html#a14c80df95f216d221aa97cffbcd8dd79',1,'USARTException::msg()']]], + ['msg_5ffail',['MSG_FAIL',['../classB15F.html#a77d1ecf24b406c9204665d3b09c36f1e',1,'B15F']]], + ['msg_5fok',['MSG_OK',['../classB15F.html#ab01299858f74a6cec598688562e0ad02',1,'B15F']]] +]; diff --git a/docs/html/search/variables_2.html b/docs/html/search/variables_2.html new file mode 100644 index 0000000..647df20 --- /dev/null +++ b/docs/html/search/variables_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js new file mode 100644 index 0000000..570beea --- /dev/null +++ b/docs/html/search/variables_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pre',['PRE',['../classB15F.html#a3b0fc1f85954b2d9c145af4a3af5b1ec',1,'B15F']]] +]; diff --git a/docs/html/search/variables_3.html b/docs/html/search/variables_3.html new file mode 100644 index 0000000..9dc9b89 --- /dev/null +++ b/docs/html/search/variables_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js new file mode 100644 index 0000000..fbf0a47 --- /dev/null +++ b/docs/html/search/variables_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['reconnect_5ftimeout',['RECONNECT_TIMEOUT',['../classB15F.html#a040951746fbfd632e12bd1ad14578816',1,'B15F']]], + ['reconnect_5ftries',['RECONNECT_TRIES',['../classB15F.html#a6c4895bdbcd71ff6743becf97985c2dc',1,'B15F']]] +]; diff --git a/docs/html/search/variables_4.html b/docs/html/search/variables_4.html new file mode 100644 index 0000000..78cc2c7 --- /dev/null +++ b/docs/html/search/variables_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
          +
          Loading...
          +
          + +
          Searching...
          +
          No Matches
          + +
          + + diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js new file mode 100644 index 0000000..9a9c561 --- /dev/null +++ b/docs/html/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['wdt_5ftimeout',['WDT_TIMEOUT',['../classB15F.html#a158d13bc84aed6430cdede1396384e06',1,'B15F']]] +]; diff --git a/docs/html/splitbar.png b/docs/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/docs/html/sync_off.png b/docs/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/docs/html/sync_on.png b/docs/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/docs/html/tab_a.png b/docs/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/docs/html/tab_b.png b/docs/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/docs/html/tabs.css b/docs/html/tabs.css new file mode 100644 index 0000000..85a0cd5 --- /dev/null +++ b/docs/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/docs/html/timeoutexception_8h_source.html b/docs/html/timeoutexception_8h_source.html new file mode 100644 index 0000000..d121f28 --- /dev/null +++ b/docs/html/timeoutexception_8h_source.html @@ -0,0 +1,87 @@ + + + + + + + +B15F: drv/timeoutexception.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          timeoutexception.h
          +
          +
          +
          1 #ifndef TIMEOUTEXCEPTION_H
          2 #define TIMEOUTEXCEPTION_H
          3 
          4 #include <exception>
          5 #include <string>
          6 
          9 class TimeoutException: public std::exception
          10 {
          11 public:
          16  explicit TimeoutException(const char* message) : msg(message)
          17  {
          18  }
          19 
          24  explicit TimeoutException(const std::string& message) : msg(message)
          25  {
          26  }
          27 
          31  virtual ~TimeoutException() = default;
          32 
          37  virtual const char* what() const throw ()
          38  {
          39  return msg.c_str();
          40  }
          41 
          42 protected:
          43  std::string msg;
          44 };
          45 
          46 #endif // TIMEOUTEXCEPTION_H
          +
          virtual ~TimeoutException()=default
          +
          std::string msg
          failure description
          +
          virtual const char * what() const
          +
          TimeoutException(const char *message)
          + +
          TimeoutException(const std::string &message)
          + + + + diff --git a/docs/html/ui_8cpp_source.html b/docs/html/ui_8cpp_source.html new file mode 100644 index 0000000..3724f29 --- /dev/null +++ b/docs/html/ui_8cpp_source.html @@ -0,0 +1,96 @@ + + + + + + + +B15F: ui/ui.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          ui.cpp
          +
          +
          +
          1 #include "ui.h"
          2 #include "../drv/b15f.h"
          3 
          4 std::vector<View*> win_stack;
          5 std::thread t_refresh;
          6 
          7 void show_main(int)
          8 {
          9  ViewSelection* view = new ViewSelection();
          10  view->setTitle("B15F - Command Line Interface");
          11  view->addChoice("[ Monitor - Eingaben beobachten ]", &show_monitor);
          12  view->addChoice("[ Digitale Ausgabe BE0 ]", &show_digital_output0);
          13  view->addChoice("[ Digitale Ausgabe BE1 ]", &show_digital_output1);
          14  view->addChoice("[ Analoge Ausgabe AA0 ]", &show_analog_output0);
          15  view->addChoice("[ Analoge Ausgabe AA1 ]", &show_analog_output1);
          16  view->addChoice("[ Selbsttest des B15 ]", &show_selftest_info);
          17  view->addChoice("[ Informationen ]", &show_info);
          18  view->addChoice("", nullptr);
          19  view->addChoice("[ Beenden ]", &finish);
          20  view->repaint();
          21 
          22  win_stack.push_back(view);
          23  input(0);
          24 }
          25 
          26 void input(int)
          27 {
          28  call_t nextCall;
          29  int key;
          30  do
          31  {
          32  key = wgetch(View::getWinContext());
          33  win_stack.back()->repaint();
          34  nextCall = win_stack.back()->keypress(key);
          35 
          36  if(key == -1)
          37  view_back(key);
          38 
          39  if(nextCall)
          40  nextCall(key);
          41  }
          42  while(win_stack.size());
          43 }
          44 
          45 void view_back(int)
          46 {
          47  if(win_stack.size())
          48  {
          49  delete win_stack.back();
          50  win_stack.pop_back();
          51  }
          52  if(win_stack.size())
          53  win_stack.back()->repaint();
          54 }
          55 
          56 void finish(int)
          57 {
          58  cleanup();
          59  exit(EXIT_SUCCESS);
          60 }
          61 
          62 void cleanup()
          63 {
          64  if(t_refresh.joinable())
          65  t_refresh.join();
          66  clrtoeol();
          67  refresh();
          68  endwin();
          69 }
          70 
          71 void show_info(int)
          72 {
          73  ViewInfo* view = new ViewInfo();
          74  view->setTitle("Info");
          75  view->setText("Informationen zu Board 15 Famulus Edition\nEs war einmal...");
          76  view->setLabelClose("[ Zurueck ]");
          77  view->repaint();
          78 
          79  win_stack.push_back(view);
          80  input(0);
          81 }
          82 
          83 void show_monitor(int)
          84 {
          85  ViewMonitor* view = new ViewMonitor();
          86  view->setTitle("Monitor");
          87  view->setText("\nErfasse Messwerte...");
          88  view->setLabelClose("[ Zurueck ]");
          89  view->repaint();
          90 
          91  win_stack.push_back(view);
          92  input(0);
          93 }
          94 
          95 void show_invalid_port_input(int)
          96 {
          97  ViewInfo* view = new ViewInfo();
          98  view->setTitle("Falsche Eingabe");
          99  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, FF] an.");
          100  view->setLabelClose("[ Schliessen ]");
          101  view->repaint();
          102 
          103  win_stack.push_back(view);
          104  input(0);
          105 }
          106 
          107 void show_invalid_dac_input(int)
          108 {
          109  ViewInfo* view = new ViewInfo();
          110  view->setTitle("Falsche Eingabe");
          111  view->setText("Bitte geben Sie einen Wert aus dem Intervall [0, 1023] an.");
          112  view->setLabelClose("[ Schliessen ]");
          113  view->repaint();
          114 
          115  win_stack.push_back(view);
          116  input(0);
          117 }
          118 
          119 void write_digital_output0(int)
          120 {
          121  try
          122  {
          123  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
          124  if(d > 255 || 0 > d)
          125  throw std::invalid_argument("bad value");
          126  uint8_t port = static_cast<uint8_t>(d);
          127 
          128  B15F& drv = B15F::getInstance();
          129  drv.digitalWrite0(port);
          130  view_back(0);
          131  }
          132  catch(std::invalid_argument& ex)
          133  {
          134  show_invalid_port_input(0);
          135  }
          136 }
          137 
          138 void write_digital_output1(int)
          139 {
          140  try
          141  {
          142  int d = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput(), 0, 16);
          143  if(d > 255 || 0 > d)
          144  throw std::invalid_argument("bad value");
          145  uint8_t port = static_cast<uint8_t>(d);
          146 
          147  B15F& drv = B15F::getInstance();
          148  drv.digitalWrite1(port);
          149  view_back(0);
          150  }
          151  catch(std::invalid_argument& ex)
          152  {
          153  show_invalid_port_input(0);
          154  }
          155 }
          156 
          157 void write_analog_output0(int)
          158 {
          159  try
          160  {
          161  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
          162  if(port > 1023)
          163  throw std::invalid_argument("bad value");
          164 
          165  B15F& drv = B15F::getInstance();
          166  drv.analogWrite0(port);
          167  view_back(0);
          168  }
          169  catch(std::invalid_argument& ex)
          170  {
          171  show_invalid_dac_input(0);
          172  }
          173 }
          174 
          175 void write_analog_output1(int)
          176 {
          177  try
          178  {
          179  uint16_t port = std::stoi(static_cast<ViewPromt*>(win_stack.back())->getInput());
          180  if(port > 1023)
          181  throw std::invalid_argument("bad value");
          182 
          183  B15F& drv = B15F::getInstance();
          184  drv.analogWrite1(port);
          185  view_back(0);
          186  }
          187  catch(std::invalid_argument& ex)
          188  {
          189  show_invalid_dac_input(0);
          190  }
          191 }
          192 
          193 void show_digital_output0(int)
          194 {
          195  ViewPromt* view = new ViewPromt();
          196  view->setTitle("Digitale Ausgabe BE0");
          197  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
          198  view->setCancel("[ Zurueck ]", true);
          199  view->setConfirm("[ OK ]", &write_digital_output0);
          200  view->repaint();
          201 
          202  win_stack.push_back(view);
          203  input(0);
          204 }
          205 
          206 void show_digital_output1(int)
          207 {
          208  ViewPromt* view = new ViewPromt();
          209  view->setTitle("Digitale Ausgabe BE1");
          210  view->setMessage("\nAusgabe Port-Wert (hex): 0x");
          211  view->setCancel("[ Zurueck ]", true);
          212  view->setConfirm("[ OK ]", &write_digital_output1);
          213  view->repaint();
          214 
          215  win_stack.push_back(view);
          216  input(0);
          217 }
          218 
          219 void show_analog_output0(int)
          220 {
          221  ViewPromt* view = new ViewPromt();
          222  view->setTitle("Analoge Ausgabe AA0");
          223  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
          224  view->setCancel("[ Zurueck ]", true);
          225  view->setConfirm("[ OK ]", &write_analog_output0);
          226  view->repaint();
          227 
          228  win_stack.push_back(view);
          229  input(0);
          230 }
          231 
          232 void show_analog_output1(int)
          233 {
          234  ViewPromt* view = new ViewPromt();
          235  view->setTitle("Analoge Ausgabe AA1");
          236  view->setMessage("\nAusgabe 10-Bit-Wert (0...1023): ");
          237  view->setCancel("[ Zurueck ]", true);
          238  view->setConfirm("[ OK ]", &write_analog_output1);
          239  view->repaint();
          240 
          241  win_stack.push_back(view);
          242  input(0);
          243 }
          244 
          245 void start_selftest(int)
          246 {
          247  B15F& drv = B15F::getInstance();
          248  drv.activateSelfTestMode();
          249 
          250  ViewInfo* view = new ViewInfo();
          251  view->setTitle("Selbsttest aktiv");
          252  view->setText("Das B15 befindet sich jetzt im Selbsttestmodus.\n \nSelbsttest:\nZu Beginn geht der Reihe nach jede LED von BA0 bis BA1 an.\nDanach leuchten die LEDs an AA0 und AA1 kurz auf.\nZum Schluss spiegelt in einer Endlosschleife:\n* BA0 Port BE0\n* BA1 die DIP-Schalter S7\n* AA0 ADC0\n* AA1 ADC1");
          253  view->setLabelClose("[ Selbsttest Beenden ]");
          254  view->setCall(&stop_selftest);
          255  view->repaint();
          256 
          257  win_stack.push_back(view);
          258  input(0);
          259 }
          260 
          261 void stop_selftest(int)
          262 {
          263  B15F& drv = B15F::getInstance();
          264  drv.discard();
          266  drv.reconnect();
          267  drv.digitalWrite0(0);
          268  drv.digitalWrite1(0);
          269 }
          270 
          271 void show_selftest_info(int)
          272 {
          273  ViewInfo* view = new ViewInfo();
          274  view->setTitle("Selbsttest");
          275  view->setText("Bitte entfernen Sie jetzt alle Draehte von den Anschlussklemmen und bestaetigen\nmit Enter.");
          276  view->setLabelClose("[ Weiter ]");
          277  view->setCall(&start_selftest);
          278  view->repaint();
          279 
          280  win_stack.push_back(view);
          281  input(0);
          282 }
          + + +
          void delay_ms(uint16_t ms)
          Definition: b15f.cpp:432
          +
          static B15F & getInstance(void)
          Definition: b15f.cpp:442
          +
          Definition: b15f.h:31
          +
          bool digitalWrite0(uint8_t)
          Definition: b15f.cpp:179
          +
          bool activateSelfTestMode(void)
          Definition: b15f.cpp:166
          + +
          bool analogWrite1(uint16_t port)
          Definition: b15f.cpp:264
          + +
          bool digitalWrite1(uint8_t)
          Definition: b15f.cpp:193
          +
          void discard(void)
          Definition: b15f.cpp:72
          +
          constexpr static uint16_t WDT_TIMEOUT
          Time in ms after which the watch dog timer resets the MCU.
          Definition: b15f.h:241
          +
          void reconnect(void)
          Definition: b15f.cpp:57
          +
          bool analogWrite0(uint16_t port)
          Definition: b15f.cpp:249
          + + + + diff --git a/docs/html/ui_8h_source.html b/docs/html/ui_8h_source.html new file mode 100644 index 0000000..ee5e268 --- /dev/null +++ b/docs/html/ui_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: ui/ui.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          ui.h
          +
          +
          +
          1 #ifndef UI_H
          2 #define UI_H
          3 
          4 #include <vector>
          5 #include "view_selection.h"
          6 #include "view_info.h"
          7 #include "view_monitor.h"
          8 #include "view_promt.h"
          9 
          10 void show_main(int);
          11 void input(int);
          12 void view_back(int);
          13 void finish(int);
          14 void cleanup();
          15 
          16 void show_info(int);
          17 void show_monitor(int);
          18 void show_invalid_port_input(int);
          19 void show_invalid_dac_input(int);
          20 void write_digital_output0(int);
          21 void write_digital_output1(int);
          22 void write_analog_output0(int);
          23 void write_analog_output1(int);
          24 void show_digital_output0(int);
          25 void show_digital_output1(int);
          26 void show_analog_output0(int);
          27 void show_analog_output1(int);
          28 
          29 // selftest group
          30 void show_selftest_info(int);
          31 void start_selftest(int);
          32 void stop_selftest(int);
          33 
          34 
          35 extern std::vector<View*> win_stack;
          36 extern std::thread t_refresh;
          37 
          38 #endif // UI_H
          + + + + diff --git a/docs/html/usart_8cpp_source.html b/docs/html/usart_8cpp_source.html new file mode 100644 index 0000000..2fd9eec --- /dev/null +++ b/docs/html/usart_8cpp_source.html @@ -0,0 +1,96 @@ + + + + + + + +B15F: drv/usart.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          usart.cpp
          +
          +
          +
          1 #include <stdexcept>
          2 #include "usart.h"
          3 
          5 {
          6  closeDevice();
          7 }
          8 
          9 void USART::openDevice(std::string device)
          10 {
          11  // Benutze blockierenden Modus
          12  file_desc = open(device.c_str(), O_RDWR | O_NOCTTY);// | O_NDELAY
          13  if (file_desc <= 0)
          14  throw USARTException("Fehler beim Öffnen des Gerätes");
          15 
          16  struct termios options;
          17  int code = tcgetattr(file_desc, &options);
          18  if (code)
          19  throw USARTException("Fehler beim Lesen der Geräteparameter");
          20 
          21  options.c_cflag = CS8 | CLOCAL | CREAD;
          22  options.c_iflag = IGNPAR;
          23  options.c_oflag = 0;
          24  options.c_lflag = 0;
          25  options.c_cc[VMIN] = 0;
          26  options.c_cc[VTIME] = timeout;
          27  code = cfsetspeed(&options, baudrate);
          28  if (code)
          29  throw USARTException("Fehler beim Setzen der Baudrate");
          30 
          31  code = tcsetattr(file_desc, TCSANOW, &options);
          32  if (code)
          33  throw USARTException("Fehler beim Setzen der Geräteparameter");
          34 
          35  code = fcntl(file_desc, F_SETFL, 0); // blockierender Modus
          36  if (code)
          37  throw USARTException("Fehler beim Aktivieren des blockierenden Modus'");
          38 
          41 }
          42 
          44 {
          45  if (file_desc > 0)
          46  {
          47  int code = close(file_desc);
          48  if (code)
          49  throw USARTException("Fehler beim Schließen des Gerätes");
          50  file_desc = -1;
          51  }
          52 }
          53 
          55 {
          56  int code = tcflush(file_desc, TCIFLUSH);
          57  if (code)
          58  throw USARTException("Fehler beim Leeren des Eingangspuffers");
          59 }
          60 
          62 {
          63  int code = tcflush(file_desc, TCOFLUSH);
          64  if (code)
          65  throw USARTException("Fehler beim Leeren des Ausgangspuffers");
          66 }
          67 
          69 {
          70  int code = tcdrain(file_desc);
          71  if (code)
          72  throw USARTException("Fehler beim Versenden des Ausgangspuffers");
          73 }
          74 
          75 void USART::transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          76 {
          77  int code = write(file_desc, buffer + offset, len);
          78  if (code != len)
          79  throw USARTException(
          80  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          81  ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")");
          82 }
          83 
          84 void USART::receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          85 {
          86  int bytes_avail, code;
          87  auto start = std::chrono::steady_clock::now();
          88  auto end = std::chrono::steady_clock::now();
          89  do
          90  {
          91  code = ioctl(file_desc, FIONREAD, &bytes_avail);
          92  if (code)
          93  throw USARTException(
          94  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          95  ", " + strerror(code) + " (code " + std::to_string(code) + ")");
          96 
          97  end = std::chrono::steady_clock::now();
          98  long elapsed =
          99  std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() / 100; // in Dezisekunden
          100  if (elapsed >= timeout)
          101  throw TimeoutException(
          102  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          103  ", " + std::to_string(elapsed) + " / " + std::to_string(timeout) + " ds");
          104  }
          105  while (bytes_avail < len);
          106 
          107  code = read(file_desc, buffer + offset, len);
          108  if (code != len)
          109  throw USARTException(
          110  std::string(__FUNCTION__) + " failed: " + std::string(__FILE__) + "#" + std::to_string(__LINE__) +
          111  ", " + strerror(code) + " (code " + std::to_string(code) + " / " + std::to_string(len) + ")");
          112 }
          113 
          114 void USART::drop(uint8_t len)
          115 {
          116  // Kann bestimmt noch eleganter gelöst werden
          117  uint8_t dummy[len];
          118  receive(&dummy[0], 0, len);
          119 }
          120 
          122 {
          123  return baudrate;
          124 }
          125 
          127 {
          128  return timeout;
          129 }
          130 
          131 void USART::setBaudrate(uint32_t baudrate)
          132 {
          133  this->baudrate = baudrate;
          134 }
          135 
          136 void USART::setTimeout(uint8_t timeout)
          137 {
          138  this->timeout = timeout;
          139 }
          +
          uint32_t getBaudrate(void)
          Definition: usart.cpp:121
          + +
          void closeDevice(void)
          Definition: usart.cpp:43
          +
          void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:75
          +
          void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:84
          +
          void clearInputBuffer(void)
          Definition: usart.cpp:54
          +
          uint8_t getTimeout(void)
          Definition: usart.cpp:126
          +
          void clearOutputBuffer(void)
          Definition: usart.cpp:61
          +
          void setBaudrate(uint32_t baudrate)
          Definition: usart.cpp:131
          +
          virtual ~USART(void)
          Definition: usart.cpp:4
          +
          void openDevice(std::string device)
          Definition: usart.cpp:9
          +
          void drop(uint8_t len)
          Definition: usart.cpp:114
          +
          void setTimeout(uint8_t timeout)
          Definition: usart.cpp:136
          +
          void flushOutputBuffer(void)
          Definition: usart.cpp:68
          + + + + + diff --git a/docs/html/usart_8h_source.html b/docs/html/usart_8h_source.html new file mode 100644 index 0000000..7406ff7 --- /dev/null +++ b/docs/html/usart_8h_source.html @@ -0,0 +1,96 @@ + + + + + + + +B15F: drv/usart.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          usart.h
          +
          +
          +
          1 #ifndef USART_H
          2 #define USART_H
          3 
          4 #include <cstdint>
          5 #include <chrono>
          6 #include <fcntl.h>
          7 #include <unistd.h>
          8 #include <termios.h>
          9 #include <sys/ioctl.h>
          10 #include <string.h>
          11 #include "usartexception.h"
          12 #include "timeoutexception.h"
          13 
          16 class USART
          17 {
          18 public:
          19 
          20  /*************************************************
          21  * Methoden für die Verwaltung der Schnittstelle *
          22  *************************************************/
          23 
          27  explicit USART() = default;
          28 
          32  virtual ~USART(void);
          33 
          39  void openDevice(std::string device);
          40 
          45  void closeDevice(void);
          46 
          51  void clearInputBuffer(void);
          52 
          57  void clearOutputBuffer(void);
          58 
          63  void flushOutputBuffer(void);
          64 
          65  /*************************************************/
          66 
          67 
          68 
          69  /*************************************
          70  * Methoden für die Datenübertragung *
          71  *************************************/
          72 
          80  void transmit(uint8_t *buffer, uint16_t offset, uint8_t len);
          81 
          89  void receive(uint8_t *buffer, uint16_t offset, uint8_t len);
          90 
          96  void drop(uint8_t len);
          97 
          98  /*************************************/
          99 
          100 
          101 
          102  /***************************************
          103  * Methoden für einstellbare Parameter *
          104  ***************************************/
          105 
          110  uint32_t getBaudrate(void);
          111 
          116  uint8_t getTimeout(void);
          117 
          122  void setBaudrate(uint32_t baudrate);
          123 
          128  void setTimeout(uint8_t timeout);
          129 
          130  /***************************************/
          131 
          132 private:
          133 
          134  int file_desc = -1;
          135  uint32_t baudrate = 9600;
          136  uint8_t timeout = 10;
          137 };
          138 
          139 #endif // USART_H
          +
          uint32_t getBaudrate(void)
          Definition: usart.cpp:121
          +
          USART()=default
          +
          void closeDevice(void)
          Definition: usart.cpp:43
          +
          void transmit(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:75
          +
          void receive(uint8_t *buffer, uint16_t offset, uint8_t len)
          Definition: usart.cpp:84
          +
          void clearInputBuffer(void)
          Definition: usart.cpp:54
          +
          uint8_t getTimeout(void)
          Definition: usart.cpp:126
          +
          Definition: usart.h:16
          +
          void clearOutputBuffer(void)
          Definition: usart.cpp:61
          +
          void setBaudrate(uint32_t baudrate)
          Definition: usart.cpp:131
          +
          virtual ~USART(void)
          Definition: usart.cpp:4
          +
          void openDevice(std::string device)
          Definition: usart.cpp:9
          +
          void drop(uint8_t len)
          Definition: usart.cpp:114
          +
          void setTimeout(uint8_t timeout)
          Definition: usart.cpp:136
          +
          void flushOutputBuffer(void)
          Definition: usart.cpp:68
          + + + + diff --git a/docs/html/usartexception_8h_source.html b/docs/html/usartexception_8h_source.html new file mode 100644 index 0000000..11a9fea --- /dev/null +++ b/docs/html/usartexception_8h_source.html @@ -0,0 +1,87 @@ + + + + + + + +B15F: drv/usartexception.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          usartexception.h
          +
          +
          +
          1 #ifndef USARTEXCEPTION_H
          2 #define USARTEXCEPTION_H
          3 
          4 #include <exception>
          5 #include <string>
          6 
          9 class USARTException: public std::exception
          10 {
          11 public:
          16  explicit USARTException(const char* message) : msg(message)
          17  {
          18  }
          19 
          24  explicit USARTException(const std::string& message) : msg(message)
          25  {
          26  }
          27 
          31  virtual ~USARTException() = default;
          32 
          37  virtual const char* what() const throw ()
          38  {
          39  return msg.c_str();
          40  }
          41 
          42 protected:
          43  std::string msg;
          44 };
          45 
          46 #endif // USARTEXCEPTION_H
          +
          USARTException(const char *message)
          + +
          virtual const char * what() const
          +
          std::string msg
          failure description
          +
          USARTException(const std::string &message)
          +
          virtual ~USARTException()=default
          + + + + diff --git a/docs/html/view_8cpp_source.html b/docs/html/view_8cpp_source.html new file mode 100644 index 0000000..229408d --- /dev/null +++ b/docs/html/view_8cpp_source.html @@ -0,0 +1,82 @@ + + + + + + + +B15F: ui/view.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          view.cpp
          +
          +
          +
          1 #include "view.h"
          2 
          3 WINDOW* View::win = nullptr;
          4 
          5 View::View()
          6 {
          7  if(!win)
          8  {
          9  B15F::abort("View::win not initialized, missing context");
          10  }
          11  getmaxyx(win, height, width); // init width and height
          12  keypad(win, TRUE);
          13 }
          14 
          15 View::~View()
          16 {
          17 }
          18 
          19 void View::setWinContext(WINDOW* win)
          20 {
          21  View::win = win;
          22 }
          23 
          24 WINDOW* View::getWinContext()
          25 {
          26  return win;
          27 }
          28 
          29 // from: https://stackoverflow.com/a/37454181
          30 std::vector<std::string> View::str_split(const std::string& str, const std::string delim)
          31 {
          32  std::vector<std::string> tokens;
          33  size_t prev = 0, pos = 0;
          34  do
          35  {
          36  pos = str.find(delim, prev);
          37  if (pos == std::string::npos) pos = str.length();
          38  std::string token = str.substr(prev, pos-prev);
          39  if (!token.empty()) tokens.push_back(token);
          40  prev = pos + delim.length();
          41  }
          42  while (pos < str.length() && prev < str.length());
          43  return tokens;
          44 }
          45 
          46 
          47 void View::setTitle(std::string title)
          48 {
          49  this->title = title;
          50 }
          51 
          52 void View::repaint()
          53 {
          54  // get screen size
          55  struct winsize size;
          56  if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
          57  throw std::runtime_error("TIOCGWINSZ error");
          58 
          59 
          60  start_x = floor((size.ws_col - width) / 2.);
          61  start_y = floor((size.ws_row - height) / 2.);
          62 
          63  curs_set(0); // hide cursor
          64  mvwin(win, start_y, start_x);
          65  clear();
          66  wclear(win);
          67 
          68  // generic draw
          69  box(win, 0, 0);
          70  int offset_x = (width - title.length()) / 2;
          71  mvwprintw(win, 1, offset_x, "%s", title.c_str());
          72 
          73  // specific draw
          74  draw();
          75 
          76  refresh();
          77  wrefresh(win);
          78 }
          +
          static void abort(std::string msg)
          Definition: b15f.cpp:467
          + + + + diff --git a/docs/html/view_8h_source.html b/docs/html/view_8h_source.html new file mode 100644 index 0000000..eb93903 --- /dev/null +++ b/docs/html/view_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +B15F: ui/view.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          view.h
          +
          +
          +
          1 #ifndef VIEW_H
          2 #define VIEW_H
          3 
          4 #include <iostream>
          5 #include <cmath>
          6 #include <vector>
          7 #include <functional>
          8 #include <ncurses.h> // sudo apt-get install libncurses5-dev
          9 #include <sys/ioctl.h>
          10 #include <unistd.h>
          11 #include <signal.h>
          12 #include "../drv/b15f.h"
          13 
          14 extern std::string ERR_MSG;
          15 typedef std::function<void(int)> call_t;
          16 
          19 class View
          20 {
          21 public:
          22  View(void);
          23  virtual ~View(void);
          24 
          25  static void setWinContext(WINDOW* win);
          26  static WINDOW* getWinContext(void);
          27  static std::vector<std::string> str_split(const std::string& str, const std::string delim);
          28 
          29  virtual void setTitle(std::string title);
          30 
          31  virtual void repaint(void);
          32 
          33  virtual void draw(void) = 0;
          34  virtual call_t keypress(int& key) = 0;
          35 
          36 
          37 protected:
          38  int width, height;
          39  int start_x = 0, start_y = 0;
          40  std::string title;
          41  std::vector<call_t> calls;
          42 
          43  static WINDOW* win;
          44  constexpr static int KEY_ENT = 10;
          45 };
          46 
          47 #endif // VIEW_H
          +
          Definition: view.h:19
          + + + + diff --git a/docs/html/view__info_8cpp_source.html b/docs/html/view__info_8cpp_source.html new file mode 100644 index 0000000..918aa93 --- /dev/null +++ b/docs/html/view__info_8cpp_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: ui/view_info.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          view_info.cpp
          +
          +
          +
          1 #include "view_info.h"
          2 
          3 ViewInfo::ViewInfo()
          4 {
          5  calls.push_back(nullptr);
          6 }
          7 
          8 void ViewInfo::setText(std::string text)
          9 {
          10  this->text = text;
          11 }
          12 
          13 void ViewInfo::setLabelClose(std::string label)
          14 {
          15  this->label_close = label;
          16 }
          17 
          18 void ViewInfo::setCall(call_t call)
          19 {
          20  calls[0] = call;
          21 }
          22 
          23 void ViewInfo::draw()
          24 {
          25  int li = 0;
          26  for(std::string line : str_split(text, "\n"))
          27  mvwprintw(win, text_offset_y + li++, text_offset_x, "%s", line.c_str());
          28 
          29  close_offset_x = (width - label_close.length()) / 2;
          30  close_offset_y = height - 2;
          31 
          32  wattron(win, A_REVERSE);
          33  mvwprintw(win, close_offset_y, close_offset_x, "%s", label_close.c_str());
          34  wattroff(win, A_REVERSE);
          35 }
          36 
          37 call_t ViewInfo::keypress(int& key)
          38 {
          39  switch(key)
          40  {
          41 
          42  case KEY_MOUSE:
          43  {
          44  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          45  MEVENT event;
          46  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          47  {
          48  size_t column = start_x + close_offset_x;
          49  size_t row = start_y + close_offset_y;
          50  size_t mouse_x = event.x, mouse_y = event.y;
          51  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
          52  key = -1; // do return from view
          53  }
          54  break;
          55  }
          56  case KEY_ENT:
          57  key = -1; // do return from view
          58  break;
          59  default:
          60  break;
          61  }
          62  return calls[0];
          63 }
          + + + + diff --git a/docs/html/view__info_8h_source.html b/docs/html/view__info_8h_source.html new file mode 100644 index 0000000..512d90e --- /dev/null +++ b/docs/html/view__info_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +B15F: ui/view_info.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          view_info.h
          +
          +
          +
          1 #ifndef VIEW_INFO
          2 #define VIEW_INFO
          3 
          4 #include "view.h"
          5 
          8 class ViewInfo : public View
          9 {
          10 public:
          11  ViewInfo(void);
          12  virtual void setText(std::string text);
          13  virtual void setLabelClose(std::string label);;
          14  virtual void setCall(call_t call);
          15  virtual void draw(void) override;
          16  virtual call_t keypress(int& key) override;
          17 
          18 protected:
          19  std::string text;
          20  std::string label_close;
          21  int close_offset_x = 0;
          22  int close_offset_y = 0;
          23  constexpr static int text_offset_x = 2;
          24  constexpr static int text_offset_y = 3;
          25 };
          26 
          27 #endif // VIEW_INFO
          + +
          Definition: view.h:19
          + + + + diff --git a/docs/html/view__monitor_8cpp_source.html b/docs/html/view__monitor_8cpp_source.html new file mode 100644 index 0000000..c1bb49e --- /dev/null +++ b/docs/html/view__monitor_8cpp_source.html @@ -0,0 +1,92 @@ + + + + + + + +B15F: ui/view_monitor.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          view_monitor.cpp
          +
          +
          +
          1 #include "view_monitor.h"
          2 
          3 ViewMonitor::ViewMonitor() : t_worker(&ViewMonitor::worker, this)
          4 {
          5 }
          6 
          7 call_t ViewMonitor::keypress(int& key)
          8 {
          9  switch(key)
          10  {
          11 
          12  case KEY_MOUSE:
          13  {
          14  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          15  MEVENT event;
          16  bool hit = false;
          17  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          18  {
          19  size_t column = start_x + close_offset_x;
          20  size_t row = start_y + close_offset_y;
          21  size_t mouse_x = event.x, mouse_y = event.y;
          22  if(mouse_y == row && mouse_x >= column && mouse_x < column + label_close.length())
          23  hit = true;
          24  }
          25  if(!hit)
          26  break;
          27 
          28  // fall through to next case
          29  [[fallthrough]];
          30  }
          31  case KEY_ENT:
          32  run_worker = false;
          33  key = -1; // do return from view
          34  wclear(win);
          35  wrefresh(win);
          36  t_worker.join();
          37  break;
          38  default:
          39  break;
          40  }
          41  return calls[0];
          42 }
          43 
          44 std::string ViewMonitor::fancyDigitalString(uint8_t& b)
          45 {
          46  std::stringstream str;
          47  str << std::bitset<8>(b).to_string();
          48  str << " ";
          49  str << "0x" << std::setfill ('0') << std::setw(2) << std::hex << (int) b << std::dec;
          50  return str.str();
          51 }
          52 
          53 std::string ViewMonitor::fancyAnalogString(uint16_t& v)
          54 {
          55  std::stringstream str;
          56  double volt = round(v * 100.0 * 5.0 / 1023.0) / 100.0;
          57 
          58  str << std::setfill ('0') << std::setw(4) << (int) v << " " << std::fixed << std::setprecision(2) << volt << " V ";
          59 
          60  str << "[";
          61  uint8_t p = round(v * 40.0 / 1023.0);
          62  for(uint8_t i = 0; i < p; i++)
          63  str << "X";
          64  for(uint8_t i = 0; i < 40 - p; i++)
          65  str << " ";
          66  str << "]" << std::endl;
          67 
          68  return str.str();
          69 }
          70 
          71 void ViewMonitor::worker()
          72 {
          73  B15F& drv = B15F::getInstance();
          74  while(run_worker)
          75  {
          76  try
          77  {
          78  std::this_thread::sleep_for(std::chrono::milliseconds(100));
          79 
          80  uint8_t be0 = drv.digitalRead0();
          81  uint8_t be1 = drv.digitalRead1();
          82  uint8_t dsw = drv.readDipSwitch();
          83  uint16_t adc[8];
          84  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
          85  adc[i] = drv.analogRead(i);
          86 
          87 
          88  std::stringstream str;
          89 
          90  // hline
          91  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
          92  if(i % 2 == 0)
          93  str << "-";
          94  else
          95  str << " ";
          96  str << std::endl;
          97 
          98  str << "Digitale Enigaenge:" << std::endl;
          99  str << "Binaere Eingabe 0: " << fancyDigitalString(be0) << std::endl;
          100  str << "Binaere Eingabe 1: " << fancyDigitalString(be1) << std::endl;
          101  str << "Dip Schalter (S7): " << fancyDigitalString(dsw) << std::endl;
          102 
          103  // hline
          104  for(uint8_t i = 0; i < width - 2 * text_offset_x; i++)
          105  if(i % 2 == 0)
          106  str << "-";
          107  else
          108  str << " ";
          109  str << std::endl;
          110 
          111  str << "Analoge Eingaenge:" << std::endl;
          112  for(uint8_t i = 0; i < sizeof(adc) / sizeof(adc[0]); i++)
          113  {
          114  str << "Kanal " << std::to_string((int) i) << ": ";
          115  str << fancyAnalogString(adc[i]) << std::endl;
          116  }
          117 
          118  text = str.str();
          119  repaint();
          120  }
          121  catch(DriverException& ex)
          122  {
          123  std::cout << "DriverException: " << ex.what() << std::endl;
          124  drv.delay_ms(1000);
          125  }
          126  catch(...)
          127  {
          128  try
          129  {
          130  drv.reconnect();
          131  }
          132  catch(...)
          133  {
          134  B15F::abort("yoho meine dudes");
          135  return;
          136  }
          137  }
          138  }
          139 }
          + +
          uint8_t digitalRead0(void)
          Definition: b15f.cpp:207
          +
          uint8_t readDipSwitch(void)
          Definition: b15f.cpp:235
          +
          void delay_ms(uint16_t ms)
          Definition: b15f.cpp:432
          +
          static B15F & getInstance(void)
          Definition: b15f.cpp:442
          +
          Definition: b15f.h:31
          +
          static void abort(std::string msg)
          Definition: b15f.cpp:467
          +
          uint16_t analogRead(uint8_t channel)
          Definition: b15f.cpp:279
          +
          uint8_t digitalRead1(void)
          Definition: b15f.cpp:221
          +
          void reconnect(void)
          Definition: b15f.cpp:57
          + + + + + diff --git a/docs/html/view__monitor_8h_source.html b/docs/html/view__monitor_8h_source.html new file mode 100644 index 0000000..7943b12 --- /dev/null +++ b/docs/html/view__monitor_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +B15F: ui/view_monitor.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          view_monitor.h
          +
          +
          +
          1 #ifndef VIEW_MONITOR_H
          2 #define VIEW_MONITOR_H
          3 
          4 #include <thread>
          5 #include <chrono>
          6 #include <sstream>
          7 #include <bitset>
          8 #include "view_info.h"
          9 #include "../drv/b15f.h"
          10 
          13 class ViewMonitor : public ViewInfo
          14 {
          15 
          16 public:
          17  ViewMonitor(void);
          18  virtual call_t keypress(int& key) override;
          19 
          20 private:
          21  std::string fancyDigitalString(uint8_t& b);
          22  std::string fancyAnalogString(uint16_t& v);
          23 
          24 protected:
          25  virtual void worker(void);
          26  volatile bool run_worker = true;
          27  std::thread t_worker;
          28 
          29 };
          30 
          31 #endif // VIEW_MONITOR_H
          + + + + + + diff --git a/docs/html/view__promt_8cpp_source.html b/docs/html/view__promt_8cpp_source.html new file mode 100644 index 0000000..d091fb4 --- /dev/null +++ b/docs/html/view__promt_8cpp_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: ui/view_promt.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          view_promt.cpp
          +
          +
          +
          1 #include "view_promt.h"
          2 
          3 void ViewPromt::draw()
          4 {
          5  curs_set(1); // show cursor
          6 
          7  int li = text_offset_y;
          8  int ci = 0;
          9  for(std::string line : str_split(message + input, "\n"))
          10  {
          11  mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
          12  ci = line.length() + text_offset_x;
          13  }
          14 
          15  button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
          16  button_offset_y = height - text_offset_y;
          17 
          18  if(selection == 0)
          19  {
          20  wattron(win, A_REVERSE);
          21  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
          22  wattroff(win, A_REVERSE);
          23  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
          24  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
          25  }
          26  else
          27  {
          28  mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
          29  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
          30  wattron(win, A_REVERSE);
          31  mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
          32  wattroff(win, A_REVERSE);
          33  }
          34  wmove(win, li, ci);
          35 }
          36 
          37 void ViewPromt::setMessage(std::string message)
          38 {
          39  this->message = message;
          40 }
          41 
          42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
          43 {
          44  label_confirm = name;
          45  call_confirm = call;
          46 }
          47 
          48 void ViewPromt::setCancel(std::string name, bool cancelable)
          49 {
          50  label_cancel = name;
          51  this->cancelable = cancelable;
          52 }
          53 
          54 std::string ViewPromt::getInput()
          55 {
          56  return input;
          57 }
          58 
          59 std::function<void(int)> ViewPromt::keypress(int& key)
          60 {
          61  std::function<void(int)> ret = nullptr;
          62  switch(key)
          63  {
          64  case KEY_BACKSPACE:
          65  if(input.length())
          66  input.pop_back();
          67  break;
          68  case '\t':
          69  case KEY_LEFT:
          70  case KEY_RIGHT:
          71  selection = (selection + 1 ) % 2;
          72  break;
          73  case KEY_MOUSE:
          74  {
          75  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          76  MEVENT event;
          77  bool hit = false;
          78  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          79  {
          80  size_t column_start = start_x + button_offset_x;
          81  size_t row_start = start_y + button_offset_y;
          82  size_t mouse_x = event.x, mouse_y = event.y;
          83  if(mouse_y == row_start)
          84  {
          85  if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
          86  {
          87  if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
          88  hit = true;
          89  selection = 0;
          90  }
          91  if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
          92  {
          93  if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
          94  hit = true;
          95  selection = 1;
          96  }
          97  }
          98  }
          99  if(!hit)
          100  break;
          101 
          102  // fall through to next case
          103  [[fallthrough]];
          104  }
          105  case KEY_ENT:
          106  if(selection == 0) // exit
          107  key = -1; // do return from view
          108  else
          109  ret = call_confirm;
          110  break;
          111  default:
          112  break;
          113  }
          114 
          115  if(key >= ' ' && key <= '~')
          116  input += (char) key;
          117 
          118  if(key != KEY_ENT)
          119  repaint();
          120  return ret;
          121 }
          + + + + diff --git a/docs/html/view__promt_8h_source.html b/docs/html/view__promt_8h_source.html new file mode 100644 index 0000000..af3e350 --- /dev/null +++ b/docs/html/view__promt_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +B15F: ui/view_promt.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          view_promt.h
          +
          +
          +
          1 #ifndef VIEW_PROMT_H
          2 #define VIEW_PROMT_H
          3 
          4 #include <vector>
          5 #include <string>
          6 #include "view.h"
          7 
          10 class ViewPromt : public View
          11 {
          12 public:
          13  virtual void draw(void) override;
          14  virtual void setMessage(std::string message);
          15  virtual void setConfirm(std::string name, call_t call);
          16  virtual void setCancel(std::string name, bool cancelable);
          17  virtual std::string getInput(void);
          18  virtual call_t keypress(int& key) override;
          19 
          20 protected:
          21  size_t selection = 1;
          22  std::string input;
          23  std::string message = "Input";
          24  std::string label_confirm = "[ OK ]";
          25  std::string sep = " ";
          26  std::string label_cancel = "[ Cancel ]";
          27  call_t call_confirm = nullptr;
          28  bool cancelable = true;
          29  int button_offset_x = 0, button_offset_y = 0;
          30  constexpr static int text_offset_x = 2;
          31  constexpr static int text_offset_y = 2;
          32 };
          33 
          34 #endif // VIEW_PROMT_H
          +
          Definition: view.h:19
          + + + + + diff --git a/docs/html/view__selection_8cpp_source.html b/docs/html/view__selection_8cpp_source.html new file mode 100644 index 0000000..014a553 --- /dev/null +++ b/docs/html/view__selection_8cpp_source.html @@ -0,0 +1,81 @@ + + + + + + + +B15F: ui/view_selection.cpp Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          view_selection.cpp
          +
          +
          +
          1 #include "view_selection.h"
          2 
          3 void ViewSelection::draw()
          4 {
          5  //curs_set(0); // hide cursor
          6  for(size_t i = 0; i < choices.size(); i++)
          7  {
          8  if(selection == i)
          9  wattron(win, A_REVERSE);
          10  mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str());
          11  if(selection == i)
          12  wattroff(win, A_REVERSE);
          13  }
          14 }
          15 
          16 void ViewSelection::addChoice(std::string name, call_t call)
          17 {
          18  choices.push_back(name);
          19  calls.push_back(call);
          20 }
          21 
          22 call_t ViewSelection::keypress(int& key)
          23 {
          24  call_t ret = nullptr;
          25  switch(key)
          26  {
          27  case KEY_UP:
          28  do
          29  selection = (selection - 1 + choices.size()) % choices.size();
          30  while(!choices[selection].length() && choices.size());
          31  break;
          32 
          33  case '\t':
          34  case KEY_DOWN:
          35  do
          36  selection = (selection + 1) % choices.size();
          37  while(!choices[selection].length() && choices.size());
          38  break;
          39 
          40  case KEY_MOUSE:
          41  {
          42  // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
          43  MEVENT event;
          44  bool hit = false;
          45  if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
          46  {
          47  size_t column_start = start_x + choice_offset_x;
          48  size_t row_start = start_y + choice_offset_y;
          49  size_t mouse_x = event.x, mouse_y = event.y;
          50  for(size_t i = 0; i < choices.size(); i++)
          51  if(choices[i].length() && mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length())
          52  {
          53  if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED)
          54  hit = true;
          55  selection = i;
          56  }
          57  }
          58  if(!hit)
          59  break;
          60 
          61  // fall through to next case
          62  [[fallthrough]];
          63  }
          64 
          65  case KEY_ENT:
          66  if(selection == choices.size() - 1) // exit
          67  key = -1; // do return from view
          68  else
          69  ret = calls[selection];
          70  break;
          71  default:
          72  break;
          73  }
          74  repaint();
          75  return ret;
          76 }
          + + + + diff --git a/docs/html/view__selection_8h_source.html b/docs/html/view__selection_8h_source.html new file mode 100644 index 0000000..9d49827 --- /dev/null +++ b/docs/html/view__selection_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +B15F: ui/view_selection.h Source File + + + + + + + + + +
          +
          + + + + + + +
          +
          B15F +
          +
          Board 15 Famulus Edition
          +
          +
          + + + + + + + + +
          +
          + + +
          + +
          + + +
          +
          +
          +
          view_selection.h
          +
          +
          +
          1 #ifndef VIEW_SELECTION_H
          2 #define VIEW_SELECTION_H
          3 
          4 #include <vector>
          5 #include <string>
          6 #include "view.h"
          7 
          10 class ViewSelection : public View
          11 {
          12 public:
          13  virtual void draw(void) override;
          14  virtual void addChoice(std::string name, call_t call);
          15  virtual call_t keypress(int& key) override;
          16 
          17 
          18 protected:
          19  size_t selection = 0;
          20  std::vector<std::string> choices;
          21 
          22  constexpr static int choice_offset_x = 2;
          23  constexpr static int choice_offset_y = 3;
          24 };
          25 
          26 #endif // VIEW_SELECTION_H
          +
          Definition: view.h:19
          + + + + + From eb7b5eb69b4cf216d08c7a9a5aa15aa7ade5e12e Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 7 Jun 2019 14:15:49 +0200 Subject: [PATCH 33/35] examples --- .gitignore | 1 + control/examples/diode/main.cpp | 162 ---- control/examples/diode/test_plot | Bin 256 -> 0 bytes .../examples/{diode => transistor}/Makefile | 0 control/examples/transistor/main.cpp | 152 ++++ control/src/cmake-build-debug/CMakeCache.txt | 390 --------- .../CMakeFiles/3.14.3/CMakeCCompiler.cmake | 75 -- .../CMakeFiles/3.14.3/CMakeCXXCompiler.cmake | 78 -- .../CMakeFiles/3.14.3/CMakeSystem.cmake | 15 - .../3.14.3/CompilerIdC/CMakeCCompilerId.c | 666 -------------- .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 644 -------------- .../CMakeDirectoryInformation.cmake | 16 - .../CMakeFiles/CMakeOutput.log | 821 ------------------ .../CMakeFiles/Makefile.cmake | 52 -- .../cmake-build-debug/CMakeFiles/Makefile2 | 113 --- .../cmake-build-debug/CMakeFiles/Progress/1 | 1 - .../cmake-build-debug/CMakeFiles/Progress/10 | 1 - .../cmake-build-debug/CMakeFiles/Progress/11 | 1 - .../cmake-build-debug/CMakeFiles/Progress/12 | 1 - .../cmake-build-debug/CMakeFiles/Progress/2 | 1 - .../cmake-build-debug/CMakeFiles/Progress/3 | 1 - .../cmake-build-debug/CMakeFiles/Progress/4 | 1 - .../cmake-build-debug/CMakeFiles/Progress/5 | 1 - .../cmake-build-debug/CMakeFiles/Progress/6 | 1 - .../cmake-build-debug/CMakeFiles/Progress/7 | 1 - .../cmake-build-debug/CMakeFiles/Progress/8 | 1 - .../cmake-build-debug/CMakeFiles/Progress/9 | 1 - .../CMakeFiles/Progress/count.txt | 1 - .../CMakeFiles/TargetDirectories.txt | 3 - .../CMakeFiles/clion-environment.txt | 3 - .../CMakeFiles/clion-log.txt | 14 - .../CMakeFiles/cmake.check_cache | 1 - .../CMakeFiles/feature_tests.c | 38 - .../CMakeFiles/feature_tests.cxx | 405 --------- .../CMakeFiles/progress.marks | 1 - .../CMakeFiles/src.dir/CXX.includecache | 242 ------ .../CMakeFiles/src.dir/DependInfo.cmake | 33 - .../CMakeFiles/src.dir/build.make | 248 ------ .../CMakeFiles/src.dir/cmake_clean.cmake | 20 - .../CMakeFiles/src.dir/depend.internal | 93 -- .../CMakeFiles/src.dir/depend.make | 93 -- .../CMakeFiles/src.dir/flags.make | 10 - .../CMakeFiles/src.dir/link.txt | 1 - .../CMakeFiles/src.dir/progress.make | 13 - control/src/cmake-build-debug/Makefile | 346 -------- .../src/cmake-build-debug/cmake_install.cmake | 49 -- control/src/cmake-build-debug/src.cbp | 169 ---- 47 files changed, 153 insertions(+), 4827 deletions(-) delete mode 100644 control/examples/diode/main.cpp delete mode 100644 control/examples/diode/test_plot rename control/examples/{diode => transistor}/Makefile (100%) create mode 100644 control/examples/transistor/main.cpp delete mode 100644 control/src/cmake-build-debug/CMakeCache.txt delete mode 100644 control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeCCompiler.cmake delete mode 100644 control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeCXXCompiler.cmake delete mode 100644 control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeSystem.cmake delete mode 100644 control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdC/CMakeCCompilerId.c delete mode 100644 control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdCXX/CMakeCXXCompilerId.cpp delete mode 100644 control/src/cmake-build-debug/CMakeFiles/CMakeDirectoryInformation.cmake delete mode 100644 control/src/cmake-build-debug/CMakeFiles/CMakeOutput.log delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Makefile.cmake delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Makefile2 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/1 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/10 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/11 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/12 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/2 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/3 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/4 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/5 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/6 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/7 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/8 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/9 delete mode 100644 control/src/cmake-build-debug/CMakeFiles/Progress/count.txt delete mode 100644 control/src/cmake-build-debug/CMakeFiles/TargetDirectories.txt delete mode 100644 control/src/cmake-build-debug/CMakeFiles/clion-environment.txt delete mode 100644 control/src/cmake-build-debug/CMakeFiles/clion-log.txt delete mode 100644 control/src/cmake-build-debug/CMakeFiles/cmake.check_cache delete mode 100644 control/src/cmake-build-debug/CMakeFiles/feature_tests.c delete mode 100644 control/src/cmake-build-debug/CMakeFiles/feature_tests.cxx delete mode 100644 control/src/cmake-build-debug/CMakeFiles/progress.marks delete mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/CXX.includecache delete mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/DependInfo.cmake delete mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/build.make delete mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/cmake_clean.cmake delete mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/depend.internal delete mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/depend.make delete mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/flags.make delete mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/link.txt delete mode 100644 control/src/cmake-build-debug/CMakeFiles/src.dir/progress.make delete mode 100644 control/src/cmake-build-debug/Makefile delete mode 100644 control/src/cmake-build-debug/cmake_install.cmake delete mode 100644 control/src/cmake-build-debug/src.cbp diff --git a/.gitignore b/.gitignore index 9569cc0..ca18911 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # IDE stuff control/src/.idea +control/src/cmake-build-debug control/.Makefile.swp # Prerequisites diff --git a/control/examples/diode/main.cpp b/control/examples/diode/main.cpp deleted file mode 100644 index 1e96a1b..0000000 --- a/control/examples/diode/main.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include - - -void kennlinieErsterQuadrant() -{ - - B15F& drv = B15F::getInstance(); - PlottyFile pf; - - uint16_t ba[1024]; - uint16_t bb[1024]; - - const uint16_t sample_count = 1024; - const uint16_t delta = 1; - - const uint16_t u_gs_start = 440; - const uint16_t u_gs_delta = 20; - const uint16_t u_gs_end = 600; - - pf.setUnitX("V"); - pf.setUnitY("mA"); - pf.setUnitPara("V"); - pf.setDescX("U_{DS}"); - pf.setDescY("I_D"); - pf.setDescPara("U_{GS}"); - pf.setRefX(5); - pf.setRefY(50); - pf.setParaFirstCurve(u_gs_start); - pf.setParaStepWidth(u_gs_delta); - - uint8_t curve = 0; - - std::cout << "Erfasse Kennlinie erster Quadrant..." << std::endl << std::flush; - - for(uint16_t u_gs = u_gs_start; u_gs <= u_gs_end; u_gs += u_gs_delta) - { - drv.analogWrite1(u_gs); - - drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count); - - for(uint16_t k = 0; k < sample_count; k++) - { - uint16_t i_d = ba[k] - bb[k]; - uint16_t u_ds = bb[k]; - pf.addDot(Dot(u_ds, i_d, curve)); - } - - std::cout << "\033[1K\r" << 1e2 * (u_gs - u_gs_start) / (u_gs_end - u_gs_start) << "%" << std::flush; - - curve++; - } - - std::cout << "\033[1K\r" << std::flush; - - // speichern und plotty starten - pf.writeToFile("test_plot"); - pf.startPlotty("test_plot"); -} - -void kennlinieZweiterQuadrant() -{ - B15F& drv = B15F::getInstance(); - PlottyFile pf; - - uint16_t ba[1024]; - uint16_t bb[1024]; - - const uint16_t sample_count = 1024; - const uint16_t delta = 1; - - const uint16_t u_gs_start = 300; - const uint16_t u_gs_delta = 25; - const uint16_t u_gs_end = 700; - - pf.setQuadrant(2); - pf.setUnitX("V"); - pf.setUnitY("mA"); - pf.setUnitPara("V"); - pf.setDescX("U_{GS}"); - pf.setDescY("I_D"); - pf.setDescPara("U_{DS}"); - pf.setRefX(5); - pf.setRefY(50); - pf.setParaFirstCurve(u_gs_start); - pf.setParaStepWidth(u_gs_delta); - - uint8_t curve = 0; - - std::cout << "Erfasse Kennlinie zweiter Quadrant..." << std::endl << std::flush; - - for(uint16_t u_gs = u_gs_start; u_gs <= u_gs_end; u_gs += u_gs_delta) - { - drv.analogWrite1(u_gs); - - drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count); - - curve = 0; - for(uint16_t k = 0; k < sample_count; k++) - { - if(ba[k] > bb[k] && bb[k] % 50 == 0 && bb[k] != 0) - { - uint16_t i_d = ba[k] - bb[k]; - std::cout << "added" << std::endl; - pf.addDot(Dot(u_gs, i_d, bb[k] / 50)); - } - curve++; - } - - std::cout << "\033[1K\r" << 1e2 * (u_gs - u_gs_start) / (u_gs_end - u_gs_start) << "%" << std::flush; - } - - std::cout << "\033[1K\r" << std::flush; - - // speichern und plotty starten - pf.writeToFile("test_plot"); - pf.startPlotty("test_plot"); -} - -void testFunktionen() -{ - B15F& drv = B15F::getInstance(); - - std::cout << "DIP-Switch: " << (int) drv.readDipSwitch() << std::endl; - - - drv.digitalWrite0(0xFF); - drv.analogWrite0(128); - std::cout << (int) drv.digitalRead0() << std::endl;; - std::cout << "adc: " << (int) drv.analogRead(4) << std::endl; - - drv.digitalWrite0(0x00); - drv.analogWrite0(0); - std::cout << (int) drv.digitalRead0() << std::endl;; - std::cout << "adc: " << (int) drv.analogRead(4) << std::endl; - - drv.digitalWrite0(0xFF); - drv.analogWrite0(255); - std::cout << (int) drv.digitalRead0() << std::endl; - std::cout << "adc: " << (int) drv.analogRead(4) << std::endl; - - - std::cout << "Kennlinie..." << std::endl; - uint16_t a[1024]; - uint16_t b[1024]; - drv.analogSequence(0, &a[0], 0, 1, &b[0], 0, 0, 1, 1024); - - /*for(uint16_t i= 0; i < sizeof(a) / sizeof(uint16_t); i++) - { - std::cout << (int) i << " : " << a[i] << " " << b[i] << std::endl; - }*/ - -} - -int main() -{ - //testFunktionen(); - kennlinieZweiterQuadrant(); - std::cout << "Schluss." << std::endl; -} diff --git a/control/examples/diode/test_plot b/control/examples/diode/test_plot deleted file mode 100644 index 8b8b43f9dcab013e4ad8d6a4d99d3ebbaedbca95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmb332nqMr^$7P#O!9SMWME)$W@2S9V$flfWC-H|a={=pzS=#w7S08WdpGym) diff --git a/control/examples/diode/Makefile b/control/examples/transistor/Makefile similarity index 100% rename from control/examples/diode/Makefile rename to control/examples/transistor/Makefile diff --git a/control/examples/transistor/main.cpp b/control/examples/transistor/main.cpp new file mode 100644 index 0000000..cdfc5c2 --- /dev/null +++ b/control/examples/transistor/main.cpp @@ -0,0 +1,152 @@ +#include +#include +#include +#include +#include + +const char PLOT_FILE[] = "plot.bin"; + +void printProgress(double p) +{ + constexpr double precision = 1e1; + constexpr int width = 20; + const int n = round(width * p); + p = round(1e2 * precision * p) / precision; + std::cout << "\033[1K\r"; + std::cout << "[" << std::string(n, '#') << std::string(width - n, '-') << "] "; + std::cout << std::setfill(' ') << std::setw(5) << std::fixed << std::showpoint << std::setprecision(1) << p << "%" << std::flush; +} + +void kennlinieErsterQuadrant() +{ + // Puffer für Messwerte + uint16_t u_out[1024]; + uint16_t u_drain[1024]; + + // Ansteuerung der U_GS, Anzahl der Werte für U_GS muss kleiner 64 sein, + // da sonst zu großer Kurvenindex entsteht + const uint16_t u_gs_start = 200; + const uint16_t u_gs_delta = 50; + const uint16_t u_gs_end = 600; + + // Ansteuerung durch u_out (ruft Drainstrom i_drain hervor) + const uint16_t seq_start = 0; + const uint16_t seq_delta = 1; + const uint16_t seq_sample_count = 1024; + + B15F& drv = B15F::getInstance(); + PlottyFile pf; + + pf.setUnitX("V"); + pf.setUnitY("mA"); + pf.setUnitPara("V"); + pf.setDescX("U_{DS}"); + pf.setDescY("I_D"); + pf.setDescPara("U_{GS}"); + pf.setRefX(5); + pf.setRefY(50); + pf.setParaFirstCurve(u_gs_start); + pf.setParaStepWidth(u_gs_delta); + + uint8_t curve = 0; + + std::cout << "Erfasse Kennlinie erster Quadrant..." << std::endl; + + for(uint16_t u_gs = u_gs_start; u_gs <= u_gs_end; u_gs += u_gs_delta) + { + drv.analogWrite1(u_gs); + + // Erfasse u_out und u_drain und variiere dabei u_out, die aktuelle U_GS bleibt solange konstant + drv.analogSequence(0, &u_out[0], 0, 1, &u_drain[0], 0, seq_start, seq_delta, seq_sample_count); + + for(uint16_t k = 0; k < seq_sample_count; k++) + { + uint16_t i_drain = u_out[k] - u_drain[k]; + pf.addDot(Dot(u_drain[k], i_drain, curve)); + } + + curve++; + + // Fortschrittsanzeige + printProgress(double(u_gs - u_gs_start) / double(u_gs_end - u_gs_start)); + } + + std::cout << std::endl << std::flush; + + // speichern und plotty starten + pf.writeToFile(PLOT_FILE); + pf.startPlotty(PLOT_FILE); +} + +void kennlinieZweiterQuadrant() +{ + constexpr uint8_t resolution = 50; + + // Puffer für Messwerte + uint16_t u_out[1024]; + uint16_t u_drain[1024]; + + // Ansteuerung der U_GS + const uint16_t u_gs_start = 128; + const uint16_t u_gs_delta = 32; + const uint16_t u_gs_end = 512; + + // Ansteuerung druch u_out (ruft Drainstrom i_drain hervor) + const uint16_t seq_start = 0; + const uint16_t seq_delta = 1; + const uint16_t seq_sample_count = 1024; + + B15F& drv = B15F::getInstance(); + PlottyFile pf; + + pf.setQuadrant(2); + pf.setUnitX("V"); + pf.setUnitY("mA"); + pf.setUnitPara("V"); + pf.setDescX("U_{GS}"); + pf.setDescY("I_D"); + pf.setDescPara("U_{DS}"); + pf.setRefX(5); + pf.setRefY(50); + pf.setParaFirstCurve(u_gs_start); + pf.setParaStepWidth(u_gs_delta); + + uint8_t curve; + + std::cout << "Erfasse Kennlinie zweiter Quadrant..." << std::endl; + + for(uint16_t u_gs = u_gs_start; u_gs <= u_gs_end; u_gs += u_gs_delta) + { + drv.analogWrite1(u_gs); + + // Erfasse u_out und u_drain und variiere dabei u_out, die aktuelle U_GS bleibt solange konstant + drv.analogSequence(0, &u_out[0], 0, 1, &u_drain[0], 0, seq_start, seq_delta, seq_sample_count); + + curve = 0; + for(uint16_t k = 0; k < seq_sample_count; k++) + { + // Speichere nur Werte für i_drain, wo u_drain ein Vielfaches der Auflösung ist + if(u_out[k] > u_drain[k] && u_drain[k] % resolution == 0 && u_drain[k] != 0) + { + uint16_t i_drain = u_out[k] - u_drain[k]; + pf.addDot(Dot(u_gs, i_drain, u_drain[k] / resolution)); + } + curve++; + } + + // Fortschrittsanzeige + printProgress(double(u_gs - u_gs_start) / double(u_gs_end - u_gs_start)); + } + + std::cout << std::endl << std::flush; + + // speichern und plotty starten + pf.writeToFile(PLOT_FILE); + pf.startPlotty(PLOT_FILE); +} + +int main() +{ + kennlinieErsterQuadrant(); + kennlinieZweiterQuadrant(); +} diff --git a/control/src/cmake-build-debug/CMakeCache.txt b/control/src/cmake-build-debug/CMakeCache.txt deleted file mode 100644 index c0b017b..0000000 --- a/control/src/cmake-build-debug/CMakeCache.txt +++ /dev/null @@ -1,390 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug -# It was generated by CMake: /home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//Path to a program. -CMAKE_AR:FILEPATH=/usr/bin/ar - -//For backwards compatibility, what version of CMake commands and -// syntax should this version of CMake try to support. -CMAKE_BACKWARDS_COMPATIBILITY:STRING=2.4 - -//Choose the type of build, options are: None Debug Release RelWithDebInfo -// MinSizeRel ... -CMAKE_BUILD_TYPE:STRING=Debug - -//Id string of the compiler for the CodeBlocks IDE. Automatically -// detected when left empty -CMAKE_CODEBLOCKS_COMPILER_ID:STRING= - -//The CodeBlocks executable -CMAKE_CODEBLOCKS_EXECUTABLE:FILEPATH=CMAKE_CODEBLOCKS_EXECUTABLE-NOTFOUND - -//Additional command line arguments when CodeBlocks invokes make. -// Enter e.g. -j to get parallel builds -CMAKE_CODEBLOCKS_MAKE_ARGUMENTS:STRING=-j6 - -//Enable/Disable color output during build. -CMAKE_COLOR_MAKEFILE:BOOL=ON - -//CXX compiler -CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ - -//A wrapper around 'ar' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-7 - -//A wrapper around 'ranlib' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-7 - -//Flags used by the CXX compiler during all build types. -CMAKE_CXX_FLAGS:STRING= - -//Flags used by the CXX compiler during DEBUG builds. -CMAKE_CXX_FLAGS_DEBUG:STRING=-g - -//Flags used by the CXX compiler during MINSIZEREL builds. -CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the CXX compiler during RELEASE builds. -CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the CXX compiler during RELWITHDEBINFO builds. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//C compiler -CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc - -//A wrapper around 'ar' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-7 - -//A wrapper around 'ranlib' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-7 - -//Flags used by the C compiler during all build types. -CMAKE_C_FLAGS:STRING= - -//Flags used by the C compiler during DEBUG builds. -CMAKE_C_FLAGS_DEBUG:STRING=-g - -//Flags used by the C compiler during MINSIZEREL builds. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the C compiler during RELEASE builds. -CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the C compiler during RELWITHDEBINFO builds. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Flags used by the linker during all build types. -CMAKE_EXE_LINKER_FLAGS:STRING= - -//Flags used by the linker during DEBUG builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during MINSIZEREL builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during RELEASE builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during RELWITHDEBINFO builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Enable/Disable output of compile commands during generation. -CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=/usr/local - -//Path to a program. -CMAKE_LINKER:FILEPATH=/usr/bin/ld - -//Path to a program. -CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make - -//Flags used by the linker during the creation of modules during -// all build types. -CMAKE_MODULE_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of modules during -// DEBUG builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of modules during -// MINSIZEREL builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of modules during -// RELEASE builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of modules during -// RELWITHDEBINFO builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_NM:FILEPATH=/usr/bin/nm - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump - -//Value Computed by CMake -CMAKE_PROJECT_DESCRIPTION:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_HOMEPAGE_URL:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=src - -//Path to a program. -CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib - -//Flags used by the linker during the creation of shared libraries -// during all build types. -CMAKE_SHARED_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of shared libraries -// during DEBUG builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of shared libraries -// during MINSIZEREL builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELEASE builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELWITHDEBINFO builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//If set, runtime paths are not added when installing shared libraries, -// but are added when building. -CMAKE_SKIP_INSTALL_RPATH:BOOL=NO - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Flags used by the linker during the creation of static libraries -// during all build types. -CMAKE_STATIC_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of static libraries -// during DEBUG builds. -CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of static libraries -// during MINSIZEREL builds. -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELEASE builds. -CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELWITHDEBINFO builds. -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_STRIP:FILEPATH=/usr/bin/strip - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//Single output directory for building all executables. -EXECUTABLE_OUTPUT_PATH:PATH= - -//Single output directory for building all libraries. -LIBRARY_OUTPUT_PATH:PATH= - -//Path to a program. -ProcessorCount_cmd_getconf:FILEPATH=/usr/bin/getconf - -//Path to a program. -ProcessorCount_cmd_sysctl:FILEPATH=/sbin/sysctl - -//Value Computed by CMake -src_BINARY_DIR:STATIC=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug - -//Value Computed by CMake -src_SOURCE_DIR:STATIC=/home/famulus/Dokumente/b15f/control/src - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=14 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=3 -//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE -CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cpack -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/ctest -//ADVANCED property for variable: CMAKE_CXX_COMPILER -CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR -CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB -CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS -CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER -CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_AR -CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB -CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -//Name of external makefile project generator. -CMAKE_EXTRA_GENERATOR:INTERNAL=CodeBlocks -//CXX compiler system defined macros -CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS:INTERNAL=__STDC__;1;__STDC_VERSION__;201112L;__STDC_UTF_16__;1;__STDC_UTF_32__;1;__STDC_HOSTED__;1;__GNUC__;7;__GNUC_MINOR__;3;__GNUC_PATCHLEVEL__;0;__VERSION__;"7.3.0";__ATOMIC_RELAXED;0;__ATOMIC_SEQ_CST;5;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_CONSUME;1;__pic__;2;__PIC__;2;__pie__;2;__PIE__;2;__FINITE_MATH_ONLY__;0;_LP64;1;__LP64__;1;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_LONG__;8;__SIZEOF_SHORT__;2;__SIZEOF_FLOAT__;4;__SIZEOF_DOUBLE__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_SIZE_T__;8;__CHAR_BIT__;8;__BIGGEST_ALIGNMENT__;16;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__FLOAT_WORD_ORDER__;__ORDER_LITTLE_ENDIAN__;__SIZEOF_POINTER__;8;__SIZE_TYPE__;long unsigned int;__PTRDIFF_TYPE__;long int;__WCHAR_TYPE__;int;__WINT_TYPE__;unsigned int;__INTMAX_TYPE__;long int;__UINTMAX_TYPE__;long unsigned int;__CHAR16_TYPE__;short unsigned int;__CHAR32_TYPE__;unsigned int;__SIG_ATOMIC_TYPE__;int;__INT8_TYPE__;signed char;__INT16_TYPE__;short int;__INT32_TYPE__;int;__INT64_TYPE__;long int;__UINT8_TYPE__;unsigned char;__UINT16_TYPE__;short unsigned int;__UINT32_TYPE__;unsigned int;__UINT64_TYPE__;long unsigned int;__INT_LEAST8_TYPE__;signed char;__INT_LEAST16_TYPE__;short int;__INT_LEAST32_TYPE__;int;__INT_LEAST64_TYPE__;long int;__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST16_TYPE__;short unsigned int;__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST64_TYPE__;long unsigned int;__INT_FAST8_TYPE__;signed char;__INT_FAST16_TYPE__;long int;__INT_FAST32_TYPE__;long int;__INT_FAST64_TYPE__;long int;__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST16_TYPE__;long unsigned int;__UINT_FAST32_TYPE__;long unsigned int;__UINT_FAST64_TYPE__;long unsigned int;__INTPTR_TYPE__;long int;__UINTPTR_TYPE__;long unsigned int;__has_include(STR);__has_include__(STR);__has_include_next(STR);__has_include_next__(STR);__GXX_ABI_VERSION;1011;__SCHAR_MAX__;0x7f;__SHRT_MAX__;0x7fff;__INT_MAX__;0x7fffffff;__LONG_MAX__;0x7fffffffffffffffL;__LONG_LONG_MAX__;0x7fffffffffffffffLL;__WCHAR_MAX__;0x7fffffff;__WCHAR_MIN__;(-__WCHAR_MAX__ - 1);__WINT_MAX__;0xffffffffU;__WINT_MIN__;0U;__PTRDIFF_MAX__;0x7fffffffffffffffL;__SIZE_MAX__;0xffffffffffffffffUL;__SCHAR_WIDTH__;8;__SHRT_WIDTH__;16;__INT_WIDTH__;32;__LONG_WIDTH__;64;__LONG_LONG_WIDTH__;64;__WCHAR_WIDTH__;32;__WINT_WIDTH__;32;__PTRDIFF_WIDTH__;64;__SIZE_WIDTH__;64;__INTMAX_MAX__;0x7fffffffffffffffL;__INTMAX_C(c);c ## L;__UINTMAX_MAX__;0xffffffffffffffffUL;__UINTMAX_C(c);c ## UL;__INTMAX_WIDTH__;64;__SIG_ATOMIC_MAX__;0x7fffffff;__SIG_ATOMIC_MIN__;(-__SIG_ATOMIC_MAX__ - 1);__SIG_ATOMIC_WIDTH__;32;__INT8_MAX__;0x7f;__INT16_MAX__;0x7fff;__INT32_MAX__;0x7fffffff;__INT64_MAX__;0x7fffffffffffffffL;__UINT8_MAX__;0xff;__UINT16_MAX__;0xffff;__UINT32_MAX__;0xffffffffU;__UINT64_MAX__;0xffffffffffffffffUL;__INT_LEAST8_MAX__;0x7f;__INT8_C(c);c;__INT_LEAST8_WIDTH__;8;__INT_LEAST16_MAX__;0x7fff;__INT16_C(c);c;__INT_LEAST16_WIDTH__;16;__INT_LEAST32_MAX__;0x7fffffff;__INT32_C(c);c;__INT_LEAST32_WIDTH__;32;__INT_LEAST64_MAX__;0x7fffffffffffffffL;__INT64_C(c);c ## L;__INT_LEAST64_WIDTH__;64;__UINT_LEAST8_MAX__;0xff;__UINT8_C(c);c;__UINT_LEAST16_MAX__;0xffff;__UINT16_C(c);c;__UINT_LEAST32_MAX__;0xffffffffU;__UINT32_C(c);c ## U;__UINT_LEAST64_MAX__;0xffffffffffffffffUL;__UINT64_C(c);c ## UL;__INT_FAST8_MAX__;0x7f;__INT_FAST8_WIDTH__;8;__INT_FAST16_MAX__;0x7fffffffffffffffL;__INT_FAST16_WIDTH__;64;__INT_FAST32_MAX__;0x7fffffffffffffffL;__INT_FAST32_WIDTH__;64;__INT_FAST64_MAX__;0x7fffffffffffffffL;__INT_FAST64_WIDTH__;64;__UINT_FAST8_MAX__;0xff;__UINT_FAST16_MAX__;0xffffffffffffffffUL;__UINT_FAST32_MAX__;0xffffffffffffffffUL;__UINT_FAST64_MAX__;0xffffffffffffffffUL;__INTPTR_MAX__;0x7fffffffffffffffL;__INTPTR_WIDTH__;64;__UINTPTR_MAX__;0xffffffffffffffffUL;__GCC_IEC_559;2;__GCC_IEC_559_COMPLEX;2;__FLT_EVAL_METHOD__;0;__FLT_EVAL_METHOD_TS_18661_3__;0;__DEC_EVAL_METHOD__;2;__FLT_RADIX__;2;__FLT_MANT_DIG__;24;__FLT_DIG__;6;__FLT_MIN_EXP__;(-125);__FLT_MIN_10_EXP__;(-37);__FLT_MAX_EXP__;128;__FLT_MAX_10_EXP__;38;__FLT_DECIMAL_DIG__;9;__FLT_MAX__;3.40282346638528859811704183484516925e+38F;__FLT_MIN__;1.17549435082228750796873653722224568e-38F;__FLT_EPSILON__;1.19209289550781250000000000000000000e-7F;__FLT_DENORM_MIN__;1.40129846432481707092372958328991613e-45F;__FLT_HAS_DENORM__;1;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_DIG__;15;__DBL_MIN_EXP__;(-1021);__DBL_MIN_10_EXP__;(-307);__DBL_MAX_EXP__;1024;__DBL_MAX_10_EXP__;308;__DBL_DECIMAL_DIG__;17;__DBL_MAX__;((double)1.79769313486231570814527423731704357e+308L);__DBL_MIN__;((double)2.22507385850720138309023271733240406e-308L);__DBL_EPSILON__;((double)2.22044604925031308084726333618164062e-16L);__DBL_DENORM_MIN__;((double)4.94065645841246544176568792868221372e-324L);__DBL_HAS_DENORM__;1;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_DIG__;18;__LDBL_MIN_EXP__;(-16381);__LDBL_MIN_10_EXP__;(-4931);__LDBL_MAX_EXP__;16384;__LDBL_MAX_10_EXP__;4932;__DECIMAL_DIG__;21;__LDBL_DECIMAL_DIG__;21;__LDBL_MAX__;1.18973149535723176502126385303097021e+4932L;__LDBL_MIN__;3.36210314311209350626267781732175260e-4932L;__LDBL_EPSILON__;1.08420217248550443400745280086994171e-19L;__LDBL_DENORM_MIN__;3.64519953188247460252840593361941982e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__FLT32_MANT_DIG__;24;__FLT32_DIG__;6;__FLT32_MIN_EXP__;(-125);__FLT32_MIN_10_EXP__;(-37);__FLT32_MAX_EXP__;128;__FLT32_MAX_10_EXP__;38;__FLT32_DECIMAL_DIG__;9;__FLT32_MAX__;3.40282346638528859811704183484516925e+38F32;__FLT32_MIN__;1.17549435082228750796873653722224568e-38F32;__FLT32_EPSILON__;1.19209289550781250000000000000000000e-7F32;__FLT32_DENORM_MIN__;1.40129846432481707092372958328991613e-45F32;__FLT32_HAS_DENORM__;1;__FLT32_HAS_INFINITY__;1;__FLT32_HAS_QUIET_NAN__;1;__FLT64_MANT_DIG__;53;__FLT64_DIG__;15;__FLT64_MIN_EXP__;(-1021);__FLT64_MIN_10_EXP__;(-307);__FLT64_MAX_EXP__;1024;__FLT64_MAX_10_EXP__;308;__FLT64_DECIMAL_DIG__;17;__FLT64_MAX__;1.79769313486231570814527423731704357e+308F64;__FLT64_MIN__;2.22507385850720138309023271733240406e-308F64;__FLT64_EPSILON__;2.22044604925031308084726333618164062e-16F64;__FLT64_DENORM_MIN__;4.94065645841246544176568792868221372e-324F64;__FLT64_HAS_DENORM__;1;__FLT64_HAS_INFINITY__;1;__FLT64_HAS_QUIET_NAN__;1;__FLT128_MANT_DIG__;113;__FLT128_DIG__;33;__FLT128_MIN_EXP__;(-16381);__FLT128_MIN_10_EXP__;(-4931);__FLT128_MAX_EXP__;16384;__FLT128_MAX_10_EXP__;4932;__FLT128_DECIMAL_DIG__;36;__FLT128_MAX__;1.18973149535723176508575932662800702e+4932F128;__FLT128_MIN__;3.36210314311209350626267781732175260e-4932F128;__FLT128_EPSILON__;1.92592994438723585305597794258492732e-34F128;__FLT128_DENORM_MIN__;6.47517511943802511092443895822764655e-4966F128;__FLT128_HAS_DENORM__;1;__FLT128_HAS_INFINITY__;1;__FLT128_HAS_QUIET_NAN__;1;__FLT32X_MANT_DIG__;53;__FLT32X_DIG__;15;__FLT32X_MIN_EXP__;(-1021);__FLT32X_MIN_10_EXP__;(-307);__FLT32X_MAX_EXP__;1024;__FLT32X_MAX_10_EXP__;308;__FLT32X_DECIMAL_DIG__;17;__FLT32X_MAX__;1.79769313486231570814527423731704357e+308F32x;__FLT32X_MIN__;2.22507385850720138309023271733240406e-308F32x;__FLT32X_EPSILON__;2.22044604925031308084726333618164062e-16F32x;__FLT32X_DENORM_MIN__;4.94065645841246544176568792868221372e-324F32x;__FLT32X_HAS_DENORM__;1;__FLT32X_HAS_INFINITY__;1;__FLT32X_HAS_QUIET_NAN__;1;__FLT64X_MANT_DIG__;64;__FLT64X_DIG__;18;__FLT64X_MIN_EXP__;(-16381);__FLT64X_MIN_10_EXP__;(-4931);__FLT64X_MAX_EXP__;16384;__FLT64X_MAX_10_EXP__;4932;__FLT64X_DECIMAL_DIG__;21;__FLT64X_MAX__;1.18973149535723176502126385303097021e+4932F64x;__FLT64X_MIN__;3.36210314311209350626267781732175260e-4932F64x;__FLT64X_EPSILON__;1.08420217248550443400745280086994171e-19F64x;__FLT64X_DENORM_MIN__;3.64519953188247460252840593361941982e-4951F64x;__FLT64X_HAS_DENORM__;1;__FLT64X_HAS_INFINITY__;1;__FLT64X_HAS_QUIET_NAN__;1;__DEC32_MANT_DIG__;7;__DEC32_MIN_EXP__;(-94);__DEC32_MAX_EXP__;97;__DEC32_MIN__;1E-95DF;__DEC32_MAX__;9.999999E96DF;__DEC32_EPSILON__;1E-6DF;__DEC32_SUBNORMAL_MIN__;0.000001E-95DF;__DEC64_MANT_DIG__;16;__DEC64_MIN_EXP__;(-382);__DEC64_MAX_EXP__;385;__DEC64_MIN__;1E-383DD;__DEC64_MAX__;9.999999999999999E384DD;__DEC64_EPSILON__;1E-15DD;__DEC64_SUBNORMAL_MIN__;0.000000000000001E-383DD;__DEC128_MANT_DIG__;34;__DEC128_MIN_EXP__;(-6142);__DEC128_MAX_EXP__;6145;__DEC128_MIN__;1E-6143DL;__DEC128_MAX__;9.999999999999999999999999999999999E6144DL;__DEC128_EPSILON__;1E-33DL;__DEC128_SUBNORMAL_MIN__;0.000000000000000000000000000000001E-6143DL;__REGISTER_PREFIX__; ;__USER_LABEL_PREFIX__; ;__GNUC_STDC_INLINE__;1;__NO_INLINE__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__GCC_HAVE_DWARF2_CFI_ASM;1;__PRAGMA_REDEFINE_EXTNAME;1;__SSP_STRONG__;3;__SIZEOF_INT128__;16;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_PTRDIFF_T__;8;__amd64;1;__amd64__;1;__x86_64;1;__x86_64__;1;__SIZEOF_FLOAT80__;16;__SIZEOF_FLOAT128__;16;__ATOMIC_HLE_ACQUIRE;65536;__ATOMIC_HLE_RELEASE;131072;__GCC_ASM_FLAG_OUTPUTS__;1;__k8;1;__k8__;1;__code_model_small__;1;__MMX__;1;__SSE__;1;__SSE2__;1;__FXSR__;1;__SSE_MATH__;1;__SSE2_MATH__;1;__SEG_FS;1;__SEG_GS;1;__gnu_linux__;1;__linux;1;__linux__;1;linux;1;__unix;1;__unix__;1;unix;1;__ELF__;1;__DECIMAL_BID_FORMAT__;1;_STDC_PREDEF_H;1;__STDC_IEC_559__;1;__STDC_IEC_559_COMPLEX__;1;__STDC_ISO_10646__;201706L;__STDC_NO_THREADS__;1;__STDC__;1;__cplusplus;201402L;__STDC_UTF_16__;1;__STDC_UTF_32__;1;__STDC_HOSTED__;1;__GNUC__;7;__GNUC_MINOR__;3;__GNUC_PATCHLEVEL__;0;__VERSION__;"7.3.0";__ATOMIC_RELAXED;0;__ATOMIC_SEQ_CST;5;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_CONSUME;1;__pic__;2;__PIC__;2;__pie__;2;__PIE__;2;__FINITE_MATH_ONLY__;0;_LP64;1;__LP64__;1;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_LONG__;8;__SIZEOF_SHORT__;2;__SIZEOF_FLOAT__;4;__SIZEOF_DOUBLE__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_SIZE_T__;8;__CHAR_BIT__;8;__BIGGEST_ALIGNMENT__;16;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__FLOAT_WORD_ORDER__;__ORDER_LITTLE_ENDIAN__;__SIZEOF_POINTER__;8;__GNUG__;7;__SIZE_TYPE__;long unsigned int;__PTRDIFF_TYPE__;long int;__WCHAR_TYPE__;int;__WINT_TYPE__;unsigned int;__INTMAX_TYPE__;long int;__UINTMAX_TYPE__;long unsigned int;__CHAR16_TYPE__;short unsigned int;__CHAR32_TYPE__;unsigned int;__SIG_ATOMIC_TYPE__;int;__INT8_TYPE__;signed char;__INT16_TYPE__;short int;__INT32_TYPE__;int;__INT64_TYPE__;long int;__UINT8_TYPE__;unsigned char;__UINT16_TYPE__;short unsigned int;__UINT32_TYPE__;unsigned int;__UINT64_TYPE__;long unsigned int;__INT_LEAST8_TYPE__;signed char;__INT_LEAST16_TYPE__;short int;__INT_LEAST32_TYPE__;int;__INT_LEAST64_TYPE__;long int;__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST16_TYPE__;short unsigned int;__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST64_TYPE__;long unsigned int;__INT_FAST8_TYPE__;signed char;__INT_FAST16_TYPE__;long int;__INT_FAST32_TYPE__;long int;__INT_FAST64_TYPE__;long int;__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST16_TYPE__;long unsigned int;__UINT_FAST32_TYPE__;long unsigned int;__UINT_FAST64_TYPE__;long unsigned int;__INTPTR_TYPE__;long int;__UINTPTR_TYPE__;long unsigned int;__has_include(STR);__has_include__(STR);__has_include_next(STR);__has_include_next__(STR);__GXX_WEAK__;1;__DEPRECATED;1;__GXX_RTTI;1;__cpp_rtti;199711;__GXX_EXPERIMENTAL_CXX0X__;1;__cpp_binary_literals;201304;__cpp_hex_float;201603;__cpp_runtime_arrays;198712;__cpp_unicode_characters;200704;__cpp_raw_strings;200710;__cpp_unicode_literals;200710;__cpp_user_defined_literals;200809;__cpp_lambdas;200907;__cpp_range_based_for;200907;__cpp_static_assert;200410;__cpp_decltype;200707;__cpp_attributes;200809;__cpp_rvalue_reference;200610;__cpp_rvalue_references;200610;__cpp_variadic_templates;200704;__cpp_initializer_lists;200806;__cpp_delegating_constructors;200604;__cpp_nsdmi;200809;__cpp_inheriting_constructors;201511;__cpp_ref_qualifiers;200710;__cpp_alias_templates;200704;__cpp_return_type_deduction;201304;__cpp_init_captures;201304;__cpp_generic_lambdas;201304;__cpp_constexpr;201304;__cpp_decltype_auto;201304;__cpp_aggregate_nsdmi;201304;__cpp_variable_templates;201304;__cpp_digit_separators;201309;__cpp_sized_deallocation;201309;__cpp_threadsafe_static_init;200806;__EXCEPTIONS;1;__cpp_exceptions;199711;__GXX_ABI_VERSION;1011;__SCHAR_MAX__;0x7f;__SHRT_MAX__;0x7fff;__INT_MAX__;0x7fffffff;__LONG_MAX__;0x7fffffffffffffffL;__LONG_LONG_MAX__;0x7fffffffffffffffLL;__WCHAR_MAX__;0x7fffffff;__WCHAR_MIN__;(-__WCHAR_MAX__ - 1);__WINT_MAX__;0xffffffffU;__WINT_MIN__;0U;__PTRDIFF_MAX__;0x7fffffffffffffffL;__SIZE_MAX__;0xffffffffffffffffUL;__SCHAR_WIDTH__;8;__SHRT_WIDTH__;16;__INT_WIDTH__;32;__LONG_WIDTH__;64;__LONG_LONG_WIDTH__;64;__WCHAR_WIDTH__;32;__WINT_WIDTH__;32;__PTRDIFF_WIDTH__;64;__SIZE_WIDTH__;64;__GLIBCXX_TYPE_INT_N_0;__int128;__GLIBCXX_BITSIZE_INT_N_0;128;__INTMAX_MAX__;0x7fffffffffffffffL;__INTMAX_C(c);c ## L;__UINTMAX_MAX__;0xffffffffffffffffUL;__UINTMAX_C(c);c ## UL;__INTMAX_WIDTH__;64;__SIG_ATOMIC_MAX__;0x7fffffff;__SIG_ATOMIC_MIN__;(-__SIG_ATOMIC_MAX__ - 1);__SIG_ATOMIC_WIDTH__;32;__INT8_MAX__;0x7f;__INT16_MAX__;0x7fff;__INT32_MAX__;0x7fffffff;__INT64_MAX__;0x7fffffffffffffffL;__UINT8_MAX__;0xff;__UINT16_MAX__;0xffff;__UINT32_MAX__;0xffffffffU;__UINT64_MAX__;0xffffffffffffffffUL;__INT_LEAST8_MAX__;0x7f;__INT8_C(c);c;__INT_LEAST8_WIDTH__;8;__INT_LEAST16_MAX__;0x7fff;__INT16_C(c);c;__INT_LEAST16_WIDTH__;16;__INT_LEAST32_MAX__;0x7fffffff;__INT32_C(c);c;__INT_LEAST32_WIDTH__;32;__INT_LEAST64_MAX__;0x7fffffffffffffffL;__INT64_C(c);c ## L;__INT_LEAST64_WIDTH__;64;__UINT_LEAST8_MAX__;0xff;__UINT8_C(c);c;__UINT_LEAST16_MAX__;0xffff;__UINT16_C(c);c;__UINT_LEAST32_MAX__;0xffffffffU;__UINT32_C(c);c ## U;__UINT_LEAST64_MAX__;0xffffffffffffffffUL;__UINT64_C(c);c ## UL;__INT_FAST8_MAX__;0x7f;__INT_FAST8_WIDTH__;8;__INT_FAST16_MAX__;0x7fffffffffffffffL;__INT_FAST16_WIDTH__;64;__INT_FAST32_MAX__;0x7fffffffffffffffL;__INT_FAST32_WIDTH__;64;__INT_FAST64_MAX__;0x7fffffffffffffffL;__INT_FAST64_WIDTH__;64;__UINT_FAST8_MAX__;0xff;__UINT_FAST16_MAX__;0xffffffffffffffffUL;__UINT_FAST32_MAX__;0xffffffffffffffffUL;__UINT_FAST64_MAX__;0xffffffffffffffffUL;__INTPTR_MAX__;0x7fffffffffffffffL;__INTPTR_WIDTH__;64;__UINTPTR_MAX__;0xffffffffffffffffUL;__GCC_IEC_559;2;__GCC_IEC_559_COMPLEX;2;__FLT_EVAL_METHOD__;0;__FLT_EVAL_METHOD_TS_18661_3__;0;__DEC_EVAL_METHOD__;2;__FLT_RADIX__;2;__FLT_MANT_DIG__;24;__FLT_DIG__;6;__FLT_MIN_EXP__;(-125);__FLT_MIN_10_EXP__;(-37);__FLT_MAX_EXP__;128;__FLT_MAX_10_EXP__;38;__FLT_DECIMAL_DIG__;9;__FLT_MAX__;3.40282346638528859811704183484516925e+38F;__FLT_MIN__;1.17549435082228750796873653722224568e-38F;__FLT_EPSILON__;1.19209289550781250000000000000000000e-7F;__FLT_DENORM_MIN__;1.40129846432481707092372958328991613e-45F;__FLT_HAS_DENORM__;1;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_DIG__;15;__DBL_MIN_EXP__;(-1021);__DBL_MIN_10_EXP__;(-307);__DBL_MAX_EXP__;1024;__DBL_MAX_10_EXP__;308;__DBL_DECIMAL_DIG__;17;__DBL_MAX__;double(1.79769313486231570814527423731704357e+308L);__DBL_MIN__;double(2.22507385850720138309023271733240406e-308L);__DBL_EPSILON__;double(2.22044604925031308084726333618164062e-16L);__DBL_DENORM_MIN__;double(4.94065645841246544176568792868221372e-324L);__DBL_HAS_DENORM__;1;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_DIG__;18;__LDBL_MIN_EXP__;(-16381);__LDBL_MIN_10_EXP__;(-4931);__LDBL_MAX_EXP__;16384;__LDBL_MAX_10_EXP__;4932;__DECIMAL_DIG__;21;__LDBL_DECIMAL_DIG__;21;__LDBL_MAX__;1.18973149535723176502126385303097021e+4932L;__LDBL_MIN__;3.36210314311209350626267781732175260e-4932L;__LDBL_EPSILON__;1.08420217248550443400745280086994171e-19L;__LDBL_DENORM_MIN__;3.64519953188247460252840593361941982e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__FLT32_MANT_DIG__;24;__FLT32_DIG__;6;__FLT32_MIN_EXP__;(-125);__FLT32_MIN_10_EXP__;(-37);__FLT32_MAX_EXP__;128;__FLT32_MAX_10_EXP__;38;__FLT32_DECIMAL_DIG__;9;__FLT32_MAX__;3.40282346638528859811704183484516925e+38F32;__FLT32_MIN__;1.17549435082228750796873653722224568e-38F32;__FLT32_EPSILON__;1.19209289550781250000000000000000000e-7F32;__FLT32_DENORM_MIN__;1.40129846432481707092372958328991613e-45F32;__FLT32_HAS_DENORM__;1;__FLT32_HAS_INFINITY__;1;__FLT32_HAS_QUIET_NAN__;1;__FLT64_MANT_DIG__;53;__FLT64_DIG__;15;__FLT64_MIN_EXP__;(-1021);__FLT64_MIN_10_EXP__;(-307);__FLT64_MAX_EXP__;1024;__FLT64_MAX_10_EXP__;308;__FLT64_DECIMAL_DIG__;17;__FLT64_MAX__;1.79769313486231570814527423731704357e+308F64;__FLT64_MIN__;2.22507385850720138309023271733240406e-308F64;__FLT64_EPSILON__;2.22044604925031308084726333618164062e-16F64;__FLT64_DENORM_MIN__;4.94065645841246544176568792868221372e-324F64;__FLT64_HAS_DENORM__;1;__FLT64_HAS_INFINITY__;1;__FLT64_HAS_QUIET_NAN__;1;__FLT128_MANT_DIG__;113;__FLT128_DIG__;33;__FLT128_MIN_EXP__;(-16381);__FLT128_MIN_10_EXP__;(-4931);__FLT128_MAX_EXP__;16384;__FLT128_MAX_10_EXP__;4932;__FLT128_DECIMAL_DIG__;36;__FLT128_MAX__;1.18973149535723176508575932662800702e+4932F128;__FLT128_MIN__;3.36210314311209350626267781732175260e-4932F128;__FLT128_EPSILON__;1.92592994438723585305597794258492732e-34F128;__FLT128_DENORM_MIN__;6.47517511943802511092443895822764655e-4966F128;__FLT128_HAS_DENORM__;1;__FLT128_HAS_INFINITY__;1;__FLT128_HAS_QUIET_NAN__;1;__FLT32X_MANT_DIG__;53;__FLT32X_DIG__;15;__FLT32X_MIN_EXP__;(-1021);__FLT32X_MIN_10_EXP__;(-307);__FLT32X_MAX_EXP__;1024;__FLT32X_MAX_10_EXP__;308;__FLT32X_DECIMAL_DIG__;17;__FLT32X_MAX__;1.79769313486231570814527423731704357e+308F32x;__FLT32X_MIN__;2.22507385850720138309023271733240406e-308F32x;__FLT32X_EPSILON__;2.22044604925031308084726333618164062e-16F32x;__FLT32X_DENORM_MIN__;4.94065645841246544176568792868221372e-324F32x;__FLT32X_HAS_DENORM__;1;__FLT32X_HAS_INFINITY__;1;__FLT32X_HAS_QUIET_NAN__;1;__FLT64X_MANT_DIG__;64;__FLT64X_DIG__;18;__FLT64X_MIN_EXP__;(-16381);__FLT64X_MIN_10_EXP__;(-4931);__FLT64X_MAX_EXP__;16384;__FLT64X_MAX_10_EXP__;4932;__FLT64X_DECIMAL_DIG__;21;__FLT64X_MAX__;1.18973149535723176502126385303097021e+4932F64x;__FLT64X_MIN__;3.36210314311209350626267781732175260e-4932F64x;__FLT64X_EPSILON__;1.08420217248550443400745280086994171e-19F64x;__FLT64X_DENORM_MIN__;3.64519953188247460252840593361941982e-4951F64x;__FLT64X_HAS_DENORM__;1;__FLT64X_HAS_INFINITY__;1;__FLT64X_HAS_QUIET_NAN__;1;__DEC32_MANT_DIG__;7;__DEC32_MIN_EXP__;(-94);__DEC32_MAX_EXP__;97;__DEC32_MIN__;1E-95DF;__DEC32_MAX__;9.999999E96DF;__DEC32_EPSILON__;1E-6DF;__DEC32_SUBNORMAL_MIN__;0.000001E-95DF;__DEC64_MANT_DIG__;16;__DEC64_MIN_EXP__;(-382);__DEC64_MAX_EXP__;385;__DEC64_MIN__;1E-383DD;__DEC64_MAX__;9.999999999999999E384DD;__DEC64_EPSILON__;1E-15DD;__DEC64_SUBNORMAL_MIN__;0.000000000000001E-383DD;__DEC128_MANT_DIG__;34;__DEC128_MIN_EXP__;(-6142);__DEC128_MAX_EXP__;6145;__DEC128_MIN__;1E-6143DL;__DEC128_MAX__;9.999999999999999999999999999999999E6144DL;__DEC128_EPSILON__;1E-33DL;__DEC128_SUBNORMAL_MIN__;0.000000000000000000000000000000001E-6143DL;__REGISTER_PREFIX__; ;__USER_LABEL_PREFIX__; ;__GNUC_STDC_INLINE__;1;__NO_INLINE__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__GCC_HAVE_DWARF2_CFI_ASM;1;__PRAGMA_REDEFINE_EXTNAME;1;__SSP_STRONG__;3;__SIZEOF_INT128__;16;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_PTRDIFF_T__;8;__amd64;1;__amd64__;1;__x86_64;1;__x86_64__;1;__SIZEOF_FLOAT80__;16;__SIZEOF_FLOAT128__;16;__ATOMIC_HLE_ACQUIRE;65536;__ATOMIC_HLE_RELEASE;131072;__GCC_ASM_FLAG_OUTPUTS__;1;__k8;1;__k8__;1;__code_model_small__;1;__MMX__;1;__SSE__;1;__SSE2__;1;__FXSR__;1;__SSE_MATH__;1;__SSE2_MATH__;1;__SEG_FS;1;__SEG_GS;1;__gnu_linux__;1;__linux;1;__linux__;1;linux;1;__unix;1;__unix__;1;unix;1;__ELF__;1;__DECIMAL_BID_FORMAT__;1;_GNU_SOURCE;1;_STDC_PREDEF_H;1;__STDC_IEC_559__;1;__STDC_IEC_559_COMPLEX__;1;__STDC_ISO_10646__;201706L;__STDC_NO_THREADS__;1 -//CXX compiler system include directories -CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_INCLUDE_DIRS:INTERNAL=/usr/include/c++/7;/usr/include/x86_64-linux-gnu/c++/7;/usr/include/c++/7/backward;/usr/lib/gcc/x86_64-linux-gnu/7/include;/usr/local/include;/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed;/usr/include/x86_64-linux-gnu;/usr/include -//C compiler system defined macros -CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS:INTERNAL=__STDC__;1;__STDC_VERSION__;201112L;__STDC_UTF_16__;1;__STDC_UTF_32__;1;__STDC_HOSTED__;1;__GNUC__;7;__GNUC_MINOR__;3;__GNUC_PATCHLEVEL__;0;__VERSION__;"7.3.0";__ATOMIC_RELAXED;0;__ATOMIC_SEQ_CST;5;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_CONSUME;1;__pic__;2;__PIC__;2;__pie__;2;__PIE__;2;__FINITE_MATH_ONLY__;0;_LP64;1;__LP64__;1;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_LONG__;8;__SIZEOF_SHORT__;2;__SIZEOF_FLOAT__;4;__SIZEOF_DOUBLE__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_SIZE_T__;8;__CHAR_BIT__;8;__BIGGEST_ALIGNMENT__;16;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__FLOAT_WORD_ORDER__;__ORDER_LITTLE_ENDIAN__;__SIZEOF_POINTER__;8;__SIZE_TYPE__;long unsigned int;__PTRDIFF_TYPE__;long int;__WCHAR_TYPE__;int;__WINT_TYPE__;unsigned int;__INTMAX_TYPE__;long int;__UINTMAX_TYPE__;long unsigned int;__CHAR16_TYPE__;short unsigned int;__CHAR32_TYPE__;unsigned int;__SIG_ATOMIC_TYPE__;int;__INT8_TYPE__;signed char;__INT16_TYPE__;short int;__INT32_TYPE__;int;__INT64_TYPE__;long int;__UINT8_TYPE__;unsigned char;__UINT16_TYPE__;short unsigned int;__UINT32_TYPE__;unsigned int;__UINT64_TYPE__;long unsigned int;__INT_LEAST8_TYPE__;signed char;__INT_LEAST16_TYPE__;short int;__INT_LEAST32_TYPE__;int;__INT_LEAST64_TYPE__;long int;__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST16_TYPE__;short unsigned int;__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST64_TYPE__;long unsigned int;__INT_FAST8_TYPE__;signed char;__INT_FAST16_TYPE__;long int;__INT_FAST32_TYPE__;long int;__INT_FAST64_TYPE__;long int;__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST16_TYPE__;long unsigned int;__UINT_FAST32_TYPE__;long unsigned int;__UINT_FAST64_TYPE__;long unsigned int;__INTPTR_TYPE__;long int;__UINTPTR_TYPE__;long unsigned int;__has_include(STR);__has_include__(STR);__has_include_next(STR);__has_include_next__(STR);__GXX_ABI_VERSION;1011;__SCHAR_MAX__;0x7f;__SHRT_MAX__;0x7fff;__INT_MAX__;0x7fffffff;__LONG_MAX__;0x7fffffffffffffffL;__LONG_LONG_MAX__;0x7fffffffffffffffLL;__WCHAR_MAX__;0x7fffffff;__WCHAR_MIN__;(-__WCHAR_MAX__ - 1);__WINT_MAX__;0xffffffffU;__WINT_MIN__;0U;__PTRDIFF_MAX__;0x7fffffffffffffffL;__SIZE_MAX__;0xffffffffffffffffUL;__SCHAR_WIDTH__;8;__SHRT_WIDTH__;16;__INT_WIDTH__;32;__LONG_WIDTH__;64;__LONG_LONG_WIDTH__;64;__WCHAR_WIDTH__;32;__WINT_WIDTH__;32;__PTRDIFF_WIDTH__;64;__SIZE_WIDTH__;64;__INTMAX_MAX__;0x7fffffffffffffffL;__INTMAX_C(c);c ## L;__UINTMAX_MAX__;0xffffffffffffffffUL;__UINTMAX_C(c);c ## UL;__INTMAX_WIDTH__;64;__SIG_ATOMIC_MAX__;0x7fffffff;__SIG_ATOMIC_MIN__;(-__SIG_ATOMIC_MAX__ - 1);__SIG_ATOMIC_WIDTH__;32;__INT8_MAX__;0x7f;__INT16_MAX__;0x7fff;__INT32_MAX__;0x7fffffff;__INT64_MAX__;0x7fffffffffffffffL;__UINT8_MAX__;0xff;__UINT16_MAX__;0xffff;__UINT32_MAX__;0xffffffffU;__UINT64_MAX__;0xffffffffffffffffUL;__INT_LEAST8_MAX__;0x7f;__INT8_C(c);c;__INT_LEAST8_WIDTH__;8;__INT_LEAST16_MAX__;0x7fff;__INT16_C(c);c;__INT_LEAST16_WIDTH__;16;__INT_LEAST32_MAX__;0x7fffffff;__INT32_C(c);c;__INT_LEAST32_WIDTH__;32;__INT_LEAST64_MAX__;0x7fffffffffffffffL;__INT64_C(c);c ## L;__INT_LEAST64_WIDTH__;64;__UINT_LEAST8_MAX__;0xff;__UINT8_C(c);c;__UINT_LEAST16_MAX__;0xffff;__UINT16_C(c);c;__UINT_LEAST32_MAX__;0xffffffffU;__UINT32_C(c);c ## U;__UINT_LEAST64_MAX__;0xffffffffffffffffUL;__UINT64_C(c);c ## UL;__INT_FAST8_MAX__;0x7f;__INT_FAST8_WIDTH__;8;__INT_FAST16_MAX__;0x7fffffffffffffffL;__INT_FAST16_WIDTH__;64;__INT_FAST32_MAX__;0x7fffffffffffffffL;__INT_FAST32_WIDTH__;64;__INT_FAST64_MAX__;0x7fffffffffffffffL;__INT_FAST64_WIDTH__;64;__UINT_FAST8_MAX__;0xff;__UINT_FAST16_MAX__;0xffffffffffffffffUL;__UINT_FAST32_MAX__;0xffffffffffffffffUL;__UINT_FAST64_MAX__;0xffffffffffffffffUL;__INTPTR_MAX__;0x7fffffffffffffffL;__INTPTR_WIDTH__;64;__UINTPTR_MAX__;0xffffffffffffffffUL;__GCC_IEC_559;2;__GCC_IEC_559_COMPLEX;2;__FLT_EVAL_METHOD__;0;__FLT_EVAL_METHOD_TS_18661_3__;0;__DEC_EVAL_METHOD__;2;__FLT_RADIX__;2;__FLT_MANT_DIG__;24;__FLT_DIG__;6;__FLT_MIN_EXP__;(-125);__FLT_MIN_10_EXP__;(-37);__FLT_MAX_EXP__;128;__FLT_MAX_10_EXP__;38;__FLT_DECIMAL_DIG__;9;__FLT_MAX__;3.40282346638528859811704183484516925e+38F;__FLT_MIN__;1.17549435082228750796873653722224568e-38F;__FLT_EPSILON__;1.19209289550781250000000000000000000e-7F;__FLT_DENORM_MIN__;1.40129846432481707092372958328991613e-45F;__FLT_HAS_DENORM__;1;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_DIG__;15;__DBL_MIN_EXP__;(-1021);__DBL_MIN_10_EXP__;(-307);__DBL_MAX_EXP__;1024;__DBL_MAX_10_EXP__;308;__DBL_DECIMAL_DIG__;17;__DBL_MAX__;((double)1.79769313486231570814527423731704357e+308L);__DBL_MIN__;((double)2.22507385850720138309023271733240406e-308L);__DBL_EPSILON__;((double)2.22044604925031308084726333618164062e-16L);__DBL_DENORM_MIN__;((double)4.94065645841246544176568792868221372e-324L);__DBL_HAS_DENORM__;1;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_DIG__;18;__LDBL_MIN_EXP__;(-16381);__LDBL_MIN_10_EXP__;(-4931);__LDBL_MAX_EXP__;16384;__LDBL_MAX_10_EXP__;4932;__DECIMAL_DIG__;21;__LDBL_DECIMAL_DIG__;21;__LDBL_MAX__;1.18973149535723176502126385303097021e+4932L;__LDBL_MIN__;3.36210314311209350626267781732175260e-4932L;__LDBL_EPSILON__;1.08420217248550443400745280086994171e-19L;__LDBL_DENORM_MIN__;3.64519953188247460252840593361941982e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__FLT32_MANT_DIG__;24;__FLT32_DIG__;6;__FLT32_MIN_EXP__;(-125);__FLT32_MIN_10_EXP__;(-37);__FLT32_MAX_EXP__;128;__FLT32_MAX_10_EXP__;38;__FLT32_DECIMAL_DIG__;9;__FLT32_MAX__;3.40282346638528859811704183484516925e+38F32;__FLT32_MIN__;1.17549435082228750796873653722224568e-38F32;__FLT32_EPSILON__;1.19209289550781250000000000000000000e-7F32;__FLT32_DENORM_MIN__;1.40129846432481707092372958328991613e-45F32;__FLT32_HAS_DENORM__;1;__FLT32_HAS_INFINITY__;1;__FLT32_HAS_QUIET_NAN__;1;__FLT64_MANT_DIG__;53;__FLT64_DIG__;15;__FLT64_MIN_EXP__;(-1021);__FLT64_MIN_10_EXP__;(-307);__FLT64_MAX_EXP__;1024;__FLT64_MAX_10_EXP__;308;__FLT64_DECIMAL_DIG__;17;__FLT64_MAX__;1.79769313486231570814527423731704357e+308F64;__FLT64_MIN__;2.22507385850720138309023271733240406e-308F64;__FLT64_EPSILON__;2.22044604925031308084726333618164062e-16F64;__FLT64_DENORM_MIN__;4.94065645841246544176568792868221372e-324F64;__FLT64_HAS_DENORM__;1;__FLT64_HAS_INFINITY__;1;__FLT64_HAS_QUIET_NAN__;1;__FLT128_MANT_DIG__;113;__FLT128_DIG__;33;__FLT128_MIN_EXP__;(-16381);__FLT128_MIN_10_EXP__;(-4931);__FLT128_MAX_EXP__;16384;__FLT128_MAX_10_EXP__;4932;__FLT128_DECIMAL_DIG__;36;__FLT128_MAX__;1.18973149535723176508575932662800702e+4932F128;__FLT128_MIN__;3.36210314311209350626267781732175260e-4932F128;__FLT128_EPSILON__;1.92592994438723585305597794258492732e-34F128;__FLT128_DENORM_MIN__;6.47517511943802511092443895822764655e-4966F128;__FLT128_HAS_DENORM__;1;__FLT128_HAS_INFINITY__;1;__FLT128_HAS_QUIET_NAN__;1;__FLT32X_MANT_DIG__;53;__FLT32X_DIG__;15;__FLT32X_MIN_EXP__;(-1021);__FLT32X_MIN_10_EXP__;(-307);__FLT32X_MAX_EXP__;1024;__FLT32X_MAX_10_EXP__;308;__FLT32X_DECIMAL_DIG__;17;__FLT32X_MAX__;1.79769313486231570814527423731704357e+308F32x;__FLT32X_MIN__;2.22507385850720138309023271733240406e-308F32x;__FLT32X_EPSILON__;2.22044604925031308084726333618164062e-16F32x;__FLT32X_DENORM_MIN__;4.94065645841246544176568792868221372e-324F32x;__FLT32X_HAS_DENORM__;1;__FLT32X_HAS_INFINITY__;1;__FLT32X_HAS_QUIET_NAN__;1;__FLT64X_MANT_DIG__;64;__FLT64X_DIG__;18;__FLT64X_MIN_EXP__;(-16381);__FLT64X_MIN_10_EXP__;(-4931);__FLT64X_MAX_EXP__;16384;__FLT64X_MAX_10_EXP__;4932;__FLT64X_DECIMAL_DIG__;21;__FLT64X_MAX__;1.18973149535723176502126385303097021e+4932F64x;__FLT64X_MIN__;3.36210314311209350626267781732175260e-4932F64x;__FLT64X_EPSILON__;1.08420217248550443400745280086994171e-19F64x;__FLT64X_DENORM_MIN__;3.64519953188247460252840593361941982e-4951F64x;__FLT64X_HAS_DENORM__;1;__FLT64X_HAS_INFINITY__;1;__FLT64X_HAS_QUIET_NAN__;1;__DEC32_MANT_DIG__;7;__DEC32_MIN_EXP__;(-94);__DEC32_MAX_EXP__;97;__DEC32_MIN__;1E-95DF;__DEC32_MAX__;9.999999E96DF;__DEC32_EPSILON__;1E-6DF;__DEC32_SUBNORMAL_MIN__;0.000001E-95DF;__DEC64_MANT_DIG__;16;__DEC64_MIN_EXP__;(-382);__DEC64_MAX_EXP__;385;__DEC64_MIN__;1E-383DD;__DEC64_MAX__;9.999999999999999E384DD;__DEC64_EPSILON__;1E-15DD;__DEC64_SUBNORMAL_MIN__;0.000000000000001E-383DD;__DEC128_MANT_DIG__;34;__DEC128_MIN_EXP__;(-6142);__DEC128_MAX_EXP__;6145;__DEC128_MIN__;1E-6143DL;__DEC128_MAX__;9.999999999999999999999999999999999E6144DL;__DEC128_EPSILON__;1E-33DL;__DEC128_SUBNORMAL_MIN__;0.000000000000000000000000000000001E-6143DL;__REGISTER_PREFIX__; ;__USER_LABEL_PREFIX__; ;__GNUC_STDC_INLINE__;1;__NO_INLINE__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__GCC_HAVE_DWARF2_CFI_ASM;1;__PRAGMA_REDEFINE_EXTNAME;1;__SSP_STRONG__;3;__SIZEOF_INT128__;16;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_PTRDIFF_T__;8;__amd64;1;__amd64__;1;__x86_64;1;__x86_64__;1;__SIZEOF_FLOAT80__;16;__SIZEOF_FLOAT128__;16;__ATOMIC_HLE_ACQUIRE;65536;__ATOMIC_HLE_RELEASE;131072;__GCC_ASM_FLAG_OUTPUTS__;1;__k8;1;__k8__;1;__code_model_small__;1;__MMX__;1;__SSE__;1;__SSE2__;1;__FXSR__;1;__SSE_MATH__;1;__SSE2_MATH__;1;__SEG_FS;1;__SEG_GS;1;__gnu_linux__;1;__linux;1;__linux__;1;linux;1;__unix;1;__unix__;1;unix;1;__ELF__;1;__DECIMAL_BID_FORMAT__;1;_STDC_PREDEF_H;1;__STDC_IEC_559__;1;__STDC_IEC_559_COMPLEX__;1;__STDC_ISO_10646__;201706L;__STDC_NO_THREADS__;1 -//C compiler system include directories -CMAKE_EXTRA_GENERATOR_C_SYSTEM_INCLUDE_DIRS:INTERNAL=/usr/lib/gcc/x86_64-linux-gnu/7/include;/usr/local/include;/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed;/usr/include/x86_64-linux-gnu;/usr/include -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Unix Makefiles -//Generator instance identifier. -CMAKE_GENERATOR_INSTANCE:INTERNAL= -//Name of generator platform. -CMAKE_GENERATOR_PLATFORM:INTERNAL= -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Source directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=/home/famulus/Dokumente/b15f/control/src -//Install .so files without execute permission. -CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MAKE_PROGRAM -CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//Platform information initialized -CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//uname command -CMAKE_UNAME:INTERNAL=/bin/uname -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: ProcessorCount_cmd_getconf -ProcessorCount_cmd_getconf-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: ProcessorCount_cmd_sysctl -ProcessorCount_cmd_sysctl-ADVANCED:INTERNAL=1 - diff --git a/control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeCCompiler.cmake b/control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeCCompiler.cmake deleted file mode 100644 index 4b4ac8d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeCCompiler.cmake +++ /dev/null @@ -1,75 +0,0 @@ -set(CMAKE_C_COMPILER "/usr/bin/cc") -set(CMAKE_C_COMPILER_ARG1 "") -set(CMAKE_C_COMPILER_ID "GNU") -set(CMAKE_C_COMPILER_VERSION "7.3.0") -set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -set(CMAKE_C_COMPILER_WRAPPER "") -set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") -set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert") -set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") - -set(CMAKE_C_PLATFORM_ID "Linux") -set(CMAKE_C_SIMULATE_ID "") -set(CMAKE_C_SIMULATE_VERSION "") - - - -set(CMAKE_AR "/usr/bin/ar") -set(CMAKE_C_COMPILER_AR "/usr/bin/gcc-ar-7") -set(CMAKE_RANLIB "/usr/bin/ranlib") -set(CMAKE_C_COMPILER_RANLIB "/usr/bin/gcc-ranlib-7") -set(CMAKE_LINKER "/usr/bin/ld") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCC 1) -set(CMAKE_C_COMPILER_LOADED 1) -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_C_ABI_COMPILED TRUE) -set(CMAKE_COMPILER_IS_MINGW ) -set(CMAKE_COMPILER_IS_CYGWIN ) -if(CMAKE_COMPILER_IS_CYGWIN) - set(CYGWIN 1) - set(UNIX 1) -endif() - -set(CMAKE_C_COMPILER_ENV_VAR "CC") - -if(CMAKE_COMPILER_IS_MINGW) - set(MINGW 1) -endif() -set(CMAKE_C_COMPILER_ID_RUN 1) -set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_C_LINKER_PREFERENCE 10) - -# Save compiler ABI information. -set(CMAKE_C_SIZEOF_DATA_PTR "8") -set(CMAKE_C_COMPILER_ABI "ELF") -set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") - -if(CMAKE_C_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_C_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -endif() - -if(CMAKE_C_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") -endif() - -set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/7/include;/usr/local/include;/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed;/usr/include/x86_64-linux-gnu;/usr/include") -set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;gcc_s;c;gcc;gcc_s") -set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") -set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeCXXCompiler.cmake b/control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeCXXCompiler.cmake deleted file mode 100644 index 16f5774..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeCXXCompiler.cmake +++ /dev/null @@ -1,78 +0,0 @@ -set(CMAKE_CXX_COMPILER "/usr/bin/c++") -set(CMAKE_CXX_COMPILER_ARG1 "") -set(CMAKE_CXX_COMPILER_ID "GNU") -set(CMAKE_CXX_COMPILER_VERSION "7.3.0") -set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") -set(CMAKE_CXX_COMPILER_WRAPPER "") -set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14") -set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17") -set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") -set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") -set(CMAKE_CXX20_COMPILE_FEATURES "") - -set(CMAKE_CXX_PLATFORM_ID "Linux") -set(CMAKE_CXX_SIMULATE_ID "") -set(CMAKE_CXX_SIMULATE_VERSION "") - - - -set(CMAKE_AR "/usr/bin/ar") -set(CMAKE_CXX_COMPILER_AR "/usr/bin/gcc-ar-7") -set(CMAKE_RANLIB "/usr/bin/ranlib") -set(CMAKE_CXX_COMPILER_RANLIB "/usr/bin/gcc-ranlib-7") -set(CMAKE_LINKER "/usr/bin/ld") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCXX 1) -set(CMAKE_CXX_COMPILER_LOADED 1) -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_CXX_ABI_COMPILED TRUE) -set(CMAKE_COMPILER_IS_MINGW ) -set(CMAKE_COMPILER_IS_CYGWIN ) -if(CMAKE_COMPILER_IS_CYGWIN) - set(CYGWIN 1) - set(UNIX 1) -endif() - -set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") - -if(CMAKE_COMPILER_IS_MINGW) - set(MINGW 1) -endif() -set(CMAKE_CXX_COMPILER_ID_RUN 1) -set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) -set(CMAKE_CXX_LINKER_PREFERENCE 30) -set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) - -# Save compiler ABI information. -set(CMAKE_CXX_SIZEOF_DATA_PTR "8") -set(CMAKE_CXX_COMPILER_ABI "ELF") -set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") - -if(CMAKE_CXX_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_CXX_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -endif() - -if(CMAKE_CXX_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") -endif() - -set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include/c++/7;/usr/include/x86_64-linux-gnu/c++/7;/usr/include/c++/7/backward;/usr/lib/gcc/x86_64-linux-gnu/7/include;/usr/local/include;/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed;/usr/include/x86_64-linux-gnu;/usr/include") -set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc_s;gcc;c;gcc_s;gcc") -set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") -set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeSystem.cmake b/control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeSystem.cmake deleted file mode 100644 index 4f06a4c..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/3.14.3/CMakeSystem.cmake +++ /dev/null @@ -1,15 +0,0 @@ -set(CMAKE_HOST_SYSTEM "Linux-4.15.0-50-generic") -set(CMAKE_HOST_SYSTEM_NAME "Linux") -set(CMAKE_HOST_SYSTEM_VERSION "4.15.0-50-generic") -set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") - - - -set(CMAKE_SYSTEM "Linux-4.15.0-50-generic") -set(CMAKE_SYSTEM_NAME "Linux") -set(CMAKE_SYSTEM_VERSION "4.15.0-50-generic") -set(CMAKE_SYSTEM_PROCESSOR "x86_64") - -set(CMAKE_CROSSCOMPILING "FALSE") - -set(CMAKE_SYSTEM_LOADED 1) diff --git a/control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdC/CMakeCCompilerId.c b/control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdC/CMakeCCompilerId.c deleted file mode 100644 index f73a4fa..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdC/CMakeCCompilerId.c +++ /dev/null @@ -1,666 +0,0 @@ -#ifdef __cplusplus -# error "A C++ compiler has been selected for C." -#endif - -#if defined(__18CXX) -# define ID_VOID_MAIN -#endif -#if defined(__CLASSIC_C__) -/* cv-qualifiers did not exist in K&R C */ -# define const -# define volatile -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -/* __INTEL_COMPILER = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) -/* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) -/* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" -/* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" -/* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" -/* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 -/* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else -/* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" -/* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" -/* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" -# if defined(__ibmxl__) -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) -# else -/* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) -# endif - - -#elif defined(__ibmxl__) || (defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800) -# define COMPILER_ID "XL" -# if defined(__ibmxl__) -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) -# else -/* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) -# endif - - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" -# if defined(__ibmxl__) -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) -# else -/* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) -# endif - - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" -/* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) -# define COMPILER_ID "Fujitsu" - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 -/* __ARMCC_VERSION = VRRPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) -# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) -# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else -/* __ARMCC_VERSION = VRPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) -# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) -# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) -/* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) -/* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" -/* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 -/* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else -/* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) -/* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && defined(__ICCAVR__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) -# define COMPILER_ID "SDCC" -# if defined(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) -# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) -# else -/* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) -# endif - -#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) -# define COMPILER_ID "MIPSpro" -# if defined(_SGI_COMPILER_VERSION) -/* _SGI_COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) -# else -/* _COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXE) || defined(__CRAYXC) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number components. */ -#ifdef COMPILER_VERSION_MAJOR -char const info_version[] = -{ - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0' -}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = -{ - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0' -}; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = -{ - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0' -}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - - -#if !defined(__STDC__) -# if (defined(_MSC_VER) && !defined(__clang__)) \ - || (defined(__ibmxl__) || defined(__IBMC__)) -# define C_DIALECT "90" -# else -# define C_DIALECT -# endif -#elif __STDC_VERSION__ >= 201000L -# define C_DIALECT "11" -#elif __STDC_VERSION__ >= 199901L -# define C_DIALECT "99" -#else -# define C_DIALECT "90" -#endif -const char* info_language_dialect_default = - "INFO" ":" "dialect_default[" C_DIALECT "]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; -char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXE) || defined(__CRAYXC) - require += info_cray[argc]; -#endif - require += info_language_dialect_default[argc]; - (void)argv; - return require; -} -#endif diff --git a/control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdCXX/CMakeCXXCompilerId.cpp b/control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdCXX/CMakeCXXCompilerId.cpp deleted file mode 100644 index 065cf6c..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdCXX/CMakeCXXCompilerId.cpp +++ /dev/null @@ -1,644 +0,0 @@ -/* This source file must have a .cpp extension so that all C++ compilers - recognize the extension without flags. Borland does not know .cxx for - example. */ -#ifndef __cplusplus -# error "A C compiler has been selected for C++." -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__COMO__) -# define COMPILER_ID "Comeau" -/* __COMO_VERSION__ = VRR */ -# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) -# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) - -#elif defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -/* __INTEL_COMPILER = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) -/* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) -/* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" -/* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" -/* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" -/* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_CC) -# define COMPILER_ID "SunPro" -# if __SUNPRO_CC >= 0x5100 -/* __SUNPRO_CC = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# else -/* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# endif - -#elif defined(__HP_aCC) -# define COMPILER_ID "HP" -/* __HP_aCC = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) - -#elif defined(__DECCXX) -# define COMPILER_ID "Compaq" -/* __DECCXX_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) - -#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" -# if defined(__ibmxl__) -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) -# else -/* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) -# endif - - -#elif defined(__ibmxl__) || (defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800) -# define COMPILER_ID "XL" -# if defined(__ibmxl__) -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) -# else -/* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) -# endif - - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 -# define COMPILER_ID "VisualAge" -# if defined(__ibmxl__) -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) -# else -/* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) -# endif - - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" -/* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) -# define COMPILER_ID "Fujitsu" - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 -/* __ARMCC_VERSION = VRRPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) -# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) -# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else -/* __ARMCC_VERSION = VRPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) -# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) -# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) -/* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) -/* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) || defined(__GNUG__) -# define COMPILER_ID "GNU" -# if defined(__GNUC__) -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# else -# define COMPILER_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" -/* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 -/* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else -/* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) -/* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && defined(__ICCAVR__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) -# define COMPILER_ID "MIPSpro" -# if defined(_SGI_COMPILER_VERSION) -/* _SGI_COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) -# else -/* _COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXE) || defined(__CRAYXC) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number components. */ -#ifdef COMPILER_VERSION_MAJOR -char const info_version[] = -{ - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0' -}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = -{ - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0' -}; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = -{ - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0' -}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - - -#if defined(_MSC_VER) && defined(_MSVC_LANG) -#define CXX_STD _MSVC_LANG -#else -#define CXX_STD __cplusplus -#endif - -const char* info_language_dialect_default = "INFO" ":" "dialect_default[" -#if CXX_STD > 201703L - "20" -#elif CXX_STD >= 201703L - "17" -#elif CXX_STD >= 201402L - "14" -#elif CXX_STD >= 201103L - "11" -#else - "98" -#endif - "]"; - -/*--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXE) || defined(__CRAYXC) - require += info_cray[argc]; -#endif - require += info_language_dialect_default[argc]; - (void)argv; - return require; -} diff --git a/control/src/cmake-build-debug/CMakeFiles/CMakeDirectoryInformation.cmake b/control/src/cmake-build-debug/CMakeFiles/CMakeDirectoryInformation.cmake deleted file mode 100644 index c90f6e9..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/CMakeDirectoryInformation.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.14 - -# Relative path conversion top directories. -set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/famulus/Dokumente/b15f/control/src") -set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug") - -# Force unix paths in dependencies. -set(CMAKE_FORCE_UNIX_PATHS 1) - - -# The C and CXX include file regular expressions for this directory. -set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") -set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") -set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) -set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/control/src/cmake-build-debug/CMakeFiles/CMakeOutput.log b/control/src/cmake-build-debug/CMakeFiles/CMakeOutput.log deleted file mode 100644 index f7b3f2f..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/CMakeOutput.log +++ /dev/null @@ -1,821 +0,0 @@ -The system is: Linux - 4.15.0-50-generic - x86_64 -Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. -Compiler: /usr/bin/cc -Build flags: -Id flags: - -The output was: -0 - - -Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" - -The C compiler identification is GNU, found in "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdC/a.out" - -Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. -Compiler: /usr/bin/c++ -Build flags: -Id flags: - -The output was: -0 - - -Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" - -The CXX compiler identification is GNU, found in "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/3.14.3/CompilerIdCXX/a.out" - -Determining if the C compiler works passed with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_032f8/fast -/usr/bin/make -f CMakeFiles/cmTC_032f8.dir/build.make CMakeFiles/cmTC_032f8.dir/build -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird betreten -Building C object CMakeFiles/cmTC_032f8.dir/testCCompiler.c.o -/usr/bin/cc -o CMakeFiles/cmTC_032f8.dir/testCCompiler.c.o -c /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp/testCCompiler.c -Linking C executable cmTC_032f8 -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_032f8.dir/link.txt --verbose=1 -/usr/bin/cc CMakeFiles/cmTC_032f8.dir/testCCompiler.c.o -o cmTC_032f8 -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird verlassen - - -Detecting C compiler ABI info compiled with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_ed9e6/fast -/usr/bin/make -f CMakeFiles/cmTC_ed9e6.dir/build.make CMakeFiles/cmTC_ed9e6.dir/build -make[1]: Entering directory '/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp' -Building C object CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o -/usr/bin/cc -v -o CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o -c /home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCCompilerABI.c -Using built-in specs. -COLLECT_GCC=/usr/bin/cc -OFFLOAD_TARGET_NAMES=nvptx-none -OFFLOAD_TARGET_DEFAULT=1 -Target: x86_64-linux-gnu -Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu -Thread model: posix -gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' - /usr/lib/gcc/x86_64-linux-gnu/7/cc1 -quiet -v -imultiarch x86_64-linux-gnu /home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/ccMh8kwI.s -GNU C11 (Ubuntu 7.3.0-27ubuntu1~18.04) version 7.3.0 (x86_64-linux-gnu) - compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP - -GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 -ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" -ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include" -#include "..." search starts here: -#include <...> search starts here: - /usr/lib/gcc/x86_64-linux-gnu/7/include - /usr/local/include - /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed - /usr/include/x86_64-linux-gnu - /usr/include -End of search list. -GNU C11 (Ubuntu 7.3.0-27ubuntu1~18.04) version 7.3.0 (x86_64-linux-gnu) - compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP - -GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 -Compiler executable checksum: c8081a99abb72bbfd9129549110a350c -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' - as -v --64 -o CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o /tmp/ccMh8kwI.s -GNU assembler version 2.30 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.30 -COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/ -LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/ -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' -Linking C executable cmTC_ed9e6 -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ed9e6.dir/link.txt --verbose=1 -/usr/bin/cc -v CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o -o cmTC_ed9e6 -Using built-in specs. -COLLECT_GCC=/usr/bin/cc -COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -OFFLOAD_TARGET_NAMES=nvptx-none -OFFLOAD_TARGET_DEFAULT=1 -Target: x86_64-linux-gnu -Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu -Thread model: posix -gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) -COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/ -LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/ -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ed9e6' '-mtune=generic' '-march=x86-64' - /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/cc4HmCpM.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_ed9e6 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ed9e6' '-mtune=generic' '-march=x86-64' -make[1]: Leaving directory '/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp' - - -Parsed C implicit include dir info from above output: rv=done - found start of include info - found start of implicit include info - add: [/usr/lib/gcc/x86_64-linux-gnu/7/include] - add: [/usr/local/include] - add: [/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed] - add: [/usr/include/x86_64-linux-gnu] - add: [/usr/include] - end of search list found - collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/7/include] ==> [/usr/lib/gcc/x86_64-linux-gnu/7/include] - collapse include dir [/usr/local/include] ==> [/usr/local/include] - collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed] ==> [/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed] - collapse include dir [/usr/include/x86_64-linux-gnu] ==> [/usr/include/x86_64-linux-gnu] - collapse include dir [/usr/include] ==> [/usr/include] - implicit include dirs: [/usr/lib/gcc/x86_64-linux-gnu/7/include;/usr/local/include;/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed;/usr/include/x86_64-linux-gnu;/usr/include] - - -Parsed C implicit link information from above output: - link line regex: [^( *|.*[/\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] - ignore line: [Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp] - ignore line: [] - ignore line: [Run Build Command(s):/usr/bin/make cmTC_ed9e6/fast ] - ignore line: [/usr/bin/make -f CMakeFiles/cmTC_ed9e6.dir/build.make CMakeFiles/cmTC_ed9e6.dir/build] - ignore line: [make[1]: Entering directory '/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp'] - ignore line: [Building C object CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o] - ignore line: [/usr/bin/cc -v -o CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o -c /home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCCompilerABI.c] - ignore line: [Using built-in specs.] - ignore line: [COLLECT_GCC=/usr/bin/cc] - ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none] - ignore line: [OFFLOAD_TARGET_DEFAULT=1] - ignore line: [Target: x86_64-linux-gnu] - ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] - ignore line: [Thread model: posix] - ignore line: [gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) ] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'] - ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/7/cc1 -quiet -v -imultiarch x86_64-linux-gnu /home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/ccMh8kwI.s] - ignore line: [GNU C11 (Ubuntu 7.3.0-27ubuntu1~18.04) version 7.3.0 (x86_64-linux-gnu)] - ignore line: [ compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP] - ignore line: [] - ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] - ignore line: [ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"] - ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include"] - ignore line: [#include "..." search starts here:] - ignore line: [#include <...> search starts here:] - ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/7/include] - ignore line: [ /usr/local/include] - ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed] - ignore line: [ /usr/include/x86_64-linux-gnu] - ignore line: [ /usr/include] - ignore line: [End of search list.] - ignore line: [GNU C11 (Ubuntu 7.3.0-27ubuntu1~18.04) version 7.3.0 (x86_64-linux-gnu)] - ignore line: [ compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP] - ignore line: [] - ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] - ignore line: [Compiler executable checksum: c8081a99abb72bbfd9129549110a350c] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'] - ignore line: [ as -v --64 -o CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o /tmp/ccMh8kwI.s] - ignore line: [GNU assembler version 2.30 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.30] - ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/] - ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'] - ignore line: [Linking C executable cmTC_ed9e6] - ignore line: [/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ed9e6.dir/link.txt --verbose=1] - ignore line: [/usr/bin/cc -v CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o -o cmTC_ed9e6 ] - ignore line: [Using built-in specs.] - ignore line: [COLLECT_GCC=/usr/bin/cc] - ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper] - ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none] - ignore line: [OFFLOAD_TARGET_DEFAULT=1] - ignore line: [Target: x86_64-linux-gnu] - ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] - ignore line: [Thread model: posix] - ignore line: [gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) ] - ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/] - ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ed9e6' '-mtune=generic' '-march=x86-64'] - link line: [ /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/cc4HmCpM.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_ed9e6 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o] - arg [/usr/lib/gcc/x86_64-linux-gnu/7/collect2] ==> ignore - arg [-plugin] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so] ==> ignore - arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper] ==> ignore - arg [-plugin-opt=-fresolution=/tmp/cc4HmCpM.res] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore - arg [-plugin-opt=-pass-through=-lc] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore - arg [--sysroot=/] ==> ignore - arg [--build-id] ==> ignore - arg [--eh-frame-hdr] ==> ignore - arg [-m] ==> ignore - arg [elf_x86_64] ==> ignore - arg [--hash-style=gnu] ==> ignore - arg [--as-needed] ==> ignore - arg [-dynamic-linker] ==> ignore - arg [/lib64/ld-linux-x86-64.so.2] ==> ignore - arg [-pie] ==> ignore - arg [-znow] ==> ignore - arg [-zrelro] ==> ignore - arg [-o] ==> ignore - arg [cmTC_ed9e6] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o] ==> ignore - arg [-L/usr/lib/gcc/x86_64-linux-gnu/7] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] - arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] - arg [-L/lib/../lib] ==> dir [/lib/../lib] - arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] - arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../..] - arg [CMakeFiles/cmTC_ed9e6.dir/CMakeCCompilerABI.c.o] ==> ignore - arg [-lgcc] ==> lib [gcc] - arg [--push-state] ==> ignore - arg [--as-needed] ==> ignore - arg [-lgcc_s] ==> lib [gcc_s] - arg [--pop-state] ==> ignore - arg [-lc] ==> lib [c] - arg [-lgcc] ==> lib [gcc] - arg [--push-state] ==> ignore - arg [--as-needed] ==> ignore - arg [-lgcc_s] ==> lib [gcc_s] - arg [--pop-state] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o] ==> ignore - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7] ==> [/usr/lib/gcc/x86_64-linux-gnu/7] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] ==> [/usr/lib] - collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] - collapse library dir [/lib/../lib] ==> [/lib] - collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] - collapse library dir [/usr/lib/../lib] ==> [/usr/lib] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../..] ==> [/usr/lib] - implicit libs: [gcc;gcc_s;c;gcc;gcc_s] - implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] - implicit fwks: [] - - - - -Detecting C [-std=c11] compiler features compiled with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_04e3d/fast -/usr/bin/make -f CMakeFiles/cmTC_04e3d.dir/build.make CMakeFiles/cmTC_04e3d.dir/build -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird betreten -Building C object CMakeFiles/cmTC_04e3d.dir/feature_tests.c.o -/usr/bin/cc -std=c11 -o CMakeFiles/cmTC_04e3d.dir/feature_tests.c.o -c /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/feature_tests.c -Linking C executable cmTC_04e3d -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_04e3d.dir/link.txt --verbose=1 -/usr/bin/cc CMakeFiles/cmTC_04e3d.dir/feature_tests.c.o -o cmTC_04e3d -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird verlassen - - - Feature record: C_FEATURE:1c_function_prototypes - Feature record: C_FEATURE:1c_restrict - Feature record: C_FEATURE:1c_static_assert - Feature record: C_FEATURE:1c_variadic_macros - - -Detecting C [-std=c99] compiler features compiled with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_d1d94/fast -/usr/bin/make -f CMakeFiles/cmTC_d1d94.dir/build.make CMakeFiles/cmTC_d1d94.dir/build -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird betreten -Building C object CMakeFiles/cmTC_d1d94.dir/feature_tests.c.o -/usr/bin/cc -std=c99 -o CMakeFiles/cmTC_d1d94.dir/feature_tests.c.o -c /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/feature_tests.c -Linking C executable cmTC_d1d94 -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d1d94.dir/link.txt --verbose=1 -/usr/bin/cc CMakeFiles/cmTC_d1d94.dir/feature_tests.c.o -o cmTC_d1d94 -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird verlassen - - - Feature record: C_FEATURE:1c_function_prototypes - Feature record: C_FEATURE:1c_restrict - Feature record: C_FEATURE:0c_static_assert - Feature record: C_FEATURE:1c_variadic_macros - - -Detecting C [-std=c90] compiler features compiled with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_83512/fast -/usr/bin/make -f CMakeFiles/cmTC_83512.dir/build.make CMakeFiles/cmTC_83512.dir/build -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird betreten -Building C object CMakeFiles/cmTC_83512.dir/feature_tests.c.o -/usr/bin/cc -std=c90 -o CMakeFiles/cmTC_83512.dir/feature_tests.c.o -c /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/feature_tests.c -Linking C executable cmTC_83512 -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_83512.dir/link.txt --verbose=1 -/usr/bin/cc CMakeFiles/cmTC_83512.dir/feature_tests.c.o -o cmTC_83512 -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird verlassen - - - Feature record: C_FEATURE:1c_function_prototypes - Feature record: C_FEATURE:0c_restrict - Feature record: C_FEATURE:0c_static_assert - Feature record: C_FEATURE:0c_variadic_macros -Determining if the CXX compiler works passed with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_40366/fast -/usr/bin/make -f CMakeFiles/cmTC_40366.dir/build.make CMakeFiles/cmTC_40366.dir/build -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird betreten -Building CXX object CMakeFiles/cmTC_40366.dir/testCXXCompiler.cxx.o -/usr/bin/c++ -o CMakeFiles/cmTC_40366.dir/testCXXCompiler.cxx.o -c /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp/testCXXCompiler.cxx -Linking CXX executable cmTC_40366 -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_40366.dir/link.txt --verbose=1 -/usr/bin/c++ CMakeFiles/cmTC_40366.dir/testCXXCompiler.cxx.o -o cmTC_40366 -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird verlassen - - -Detecting CXX compiler ABI info compiled with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_0d18e/fast -/usr/bin/make -f CMakeFiles/cmTC_0d18e.dir/build.make CMakeFiles/cmTC_0d18e.dir/build -make[1]: Entering directory '/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp' -Building CXX object CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o -/usr/bin/c++ -v -o CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o -c /home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCXXCompilerABI.cpp -Using built-in specs. -COLLECT_GCC=/usr/bin/c++ -OFFLOAD_TARGET_NAMES=nvptx-none -OFFLOAD_TARGET_DEFAULT=1 -Target: x86_64-linux-gnu -Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu -Thread model: posix -gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' - /usr/lib/gcc/x86_64-linux-gnu/7/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/ccoRlQYL.s -GNU C++14 (Ubuntu 7.3.0-27ubuntu1~18.04) version 7.3.0 (x86_64-linux-gnu) - compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP - -GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 -ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/7" -ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" -ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include" -#include "..." search starts here: -#include <...> search starts here: - /usr/include/c++/7 - /usr/include/x86_64-linux-gnu/c++/7 - /usr/include/c++/7/backward - /usr/lib/gcc/x86_64-linux-gnu/7/include - /usr/local/include - /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed - /usr/include/x86_64-linux-gnu - /usr/include -End of search list. -GNU C++14 (Ubuntu 7.3.0-27ubuntu1~18.04) version 7.3.0 (x86_64-linux-gnu) - compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP - -GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 -Compiler executable checksum: 1bfae38ae5df64de6196cbd8c3b07d86 -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' - as -v --64 -o CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccoRlQYL.s -GNU assembler version 2.30 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.30 -COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/ -LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/ -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' -Linking CXX executable cmTC_0d18e -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_0d18e.dir/link.txt --verbose=1 -/usr/bin/c++ -v CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_0d18e -Using built-in specs. -COLLECT_GCC=/usr/bin/c++ -COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -OFFLOAD_TARGET_NAMES=nvptx-none -OFFLOAD_TARGET_DEFAULT=1 -Target: x86_64-linux-gnu -Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu -Thread model: posix -gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) -COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/ -LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/ -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_0d18e' '-shared-libgcc' '-mtune=generic' '-march=x86-64' - /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccApkitP.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_0d18e /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_0d18e' '-shared-libgcc' '-mtune=generic' '-march=x86-64' -make[1]: Leaving directory '/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp' - - -Parsed CXX implicit include dir info from above output: rv=done - found start of include info - found start of implicit include info - add: [/usr/include/c++/7] - add: [/usr/include/x86_64-linux-gnu/c++/7] - add: [/usr/include/c++/7/backward] - add: [/usr/lib/gcc/x86_64-linux-gnu/7/include] - add: [/usr/local/include] - add: [/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed] - add: [/usr/include/x86_64-linux-gnu] - add: [/usr/include] - end of search list found - collapse include dir [/usr/include/c++/7] ==> [/usr/include/c++/7] - collapse include dir [/usr/include/x86_64-linux-gnu/c++/7] ==> [/usr/include/x86_64-linux-gnu/c++/7] - collapse include dir [/usr/include/c++/7/backward] ==> [/usr/include/c++/7/backward] - collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/7/include] ==> [/usr/lib/gcc/x86_64-linux-gnu/7/include] - collapse include dir [/usr/local/include] ==> [/usr/local/include] - collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed] ==> [/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed] - collapse include dir [/usr/include/x86_64-linux-gnu] ==> [/usr/include/x86_64-linux-gnu] - collapse include dir [/usr/include] ==> [/usr/include] - implicit include dirs: [/usr/include/c++/7;/usr/include/x86_64-linux-gnu/c++/7;/usr/include/c++/7/backward;/usr/lib/gcc/x86_64-linux-gnu/7/include;/usr/local/include;/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed;/usr/include/x86_64-linux-gnu;/usr/include] - - -Parsed CXX implicit link information from above output: - link line regex: [^( *|.*[/\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] - ignore line: [Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp] - ignore line: [] - ignore line: [Run Build Command(s):/usr/bin/make cmTC_0d18e/fast ] - ignore line: [/usr/bin/make -f CMakeFiles/cmTC_0d18e.dir/build.make CMakeFiles/cmTC_0d18e.dir/build] - ignore line: [make[1]: Entering directory '/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp'] - ignore line: [Building CXX object CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o] - ignore line: [/usr/bin/c++ -v -o CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o -c /home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCXXCompilerABI.cpp] - ignore line: [Using built-in specs.] - ignore line: [COLLECT_GCC=/usr/bin/c++] - ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none] - ignore line: [OFFLOAD_TARGET_DEFAULT=1] - ignore line: [Target: x86_64-linux-gnu] - ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] - ignore line: [Thread model: posix] - ignore line: [gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) ] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] - ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/7/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/ccoRlQYL.s] - ignore line: [GNU C++14 (Ubuntu 7.3.0-27ubuntu1~18.04) version 7.3.0 (x86_64-linux-gnu)] - ignore line: [ compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP] - ignore line: [] - ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] - ignore line: [ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/7"] - ignore line: [ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"] - ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include"] - ignore line: [#include "..." search starts here:] - ignore line: [#include <...> search starts here:] - ignore line: [ /usr/include/c++/7] - ignore line: [ /usr/include/x86_64-linux-gnu/c++/7] - ignore line: [ /usr/include/c++/7/backward] - ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/7/include] - ignore line: [ /usr/local/include] - ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed] - ignore line: [ /usr/include/x86_64-linux-gnu] - ignore line: [ /usr/include] - ignore line: [End of search list.] - ignore line: [GNU C++14 (Ubuntu 7.3.0-27ubuntu1~18.04) version 7.3.0 (x86_64-linux-gnu)] - ignore line: [ compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP] - ignore line: [] - ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] - ignore line: [Compiler executable checksum: 1bfae38ae5df64de6196cbd8c3b07d86] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] - ignore line: [ as -v --64 -o CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccoRlQYL.s] - ignore line: [GNU assembler version 2.30 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.30] - ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/] - ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] - ignore line: [Linking CXX executable cmTC_0d18e] - ignore line: [/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_0d18e.dir/link.txt --verbose=1] - ignore line: [/usr/bin/c++ -v CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_0d18e ] - ignore line: [Using built-in specs.] - ignore line: [COLLECT_GCC=/usr/bin/c++] - ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper] - ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none] - ignore line: [OFFLOAD_TARGET_DEFAULT=1] - ignore line: [Target: x86_64-linux-gnu] - ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] - ignore line: [Thread model: posix] - ignore line: [gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) ] - ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/] - ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_0d18e' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] - link line: [ /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccApkitP.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_0d18e /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o] - arg [/usr/lib/gcc/x86_64-linux-gnu/7/collect2] ==> ignore - arg [-plugin] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so] ==> ignore - arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper] ==> ignore - arg [-plugin-opt=-fresolution=/tmp/ccApkitP.res] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc] ==> ignore - arg [-plugin-opt=-pass-through=-lc] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc] ==> ignore - arg [--sysroot=/] ==> ignore - arg [--build-id] ==> ignore - arg [--eh-frame-hdr] ==> ignore - arg [-m] ==> ignore - arg [elf_x86_64] ==> ignore - arg [--hash-style=gnu] ==> ignore - arg [--as-needed] ==> ignore - arg [-dynamic-linker] ==> ignore - arg [/lib64/ld-linux-x86-64.so.2] ==> ignore - arg [-pie] ==> ignore - arg [-znow] ==> ignore - arg [-zrelro] ==> ignore - arg [-o] ==> ignore - arg [cmTC_0d18e] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o] ==> ignore - arg [-L/usr/lib/gcc/x86_64-linux-gnu/7] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] - arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] - arg [-L/lib/../lib] ==> dir [/lib/../lib] - arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] - arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../..] - arg [CMakeFiles/cmTC_0d18e.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore - arg [-lstdc++] ==> lib [stdc++] - arg [-lm] ==> lib [m] - arg [-lgcc_s] ==> lib [gcc_s] - arg [-lgcc] ==> lib [gcc] - arg [-lc] ==> lib [c] - arg [-lgcc_s] ==> lib [gcc_s] - arg [-lgcc] ==> lib [gcc] - arg [/usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o] ==> ignore - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7] ==> [/usr/lib/gcc/x86_64-linux-gnu/7] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] ==> [/usr/lib] - collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] - collapse library dir [/lib/../lib] ==> [/lib] - collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] - collapse library dir [/usr/lib/../lib] ==> [/usr/lib] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../..] ==> [/usr/lib] - implicit libs: [stdc++;m;gcc_s;gcc;c;gcc_s;gcc] - implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] - implicit fwks: [] - - - - -Detecting CXX [-std=c++1z] compiler features compiled with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_0302c/fast -/usr/bin/make -f CMakeFiles/cmTC_0302c.dir/build.make CMakeFiles/cmTC_0302c.dir/build -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird betreten -Building CXX object CMakeFiles/cmTC_0302c.dir/feature_tests.cxx.o -/usr/bin/c++ -std=c++1z -o CMakeFiles/cmTC_0302c.dir/feature_tests.cxx.o -c /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/feature_tests.cxx -Linking CXX executable cmTC_0302c -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_0302c.dir/link.txt --verbose=1 -/usr/bin/c++ CMakeFiles/cmTC_0302c.dir/feature_tests.cxx.o -o cmTC_0302c -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird verlassen - - - Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers - Feature record: CXX_FEATURE:1cxx_alias_templates - Feature record: CXX_FEATURE:1cxx_alignas - Feature record: CXX_FEATURE:1cxx_alignof - Feature record: CXX_FEATURE:1cxx_attributes - Feature record: CXX_FEATURE:1cxx_attribute_deprecated - Feature record: CXX_FEATURE:1cxx_auto_type - Feature record: CXX_FEATURE:1cxx_binary_literals - Feature record: CXX_FEATURE:1cxx_constexpr - Feature record: CXX_FEATURE:1cxx_contextual_conversions - Feature record: CXX_FEATURE:1cxx_decltype - Feature record: CXX_FEATURE:1cxx_decltype_auto - Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types - Feature record: CXX_FEATURE:1cxx_default_function_template_args - Feature record: CXX_FEATURE:1cxx_defaulted_functions - Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers - Feature record: CXX_FEATURE:1cxx_delegating_constructors - Feature record: CXX_FEATURE:1cxx_deleted_functions - Feature record: CXX_FEATURE:1cxx_digit_separators - Feature record: CXX_FEATURE:1cxx_enum_forward_declarations - Feature record: CXX_FEATURE:1cxx_explicit_conversions - Feature record: CXX_FEATURE:1cxx_extended_friend_declarations - Feature record: CXX_FEATURE:1cxx_extern_templates - Feature record: CXX_FEATURE:1cxx_final - Feature record: CXX_FEATURE:1cxx_func_identifier - Feature record: CXX_FEATURE:1cxx_generalized_initializers - Feature record: CXX_FEATURE:1cxx_generic_lambdas - Feature record: CXX_FEATURE:1cxx_inheriting_constructors - Feature record: CXX_FEATURE:1cxx_inline_namespaces - Feature record: CXX_FEATURE:1cxx_lambdas - Feature record: CXX_FEATURE:1cxx_lambda_init_captures - Feature record: CXX_FEATURE:1cxx_local_type_template_args - Feature record: CXX_FEATURE:1cxx_long_long_type - Feature record: CXX_FEATURE:1cxx_noexcept - Feature record: CXX_FEATURE:1cxx_nonstatic_member_init - Feature record: CXX_FEATURE:1cxx_nullptr - Feature record: CXX_FEATURE:1cxx_override - Feature record: CXX_FEATURE:1cxx_range_for - Feature record: CXX_FEATURE:1cxx_raw_string_literals - Feature record: CXX_FEATURE:1cxx_reference_qualified_functions - Feature record: CXX_FEATURE:1cxx_relaxed_constexpr - Feature record: CXX_FEATURE:1cxx_return_type_deduction - Feature record: CXX_FEATURE:1cxx_right_angle_brackets - Feature record: CXX_FEATURE:1cxx_rvalue_references - Feature record: CXX_FEATURE:1cxx_sizeof_member - Feature record: CXX_FEATURE:1cxx_static_assert - Feature record: CXX_FEATURE:1cxx_strong_enums - Feature record: CXX_FEATURE:1cxx_template_template_parameters - Feature record: CXX_FEATURE:1cxx_thread_local - Feature record: CXX_FEATURE:1cxx_trailing_return_types - Feature record: CXX_FEATURE:1cxx_unicode_literals - Feature record: CXX_FEATURE:1cxx_uniform_initialization - Feature record: CXX_FEATURE:1cxx_unrestricted_unions - Feature record: CXX_FEATURE:1cxx_user_literals - Feature record: CXX_FEATURE:1cxx_variable_templates - Feature record: CXX_FEATURE:1cxx_variadic_macros - Feature record: CXX_FEATURE:1cxx_variadic_templates - - -Detecting CXX [-std=c++14] compiler features compiled with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_2782d/fast -/usr/bin/make -f CMakeFiles/cmTC_2782d.dir/build.make CMakeFiles/cmTC_2782d.dir/build -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird betreten -Building CXX object CMakeFiles/cmTC_2782d.dir/feature_tests.cxx.o -/usr/bin/c++ -std=c++14 -o CMakeFiles/cmTC_2782d.dir/feature_tests.cxx.o -c /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/feature_tests.cxx -Linking CXX executable cmTC_2782d -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_2782d.dir/link.txt --verbose=1 -/usr/bin/c++ CMakeFiles/cmTC_2782d.dir/feature_tests.cxx.o -o cmTC_2782d -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird verlassen - - - Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers - Feature record: CXX_FEATURE:1cxx_alias_templates - Feature record: CXX_FEATURE:1cxx_alignas - Feature record: CXX_FEATURE:1cxx_alignof - Feature record: CXX_FEATURE:1cxx_attributes - Feature record: CXX_FEATURE:1cxx_attribute_deprecated - Feature record: CXX_FEATURE:1cxx_auto_type - Feature record: CXX_FEATURE:1cxx_binary_literals - Feature record: CXX_FEATURE:1cxx_constexpr - Feature record: CXX_FEATURE:1cxx_contextual_conversions - Feature record: CXX_FEATURE:1cxx_decltype - Feature record: CXX_FEATURE:1cxx_decltype_auto - Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types - Feature record: CXX_FEATURE:1cxx_default_function_template_args - Feature record: CXX_FEATURE:1cxx_defaulted_functions - Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers - Feature record: CXX_FEATURE:1cxx_delegating_constructors - Feature record: CXX_FEATURE:1cxx_deleted_functions - Feature record: CXX_FEATURE:1cxx_digit_separators - Feature record: CXX_FEATURE:1cxx_enum_forward_declarations - Feature record: CXX_FEATURE:1cxx_explicit_conversions - Feature record: CXX_FEATURE:1cxx_extended_friend_declarations - Feature record: CXX_FEATURE:1cxx_extern_templates - Feature record: CXX_FEATURE:1cxx_final - Feature record: CXX_FEATURE:1cxx_func_identifier - Feature record: CXX_FEATURE:1cxx_generalized_initializers - Feature record: CXX_FEATURE:1cxx_generic_lambdas - Feature record: CXX_FEATURE:1cxx_inheriting_constructors - Feature record: CXX_FEATURE:1cxx_inline_namespaces - Feature record: CXX_FEATURE:1cxx_lambdas - Feature record: CXX_FEATURE:1cxx_lambda_init_captures - Feature record: CXX_FEATURE:1cxx_local_type_template_args - Feature record: CXX_FEATURE:1cxx_long_long_type - Feature record: CXX_FEATURE:1cxx_noexcept - Feature record: CXX_FEATURE:1cxx_nonstatic_member_init - Feature record: CXX_FEATURE:1cxx_nullptr - Feature record: CXX_FEATURE:1cxx_override - Feature record: CXX_FEATURE:1cxx_range_for - Feature record: CXX_FEATURE:1cxx_raw_string_literals - Feature record: CXX_FEATURE:1cxx_reference_qualified_functions - Feature record: CXX_FEATURE:1cxx_relaxed_constexpr - Feature record: CXX_FEATURE:1cxx_return_type_deduction - Feature record: CXX_FEATURE:1cxx_right_angle_brackets - Feature record: CXX_FEATURE:1cxx_rvalue_references - Feature record: CXX_FEATURE:1cxx_sizeof_member - Feature record: CXX_FEATURE:1cxx_static_assert - Feature record: CXX_FEATURE:1cxx_strong_enums - Feature record: CXX_FEATURE:1cxx_template_template_parameters - Feature record: CXX_FEATURE:1cxx_thread_local - Feature record: CXX_FEATURE:1cxx_trailing_return_types - Feature record: CXX_FEATURE:1cxx_unicode_literals - Feature record: CXX_FEATURE:1cxx_uniform_initialization - Feature record: CXX_FEATURE:1cxx_unrestricted_unions - Feature record: CXX_FEATURE:1cxx_user_literals - Feature record: CXX_FEATURE:1cxx_variable_templates - Feature record: CXX_FEATURE:1cxx_variadic_macros - Feature record: CXX_FEATURE:1cxx_variadic_templates - - -Detecting CXX [-std=c++11] compiler features compiled with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_ca957/fast -/usr/bin/make -f CMakeFiles/cmTC_ca957.dir/build.make CMakeFiles/cmTC_ca957.dir/build -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird betreten -Building CXX object CMakeFiles/cmTC_ca957.dir/feature_tests.cxx.o -/usr/bin/c++ -std=c++11 -o CMakeFiles/cmTC_ca957.dir/feature_tests.cxx.o -c /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/feature_tests.cxx -Linking CXX executable cmTC_ca957 -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ca957.dir/link.txt --verbose=1 -/usr/bin/c++ CMakeFiles/cmTC_ca957.dir/feature_tests.cxx.o -o cmTC_ca957 -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird verlassen - - - Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers - Feature record: CXX_FEATURE:1cxx_alias_templates - Feature record: CXX_FEATURE:1cxx_alignas - Feature record: CXX_FEATURE:1cxx_alignof - Feature record: CXX_FEATURE:1cxx_attributes - Feature record: CXX_FEATURE:0cxx_attribute_deprecated - Feature record: CXX_FEATURE:1cxx_auto_type - Feature record: CXX_FEATURE:0cxx_binary_literals - Feature record: CXX_FEATURE:1cxx_constexpr - Feature record: CXX_FEATURE:0cxx_contextual_conversions - Feature record: CXX_FEATURE:1cxx_decltype - Feature record: CXX_FEATURE:0cxx_decltype_auto - Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types - Feature record: CXX_FEATURE:1cxx_default_function_template_args - Feature record: CXX_FEATURE:1cxx_defaulted_functions - Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers - Feature record: CXX_FEATURE:1cxx_delegating_constructors - Feature record: CXX_FEATURE:1cxx_deleted_functions - Feature record: CXX_FEATURE:0cxx_digit_separators - Feature record: CXX_FEATURE:1cxx_enum_forward_declarations - Feature record: CXX_FEATURE:1cxx_explicit_conversions - Feature record: CXX_FEATURE:1cxx_extended_friend_declarations - Feature record: CXX_FEATURE:1cxx_extern_templates - Feature record: CXX_FEATURE:1cxx_final - Feature record: CXX_FEATURE:1cxx_func_identifier - Feature record: CXX_FEATURE:1cxx_generalized_initializers - Feature record: CXX_FEATURE:0cxx_generic_lambdas - Feature record: CXX_FEATURE:1cxx_inheriting_constructors - Feature record: CXX_FEATURE:1cxx_inline_namespaces - Feature record: CXX_FEATURE:1cxx_lambdas - Feature record: CXX_FEATURE:0cxx_lambda_init_captures - Feature record: CXX_FEATURE:1cxx_local_type_template_args - Feature record: CXX_FEATURE:1cxx_long_long_type - Feature record: CXX_FEATURE:1cxx_noexcept - Feature record: CXX_FEATURE:1cxx_nonstatic_member_init - Feature record: CXX_FEATURE:1cxx_nullptr - Feature record: CXX_FEATURE:1cxx_override - Feature record: CXX_FEATURE:1cxx_range_for - Feature record: CXX_FEATURE:1cxx_raw_string_literals - Feature record: CXX_FEATURE:1cxx_reference_qualified_functions - Feature record: CXX_FEATURE:0cxx_relaxed_constexpr - Feature record: CXX_FEATURE:0cxx_return_type_deduction - Feature record: CXX_FEATURE:1cxx_right_angle_brackets - Feature record: CXX_FEATURE:1cxx_rvalue_references - Feature record: CXX_FEATURE:1cxx_sizeof_member - Feature record: CXX_FEATURE:1cxx_static_assert - Feature record: CXX_FEATURE:1cxx_strong_enums - Feature record: CXX_FEATURE:1cxx_template_template_parameters - Feature record: CXX_FEATURE:1cxx_thread_local - Feature record: CXX_FEATURE:1cxx_trailing_return_types - Feature record: CXX_FEATURE:1cxx_unicode_literals - Feature record: CXX_FEATURE:1cxx_uniform_initialization - Feature record: CXX_FEATURE:1cxx_unrestricted_unions - Feature record: CXX_FEATURE:1cxx_user_literals - Feature record: CXX_FEATURE:0cxx_variable_templates - Feature record: CXX_FEATURE:1cxx_variadic_macros - Feature record: CXX_FEATURE:1cxx_variadic_templates - - -Detecting CXX [-std=c++98] compiler features compiled with the following output: -Change Dir: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_077e9/fast -/usr/bin/make -f CMakeFiles/cmTC_077e9.dir/build.make CMakeFiles/cmTC_077e9.dir/build -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird betreten -Building CXX object CMakeFiles/cmTC_077e9.dir/feature_tests.cxx.o -/usr/bin/c++ -std=c++98 -o CMakeFiles/cmTC_077e9.dir/feature_tests.cxx.o -c /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/feature_tests.cxx -Linking CXX executable cmTC_077e9 -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/cmTC_077e9.dir/link.txt --verbose=1 -/usr/bin/c++ CMakeFiles/cmTC_077e9.dir/feature_tests.cxx.o -o cmTC_077e9 -make[1]: Verzeichnis „/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/CMakeTmp“ wird verlassen - - - Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers - Feature record: CXX_FEATURE:0cxx_alias_templates - Feature record: CXX_FEATURE:0cxx_alignas - Feature record: CXX_FEATURE:0cxx_alignof - Feature record: CXX_FEATURE:0cxx_attributes - Feature record: CXX_FEATURE:0cxx_attribute_deprecated - Feature record: CXX_FEATURE:0cxx_auto_type - Feature record: CXX_FEATURE:0cxx_binary_literals - Feature record: CXX_FEATURE:0cxx_constexpr - Feature record: CXX_FEATURE:0cxx_contextual_conversions - Feature record: CXX_FEATURE:0cxx_decltype - Feature record: CXX_FEATURE:0cxx_decltype_auto - Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types - Feature record: CXX_FEATURE:0cxx_default_function_template_args - Feature record: CXX_FEATURE:0cxx_defaulted_functions - Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers - Feature record: CXX_FEATURE:0cxx_delegating_constructors - Feature record: CXX_FEATURE:0cxx_deleted_functions - Feature record: CXX_FEATURE:0cxx_digit_separators - Feature record: CXX_FEATURE:0cxx_enum_forward_declarations - Feature record: CXX_FEATURE:0cxx_explicit_conversions - Feature record: CXX_FEATURE:0cxx_extended_friend_declarations - Feature record: CXX_FEATURE:0cxx_extern_templates - Feature record: CXX_FEATURE:0cxx_final - Feature record: CXX_FEATURE:0cxx_func_identifier - Feature record: CXX_FEATURE:0cxx_generalized_initializers - Feature record: CXX_FEATURE:0cxx_generic_lambdas - Feature record: CXX_FEATURE:0cxx_inheriting_constructors - Feature record: CXX_FEATURE:0cxx_inline_namespaces - Feature record: CXX_FEATURE:0cxx_lambdas - Feature record: CXX_FEATURE:0cxx_lambda_init_captures - Feature record: CXX_FEATURE:0cxx_local_type_template_args - Feature record: CXX_FEATURE:0cxx_long_long_type - Feature record: CXX_FEATURE:0cxx_noexcept - Feature record: CXX_FEATURE:0cxx_nonstatic_member_init - Feature record: CXX_FEATURE:0cxx_nullptr - Feature record: CXX_FEATURE:0cxx_override - Feature record: CXX_FEATURE:0cxx_range_for - Feature record: CXX_FEATURE:0cxx_raw_string_literals - Feature record: CXX_FEATURE:0cxx_reference_qualified_functions - Feature record: CXX_FEATURE:0cxx_relaxed_constexpr - Feature record: CXX_FEATURE:0cxx_return_type_deduction - Feature record: CXX_FEATURE:0cxx_right_angle_brackets - Feature record: CXX_FEATURE:0cxx_rvalue_references - Feature record: CXX_FEATURE:0cxx_sizeof_member - Feature record: CXX_FEATURE:0cxx_static_assert - Feature record: CXX_FEATURE:0cxx_strong_enums - Feature record: CXX_FEATURE:1cxx_template_template_parameters - Feature record: CXX_FEATURE:0cxx_thread_local - Feature record: CXX_FEATURE:0cxx_trailing_return_types - Feature record: CXX_FEATURE:0cxx_unicode_literals - Feature record: CXX_FEATURE:0cxx_uniform_initialization - Feature record: CXX_FEATURE:0cxx_unrestricted_unions - Feature record: CXX_FEATURE:0cxx_user_literals - Feature record: CXX_FEATURE:0cxx_variable_templates - Feature record: CXX_FEATURE:0cxx_variadic_macros - Feature record: CXX_FEATURE:0cxx_variadic_templates diff --git a/control/src/cmake-build-debug/CMakeFiles/Makefile.cmake b/control/src/cmake-build-debug/CMakeFiles/Makefile.cmake deleted file mode 100644 index 8e6c878..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Makefile.cmake +++ /dev/null @@ -1,52 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.14 - -# The generator used is: -set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") - -# The top level Makefile was generated from the following files: -set(CMAKE_MAKEFILE_DEPENDS - "CMakeCache.txt" - "../CMakeLists.txt" - "CMakeFiles/3.14.3/CMakeCCompiler.cmake" - "CMakeFiles/3.14.3/CMakeCXXCompiler.cmake" - "CMakeFiles/3.14.3/CMakeSystem.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCInformation.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCXXInformation.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeCommonLanguageInclude.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeFindCodeBlocks.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeGenericSystem.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeInitializeConfigs.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeLanguageInformation.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeSystemSpecificInformation.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/CMakeSystemSpecificInitialize.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/Compiler/GNU-C.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/Compiler/GNU-CXX.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/Compiler/GNU.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/Internal/CMakeCheckCompilerFlag.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/Platform/Linux-GNU-C.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/Platform/Linux-GNU-CXX.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/Platform/Linux-GNU.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/Platform/Linux.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/Platform/UnixPaths.cmake" - "/home/famulus/clion-2019.1.3/bin/cmake/linux/share/cmake-3.14/Modules/ProcessorCount.cmake" - ) - -# The corresponding makefile is: -set(CMAKE_MAKEFILE_OUTPUTS - "Makefile" - "CMakeFiles/cmake.check_cache" - ) - -# Byproducts of CMake generate step: -set(CMAKE_MAKEFILE_PRODUCTS - "CMakeFiles/CMakeDirectoryInformation.cmake" - ) - -# Dependency information for all targets: -set(CMAKE_DEPEND_INFO_FILES - "CMakeFiles/src.dir/DependInfo.cmake" - ) diff --git a/control/src/cmake-build-debug/CMakeFiles/Makefile2 b/control/src/cmake-build-debug/CMakeFiles/Makefile2 deleted file mode 100644 index c49ff95..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Makefile2 +++ /dev/null @@ -1,113 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.14 - -# Default target executed when no arguments are given to make. -default_target: all - -.PHONY : default_target - -# The main recursive all target -all: - -.PHONY : all - -# The main recursive preinstall target -preinstall: - -.PHONY : preinstall - -# The main recursive clean target -clean: - -.PHONY : clean - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake - -# The command to remove a file. -RM = /home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/famulus/Dokumente/b15f/control/src - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/famulus/Dokumente/b15f/control/src/cmake-build-debug - -#============================================================================= -# Target rules for target CMakeFiles/src.dir - -# All Build rule for target. -CMakeFiles/src.dir/all: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/depend - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9,10,11,12 "Built target src" -.PHONY : CMakeFiles/src.dir/all - -# Include target in all. -all: CMakeFiles/src.dir/all - -.PHONY : all - -# Build rule for subdir invocation for target. -CMakeFiles/src.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles 12 - $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/src.dir/all - $(CMAKE_COMMAND) -E cmake_progress_start /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles 0 -.PHONY : CMakeFiles/src.dir/rule - -# Convenience name for target. -src: CMakeFiles/src.dir/rule - -.PHONY : src - -# clean rule for target. -CMakeFiles/src.dir/clean: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/clean -.PHONY : CMakeFiles/src.dir/clean - -# clean rule for target. -clean: CMakeFiles/src.dir/clean - -.PHONY : clean - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/1 b/control/src/cmake-build-debug/CMakeFiles/Progress/1 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/1 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/10 b/control/src/cmake-build-debug/CMakeFiles/Progress/10 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/10 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/11 b/control/src/cmake-build-debug/CMakeFiles/Progress/11 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/11 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/12 b/control/src/cmake-build-debug/CMakeFiles/Progress/12 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/12 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/2 b/control/src/cmake-build-debug/CMakeFiles/Progress/2 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/2 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/3 b/control/src/cmake-build-debug/CMakeFiles/Progress/3 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/3 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/4 b/control/src/cmake-build-debug/CMakeFiles/Progress/4 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/4 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/5 b/control/src/cmake-build-debug/CMakeFiles/Progress/5 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/5 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/6 b/control/src/cmake-build-debug/CMakeFiles/Progress/6 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/6 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/7 b/control/src/cmake-build-debug/CMakeFiles/Progress/7 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/7 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/8 b/control/src/cmake-build-debug/CMakeFiles/Progress/8 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/8 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/9 b/control/src/cmake-build-debug/CMakeFiles/Progress/9 deleted file mode 100644 index 7b4d68d..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/9 +++ /dev/null @@ -1 +0,0 @@ -empty \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/Progress/count.txt b/control/src/cmake-build-debug/CMakeFiles/Progress/count.txt deleted file mode 100644 index 48082f7..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/Progress/count.txt +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/control/src/cmake-build-debug/CMakeFiles/TargetDirectories.txt b/control/src/cmake-build-debug/CMakeFiles/TargetDirectories.txt deleted file mode 100644 index 4cd649b..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/TargetDirectories.txt +++ /dev/null @@ -1,3 +0,0 @@ -/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/rebuild_cache.dir -/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir -/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/edit_cache.dir diff --git a/control/src/cmake-build-debug/CMakeFiles/clion-environment.txt b/control/src/cmake-build-debug/CMakeFiles/clion-environment.txt deleted file mode 100644 index 270d93c..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/clion-environment.txt +++ /dev/null @@ -1,3 +0,0 @@ -ToolSet: 1.0 (local)Options: - -Options: \ No newline at end of file diff --git a/control/src/cmake-build-debug/CMakeFiles/clion-log.txt b/control/src/cmake-build-debug/CMakeFiles/clion-log.txt deleted file mode 100644 index ff3cb19..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/clion-log.txt +++ /dev/null @@ -1,14 +0,0 @@ -/home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" /home/famulus/Dokumente/b15f/control/src -CMake Warning (dev) in CMakeLists.txt: - No cmake_minimum_required command is present. A line of code such as - - cmake_minimum_required(VERSION 3.14) - - should be added at the top of the file. The version specified may be lower - if you wish to support older CMake versions for this project. For more - information run "cmake --help-policy CMP0000". -This warning is for project developers. Use -Wno-dev to suppress it. - --- Configuring done --- Generating done --- Build files have been written to: /home/famulus/Dokumente/b15f/control/src/cmake-build-debug diff --git a/control/src/cmake-build-debug/CMakeFiles/cmake.check_cache b/control/src/cmake-build-debug/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd73..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/control/src/cmake-build-debug/CMakeFiles/feature_tests.c b/control/src/cmake-build-debug/CMakeFiles/feature_tests.c deleted file mode 100644 index 42a2fdc..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/feature_tests.c +++ /dev/null @@ -1,38 +0,0 @@ - -const char features[] = {"\n" - "C_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 - "1" -#else - "0" -#endif - "c_function_prototypes\n" - "C_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - "1" -#else - "0" -#endif - "c_restrict\n" - "C_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L - "1" -#else - "0" -#endif - "c_static_assert\n" - "C_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - "1" -#else - "0" -#endif - "c_variadic_macros\n" - - }; - -int main(int argc, char** argv) -{ - (void)argv; - return features[argc]; -} diff --git a/control/src/cmake-build-debug/CMakeFiles/feature_tests.cxx b/control/src/cmake-build-debug/CMakeFiles/feature_tests.cxx deleted file mode 100644 index b93418c..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/feature_tests.cxx +++ /dev/null @@ -1,405 +0,0 @@ - - const char features[] = {"\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L -"1" -#else -"0" -#endif -"cxx_aggregate_default_initializers\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_alias_templates\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_alignas\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_alignof\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_attributes\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_attribute_deprecated\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_auto_type\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_binary_literals\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_constexpr\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_contextual_conversions\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_decltype\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_decltype_auto\n" -"CXX_FEATURE:" -#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_decltype_incomplete_return_types\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_default_function_template_args\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_defaulted_functions\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_defaulted_move_initializers\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_delegating_constructors\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_deleted_functions\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_digit_separators\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_enum_forward_declarations\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_explicit_conversions\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_extended_friend_declarations\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_extern_templates\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_final\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_func_identifier\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_generalized_initializers\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_generic_lambdas\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_inheriting_constructors\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_inline_namespaces\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_lambdas\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_lambda_init_captures\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_local_type_template_args\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_long_long_type\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_noexcept\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_nonstatic_member_init\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_nullptr\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_override\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_range_for\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_raw_string_literals\n" -"CXX_FEATURE:" -#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_reference_qualified_functions\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L -"1" -#else -"0" -#endif -"cxx_relaxed_constexpr\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_return_type_deduction\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_right_angle_brackets\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_rvalue_references\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_sizeof_member\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_static_assert\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_strong_enums\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus -"1" -#else -"0" -#endif -"cxx_template_template_parameters\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_thread_local\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_trailing_return_types\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_unicode_literals\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_uniform_initialization\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_unrestricted_unions\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_user_literals\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L -"1" -#else -"0" -#endif -"cxx_variable_templates\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_variadic_macros\n" -"CXX_FEATURE:" -#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) -"1" -#else -"0" -#endif -"cxx_variadic_templates\n" - -}; - -int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/control/src/cmake-build-debug/CMakeFiles/progress.marks b/control/src/cmake-build-debug/CMakeFiles/progress.marks deleted file mode 100644 index 48082f7..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/progress.marks +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/control/src/cmake-build-debug/CMakeFiles/src.dir/CXX.includecache b/control/src/cmake-build-debug/CMakeFiles/src.dir/CXX.includecache deleted file mode 100644 index be6e2a6..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/src.dir/CXX.includecache +++ /dev/null @@ -1,242 +0,0 @@ -#IncludeRegexLine: ^[ ]*[#%][ ]*(include|import)[ ]*[<"]([^">]+)([">]) - -#IncludeRegexScan: ^.*$ - -#IncludeRegexComplain: ^$ - -#IncludeRegexTransform: - -/home/famulus/Dokumente/b15f/control/src/cli.cpp -stdio.h -- -ncurses.h -- -vector -- -string -- -iostream -- -signal.h -- -sys/ioctl.h -- -unistd.h -- -signal.h -- -future -- -thread -- -chrono -- -drv/b15f.h -/home/famulus/Dokumente/b15f/control/src/drv/b15f.h -ui/ui.h -/home/famulus/Dokumente/b15f/control/src/ui/ui.h -ui/view_selection.h -/home/famulus/Dokumente/b15f/control/src/ui/view_selection.h -ui/view_info.h -/home/famulus/Dokumente/b15f/control/src/ui/view_info.h -ui/view_monitor.h -/home/famulus/Dokumente/b15f/control/src/ui/view_monitor.h -ui/view_promt.h -/home/famulus/Dokumente/b15f/control/src/ui/view_promt.h - -/home/famulus/Dokumente/b15f/control/src/drv/b15f.cpp -b15f.h -/home/famulus/Dokumente/b15f/control/src/drv/b15f.h - -/home/famulus/Dokumente/b15f/control/src/drv/b15f.h -iostream -- -bits/stdc++.h -- -string -- -fstream -- -cstdlib -- -chrono -- -cstdint -- -vector -- -unistd.h -- -fcntl.h -- -sys/ioctl.h -- -termios.h -- -usart.h -/home/famulus/Dokumente/b15f/control/src/drv/usart.h -driverexception.h -/home/famulus/Dokumente/b15f/control/src/drv/driverexception.h -timeoutexception.h -/home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - -/home/famulus/Dokumente/b15f/control/src/drv/dot.cpp -dot.h -/home/famulus/Dokumente/b15f/control/src/drv/dot.h - -/home/famulus/Dokumente/b15f/control/src/drv/dot.h -cstdint -- -stdexcept -- - -/home/famulus/Dokumente/b15f/control/src/drv/driverexception.h -exception -- - -/home/famulus/Dokumente/b15f/control/src/drv/plottyfile.cpp -plottyfile.h -/home/famulus/Dokumente/b15f/control/src/drv/plottyfile.h - -/home/famulus/Dokumente/b15f/control/src/drv/plottyfile.h -iostream -- -fstream -- -exception -- -vector -- -dot.h -/home/famulus/Dokumente/b15f/control/src/drv/dot.h - -/home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h -exception -- - -/home/famulus/Dokumente/b15f/control/src/drv/usart.cpp -usart.h -/home/famulus/Dokumente/b15f/control/src/drv/usart.h - -/home/famulus/Dokumente/b15f/control/src/drv/usart.h -iostream -- -cstdint -- -chrono -- -unistd.h -- -cstring -- -fcntl.h -- -sys/ioctl.h -- -termios.h -- -cmath -- -usartexception.h -/home/famulus/Dokumente/b15f/control/src/drv/usartexception.h -timeoutexception.h -/home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - -/home/famulus/Dokumente/b15f/control/src/drv/usartexception.h -exception -- -string -- - -/home/famulus/Dokumente/b15f/control/src/ui/ui.cpp -ui.h -/home/famulus/Dokumente/b15f/control/src/ui/ui.h -../drv/b15f.h -/home/famulus/Dokumente/b15f/control/src/drv/b15f.h - -/home/famulus/Dokumente/b15f/control/src/ui/ui.h -vector -- -view_selection.h -/home/famulus/Dokumente/b15f/control/src/ui/view_selection.h -view_info.h -/home/famulus/Dokumente/b15f/control/src/ui/view_info.h -view_monitor.h -/home/famulus/Dokumente/b15f/control/src/ui/view_monitor.h -view_promt.h -/home/famulus/Dokumente/b15f/control/src/ui/view_promt.h - -/home/famulus/Dokumente/b15f/control/src/ui/view.cpp -view.h -/home/famulus/Dokumente/b15f/control/src/ui/view.h - -/home/famulus/Dokumente/b15f/control/src/ui/view.h -iostream -- -cmath -- -vector -- -functional -- -ncurses.h -- -sys/ioctl.h -- -unistd.h -- -signal.h -- -../drv/b15f.h -/home/famulus/Dokumente/b15f/control/src/drv/b15f.h - -/home/famulus/Dokumente/b15f/control/src/ui/view_info.cpp -view_info.h -/home/famulus/Dokumente/b15f/control/src/ui/view_info.h - -/home/famulus/Dokumente/b15f/control/src/ui/view_info.h -view.h -/home/famulus/Dokumente/b15f/control/src/ui/view.h - -/home/famulus/Dokumente/b15f/control/src/ui/view_monitor.cpp -view_monitor.h -/home/famulus/Dokumente/b15f/control/src/ui/view_monitor.h - -/home/famulus/Dokumente/b15f/control/src/ui/view_monitor.h -thread -- -chrono -- -sstream -- -bitset -- -view_info.h -/home/famulus/Dokumente/b15f/control/src/ui/view_info.h -../drv/b15f.h -/home/famulus/Dokumente/b15f/control/src/drv/b15f.h - -/home/famulus/Dokumente/b15f/control/src/ui/view_promt.cpp -view_promt.h -/home/famulus/Dokumente/b15f/control/src/ui/view_promt.h - -/home/famulus/Dokumente/b15f/control/src/ui/view_promt.h -vector -- -string -- -view.h -/home/famulus/Dokumente/b15f/control/src/ui/view.h - -/home/famulus/Dokumente/b15f/control/src/ui/view_selection.cpp -view_selection.h -/home/famulus/Dokumente/b15f/control/src/ui/view_selection.h - -/home/famulus/Dokumente/b15f/control/src/ui/view_selection.h -vector -- -string -- -view.h -/home/famulus/Dokumente/b15f/control/src/ui/view.h - diff --git a/control/src/cmake-build-debug/CMakeFiles/src.dir/DependInfo.cmake b/control/src/cmake-build-debug/CMakeFiles/src.dir/DependInfo.cmake deleted file mode 100644 index d24a204..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/src.dir/DependInfo.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# The set of languages for which implicit dependencies are needed: -set(CMAKE_DEPENDS_LANGUAGES - "CXX" - ) -# The set of files for implicit dependencies of each language: -set(CMAKE_DEPENDS_CHECK_CXX - "/home/famulus/Dokumente/b15f/control/src/cli.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/cli.o" - "/home/famulus/Dokumente/b15f/control/src/drv/b15f.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/drv/b15f.o" - "/home/famulus/Dokumente/b15f/control/src/drv/dot.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/drv/dot.o" - "/home/famulus/Dokumente/b15f/control/src/drv/plottyfile.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/drv/plottyfile.o" - "/home/famulus/Dokumente/b15f/control/src/drv/usart.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/drv/usart.o" - "/home/famulus/Dokumente/b15f/control/src/ui/ui.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/ui/ui.o" - "/home/famulus/Dokumente/b15f/control/src/ui/view.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/ui/view.o" - "/home/famulus/Dokumente/b15f/control/src/ui/view_info.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/ui/view_info.o" - "/home/famulus/Dokumente/b15f/control/src/ui/view_monitor.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/ui/view_monitor.o" - "/home/famulus/Dokumente/b15f/control/src/ui/view_promt.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/ui/view_promt.o" - "/home/famulus/Dokumente/b15f/control/src/ui/view_selection.cpp" "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/ui/view_selection.o" - ) -set(CMAKE_CXX_COMPILER_ID "GNU") - -# The include file search paths: -set(CMAKE_CXX_TARGET_INCLUDE_PATH - "../." - "../drv" - "../ui" - ) - -# Targets to which this target links. -set(CMAKE_TARGET_LINKED_INFO_FILES - ) - -# Fortran module output directory. -set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/control/src/cmake-build-debug/CMakeFiles/src.dir/build.make b/control/src/cmake-build-debug/CMakeFiles/src.dir/build.make deleted file mode 100644 index 652ca96..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/src.dir/build.make +++ /dev/null @@ -1,248 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.14 - -# Delete rule output on recipe failure. -.DELETE_ON_ERROR: - - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake - -# The command to remove a file. -RM = /home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/famulus/Dokumente/b15f/control/src - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/famulus/Dokumente/b15f/control/src/cmake-build-debug - -# Include any dependencies generated for this target. -include CMakeFiles/src.dir/depend.make - -# Include the progress variables for this target. -include CMakeFiles/src.dir/progress.make - -# Include the compile flags for this target's objects. -include CMakeFiles/src.dir/flags.make - -CMakeFiles/src.dir/drv/b15f.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/drv/b15f.o: ../drv/b15f.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/src.dir/drv/b15f.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/drv/b15f.o -c /home/famulus/Dokumente/b15f/control/src/drv/b15f.cpp - -CMakeFiles/src.dir/drv/b15f.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/drv/b15f.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/drv/b15f.cpp > CMakeFiles/src.dir/drv/b15f.i - -CMakeFiles/src.dir/drv/b15f.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/drv/b15f.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/drv/b15f.cpp -o CMakeFiles/src.dir/drv/b15f.s - -CMakeFiles/src.dir/drv/dot.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/drv/dot.o: ../drv/dot.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/src.dir/drv/dot.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/drv/dot.o -c /home/famulus/Dokumente/b15f/control/src/drv/dot.cpp - -CMakeFiles/src.dir/drv/dot.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/drv/dot.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/drv/dot.cpp > CMakeFiles/src.dir/drv/dot.i - -CMakeFiles/src.dir/drv/dot.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/drv/dot.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/drv/dot.cpp -o CMakeFiles/src.dir/drv/dot.s - -CMakeFiles/src.dir/drv/plottyfile.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/drv/plottyfile.o: ../drv/plottyfile.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/src.dir/drv/plottyfile.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/drv/plottyfile.o -c /home/famulus/Dokumente/b15f/control/src/drv/plottyfile.cpp - -CMakeFiles/src.dir/drv/plottyfile.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/drv/plottyfile.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/drv/plottyfile.cpp > CMakeFiles/src.dir/drv/plottyfile.i - -CMakeFiles/src.dir/drv/plottyfile.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/drv/plottyfile.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/drv/plottyfile.cpp -o CMakeFiles/src.dir/drv/plottyfile.s - -CMakeFiles/src.dir/drv/usart.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/drv/usart.o: ../drv/usart.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/src.dir/drv/usart.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/drv/usart.o -c /home/famulus/Dokumente/b15f/control/src/drv/usart.cpp - -CMakeFiles/src.dir/drv/usart.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/drv/usart.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/drv/usart.cpp > CMakeFiles/src.dir/drv/usart.i - -CMakeFiles/src.dir/drv/usart.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/drv/usart.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/drv/usart.cpp -o CMakeFiles/src.dir/drv/usart.s - -CMakeFiles/src.dir/ui/ui.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/ui/ui.o: ../ui/ui.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object CMakeFiles/src.dir/ui/ui.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/ui/ui.o -c /home/famulus/Dokumente/b15f/control/src/ui/ui.cpp - -CMakeFiles/src.dir/ui/ui.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/ui/ui.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/ui/ui.cpp > CMakeFiles/src.dir/ui/ui.i - -CMakeFiles/src.dir/ui/ui.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/ui/ui.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/ui/ui.cpp -o CMakeFiles/src.dir/ui/ui.s - -CMakeFiles/src.dir/ui/view.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/ui/view.o: ../ui/view.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object CMakeFiles/src.dir/ui/view.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/ui/view.o -c /home/famulus/Dokumente/b15f/control/src/ui/view.cpp - -CMakeFiles/src.dir/ui/view.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/ui/view.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/ui/view.cpp > CMakeFiles/src.dir/ui/view.i - -CMakeFiles/src.dir/ui/view.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/ui/view.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/ui/view.cpp -o CMakeFiles/src.dir/ui/view.s - -CMakeFiles/src.dir/ui/view_info.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/ui/view_info.o: ../ui/view_info.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object CMakeFiles/src.dir/ui/view_info.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/ui/view_info.o -c /home/famulus/Dokumente/b15f/control/src/ui/view_info.cpp - -CMakeFiles/src.dir/ui/view_info.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/ui/view_info.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/ui/view_info.cpp > CMakeFiles/src.dir/ui/view_info.i - -CMakeFiles/src.dir/ui/view_info.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/ui/view_info.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/ui/view_info.cpp -o CMakeFiles/src.dir/ui/view_info.s - -CMakeFiles/src.dir/ui/view_monitor.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/ui/view_monitor.o: ../ui/view_monitor.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object CMakeFiles/src.dir/ui/view_monitor.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/ui/view_monitor.o -c /home/famulus/Dokumente/b15f/control/src/ui/view_monitor.cpp - -CMakeFiles/src.dir/ui/view_monitor.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/ui/view_monitor.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/ui/view_monitor.cpp > CMakeFiles/src.dir/ui/view_monitor.i - -CMakeFiles/src.dir/ui/view_monitor.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/ui/view_monitor.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/ui/view_monitor.cpp -o CMakeFiles/src.dir/ui/view_monitor.s - -CMakeFiles/src.dir/ui/view_promt.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/ui/view_promt.o: ../ui/view_promt.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building CXX object CMakeFiles/src.dir/ui/view_promt.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/ui/view_promt.o -c /home/famulus/Dokumente/b15f/control/src/ui/view_promt.cpp - -CMakeFiles/src.dir/ui/view_promt.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/ui/view_promt.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/ui/view_promt.cpp > CMakeFiles/src.dir/ui/view_promt.i - -CMakeFiles/src.dir/ui/view_promt.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/ui/view_promt.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/ui/view_promt.cpp -o CMakeFiles/src.dir/ui/view_promt.s - -CMakeFiles/src.dir/ui/view_selection.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/ui/view_selection.o: ../ui/view_selection.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object CMakeFiles/src.dir/ui/view_selection.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/ui/view_selection.o -c /home/famulus/Dokumente/b15f/control/src/ui/view_selection.cpp - -CMakeFiles/src.dir/ui/view_selection.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/ui/view_selection.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/ui/view_selection.cpp > CMakeFiles/src.dir/ui/view_selection.i - -CMakeFiles/src.dir/ui/view_selection.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/ui/view_selection.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/ui/view_selection.cpp -o CMakeFiles/src.dir/ui/view_selection.s - -CMakeFiles/src.dir/cli.o: CMakeFiles/src.dir/flags.make -CMakeFiles/src.dir/cli.o: ../cli.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building CXX object CMakeFiles/src.dir/cli.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/src.dir/cli.o -c /home/famulus/Dokumente/b15f/control/src/cli.cpp - -CMakeFiles/src.dir/cli.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/src.dir/cli.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/famulus/Dokumente/b15f/control/src/cli.cpp > CMakeFiles/src.dir/cli.i - -CMakeFiles/src.dir/cli.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/src.dir/cli.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/famulus/Dokumente/b15f/control/src/cli.cpp -o CMakeFiles/src.dir/cli.s - -# Object files for target src -src_OBJECTS = \ -"CMakeFiles/src.dir/drv/b15f.o" \ -"CMakeFiles/src.dir/drv/dot.o" \ -"CMakeFiles/src.dir/drv/plottyfile.o" \ -"CMakeFiles/src.dir/drv/usart.o" \ -"CMakeFiles/src.dir/ui/ui.o" \ -"CMakeFiles/src.dir/ui/view.o" \ -"CMakeFiles/src.dir/ui/view_info.o" \ -"CMakeFiles/src.dir/ui/view_monitor.o" \ -"CMakeFiles/src.dir/ui/view_promt.o" \ -"CMakeFiles/src.dir/ui/view_selection.o" \ -"CMakeFiles/src.dir/cli.o" - -# External object files for target src -src_EXTERNAL_OBJECTS = - -src: CMakeFiles/src.dir/drv/b15f.o -src: CMakeFiles/src.dir/drv/dot.o -src: CMakeFiles/src.dir/drv/plottyfile.o -src: CMakeFiles/src.dir/drv/usart.o -src: CMakeFiles/src.dir/ui/ui.o -src: CMakeFiles/src.dir/ui/view.o -src: CMakeFiles/src.dir/ui/view_info.o -src: CMakeFiles/src.dir/ui/view_monitor.o -src: CMakeFiles/src.dir/ui/view_promt.o -src: CMakeFiles/src.dir/ui/view_selection.o -src: CMakeFiles/src.dir/cli.o -src: CMakeFiles/src.dir/build.make -src: CMakeFiles/src.dir/link.txt - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Linking CXX executable src" - $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/src.dir/link.txt --verbose=$(VERBOSE) - -# Rule to build all files generated by this target. -CMakeFiles/src.dir/build: src - -.PHONY : CMakeFiles/src.dir/build - -CMakeFiles/src.dir/clean: - $(CMAKE_COMMAND) -P CMakeFiles/src.dir/cmake_clean.cmake -.PHONY : CMakeFiles/src.dir/clean - -CMakeFiles/src.dir/depend: - cd /home/famulus/Dokumente/b15f/control/src/cmake-build-debug && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/famulus/Dokumente/b15f/control/src /home/famulus/Dokumente/b15f/control/src /home/famulus/Dokumente/b15f/control/src/cmake-build-debug /home/famulus/Dokumente/b15f/control/src/cmake-build-debug /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/src.dir/DependInfo.cmake --color=$(COLOR) -.PHONY : CMakeFiles/src.dir/depend - diff --git a/control/src/cmake-build-debug/CMakeFiles/src.dir/cmake_clean.cmake b/control/src/cmake-build-debug/CMakeFiles/src.dir/cmake_clean.cmake deleted file mode 100644 index 9941385..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/src.dir/cmake_clean.cmake +++ /dev/null @@ -1,20 +0,0 @@ -file(REMOVE_RECURSE - "CMakeFiles/src.dir/drv/b15f.o" - "CMakeFiles/src.dir/drv/dot.o" - "CMakeFiles/src.dir/drv/plottyfile.o" - "CMakeFiles/src.dir/drv/usart.o" - "CMakeFiles/src.dir/ui/ui.o" - "CMakeFiles/src.dir/ui/view.o" - "CMakeFiles/src.dir/ui/view_info.o" - "CMakeFiles/src.dir/ui/view_monitor.o" - "CMakeFiles/src.dir/ui/view_promt.o" - "CMakeFiles/src.dir/ui/view_selection.o" - "CMakeFiles/src.dir/cli.o" - "src.pdb" - "src" -) - -# Per-language clean rules from dependency scanning. -foreach(lang CXX) - include(CMakeFiles/src.dir/cmake_clean_${lang}.cmake OPTIONAL) -endforeach() diff --git a/control/src/cmake-build-debug/CMakeFiles/src.dir/depend.internal b/control/src/cmake-build-debug/CMakeFiles/src.dir/depend.internal deleted file mode 100644 index af7685b..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/src.dir/depend.internal +++ /dev/null @@ -1,93 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.14 - -CMakeFiles/src.dir/cli.o - /home/famulus/Dokumente/b15f/control/src/cli.cpp - /home/famulus/Dokumente/b15f/control/src/drv/b15f.h - /home/famulus/Dokumente/b15f/control/src/drv/driverexception.h - /home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - /home/famulus/Dokumente/b15f/control/src/drv/usart.h - /home/famulus/Dokumente/b15f/control/src/drv/usartexception.h - /home/famulus/Dokumente/b15f/control/src/ui/ui.h - /home/famulus/Dokumente/b15f/control/src/ui/view.h - /home/famulus/Dokumente/b15f/control/src/ui/view_info.h - /home/famulus/Dokumente/b15f/control/src/ui/view_monitor.h - /home/famulus/Dokumente/b15f/control/src/ui/view_promt.h - /home/famulus/Dokumente/b15f/control/src/ui/view_selection.h -CMakeFiles/src.dir/drv/b15f.o - /home/famulus/Dokumente/b15f/control/src/drv/b15f.cpp - /home/famulus/Dokumente/b15f/control/src/drv/b15f.h - /home/famulus/Dokumente/b15f/control/src/drv/driverexception.h - /home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - /home/famulus/Dokumente/b15f/control/src/drv/usart.h - /home/famulus/Dokumente/b15f/control/src/drv/usartexception.h -CMakeFiles/src.dir/drv/dot.o - /home/famulus/Dokumente/b15f/control/src/drv/dot.cpp - /home/famulus/Dokumente/b15f/control/src/drv/dot.h -CMakeFiles/src.dir/drv/plottyfile.o - /home/famulus/Dokumente/b15f/control/src/drv/dot.h - /home/famulus/Dokumente/b15f/control/src/drv/plottyfile.cpp - /home/famulus/Dokumente/b15f/control/src/drv/plottyfile.h -CMakeFiles/src.dir/drv/usart.o - /home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - /home/famulus/Dokumente/b15f/control/src/drv/usart.cpp - /home/famulus/Dokumente/b15f/control/src/drv/usart.h - /home/famulus/Dokumente/b15f/control/src/drv/usartexception.h -CMakeFiles/src.dir/ui/ui.o - /home/famulus/Dokumente/b15f/control/src/drv/b15f.h - /home/famulus/Dokumente/b15f/control/src/drv/driverexception.h - /home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - /home/famulus/Dokumente/b15f/control/src/drv/usart.h - /home/famulus/Dokumente/b15f/control/src/drv/usartexception.h - /home/famulus/Dokumente/b15f/control/src/ui/ui.cpp - /home/famulus/Dokumente/b15f/control/src/ui/ui.h - /home/famulus/Dokumente/b15f/control/src/ui/view.h - /home/famulus/Dokumente/b15f/control/src/ui/view_info.h - /home/famulus/Dokumente/b15f/control/src/ui/view_monitor.h - /home/famulus/Dokumente/b15f/control/src/ui/view_promt.h - /home/famulus/Dokumente/b15f/control/src/ui/view_selection.h -CMakeFiles/src.dir/ui/view.o - /home/famulus/Dokumente/b15f/control/src/drv/b15f.h - /home/famulus/Dokumente/b15f/control/src/drv/driverexception.h - /home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - /home/famulus/Dokumente/b15f/control/src/drv/usart.h - /home/famulus/Dokumente/b15f/control/src/drv/usartexception.h - /home/famulus/Dokumente/b15f/control/src/ui/view.cpp - /home/famulus/Dokumente/b15f/control/src/ui/view.h -CMakeFiles/src.dir/ui/view_info.o - /home/famulus/Dokumente/b15f/control/src/drv/b15f.h - /home/famulus/Dokumente/b15f/control/src/drv/driverexception.h - /home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - /home/famulus/Dokumente/b15f/control/src/drv/usart.h - /home/famulus/Dokumente/b15f/control/src/drv/usartexception.h - /home/famulus/Dokumente/b15f/control/src/ui/view.h - /home/famulus/Dokumente/b15f/control/src/ui/view_info.cpp - /home/famulus/Dokumente/b15f/control/src/ui/view_info.h -CMakeFiles/src.dir/ui/view_monitor.o - /home/famulus/Dokumente/b15f/control/src/drv/b15f.h - /home/famulus/Dokumente/b15f/control/src/drv/driverexception.h - /home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - /home/famulus/Dokumente/b15f/control/src/drv/usart.h - /home/famulus/Dokumente/b15f/control/src/drv/usartexception.h - /home/famulus/Dokumente/b15f/control/src/ui/view.h - /home/famulus/Dokumente/b15f/control/src/ui/view_info.h - /home/famulus/Dokumente/b15f/control/src/ui/view_monitor.cpp - /home/famulus/Dokumente/b15f/control/src/ui/view_monitor.h -CMakeFiles/src.dir/ui/view_promt.o - /home/famulus/Dokumente/b15f/control/src/drv/b15f.h - /home/famulus/Dokumente/b15f/control/src/drv/driverexception.h - /home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - /home/famulus/Dokumente/b15f/control/src/drv/usart.h - /home/famulus/Dokumente/b15f/control/src/drv/usartexception.h - /home/famulus/Dokumente/b15f/control/src/ui/view.h - /home/famulus/Dokumente/b15f/control/src/ui/view_promt.cpp - /home/famulus/Dokumente/b15f/control/src/ui/view_promt.h -CMakeFiles/src.dir/ui/view_selection.o - /home/famulus/Dokumente/b15f/control/src/drv/b15f.h - /home/famulus/Dokumente/b15f/control/src/drv/driverexception.h - /home/famulus/Dokumente/b15f/control/src/drv/timeoutexception.h - /home/famulus/Dokumente/b15f/control/src/drv/usart.h - /home/famulus/Dokumente/b15f/control/src/drv/usartexception.h - /home/famulus/Dokumente/b15f/control/src/ui/view.h - /home/famulus/Dokumente/b15f/control/src/ui/view_selection.cpp - /home/famulus/Dokumente/b15f/control/src/ui/view_selection.h diff --git a/control/src/cmake-build-debug/CMakeFiles/src.dir/depend.make b/control/src/cmake-build-debug/CMakeFiles/src.dir/depend.make deleted file mode 100644 index 1ad2444..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/src.dir/depend.make +++ /dev/null @@ -1,93 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.14 - -CMakeFiles/src.dir/cli.o: ../cli.cpp -CMakeFiles/src.dir/cli.o: ../drv/b15f.h -CMakeFiles/src.dir/cli.o: ../drv/driverexception.h -CMakeFiles/src.dir/cli.o: ../drv/timeoutexception.h -CMakeFiles/src.dir/cli.o: ../drv/usart.h -CMakeFiles/src.dir/cli.o: ../drv/usartexception.h -CMakeFiles/src.dir/cli.o: ../ui/ui.h -CMakeFiles/src.dir/cli.o: ../ui/view.h -CMakeFiles/src.dir/cli.o: ../ui/view_info.h -CMakeFiles/src.dir/cli.o: ../ui/view_monitor.h -CMakeFiles/src.dir/cli.o: ../ui/view_promt.h -CMakeFiles/src.dir/cli.o: ../ui/view_selection.h - -CMakeFiles/src.dir/drv/b15f.o: ../drv/b15f.cpp -CMakeFiles/src.dir/drv/b15f.o: ../drv/b15f.h -CMakeFiles/src.dir/drv/b15f.o: ../drv/driverexception.h -CMakeFiles/src.dir/drv/b15f.o: ../drv/timeoutexception.h -CMakeFiles/src.dir/drv/b15f.o: ../drv/usart.h -CMakeFiles/src.dir/drv/b15f.o: ../drv/usartexception.h - -CMakeFiles/src.dir/drv/dot.o: ../drv/dot.cpp -CMakeFiles/src.dir/drv/dot.o: ../drv/dot.h - -CMakeFiles/src.dir/drv/plottyfile.o: ../drv/dot.h -CMakeFiles/src.dir/drv/plottyfile.o: ../drv/plottyfile.cpp -CMakeFiles/src.dir/drv/plottyfile.o: ../drv/plottyfile.h - -CMakeFiles/src.dir/drv/usart.o: ../drv/timeoutexception.h -CMakeFiles/src.dir/drv/usart.o: ../drv/usart.cpp -CMakeFiles/src.dir/drv/usart.o: ../drv/usart.h -CMakeFiles/src.dir/drv/usart.o: ../drv/usartexception.h - -CMakeFiles/src.dir/ui/ui.o: ../drv/b15f.h -CMakeFiles/src.dir/ui/ui.o: ../drv/driverexception.h -CMakeFiles/src.dir/ui/ui.o: ../drv/timeoutexception.h -CMakeFiles/src.dir/ui/ui.o: ../drv/usart.h -CMakeFiles/src.dir/ui/ui.o: ../drv/usartexception.h -CMakeFiles/src.dir/ui/ui.o: ../ui/ui.cpp -CMakeFiles/src.dir/ui/ui.o: ../ui/ui.h -CMakeFiles/src.dir/ui/ui.o: ../ui/view.h -CMakeFiles/src.dir/ui/ui.o: ../ui/view_info.h -CMakeFiles/src.dir/ui/ui.o: ../ui/view_monitor.h -CMakeFiles/src.dir/ui/ui.o: ../ui/view_promt.h -CMakeFiles/src.dir/ui/ui.o: ../ui/view_selection.h - -CMakeFiles/src.dir/ui/view.o: ../drv/b15f.h -CMakeFiles/src.dir/ui/view.o: ../drv/driverexception.h -CMakeFiles/src.dir/ui/view.o: ../drv/timeoutexception.h -CMakeFiles/src.dir/ui/view.o: ../drv/usart.h -CMakeFiles/src.dir/ui/view.o: ../drv/usartexception.h -CMakeFiles/src.dir/ui/view.o: ../ui/view.cpp -CMakeFiles/src.dir/ui/view.o: ../ui/view.h - -CMakeFiles/src.dir/ui/view_info.o: ../drv/b15f.h -CMakeFiles/src.dir/ui/view_info.o: ../drv/driverexception.h -CMakeFiles/src.dir/ui/view_info.o: ../drv/timeoutexception.h -CMakeFiles/src.dir/ui/view_info.o: ../drv/usart.h -CMakeFiles/src.dir/ui/view_info.o: ../drv/usartexception.h -CMakeFiles/src.dir/ui/view_info.o: ../ui/view.h -CMakeFiles/src.dir/ui/view_info.o: ../ui/view_info.cpp -CMakeFiles/src.dir/ui/view_info.o: ../ui/view_info.h - -CMakeFiles/src.dir/ui/view_monitor.o: ../drv/b15f.h -CMakeFiles/src.dir/ui/view_monitor.o: ../drv/driverexception.h -CMakeFiles/src.dir/ui/view_monitor.o: ../drv/timeoutexception.h -CMakeFiles/src.dir/ui/view_monitor.o: ../drv/usart.h -CMakeFiles/src.dir/ui/view_monitor.o: ../drv/usartexception.h -CMakeFiles/src.dir/ui/view_monitor.o: ../ui/view.h -CMakeFiles/src.dir/ui/view_monitor.o: ../ui/view_info.h -CMakeFiles/src.dir/ui/view_monitor.o: ../ui/view_monitor.cpp -CMakeFiles/src.dir/ui/view_monitor.o: ../ui/view_monitor.h - -CMakeFiles/src.dir/ui/view_promt.o: ../drv/b15f.h -CMakeFiles/src.dir/ui/view_promt.o: ../drv/driverexception.h -CMakeFiles/src.dir/ui/view_promt.o: ../drv/timeoutexception.h -CMakeFiles/src.dir/ui/view_promt.o: ../drv/usart.h -CMakeFiles/src.dir/ui/view_promt.o: ../drv/usartexception.h -CMakeFiles/src.dir/ui/view_promt.o: ../ui/view.h -CMakeFiles/src.dir/ui/view_promt.o: ../ui/view_promt.cpp -CMakeFiles/src.dir/ui/view_promt.o: ../ui/view_promt.h - -CMakeFiles/src.dir/ui/view_selection.o: ../drv/b15f.h -CMakeFiles/src.dir/ui/view_selection.o: ../drv/driverexception.h -CMakeFiles/src.dir/ui/view_selection.o: ../drv/timeoutexception.h -CMakeFiles/src.dir/ui/view_selection.o: ../drv/usart.h -CMakeFiles/src.dir/ui/view_selection.o: ../drv/usartexception.h -CMakeFiles/src.dir/ui/view_selection.o: ../ui/view.h -CMakeFiles/src.dir/ui/view_selection.o: ../ui/view_selection.cpp -CMakeFiles/src.dir/ui/view_selection.o: ../ui/view_selection.h - diff --git a/control/src/cmake-build-debug/CMakeFiles/src.dir/flags.make b/control/src/cmake-build-debug/CMakeFiles/src.dir/flags.make deleted file mode 100644 index 17265b2..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/src.dir/flags.make +++ /dev/null @@ -1,10 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.14 - -# compile CXX with /usr/bin/c++ -CXX_FLAGS = -g -std=gnu++14 - -CXX_DEFINES = - -CXX_INCLUDES = -I/home/famulus/Dokumente/b15f/control/src/. -I/home/famulus/Dokumente/b15f/control/src/drv -I/home/famulus/Dokumente/b15f/control/src/ui - diff --git a/control/src/cmake-build-debug/CMakeFiles/src.dir/link.txt b/control/src/cmake-build-debug/CMakeFiles/src.dir/link.txt deleted file mode 100644 index a85ca46..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/src.dir/link.txt +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/c++ -g -rdynamic CMakeFiles/src.dir/drv/b15f.o CMakeFiles/src.dir/drv/dot.o CMakeFiles/src.dir/drv/plottyfile.o CMakeFiles/src.dir/drv/usart.o CMakeFiles/src.dir/ui/ui.o CMakeFiles/src.dir/ui/view.o CMakeFiles/src.dir/ui/view_info.o CMakeFiles/src.dir/ui/view_monitor.o CMakeFiles/src.dir/ui/view_promt.o CMakeFiles/src.dir/ui/view_selection.o CMakeFiles/src.dir/cli.o -o src diff --git a/control/src/cmake-build-debug/CMakeFiles/src.dir/progress.make b/control/src/cmake-build-debug/CMakeFiles/src.dir/progress.make deleted file mode 100644 index 5d4d464..0000000 --- a/control/src/cmake-build-debug/CMakeFiles/src.dir/progress.make +++ /dev/null @@ -1,13 +0,0 @@ -CMAKE_PROGRESS_1 = 1 -CMAKE_PROGRESS_2 = 2 -CMAKE_PROGRESS_3 = 3 -CMAKE_PROGRESS_4 = 4 -CMAKE_PROGRESS_5 = 5 -CMAKE_PROGRESS_6 = 6 -CMAKE_PROGRESS_7 = 7 -CMAKE_PROGRESS_8 = 8 -CMAKE_PROGRESS_9 = 9 -CMAKE_PROGRESS_10 = 10 -CMAKE_PROGRESS_11 = 11 -CMAKE_PROGRESS_12 = 12 - diff --git a/control/src/cmake-build-debug/Makefile b/control/src/cmake-build-debug/Makefile deleted file mode 100644 index 5490e84..0000000 --- a/control/src/cmake-build-debug/Makefile +++ /dev/null @@ -1,346 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.14 - -# Default target executed when no arguments are given to make. -default_target: all - -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake - -# The command to remove a file. -RM = /home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/famulus/Dokumente/b15f/control/src - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/famulus/Dokumente/b15f/control/src/cmake-build-debug - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache - -.PHONY : rebuild_cache/fast - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." - /home/famulus/clion-2019.1.3/bin/cmake/linux/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache - -.PHONY : edit_cache/fast - -# The main all target -all: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles/progress.marks - $(MAKE) -f CMakeFiles/Makefile2 all - $(CMAKE_COMMAND) -E cmake_progress_start /home/famulus/Dokumente/b15f/control/src/cmake-build-debug/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - $(MAKE) -f CMakeFiles/Makefile2 clean -.PHONY : clean - -# The main clean target -clean/fast: clean - -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - $(MAKE) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - $(MAKE) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -#============================================================================= -# Target rules for targets named src - -# Build rule for target. -src: cmake_check_build_system - $(MAKE) -f CMakeFiles/Makefile2 src -.PHONY : src - -# fast build rule for target. -src/fast: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/build -.PHONY : src/fast - -# target to build an object file -cli.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/cli.o -.PHONY : cli.o - -# target to preprocess a source file -cli.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/cli.i -.PHONY : cli.i - -# target to generate assembly for a file -cli.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/cli.s -.PHONY : cli.s - -# target to build an object file -drv/b15f.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/b15f.o -.PHONY : drv/b15f.o - -# target to preprocess a source file -drv/b15f.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/b15f.i -.PHONY : drv/b15f.i - -# target to generate assembly for a file -drv/b15f.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/b15f.s -.PHONY : drv/b15f.s - -# target to build an object file -drv/dot.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/dot.o -.PHONY : drv/dot.o - -# target to preprocess a source file -drv/dot.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/dot.i -.PHONY : drv/dot.i - -# target to generate assembly for a file -drv/dot.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/dot.s -.PHONY : drv/dot.s - -# target to build an object file -drv/plottyfile.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/plottyfile.o -.PHONY : drv/plottyfile.o - -# target to preprocess a source file -drv/plottyfile.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/plottyfile.i -.PHONY : drv/plottyfile.i - -# target to generate assembly for a file -drv/plottyfile.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/plottyfile.s -.PHONY : drv/plottyfile.s - -# target to build an object file -drv/usart.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/usart.o -.PHONY : drv/usart.o - -# target to preprocess a source file -drv/usart.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/usart.i -.PHONY : drv/usart.i - -# target to generate assembly for a file -drv/usart.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/drv/usart.s -.PHONY : drv/usart.s - -# target to build an object file -ui/ui.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/ui.o -.PHONY : ui/ui.o - -# target to preprocess a source file -ui/ui.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/ui.i -.PHONY : ui/ui.i - -# target to generate assembly for a file -ui/ui.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/ui.s -.PHONY : ui/ui.s - -# target to build an object file -ui/view.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view.o -.PHONY : ui/view.o - -# target to preprocess a source file -ui/view.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view.i -.PHONY : ui/view.i - -# target to generate assembly for a file -ui/view.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view.s -.PHONY : ui/view.s - -# target to build an object file -ui/view_info.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_info.o -.PHONY : ui/view_info.o - -# target to preprocess a source file -ui/view_info.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_info.i -.PHONY : ui/view_info.i - -# target to generate assembly for a file -ui/view_info.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_info.s -.PHONY : ui/view_info.s - -# target to build an object file -ui/view_monitor.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_monitor.o -.PHONY : ui/view_monitor.o - -# target to preprocess a source file -ui/view_monitor.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_monitor.i -.PHONY : ui/view_monitor.i - -# target to generate assembly for a file -ui/view_monitor.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_monitor.s -.PHONY : ui/view_monitor.s - -# target to build an object file -ui/view_promt.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_promt.o -.PHONY : ui/view_promt.o - -# target to preprocess a source file -ui/view_promt.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_promt.i -.PHONY : ui/view_promt.i - -# target to generate assembly for a file -ui/view_promt.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_promt.s -.PHONY : ui/view_promt.s - -# target to build an object file -ui/view_selection.o: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_selection.o -.PHONY : ui/view_selection.o - -# target to preprocess a source file -ui/view_selection.i: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_selection.i -.PHONY : ui/view_selection.i - -# target to generate assembly for a file -ui/view_selection.s: - $(MAKE) -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/ui/view_selection.s -.PHONY : ui/view_selection.s - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... rebuild_cache" - @echo "... src" - @echo "... edit_cache" - @echo "... cli.o" - @echo "... cli.i" - @echo "... cli.s" - @echo "... drv/b15f.o" - @echo "... drv/b15f.i" - @echo "... drv/b15f.s" - @echo "... drv/dot.o" - @echo "... drv/dot.i" - @echo "... drv/dot.s" - @echo "... drv/plottyfile.o" - @echo "... drv/plottyfile.i" - @echo "... drv/plottyfile.s" - @echo "... drv/usart.o" - @echo "... drv/usart.i" - @echo "... drv/usart.s" - @echo "... ui/ui.o" - @echo "... ui/ui.i" - @echo "... ui/ui.s" - @echo "... ui/view.o" - @echo "... ui/view.i" - @echo "... ui/view.s" - @echo "... ui/view_info.o" - @echo "... ui/view_info.i" - @echo "... ui/view_info.s" - @echo "... ui/view_monitor.o" - @echo "... ui/view_monitor.i" - @echo "... ui/view_monitor.s" - @echo "... ui/view_promt.o" - @echo "... ui/view_promt.i" - @echo "... ui/view_promt.s" - @echo "... ui/view_selection.o" - @echo "... ui/view_selection.i" - @echo "... ui/view_selection.s" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/control/src/cmake-build-debug/cmake_install.cmake b/control/src/cmake-build-debug/cmake_install.cmake deleted file mode 100644 index 8fc89c7..0000000 --- a/control/src/cmake-build-debug/cmake_install.cmake +++ /dev/null @@ -1,49 +0,0 @@ -# Install script for directory: /home/famulus/Dokumente/b15f/control/src - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "/usr/local") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "Debug") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Install shared libraries without execute permission? -if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) - set(CMAKE_INSTALL_SO_NO_EXE "1") -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "FALSE") -endif() - -if(CMAKE_INSTALL_COMPONENT) - set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -else() - set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -endif() - -string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT - "${CMAKE_INSTALL_MANIFEST_FILES}") -file(WRITE "/home/famulus/Dokumente/b15f/control/src/cmake-build-debug/${CMAKE_INSTALL_MANIFEST}" - "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/control/src/cmake-build-debug/src.cbp b/control/src/cmake-build-debug/src.cbp deleted file mode 100644 index d725f3b..0000000 --- a/control/src/cmake-build-debug/src.cbp +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - From b1fe7bf22d0b2f69830afce83b6adb3c1b0eb9d3 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 7 Jun 2019 14:17:26 +0200 Subject: [PATCH 34/35] removed cmake --- .gitignore | 1 + control/src/CMakeLists.txt | 34 ---------------------------------- 2 files changed, 1 insertion(+), 34 deletions(-) delete mode 100644 control/src/CMakeLists.txt diff --git a/.gitignore b/.gitignore index ca18911..2a125ca 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ control/src/.idea control/src/cmake-build-debug control/.Makefile.swp +control/src/CMakeLists.txt # Prerequisites *.d diff --git a/control/src/CMakeLists.txt b/control/src/CMakeLists.txt deleted file mode 100644 index 217fe3b..0000000 --- a/control/src/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -# cmake_minimum_required(VERSION ) -project(src) - -set(CMAKE_CXX_STANDARD 14) - -include_directories(.) -include_directories(drv) -include_directories(ui) - -add_executable(src - drv/b15f.cpp - drv/b15f.h - drv/dot.cpp - drv/dot.h - drv/driverexception.h - drv/plottyfile.cpp - drv/plottyfile.h - drv/timeoutexception.h - drv/usart.cpp - drv/usart.h - drv/usartexception.h - ui/ui.cpp - ui/ui.h - ui/view.cpp - ui/view.h - ui/view_info.cpp - ui/view_info.h - ui/view_monitor.cpp - ui/view_monitor.h - ui/view_promt.cpp - ui/view_promt.h - ui/view_selection.cpp - ui/view_selection.h - cli.cpp) From 39e54cb0fbfd2cc7d1dbc8f798b637a13cd6f7e0 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 7 Jun 2019 14:18:20 +0200 Subject: [PATCH 35/35] removed usart backup file --- control/src/drv/backup.cpp | 52 -------------------------------------- 1 file changed, 52 deletions(-) delete mode 100644 control/src/drv/backup.cpp diff --git a/control/src/drv/backup.cpp b/control/src/drv/backup.cpp deleted file mode 100644 index 51c6f06..0000000 --- a/control/src/drv/backup.cpp +++ /dev/null @@ -1,52 +0,0 @@ - -void USART::writeByte(uint8_t b) -{ - int sent = write(file_desc, &b, 1); - if (sent != 1) - { - std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl; - usleep(100000); - sent = write(file_desc, &b, 1); - if (sent != 1) - throw USARTException("Fehler beim Senden: writeByte()"); - } - -} - -void USART::writeInt(uint16_t d) -{ - int sent = write(file_desc, reinterpret_cast(&d), 2); - if (sent != 2) - throw USARTException("Fehler beim Senden: writeInt()"); -} - -void USART::writeU32(uint32_t w) -{ - int sent = write(file_desc, reinterpret_cast(&w), 4); - if (sent != 4) - throw USARTException("Fehler beim Senden: writeU32()"); -} - -uint8_t USART::readByte(void) -{ - char b; - auto start = std::chrono::steady_clock::now(); - auto end = start; - uint16_t elapsed = 0; - while (elapsed < timeout * 100) - { - int code = read(file_desc, &b, 1); - if (code > 0) - return static_cast(b); - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - - throw TimeoutException("Verbindung unterbrochen.", timeout); -} - -uint16_t USART::readInt(void) -{ - return readByte() | readByte() << 8; -}