diff --git a/Makefile b/Makefile index e9a3e0f..6353eb8 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ COMPILER_PATH = g++ OUTPUT = main -CFLAGS = -std=c++14 -O3 +CFLAGS = -std=c++14 -O3 -Wall -Wextra LDFLAGS = OBJECTS = main.o drv/usart.o drv/b15f.o drv/plottyfile.o drv/dot.o diff --git a/drv/b15f.cpp b/drv/b15f.cpp index 2ecff4e..37ac3e6 100644 --- a/drv/b15f.cpp +++ b/drv/b15f.cpp @@ -27,6 +27,13 @@ void B15F::init() std::cout << "OK" << std::endl; + // Temporärer Test + uint8_t block[] = {0, 1, 2, 3}; + while(1) + usart.writeBlock(&block[0], 0, sizeof(block)); + throw std::runtime_error("SCHLUSS"); + + std::cout << PRE << "Teste Verbindung... " << std::flush; uint8_t tries = 3; diff --git a/drv/b15f.o b/drv/b15f.o index bb61a6a..7554439 100644 Binary files a/drv/b15f.o and b/drv/b15f.o differ diff --git a/drv/usart.cpp b/drv/usart.cpp index 2d4cf41..8b7809f 100644 --- a/drv/usart.cpp +++ b/drv/usart.cpp @@ -53,7 +53,14 @@ void USART::writeByte(uint8_t b) { int sent = write(file_desc, &b, 1); if(sent != 1) - throw USARTException("Fehler beim Senden: writeByte()"); + { + std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl; + usleep(100000); + sent = write(file_desc, &b, 1); + if(sent != 1) + throw USARTException("Fehler beim Senden: writeByte()"); + } + } void USART::writeInt(uint16_t d) @@ -66,33 +73,69 @@ void USART::writeInt(uint16_t d) void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len) { buffer += offset; - uint8_t crc = 0; + uint8_t crc; + uint8_t aw; - writeByte(len); - - while(len--) + do { - writeByte(*buffer); + crc = 0; + writeByte(len); - crc ^= *buffer; - for (uint8_t i = 0; i < 8; i++) + for(uint8_t i = 0; i < len; i++) { - if (crc & 1) - crc ^= CRC7_POLY; - crc >>= 1; + writeByte(buffer[i]); + usleep((1000000 / baudrate) * 16); + + crc ^= buffer[i]; + for (uint8_t k = 0; k < 8; k++) + { + if (crc & 1) + crc ^= CRC7_POLY; + crc >>= 1; + } + } + + writeByte(crc); + usleep((1000000 / baudrate) * 16); + + writeByte(0x80); // Stoppzeichen für Block + + usleep((1000000 / baudrate) * 16); + + int code = read(file_desc, &aw, 1); + if(code < 0) + { + std::cout << "WARNING: read error, retry..." << std::endl; + usleep(100000); + code = read(file_desc, &aw, 1); } - buffer++; - } + if(code == 0) + { + std::cout << "timeout info" << std::endl; + for(uint8_t i = 0; i < MAX_BLOCK_SIZE; i++) + { + std::cout << "i: " << (int) i << std::endl; + sleep(1); + writeByte(0x80); // Stoppzeichen für Block + + code = read(file_desc, &aw, 1); + if(code == 1) + { + std::cout << "YO HO" << std::endl; + std::cout << "aw: " << (int) aw << std::endl; + i = 0xFF; + } + } + } + else if(code != 1) + throw std::runtime_error("fatal: " + std::to_string(code)); - writeByte(crc); - writeByte(0x80); // Stoppzeichen für Block - - uint8_t aw = readByte(); - if(aw != 0xFF) - { - std::cout << "Ende Gelände" << std::endl; + clearInputBuffer(); } + while(aw != 0xFF); + + std::cout << "OK" << std::endl; } uint8_t USART::readByte(void) diff --git a/drv/usart.h b/drv/usart.h index bc9c220..01c0533 100644 --- a/drv/usart.h +++ b/drv/usart.h @@ -122,7 +122,8 @@ private: int TEST = 0; uint8_t timeout = 10; // in Dezisekunden - constexpr static uint8_t CRC7_POLY = 0x91; + constexpr static uint8_t CRC7_POLY = 0x91; + constexpr static uint8_t MAX_BLOCK_SIZE = 16; }; diff --git a/drv/usart.o b/drv/usart.o index 209f02e..0489533 100644 Binary files a/drv/usart.o and b/drv/usart.o differ diff --git a/main b/main index 3b3b93b..158b192 100755 Binary files a/main and b/main differ