KsSignalCharliePlexer.hpp

/* * KsSignalCharliePlexer.hpp * * Konkrete Klasse KsSignalCharliePlexer - Konfiguration für ein Ks-Signal 4045. * Die SignalBilder HALT, FAHRT, FAHRT_ZS3, HALT_ERWARTEN und FAHRT_ZS3_ZS3V. * * $Id: KsSignalCharliePlexer.hpp $ * * (C) 2022 by Martin Pischky (martin@pischky.de) * */ #ifndef KSSIGNALCHARLIEPLEXER_HPP_ #define KSSIGNALCHARLIEPLEXER_HPP_ #include <cstdint> // std::uint8_t #include <Arduino.h> // pinMode(), digitalWrite(), delayMicroseconds(), // INPUT, OUTPUT, HIGH, LOW #include "SimpleCharliePlexer.hpp" // class SimpleCharliePlexer using std::uint8_t; /** * Die konkrete Konfiguration von SimpleCharliePlexer für ein Ks-Signal 4045. */ class KsSignalCharliePlexer // @suppress("Class has a virtual method and non-virtual destructor") : public SimpleCharliePlexer<4, 11> // 4 Ports für Multiplexing, // 11 Zyklen (einige LEDs sind ungenutzt) { public: /** Die Signalbilder des Signals kodiert als Bitfolge. */ using SignalBild = LedStatus; /** Die Belegung des Viessmann Ks-Signal 4045 als Bits für den LedStatus */ enum LED { LED_W2 = 1 << 0, // Bit ist beim 4045 unbenutzt LED_KS2 = 1 << 1, // Bit 2 ist unbenutzt (1 << 2) LED_W3 = 1 << 3, // Bit ist beim 4045 unbenutzt LED_KS1 = 1 << 4, LED_ZS3 = 1 << 5, LED_W1 = 1 << 6, LED_HP0 = 1 << 7, // Bits 8 und 9 sind unbenutzt (1 << 8, 1 << 9) LED_ZS3V = 1 << 10, }; /** * Konstruktur. Parameter ist die Nummer des ersten Pins (von 4 Pins) */ explicit KsSignalCharliePlexer(uint8_t basePortNr) : basePort(basePortNr) { } protected: /** Port auf TRISTATE schalten */ void setTristate(uint8_t portNr) override { pinMode( basePort + portNr, INPUT ); } /** Port auf HIGH schalten */ void setHigh(uint8_t portNr) override { pinMode( basePort + portNr, OUTPUT ); digitalWrite( basePort + portNr, HIGH ); } /** Port auf LOW schalten */ void setLow(uint8_t portNr) override { pinMode( basePort + portNr, OUTPUT ); digitalWrite( basePort + portNr, LOW ); } /** Verzögerung der Programmausführung um angegebene Microsekunden*/ void delayMicros(uint16_t us) override { delayMicroseconds( us ); } private: const uint8_t basePort; public: // eclipse CodAn meckert hier einen fehlenen Destruktor an: //virtual ~KsSignalCharliePlexer() {}; }; // Eigentlich sollten die folgenden Ausdrücke constexpr sein: // constexpr SignalBild FAHRT_ZS3( LED_KS1 | LED_ZS3 ); // Aber ArduinoSTL 1.1.0 ist nicht konform zu C++11. /** * Signalbild "Halt": Hp0 leuchtet rot */ static const KsSignalCharliePlexer::SignalBild HALT( KsSignalCharliePlexer::LED_HP0 ); /** * Signalbild "Fahrt": Ks1 leuchtet grün */ static const KsSignalCharliePlexer::SignalBild FAHRT( KsSignalCharliePlexer::LED_KS1 ); /** * Signalbild "Fahrt mit Geschwindigkeitsanzeige": Ks1 leuchtet grün, Zs3 an */ static const KsSignalCharliePlexer::SignalBild FAHRT_ZS3( KsSignalCharliePlexer::LED_KS1 | KsSignalCharliePlexer::LED_ZS3 ); /** * Signalbild "Halt erwarten": Ks2 leuchtet gelb */ static const KsSignalCharliePlexer::SignalBild HALT_ERWARTEN( KsSignalCharliePlexer::LED_KS2 ); /** * Signalbild "Fahrt mit Zs3 Geschwindigkeitsanzeige und Geschwindigkeits- * voranzeige": Ks1 blinkt grün und Zs3 und Zs3v * Die Realisierung des Blinkens von Ks1 lassen wir als Übung für den Leser. */ static const KsSignalCharliePlexer::SignalBild FAHRT_ZS3_ZS3V( KsSignalCharliePlexer::LED_KS1 | KsSignalCharliePlexer::LED_ZS3 | KsSignalCharliePlexer::LED_ZS3V ); // Weitere Signalbilder (mit LED_W1) lassen wir als Übung. #endif // KSSIGNALCHARLIEPLEXER_HPP_