' WC-*FREI*/BESETZT-Anzeige mit X*8x8-Modulen MAX7218-Matrix
'
' Zeigt nach dem Start einmalig kurz die eigene IP-Adresse und 
' den Text "rechts", "links" und "mittig".
' Dann wird endlos mittig angezeigt ...
' - für 3 Sekunden die laufende Uhrzeit
' - für 2 Sekunden der Text "WC *FREI*"  oder "WC BESETZT"
'   je nach dem Status eines externen Schalters zwischen Pin 33 und GND.
'   Der Pin ist mit PULLUP auf 3V3 hochgezogen.
'   Bei  einer längeren Leitungen zum Schalter sollte der Pin 33
'   jedoch vorsorglich mit einem  1k-Widerstand gegen 3V3 gezogen werden.



WLOG "START"
' Definition einiger Variablen, die schon beim Start bestimmte Werte haben sollten
VERSION$         = "2.0"            'TextVariable mit der aktuellen Programmversion
'ANZEIGE_ANZAHL   = 10               'Anzahl der 8*8 Module
ANZEIGE_ANZAHL  = 8                'Anzahl der 8*8 Module
ANZEIGE_PIN      = 15               'CS-Pin der Anzeige
ANZEIGE_PIXEL    = ANZEIGE_ANZAHL*8 'Anzahl der horizontalen Pixel der Anzeige
CHAR_PIXEL       = 6                'Anzahl der Pixel für einen einzelnen Charakter
POSITION         = 0                'Variable für die Textposition (von rechts beginnend!)
SEKUNDEN_ZAEHLER = 0                'Variable für Schleifenzähler
SCHALTER_PIN     = 33               'Variable mit dem Pin an dem ein Schalter gegen GND hängt
TUERSTATUS       = 1                ' 1 = Schalter offen, O = Schalter geschlossen
OFFEN            = 1                'Variable für Statusvergleich bei offenem Schalter
GESCHLOSSEN      = 0                'Variable für Statusvergleich bei geschlossenem Schalter

TEXT_BESETZT$    = "WC BESETZT"     'Vorbelegung für Besetzt-Text
TEXT_FREI$       = "WC *FREI*"      'Vorbelegung für Frei-Text


PIN.MODE SCHALTER_PIN, INPUT, PULLUP 'Einen Pin als Eingang für den Schalter definieren
'                                 Zieht den PIN als INPUT-Pin mit einem Widerstand auf 3V3-Pegel
'                                 Der geschlossene Schalter zieht den Pin dann auf 0 Volt Pegel

'PIN.MODE SCHALTER_PIN, INPUT, PULLDOWN 'Wenn diese Zeile nicht auskommentiert ist, 
'                             simuliert dies einen geschlossenen Schalter mit Widerstand auf GND
'                             schaltet also testweise den BESETZT-Text an
WLOG "INIT Display ..."
MaxScroll.Setup ANZEIGE_ANZAHL,ANZEIGE_PIN   'Die Anzeige initialisieren


' Beim Start kurz die IP-Adresse anzeigen ------------------------------------------------------
Text$ = Word$(IP$,1)                'Die eigene IP-Adreese ist das erste Wort in dem String IP$
TEXT_PIXEL= Len(TEXT$)*CHAR_PIXEL   'Anzahl der horizontalen Pixel dieses Textes
POSITION  = TEXT_PIXEL              'damit der rechte Teil der Adresse immer zu sehen ist
GOSUB     ZEIGE_DEN_TEXT
PAUSE     1500


' Text rechts ausgeben--------------------------------------------------------------------------
TEXT$     = "rechts"
TEXT_PIXEL= Len(TEXT$)*CHAR_PIXEL      'Anzahl der horizontalen Pixel dieses Textes
POSITION  = TEXT_PIXEL                 'Position um Textlänge nach links geschoben
GOSUB     ZEIGE_DEN_TEXT
PAUSE     1000

