]> git.rkrishnan.org Git - dttsp.git/blobdiff - jDttSP/update.c
multiple receivers implemented
[dttsp.git] / jDttSP / update.c
index a090b76faffc85101c3aad00c77b9c8144d333b7..aeed07b089b9575ddc567875e59a7a30a2a68aa6 100644 (file)
@@ -35,6 +35,11 @@ Bridgewater, NJ 08807
 
 #include <common.h>
 
+////////////////////////////////////////////////////////////////////////////
+// for commands affecting RX, which RX is Listening
+
+#define RL (uni.multirx.lis)
+
 ////////////////////////////////////////////////////////////////////////////
 
 PRIVATE REAL
@@ -52,28 +57,32 @@ setRXFilter(int n, char **p) {
   if (fabs(low_frequency) >= 0.5 * uni.samplerate) return -1;
   if (fabs(high_frequency) >= 0.5 * uni.samplerate) return -2;
   if ((low_frequency + 10) >= high_frequency) return -3;
-  delFIR_COMPLEX(rx.filt.coef);
+  delFIR_COMPLEX(rx[RL].filt.coef);
 
-  rx.filt.coef = newFIR_Bandpass_COMPLEX(low_frequency,
-                                        high_frequency,
-                                        uni.samplerate,
-                                        ncoef);
+  rx[RL].filt.coef = newFIR_Bandpass_COMPLEX(low_frequency,
+                                            high_frequency,
+                                            uni.samplerate,
+                                            ncoef);
 
   zcvec = newvec_COMPLEX(fftlen, "filter z vec in setFilter");
   ptmp = fftw_create_plan(fftlen, FFTW_FORWARD, uni.wisdom.bits);
 #ifdef LHS
-  for (i = 0; i < ncoef; i++) zcvec[i] = rx.filt.coef->coef[i];
+  for (i = 0; i < ncoef; i++)
+    zcvec[i] = rx[RL].filt.coef->coef[i];
 #else
-  for (i = 0; i < ncoef; i++) zcvec[fftlen - ncoef + i] = rx.filt.coef->coef[i];
+  for (i = 0; i < ncoef; i++)
+    zcvec[fftlen - ncoef + i] = rx[RL].filt.coef->coef[i];
 #endif
-  fftw_one(ptmp, (fftw_complex *) zcvec, (fftw_complex *) rx.filt.ovsv->zfvec);
+  fftw_one(ptmp,
+          (fftw_complex *) zcvec,
+          (fftw_complex *) rx[RL].filt.ovsv->zfvec);
   fftw_destroy_plan(ptmp);
   delvec_COMPLEX(zcvec);
-  normalize_vec_COMPLEX(rx.filt.ovsv->zfvec,
-                       rx.filt.ovsv->fftlen);
-  memcpy((char *) rx.filt.save,
-        (char *) rx.filt.ovsv->zfvec,
-        rx.filt.ovsv->fftlen * sizeof(COMPLEX));
+  normalize_vec_COMPLEX(rx[RL].filt.ovsv->zfvec,
+                       rx[RL].filt.ovsv->fftlen);
+  memcpy((char *) rx[RL].filt.save,
+        (char *) rx[RL].filt.ovsv->zfvec,
+        rx[RL].filt.ovsv->fftlen * sizeof(COMPLEX));
 
   return 0;
 }
