First OOP parts

This commit is contained in:
Julian Appel 2026-03-16 21:40:29 +01:00
parent 73c0795e50
commit c4861d9793
8 changed files with 249 additions and 0 deletions

47
Seilbahn/src/CButton.cpp Normal file
View File

@ -0,0 +1,47 @@
#include "CButton.h"
#include "Arduino.h"
CButton::CButton(short btnPin, short ledPin)
{
m_btnPin = btnPin;
m_ledPin = ledPin;
m_currentButtonState = false;
m_buttonState = false;
}
bool CButton::getLED()
{
return digitalRead(m_ledPin);
}
void CButton::setLED(bool status)
{
digitalWrite(m_ledPin, status);
}
void CButton::work()
{
// Taster abfragen und aktuellen Zustand zwischenspeichern
m_currentButtonState = digitalRead(m_btnPin) == LOW;
// Aktuellen Zustand mit vorherigem vergleichen
if (m_currentButtonState && !m_buttonState)
{
// Warten zum entprellen
delay(20);
// Taster abfragen und aktuellen Zustand zwischenspeichern
m_currentButtonState = digitalRead(m_btnPin) == LOW;
// Prüfen ob immernoch gedrückt
if (m_currentButtonState == LOW)
{
// Knopf gedrückt => Code ausführen
// ============================================================
fahrtrichtung = HALT;
// ============================================================
// Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf
m_buttonState = m_currentButtonState;
}
}
}

24
Seilbahn/src/CButton.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef CBUTTON_H_
#define CBUTTON_H_
class CButton
{
public:
CButton(short btnPin, short ledPin);
void connect(); // Button mit Controller "verbinden"
void work(); // Button periodisch abfragen
bool getLED(); // LED status abfragen
void setLED(bool status); // LED an/ausschalten
private:
short m_btnPin; // Pinnummer Button am Arduino
short m_ledPin; // Pinnummer LED am Arduino
bool m_currentButtonState; // Hilfsvariable für aktuellen Status
bool m_buttonState; // Hilfsvariable für letzten Status
}
#endif /* CBUTTON_H_ */

View File

@ -0,0 +1,94 @@
#include "CEventQueue.h"
/*! \fn std::vector<SEvent> CEventQueue::popEvents(EVENT_TYPE eventType)
\brief Liefert einen chronologisch geordneten Vektor (FIFO) der aufgelaufenen
Events in dieser Queue zurueck. Diese werden daraufhin aus der Queue geloescht
\param eventType Falls nicht UNDEFINED, werden nur Events des angegebenen Typs
zurueckgegeben und aus der Queue geloescht, andernfalls alle
\return Chronologisch sortierter Vektor der Events (aelteste zuerst)
*/
std::vector<SEvent> CEventQueue::popEvents(EVENT_TYPE eventType)
{
std::vector<SEvent> ret;
switch(eventType)
{
case UNDEFINED:
ret = m_events;
m_events.clear();
break;
default:
{
std::vector<SEvent> without;
for(std::vector<SEvent>::iterator it=m_events.begin(); it!=m_events.end(); it++)
{
if(it->m_eventType==eventType)
{
ret.push_back(*it);
}
else
{
without.push_back(*it);
}
}
m_events = without;
}
break;
}
return ret;
}
/*! \fn SEvent CEventQueue::popEvent(bool* pValid)
\brief Liefert das chronologisch letzte (neueste) Event in der Queue zurueck
\param pValid true, falls ein Event aus der Queue zurueckgegeben wird,
false andernfalls (dann war die Queue naemlich leer)
\return Das chronologisch letzte (neueste) Event in der Queue
*/
SEvent CEventQueue::popEvent(bool* pValid)
{
return popEvent(m_events.size()-1, pValid);
}
/*! \fn SEvent CEventQueue::popEvent(unsigned short eventNumber,
* bool* pValid)
\brief Liefert das Event mit dem angegebenen Index in der Queue der gespeicherten
Events zurueck. Das Event wird daraufhin aus der Queue geloescht
\param eventNumber Index des zurueckzuliefernden Events in der Queue
\param pValid true, falls ein Event aus der Queue zurueckgegeben wird,
false andernfalls (dann existiert kein Event mit dem angegebenen Index)
\return Falls eventNumber nicht INVALID_EVENT_NUMBER, das Event mit dem
angegebenen Index in der Queue, das chronologisch erste (aelteste) Event
andernfalls
*/
SEvent CEventQueue::popEvent(unsigned short eventNumber, bool* pValid)
{
if(eventNumber<m_events.size())
{
*pValid=true;
std::vector<SEvent>::iterator it;
SEvent ret;
it=(m_events.begin() + eventNumber);
ret=*it;
m_events.erase(it);
return ret;
}
else
{
*pValid=false;
SEvent e;
e.m_eventType=UNDEFINED;
e.m_additionalInfo=0;
return e;
}
}
/*! \fn void CEventQueue::pushEvent(SEvent event)
\brief Fuegt der Queue ein Event hinzu. Sensoren und Aktoren
rufen diese Methode auf, um ueber ein Event zu informieren
\param event Hinzuzufuegendes Event
*/
void CEventQueue::pushEvent(SEvent event)
{
m_events.push_back(event);
}

