Jede Menge Kommentare
This commit is contained in:
parent
01f1fa844f
commit
bd80e3dbf7
2
Makefile
2
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)
|
||||
|
||||
|
|
49
drv/b15f.cpp
49
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<char, 128> buffer;
|
||||
std::string result;
|
||||
std::unique_ptr<FILE, decltype(&pclose)> 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)
|
||||
{
|
||||
|
|
142
drv/b15f.h
142
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<std::string> 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<std::string> 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
|
||||
|
|
BIN
drv/b15f.o
BIN
drv/b15f.o
Binary file not shown.
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue