SpDrS60 Stellwerkssimulation Stellwerkssimulation zu Verwendung in bliebigen Schienensystemen
besetztmelder.cpp
1/*Library für die Steuerung eines SpDrS60-Gleisbildstellpults
2 * mit dieser Library können Weichen, Signale etc. gesteuert werden
3 * Lennart Klüner 05.09.2020
4 */
5
6#include "Arduino.h"
7#include "Besetztmelder.h"
8#include "WeichenControl.h"
9
10// Methoden der Klasse besetztmelder
11Besetztmelder::Besetztmelder(int gleisPin, int ledGelb, int ledRot, int weichenbesetztmelder, int registerPin[4])
12 : Actor(registerPin[0], registerPin[1], registerPin[2], registerPin[3])
13{
14 _gleisPin = gleisPin;
15 _ledGelb = ledGelb;
16 _ledRot = ledRot;
17 _weichenbesetztmelder = weichenbesetztmelder;
18 pinMode(_gleisPin, INPUT_PULLUP);
19 pinMode(_ledGelb, OUTPUT);
20 pinMode(_ledRot, OUTPUT);
21}
22boolean Besetztmelder::besetztmelderAuslesen(boolean besetztmelderBeleuchtung, WeichenControl WeichenControl)
23{
24 // der Status des Besetztmelders wird eingelesen
25 _besetztmelderLicht = besetztmelderBeleuchtung;
26 _besetztmelderstatus = digitalRead(_gleisPin);
27 if (_weichenbesetztmelder != 0)
28 {
29 WeichenControl.setWeicheBesetzt(_weichenbesetztmelder - 1, _besetztmelderstatus);
30 }
31 else
32 {
33 if (_besetztmelderstatus == false && (_besetztmelderLicht || _fahrstrassenelement)) // wenn das Gleis nicht besetzt ist und die Anzeige an ist, oder wenn der Besetztmelder Teil einer Fahrstraße ist
34 {
35 Actor::digitalSchalten(_ledRot, LOW); // sonst schalte die rote aus
36 digitalSchalten(_ledGelb, HIGH); // und die gelbe Led an
37 }
38 else if (!_besetztmelderstatus && !_besetztmelderLicht && !_fahrstrassenelement) // wird keine anzeige benötigt,
39 {
40 digitalSchalten(_ledRot, LOW); // schalte alle Leds aus
41 digitalSchalten(_ledGelb, LOW);
42 }
43 else // wenn das Gleis besetzt ist(_besetztmeldestatus == 1)
44 {
45 digitalSchalten(_ledGelb, LOW); // schalte die gelbe aus
46 digitalSchalten(_ledRot, HIGH); // und die rote Led ein
47 }
48 }
49 return _besetztmelderstatus; //_besetztmelderstatus; //gibt am ende den Status des Besetztmelder zurück
50}
51
52boolean Besetztmelder::besetztmelderAuslesen(boolean besetztmelderBeleuchtung, Weiche *weiche = nullptr)
53{
54 // der Status des Besetztmelders wird eingelesen
55 _besetztmelderLicht = besetztmelderBeleuchtung;
56 _besetztmelderstatus = digitalRead(_gleisPin);
57 //Serial.println(_weichenbesetztmelder);
58 //if (_weichenbesetztmelder > 0)
59 if(weiche != nullptr)
60 {
61 weiche->setWeichebesetzt(_besetztmelderstatus);
62 }
63 else
64 {
65 if (_besetztmelderstatus == false && (_besetztmelderLicht || _fahrstrassenelement)) // wenn das Gleis nicht besetzt ist und die Anzeige an ist, oder wenn der Besetztmelder Teil einer Fahrstraße ist
66 {
67 Actor::digitalSchalten(_ledRot, LOW); // sonst schalte die rote aus
68 digitalSchalten(_ledGelb, HIGH); // und die gelbe Led an
69 }
70 else if (!_besetztmelderstatus && !_besetztmelderLicht && !_fahrstrassenelement) // wird keine anzeige benötigt,
71 {
72 digitalSchalten(_ledRot, LOW); // schalte alle Leds aus
73 digitalSchalten(_ledGelb, LOW);
74 }
75 else // wenn das Gleis besetzt ist(_besetztmeldestatus == 1)
76 {
77 digitalSchalten(_ledGelb, LOW); // schalte die gelbe aus
78 digitalSchalten(_ledRot, HIGH); // und die rote Led ein
79 }
80 }
81 return _besetztmelderstatus; //_besetztmelderstatus; //gibt am ende den Status des Besetztmelder zurück
82}
83
84void Besetztmelder::setBesetztmelderLicht(boolean newbesetztmelderLicht) // ein und ausschalten der Beleuchtung der Besetztmelder
85{
86 _besetztmelderLicht = newbesetztmelderLicht;
87}
88
89void Besetztmelder::setFahrstrassenelement(int fahrstrassennr, boolean fahrstrassenelement) // nr der Fahrstraße, soll es zu einem Fahrstraßenelement werden oder nicht
90{
91 if (_fahrstrasse == 0) // wenn der Melder nicht beansprucht ist
92 {
93 _fahrstrassenelement = fahrstrassenelement; // kann sie von einer anderen Fahrstraße festgelgt werden, diese wird gespeichert
94 _fahrstrasse = fahrstrassennr; // und die Fahrstraße entsprechend festgelegen
95 }
96 else if (fahrstrassennr == _fahrstrasse)
97 {
98 _fahrstrassenelement = fahrstrassenelement; // der Status, ob die weiche festgelegt wurde wird geänder
99 if (_fahrstrassenelement == 0)
100 _fahrstrasse = 0; // wenn die Fahrstraße nicht mehr beansprucht ist, kann sie von allen anderen Fahrstraßen verendet werden
101 }
102}
103
105{
106 return _fahrstrassenelement;
107}
108
110{
111 return _gleisPin;
112}
Definition: Actor.h:21
void digitalSchalten(int PinNr, boolean newPinStatus)
Definition: Actor.cpp:31
void setBesetztmelderLicht(boolean newBesetztmelderStatus)
Besetztmelder(int gleisPin, int ledGelb, int ledRot, int Weichenbesetztmelder, int registerPin[4])
boolean getFahrstrassenelement()
void setFahrstrassenelement(int fahrstrassennr, boolean Fahrstrassenelement)
boolean besetztmelderAuslesen(boolean besetztmelderBeleuchtung, class WeichenControl WeichenControl)
Definition: Weiche.h:23