View File

@ -0,0 +1,19 @@
#ifndef CEVENTQUEUE_H_
#define CEVENTQUEUE_H_
#include "SEvent.h"
#include "ArduinoSTL.h"
class CEventQueue
{
public:
std::vector<SEvent> popEvents(EVENT_TYPE eventtype=UNDEFINED);
SEvent popEvent(bool* pValid);
SEvent popEvent(unsigned short eventNumber, bool* pValid);
void pushEvent(SEvent event);
private:
std::vector<SEvent> m_events;
};
#endif /* CEVENTQUEUE_H_ */

View File

View File

@ -0,0 +1,13 @@
#ifndef CSEILMAINCONTROLLER_H_
#define CSEILMAINCONTROLLER_H_
#include
class CMainController
{
public:
private:
}
#endif /* CSEILMAINCONTROLLER_H_ */

24
Seilbahn/src/SEvent.cpp Normal file
View File

@ -0,0 +1,24 @@
#include "SEvent.h"
const char* evToStr(SEvent ev)
{
switch(ev.m_eventType)
{
case BTN_ANLAGE_EIN_AUS: return "BTN_ANLAGE_EIN_AUS";
case BTN_STATION: return "BTN_STATION";
case BTN_SERVICE: return "BTN_SERVICE";
case BTN_FAHRGAST: return "BTN_FAHRGAST";
case BTN_QUIT: return "BTN_QUIT";
case BTN_START: return "BTN_START";
case BTN_HALT: return "BTN_HALT";
case BTN_NOTHALT: return "BTN_NOTHALT";
case BTN_VORWAERTS: return "BTN_VORWAERTS";
case BTN_RUECKWAERTS: return "BTN_RUECKWAERTS";
default: return "UNDEFINED";
}
}
void printEvent(SEvent event, void* who)
{
// TBD if needed
}

28
Seilbahn/src/SEvent.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef SEVENT_H_
#define SEVENT_H_
enum EVENT_TYPE
{
BTN_ANLAGE_EIN_AUS, // Button Anlage Ein/Aus wurde gedrückt
BTN_STATION, // Button Station Besetzt/Unbesetzt wurde gedrückt
BTN_SERVICE, // Button Servicebetrieb wurde gedrückt
BTN_FAHRGAST, // Button Fahrgastbetrieb wurde gedrückt
BTN_QUIT, // Button Quittieren wurde gedrückt
BTN_START, // Button Start wurde gedrückt
BTN_HALT, // Button Halt wurde gedrückt
BTN_NOTHALT, // Button Nothalt wurde gedrückt
BTN_VORWAERTS, // Button Vorwaerts wurde gedrückt
BTN_RUECKWAERTS, // Button Rueckwaerts wurde gedrückt
UNDEFINED=999,
};
struct SEvent
{
EVENT_TYPE m_eventType;
unsigned int m_additionalInfo;
};
const char* evToStr(SEvent ev);
void printEvent(SEvent event, void* who);
#endif /* SEVENT_H_ */