From bff5ff42e9495ca44e2c07925949688299e833df Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Thu, 6 Jun 2019 12:10:17 +0200 Subject: [PATCH] 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() {