From 35d04dcc623aa448d7e4758bf5b768037e45b96d Mon Sep 17 00:00:00 2001 From: F5OEO Date: Thu, 1 Nov 2018 16:45:08 +0000 Subject: [PATCH] Clean and add tests --- BBC.jpg | Bin 0 -> 17447 bytes setTime.py => Not_working_with_v2/setTime.py | 0 setup.py => Not_working_with_v2/setup.py | 0 snapsstv.sh | 2 +- src/Makefile | 4 +- src/RpiTx.c | 1653 ------------------ src/RpiTx.h | 29 - src/opera/opera.cpp | 9 +- ssb.sh | 2 - sv1afnfilter.sh | 2 + testam.sh | 4 +- testcard.rgb | Bin 245760 -> 0 bytes testchirp.sh | 2 + testfm.sh | 6 +- testfreedv.sh | 2 + testfsq.sh | 3 +- testopera.sh | 2 +- testpocsag.sh | 2 +- testspectrum.sh | 2 + testssb.sh | 3 +- testsstv.sh | 3 +- testvfo.sh | 2 +- transponder.sh | 1 + 23 files changed, 30 insertions(+), 1703 deletions(-) create mode 100644 BBC.jpg rename setTime.py => Not_working_with_v2/setTime.py (100%) rename setup.py => Not_working_with_v2/setup.py (100%) delete mode 100644 src/RpiTx.c delete mode 100644 src/RpiTx.h delete mode 100755 ssb.sh delete mode 100644 testcard.rgb create mode 100755 testchirp.sh create mode 100755 testfreedv.sh create mode 100755 testspectrum.sh diff --git a/BBC.jpg b/BBC.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17eb23fdf41b721ad15b81cb23dea752c1641f21 GIT binary patch literal 17447 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 literal 0 HcmV?d00001 diff --git a/setTime.py b/Not_working_with_v2/setTime.py similarity index 100% rename from setTime.py rename to Not_working_with_v2/setTime.py diff --git a/setup.py b/Not_working_with_v2/setup.py similarity index 100% rename from setup.py rename to Not_working_with_v2/setup.py diff --git a/snapsstv.sh b/snapsstv.sh index 11f5a54..f1fb2a9 100755 --- a/snapsstv.sh +++ b/snapsstv.sh @@ -1,6 +1,6 @@ raspistill -w 320 -h 256 -o picture.jpg -t 1 convert -depth 8 picture.jpg picture.rgb -sudo ./pisstv picture.rgb 144.5e6 +sudo ./pisstv picture.rgb 434e6 diff --git a/src/Makefile b/src/Makefile index 65d2e0e..a8391d3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,4 +1,3 @@ -#all: ../rpitx ../pissb ../pisstv ../pifsq ../pifm ../piam ../pidcf77 all: ../pisstv ../piopera ../pifsq ../pichirp ../sendiq ../tune ../freedv ../dvbrf ../pocsag ../spectrumpaint CFLAGS = -Wall -g -O2 -Wno-unused-variable @@ -66,7 +65,8 @@ LDFLAGS_Pidcf77 = librpitx/src/librpitx.a -lm -lrt -lpthread $(CC) $(CFLAGS_Piam) -o ../pidcf77 ../dcf77/pidcf77.c $(LDFLAGS_Piam) clean: - rm -f ../dvbrf ../rpitx ../pissb ../pisstv ../pifsq ../pifm ../piam ../pidcf77 ../pichirp ../tune ../freedv RpiTx.o mailbox.o RpiGpio.o RpiDma.o + rm -f ../dvbrf ../sendiq ../pissb ../pisstv ../pifsq ../pifm ../piam ../pidcf77 ../pichirp ../tune ../freedv ../piopera ../spectrumpaint ../pocsag + install: all install -m 0755 ../pisstv /usr/bin diff --git a/src/RpiTx.c b/src/RpiTx.c deleted file mode 100644 index 0013128..0000000 --- a/src/RpiTx.c +++ /dev/null @@ -1,1653 +0,0 @@ -/* - - - - Copyright (C) 2015 Evariste COURJAUD F5OEO (evaristec@gmail.com) - - Transmitting on HF band is surely not permitted without license (Hamradio for example). - Usage of this software is not the responsability of the author. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - - Thanks to first test of RF with Pifm by Oliver Mattos and Oskar Weigl - INSPIRED BY THE IMPLEMENTATION OF PIFMDMA by Richard Hirst December 2012 - Helped by a code fragment by PE1NNZ (http://pe1nnz.nl.eu.org/2013/05/direct-ssb-generation-on-pll.html) - */ - -/* ================== TODO ===================== -Optimize CPU on PWMFrequency -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//#include "utils.h" -#include "mailbox.h" -#include -#include //Used for UART -#include "RpiGpio.h" -#include "RpiDma.h" -#include - -#include "RpiTx.h" - -#include -#include -#include -#include - -#define AMP_BYPAD - -//Minimum Time in us to sleep -#define KERNEL_GRANULARITY 4000 - -#define SCHED_PRIORITY 30 //Linux scheduler priority. Higher = more realtime - - -#define PROGRAM_VERSION "0.3" - -#define PLL_FREQ_500MHZ 500000000 // PLLD is running at 500MHz -#define PLL_500MHZ 0x6 - -//#define PLL_FREQ_1GHZ 1000000000 //PLLC = 1GHZ -//#define PLL_1GHZ 0x5 - -#define PLL_FREQ_1GHZ 1100000000 //PLL = 1GHZ -#define PLL_1GHZ 0x6 //PLLD = 1GHZ ONLY AFTER APLYINg DT-BLOB.BIN !!!! WARNING !!! - - -#define PLLFREQ_192 19200000 //PLLA = 19.2MHZ -#define PLL_192 0x1 - -#define HEADER_SIZE 44 - -// DMA TIMING : depends on Pi Model : Calibration is better -int FREQ_DELAY_TIME=0; -float FREQ_MINI_TIMING=157; - -float DelayStep=157; -float DelayMini=1200; - -int PWMF_MARGIN = 2496;//1120; //A Margin for now at 1us with PCM ->OK -double globalppmpll=0; - - -uint32_t *Shuffle[PWM_STEP_MAXI]; - -typedef unsigned char uchar; // 8 bit -typedef unsigned short uint16; // 16 bit -typedef unsigned int uint; // 32 bits - -//F5OEO Variable -uint32_t PllFreq500MHZ; -uint32_t PllFreq1GHZ; -uint32_t PllFreq19MHZ; - -uint32_t PllUsed; -char PllNumber; -double TuneFrequency=62500000; -unsigned char FreqDivider=2; -int DmaSampleBurstSize=1000; -int NUM_SAMPLES=NUM_SAMPLES_MAX; -int Randomize=1; - -uint32_t GlobalTabPwmFrequency[50]; - -unsigned int CalibrationTab[200]; - #include "calibrationpi2.h" - #include "calibrationpi3.h" - #include "calibrationpizero.h" - - -//End F5OEO - -char EndOfApp=0; -unsigned char loop_mode_flag=0; -char *FileName = 0; -int FileInHandle = -1; //Handle in Transport Stream File -int useStdin = 0; - -static void udelay(int us) -{ - struct timespec ts = { 0, us * 1000 }; - - nanosleep(&ts, NULL); -} - -static void stop_dma(void) -{ - - if (FileInHandle != -1) { - close(FileInHandle); - FileInHandle = -1; - } - if (dma_reg) { - //Stop Main DMA - //STop DMA - dma_reg[DMA_CS+DMA_CHANNEL*0x40] |= DMA_CS_ABORT; - udelay(100); - dma_reg[DMA_CS+DMA_CHANNEL*0x40]&= ~DMA_CS_ACTIVE; - dma_reg[DMA_CS+DMA_CHANNEL*0x40] |= DMA_CS_RESET; - udelay(100); - - - //printf("Reset DMA Done\n"); - clk_reg[GPCLK_CNTL] = 0x5A << 24 | 0 << 9 | 1 << 4 | 6; //NO MASH !!! - udelay(500); - gpio_reg[GPFSEL0] = (gpio_reg[GPFSEL0] & ~(7 << 12)) | (0 << 12); //DISABLE CLOCK - - clk_reg[PWMCLK_CNTL] = 0x5A000006 | (0 << 9) ; - udelay(500); - clk_reg[PCMCLK_CNTL] = 0x5A000006; - udelay(500); - //printf("Resetpcm Done\n"); - pwm_reg[PWM_DMAC] = 0; - udelay(100); - pwm_reg[PWM_CTL] = PWMCTL_CLRF; - udelay(100); - //printf("Reset pwm Done\n"); - } - if (mbox.virt_addr != NULL) { - unmapmem(mbox.virt_addr, NUM_PAGES * PAGE_SIZE); - //printf("Unmapmem Done\n"); - mem_unlock(mbox.handle, mbox.mem_ref); - //printf("Unmaplock Done\n"); - mem_free(mbox.handle, mbox.mem_ref); - //printf("Unmapfree Done\n"); - } -} - -static void terminate(int dummy) -{ - stop_dma(); - //munmap(virtbase,NUM_PAGES * PAGE_SIZE); - printf("END OF PiTx\n"); - exit(1); -} - -static void fatal(char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - terminate(0); -} - -void setSchedPriority(int priority) -{ - //In order to get the best timing at a decent queue size, we want the kernel to avoid interrupting us for long durations. - //This is done by giving our process a high priority. Note, must run as super-user for this to work. - struct sched_param sp; - int ret; - - sp.sched_priority=priority; - if ((ret = pthread_setschedparam(pthread_self(), SCHED_RR, &sp))) { - printf("Warning: pthread_setschedparam (increase thread priority) returned non-zero: %i\n", ret); - } - -} - -uint32_t DelayFromSampleRate=0; -int Instrumentation=0; -int UsePCMClk=1; ////GPIO CLK output is now default -uint32_t Originfsel=0; -uint32_t Originfsel2=0; - -int SetupGpioClock(uint32_t SymbolRate,double TuningFrequency) -{ - char MASH=1; - - if(UsePCMClk==0) TuningFrequency=TuningFrequency*2; - printf("Gpioclokc Tuning=%f\n",TuningFrequency); - if((TuningFrequency>=250e6)&&(TuningFrequency<=400e6)) - { - MASH=1; - } - if(TuningFrequency<250e6) - { - MASH=3; - } - - printf("MASH %d Freq PLL# %d\n",MASH,PllNumber); - Originfsel=gpio_reg[GPFSEL0]; // Warning carefull if FSEL is used after !!!!!!!!!!!!!!!!!!!! - Originfsel2=gpio_reg[GPFSEL2]; // Warning carefull if FSEL is used after !!!!!!!!!!!!!!!!!!!! - - // ------------------- MAKE MAX OUTPUT CURRENT FOR GPIO ----------------------- - char OutputPower=7; - pad_gpios_reg[PADS_GPIO_0] = 0x5a000000 + (OutputPower&0x7) + (1<<4) + (0<<3); // Set output power for I/Q GPIO18/GPIO19 - #define PULL_OFF 0 - #define PULL_DOWN 1 - #define PULL_UP 2 - gpio_reg[GPPUD]=PULL_OFF; - udelay(100); - gpio_reg[GPPUDCLK0]=(1<<4); //GPIO CLK is GPIO 4 - udelay(100); - gpio_reg[GPPUDCLK0]=(0); //GPIO CLK is GPIO 4 - - - if(UsePCMClk==1) - { - gpio_reg[GPFSEL0] = (Originfsel & ~(7 << 12)) | (4 << 12); //ENABLE CLOCK ON GPIO CLK - //Could add on other GPIOCLK to transmit - //gpio_reg[GPFSEL2] = (Originfsel2 & ~(3 )) | ( 2); //ENABLE CLOCK ON GPIO CLK on GPIO 20 / ALT 5 - } - -#ifdef USE_PCM - //------------------- Init PCM ------------------ - pcm_reg[PCM_CS_A] = 1; // Disable Rx+Tx, Enable PCM block - udelay(100); - clk_reg[PCMCLK_CNTL] = 0x5A000000|PLL_1GHZ; // Source=PLLC (1GHHz) STOP PLL - udelay(1000); - static uint32_t FreqDividerPCM; - static uint32_t FreqFractionnalPCM; - int NbStepPCM = 25; // Should not exceed 1000 : - - FreqDividerPCM=(int) ((double)PllFreq1GHZ/(SymbolRate*NbStepPCM/**PwmNumberStep*/)); - FreqFractionnalPCM=4096.0 * (((double)PllFreq1GHZ/(SymbolRate*NbStepPCM/**PwmNumberStep*/))-FreqDividerPCM); - - printf("SampleRate=%d\n",SymbolRate); - if((FreqDividerPCM>4096)||(FreqDividerPCM<2)) printf("Warning : SampleRate is not valid\n"); - clk_reg[PCMCLK_DIV] = 0x5A000000 | ((FreqDividerPCM)<<12) | FreqFractionnalPCM; - udelay(1000); - //printf("Div PCM %d FracPCM %d\n",FreqDividerPCM,FreqFractionnalPCM); - - DelayFromSampleRate=(1e9/(SymbolRate)); - - pcm_reg[PCM_TXC_A] = 0<<31 | 1<<30 | 0<<20 | 0<<16; // 1 channel, 8 bits - udelay(100); - - //printf("Nb PCM STEP (<1000):%d\n",NbStepPCM); - pcm_reg[PCM_MODE_A] = (NbStepPCM-1)<<10; // SHOULD NOT EXCEED 1000 !!! - udelay(100); - pcm_reg[PCM_CS_A] |= 1<<4 | 1<<3; // Clear FIFOs - udelay(100); - pcm_reg[PCM_DREQ_A] = 64<<24 | /*64<<8 |*/ 64<<8 ; //TX Fifo PCM=64 DMA Req when one slot is free? - udelay(100); - pcm_reg[PCM_CS_A] |= 1<<9; // Enable DMA - udelay(1000); - clk_reg[PCMCLK_CNTL] = 0x5A000010 |(1 << 9)| PLL_1GHZ /*PLL_1GHZ*/; // Source=PLLC and enable - udelay(100); - pcm_reg[PCM_CS_A] |= 1<<2; //START TX PCM -#endif - // FIN PCM - - //INIT PWM in Serial Mode : WE USE PWM OUPUT - if(UsePCMClk==0) - { - gpioSetMode(18, 2); /* set to ALT5, PWM1 : RF On PIN */ - - pwm_reg[PWM_CTL] = 0; - clk_reg[PWMCLK_CNTL] = 0x5A000000 | (MASH << 9) |PllNumber/*PLL_1GHZ*/ ; - udelay(300); - clk_reg[PWMCLK_DIV] = 0x5A000000 | (2<<12); //WILL BE UPDATED BY DMA - udelay(300); - clk_reg[PWMCLK_CNTL] = 0x5A000010 | (MASH << 9) | PllNumber /*PLL_1GHZ*/; //MASH3 : A TESTER SI MIEUX en MASH1 - //MASH 3 doesnt seem work above 80MHZ, back to MASH1 - pwm_reg[PWM_RNG1] = 32;// 250 -> 8KHZ - udelay(100); - pwm_reg[PWM_RNG2] = 32;// 32 Mandatory for Serial Mode without gap - - pwm_reg[PWM_FIFO]=0xAAAAAAAA; - pwm_reg[PWM_DMAC] = PWMDMAC_ENAB | PWMDMAC_THRSHLD; - udelay(100); - pwm_reg[PWM_CTL] = PWMCTL_CLRF; - udelay(100); - pwm_reg[PWM_CTL] = PWMCTL_USEF1| PWMCTL_MODE1| PWMCTL_PWEN1|PWMCTL_RPTL1; //PWM0 in Repeat mode - } - // FIN INIT PWM - - //******************* INIT CLK MODE : WE OUTPUT CLK INSTEAD OF PWM OUTPUT - if(UsePCMClk==1) - { - clk_reg[GPCLK_CNTL] = 0x5A000000 | (MASH << 9) |PllNumber/*PLL_1GHZ*/ ; - udelay(300); - clk_reg[GPCLK_DIV] = 0x5A000000 | (2<<12); //WILL BE UPDATED BY DMA !! CAREFUL NOT DIVIDE BY 2 LIKE PWM - udelay(300); - clk_reg[GPCLK_CNTL] = 0x5A000010 | (MASH << 9) | PllNumber /*PLL_1GHZ*/; //MASH3 : A TESTER SI MIEUX en MASH1 - } - - - ctl = (struct control_data_s *)virtbase; // Struct ctl is mapped to the memory allocated by RpiDMA (Mailbox) - dma_cb_t *cbp = ctl->cb; - - uint32_t phys_pwm_fifo_addr = 0x7e20c000 + 0x18;//PWM Fifo - uint32_t phys_pwm_range_addr = 0x7e20c000 + 0x10;//PWM Range - uint32_t phys_clock_div_addr = 0x7e101074;//CLOCK Frequency Setting - uint32_t phys_pwm_clock_div_addr = 0x7e1010a4; //CLK PWM - uint32_t phys_gpio_set_addr = 0x7e20001c; - uint32_t phys_gpio_clear_addr = 0x7e200028; - uint32_t dummy_gpio = 0x7e20b000; - uint32_t phys_pcm_fifo_addr = 0x7e203004; - uint32_t phys_gpio_pads_addr =0x7e10002c; - uint32_t phys_pcm_clock = 0x7e10109c ; - uint32_t phys_pcm_clock_div_addr = 0x7e10109c;//CLOCK Frequency Setting - - uint32_t phys_gpfsel = 0x7E200000 ; - int samplecnt; - - - for (samplecnt = 0; samplecnt < NUM_SAMPLES ; samplecnt++) - { - //At Same Time Init Samples - if(UsePCMClk==0) - { - ctl->sample[samplecnt].Amplitude2=0x0; - } - else - { - ctl->sample[samplecnt].Amplitude2=(Originfsel & ~(7 << 12)) | (0 << 12); //Pin is in - } - ctl->sample[samplecnt].Amplitude1=0x5a000000 + (0&0x7) + (1<<4) + (0<<3); - - -//@0 - //Set Amplitude by writing to PWM_SERIAL via PADS - cbp->info = 0;//BCM2708_DMA_NO_WIDE_BURSTS | BCM2708_DMA_WAIT_RESP ; - cbp->src = mem_virt_to_phys(&ctl->sample[samplecnt].Amplitude1); - cbp->dst = phys_gpio_pads_addr; - cbp->length = 4; - cbp->stride = 0; - cbp->next = mem_virt_to_phys(cbp + 1); - cbp++; -//@1 - //Set Amplitude by writing to PWM_SERIAL via Patern - cbp->info = 0;//BCM2708_DMA_NO_WIDE_BURSTS | BCM2708_DMA_WAIT_RESP ; - cbp->src = mem_virt_to_phys(&ctl->sample[samplecnt].Amplitude2); - if(UsePCMClk==0) - cbp->dst = phys_pwm_fifo_addr; - if(UsePCMClk==1) - cbp->dst = phys_gpfsel; - cbp->length = 4; - cbp->stride = 0; - cbp->next = mem_virt_to_phys(cbp + 1); - cbp++; -//2 - //Set PWMFrequency - cbp->info =/*BCM2708_DMA_NO_WIDE_BURSTS*/ BCM2708_DMA_SRC_INC|BCM2708_DMA_NO_WIDE_BURSTS; - // BCM2708_DMA_WAIT_RESP : without 160ns, with 300ns - cbp->src = mem_virt_to_phys(&ctl->sample[samplecnt].FrequencyTab[0]); - if(UsePCMClk==0) - cbp->dst = phys_pwm_clock_div_addr; - if(UsePCMClk==1) - cbp->dst = phys_clock_div_addr; - cbp->length = 4; //Be updated by main DMA - cbp->stride = 0; - cbp->next = mem_virt_to_phys(cbp + 1); - cbp++; - } - - cbp--; - cbp->next = mem_virt_to_phys((void*)virtbase); - - - // ------------------------------ END DMA INIT --------------------------------- - - dma_reg[DMA_CS+DMA_CHANNEL*0x40] = BCM2708_DMA_RESET; - udelay(1000); - dma_reg[DMA_CS+DMA_CHANNEL*0x40] = BCM2708_DMA_INT | BCM2708_DMA_END; - udelay(100); - dma_reg[DMA_CONBLK_AD+DMA_CHANNEL*0x40]=mem_virt_to_phys((void *)virtbase ); - udelay(100); - dma_reg[DMA_DEBUG+DMA_CHANNEL*0x40] = 7; // clear debug error flags - udelay(100); - - return 1; -} - -#define ln(x) (log(x)/log(2.718281828459045235f)) - - -// Again some functions taken gracefully from F4GKR : https://github.com/f4gkr/RadiantBee - -//Normalize to [-180,180): -inline double constrainAngle(double x){ - x = fmod(x + M_PI,2*M_PI); - if (x < 0) - x += 2*M_PI; - return x - M_PI; -} -// convert to [-360,360] -inline double angleConv(double angle){ - return fmod(constrainAngle(angle),2*M_PI); -} -inline double angleDiff(double a,double b){ - double dif = fmod(b - a + M_PI,2*M_PI); - if (dif < 0) - dif += 2*M_PI; - return dif - M_PI; -} - -inline double unwrap(double previousAngle,double newAngle){ - return previousAngle - angleDiff(newAngle,angleConv(previousAngle)); -} - - -int arctan2(int y, int x) // Should be replaced with fast_atan2 from rtl_fm -{ - int abs_y = abs(y); - int angle; - if((x==0)&&(y==0)) return 0; - if(x >= 0){ - angle = 45 - 45 * (x - abs_y) / ((x + abs_y)==0?1:(x + abs_y)); - } else { - angle = 135 - 45 * (x + abs_y) / ((abs_y - x)==0?1:(abs_y - x)); - } - return (y < 0) ? -angle : angle; // negate if in quad III or IV -} - -void IQToFreqAmp(int I,int Q,double *Frequency,int *Amp,int SampleRate) -{ - double phase; - static double prev_phase = 0; - - *Amp=round(sqrt( I*I + Q*Q)/sqrt(2)); - //*Amp=*Amp*3; // Amp*5 pour la voix !! To be tested more - if(*Amp>32767) - { - printf("!"); - *Amp=32767; //Overload - } - - //phase = M_PI + atan2(I,Q);//((double)arctan2(I,Q) * M_PI)/180.0f; - phase=atan2(I,Q); - phase=unwrap(prev_phase,phase); - - double dp= phase-prev_phase; - -/* double dp = phase - prev_phase; - if(dp < 0) dp = dp + 2*M_PI; - */ - *Frequency = (dp*(double)SampleRate)/(2.0f*M_PI); - //if(*Frequency<1000) - // printf("I=%d Q=%d phase= %f dp = %f Correctdp=%f Amp=%d Freq=%f\n",I,Q,phase,phase - prev_phase,dp,*Amp,*Frequency); - prev_phase = phase; - //if(*Frequency>SampleRate/2) printf("%f\n",*Frequency); -} - - - - -inline void shuffle_int(uint32_t *list, int len) -{ - int j; - uint32_t tmp; - while(len) - { - j = rand() % (len+1); - if (j != len - 1) - { - tmp = list[j]; - list[j] = list[len - 1]; - list[len - 1] = tmp; - } - len--; - } -} - - - uint32_t FrequencyAmplitudeToRegister2(double TuneFrequency,uint32_t Amplitude,int NoSample,uint32_t WaitNanoSecond,uint32_t SampleRate,char NoUsePWMF,int debug) -{ - static char ShowInfo=1; - - ctl = (struct control_data_s *)virtbase; // Struct ctl is mapped to the memory allocated by RpiDMA (Mailbox) - dma_cb_t *cbp = ctl->cb+NoSample*CBS_SIZE_BY_SAMPLE; - - - if(WaitNanoSecond==0) - { - if(SampleRate!=0) - WaitNanoSecond = (1e9/SampleRate); - else - printf("No samplerate neither Wait..Quit\n"); - } - - // ********************************** PWM FREQUENCY PROCESSING ***************************** - - if(UsePCMClk==0) - TuneFrequency*=2.0; //Because of pattern 10101010 - - // F1 < TuneFrequency < F2 - uint32_t FreqDividerf2=(int) ((double)PllUsed/TuneFrequency); - uint32_t FreqFractionnalf2=4096.0 * (((double)PllUsed/TuneFrequency)-FreqDividerf2); - - uint32_t FreqDividerf1=(FreqFractionnalf2!=4095)?FreqDividerf2:FreqDividerf2+1; - uint32_t FreqFractionnalf1=(FreqFractionnalf2!=4095)?FreqFractionnalf2+1:0; - - double f1=PllUsed/(FreqDividerf1+(double)FreqFractionnalf1/4096.0); - double f2=PllUsed/(FreqDividerf2+(double)FreqFractionnalf2/4096.0); // f2 is the higher frequency - double DeltaFreq=f2-f1; //Frequency granularity of PLL (without PWMF) - - static int OverWaitNanoSecond=0; //To count how many nano we wait to much - //OverWaitNanoSecond=0; - if(WaitNanoSecond-OverWaitNanoSecond<0) {printf("Overwait issue\n");} //Fixme do something clean to avoid this - - - - //Determine NbStepDMA which correpond to WaitNanosecond - //FixMe if WaitNanoSecond is too large ! - int i; - int CompensateWait=(WaitNanoSecond-OverWaitNanoSecond); - for(i=1;i=CompensateWait) //DelayStep on PI2 but not on other models ? - { - - break; - } - } - OverWaitNanoSecond+=CalibrationTab[i]/*+DelayStep/2*/-WaitNanoSecond; - //printf("step %d Overwait=%d\n",i,OverWaitNanoSecond); - int PwmStepDMA=i; //Number step performs by DMA - -/* int DelayStep=CalibrationTab[i+1]-CalibrationTab[i]; - int DelayMini=CalibrationTab[i]-((CalibrationTab[i+1]-CalibrationTab[i])*i); - - DelayStep=157; - DelayMini=1200; -*/ - int DelayMiniStep=DelayMini/DelayStep; - int NbStepPWM=PwmStepDMA+DelayMiniStep; // Number step we use to calculate including delay of Minimum constant due to perform Amplitude and getting the AXI bus - double UnitFrequency=DeltaFreq/(double)NbStepPWM; // Frequency granularity resulting in PWM Frequency - - - int NbF1=0,NbF2=0; - double FTunePercentage=0; - // if((TuneFrequency-f1)DelayMiniStep)//NbF2 is the upper frequency which will be play longer due to delay - { - RegisterF1=0x5A000000 | (FreqDividerf1<<12) | (FreqFractionnalf1); - RegisterF2=0x5A000000 | (FreqDividerf2<<12) | (FreqFractionnalf2); - NbF1DMA=NbF1; - //NbF2DMA=NbF2-DelayMiniStep; - - } - else // F1 and F2 Swap : NbF1 is now the lowest frequency which will play longer due to delay - { - RegisterF1=0x5A000000 | (FreqDividerf2<<12) | (FreqFractionnalf2); - RegisterF2=0x5A000000 | (FreqDividerf1<<12) | (FreqFractionnalf1); - NbF1DMA=NbF2;; - //NbF2DMA=NbF1-DelayMiniStep; - } - - - if(NoUsePWMF==1) - { - RegisterF1=RegisterF2; - } - - //printf("Ftune %f NbStepPWM=%d NbF1=%d NbF2=%d DelayMini=%d DelayStep=%d DelayMiniStep%d\n",FTunePercentage,NbStepPWM,NbF1,NbF2,DelayMini,DelayStep,DelayMiniStep); - - //Fill DMA - if(PwmStepDMA>1) - { - int BeginShuffle=rand()%(PwmStepDMA-1); //-1 cause last value should always be f2 - for(i=0;isample[NoSample].FrequencyTab[i]=RegisterF1; - ctl->sample[NoSample].FrequencyTab[Shuffle[PwmStepDMA-1][(i+BeginShuffle)%(PwmStepDMA-1)]]=RegisterF1; - } - for(i=NbF1DMA;isample[NoSample].FrequencyTab[i]=RegisterF2; - ctl->sample[NoSample].FrequencyTab[Shuffle[PwmStepDMA-1][(i+BeginShuffle)%(PwmStepDMA-1)]]=RegisterF2; - } - } - ctl->sample[NoSample].FrequencyTab[PwmStepDMA-1]=RegisterF2; //Always finish by f2 to be played later - - dma_cb_t *cbpwrite=cbp+2; - cbpwrite->length=PwmStepDMA*4; - - // ****************************** AMPLITUDE PROCESSING ********************************************** - - - Amplitude=(Amplitude>32767)?32767:Amplitude; - int IntAmplitude=Amplitude*7/32767-1; - - float LogAmplitude=-(10.0*log10((Amplitude+1)/32767.0)); - - if(LogAmplitude<=0.1) IntAmplitude=7; - if((LogAmplitude>0.1)&&(LogAmplitude<=0.3)) IntAmplitude=6; - if((LogAmplitude>0.3)&&(LogAmplitude<=0.7)) IntAmplitude=5; - if((LogAmplitude>0.7)&&(LogAmplitude<=1.1)) IntAmplitude=4; - if((LogAmplitude>1.1)&&(LogAmplitude<=2.1)) IntAmplitude=3; - if((LogAmplitude>2.1)&&(LogAmplitude<=4.1)) IntAmplitude=2; - if((LogAmplitude>4.1)&&(LogAmplitude<=7.9)) IntAmplitude=1; - if((LogAmplitude>7.9)&&(LogAmplitude<18.0)) IntAmplitude=0; - if((LogAmplitude>18)) IntAmplitude=-1; - - - //printf("Ampli %d Log=%f Pad=%d\n",Amplitude,LogAmplitude,IntAmplitude); - if(UsePCMClk==0) - { - if(IntAmplitude==-1) - { - ctl->sample[NoSample].Amplitude2=0x0; - } - else - { - ctl->sample[NoSample].Amplitude2=0xAAAAAAAA; - } - } - if(UsePCMClk==1) - { - if(IntAmplitude==-1) - { - ctl->sample[NoSample].Amplitude2=(Originfsel & ~(7 << 12)) | (0 << 12); //Pin is in - } - else - { - ctl->sample[NoSample].Amplitude2=(Originfsel & ~(7 << 12)) | (4 << 12); //Alternate is CLK - } - } - - - if(IntAmplitude>7) IntAmplitude=7; - if(IntAmplitude<0) IntAmplitude=0; - ctl->sample[NoSample].Amplitude1=0x5a000000 + (IntAmplitude&0x7) + (1<<4) + (0<<3); - - return CalibrationTab[PwmStepDMA]; - -} - - - -//Get from http://stackoverflow.com/questions/5083465/fast-efficient-least-squares-fit-algorithm-in-c - - #define REAL double - - - inline static REAL sqr(REAL x) { - return x*x; - } - - - int linreg(int n, const REAL x[], const REAL y[], REAL* m, REAL* b, REAL* r) - { - REAL sumx = 0.0; /* sum of x */ - REAL sumx2 = 0.0; /* sum of x**2 */ - REAL sumxy = 0.0; /* sum of x * y */ - REAL sumy = 0.0; /* sum of y */ - REAL sumy2 = 0.0; /* sum of y**2 */ - int i; - for (i=0;icb; - cur_cb = (uint32_t)virtbase; // DMA AT 1st CBS - dma_reg[DMA_CONBLK_AD+DMA_CHANNEL*0x40]=mem_virt_to_phys((void*)cur_cb); - //usleep(100); - int samplecnt; - - - - for (samplecnt = 0; samplecnt < NUM_SAMPLES ; samplecnt++) - { - - cbp+=2; - cbp->length = (uint32_t)4L*Step; - cbp++; - } - - dma_reg[DMA_CS+DMA_CHANNEL*0x40] = DMA_CS_PRIORITY(7) | DMA_CS_PANIC_PRIORITY(7) | DMA_CS_DISDEBUG |DMA_CS_ACTIVE; // START DMA : go, mid priority, wait for outstanding writes :7 Seems Max Priority - usleep(100); //Wait to be sure DMA is running stable - int i; - int SumDelay=0; - int NbLoopToAverage=2; - for(i=0;iOK - - if(CalibrateSystem(&globalppmpll,&PWMF_MARGIN,&FREQ_MINI_TIMING)) printf("Calibrate : ppm=%f DMA %fns:%fns\n",globalppmpll,DelayStep,DelayMini); - //printf("Timing : 1 cyle=%dns 1sample=%dns\n",NBSAMPLES_PWM_FREQ_MAX*400*3,(int)(1e9/(float)SampleRate)); - return 1; -} - -void print_usage(void) -{ - -fprintf(stderr,\ -"\nrpitx -%s\n\ -Usage:\nrpitx [-i File Input][-m ModeInput] [-f frequency output] [-s Samplerate] [-l] [-p ppm] [-h] \n\ --m {IQ(FileInput is a Stereo Wav contains I on left Channel, Q on right channel)}\n\ - {IQFLOAT(FileInput is a Raw float interlaced I,Q)}\n\ - {RF(FileInput is a (double)Frequency,Time in nanoseconds}\n\ - {RFA(FileInput is a (double)Frequency,(int)Time in nanoseconds,(float)Amplitude}\n\ - {VFO (constant frequency)}\n\ --i path to File Input \n\ --f float frequency to output on GPIO_18 pin 12 in khz : (130 kHz to 750 MHz),\n\ --l loop mode for file input\n\ --p float frequency correction in parts per million (ppm), positive or negative, for calibration, default 0.\n\ --d int DMABurstSize (default 1000) but for very short message, could be decrease\n\ --h help (this help).\n\ -\n",\ -PROGRAM_VERSION); - -} /* end function print_usage */ - - - -double GlobalTuningFrequency; -int HarmonicNumber =1; - -int pitx_SetTuneFrequency(double Frequency) -{ - #define MAX_HARMONIC 41 - int harmonic; - - if(Frequency For very Low Frequency we used 19.2 MHZ PLL - { - PllUsed=PllFreq19MHZ; - PllNumber=PLL_192; - } - else - { - PllUsed=PllFreq1GHZ; - PllNumber=PLL_1GHZ; - } - - printf("Master PLL = %u Hz\n",PllUsed); - - for(harmonic=1;harmonic%lf harmonic %d\n",(TuneFrequency/(double)harmonic),harmonic); - if((Frequency/(double)harmonic)<=(double)PllUsed/3.0) break; - } - HarmonicNumber=harmonic; - - //HarmonicNumber=11; //TEST - - if(HarmonicNumber>1) //Use Harmonic - { - GlobalTuningFrequency=Frequency/*/HarmonicNumber*/; - printf("\n Warning : Using harmonic %d -> Frequency fundamental on %f\n",HarmonicNumber,GlobalTuningFrequency/HarmonicNumber); - } - else - { - GlobalTuningFrequency=Frequency; - } - return 1; -} - -/** Wrapper around read. */ -static ssize_t readFile(void *buffer, const size_t count) -{ - return read(FileInHandle, buffer, count); -} -static void resetFile(void) -{ - lseek(FileInHandle, 0, SEEK_SET); -} - -int main(int argc, char* argv[]) -{ - int a; - int anyargs = 0; - char Mode = MODE_IQ; // By default - int SampleRate=48000; - float SetFrequency=1e6;//1MHZ - float ppmpll=0.0; - char NoUsePwmFrequency=0; - int SetDma=0; - while(1) - { - a = getopt(argc, argv, "i:f:m:s:p:hld:w:c:r:a:"); - - if(a == -1) - { - if(anyargs) break; - else a='h'; //print usage and exit - } - anyargs = 1; - - switch(a) - { - case 'i': // File name - FileName = optarg; - break; - case 'f': // Frequency - SetFrequency = atof(optarg); - break; - case 'm': // Mode (IQ,IQFLOAT,RF,RFA) - if(strcmp("IQ",optarg)==0) Mode=MODE_IQ; - if(strcmp("RF",optarg)==0) Mode=MODE_RF; - if(strcmp("RFA",optarg)==0) Mode=MODE_RFA; - if(strcmp("IQFLOAT",optarg)==0) Mode=MODE_IQ_FLOAT; - if(strcmp("VFO",optarg)==0) Mode=MODE_VFO; - break; - case 's': // SampleRate (Only needeed in IQ mode) - SampleRate = atoi(optarg); - break; - case 'p': // ppmcorrection - ppmpll = atof(optarg); - - break; - case 'h': // help - print_usage(); - exit(1); - break; - case 'l': // loop mode - loop_mode_flag = 1; - break; - case 'd': // Dma Sample Burst - DmaSampleBurstSize = atoi(optarg); - NUM_SAMPLES=4*DmaSampleBurstSize; - break; - case 'c': // Use clock instead of PWM pin - UsePCMClk = atoi(optarg); - - break; - case 'w': // No use pwmfrequency - NoUsePwmFrequency = atoi(optarg); - - break; - case 'r': // Randomize PWM frequency 1 by defaut - Randomize=atoi(optarg); - - break; - case 'a': // DMA Channel 1-14 - if((atoi(optarg)>0)&&(atoi(optarg)<15)) - { - SetDma=atoi(optarg); - //DMA_CHANNEL=SetDma; Should be set after initdma - } - else - SetDma=0; - break; - case -1: - break; - case '?': - if (isprint(optopt) ) - { - fprintf(stderr, "rpitx: unknown option `-%c'.\n", optopt); - } - else - { - fprintf(stderr, "rpitx: unknown option character `\\x%x'.\n", optopt); - } - print_usage(); - - exit(1); - break; - default: - print_usage(); - exit(1); - break; - }/* end switch a */ - }/* end while getopt() */ - - //Open File Input for modes which need it - if((Mode==MODE_IQ)||(Mode==MODE_IQ_FLOAT)||(Mode==MODE_RF)||(Mode==MODE_RFA)) - { - if(FileName && strcmp(FileName,"-")==0) - { - FileInHandle = STDIN_FILENO; - useStdin = 1; - } - else - FileInHandle = open(FileName, O_RDONLY); - - if (FileInHandle < 0) - { - fatal("Failed to read Filein %s\n",FileName); - } - } - if(UsePCMClk==1) - printf("Output to GPCLK Pin (Header No 7)\n"); - else - printf("Output to PWM Pin (Header No 12)\n"); - resetFile(); - return pitx_run(Mode, SampleRate, SetFrequency, ppmpll, NoUsePwmFrequency, readFile, resetFile, NULL,SetDma); -} - -int pitx_run( - const char Mode, - int SampleRate, - const float SetFrequency, - float ppmpll, - const char NoUsePwmFrequency, - ssize_t (*readWrapper)(void *buffer, size_t count), - void (*reset)(void), - int* skipSignals, - int SetDma) -{ - int i; - //char pagemap_fn[64]; - - int OffsetModulation=1000;//TBR - int MicGain=100; - //unsigned char *data; - - //Specific to ModeIQ - static signed short *IQArray=NULL; - - //Specific to ModeIQ_FLOAT - static float *IQFloatArray=NULL; - - //Specific to Mode RF - typedef struct { - double Frequency; - uint32_t WaitForThisSample; - } samplerf_t; - samplerf_t *TabRfSample=NULL; - - fprintf(stdout,"rpitx Version %s compiled %s (F5OEO Evariste) \n",PROGRAM_VERSION,__DATE__); - - PllFreq500MHZ=PLL_FREQ_500MHZ; - PllFreq1GHZ=PLL_FREQ_1GHZ; - PllFreq19MHZ=PLLFREQ_192; - - - //End of Init Plls - - if(Mode==MODE_IQ) - { - IQArray=malloc(DmaSampleBurstSize*2*sizeof(signed short)); // TODO A FREE AT THE END OF SOFTWARE - reset(); - } - if(Mode==MODE_IQ_FLOAT) - { - //NUM_SAMPLES=8*DmaSampleBurstSize; - IQFloatArray=malloc(DmaSampleBurstSize*2*sizeof(float)); // TODO A FREE AT THE END OF SOFTWARE - } - if((Mode==MODE_RF)||(Mode==MODE_RFA)) - { - //TabRfSample=malloc(DmaSampleBurstSize*sizeof(samplerf_t)); - SampleRate=50000L; //NOT USED BUT BY CALCULATING TIMETOSLEEP IN RF MODE - } - if(Mode==MODE_VFO) - SampleRate=50000L; //50000 BY EXPERIMENT - - if(Mode==MODE_IQ) - { - printf(" Frequency=%f ",GlobalTuningFrequency); - printf(" SampleRate=%d ",SampleRate); - } - - - - - pitx_SetTuneFrequency(SetFrequency*1000.0); - pitx_init(SampleRate, GlobalTuningFrequency/HarmonicNumber, skipSignals,SetDma); - //Correct PLL Frequency - - if(ppmpll==0) ppmpll=-globalppmpll; // Use calibrate only if not setting by user - - PllUsed+=(PllUsed * ppmpll) / 1000000.0; - //printf("PLL ppm=%f -> PllUsed %u\n",ppmpll,PllUsed); - - - - - static volatile uint32_t cur_cb,last_cb; - int last_sample; - int this_sample; - int free_slots; - //int SumDelay=0; - - long int start_time; - static long time_difference=0; - struct timespec gettime_now; - - cur_cb = (uint32_t)virtbase+ (NUM_SAMPLES-DmaSampleBurstSize)* sizeof(dma_cb_t) *CBS_SIZE_BY_SAMPLE; - - last_cb=(uint32_t)virtbase /*+ 965* sizeof(dma_cb_t) *CBS_SIZE_BY_SAMPLE*/ ; - - - dma_reg[DMA_CONBLK_AD+DMA_CHANNEL*0x40]=mem_virt_to_phys((void*)cur_cb); - - unsigned char Init=1; - -// ----------------------------------------------------------------- - struct stat bufstat; - { - int ret; - fstat(FileInHandle,&bufstat); - if(S_ISFIFO(bufstat.st_mode)) printf("Using a Pipe\n"); - } - for (;;) - { - int TimeToSleep; - static int StatusCompteur=0; - - cur_cb = mem_phys_to_virt((uint32_t)(dma_reg[DMA_CONBLK_AD+DMA_CHANNEL*0x40])); - this_sample = (cur_cb - (uint32_t)virtbase) / (sizeof(dma_cb_t) * CBS_SIZE_BY_SAMPLE); - last_sample = (last_cb - (uint32_t)virtbase) / (sizeof(dma_cb_t) * CBS_SIZE_BY_SAMPLE); - free_slots = this_sample - last_sample; - if (free_slots < 0) // WARNING : ORIGINAL CODE WAS < strictly - free_slots += NUM_SAMPLES; - - //printf("last_sample %lx cur_cb %lx FreeSlots = %d Time to sleep=%d\n",last_sample,cur_cb,free_slots,TimeToSleep); - - if(Init==0) - { - if((Mode==MODE_RF)||(Mode==MODE_RFA)) - { - TimeToSleep=50; //Max 200KHZ - } - else - { - - TimeToSleep=(1e6*(NUM_SAMPLES-free_slots*2))/SampleRate; // Time to sleep in us - } - //printf("TimeToSleep%d\n",TimeToSleep); - } - else - TimeToSleep=1000; - - //printf("Buffer Available=%d\n",BufferAvailable()); - - clock_gettime(CLOCK_REALTIME, &gettime_now); - start_time = gettime_now.tv_nsec; - if(TimeToSleep>=(KERNEL_GRANULARITY)) // 2ms : Time to process File/Canal Coding - { - udelay(TimeToSleep-(KERNEL_GRANULARITY)); - TimeToSleep=0; - } - else - { - //udelay(TimeToSleep); - sched_yield(); - //TimeToSleep=0; - //if(free_slots>(NUM_SAMPLES*9/10)) - //printf("Buffer nearly empty...%d/%d\n",free_slots,NUM_SAMPLES); - } - - static int free_slots_now; - cur_cb = mem_phys_to_virt(dma_reg[DMA_CONBLK_AD+DMA_CHANNEL*0x40]); - this_sample = (cur_cb - (uint32_t)virtbase) / (sizeof(dma_cb_t) * CBS_SIZE_BY_SAMPLE); - last_sample = (last_cb - (uint32_t)virtbase) / (sizeof(dma_cb_t) * CBS_SIZE_BY_SAMPLE); - free_slots_now = this_sample - last_sample; - if (free_slots_now < 0) // WARNING : ORIGINAL CODE WAS < strictly - free_slots_now += NUM_SAMPLES; - - clock_gettime(CLOCK_REALTIME, &gettime_now); - time_difference = gettime_now.tv_nsec - start_time; - if(time_difference<0) time_difference+=1E9; - - if(StatusCompteur%10==0) - { - //printf(" DiffTime = %ld FreeSlot %d FreeSlotDiff=%d Bitrate : %f\n",time_difference,free_slots_now,free_slots_now-free_slots,(1e9*(free_slots_now-free_slots))/(float)time_difference); - } - //if((1e9*(free_slots_now-free_slots))/(float)time_difference<40100.0) printf("Drift BAD\n"); else printf("Drift GOOD\n"); - StatusCompteur++; - free_slots=free_slots_now; - // FIX IT : Max(freeslot et Numsample/8) - if((Init==1)&&(free_slots < DmaSampleBurstSize /*NUM_SAMPLES/8*/)) - { - printf("****** STARTING TRANSMIT ********\n"); - dma_reg[DMA_CONBLK_AD+DMA_CHANNEL*0x40]=mem_virt_to_phys((void*)virtbase ); - usleep(100); - //Start DMA PWMFrequency - - //dma_reg[DMA_CS+DMA_CHANNEL_PWMFREQUENCY*0x40] = 0x10880001; - - //Start Main DMA - dma_reg[DMA_CS+DMA_CHANNEL*0x40] = DMA_CS_PRIORITY(7) | DMA_CS_PANIC_PRIORITY(7) | DMA_CS_DISDEBUG |DMA_CS_ACTIVE; - - - Init=0; - - continue; - } - clock_gettime(CLOCK_REALTIME, &gettime_now); - start_time = gettime_now.tv_nsec; - - int debug=0; - - if ((free_slots>=DmaSampleBurstSize)) - { - // *************************************** MODE IQ ************************************************** - if(Mode==MODE_IQ) - { - int NbRead=0; - static int Max=0; - static int Min=32767; - static int CompteSample=0; - CompteSample++; - NbRead=readWrapper(IQArray,DmaSampleBurstSize*2*2/*SHORT I,SHORT Q*/); - - if(NbRead!=DmaSampleBurstSize*2*2) - { - if(loop_mode_flag==1) - { - printf("Looping FileIn\n"); - reset(); - NbRead=readWrapper(IQArray,DmaSampleBurstSize*2*2); - } - else { - stop_dma(); - return 0; - } - } - - for(i=0;iMax) Max=amp; - if(amp0) - { - NbRead=readWrapper(IQFloatArray,n); - } - else - NbRead=0; - memset(IQFloatArray+NbRead,0,DmaSampleBurstSize*2*sizeof(float)-NbRead); // Set all at zero - NbRead=DmaSampleBurstSize*2*sizeof(float); - //printf("#"); - } - else - { - //printf("rpitx get data%d\n",n); - if(n>DmaSampleBurstSize*2*sizeof(float)) n=DmaSampleBurstSize*2*sizeof(float); - - NbRead=readWrapper(IQFloatArray,n); - } - - } - else - NbRead=readWrapper(IQFloatArray,DmaSampleBurstSize*2*sizeof(float)); - - if(NbRead!=DmaSampleBurstSize*2*sizeof(float)) - { - printf("rpitx: NbRead %d/%d\n",NbRead,DmaSampleBurstSize*2*sizeof(float)); - if(NbRead<=0) - { - if(loop_mode_flag==1) - { - printf("Looping FileIn\n"); - reset(); - } - else if (!useStdin) { - stop_dma(); - return 0; - } - } - } - - - - for(i=0;iMax) Max=amp; - if(ampSampleRate/2) df=SampleRate/2-df; - FrequencyAmplitudeToRegister2((GlobalTuningFrequency/*-OffsetModulation*/+df/*/HarmonicNumber*/)/HarmonicNumber,amp,last_sample++,0,SampleRate,NoUsePwmFrequency,CompteSample%2); - - free_slots--; - if (last_sample == NUM_SAMPLES) last_sample = 0; - } - } - // *************************************** MODE RF ************************************************** - if((Mode==MODE_RF)||(Mode==MODE_RFA)) - { - // SHOULD NOT EXEED 200 STEP*500ns; SAMPLERATE SHOULD BE MAX TO HAVE PRECISION FOR PCM - // BUT FIFO OF PCM IS 16 : SAMPLERATE MAYBE NOT EXCESS 16*80000 ! CAREFULL BUGS HERE - //#define MAX_DELAY_WAIT (PWM_STEP_MAXI/2*FREQ_MINI_TIMING-PWMF_MARGIN) - int MAX_DELAY_WAIT = 28000; //CalibrationTab[199]; - static int CompteSample=0; - static uint32_t TimeRemaining=0; - static samplerf_t SampleRf; - static int NbRead; - CompteSample++; - int i; - for(i=0;iMAX_DELAY_WAIT) - WaitSample=MAX_DELAY_WAIT; - else - WaitSample=TimeRemaining; - - //printf("TimeRemaining %d WaitSample %d\n",TimeRemaining,WaitSample); - if(Mode==MODE_RF) - { - //Need to fix : in FM need a constant carrier, in SSTV need sometimes to pause - if(SampleRf.Frequency==0.0) - { - amp=0; - SampleRf.Frequency=00.0;// TODO change that ugly frequency - - } - else - amp=32767; - - int RealWait=FrequencyAmplitudeToRegister2((SampleRf.Frequency/*/HarmonicNumber*/+GlobalTuningFrequency)/HarmonicNumber,amp,last_sample++,WaitSample,0,NoUsePwmFrequency,debug); - //printf("Wait=%d RealWait=%d\n",WaitSample,RealWait); - } - if(Mode==MODE_RFA) - FrequencyAmplitudeToRegister2((GlobalTuningFrequency)/HarmonicNumber,SampleRf.Frequency,last_sample++,WaitSample,0,NoUsePwmFrequency,debug); - - TimeRemaining-=WaitSample; - free_slots--; - if (last_sample == NUM_SAMPLES) last_sample = 0; - } - } - - // *************************************** MODE VFO ************************************************** - if(Mode==MODE_VFO) - { - static uint32_t CompteSample=0; - - int i; - //printf("Begin free %d\n",free_slots); - static int Up=1; - for(i=0;i - -int pitx_init(int SampleRate, double TuningFrequency, int* skipSignals,int SetDma); -int pitx_SetTuneFrequencyu(uint32_t Frequency); - -#define MODE_IQ 0 -#define MODE_RF 1 -#define MODE_RFA 2 -#define MODE_IQ_FLOAT 3 -#define MODE_VFO 4 - -int pitx_run( - char Mode, - int SampleRate, - float SetFrequency, - float ppmpll, - char NoUsePwmFrequency, - // Wrapper around read to read wav file bytes - ssize_t (*readWrapper)(void *buffer, size_t count), - // Wrapper to reset file for looping - void (*reset)(void), - int* skipSignals, - int SetDma -); - - -#endif diff --git a/src/opera/opera.cpp b/src/opera/opera.cpp index 668a9e3..3a8e83f 100644 --- a/src/opera/opera.cpp +++ b/src/opera/opera.cpp @@ -88,7 +88,8 @@ int _tmain(int argc, _TCHAR* argv[]) { #endif int i = 0; - char s1 = 0x00, s2[7] = ""; + //char s1 = 0x00; + char s2[7] = ""; switch (argc) @@ -103,7 +104,7 @@ int _tmain(int argc, _TCHAR* argv[]) } case 4: // 3 arguments { - s1 = (char)argv[1][0]; + //s1 = (char)argv[1][0]; // range check if (!((argv[1][0] >= '0' && argv[1][0] <= '9') || (argv[1][0] >= 'A' && argv[1][0] <= 'Z') || @@ -211,7 +212,7 @@ void generate_call(char *call, char *call_coded) code_sum = code_sum * 27 + chr_norm_opera(call[4]); code_sum = code_sum * 27 + chr_norm_opera(call[5]); - if (DEBUG) printf("code_sum=%Lu\n", code_sum); + if (DEBUG) printf("code_sum=%lu\n", code_sum); // merge coded callsign ino a string call_coded[28] = 0x00; @@ -485,7 +486,7 @@ with the Opera frequency recommendation: */ void print_str(const char * caption, char * code) //******************************************************************** { // This is a service function for debugging - int i = 0; + size_t i = 0; printf("%s\n", caption); for (i = 0; i < strlen(code); i++) diff --git a/ssb.sh b/ssb.sh deleted file mode 100755 index d5a9105..0000000 --- a/ssb.sh +++ /dev/null @@ -1,2 +0,0 @@ -(while true; do cat sampleaudio.wav; done) | csdr convert_i16_f | csdr fir_interpolate_cc 2| csdr dsb_fc | csdr bandpass_fir_fft_cc 0.002 0.06 0.01 | csdr fastagc_ff | sudo ./sendiq -i /dev/stdin -s 96000 -f 144.1e6 -t float - diff --git a/sv1afnfilter.sh b/sv1afnfilter.sh index 723b184..1e1c9cb 100755 --- a/sv1afnfilter.sh +++ b/sv1afnfilter.sh @@ -1,3 +1,5 @@ +#COMMAND A BANDPATH FILTER FROM SV1AFN + #GPIO Declaration if [ -f /sys/class/gpio/gpio26 ]; then diff --git a/testam.sh b/testam.sh index 6ebf419..a184085 100755 --- a/testam.sh +++ b/testam.sh @@ -1,3 +1,3 @@ -./piam sampleaudio.wav am.rfa -sudo ./rpitx -m RFA -i am.rfa -f 433900 -l +#TODO using the AM mode from librpitx +echo Need to implement diff --git a/testcard.rgb b/testcard.rgb deleted file mode 100644 index ebceaa817ba9871db2bdb44aa2241e4a1e5e0f84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245760 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