diff --git a/Seilbahn/src/CButton.cpp b/Seilbahn/src/CButton.cpp new file mode 100644 index 0000000..709d5e1 --- /dev/null +++ b/Seilbahn/src/CButton.cpp @@ -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; + } + } +} \ No newline at end of file diff --git a/Seilbahn/src/CButton.h b/Seilbahn/src/CButton.h new file mode 100644 index 0000000..3b8325d --- /dev/null +++ b/Seilbahn/src/CButton.h @@ -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_ */ \ No newline at end of file diff --git a/Seilbahn/src/CEventQueue.cpp b/Seilbahn/src/CEventQueue.cpp new file mode 100644 index 0000000..c9d0b82 --- /dev/null +++ b/Seilbahn/src/CEventQueue.cpp @@ -0,0 +1,94 @@ +#include "CEventQueue.h" + +/*! \fn std::vector 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 CEventQueue::popEvents(EVENT_TYPE eventType) +{ + std::vector ret; + + switch(eventType) + { + case UNDEFINED: + ret = m_events; + m_events.clear(); + break; + + default: + { + std::vector without; + for(std::vector::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::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); +} \ No newline at end of file diff --git a/Seilbahn/src/CEventQueue.h b/Seilbahn/src/CEventQueue.h new file mode 100644 index 0000000..98d5e61 --- /dev/null +++ b/Seilbahn/src/CEventQueue.h @@ -0,0 +1,19 @@ +#ifndef CEVENTQUEUE_H_ +#define CEVENTQUEUE_H_ + +#include "SEvent.h" +#include "ArduinoSTL.h" + +class CEventQueue +{ + public: + std::vector popEvents(EVENT_TYPE eventtype=UNDEFINED); + SEvent popEvent(bool* pValid); + SEvent popEvent(unsigned short eventNumber, bool* pValid); + void pushEvent(SEvent event); + + private: + std::vector m_events; +}; + +#endif /* CEVENTQUEUE_H_ */ diff --git a/Seilbahn/src/CMainController.cpp b/Seilbahn/src/CMainController.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Seilbahn/src/CMainController.h b/Seilbahn/src/CMainController.h new file mode 100644 index 0000000..d494d27 --- /dev/null +++ b/Seilbahn/src/CMainController.h @@ -0,0 +1,13 @@ +#ifndef CSEILMAINCONTROLLER_H_ +#define CSEILMAINCONTROLLER_H_ + +#include + +class CMainController +{ + public: + + private: +} + +#endif /* CSEILMAINCONTROLLER_H_ */ \ No newline at end of file diff --git a/Seilbahn/src/SEvent.cpp b/Seilbahn/src/SEvent.cpp new file mode 100644 index 0000000..dc1e259 --- /dev/null +++ b/Seilbahn/src/SEvent.cpp @@ -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 +} diff --git a/Seilbahn/src/SEvent.h b/Seilbahn/src/SEvent.h new file mode 100644 index 0000000..f295246 --- /dev/null +++ b/Seilbahn/src/SEvent.h @@ -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_ */