First blind implementation of DCF77

This commit is contained in:
F5OEO 2015-12-15 17:04:29 +00:00
parent c70d7c4a3f
commit d20e9d6676
2 changed files with 275 additions and 1 deletions

268
dcf77/pidcf77.c Normal file
View File

@ -0,0 +1,268 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdarg.h>
#include <stdint.h>
#include <math.h>
#include <time.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
// 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;
}

View File

@ -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