Ich sehe gerade den Wald trotz vieler Bäume nicht.
Ich habe folgendes Problem.
Ich habe eine Hardware mit RTC die nur fallweise eingeschaltet wird (die RTC läuft ja mit der Pufferbatterie weiter kann aber keine eigene Sommerzeitsteuerung wie viele derartige Chips auch).
Da das Gerät aber nicht ständig in Betrieb ist, kann es sein, dass dieses eben lange nach dem eigentlichen Umschaltezeitpunkt aktiviert wird.
Es kann also sein, dass die eigentliche Umschaltung bereits z.B. bis zu mehreren Tagen (oder mit "Pech" auch Wochen und Monate) vorbei ist.
Daher möchte ich bei der Aktivierung des Gerätes feststellen ob eine derartige Umstellung fällig ist, die Uhr umstellen und mir eben merken, dass umgestellt wurde.
Es ist also nicht einfach nur das +/- eine Stunde stellen sondern wenn der Umschaltzeitpunkt "blöd" liegt, muss ja auch Tag, Monat und Jahr dabei berücksichtigt werden.
Als ersten Ansatz mache ich das auch so in einem groben Raster. Geht das auch einfacher.
Weil was jetzt noch fehlt ist die genauere Abhandlung des tatsächlichen Umschaltzeitpunkt (also die Zeit bis zum letzten Sonntag im März um 2 Uhr oder zum letzten Sonntag im Oktober um 3 Uhr)
Mein Ansatz schaut erstmal so aus:
Alles anzeigen
Alles anzeigen
Alles anzeigen
Ich habe folgendes Problem.
Ich habe eine Hardware mit RTC die nur fallweise eingeschaltet wird (die RTC läuft ja mit der Pufferbatterie weiter kann aber keine eigene Sommerzeitsteuerung wie viele derartige Chips auch).
Da das Gerät aber nicht ständig in Betrieb ist, kann es sein, dass dieses eben lange nach dem eigentlichen Umschaltezeitpunkt aktiviert wird.
Es kann also sein, dass die eigentliche Umschaltung bereits z.B. bis zu mehreren Tagen (oder mit "Pech" auch Wochen und Monate) vorbei ist.
Daher möchte ich bei der Aktivierung des Gerätes feststellen ob eine derartige Umstellung fällig ist, die Uhr umstellen und mir eben merken, dass umgestellt wurde.
Es ist also nicht einfach nur das +/- eine Stunde stellen sondern wenn der Umschaltzeitpunkt "blöd" liegt, muss ja auch Tag, Monat und Jahr dabei berücksichtigt werden.
Als ersten Ansatz mache ich das auch so in einem groben Raster. Geht das auch einfacher.
Weil was jetzt noch fehlt ist die genauere Abhandlung des tatsächlichen Umschaltzeitpunkt (also die Zeit bis zum letzten Sonntag im März um 2 Uhr oder zum letzten Sonntag im Oktober um 3 Uhr)
Mein Ansatz schaut erstmal so aus:
BASCOM-Quellcode
- Function SwitchSummertime() As Byte
- Local fH As Byte
- Local fM As Byte
- Local fD As Byte
- Local fWD As Byte
- Local fX As Byte
- Local fY As Byte
- Local fZ As Byte
- Local fW As Word
- fH = 255
- fM = 255
- fD = 255
- fY = 255
- fWD = 255
- fW = AppConfig(AppConfig_Century) * 100
- fW = fW + _year
- If AppConfig(AppConfig_IsSummertime) = 0 Then ' Normalzeit aktiv
- If _Month > 3 And _Month < 10 Then ' jedenfalls SZ
- fH = _hour + 1
- If fH > 23 Then
- fH = 0
- fX = MonthDayCount(fW , _Month)
- fD = _day + 1
- fWD = RTC_Weekday
- fWD = fWD + 1
- If fWD > 7 Then
- fWD = 1
- End If
- If fD > fX Then
- fD = 1
- fM = _Month + 1
- If fM > 12 Then
- fM = 1
- fY = _year + 1
- If fY > 99 Then
- fY = 0
- End If
- End If
- End If
- End If
- AppConfig(AppConfig_IsSummertime) = 1
- End If
- Else ' Sommerzeit aktiv
- If _Month > 10 And _Month < 3 Then ' jedenfalls NZ
- fH = _hour - 1
- If fH > 23 Then
- fH = 23
- fZ = _Month - 1
- If fZ = 0 Then
- fZ = 12
- fM = 1
- fY = _year - 1
- If fY > 99 Then
- fY = 99
- End If
- End If
- fX = MonthDayCount(fW , fZ)
- fD = _day - 1
- fWD = RTC_Weekday
- fWD = fWD - 1
- If fWD > 7 Then
- fWD = 7
- End If
- If fD = 0 Then
- fD = fX
- fM = fZ
- End If
- End If
- AppConfig(AppConfig_IsSummertime) = 0
- End If
- End If
BASCOM-Quellcode
- Function MonthDayCount(ByVal pMonth As Byte , _
- ByVal pYear As Word) As Byte
- Local fX As Byte
- Local fM As Word
- fM = &B0001010110101010
- If pMonth = 2 Then ' Februar
- fX = Is_Leapyear(pYear)
- fX = 28 + fX
- Else ' alle anderen Monate
- If pMonth = 0 Or pMonth > 12 Then
- fX = 255
- Else
- fX = 30 + fM.pMonth
- End If
- End If
- MonthDayCount = fX
- End Function
BASCOM-Quellcode
- Function Is_Leapyear(ByVal pYear As Word) As Byte
- Local fW As Word
- Local fYear As Word
- Local fR As Byte
- fR = 0
- If pYear < 1000 Then
- fYear = AppConfig(AppConfig_Century) * 100
- fYear = fYear + pYear
- Else
- fYear = pYear
- End If
- fW = fYear Mod 4
- If fW = 0 Then
- fW = fYear Mod 100
- If fW <> 0 Then
- fR = 1
- Else
- fW = fYear Mod 400
- If fW = 0 Then
- fR = 1
- End If
- End If
- End If
- Is_Leapyear = fR
- End Function