leeres plottyfile wirft exception
This commit is contained in:
parent
198feef12f
commit
22a5b466db
|
@ -103,6 +103,7 @@ void kennlinieZweiterQuadrant()
|
|||
if(ba[k] > bb[k] && bb[k] % 50 == 0 && bb[k] != 0)
|
||||
{
|
||||
uint16_t i_d = ba[k] - bb[k];
|
||||
std::cout << "added" << std::endl;
|
||||
pf.addDot(Dot(u_gs, i_d, bb[k] / 50));
|
||||
}
|
||||
curve++;
|
||||
|
|
|
@ -3,6 +3,11 @@
|
|||
#include <b15f/b15f.h>
|
||||
#include <b15f/plottyfile.h>
|
||||
|
||||
/*
|
||||
* Inkrementiert DAC 0 von 0 bis 1023 und speichert zu jeder Ausgabe den Wert von ADC 0 in einem Puffer.
|
||||
* Die Funktion ADC 0 abhängig von DAC 0 wird als Graph geplottet.
|
||||
*/
|
||||
|
||||
const char PLOT_FILE[] = "plot.bin";
|
||||
|
||||
int main()
|
||||
|
|
|
@ -202,7 +202,7 @@ public:
|
|||
/**
|
||||
* Setzt die Register so, dass näherungsweise die gewünschte Frequenz erzeugt wird.
|
||||
* Ist freq == 0 wird PWM deaktiviert.
|
||||
* Standardfrequenz: 31300 (empfohlen, da dann TOP == 255)
|
||||
* Standardfrequenz: 31300 (empfohlen, da dann TOP == 255)
|
||||
* \param freq PWM Frequenz
|
||||
* \return Top Wert des PWM Value für die gesetzte Frequenz
|
||||
* \throws DriverException
|
||||
|
|
280
control/src/drv/b15f.h.orig
Normal file
280
control/src/drv/b15f.h.orig
Normal file
|
@ -0,0 +1,280 @@
|
|||
#ifndef B15F_H
|
||||
#define B15F_H
|
||||
|
||||
#include <iostream>
|
||||
#include <bits/stdc++.h>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <cstdlib>
|
||||
#include <chrono>
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <termios.h>
|
||||
#include "usart.h"
|
||||
#include "driverexception.h"
|
||||
#include "timeoutexception.h"
|
||||
|
||||
// wichtig für die Register-Zugriffe
|
||||
#define _AVR_IO_H_ 1 // Erzwinge die Inklusion
|
||||
#include "/usr/lib/avr/include/avr/sfr_defs.h"
|
||||
#include "/usr/lib/avr/include/avr/iom1284p.h"
|
||||
|
||||
typedef std::function<void(std::exception&)> errorhandler_t;
|
||||
|
||||
|
||||
/*! main driver class */
|
||||
|
||||
class B15F
|
||||
{
|
||||
private:
|
||||
// privater Konstruktor
|
||||
B15F(void);
|
||||
public:
|
||||
|
||||
/*************************************
|
||||
* Grundfunktionen des B15F Treibers *
|
||||
*************************************/
|
||||
|
||||
/**
|
||||
* 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
|
||||
* \param ms Verzögerung in Millisekunden
|
||||
*/
|
||||
void delay_ms(uint16_t ms);
|
||||
|
||||
/**
|
||||
* Lässt den Treiber für eine angegebene Zeit pausieren
|
||||
* \param us Verzögerung in Microsekunden
|
||||
*/
|
||||
void delay_us(uint16_t us);
|
||||
|
||||
/**
|
||||
* Liefert eine Referenz zur aktuellen Treiber-Instanz
|
||||
* @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);
|
||||
|
||||
/**
|
||||
* Multithread sicherer Abbruch des B15F-Treibers
|
||||
* \param msg Beschreibung der Abbruchursache
|
||||
*/
|
||||
static void abort(std::string msg);
|
||||
|
||||
/**
|
||||
* Multithread sicherer Abbruch des B15F-Treibers
|
||||
* \param ex Exception als Abbruchursache
|
||||
*/
|
||||
static void abort(std::exception& ex);
|
||||
|
||||
/**
|
||||
* Setzt eine Fehlerbehandlungsroutine für den Treiberabbruch (abort)
|
||||
* \param func Funktion, die Exception als Parameter bekommt
|
||||
*/
|
||||
static void setAbortHandler(errorhandler_t func);
|
||||
|
||||
/*************************************/
|
||||
|
||||
|
||||
|
||||
/*************************
|
||||
* Steuerbefehle für B15 *
|
||||
*************************/
|
||||
|
||||
/**
|
||||
* Versetzt das Board in den Selbsttest-Modus
|
||||
* WICHTIG: Es darf dabei nichts an den Klemmen angeschlossen sein!
|
||||
* \throws DriverException
|
||||
*/
|
||||
bool activateSelfTestMode(void);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* Liest den Wert des digitalen Eingabeports, an dem der DIP-switch angeschlossen ist (S7)
|
||||
* \return Wert für gesamten Port
|
||||
* \throws DriverException
|
||||
*/
|
||||
uint8_t readDipSwitch(void);
|
||||
|
||||
/**
|
||||
* Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 0
|
||||
* \param port 10-Bit Wert
|
||||
* \throws DriverException
|
||||
*/
|
||||
bool analogWrite0(uint16_t port);
|
||||
|
||||
/**
|
||||
* Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 1
|
||||
* \param port 10-Bit Wert
|
||||
* \throws DriverException
|
||||
*/
|
||||
bool analogWrite1(uint16_t port);
|
||||
|
||||
/**
|
||||
* Liest den Wert des Analog-Digital-Converters (ADC / ADU)
|
||||
* \param channel Kanalwahl von 0 - 7
|
||||
* \throws DriverException
|
||||
*/
|
||||
uint16_t analogRead(uint8_t channel);
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Setzt die Register so, dass näherungsweise die gewünschte Frequenz erzeugt wird.
|
||||
* Ist freq == 0 wird PWM deaktiviert.
|
||||
* Standardfrequenz: 31300 (empfohlen, da dann TOP == 255)
|
||||
* \param freq PWM Frequenz
|
||||
* \return Top Wert des PWM Value für die gesetzte Frequenz
|
||||
* \throws DriverException
|
||||
*/
|
||||
uint8_t pwmSetFrequency(uint32_t freq);
|
||||
|
||||
/**
|
||||
* Setzt den PWM Wert.
|
||||
* \param value PWM Wert [0..0xFF]
|
||||
* \throws DriverException
|
||||
*/
|
||||
bool pwmSetValue(uint8_t value);
|
||||
|
||||
/**
|
||||
* Setzt direkt den Wert eines MCU Registers.
|
||||
* *Wichtig:* bei einer falschen Adresse kann das Board 15 ernsthaften Schaden nehmen!
|
||||
* \param adr Speicheradresse des Registers
|
||||
* \param val Neuer Wert für das Register
|
||||
* \throws DriverException
|
||||
*/
|
||||
bool setRegister(volatile uint8_t* adr, uint8_t val);
|
||||
|
||||
/**
|
||||
* Liefert den Wert eines MCU Registers.
|
||||
* \param adr Speicheradresse des Registers
|
||||
* \throws DriverException
|
||||
*/
|
||||
uint8_t getRegister(volatile uint8_t* adr);
|
||||
|
||||
/*************************/
|
||||
|
||||
|
||||
// CONSTANTS
|
||||
const std::string PRE = "[B15F] "; //!< B15F stdout prefix
|
||||
constexpr static uint8_t MSG_OK = 0xFF; //!< Value to acknowledge a received command
|
||||
constexpr static uint8_t MSG_FAIL = 0xFE; //!< Value to reject a received command
|
||||
constexpr static uint16_t RECONNECT_TIMEOUT = 64; //!< Time in ms after which a reconnect attempt aborts
|
||||
constexpr static uint16_t WDT_TIMEOUT = 15; //!< Time in ms after which the watch dog timer resets the MCU
|
||||
constexpr static uint8_t RECONNECT_TRIES = 3; //!< Maximum count of reconnect attempts after which the driver stops
|
||||
constexpr static uint32_t BAUDRATE = 57600; //!< USART baudrate for communication with the MCU
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
* Initialisiert und testet die Verbindung zum B15
|
||||
* \throws DriverException
|
||||
*/
|
||||
void init(void);
|
||||
|
||||
USART usart;
|
||||
static B15F* instance;
|
||||
static errorhandler_t errorhandler;
|
||||
|
||||
// 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_ST = 4;
|
||||
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_DSW = 9;
|
||||
constexpr static uint8_t RQ_AA0 = 10;
|
||||
constexpr static uint8_t RQ_AA1 = 11;
|
||||
constexpr static uint8_t RQ_ADC = 12;
|
||||
constexpr static uint8_t RQ_ADC_DAC_STROKE = 13;
|
||||
constexpr static uint8_t RQ_PWM_SET_FREQ = 14;
|
||||
constexpr static uint8_t RQ_PWM_SET_VALUE = 15;
|
||||
constexpr static uint8_t RQ_SET_REG = 16;
|
||||
constexpr static uint8_t RQ_GET_REG = 17;
|
||||
};
|
||||
|
||||
#endif // B15F_H
|
|
@ -146,6 +146,9 @@ void PlottyFile::prepStr(std::string& str, uint8_t len)
|
|||
|
||||
void PlottyFile::writeToFile(std::string filename)
|
||||
{
|
||||
if(dots.empty())
|
||||
throw std::length_error("Es wurden keine Punkte gespeichert.");
|
||||
|
||||
prepStr(unit_x, STR_LEN_SHORT);
|
||||
prepStr(desc_x, STR_LEN_LARGE);
|
||||
prepStr(unit_y, STR_LEN_SHORT);
|
||||
|
|
201
control/src/drv/plottyfile.cpp.orig
Normal file
201
control/src/drv/plottyfile.cpp.orig
Normal file
|
@ -0,0 +1,201 @@
|
|||
#include "plottyfile.h"
|
||||
|
||||
void PlottyFile::addDot(Dot& dot)
|
||||
{
|
||||
dots.push_back(dot);
|
||||
}
|
||||
|
||||
void PlottyFile::addDot(Dot dot)
|
||||
{
|
||||
dots.push_back(dot);
|
||||
}
|
||||
|
||||
void PlottyFile::setFunctionType(FunctionType function_type)
|
||||
{
|
||||
this->function_type = function_type;
|
||||
}
|
||||
|
||||
void PlottyFile::setQuadrant(uint8_t quadrant)
|
||||
{
|
||||
if(quadrant < 1 || quadrant > 4)
|
||||
throw std::range_error("Ungueltiger Quadrant");
|
||||
this->quadrant = quadrant;
|
||||
}
|
||||
|
||||
void PlottyFile::setRefX(uint16_t ref_x)
|
||||
{
|
||||
this->ref_x = ref_x;
|
||||
}
|
||||
|
||||
void PlottyFile::setRefY(uint16_t ref_y)
|
||||
{
|
||||
this->ref_y = ref_y;
|
||||
}
|
||||
|
||||
void PlottyFile::setParaFirstCurve(uint16_t para_first)
|
||||
{
|
||||
this->para_first = para_first;
|
||||
}
|
||||
|
||||
void PlottyFile::setParaStepWidth(uint16_t para_stepwidth)
|
||||
{
|
||||
this->para_stepwidth = para_stepwidth;
|
||||
}
|
||||
|
||||
void PlottyFile::setUnitX(std::string unit_x)
|
||||
{
|
||||
this->unit_x = unit_x;
|
||||
}
|
||||
|
||||
void PlottyFile::setDescX(std::string desc_x)
|
||||
{
|
||||
this->desc_x = desc_x;
|
||||
}
|
||||
|
||||
void PlottyFile::setUnitY(std::string unit_y)
|
||||
{
|
||||
this->unit_y = unit_y;
|
||||
}
|
||||
|
||||
void PlottyFile::setDescY(std::string desc_y)
|
||||
{
|
||||
this->desc_y = desc_y;
|
||||
}
|
||||
|
||||
void PlottyFile::setUnitPara(std::string unit_para)
|
||||
{
|
||||
this->unit_para = unit_para;
|
||||
}
|
||||
|
||||
void PlottyFile::setDescPara(std::string desc_para)
|
||||
{
|
||||
this->desc_para = desc_para;
|
||||
}
|
||||
|
||||
FunctionType PlottyFile::getFunctionType() const
|
||||
{
|
||||
return function_type;
|
||||
}
|
||||
|
||||
uint8_t PlottyFile::getQuadrant() const
|
||||
{
|
||||
return quadrant;
|
||||
}
|
||||
|
||||
uint16_t PlottyFile::getRefX() const
|
||||
{
|
||||
return ref_x;
|
||||
}
|
||||
|
||||
uint16_t PlottyFile::getRefY() const
|
||||
{
|
||||
return ref_y;
|
||||
}
|
||||
|
||||
uint16_t PlottyFile::getParaFirstCurve() const
|
||||
{
|
||||
return para_first;
|
||||
}
|
||||
|
||||
uint16_t PlottyFile::getParaStepWidth() const
|
||||
{
|
||||
return para_stepwidth;
|
||||
}
|
||||
|
||||
std::string PlottyFile::getUnitX() const
|
||||
{
|
||||
return unit_x;
|
||||
}
|
||||
|
||||
std::string PlottyFile::getDescX() const
|
||||
{
|
||||
return desc_x;
|
||||
}
|
||||
|
||||
std::string PlottyFile::getUnitY() const
|
||||
{
|
||||
return unit_y;
|
||||
}
|
||||
|
||||
std::string PlottyFile::getDescY() const
|
||||
{
|
||||
return desc_y;
|
||||
}
|
||||
|
||||
std::string PlottyFile::getUnitPara() const
|
||||
{
|
||||
return unit_para;
|
||||
}
|
||||
|
||||
std::string PlottyFile::getDescPara() const
|
||||
{
|
||||
return desc_para;
|
||||
}
|
||||
|
||||
void PlottyFile::prepStr(std::string& str, uint8_t len)
|
||||
{
|
||||
if(str.length() > len)
|
||||
throw std::runtime_error("Zu grosser String.");
|
||||
|
||||
if(str.length() != len)
|
||||
str += '\n';
|
||||
|
||||
while(str.length() < len)
|
||||
str += '\0';
|
||||
}
|
||||
|
||||
void PlottyFile::writeToFile(std::string filename)
|
||||
{
|
||||
if(dots.empty())
|
||||
throw std::length_error("Es wurden keine Punkte gespeichert.");
|
||||
|
||||
prepStr(unit_x, STR_LEN_SHORT);
|
||||
prepStr(desc_x, STR_LEN_LARGE);
|
||||
prepStr(unit_y, STR_LEN_SHORT);
|
||||
prepStr(desc_y, STR_LEN_LARGE);
|
||||
prepStr(unit_para, STR_LEN_SHORT);
|
||||
prepStr(desc_para, STR_LEN_LARGE);
|
||||
|
||||
std::ofstream file(filename);
|
||||
|
||||
// write file header
|
||||
file.write(reinterpret_cast<char*>(&command), 1);
|
||||
file.write(head.c_str(), head.length());
|
||||
file.write(filetype.c_str(), filetype.length());
|
||||
file.write(reinterpret_cast<char*>(&version), 2);
|
||||
file.write(reinterpret_cast<char*>(&subversion), 2);
|
||||
file.put(static_cast<uint8_t>(function_type));
|
||||
file.write(reinterpret_cast<char*>(&quadrant), 1);
|
||||
file.write(reinterpret_cast<char*>(&ref_x), 2);
|
||||
file.write(reinterpret_cast<char*>(&ref_y), 2);
|
||||
file.write(reinterpret_cast<char*>(¶_first), 2);
|
||||
file.write(reinterpret_cast<char*>(¶_stepwidth), 2);
|
||||
file.write(unit_x.c_str(), unit_x.length());
|
||||
file.write(desc_x.c_str(), desc_x.length());
|
||||
file.write(unit_y.c_str(), unit_y.length());
|
||||
file.write(desc_y.c_str(), desc_y.length());
|
||||
file.write(unit_para.c_str(), unit_para.length());
|
||||
file.write(desc_para.c_str(), desc_para.length());
|
||||
file.write(reinterpret_cast<const char*>(&eof), 1);
|
||||
|
||||
// make sure header size is 256 Byte
|
||||
while(file.tellp() < 256)
|
||||
file.put(0);
|
||||
|
||||
for(Dot& dot : dots)
|
||||
{
|
||||
file.put((dot.getX() >> 8) | (static_cast<uint8_t>(dot.getCurve()) << 2));
|
||||
file.put(dot.getX() & 0xFF);
|
||||
file.put(dot.getY() >> 8);
|
||||
file.put(dot.getY() & 0xFF);
|
||||
}
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
||||
void PlottyFile::startPlotty(std::string filename)
|
||||
{
|
||||
int code = system(("plotty --in " + filename).c_str());
|
||||
if(code)
|
||||
throw std::runtime_error("Fehler beim Aufruf von plotty");
|
||||
}
|
|
@ -5,6 +5,7 @@
|
|||
#include <fstream>
|
||||
#include <exception>
|
||||
#include <vector>
|
||||
#include <stdexcept>
|
||||
#include "dot.h"
|
||||
|
||||
enum FunctionType
|
||||
|
|
Loading…
Reference in a new issue