home *** CD-ROM | disk | FTP | other *** search
RISC OS BBC BASIC V Source | 1994-05-04 | 10.4 KB | 373 lines |
- >AlarmDk030
- AlarmSet 0.30
- Dekodiere !Alarm-File von RISC OS 3.11
- Version 0.30
- Lade Alarmfile, teste Header
- Suche naechsten Task-Alarm
- Stelle Zeit fest
- umrechnen der Zeit nach Territory, PRM3 3-785ff
- kodiere Zeit fuer IIC-Uhr und setzte Zeit.
- Setze Alarm-Modus in der Uhr und schalte Alarm-Leitung aus.
- +8192
- globale Variablen
- >clkadr% = %10100000 :
- IIC-Adresse der Archimedes-Uhr
- =file$ = "<Alarmfile>" :
- Name und Pfad der Alarm-Datei
- buf% 32
- "Error in ";
- "*CLOSE":
- 8debug% =
- :
- Informationstexte anzeigen ?
- "XOS_ReadVarVal", "AlarmExt$Debug", buf%, -1, 0, 0
- ,,d%
- d%<>0
- debug% =
- "XWimp_ReadSysInfo", 3
- d%=0
- debug% =
- debug%
- "AlarmSet version 0.30, ABt. "
- This is to help the shutdown-routine.
- We need to know the status of the computer because we have to decide
- between desktop-shutdown and non-desktop...
- If we are in command-mode/non-desktop. We can simply call the
- switch-off function.
- We check it by the number of existing applications.
- 0 = No Desktop at all. 1 = only we are running. >1 = more apps exist.
- "Wimp_ReadSysInfo", 0
- tasknum%
- tasknum%<2
- *Set Alarm$Desktop NO
- *Set Alarm$Desktop YES
- -#a% =
- setzeTaskalarmzeit(file$)
- /*
- 1 :
- "Error: Missing Alarmfile."
- 0=
- 2 :
- "Error in Alarmfile: wrong file/format or so."
- 5O---------------------------------------------------------------------------
- _setze_Task-Alarm-Zeit
- 7I; die Routine liest die Alarm-Datei und sucht den naechste Task-Alarm
- 8C; heraus. Die Zeit wird gelesen und in die IIC-Uhr geschrieben.
- 9>; Es werden eigene fehlerstabile Dateilesebefehle benutzt.
- :A; Am Ende gibt die Routine zentral eine Fehlermeldung heraus.
- ;G; Es wird auch nicht die ganze Datei gelesen, sondern lediglich die
- <D; interessanten Stellen angefahren und jeweils ein Byte gelesen.
- ; moegliche Fehlercodes...
- ; 1 - Alarmdatei fehlt.
- ??; 2 - falsche Alarmdatei, zu kurz, falscher Header oder so.
- A-; Ein: String mit Pfad und Name der Datei
- B%; Aus: Fehlercode ( = 0 wenn ok.)
- setzeTaskalarmzeit(name$)
- err%, err$, hdl%, rec%, flag%, buf%, str%, ord%
- l%, n%, n$
- buf% 16, str% 64, ord% 40
- IF
- Wir haben ein lokales Error-System um Dateifehler abzufangen.
- JK
- Dies wird nur noch benoetigt, um ungewoehnliche Fehler abzufangen.
- L=
- "FNsetzeTaskalarmzeit: Error in ";
- err% = 0
- err$ = ""
- P;
- Oeffne Datei und teste damit ob sie vorhanden ist.
- Q6
- Der Handle ist 0, wenn Datei nicht vorhanden.
- R&
- debug%
- "File:";name$;" ";
- hdl% =
- openin(name$)
- T(
- debug%
- " Filehandle: ";hdl%
- U=
- hdl% = 0
- err% = 1: err$ = "Alarmdatei nicht da !!"
- Lade Header
- err% = 0
- n$ = ""
-
- l%=1
- n% =
- bget(hdl%)
-
- n%<0
- err% = 2
- ^/ err$ = "Alarmheader zu kurz !!"
- l% = 99
-
- n$ = n$ +
-
-
- Teste Header
- err% = 0
-
- n$ <> "ALRM"
- err% = 2
- j/ err$ = "Alarmfileformat falsch !!"
-
- n$
- Schleife durch alle Rekords
- rec% = -1: flag% =
- err% = 0
-
- rec% += 1
-
- Lese Task-Flag
- t8 err% =
- ptr(hdl%, &0E + &94 + (&97 * rec%))
-
- err% <> 0
- v5
- Fileende erreicht, normales Ende !!
- err% = -1
- x0 err$ = "Rekord-Ende erreicht !!"
- flag% =
-
- { n% =
- bget(hdl%)
-
- n% < 0
- err% = -n%
- ~3 err$ = "Lesefehler im Rekord !!"
-
- )
- Teste auf Task-Alarm
- +
- (n%
- 4) = 4
- flag%=
-
-
-
- flag%
- Wenn ein Taskalarm gefunden wurde koennen wir weitermachen.
- Wir holen dann die "lokale" Zeit aus dem Rekord.
- err% = 0
- +
- #hdl% = &0E + &0F + (&97 * rec%)
- ! ord%!24 = 256 *
- #hdl%
- ord%!24 +=
- #hdl%
- ord%!20 =
- #hdl%
- ord%!16 =
- #hdl%
- ord%!12 =
- #hdl%
- ord%!8 =
- #hdl%
- ord%!4 =
- #hdl%
- ord%!0 = 0
- *
- Nach Territory modifizieren...
- =
- "Territory_ConvertOrdinalsToTime", -1, buf%, ord%
- 1
- buf% enthaelt nun die 5Byte UTC-Zeit.
- =
- "Territory_ConvertTimeToUTCOrdinals", ,buf%, ord%
- 3
- ord% enthaelt nun die UTC in Ordinalen.
- 0
- debug%
- " Set to taskalarm ";
- Wenn kein Taskalarm gefunden wurde, setzen wir die aktuelle Zeit !!
- err% = -1
- 6
- Hole UTC-Zeit als 5 Byte Block, PRM3 1-421
- ?buf% = 3
-
- "OS_Word", 14, buf%
- 1
- buf% enthaelt nun die 5Byte UTC-Zeit.
- =
- "Territory_ConvertTimeToUTCOrdinals", ,buf%, ord%
- 3
- ord% enthaelt nun die UTC in Ordinalen.
- , ord%!0 = 0: ord%!4 = 0: ord%!8 = 0
- 0
- debug%
- " Set to current ";
- err% = 0
- Jetzt wird die Zeit eingesetzt in die Uhrenregister.
- err% = 0
-
- debug%
- @
- 5Byte UTC-Zeit in buf% in Zeitstring konvertieren
- Z
- "OS_ConvertDateAndTime", buf%, str%, 40, "%DY %MN %CE%YR.%24:%MI:%SE"
- ?l% = 13
- !
- "time : ";$str%"."
-
- '
- Alarmbuffer zusammenstellen
- +
- Zieladresse im Buffer eintragen
- buf%?0 = 9
- *
- Hundertstel Sekunden eintragen
- 8 buf%?1 = (ord%!0
- 10) + ((ord%!0
- 10)<< 4)
- !
- Sekunden (bei +17/18)
- 8 buf%?2 = (ord%!4
- 10) + ((ord%!4
- 10)<< 4)
-
- Minuten (bei +14/15)
- 8 buf%?3 = (ord%!8
- 10) + ((ord%!8
- 10)<< 4)
-
- Stunden (bei +11/12)
- 8 buf%?4 = (ord%!12
- 10) + ((ord%!12
- 10)<< 4)
-
- Tag (bei +0/1)
- 8 buf%?5 = (ord%!16
- 10) + ((ord%!16
- 10)<< 4)
-
- Monat (bei +3/4)
- 8 buf%?6 = (ord%!20
- 10) + ((ord%!20
- 10)<< 4)
-
- Alarm Timer
- buf%?7 = 0
- 8
- Zeit in Alarm-Register der IIC-Uhr schreiben
-
- putAlarm(buf%)
-
- SwitchToAlarm
-
- AlarmActivate
- Jetzt behandeln wir aufgetretene Fehler und zeigen sie an.
- err%<>0
- debug%
- ;
- "Error in FNsetzeTaskalarmzeit: Zeile ";
- -
- "erkannte Ursache: ";err%;":"err$
- #hdl%
- = err%
- N;-------------------------------------------------------------------------
- $; Filehandling mit Errorabfragen
- E; wir koenen nur durch lokale Error-Handler erreichen, den Status
- '; einer IO-Operation festzustellen.
- H; Dies ist insofern doesig, da wir alle IO-Operationen neu schreiben
- ; muessen.
- 9; Die Funktionen geben den Errorcode zurueck. 0 = ok.
- N;-------------------------------------------------------------------------
- openin(file$)
- #h%: =0:
- "FNopen: File nicht da !": =0
- h% =
- (file$)
- #h% = 0
- ptr(hdl%, off%)
- "FNptr: Fileende erreicht !!": =
- #hdl% = off%
- bget(hdl%)
- "FNbget: Fileende erreicht !": = -
- d% =
- #hdl%
- N;-------------------------------------------------------------------------
- B; IIC-Routinen - abgestimmt auf den Uhrenbaustein.
- N;-------------------------------------------------------------------------
- 8; Speichern eines Bytes an einer beliebigen Adresse.
- N;-------------------------------------------------------------------------
- poke(address%, value%)
- blk%
- blk% 2
- clkadr% = 0
- clkadr% = %10100000 :
- Default is normal clock.
- ?blk% = address%
- ?(blk%+1) = value%
- "IIC_Control", clkadr%, blk%, 2
- N;-------------------------------------------------------------------------
- G; Lesen eines Bytes von einer beliebigen Adresse. Kann auch benutzt
- '; werden, um die Adresse zu setzen.
- N;-------------------------------------------------------------------------
- peek(address%)
- blk%
- blk% 2
- clkadr% = 0
- clkadr% = %10100000 :
- Default is normal clock.
- ?blk% = address%
- "IIC_Control", clkadr% , blk%, 1 :
- write address
- "IIC_Control", clkadr%+1, blk%, 1 :
- read value
- = ?blk%
- N;-------------------------------------------------------------------------
- ?; Schreiben der aktuellen Alarmzeit aus einem 8-Byte-Buffer
- N; ACHTUNG: Das 1. Byte ist das Statusbyte und wird nicht mitgeschrieben !!
- ; pointer_char[8] buffer%
- N;-------------------------------------------------------------------------
- putAlarm(buffer%)
- old%
- buffer% <> 0
- clkadr% = 0
- clkadr% = %10100000 :
- Default is normal clock.
- D old% = ?buffer% :
- store old status
- D ?buffer% = 9 :
- set startaddress
- "IIC_Control", clkadr%, buffer%, 8 :
- write address and data
- D ?buffer% = old% :
- restore old status
- !N;-------------------------------------------------------------------------
- "<; (1) Wir schalten die Uhr auf Alarm-Modus und damit den
- #G; default- (reset-) maessigen Sekundentakt am Alarmausgang aus.
- $N;-------------------------------------------------------------------------
- SwitchToAlarm
- ' a% =
- peek(0)
- (255-1-2-4)
- a% += 4
- poke(8,0) :
- Alarm-Register : alles "aus"
- poke(0,a%) :
- Status-Register: Alarm-System "an"
- Alarm nun aktiv, Bit 0 = 0 --> Alarm = 0
- .N;-------------------------------------------------------------------------
- /"; Aktivieren des Alarm-Systems
- 03; Vorher muss
- SwitchToAlarm aufgerufen werden.
- ; Entry -
- ; Exit -
- 3N;-------------------------------------------------------------------------
- AlarmActivate
- 5Z
- poke(8,48+128) :
- Alarm-Register: NO timer, dated alarm, alarm flag & interrupt
- 8N;-------------------------------------------------------------------------
- 9$; Deaktivieren des Alarm-Systems
- :0; dies ist also nicht dasselbe wie ...init !
- ; Entry -
- ; Exit -
- =N;-------------------------------------------------------------------------
- AlarmDeactivate
- ?6
- poke(8,0) :
- Alarm-Register: alles aus
-