b15f/driver/drv/usart.h

151 lines
3.5 KiB
C
Raw Normal View History

2019-03-29 10:12:31 +00:00
#ifndef USART_H
#define USART_H
2019-03-29 10:38:11 +00:00
#include <iostream>
2019-03-29 10:12:31 +00:00
#include <cstdint>
2019-03-29 10:38:11 +00:00
#include <chrono>
2019-03-29 10:12:31 +00:00
#include <unistd.h>
2019-04-01 13:15:46 +00:00
#include <cstring>
2019-03-29 10:12:31 +00:00
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termios.h>
2019-04-02 06:46:42 +00:00
#include <cmath>
2019-03-29 10:12:31 +00:00
#include "usartexception.h"
2019-03-29 14:06:35 +00:00
#include "timeoutexception.h"
2019-03-29 10:12:31 +00:00
class USART
{
public:
/*************************************************
* Methoden für die Verwaltung der Schnittstelle *
*************************************************/
/**
* Öffnet die USART Schnittstelle
2019-03-29 10:38:11 +00:00
* \param device Linux-Gerätepfad
2019-03-29 10:12:31 +00:00
* \throws USARTException
*/
2019-03-29 10:38:11 +00:00
void openDevice(std::string device);
2019-03-29 10:12:31 +00:00
/**
* Schließt die USART Schnittstelle
* \throws USARTException
*/
void closeDevice(void);
/**
* Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gelesen wurden
* \throws USARTException
*/
2019-04-02 06:46:42 +00:00
void clearInputBuffer(void);
2019-03-29 10:12:31 +00:00
/**
* Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden
* \throws USARTException
*/
2019-04-02 06:46:42 +00:00
void clearOutputBuffer(void);
2019-04-05 13:59:05 +00:00
/**
* Schreibt Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden
* \throws USARTException
*/
void flushOutputBuffer(void);
2019-04-02 06:46:42 +00:00
/**
* Gibt Anzahl an erfolgreichen und fehlgeschlagenen Block-Übertragungen an
*/
void printStatistics(void);
2019-03-29 10:12:31 +00:00
/*************************************************/
/*************************************
* Methoden für die Datenübertragung *
*************************************/
/**
* Sendet ein Byte über die USART Schnittstelle
* \param b das zu sendende Byte
* \throws USARTException
*/
void writeByte(uint8_t b);
2019-03-29 10:38:11 +00:00
/**
* Sendet ein Integer über die USART Schnittstelle
* \param b das zu sendende Byte
* \throws USARTException
*/
void writeInt(uint16_t d);
2019-03-29 12:35:06 +00:00
/**
* Empfängt ein Byte über die USART Schnittstelle
* \throws USARTException
*/
2019-03-29 10:38:11 +00:00
uint8_t readByte(void);
2019-03-29 12:35:06 +00:00
/**
* Empfängt ein Integer über die USART Schnittstelle
* \throws USARTException
*/
2019-03-29 10:38:11 +00:00
uint16_t readInt(void);
2019-03-29 12:35:06 +00:00
2019-04-01 06:47:55 +00:00
int read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
2019-04-01 12:30:21 +00:00
int write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout);
2019-03-29 12:35:06 +00:00
void writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len);
2019-03-29 10:38:11 +00:00
bool readBlock(uint8_t* buffer, uint16_t offset);
2019-03-29 10:12:31 +00:00
/*************************************/
/***************************************
* Methoden für einstellbare Parameter *
***************************************/
/**
* Liefert die eingestellte Baudrate
* <b>Änderungen werden erst nach einem open() wirksam</b>
*/
uint32_t getBaudrate(void);
/**
* Liefert den eingestellten Timeout (in Dezisekunden)
* <b>Änderungen werden erst nach einem open() wirksam</b>
*/
uint8_t getTimeout(void);
/**
* Setzt die Baudrate
* <b>Änderungen werden erst nach einem open() wirksam</b>
*/
void setBaudrate(uint32_t baudrate);
/**
* Setzt den Timeout (in Dezisekunden)
* <b>Änderungen werden erst nach einem open() wirksam</b>
*/
void setTimeout(uint8_t timeout);
/***************************************/
2019-04-01 12:30:21 +00:00
constexpr static uint8_t CRC7_POLY = 0x91;
2019-04-02 08:59:37 +00:00
constexpr static uint8_t MAX_BLOCK_SIZE = 64;
2019-04-01 12:30:21 +00:00
constexpr static uint8_t BLOCK_END = 0x80;
2019-03-29 10:12:31 +00:00
private:
int file_desc = -1; // Linux Dateideskriptor
2019-04-05 13:59:05 +00:00
uint32_t baudrate = 9600; // Standard-Baudrate, sollte mit setBaudrate() überschrieben werden!
2019-03-29 10:38:11 +00:00
int TEST = 0;
2019-04-05 13:04:59 +00:00
uint8_t timeout = 10; // in Dezisekunden
2019-04-01 13:15:46 +00:00
uint8_t block_buffer[MAX_BLOCK_SIZE + 3];
2019-04-02 06:46:42 +00:00
// debug statistics
uint32_t n_blocks_total = 0;
uint32_t n_blocks_failed = 0;
2019-03-29 10:12:31 +00:00
};
#endif // USART_H