From d20e9d667666d432f83f1325e1290d93cf68129d Mon Sep 17 00:00:00 2001 From: F5OEO Date: Tue, 15 Dec 2015 17:04:29 +0000 Subject: [PATCH] First blind implementation of DCF77 --- dcf77/pidcf77.c | 268 ++++++++++++++++++++++++++++++++++++++++++++++++ src/Makefile | 8 +- 2 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 dcf77/pidcf77.c diff --git a/dcf77/pidcf77.c b/dcf77/pidcf77.c new file mode 100644 index 0000000..713a7e5 --- /dev/null +++ b/dcf77/pidcf77.c @@ -0,0 +1,268 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Get main process from arduino project : CodingGhost/DCF77-Transmitter +// Generator for 77,5 kHz (DCF-77) by Jonas woerner (c) +// Thanks to Jonas +// Evariste F5OEO 2015 + +//!!!!ONLY FOR TESTING PURPOSES! +#define byte char +#define false 0 +#define true 1 + +byte dcfBits[60] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 }; + +#define anzahlMinutenBits 7 +#define anzahlStundenBits 6 +#define offsetMinutenBits 21 +#define offsetStundenBits 29 +byte MinutenBits[anzahlMinutenBits] = { 0 }; +byte StundenBits[anzahlStundenBits] = { 0 }; +int parity = 0; +int FileFreqTiming; + +void modulate(byte b); +void playtone(double Amplitude,uint32_t Timing); + +void loop() +{ + int i; + for ( i = 0;i<58;++i) + { + modulate(dcfBits[i]); + + } + +} + + +void DCF_BITS(int Minuten, int Stunden) +{ + int i; + //MINUTE + + if (Minuten > 39) + { + MinutenBits[6] = 1; + Minuten -= 40; + } + if (Minuten > 19) + { + MinutenBits[5] = 1; + Minuten -= 20; + } + + if (Minuten > 9) + { + MinutenBits[4] = 1; + Minuten -= 10; + } + + for ( i = 0; i < 4; ++i) + { + //MinutenBits[i] = (Minuten & (1 << i)) ? true : false; + + if ((Minuten & (1 << i)) > 0) + { + MinutenBits[i] = true; + } + else + { + MinutenBits[i] = false; + } + } + for ( i = 0; i < anzahlMinutenBits; ++i) + { + dcfBits[offsetMinutenBits + i] = MinutenBits[i]; + } + //Stunde + + if (Stunden > 19) + { + StundenBits[5] = 1; + Stunden -= 20; + } + if (Stunden > 9) + { + StundenBits[4] = 1; + Stunden -= 10; + } + + + + + for ( i = 0; i < 4; ++i) + { + //MinutenBits[i] = (Minuten & (1 << i)) ? true : false; + + if ((Stunden & (1 << i)) > 0) + { + StundenBits[i] = true; + } + else + { + StundenBits[i] = false; + } + } + + for ( i = 0; i < anzahlStundenBits; ++i) + { + dcfBits[offsetStundenBits + i] = StundenBits[i]; + } + + /*for (int n = 0; n < 6; ++n) + { + + }*/ + //////////////////////////// + { + parity += dcfBits[21]; + parity += dcfBits[22]; + parity += dcfBits[23]; + parity += dcfBits[24]; + parity += dcfBits[25]; + parity += dcfBits[26]; + parity += dcfBits[27]; + if (parity % 2 == 0) + { + dcfBits[28] = 0; + } + else + { + dcfBits[28] = 1; + } + parity = 0; + } + //////////////////////////// + { + parity += dcfBits[29]; + parity += dcfBits[30]; + parity += dcfBits[31]; + parity += dcfBits[32]; + parity += dcfBits[33]; + parity += dcfBits[34]; + if (parity % 2 == 0) + { + dcfBits[35] = 0; + } + else + { + dcfBits[35] = 1; + } + parity = 0; + } + ///////////////////////////// + { + parity += dcfBits[36]; + parity += dcfBits[37]; + parity += dcfBits[38]; + parity += dcfBits[39]; + parity += dcfBits[40]; + parity += dcfBits[41]; + parity += dcfBits[42]; + parity += dcfBits[43]; + parity += dcfBits[44]; + parity += dcfBits[45]; + parity += dcfBits[46]; + parity += dcfBits[47]; + parity += dcfBits[48]; + parity += dcfBits[49]; + parity += dcfBits[50]; + parity += dcfBits[51]; + parity += dcfBits[52]; + parity += dcfBits[53]; + parity += dcfBits[54]; + parity += dcfBits[55]; + parity += dcfBits[56]; + parity += dcfBits[57]; + if (parity % 2 == 0) + { + dcfBits[58] = 0; + } + else + { + dcfBits[58] = 1; + } + parity = 0; + } +} + + +void modulate(byte b) +{ + + if (b == 0) + { + playtone(32767,100000000); + + } + else + { + playtone(32767/4,200000000); + + } + +} + + + + +void playtone(double Amplitude,uint32_t Timing) +{ + + typedef struct { + double Amplitude; + uint32_t WaitForThisSample; + } samplerf_t; + samplerf_t RfSample; + + + RfSample.Amplitude=Amplitude; + RfSample.WaitForThisSample=Timing; //en 100 de nanosecond + printf("%f %ld\n",Amplitude,Timing); + write(FileFreqTiming,&RfSample,sizeof(samplerf_t)); + +} + + + +int +main(int argc, char **argv) +{ + +if (argc > 1) { + + + char *sFileFreqTiming=(char *)argv[1]; + FileFreqTiming = open(argv[1],O_WRONLY|O_CREAT); + + DCF_BITS(7,59); + loop(); + close(FileFreqTiming); + } + else + { + printf("usage : pidfc77 dcfpatern.bin\n"); + exit(0); + } + + return 0; +} + + + + diff --git a/src/Makefile b/src/Makefile index 8d2d55a..f720802 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,4 +1,4 @@ -all: ../rpitx ../pissb ../pisstv ../pifsq ../pifm ../piam +all: ../rpitx ../pissb ../pisstv ../pifsq ../pifm ../piam ../pidcf77 #CFLAGS = -Wall -g -O2 -D DIGITHIN CFLAGS = -Wall -g -O2 -Wno-unused-variable @@ -33,6 +33,11 @@ CFLAGS_Piam = -Wall -g -O2 -Wno-unused-variable LDFLAGS_Piam = -lm -lrt -lpthread -lsndfile ../piam : ../am/piam.c $(CC) $(CFLAGS_Piam) -o ../piam ../am/piam.c $(LDFLAGS_Piam) + +CFLAGS_Pidcf77 = -Wall -g -O2 -Wno-unused-variable +LDFLAGS_Pidcf77 = -lm -lrt -lpthread +../pidcf77 : ../dcf77/pidcf77.c + $(CC) $(CFLAGS_Piam) -o ../pidcf77 ../dcf77/pidcf77.c $(LDFLAGS_Piam) clean: rm -f ../rpitx ../pissb ../pisstv ../pifsq ../pifm ../piam RpiTx.o mailbox.o RpiGpio.o RpiDma.o @@ -44,3 +49,4 @@ install: all install -m 0755 ../pissb /usr/bin install -m 0755 ../pifsq /usr/bin install -m 0755 ../rpitx /usr/bin + install -m 0755 ../pidcf77 /usr/bin