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

#pragma once

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
#define elemof(x) (sizeof(x)/sizeof(*(x)))

/* Hardware:
PB0 (5)	Akku zuschalten / laden mittels MOSFET
PB1 (6)	USB D+
PB2 (7)	USB D- = INT0 (Interrupts auch bei SOF)
PB3 (2)	DCF77-Zeitzeichensignal, LOW = Trägerabsenkung
PB4 (3)	Freigabe des Funkempfangsmoduls, LOW = aktiv
PB5 (1)	Akkuspannung messen (nur wenn PB0 = HIGH möglich)
	Erfordert „wegprogrammiertes“ RESET
*/
#define BAT_BIT 0	// Akku laden
#define BAT_INV 0	// 1 = LOW-aktiv, 0 = HIGH-aktiv
#define SIG_BIT 3	// DCF77-Trägerabsenkung
#define SIG_INV 1	// 1 = LOW-aktiv, 0 = HIGH-aktiv
#define SIG_PU  1	// Eingang benötigt PullUp?
#define ENA_BIT 4	// Empfänger-Freigabe
#define ENA_INV 1	// 1 = LOW-aktiv, 0 = HIGH-aktiv
#define ANA_BIT 5	// Analogeingang (lt. Doku geht der auch mitsamt !RESET)
			// Nützt bloß nicht allzu viel.

#ifndef __cplusplus
typedef enum{false,true} bool;
#endif

struct clocktime{
 char sec;	// Sekunde, 0..59 (Schaltsekunde: 60)
 char min;	// Minute, 0..59
 char hour;	// Stunde, 0..23
 char day;	// Tag, 1..31
 char wday;	// Wochentag, 1..7
 char month;	// Monat, 1..12
 char year;	// Jahr, 0..99
 char tz;	// Zeitzone, in Stunden (hier: 1 oder 2)
};

extern struct JoyReport{	// Länge: 4
 BYTE reportID;	// = 1
 BYTE joyKey;	// Bit 0 = Trägerabsenkung
		// Bit 7:1 = Millisekunden bis zum GetReport
 WORD timems;	// Zeitstempel als Joystick-Achse, in ms
}JoyReport;

extern struct TimeReport{	// Länge: 12
 BYTE reportID;	// = 2
 BYTE gr_delay;	// GetReport-Verzögerung
 WORD ms;	// Zehntel Millisekunden? (0..8055)
 struct clocktime t;	// Uhrzeit, Lokalzeit (nicht GMT)
}TimeReport;	// wie's vom DCF-77 kommt

extern struct SetupReport{	// Länge: 6
 BYTE reportID;	// = 3
 BYTE jh;	// Jahrhundert (für die Kalenderrechnung)
 BYTE msLow,msMid,msHigh;
 BYTE AkkuTyp;	// Low-Nibble = Akkutyp:
		// 0 = kein, 1 = LiIon, 2 = 2xNiMH, 3 = 3xNiMH, 4 = Alkali, 5 = benutzerdefiniert
		// Bit 4 = SIG negiert (mittels Histogramm)
		// Bit 5 = ENA negiert
 short Ladeschluss;	// A/D-Wert Ladeschluss, 0..1023
 short Endladeschluss;	// A/D-Wert zum Abschalten, 0..1023
}SetupReport;		// für den EEPROM

extern struct StatusReport{	// Länge: 8
 BYTE reportID;	// = 4
 BYTE someBits;		// Bit 0 = Trägerabsenkung
			// Bit 1 = Uhrzeit einfach gültig
			// Bit 2 = Uhrzeit doppelt gültig
			// Bit 4 = Neue Minute
			// Bit 5 = Neue Wetterdaten
			// Bit 6 = Neue Stunde
			// Bit 7 = Neuer Tag, Zonenzeit
 WORD timems;		// Zeitstempel, in ms
 short Akkuspannung;	// A/D-Wert, 0..1023	0x06/0x20
 short Chiptemperatur;	// A/D-Wert, 0..1023	0x0C/0x105
}StatusReport;	// Input-Report (bei jedem Trägerwechsel, oder jede Sekunde für A/D-Wert)

extern struct HistoryReport{	// Länge: 262
 BYTE reportID;	// = 5
 BYTE nMinu;	// Low-Nibble = Anzahl, High-Nibble = Schreib-Index
 unsigned long long Data[10],Okay[10];
 WORD histo[50];	// Eimerbreite 10 ms
}HistoryReport;

struct WetterReport{	// Länge: 1924 (der Rest im Flash, nicht im RAM)
 BYTE reportID;	// = 6
 BYTE cur_mjd;
 WORD cur_index;
}WetterReport;

extern WORD T0Capture;
extern WORD lastStart;
#define F_TMR (F_CPU/8/256)	// Timer-Frequenz, ergibt 8056 Hz
// PROBLEM: Beim Flash-Schreiben gehen eine Menge Timer-Interrupts flöten.
//	    Dasselbe auch bei USB-Interrupts.
// LÖSUNG:  Timer1 muss als High-Teil-Generator herhalten. (Frisst >1 mA Strom)
//	    Interruptfrequenz: F_CPU/2048/256 = 31 Hz
//	    Besser nicht bei Batteriebetrieb.

// Hält die Empfangsdaten im BCD-Format
// Das erspart long-long-Schiebeoperationen in der Firmware des 8-Bit-Controllers.
extern struct frame{
 BYTE bitno;
 union{
  BYTE data[10];
  WORD w;	// Wetterdaten als WORD
  struct{
   BYTE wl;	//	StartM	W0	W1	W2	W3	W4	W5	W6
   BYTE wh;	//	W7	W8	W9	W10	W11	W12	W13	Rufbit
   BYTE tz;	// 	ANK	MESZ	MEZ	SSek	StartZ	-	-	-	21->24
   BYTE min;	//	M1	M2	M4	M8	M10	M20	M40	MPar
   BYTE hour;	//	H1	H2	H4	H8	H10	H20	HPar	-	39->40
   BYTE day;	//	D1	D2	D4	D8	D10	D20	-	-	46->48
   BYTE wday;	//	W1	W2	W4	-	-	-	-	-	51->56
   BYTE month;	//	N1	N2	N4	N8	N10	-	-	-	61->64
   BYTE year;	//	Y1	Y2	Y4	Y8	Y10	Y20	Y40	Y80
   BYTE dpar;	//	DPar	(0)	-	-	-	-	-	-	73 = Ende
  };
 };
}frame;


extern DWORD Cache24[480];	// im Flash

void dcf77Poll(void);
BYTE ZoneMJD(const struct clocktime*);

void GrabWetter0(const struct frame*);
void GrabWetter1(const struct frame*);
void GrabWetter2(const struct frame*);
//void SaveWetter(DWORD dw, int index);
#include "flash_rw.h"
#include "crypt.h"
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded