From ebd5c0c04b2f3bcfd61fc9207581f1fe431040d8 Mon Sep 17 00:00:00 2001 From: c vw Date: Tue, 27 Apr 2021 18:42:08 +0200 Subject: [PATCH] Moved SWR calculation to transmitter.c, and store SWR in transmitter data structure so it can be used elsewhere --- meter.c | 20 +------------------- receiver.c | 2 ++ transmitter.c | 26 +++++++++++++++++++++++++- transmitter.h | 1 + 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/meter.c b/meter.c index e970726..ce0a6d7 100644 --- a/meter.c +++ b/meter.c @@ -140,7 +140,7 @@ fprintf(stderr,"meter_init: width=%d height=%d\n",width,height); } -void meter_update(RECEIVER *rx,int meter_type,double value,double reverse,double exciter,double alc) { +void meter_update(RECEIVER *rx,int meter_type,double value,double reverse,double alc,double swr) { double level; char sf[32]; @@ -148,28 +148,10 @@ void meter_update(RECEIVER *rx,int meter_type,double value,double reverse,double double offset; char *units="W"; double interval=10.0; - static double swr = 1.0; // will eventually become part of TRANSMITTER cairo_t *cr = cairo_create (meter_surface); if(meter_type==POWER) { level=value; - if(level==0.0) { - level=exciter; - reverse=0.0; // If no fwd power is available, clear reverse power - } - if (level > 0.01 && level > 1.01*reverse) { - // - // SWR means VSWR (voltage based) but we have the forward and - // reflected power, so correct for that - // - double gamma=sqrt(reverse/level); - swr=0.7*(1+gamma)/(1-gamma) + 0.3*swr; - } else { - // - // This value may be used for auto SWR protection, so move towards 1.0 - // - swr = 0.7 + 0.3*swr; - } switch(pa_power) { case PA_1W: units="mW"; diff --git a/receiver.c b/receiver.c index 37c149e..a073e71 100644 --- a/receiver.c +++ b/receiver.c @@ -632,6 +632,7 @@ static gint update_display(gpointer data) { g_mutex_unlock(&rx->display_mutex); if(active_receiver==rx) { rx->meter=GetRXAMeter(rx->id,smeter)+meter_calibration; + // the three "unused" parameters are the TX rev, alc, and swr values meter_update(rx,SMETER,rx->meter,0.0,0.0,0.0); } return TRUE; @@ -651,6 +652,7 @@ void receiver_remote_update_display(RECEIVER *rx) { waterfall_update(rx); } if(active_receiver==rx) { + // the three "unused" parameters are the TX rev, alc, and swr values meter_update(rx,SMETER,rx->meter,0.0,0.0,0.0); } g_mutex_unlock(&rx->display_mutex); diff --git a/transmitter.c b/transmitter.c index 72def80..d0f49ee 100644 --- a/transmitter.c +++ b/transmitter.c @@ -612,10 +612,33 @@ static gboolean update_display(gpointer data) { double fwd=compute_power(transmitter->fwd); double rev=compute_power(transmitter->rev); + // + // Calculate SWR here such that it is available in DUPLEX mode + // transmitter->swr can be used in other parts of the program to + // implement SWR protection etc. + // + if (fwd > 0.01 && fwd > 1.01*rev) { + // + // SWR means VSWR (voltage based) but we have the forward and + // reflected power, so correct for that + // + double gamma=sqrt(rev/fwd); + transmitter->swr=0.7*(1+gamma)/(1-gamma) + 0.3*transmitter->swr; + } else { + // + // This value may be used for auto SWR protection, so move towards 1.0 + // + transmitter->swr = 0.7 + 0.3*transmitter->swr; + } + if (fwd == 0.0) { + fwd = transmitter->exciter; + } + + //g_print("transmitter: meter_update: fwd:%f->%f rev:%f->%f ex_fwd=%d alex_fwd=%d alex_rev=%d\n",transmitter->fwd,fwd,transmitter->rev,rev,exciter_power,alex_forward_power,alex_reverse_power); if(!duplex) { - meter_update(active_receiver,POWER,/*transmitter->*/fwd,/*transmitter->*/rev,transmitter->exciter,transmitter->alc); + meter_update(active_receiver,POWER,fwd,rev,transmitter->alc,transmitter->swr); } return TRUE; // keep going @@ -804,6 +827,7 @@ fprintf(stderr,"create_transmitter: id=%d buffer_size=%d mic_sample_rate=%d mic_ tx->dialog_x=-1; tx->dialog_y=-1; + tx->swr = 1.0; transmitter_restore_state(tx); diff --git a/transmitter.h b/transmitter.h index 91ba4dd..7327013 100644 --- a/transmitter.h +++ b/transmitter.h @@ -102,6 +102,7 @@ typedef struct _transmitter { double exciter; double rev; double alc; + double swr; gint xit_enabled; long long xit; -- 2.45.2