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_