' 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 ...
' - die laufende Uhrzeit HH:HH:SS
' - das Tagesdatum DD/MM/YYYY
' - der deutsche  Text für "WC *FREI*"  oder "WC BESETZT"
' - der englische Text für "WC OPEN"    oder "WC in use"
'   Der Text wird durch den Status eines externen Schalters zwischen Pin 33 und GND bestimmt.
'   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
TEXT_BESETZT_EN$ = "! TOILET OCCUPIED"     'Vorbelegung für englischen Besetzt-Text
TEXT_FREI_EN$    = "! TOILET VACANT"      'Vorbelegung für englischen Frei-Text
TEXT_TIMER       = 30              'ms Verzögerung für den timer zum Oszillieren des Textes

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
TIMER1 PAUSENZEIT, HAUPT_ROUTINE 'Der Timer1 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.
'Es wird in einem Zeitinterval wechselnd enweder die laufende Zeit, das Datum
'oder eine von einem extrenen Schalter abhängige FREI bzw BESETZT Nachricht angezeigt.
'Dazu wird der Eingangspin mit dem externem Schalter abgefragt.

SEKUNDEN_ZAEHLER = SEKUNDEN_ZAEHLER + 1   'Zähler erhöhen
SELECT CASE SEKUNDEN_ZAEHLER

  CASE 1 to 15                       'Sekunde 1 bis 3
    IF TEXT_STEHT_STILL then  TIMER0 TEXT_TIMER ,BEWEGE_DEN_TEXT
    TUERSTATUS    = PIN(SCHALTER_PIN)     'TUERSTATUS ist nun 0 oder 1, je nach Schalterzustand
    IF TUERSTATUS = OFFEN       then TEXT$ = TEXT_FREI$ + TEXT_FREI_EN$   'FREI!!
    IF TUERSTATUS = GESCHLOSSEN then TEXT$ = TEXT_BESETZT$ + TEXT_BESETZT_EN$ 'BESETZT!!
    TEXT$ = TEXT$ + TEXT$ + TEXT$
    MAXSCROLL.TEXT TEXT$
  CASE 16 to 19 
    TIMER0 0
    TEXT$ = DATE$ 
    TEXT$ = REPLACE$(TEXT$, "/", ".")
    GOSUB ZEIGE_DEN_TEXT_MITTIG      
  CASE ELSE                        'alle anderen Sekunden
    TIMER0 0
    TEXT$ = TIME$                  'in TEXT$ steht nun die aktuelle Zeit
    GOSUB ZEIGE_DEN_TEXT_MITTIG    
END SELECT
SEKUNDEN_ZAEHLER  = SEKUNDEN_ZAEHLER mod 30  'SEKUNDEN_ZAEHLER BEI x 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
TEXT_STEHT_STILL = 1        ' Variable zeigt ob sich Text schon bewegt soll  
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

'==========================================================================
BEWEGE_DEN_TEXT:
'==========================================================================
 'MAXSCROLL.OSCILLATE 
 MAXSCROLL.scroll 
 TEXT_STEHT_STILL = 0 
RETURN
  
'----- last line not empty to avoid problems -----