@@ -100,11 +109,15 @@ setTXFilter(int n, char **p) {
   zcvec = newvec_COMPLEX(fftlen, "filter z vec in setFilter");
   ptmp = fftw_create_plan(fftlen, FFTW_FORWARD, uni.wisdom.bits);
 #ifdef LHS
-  for (i = 0; i < ncoef; i++) zcvec[i] = tx.filt.coef->coef[i];
+  for (i = 0; i < ncoef; i++)
+    zcvec[i] = tx.filt.coef->coef[i];
 #else
-  for (i = 0; i < ncoef; i++) zcvec[fftlen - ncoef + i] = tx.filt.coef->coef[i];
+  for (i = 0; i < ncoef; i++)
+    zcvec[fftlen - ncoef + i] = tx.filt.coef->coef[i];
 #endif
-  fftw_one(ptmp, (fftw_complex *) zcvec, (fftw_complex *) tx.filt.ovsv->zfvec);
+  fftw_one(ptmp,
+          (fftw_complex *) zcvec,
+          (fftw_complex *) tx.filt.ovsv->zfvec);
   fftw_destroy_plan(ptmp);
   delvec_COMPLEX(zcvec);
   normalize_vec_COMPLEX(tx.filt.ovsv->zfvec,
@@ -137,12 +150,12 @@ setMode(int n, char **p) {
     switch (trx) {
     case TX: tx.mode = mode; break;
     case RX: 
-    default: rx.mode = mode; break;
+    default: rx[RL].mode = mode; break;
     }
   } else
-    tx.mode = rx.mode = uni.mode.sdr = mode;
-  if (rx.mode == AM) rx.am.gen->mode = AMdet;
-  if (rx.mode == SAM) rx.am.gen->mode = SAMdet;
+    tx.mode = rx[RL].mode = uni.mode.sdr = mode;
+  if (rx[RL].mode == AM) rx[RL].am.gen->mode = AMdet;
+  if (rx[RL].mode == SAM) rx[RL].am.gen->mode = SAMdet;
   return 0;
 }
 
@@ -157,10 +170,10 @@ setOsc(int n, char **p) {
     switch (trx) {
     case TX: tx.osc.gen->Frequency = newfreq; break;
     case RX:
-    default: rx.osc.gen->Frequency = newfreq; break;
+    default: rx[RL].osc.gen->Frequency = newfreq; break;
     }
   } else
-    tx.osc.gen->Frequency = rx.osc.gen->Frequency = newfreq;
+    tx.osc.gen->Frequency = rx[RL].osc.gen->Frequency = newfreq;
   return 0;
 }
 
@@ -173,45 +186,45 @@ setSampleRate(int n, char **p) {
 
 PRIVATE int
 setNR(int n, char **p) {
-  rx.anr.flag = atoi(p[0]);
+  rx[RL].anr.flag = atoi(p[0]);
   return 0;
 }
 
 PRIVATE int
 setANF(int n, char **p) {
-  rx.anf.flag = atoi(p[0]);
+  rx[RL].anf.flag = atoi(p[0]);
   return 0;
 }
 
 PRIVATE int
 setNB(int n, char **p) {
-  rx.nb.flag = atoi(p[0]);
+  rx[RL].nb.flag = atoi(p[0]);
   return 0;
 }
 
 PRIVATE int
 setNBvals(int n, char **p) {
- REAL threshold = atof(p[0]);
-  rx.nb.gen->threshold = rx.nb.thresh = threshold;
 REAL threshold = atof(p[0]);
+  rx[RL].nb.gen->threshold = rx[RL].nb.thresh = threshold;
   return 0;
 }
 
 PRIVATE int
 setSDROM(int n, char **p) {
-  rx.nb_sdrom.flag = atoi(p[0]);
+  rx[RL].nb_sdrom.flag = atoi(p[0]);
   return 0;
 }
 
 PRIVATE int
 setSDROMvals(int n, char **p) {
  REAL threshold = atof(p[0]);
-  rx.nb_sdrom.gen->threshold = rx.nb_sdrom.thresh = threshold;
+  rx[RL].nb_sdrom.gen->threshold = rx[RL].nb_sdrom.thresh = threshold;
   return 0;
 }
 
 PRIVATE int
 setBIN(int n, char **p) {
-  rx.bin.flag = atoi(p[0]);
+  rx[RL].bin.flag = atoi(p[0]);
   return 0;
 }
 
@@ -224,10 +237,10 @@ setfixedAGC(int n, char **p) {
     switch(trx) {
     case TX: tx.agc.gen->gain.now = gain; break;
     case RX:
-    default: rx.agc.gen->gain.now = gain; break;
+    default: rx[RL].agc.gen->gain.now = gain; break;
     }
   } else
-    tx.agc.gen->gain.now = rx.agc.gen->gain.now = gain;
+    tx.agc.gen->gain.now = rx[RL].agc.gen->gain.now = gain;
   return 0;
 }
 
