From 17416f357ce5b7ae695ca646b7f1f7d5c9c25b99 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 29 Mar 2019 11:38:11 +0100 Subject: [PATCH] es kompiliert --- drv/b15f.cpp | 225 ++++++++++---------------------------------------- drv/b15f.h | 27 +----- drv/b15f.o | Bin 46008 -> 30536 bytes drv/usart.cpp | 127 ++++++++++++++++++++++++++-- drv/usart.h | 21 ++++- drv/usart.o | Bin 11208 -> 18048 bytes main | Bin 60672 -> 56144 bytes main.cpp | 5 +- main.o | Bin 14096 -> 14016 bytes 9 files changed, 189 insertions(+), 216 deletions(-) diff --git a/drv/b15f.cpp b/drv/b15f.cpp index c58b4eb..edc8c1c 100644 --- a/drv/b15f.cpp +++ b/drv/b15f.cpp @@ -11,24 +11,7 @@ void B15F::init() { std::cout << PRE << "Stelle Verbindung mit Adapter her... " << std::flush; - int code = system(std::string("stty " + std::to_string(BAUDRATE) + " -F " + SERIAL_DEVICE).c_str()); - if(code) - { - throw DriverException("Konnte serielle Verbindung nicht initialisieren. Ist der Adapter angeschlossen?"); - } - - usart = open(SERIAL_DEVICE.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); - struct termios options; - tcgetattr(usart, &options); - options.c_cflag = CS8 | CLOCAL | CREAD; - options.c_iflag = IGNPAR; - options.c_oflag = 0; - options.c_lflag = 0; - options.c_cc[VTIME]=100; // timeout in Dezisekunden - cfsetspeed(&options, BAUDRATE); - tcsetattr(usart, TCSANOW, &options); - tcflush(usart, TCIOFLUSH); // leere Puffer in beiden Richtungen - + usart.openDevice(SERIAL_DEVICE); std::cout << "OK" << std::endl; delay_ms(1); @@ -82,13 +65,13 @@ void B15F::reconnect() void B15F::discard(void) { - tcflush(usart, TCOFLUSH); // leere Ausgangspuffer + usart.clearOutputBuffer(); for(uint8_t i = 0; i < 8; i++) { - writeByte(RQ_DISC); // sende discard Befehl (verwerfe input) + usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input) delay_ms((16000 / BAUDRATE) + 1); // warte mindestens eine Millisekunde, gegebenenfalls mehr } - tcflush(usart, TCIFLUSH); // leere Eingangspuffer + usart.clearInputBuffer(); } bool B15F::testConnection() @@ -97,11 +80,11 @@ bool B15F::testConnection() srand(time(NULL)); uint8_t dummy = rand() % 256; - writeByte(RQ_TEST); - writeByte(dummy); + usart.writeByte(RQ_TEST); + usart.writeByte(dummy); - uint8_t aw = readByte(); - uint8_t mirror = readByte(); + uint8_t aw = usart.readByte(); + uint8_t mirror = usart.readByte(); return aw == MSG_OK && mirror == dummy; } @@ -111,10 +94,10 @@ bool B15F::testIntConv() srand(time(NULL)); uint16_t dummy = rand() % (0xFFFF / 3); - writeByte(RQ_INT); - writeInt(dummy); + usart.writeByte(RQ_INT); + usart.writeInt(dummy); - uint16_t aw = readInt(); + uint16_t aw = usart.readInt(); return aw == dummy * 3; } @@ -125,20 +108,20 @@ std::vector B15F::getBoardInfo(void) { std::vector info; - writeByte(RQ_INFO); - uint8_t n = readByte(); + usart.writeByte(RQ_INFO); + uint8_t n = usart.readByte(); while(n--) { - uint8_t len = readByte(); + uint8_t len = usart.readByte(); std::string str; while(len--) - str += static_cast(readByte()); + str += static_cast(usart.readByte()); info.push_back(str); } - uint8_t aw = readByte(); + uint8_t aw = usart.readByte(); if(aw != MSG_OK) throw DriverException("Board Info fehlerhalft"); @@ -156,10 +139,10 @@ bool B15F::digitalWrite0(uint8_t port) { try { - writeByte(RQ_BA0); - writeByte(port); + usart.writeByte(RQ_BA0); + usart.writeByte(port); - uint8_t aw = readByte(); + uint8_t aw = usart.readByte(); return aw == MSG_OK; } catch(DriverException& de) @@ -173,10 +156,10 @@ bool B15F::digitalWrite1(uint8_t port) { try { - writeByte(RQ_BA1); - writeByte(port); + usart.writeByte(RQ_BA1); + usart.writeByte(port); - uint8_t aw = readByte(); + uint8_t aw = usart.readByte(); return aw == MSG_OK; } catch(DriverException& de) @@ -190,8 +173,8 @@ uint8_t B15F::digitalRead0() { try { - writeByte(RQ_BE0); - return readByte(); + usart.writeByte(RQ_BE0); + return usart.readByte(); } catch(DriverException& de) { @@ -204,8 +187,8 @@ uint8_t B15F::digitalRead1() { try { - writeByte(RQ_BE1); - return readByte(); + usart.writeByte(RQ_BE1); + return usart.readByte(); } catch(DriverException& de) { @@ -218,12 +201,12 @@ bool B15F::analogWrite0(uint16_t value) { try { - writeByte(RQ_AA0); + usart.writeByte(RQ_AA0); delay_ms(1); - writeInt(value); + usart.writeInt(value); delay_ms(1); - uint8_t aw = readByte(); + uint8_t aw = usart.readByte(); return aw == MSG_OK; } catch(DriverException& de) @@ -237,10 +220,10 @@ bool B15F::analogWrite1(uint16_t value) { try { - writeByte(RQ_AA1); - writeInt(value); + usart.writeByte(RQ_AA1); + usart.writeInt(value); - uint8_t aw = readByte(); + uint8_t aw = usart.readByte(); return aw == MSG_OK; } catch(DriverException& de) @@ -254,10 +237,10 @@ uint16_t B15F::analogRead(uint8_t channel) { try { - writeByte(RQ_ADC); + usart.writeByte(RQ_ADC); delay_ms(1); - writeByte(channel); - return readInt(); + usart.writeByte(channel); + return usart.readInt(); } catch(DriverException& de) { @@ -273,13 +256,13 @@ bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset try { - writeByte(RQ_ADC_DAC_STROKE); - writeByte(channel_a); - writeByte(channel_b); - writeInt(start); - writeInt(static_cast(delta)); - writeInt(count); - uint8_t aw = readByte(); + 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 aw = usart.readByte(); if(aw != MSG_OK) { @@ -290,7 +273,7 @@ bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset uint8_t block[5]; // 4 Datenbyte + crc for(uint16_t i = 0; i < count; i++) { - bool crc_ok = readBlock(&block[0], 0); + bool crc_ok = usart.readBlock(&block[0], 0); if (!crc_ok) { @@ -303,7 +286,7 @@ bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset buffer_b[offset_b + i] = ((uint16_t) block[2]) | (((uint16_t) block[3]) << 8); } - aw = readByte(); + aw = usart.readByte(); if(aw == MSG_OK) return aw; @@ -317,126 +300,6 @@ bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset } } - -void B15F::writeByte(uint8_t b) -{ - if(write(usart, &b, 1) != 1) - throw DriverException("Fehler beim Senden. (byte)"); -} - -void B15F::writeInt(uint16_t v) -{ - if(write(usart, reinterpret_cast(&v), 2) != 2) - throw DriverException("Fehler beim Senden. (int)"); -} - -uint8_t B15F::readByte() -{ - char b; - auto start = std::chrono::steady_clock::now(); - auto end = start; - uint16_t elapsed = 0; - while(elapsed < timeout) - { - int n_ready; - int code = ioctl(usart, FIONREAD, &n_ready); - if(code != 0) - std::cout << PRE << "n_ready code: " << code << std::endl; - - if(n_ready > 0) - { - //std::cout << code << " \tready: " << n_ready << std::endl; - - code = read(usart, &b, 1); - if (code > 0) - return static_cast(b); - if (code < 0) - std::cout << PRE << "usart code: " << code << std::endl; - } - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - - if(elapsed >= timeout) - throw DriverException("Verbindung unterbrochen. (timeout)"); -} - -uint16_t B15F::readInt() -{ - return readByte() | readByte() << 8; -} - -bool B15F::readBlock(uint8_t* buffer, uint16_t offset) -{ - uint8_t len = readByte(); - uint8_t crc = 0; - buffer += offset; - - // wait for block - int n_ready; - uint16_t elapsed = 0; - auto start = std::chrono::steady_clock::now(); - auto end = start; - while(elapsed < block_timeout) - { - int code = ioctl(usart, FIONREAD, &n_ready); - if(code != 0) - { - std::cout << PRE << "n_ready code: " << code << std::endl; - return false; - } - - if(n_ready >= len + 1) - break; - - end = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(end - start).count(); - } - if(elapsed >= timeout) - { - std::cout << PRE << "block timeout: " << std::endl; - return false; - } - - while(len--) - { - *buffer = readByte(); - - crc ^= *buffer++; - for (uint8_t i = 0; i < 8; i++) - { - if (crc & 1) - crc ^= CRC7_POLY; - crc >>= 1; - } - } - - crc ^= readByte(); - for (uint8_t i = 0; i < 8; i++) - { - if (crc & 1) - crc ^= CRC7_POLY; - crc >>= 1; - } - - if(TEST == 1) - crc = 1; - if(TEST > 100) - TEST = 0; - - if (crc == 0) - { - writeByte(MSG_OK); - return true; - } - else - { - writeByte(MSG_FAIL); - return false; - } -} - void B15F::delay_ms(uint16_t ms) { std::this_thread::sleep_for(std::chrono::milliseconds(ms)); diff --git a/drv/b15f.h b/drv/b15f.h index 4d48b21..132c4c8 100644 --- a/drv/b15f.h +++ b/drv/b15f.h @@ -14,6 +14,7 @@ #include #include #include +#include "usart.h" #include "driverexception.h" #include "timeoutexception.h" @@ -59,35 +60,12 @@ public: static B15F& getInstance(void); private: - int usart = -1; uint16_t timeout = 1000; // ms uint16_t block_timeout = 1; // ms - int TEST = 0; + USART usart; static B15F* instance; - - /*********************************************** - * Grundfunktionen für die serielle Verbindung * - ***********************************************/ - - /** - * Übergibt ein Byte an die USART Schnittstelle - */ - void writeByte(uint8_t); - - /** - * Übergibt ein Integer an die USART Schnittstelle - */ - void writeInt(uint16_t); - - /** - * Übergibt ein Integer an die USART Schnittstelle - * \throws TimeoutException - */ - uint8_t readByte(void); - uint16_t readInt(void); - bool readBlock(uint8_t* buffer, uint16_t offset); // CONSTANTS @@ -98,7 +76,6 @@ private: constexpr static uint16_t RECONNECT_TIMEOUT = 64; // ms constexpr static uint8_t RECONNECT_TRIES = 3; constexpr static uint32_t BAUDRATE = 115200; - constexpr static uint8_t CRC7_POLY = 0x91; // REQUESTS constexpr static uint8_t RQ_DISC = 0; diff --git a/drv/b15f.o b/drv/b15f.o index 47f3a9cba8df9f3a78f6c763f9af42dfa4a2ef38..5b6d8ec456d0f3d463bf38255b0a0c7364ae5b60 100644 GIT binary patch literal 30536 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 E4eZV@H~;_u diff --git a/drv/usart.cpp b/drv/usart.cpp index 554c598..5760d8e 100644 --- a/drv/usart.cpp +++ b/drv/usart.cpp @@ -1,10 +1,6 @@ #include "usart.h" -USART::USART(std::string device) : device(device) -{ -} - -void USART::openDevice() +void USART::openDevice(std::string device) { file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); if(file_desc <= 0) @@ -53,6 +49,127 @@ void USART::clearOutputBuffer() throw USARTException("Fehler beim Leeren des Ausgangspuffers"); } +void USART::writeByte(uint8_t b) +{ + if(write(file_desc, &b, 1) != 1) + throw USARTException("Fehler beim Senden: writeByte()"); +} + +void USART::writeInt(uint16_t d) +{ + if(write(file_desc, reinterpret_cast(&d), 2) != 2) + throw USARTException("Fehler beim Senden: writeInt()"); +} + +uint8_t USART::readByte(void) +{ + char b; + auto start = std::chrono::steady_clock::now(); + auto end = start; + uint16_t elapsed = 0; + while(elapsed < timeout) + { + int n_ready; + int code = ioctl(file_desc, FIONREAD, &n_ready); + if(code != 0) + std::cout << "n_ready code: " << code << std::endl; + + if(n_ready > 0) + { + //std::cout << code << " \tready: " << n_ready << std::endl; + + code = read(file_desc, &b, 1); + if (code > 0) + return static_cast(b); + if (code < 0) + std::cout << "usart code: " << code << std::endl; + } + + end = std::chrono::steady_clock::now(); + elapsed = std::chrono::duration_cast(end - start).count(); + } + + if(elapsed >= timeout) + throw USARTException("Verbindung unterbrochen. (timeout)"); +} + +uint16_t USART::readInt(void) +{ + return readByte() | readByte() << 8; +} + +bool USART::readBlock(uint8_t* buffer, uint16_t offset) +{ + uint8_t len = readByte(); + uint8_t crc = 0; + buffer += offset; + + uint32_t block_timeout = timeout / 10; + + // wait for block + int n_ready; + uint16_t elapsed = 0; + auto start = std::chrono::steady_clock::now(); + auto end = start; + while(elapsed < block_timeout) + { + int code = ioctl(file_desc, FIONREAD, &n_ready); + if(code != 0) + { + std::cout << "n_ready code: " << code << std::endl; + return false; + } + + if(n_ready >= len + 1) + break; + + end = std::chrono::steady_clock::now(); + elapsed = std::chrono::duration_cast(end - start).count(); + } + if(elapsed >= timeout) + { + std::cout << "block timeout: " << std::endl; + return false; + } + + while(len--) + { + *buffer = readByte(); + + crc ^= *buffer++; + for (uint8_t i = 0; i < 8; i++) + { + if (crc & 1) + crc ^= CRC7_POLY; + crc >>= 1; + } + } + + crc ^= readByte(); + for (uint8_t i = 0; i < 8; i++) + { + if (crc & 1) + crc ^= CRC7_POLY; + crc >>= 1; + } + + if(TEST == 1) + crc = 1; + if(TEST > 100) + TEST = 0; + + if (crc == 0) + { + writeByte(0xFF); + return true; + } + else + { + writeByte(0xFE); + return false; + } +} + uint32_t USART::getBaudrate() { return baudrate; diff --git a/drv/usart.h b/drv/usart.h index 7d17d20..a23cab1 100644 --- a/drv/usart.h +++ b/drv/usart.h @@ -1,7 +1,9 @@ #ifndef USART_H #define USART_H +#include #include +#include #include #include #include @@ -11,7 +13,6 @@ class USART { public: - USART(std::string device); /************************************************* * Methoden für die Verwaltung der Schnittstelle * @@ -19,9 +20,10 @@ public: /** * Öffnet die USART Schnittstelle + * \param device Linux-Gerätepfad * \throws USARTException */ - void openDevice(void); + void openDevice(std::string device); /** * Schließt die USART Schnittstelle @@ -56,6 +58,17 @@ public: */ void writeByte(uint8_t b); + /** + * Sendet ein Integer über die USART Schnittstelle + * \param b das zu sendende Byte + * \throws USARTException + */ + void writeInt(uint16_t d); + + uint8_t readByte(void); + uint16_t readInt(void); + bool readBlock(uint8_t* buffer, uint16_t offset); + /*************************************/ @@ -92,10 +105,12 @@ public: private: - std::string device; // Gerätepfad int file_desc = -1; // Linux Dateideskriptor uint32_t baudrate = 9600; + int TEST = 0; uint8_t timeout = 10; // in Dezisekunden + + constexpr static uint8_t CRC7_POLY = 0x91; }; diff --git a/drv/usart.o b/drv/usart.o index 3039e2749303dcf076cc5859c77541dbc71808ec..da366a5b4e87655ebe7a9e6dfc6740e9bdca4275 100644 GIT binary patch literal 18048 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 literal 11208 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 diff --git a/main b/main index da5b077944287e744153307d125209d98f62402d..36cd534f1037a31ed1f784a7eeb5534546505d57 100755 GIT binary patch literal 56144 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 VjNU1VR=@FePVt+F3K3c9{{e%xqQC$E literal 60672 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 diff --git a/main.cpp b/main.cpp index 6f27b98..5293528 100644 --- a/main.cpp +++ b/main.cpp @@ -182,8 +182,9 @@ void beispielFunktionen() int main() { - USART usart("/dev/ttyUSB0"); - usart.openDevice(); + USART usart; + usart.openDevice("/dev/ttyUSB0"); + usart.closeDevice(); diff --git a/main.o b/main.o index 551fea66ebaf80c1bcaf47a9accb4654e132b981..e53cb553d9e9972519664b23e89cd127f563f894 100644 GIT binary patch delta 768 zcmZ9IO=uHA6vt=Qrlv8Zn`CL)6iiySnrOb(eAOQEp@9w}qQrurqLPHR(od2W1i?Z; zT|zPSfrwtJ7Ztpe1*x7Q)fPO6c+yMjL7|aA+p84x&6XVMAO17L|M%X!-KkF0#;YDm zmb~lY9n+ZMGbQ(EfsmPN!^HtN$>v7JW{SlC*{`82dmGFbW`m{DEmm$YHh)DHnfi;V zXJvPuRa*Ky*ud0`+^^Kw@?X?k9}m`N!6_K6XC>i!5bqk(Yy(yefxhVJNSyQmH!&m zkNbLc+U`mbEo7@w+JN_Vsr|a}#$@SCTg0@*m_9_bpLU4~+eG^#%^I*|+UcU_V8Q92 z!}|JMU*GBLSJ=UPgP%2bx4G4Z%n8=EW^pxEY%+M<`AQ(M|e^hbW#$ z(arpaK6ewk{4Ot_$9a?O;+czQ4BgBRz=Ge=WulzzedQV4o74(7{0{1b@BX878+H`C zCI!s;^YsSr3Y2KClq97gsGk_5FF^^%4K^#b!?O-M%!NbrFf4`RZAKrzn~=w_6OPmK z;Eg2dB8*0ohD$b#_3B#0Lr0( XW-QSrcIy|D1}w$m!nXkYjve_2T+8uD delta 820 zcmZXQUuaTs6vywmX}L|@^$)Y_26J&MZT_AACX{Bm^&@)Na>AkoNe-l#S=eY0v>^mH zk*xC&_O@OtYTT!K8tB?fPcedmW(Gk-w0ew+^}AOks{`l!e)oL7=g5zOp)8GreX^s@H(Se03)z@2kI;%J(Os9#@q%3e{7b(;-r_WSd{o4iN+MgOC zZv8!7tp2}1S+W|+0Nc1?H1#e5`>gIOHD<6 zjQY>*rkz9Yu$jLgBWf}or{1QQanfPt7i2_@r5>icHkwanb$%S%UhBTYQz|&mKK%wINm{r)Mh;`$J>2I^!PmB!jv!6#W`q> z+B;nKh2Si{_C?_<^8TngW1wk8o%7q^DpveaR^!4q{s=50ABeIK4EW91hq-_ao?wM0 etds^KEMr1TFw$l1R~j=7Oa()%&5ieh`+frz75*Cl