' Text links ausgeben---------------------------------------------------------------------------
TEXT$     = "links"
TEXT_PIXEL= Len(TEXT$)*CHAR_PIXEL      'Anzahl der horizontalen Pixel für diesen Text
POSITION  = ANZEIGE_PIXEL              'Position ist gleich Anzahl der Anzeigepixel
GOSUB     ZEIGE_DEN_TEXT
PAUSE     1000

' Text mittig ausgeben--------------------------------------------------------------------------
TEXT$     = "mittig"
TEXT_PIXEL= Len(TEXT$)*CHAR_PIXEL       'Anzahl der horizontalen Pixel für diesen Text
POSITION  = (ANZEIGE_PIXEL/2)+(TEXT_PIXEL/2) 'Berechnen der mittigen  Ausgabe-Position
GOSUB     ZEIGE_DEN_TEXT
PAUSE     1000

' Nun übernimmt der Timer0 einmal pro Sekunde die regelmäßige weitere Regie
PAUSENZEIT = 1000
TIMER0 PAUSENZEIT, HAUPT_ROUTINE 'Der Timer0 ruft nun endlos alle 1000ms das Unterprgm auf

WAIT   'Ab jetzt werden nur noch Hintergrundprozesse abgewickelt;
'        hier also der timer0 und das ONHTMLRELOAD
END
' #######################################################################################
' #######################################################################################
' Hinter dem WAIT und END stehen ab hier nur noch Unterprogramme,
' die mit ihrem Namen aus dem obigen Skript-Code aufgerufen werden,
' und die jeweils mit RETURN enden müssen.


' - - - - - - -  U N T E R P R O G R A M M E   - - - - - - - - - - - -


'==========================================================================
HAUPT_ROUTINE:
'==========================================================================
'Dieses Unterprgm wird einmal pro Sekunde vom TIMER0 aufgerufen.
'Bei den ersten drei Aufrufen soll die aktuelle Zeit aufgerufen werden.
'Dann soll zwei Sekunden lang der Frei oder der Besetzt-Text angezeigt werden.
'Dazu wird der Eingangspin mit dem externem Schalter abgefragt.
SEKUNDEN_ZAEHLER = SEKUNDEN_ZAEHLER + 1'Zähler erhöhen
SELECT CASE SEKUNDEN_ZAEHLER
  CASE 1, 2, 3                        'Sekunde 1 bis 3:
    TEXT$ = TIME$                     'in TEXT$ steht nun die aktuelle Zeit
  CASE 4 , 5                          'Sekunde 4 und 5
    TUERSTATUS    = PIN(SCHALTER_PIN) 'TUERSTATUS ist nun 0 oder 1, je nach Schalterzustand
    IF TUERSTATUS = OFFEN       then TEXT$ = TEXT_FREI$    'FREI!!
    IF TUERSTATUS = GESCHLOSSEN then TEXT$ = TEXT_BESETZT$ 'BESETZT!!
END SELECT

SEKUNDEN_ZAEHLER  = SEKUNDEN_ZAEHLER mod 5  'SEKUNDEN_ZAEHLER BEI 5 wieder auf 0 setzen
GOSUB ZEIGE_DEN_TEXT_MITTIG                 'Text$ anzeigen
RETURN

'==========================================================================
ZEIGE_DEN_TEXT:
'==========================================================================
MAXSCROLL.PRINT TEXT$       'hier geht TEXT$ nur in den Puffer
MAXSCROLL.SHOW  POSITION    'Erst jetzt wird der Puffer an der Position angezeigt
WLOG            TEXT$       'Zusätzlich nur zur Rückmeldung in der Entwicklungsoberfläche
RETURN                      'Zurück zur aufrufenden Zeile

'==========================================================================
ZEIGE_DEN_TEXT_MITTIG:
'==========================================================================
TEXT_PIXEL = Len(TEXT$)*CHAR_PIXEL            'Anzahl der horizontalen Pixel für diesen Text
POSITION   = (ANZEIGE_PIXEL/2)+(TEXT_PIXEL/2) 'Berechnen der mittigen Ausgabe-Position
GOSUB      ZEIGE_DEN_TEXT
RETURN