From 8cbd8a1a12740e0b3ace404cb1215fbae96af742 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Tue, 26 Mar 2019 16:27:21 +0100 Subject: [PATCH] io Funktionen ok --- drv/b15f.cpp | 89 +++++++++++++++++++++++++++++++++++++++++++-------- drv/b15f.h | 25 +++++++++++++-- drv/b15f.o | Bin 18536 -> 18896 bytes main | Bin 24376 -> 24128 bytes 4 files changed, 97 insertions(+), 17 deletions(-) diff --git a/drv/b15f.cpp b/drv/b15f.cpp index a11139d..2071a06 100644 --- a/drv/b15f.cpp +++ b/drv/b15f.cpp @@ -35,17 +35,26 @@ void B15F::init() // Verbindungstest muss dreimal erfolgreich sein std::cout << PRE << "Teste Verbindung... " << std::flush; for(uint8_t i = 0; i < 3; i++) - { if(!testConnection()) - { throw DriverException("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?"); - } - } std::cout << "OK" << std::endl; - std::cout << "int: " << testIntConv() << std::endl; - std::cout << "int: " << testIntConv() << std::endl; - std::cout << "int: " << testIntConv() << std::endl; + + std::cout << PRE << "Teste Integer Konvertierung... " << std::flush; + for(uint8_t i = 0; i < 3; i++) + if(!testIntConv()) + throw DriverException("Konvertierung fehlgeschlagen."); + std::cout << "OK" << std::endl; + + while(1) + { + for(uint16_t i = 0; i < 1024; ) + { + i = analogeEingabe(0); + analogeAusgabe0(i); + delay(0); + } + } } @@ -86,6 +95,65 @@ bool B15F::testIntConv() return aw == dummy * 3; } + + +bool B15F::digitaleAusgabe0(uint8_t port) +{ + writeByte(RQ_BA0); + writeByte(port); + + uint8_t aw = readByte(); + return aw == MSG_OK; +} + +bool B15F::digitaleAusgabe1(uint8_t port) +{ + writeByte(RQ_BA1); + writeByte(port); + + uint8_t aw = readByte(); + return aw == MSG_OK; +} + +uint8_t B15F::digitaleEingabe0() +{ + writeByte(RQ_BE0); + return readByte(); +} + +uint8_t B15F::digitaleEingabe1() +{ + writeByte(RQ_BE1); + return readByte(); +} + +bool B15F::analogeAusgabe0(uint16_t value) +{ + writeByte(RQ_AA0); + writeInt(value); + + uint8_t aw = readByte(); + return aw == MSG_OK; +} + +bool B15F::analogeAusgabe1(uint16_t value) +{ + writeByte(RQ_AA1); + writeInt(value); + + uint8_t aw = readByte(); + return aw == MSG_OK; +} + +uint16_t B15F::analogeEingabe(uint8_t channel) +{ + writeByte(RQ_ADC); + writeByte(channel); + return readInt(); +} + + + void B15F::writeByte(uint8_t b) { if(write(usart, &b, 1) != 1) @@ -109,13 +177,6 @@ uint8_t B15F::readByte() int n = read(usart, &b, 1); if (n > 0) return static_cast(b); - /*else if(n < -1) - { - std::string msg = "Fehler bei der seriellen Verbindung. (Code: "; - msg += std::to_string(n); - msg += ")"; - throw DriverException(msg); - }*/ end = std::chrono::steady_clock::now(); elapsed = std::chrono::duration_cast(end - start).count(); diff --git a/drv/b15f.h b/drv/b15f.h index 7c71e0b..cac39ff 100644 --- a/drv/b15f.h +++ b/drv/b15f.h @@ -19,18 +19,30 @@ class B15F private: B15F(void); // privater Konstruktor public: + // Grundfunktionen void init(void); void discard(void); bool testConnection(void); bool testIntConv(void); + // Board Befehle + inline bool digitaleAusgabe0(uint8_t); + inline bool digitaleAusgabe1(uint8_t); + inline uint8_t digitaleEingabe0(void); + inline uint8_t digitaleEingabe1(void); + inline bool analogeAusgabe0(uint16_t); + inline bool analogeAusgabe1(uint16_t); + inline uint16_t analogeEingabe(uint8_t); + + // Serielle Verbindung inline void writeByte(uint8_t); inline void writeInt(uint16_t); inline uint8_t readByte(void); inline uint16_t readInt(void); - void delay(uint16_t); + void delay(uint16_t); + static B15F& getInstance(void); private: @@ -40,17 +52,24 @@ private: static B15F* instance; -// CONSTANTS + // CONSTANTS const std::string PRE = "[B15F] "; const std::string SERIAL_DEVICE = "/dev/ttyUSB0"; constexpr static uint8_t MSG_OK = 0xFF; constexpr static uint8_t MSG_FAIL = 0xFE; -// REQUESTS + // REQUESTS constexpr static uint8_t RQ_DISC = 0; constexpr static uint8_t RQ_TEST = 1; constexpr static uint8_t RQ_INFO = 2; constexpr static uint8_t RQ_INT = 3; + constexpr static uint8_t RQ_BA0 = 5; + constexpr static uint8_t RQ_BA1 = 6; + constexpr static uint8_t RQ_BE0 = 7; + constexpr static uint8_t RQ_BE1 = 8; + constexpr static uint8_t RQ_AA0 = 9; + constexpr static uint8_t RQ_AA1 = 10; + constexpr static uint8_t RQ_ADC = 11; }; #endif // B15F_h diff --git a/drv/b15f.o b/drv/b15f.o index 1d44b6dace3e308358cc44007a10397eebb2deb2..3e4a43efba472e81affacd53517e234c16833c29 100644 GIT binary patch literal 18896 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 diff --git a/main b/main index 064be73c502e324c5d0a1c5e9953d44cc2a3092f..275fed1ef78634188bf8db721537cc3c0c3af9c3 100755 GIT binary patch literal 24128 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 wVt@TCuuJeS%Pq@A{Y%`PgCzHv9OigCenHLCX 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%0D9I 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