@@ -236,28 +249,28 @@ setRXAGC(int n, char **p) {
   int setit = atoi(p[0]);
   switch (setit) {
   case agcOFF:
-    rx.agc.gen->mode = agcOFF;
-    rx.agc.flag = TRUE;
+    rx[RL].agc.gen->mode = agcOFF;
+    rx[RL].agc.flag = TRUE;
     break;
   case agcSLOW:
-    rx.agc.gen->mode = agcSLOW;
-    rx.agc.gen->hang = 10;
-    rx.agc.flag = TRUE;
+    rx[RL].agc.gen->mode = agcSLOW;
+    rx[RL].agc.gen->hang = 10;
+    rx[RL].agc.flag = TRUE;
     break;
   case agcMED:
-    rx.agc.gen->mode = agcMED;
-    rx.agc.gen->hang = 6;
-    rx.agc.flag = TRUE;
+    rx[RL].agc.gen->mode = agcMED;
+    rx[RL].agc.gen->hang = 6;
+    rx[RL].agc.flag = TRUE;
     break;
   case agcFAST:
-    rx.agc.gen->mode = agcFAST;
-    rx.agc.gen->hang = 3;
-    rx.agc.flag = TRUE;
+    rx[RL].agc.gen->mode = agcFAST;
+    rx[RL].agc.gen->hang = 3;
+    rx[RL].agc.flag = TRUE;
     break;
   case agcLONG:
-    rx.agc.gen->mode = agcLONG;
-    rx.agc.gen->hang = 23;
-    rx.agc.flag = TRUE;
+    rx[RL].agc.gen->mode = agcLONG;
+    rx[RL].agc.gen->hang = 23;
+    rx[RL].agc.flag = TRUE;
     break;
   }
   return 0;
@@ -266,14 +279,14 @@ setRXAGC(int n, char **p) {
 PRIVATE int
 setRXAGCCompression(int n, char **p) {
   REAL rxcompression = atof(p[0]);
-  rx.agc.gen->gain.top = pow(10.0 , rxcompression * 0.05);
+  rx[RL].agc.gen->gain.top = pow(10.0 , rxcompression * 0.05);
   return 0;
 }
 
 PRIVATE int
 setRXAGCHang(int n, char **p) {
   int hang = atoi(p[0]);
-  rx.agc.gen->hang =
+  rx[RL].agc.gen->hang =
     max(1,
        min(23,
            hang * uni.samplerate / (1e3 * uni.buflen)));
@@ -283,7 +296,7 @@ setRXAGCHang(int n, char **p) {
 PRIVATE int
 setRXAGCLimit(int n, char **p) {
   REAL limit = atof(p[0]);
-  rx.agc.gen->gain.lim = 0.001 * limit;
+  rx[RL].agc.gen->gain.lim = 0.001 * limit;
   return 0;
 }
 
@@ -387,7 +400,7 @@ apply_txeq_band(REAL lof, REAL dB, REAL hif) {
   REAL g = dB2lin(dB);
   COMPLEX *src = tx.filt.save,
           *trg = tx.filt.ovsv->zfvec;
-   for (i = lox; i < hix; i++) {
+  for (i = lox; i < hix; i++) {
     trg[i] = Cscl(src[i], g);
     if (i) {
       int j = l - i;
@@ -400,6 +413,7 @@ apply_txeq_band(REAL lof, REAL dB, REAL hif) {
 // 0 dB1 75 dB2 150 dB3 300 dB4 600 dB5 1200 dB6 2000 dB7 2800 dB8 3600
 // approximates W2IHY bandcenters.
 // no args, revert to no EQ.
+
 PRIVATE int
 setTXEQ(int n, char **p) {
   if (n < 3) {
@@ -429,10 +443,10 @@ apply_rxeq_band(REAL lof, REAL dB, REAL hif) {
   int i,
       lox = f2x(lof),
       hix = f2x(hif),
-      l = rx.filt.ovsv->fftlen;
+      l = rx[RL].filt.ovsv->fftlen;
   REAL g = dB2lin(dB);
-  COMPLEX *src = rx.filt.save,
-          *trg = rx.filt.ovsv->zfvec;
+  COMPLEX *src = rx[RL].filt.save,
+          *trg = rx[RL].filt.ovsv->zfvec;
   for (i = lox; i < hix; i++) {
     trg[i] = Cscl(src[i], g);
     if (i) {
@@ -446,9 +460,9 @@ PRIVATE int
 setRXEQ(int n, char **p) {
   if (n < 3) {
     // revert to no EQ
-    memcpy((char *) rx.filt.ovsv->zfvec,
-          (char *) rx.filt.save,
-          rx.filt.ovsv->fftlen * sizeof(COMPLEX));
+    memcpy((char *) rx[RL].filt.ovsv->zfvec,
+          (char *) rx[RL].filt.save,
+          rx[RL].filt.ovsv->fftlen * sizeof(COMPLEX));
     return 0;
   } else {
     int i;
@@ -472,10 +486,10 @@ setANFvals(int n, char **p) {
       delay = atoi(p[1]);
   REAL gain = atof(p[2]),
        leak = atof(p[3]);
-  rx.anf.gen->adaptive_filter_size = taps;
-  rx.anf.gen->delay = delay;
-  rx.anf.gen->adaptation_rate = gain;
-  rx.anf.gen->leakage = leak;
+  rx[RL].anf.gen->adaptive_filter_size = taps;
+  rx[RL].anf.gen->delay = delay;
+  rx[RL].anf.gen->adaptation_rate = gain;
+  rx[RL].anf.gen->leakage = leak;
   return 0;
 }
 
@@ -485,10 +499,10 @@ setNRvals(int n, char **p) {
       delay = atoi(p[1]);
   REAL gain = atof(p[2]),
        leak = atof(p[3]);
-  rx.anr.gen->adaptive_filter_size = taps;
-  rx.anr.gen->delay = delay;
-  rx.anr.gen->adaptation_rate = gain;
-  rx.anr.gen->leakage = leak;
+  rx[RL].anr.gen->adaptive_filter_size = taps;
+  rx[RL].anr.gen->delay = delay;
+  rx[RL].anr.gen->adaptation_rate = gain;
+  rx[RL].anr.gen->leakage = leak;
   return 0;
 }
 
@@ -496,34 +510,34 @@ PRIVATE int
 setcorrectIQ(int n, char **p) {
   int phaseadjustment = atoi(p[0]),
       gainadjustment  = atoi(p[1]);
-  rx.iqfix->phase = 0.001 * (REAL) phaseadjustment;
-  rx.iqfix->gain  = 1.0+ 0.001 * (REAL) gainadjustment;
+  rx[RL].iqfix->phase = 0.001 * (REAL) phaseadjustment;
+  rx[RL].iqfix->gain  = 1.0+ 0.001 * (REAL) gainadjustment;
   return 0;
 }
 
 PRIVATE int
 setcorrectIQphase(int n, char **p) {
   int phaseadjustment = atoi(p[0]);
-  rx.iqfix->phase = 0.001 * (REAL) phaseadjustment;
+  rx[RL].iqfix->phase = 0.001 * (REAL) phaseadjustment;
   return 0;
 }
 
 PRIVATE int
 setcorrectIQgain(int n, char **p) {
   int gainadjustment = atoi(p[0]);
-  rx.iqfix->gain = 1.0 + 0.001 * (REAL) gainadjustment;
+  rx[RL].iqfix->gain = 1.0 + 0.001 * (REAL) gainadjustment;
   return 0;
 }
 
 PRIVATE int
 setSquelch(int n, char **p) {
-  rx.squelch.thresh = -atof(p[0]);
+  rx[RL].squelch.thresh = -atof(p[0]);
   return 0;
 }
 
 PRIVATE int
 setSquelchSt(int n, char **p) {
-  rx.squelch.flag = atoi(p[0]);
+  rx[RL].squelch.flag = atoi(p[0]);
   return 0;
 }
 
@@ -546,29 +560,29 @@ setSpotToneVals(int n, char **p) {
        freq = atof(p[1]),
        rise = atof(p[2]),
        fall = atof(p[3]);
-  setSpotToneGenVals(rx.spot.gen, gain, freq, rise, fall);
+  setSpotToneGenVals(rx[RL].spot.gen, gain, freq, rise, fall);
   return 0;
 }
 
 PRIVATE int
 setSpotTone(int n, char **p) {
   if (atoi(p[0])) {
-    SpotToneOn(rx.spot.gen);
-    rx.spot.flag = TRUE;
+    SpotToneOn(rx[RL].spot.gen);
+    rx[RL].spot.flag = TRUE;
   } else
-    SpotToneOff(rx.spot.gen);
+    SpotToneOff(rx[RL].spot.gen);
   return 0;
 }
 
 PRIVATE int
 setRXPreScl(int n, char **p) {
-  rx.scl.pre.flag = atoi(p[0]);
+  rx[RL].scl.pre.flag = atoi(p[0]);
   return 0;
 }
 
 PRIVATE int
 setRXPreSclVal(int n, char **p) {
-  rx.scl.pre.val = dB2lin(atof(p[0]));
+  rx[RL].scl.pre.val = dB2lin(atof(p[0]));
   return 0;
 }
 
@@ -586,13 +600,13 @@ setTXPreSclVal(int n, char **p) {
 
 PRIVATE int
 setRXPostScl(int n, char **p) {
-  rx.scl.post.flag = atoi(p[0]);
+  rx[RL].scl.post.flag = atoi(p[0]);
   return 0;
 }
 
 PRIVATE int
 setRXPostSclVal(int n, char **p) {
-  rx.scl.post.val = dB2lin(atof(p[0]));
+  rx[RL].scl.post.val = dB2lin(atof(p[0]));
   return 0;
 }
 
@@ -647,6 +661,88 @@ setRingBufferReset(int n, char **p) {
   return 0;
 }
 
+PRIVATE int
+setRXListen(int n, char **p) {
+  int lis = atoi(p[0]);
+  if (lis < 0 || lis >= uni.multirx.nrx)
+    return -1;
+  else {
+    uni.multirx.lis = lis;
+    return 0;
+  }
+}
+
+PRIVATE int
+setRXOn(int n, char **p) {
+  if (n < 1) {
+    if (uni.multirx.act[RL])
+      return -1;
+    else {
+      uni.multirx.act[RL] = TRUE;
+      uni.multirx.nac++;
+      rx[RL].tick = 0;
+      return 0;
+    }
+  } else {
+    int k = atoi(p[0]);
+    if (k < 0 || k >= uni.multirx.nrx)
+      return -1;
+    else {
+      if (uni.multirx.act[k])
+       return -1;
+      else {
+       uni.multirx.act[k] = TRUE;
+       uni.multirx.nac++;
+       rx[k].tick = 0;
+       return 0;
+      }
+    }
+  }
+}
+
+PRIVATE int
+setRXOff(int n, char **p) {
+  if (n < 1) {
+    if (!uni.multirx.act[RL])
+      return -1;
+    else {
+      uni.multirx.act[RL] = FALSE;
+      --uni.multirx.nac;
+      return 0;
+    }
+  } else {
+    int k = atoi(p[0]);
+    if (k < 0 || k >= uni.multirx.nrx)
+      return -1;
+    else {
+      if (!uni.multirx.act[k])
+       return -1;
+      else {
+       uni.multirx.act[k] = FALSE;
+       --uni.multirx.nac;
+       return 0;
+      }
+    }
+  }
+}
+
+PRIVATE int
+setRXPan(int n, char **p) {
+  REAL pos, theta;
+  if (n < 1) {
+    pos = 0.5;
+    theta = (1.0 - pos) * M_PI / 2.0;
+    rx[RL].azim = Cmplx(cos(theta), sin(theta));
+    return 0;
+  } else {
+    if ((pos = atof(p[0])) < 0.0 || pos > 1.0)
+      return -1;
+    theta = (1.0 - pos) * M_PI / 2.0;
+    rx[RL].azim = Cmplx(cos(theta), sin(theta));
+    return 0;
+  }
+}
+
 //========================================================================
 
 #include <thunk.h>
@@ -700,6 +796,10 @@ CTE update_cmds[] = {
   {"setfixedAGC", setfixedAGC},
   {"setMonDump", setMonDump},
   {"setRingBufferReset", setRingBufferReset},
+  {"setRXListen", setRXListen},
+  {"setRXOn", setRXOn},
+  {"setRXOff", setRXOff},
+  {"setRXPan", setRXPan},
   { 0, 0 }
 };