}
-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];
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";
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;
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);
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
tx->dialog_x=-1;
tx->dialog_y=-1;
+ tx->swr = 1.0;
transmitter_restore_state(tx);
double exciter;
double rev;
double alc;
+ double swr;
gint xit_enabled;
long long xit;