diff --git a/Makefile b/Makefile index 39e260b..e9a3e0f 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ OBJECTS = main.o drv/usart.o drv/b15f.o drv/plottyfile.o drv/dot.o COMPILE = $(COMPILER_PATH) $(CFLAGS) -B15F: clean $(OBJECTS) +B15F: $(OBJECTS) @echo "Linking..." $(COMPILE) $(OBJECTS) -o $(OUTPUT) $(LDFLAGS) diff --git a/drv/b15f.cpp b/drv/b15f.cpp index f503a71..67b041c 100644 --- a/drv/b15f.cpp +++ b/drv/b15f.cpp @@ -10,13 +10,23 @@ B15F::B15F() 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) + throw DriverException("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(SERIAL_DEVICE); + usart.openDevice(device); std::cout << "OK" << std::endl; - delay_ms(1); std::cout << PRE << "Teste Verbindung... " << std::flush; uint8_t tries = 3; @@ -197,34 +207,19 @@ bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset uint8_t aw = usart.readByte(); if(aw != MSG_OK) - { - throw DriverException("Out of sync"); - } + throw DriverException("Mikrocontroller nicht synchron"); - //uint8_t block[5]; // 4 Datenbyte + crc for(uint16_t i = 0; i < count; i++) { - /*bool crc_ok = usart.readBlock(&block[0], 0); - - if (!crc_ok) - { - std::cout << PRE << "bad crc" << std::endl; - return analogSequence(channel_a, buffer_a, offset_a, channel_b, buffer_b, offset_b, start, delta, count); - }*/ buffer_a[i] = usart.readInt(); buffer_b[i] = usart.readInt(); - //std::cout << buffer_a[i] << " - " << buffer_b[i] << std::endl; - - /*buffer_a[i] = ((uint16_t) block[0]) | (((uint16_t) block[1]) << 8); - buffer_b[i] = ((uint16_t) block[2]) | (((uint16_t) block[3]) << 8);*/ } aw = usart.readByte(); if(aw == MSG_OK) return aw; - - std::cout << PRE << "Da ging etwas verloren" << std::endl; - + + throw DriverException("Sequenz unterbrochen"); } void B15F::delay_ms(uint16_t ms) @@ -236,6 +231,20 @@ void B15F::delay_us(uint16_t us) { std::this_thread::sleep_for(std::chrono::microseconds(us)); } + +// 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; +} B15F& B15F::getInstance(void) { diff --git a/drv/b15f.h b/drv/b15f.h index 132c4c8..4a12632 100644 --- a/drv/b15f.h +++ b/drv/b15f.h @@ -21,25 +21,49 @@ class B15F { private: - B15F(void); // privater Konstruktor + // privater Konstruktor + B15F(void); public: - // Grundfunktionen - void init(void); - void reconnect(void); - void discard(void); - bool testConnection(void); - bool testIntConv(void); - std::vector getBoardInfo(void); - // Board Befehle - bool digitalWrite0(uint8_t); - bool digitalWrite1(uint8_t); - uint8_t digitalRead0(void); - uint8_t digitalRead1(void); - bool analogWrite0(uint16_t); - bool analogWrite1(uint16_t); - uint16_t analogRead(uint8_t); - bool 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); + /************************************* + * Grundfunktionen des B15F Treibers * + *************************************/ + + /** + * Initialisiert und testet die Verbindung zum B15 + * \throws DriverException + */ + void init(void); + + /** + * Versucht die Verbindung zum B15 wiederherzustellen + * \throws DriverException + */ + void reconnect(void); + + /** + * Verwirft Daten im USART Puffer auf dieser Maschine und B15 + * \throws DriverException + */ + void discard(void); + + /** + * Testet die USART Verbindung auf Funktion + * \throws DriverException + */ + bool testConnection(void); + + /** + * Testet die Integer Konvertierung der USART Verbindung + * \throws DriverException + */ + bool testIntConv(void); + + /** + * Liefert Informationen zur aktuellen Firmware des B15 + * \throws DriverException + */ + std::vector getBoardInfo(void); /** * Lässt den Treiber für eine angegebene Zeit pausieren @@ -58,14 +82,92 @@ public: * @throws DriverException */ static B15F& getInstance(void); + + /** + * Führt ein Befehl auf dieser Maschine aus und liefert stdout zurück + * \param cmd Der Befehl + */ + static std::string exec(std::string cmd); + + /*************************************/ + + /************************* + * Steuerbefehle für B15 * + *************************/ + + /** + * Setzt den Wert des digitalen Ausgabeports 0 + * \param port Wert für gesamten Port + * \throws DriverException + */ + bool digitalWrite0(uint8_t); + + /** + * Setzt den Wert des digitalen Ausgabeports 1 + * \param port Wert für gesamten Port + * \throws DriverException + */ + bool digitalWrite1(uint8_t); + + /** + * Liest den Wert des digitalen Eingabeports 0 + * \return Wert für gesamten Port + * \throws DriverException + */ + uint8_t digitalRead0(void); + + /** + * Liest den Wert des digitalen Eingabeports 1 + * \return Wert für gesamten Port + * \throws DriverException + */ + uint8_t digitalRead1(void); + + /** + * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 0 + * \param port 10-Bit Wert + * \throws DriverException + */ + bool analogWrite0(uint16_t); + + /** + * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 1 + * \param port 10-Bit Wert + * \throws DriverException + */ + bool analogWrite1(uint16_t); + + /** + * Liest den Wert des Analog-Digital-Converters (ADC / ADU) + * \param channel Kanalwahl von 0 - 7 + * \throws DriverException + */ + uint16_t analogRead(uint8_t channel); + + /** + * \brief Komplexe Analoge Sequenz + * DAC 0 wird auf den Startwert gesetzt und dann schrittweise um Delta inkrementiert. + * Für jeden eingestelleten DAC-Wert werden zwei ADCs (channel_a und channel_b) angesprochen und die Werte übermittelt. + * Die Werte werden in buffer_a für Kanal a und buffer_b für Kanal b gespeichert. + * \param channel_a Auswahl des ADC a, von 0 - 7 + * \param buffer_a Speichertort für Werte des Kanals a + * \param offset_a Anzahl an Werten des Kanals a, die im Speicher übersprungen werden sollen + * \param channel_b Auswahl des ADC b, von 0 - 7 + * \param buffer_b Speichertort für Werte des Kanals b + * \param offset_b Anzahl an Werten des Kanals b, die im Speicher übersprungen werden + * \param start Startwert des DACs + * \param delta Schrittweite, mit welcher der DAC inkrementiert wird + * \param count Anzahl an Inkrementierungen + * \throws DriverException + */ + bool 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); + + /*************************/ private: - uint16_t timeout = 1000; // ms - uint16_t block_timeout = 1; // ms USART usart; static B15F* instance; - // CONSTANTS diff --git a/drv/b15f.o b/drv/b15f.o index 80956df..d0b1584 100644 Binary files a/drv/b15f.o and b/drv/b15f.o differ diff --git a/gnuplotscript.gp b/gnuplotscript.gp index 76e7727..d611d65 100644 --- a/gnuplotscript.gp +++ b/gnuplotscript.gp @@ -8,23 +8,23 @@ set xrange [5:0] set x2range [5:0] set y2range [0:50] set yrange [0:50] -set label at 2,32 'U_{DS} [V] = 300' right -set label at 2,31 'U_{DS} [V] = 325' right -set label at 2,33 'U_{DS} [V] = 350' right -set label at 2,35 'U_{DS} [V] = 375' right -set label at 2,21 'U_{DS} [V] = 400' right -set label at 2,22 'U_{DS} [V] = 425' right -set label at 2,22 'U_{DS} [V] = 450' right -set label at 2,22 'U_{DS} [V] = 475' right -set label at 2,23 'U_{DS} [V] = 500' right -set label at 2,12 'U_{DS} [V] = 525' right -set label at 2,5 'U_{DS} [V] = 550' right -set label at 2,12 'U_{DS} [V] = 575' right -set label at 2,2 'U_{DS} [V] = 600' right -set label at 2,12 'U_{DS} [V] = 625' right -set label at 2,2 'U_{DS} [V] = 650' right -set label at 2,2 'U_{DS} [V] = 650' right -set label at 2,2 'U_{DS} [V] = 700' right +set label at 2,36 'U_{DS} [V] = 300' right +set label at 2,33 'U_{DS} [V] = 325' right +set label at 2,36 'U_{DS} [V] = 350' right +set label at 2,38 'U_{DS} [V] = 375' right +set label at 2,5 'U_{DS} [V] = 400' right +set label at 2,23 'U_{DS} [V] = 425' right +set label at 2,24 'U_{DS} [V] = 450' right +set label at 2,24 'U_{DS} [V] = 475' right +set label at 2,12 'U_{DS} [V] = 500' right +set label at 2,13 'U_{DS} [V] = 525' right +set label at 2,13 'U_{DS} [V] = 550' right +set label at 2,13 'U_{DS} [V] = 575' right +set label at 2,13 'U_{DS} [V] = 600' right +set label at 2,6 'U_{DS} [V] = 625' right +set label at 2,6 'U_{DS} [V] = 650' right +set label at 2,6 'U_{DS} [V] = 675' right +set label at 2,6 'U_{DS} [V] = 700' right set label at 2,2 'U_{DS} [V] = 725' right set label at 2,2 'U_{DS} [V] = 725' right set y2tics diff --git a/main b/main index 8bc0c14..6ab14c5 100755 Binary files a/main and b/main differ diff --git a/test_plot b/test_plot index 53376b0..9860ede 100644 Binary files a/test_plot and b/test_plot differ