Source file: /~heha/basteln/PC/FunkUsb/FunkUsb.zip/FunkUsb/ve/Wetter.c

#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
Wrong umlauts? - Assume file is ANSI (CP1252) encoded