#include <string.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "FunkUsb.h"
/************************************************************************
* Ermittlung des Modifizierten Julianischen Datums (MJD), Low-Byte *
* Diese Routine ist von 2001 bis 2099 gültig. *
* 1. Zur Überprüfung zweier aufeinanderfolgender Zeittelegramme *
* 2. Zur Ablage der Wetterinformation in den Cache24-Flashspeicher *
************************************************************************/
// Tage eines Monats
static BYTE tage(BYTE mon, BYTE year) {
if (mon==2) return 28+(!(year&3));
else return 30+((mon^mon>>3)&1);
}
// Fortlaufende Tagesnummer, wie Windows mit 1.1.1601 = 0x00
// Auf Zeitzone bezogen
BYTE ZoneMJD(const struct clocktime *t) {
BYTE i;
BYTE ret=t->year*109;
ret+=(t->year-1)>>2;
for (i=1; i<t->month; i++) ret+=tage(i,t->year);
ret+=t->day-1;
return ret+0x44;
}
// Auf MESZ bezogen
void IndexMJD(const struct clocktime *t) {
BYTE mjd=ZoneMJD(t);
BYTE h=t->hour+2-t->tz;
if (h>=24) {mjd++; h-=24;};
WetterReport.cur_mjd = mjd;
WetterReport.cur_index = t->min/3 + h*20;
}
BYTE cipher_key[10] __attribute__((section(".noinit")));
// {0x80,0x24,0xCA,0x7B,0x27,0x38,0x02,0x20,0x88,0x15};
// nur Beispiel:0x0C1011
// long dek=Decrypt(); // liefert den entschlüsselten Wert der noch interpretiert werden muss
//************** Entschlüsselung der Wetterdaten via DCF77 *****************
/* BYTE testdata[10]={0b10000000,0b00100100,0xCA,0x7B,0x27,0x38,0x02,0x20,0x88,0x15};
// 7...0, 15...8 , 23...16,...
Zielbyte Zielbits #Bits Minute Quellbits (0-basiert)
0 0..5 6 0 2..7 Wetter
0,1 6..11 6 0 9..14 Wetter
1,2,3 12..25 14 1 1..14 Wetter
3,4 26..39 14 2 1..14 Wetter
5 40..46 7 1 21..27 Minute, BCD
5 47 1 - immer Null
6 48..53 6 1 29..34 Stunde, BCD
6 54..55 2 - immer Null
7 56..61 6 1 36..41 Tag, BCD
7 62..63 2 - immer Null
8 64..68 5 1 45..49 Monat, BCD
8 69..71 3 1 42..44 Wochentag
9 72..79 8 1 50..57 Jahr, BCD
*/
void GrabWetter0(const struct frame *f) {
cipher_key[0] = f->wl>>2 | f->wh<<5&0xC0;// 2..7, 9..10
cipher_key[1] = f->wh>>3&0x0F; // 11..14
}
void GrabWetter1(const struct frame *f) {
cipher_key[1]|= f->wl<<3&0xF0; // 1..4
cipher_key[2] = f->w>>5; // 5..12
cipher_key[3] = f->wh>>5&0x03; // 13..14
// Schlüssel setzen: Mit BCD-Zahlen
cipher_key[5] = f->min&0x7F;
cipher_key[6] = f->hour&0x3F;
cipher_key[7] = f->day&0x3F;
cipher_key[8] = f->wday<<5 | f->month;
cipher_key[9] = f->year;
}
void GrabWetter2(const struct frame *f) {
static long w __attribute__((section(".noinit")));
cipher_key[3]|= f->wl<<1&0xFC; // 1..6
cipher_key[4] = f->w>>7; // 7..14
// CpuFast();
w=Decrypt();
if (w>=0) {
IndexMJD(&TimeReport.t);
((BYTE*)&w)[3] = WetterReport.cur_mjd;
flash_write(Cache24+WetterReport.cur_index,&w,4);
StatusReport.someBits|=0x20;
}
// CpuSlow();
}
Detected encoding: ANSI (CP1252) | 4
|
|