]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
activate correct TX filter when going "manual"
authorc vw <dl1ycf@darc.de>
Tue, 13 Aug 2019 12:03:07 +0000 (14:03 +0200)
committerc vw <dl1ycf@darc.de>
Tue, 13 Aug 2019 12:03:07 +0000 (14:03 +0200)
alex.h
hpsdrsim.c
new_protocol.c
old_protocol.c

diff --git a/alex.h b/alex.h
index 14b309312f45753283db0557b916a13dda5a0b5c..67fa08d32f1c6971c20851449569615f9a83784e 100644 (file)
--- a/alex.h
+++ b/alex.h
 
 // These bits only have a function on ANAN-7000
 
-#define ALEX_ANAN7000_RX_30_20_17_BPF  0x00000002   // bit 1, 11.0 - 20.9 MHz
-#define ALEX_ANAN7000_RX_15_12_BPF     0x00000004   // bit 2, 21.0 - 26.9 MHz
-#define ALEX_ANAN7000_RX_10_6_PRE_BPF  0x00000008   // bit 3, 27.0 - 61.4 MHz with preamp
+#define ALEX_ANAN7000_RX_20_15_BPF     0x00000002   // bit 1, 11.0 - 22.0 MHz
+#define ALEX_ANAN7000_RX_12_10_BPF     0x00000004   // bit 2, 22.0 - 35.6 MHz
+#define ALEX_ANAN7000_RX_6_PRE_BPF     0x00000008   // bit 3,      > 35.6 MHz with preamp
 #define ALEX_ANAN7000_RX_40_30_BPF     0x00000010   // bit 4,  5.5 - 10.9 MHz
 #define ALEX_ANAN7000_RX_80_60_BPF     0x00000020   // bit 5,  2.1 -  5.4 MHz
 #define ALEX_ANAN7000_RX_160_BPF       0x00000040   // bit 6,  1.5 -  2.0 MHz
index fa48ca3bcd00cc40cf90db365bb734ca59729096..1da235922d3960e7527f3a0ac761aa14bae0bf73 100644 (file)
@@ -847,8 +847,12 @@ void process_ep2(uint8_t *frame)
 {
 
        uint16_t data;
+        int rc;
+        int mod_ptt;
+        int mod;
 
-        chk_data(frame[0] & 1, ptt, "PTT");
+        
+       chk_data(frame[0] & 1, ptt, "PTT");
        switch (frame[0])
        {
        case 0:
@@ -862,19 +866,56 @@ void process_ep2(uint8_t *frame)
           chk_data(frame[2] & 1, TX_class_E, "TX CLASS-E");
           chk_data((frame[2] & 0xfe) >> 1, OpenCollectorOutputs,"OpenCollector");
 
-          chk_data((frame[3] & 0x03) >> 0, AlexAtt, "ALEX Attenuator");
-          chk_data((frame[3] & 0x04) >> 2, preamp, "ALEX preamp");
-          chk_data((frame[3] & 0x08) >> 3, LTdither, "LT2208 Dither");
-          chk_data((frame[3] & 0x10) >> 4, LTrandom, "LT2208 Random");
-          chk_data((frame[3] & 0x60) >> 5, alexRXant, "ALEX RX ant");
-          chk_data((frame[3] & 0x80) >> 7, alexRXout, "ALEX RX out");
-
-          chk_data(((frame[4] >> 0) & 3), AlexTXrel, "ALEX TX relay");
-          chk_data(((frame[4] >> 2) & 1), duplex,    "DUPLEX");
           chk_data(((frame[4] >> 3) & 7) + 1, receivers, "RECEIVERS");
           chk_data(((frame[4] >> 6) & 1), MicTS, "TimeStampMic");
           chk_data(((frame[4] >> 7) & 1), CommonMercuryFreq,"Common Mercury Freq");
 
+         mod=0;
+          rc=frame[3] & 0x03;
+         if (rc != AlexAtt) {
+           mod=1;
+           AlexAtt=rc;
+         }
+         rc=(frame[3] & 0x04) >> 2;
+         if (rc != preamp) {
+           mod=1;
+           preamp=rc;
+         }
+         rc=(frame[3] & 0x08) >> 3;
+         if (rc != LTdither) {
+           mod=1;
+           LTdither=rc;
+         }
+         rc=(frame[3] & 0x10) >> 4;
+         if (rc != LTrandom) {
+           mod=1;
+           LTrandom=rc;
+         }
+         if (mod) fprintf(stderr,"AlexAtt=%d Preamp=%d Dither=%d Random=%d\n", AlexAtt,preamp,LTdither,LTrandom);
+
+         mod=0;
+         rc=(frame[3] & 0x60) >> 5;
+         if (rc != alexRXant) {
+           mod=1;
+           alexRXant=rc;
+         }
+         rc=(frame[3] & 0x80) >> 7;
+         if (rc != alexRXout) {
+           mod=1;
+           alexRXout=rc;
+         }
+         rc=(frame[4] >> 0) & 3;
+         if (rc != AlexTXrel) {
+           mod=1;
+           AlexTXrel=rc;
+         }
+         rc=(frame[4] >> 2) & 1;
+         if (rc != duplex) {
+           mod=1;
+            duplex=rc;
+         }
+         if (mod) fprintf(stderr,"RXout=%d RXant=%d TXrel=%d Duplex=%d\n",alexRXout,alexRXant,AlexTXrel,duplex);
+
          if (OLDDEVICE == DEVICE_C25) {
               // Charly25: has two 18-dB preamps that are switched with "preamp" and "dither"
               //           and two attenuators encoded in Alex-ATT
index 70898ba0a98748fbb743ea8954224406fcbdde2d..0d9f833f941424bd6e50640de80ade8d360b4c47 100644 (file)
@@ -861,8 +861,6 @@ static void new_protocol_high_priority() {
       case NEW_DEVICE_ORION2:
 //
 //     new ANAN-7000/8000 band-pass RX filters
-//      This info comes from file bpf2_select.v in the
-//      P1 firmware
 //
 //     To support the ANAN-8000 we
 //     should bypass BPFs while transmitting in PURESIGNAL,
@@ -877,12 +875,12 @@ static void new_protocol_high_priority() {
           alex0|=ALEX_ANAN7000_RX_80_60_BPF;
         } else if(rxFrequency<11000000L) {
           alex0|=ALEX_ANAN7000_RX_40_30_BPF;
-        } else if(rxFrequency<20900000L) {
-          alex0|=ALEX_ANAN7000_RX_30_20_17_BPF;
+        } else if(rxFrequency<22000000L) {
+          alex0|=ALEX_ANAN7000_RX_20_15_BPF;
         } else if(rxFrequency<35000000L) {
-          alex0|=ALEX_ANAN7000_RX_15_12_BPF;
+          alex0|=ALEX_ANAN7000_RX_12_10_BPF;
         } else {
-          alex0|=ALEX_ANAN7000_RX_10_6_PRE_BPF;
+          alex0|=ALEX_ANAN7000_RX_6_PRE_BPF;
         }
         break;
       default:
@@ -921,41 +919,20 @@ static void new_protocol_high_priority() {
     if (!isTransmitting() && device != NEW_DEVICE_ORION2 && receiver[0]->alex_antenna < 3) {
        txFrequency = rxFrequency;
     }
-    switch(device) {
-      case NEW_DEVICE_ORION2:
-        if(txFrequency>32000000) {
-          alex0|=ALEX_6_BYPASS_LPF;
-        } else if(txFrequency>22000000) {
-          alex0|=ALEX_12_10_LPF;
-        } else if(txFrequency>15000000) {
-          alex0|=ALEX_17_15_LPF;
-        } else if(txFrequency>8000000) {
-          alex0|=ALEX_30_20_LPF;
-        } else if(txFrequency>4500000) {
-          alex0|=ALEX_60_40_LPF;
-        } else if(txFrequency>2400000) {
-          alex0|=ALEX_80_LPF;
-        } else {
-          alex0|=ALEX_160_LPF;
-        }
-        break;
-      default:
-        if(txFrequency>35600000) {
-          alex0|=ALEX_6_BYPASS_LPF;
-        } else if(txFrequency>24000000) {
-          alex0|=ALEX_12_10_LPF;
-        } else if(txFrequency>16500000) {
-          alex0|=ALEX_17_15_LPF;
-        } else if(txFrequency>8000000) {
-          alex0|=ALEX_30_20_LPF;
-        } else if(txFrequency>5000000) {
-          alex0|=ALEX_60_40_LPF;
-        } else if(txFrequency>2500000) {
-          alex0|=ALEX_80_LPF;
-        } else {
-          alex0|=ALEX_160_LPF;
-        }
-        break;
+    if(txFrequency>35600000L) {
+      alex0|=ALEX_6_BYPASS_LPF;
+    } else if(txFrequency>24000000L) {
+      alex0|=ALEX_12_10_LPF;
+    } else if(txFrequency>16500000L) {
+      alex0|=ALEX_17_15_LPF;
+    } else if(txFrequency>8000000L) {
+      alex0|=ALEX_30_20_LPF;
+    } else if(txFrequency>5000000L) {
+      alex0|=ALEX_60_40_LPF;
+    } else if(txFrequency>2500000L) {
+      alex0|=ALEX_80_LPF;
+    } else {
+      alex0|=ALEX_160_LPF;
     }
 
 //
@@ -1080,8 +1057,6 @@ static void new_protocol_high_priority() {
        }
 //
 //      new ANAN-7000/8000 band-pass RX filters
-//      This info comes from file bpf2_select.v in the
-//      P1 firmware
 //
         if(rxFrequency<1500000L) {
           alex1|=ALEX_ANAN7000_RX_BYPASS_BPF;
@@ -1091,12 +1066,12 @@ static void new_protocol_high_priority() {
           alex1|=ALEX_ANAN7000_RX_80_60_BPF;
         } else if(rxFrequency<11000000L) {
           alex1|=ALEX_ANAN7000_RX_40_30_BPF;
-        } else if(rxFrequency<20900000L) {
-          alex1|=ALEX_ANAN7000_RX_30_20_17_BPF;
+        } else if(rxFrequency<22000000L) {
+          alex1|=ALEX_ANAN7000_RX_20_15_BPF;
         } else if(rxFrequency<35000000L) {
-          alex1|=ALEX_ANAN7000_RX_15_12_BPF;
+          alex1|=ALEX_ANAN7000_RX_12_10_BPF;
         } else {
-          alex1|=ALEX_ANAN7000_RX_10_6_PRE_BPF;
+          alex1|=ALEX_ANAN7000_RX_6_PRE_BPF;
         }
 
 //
index 88b7a3a37f74c2e9deffb357b48e01b29d096143..5b00905f7e014adb1178dd87e10a2f2a0e413dff 100644 (file)
 #define LT2208_RANDOM_OFF         0x00
 #define LT2208_RANDOM_ON          0x10
 
+#define DEBUG_PROTO 1
+
+#ifdef DEBUG_PROTO
+/*
+ * This is for debugging the protocol
+ */
+
+static int C3_RX1_OUT=-1;
+static int C3_RX1_ANT=-1;
+static int C4_TX_REL=-1;
+static int PC_PTT=-1;
+static int CASE1=-1;
+static int CASE2=-1;
+
+static int C2_FB=-1;
+static int C3_HPF=-1;
+static int C3_BP=-1;
+static int C3_LNA=-1;
+static int C3_TXDIS=-1;
+
+static int C4_LPF=-1;
+
+static int C1_DRIVE=-1;
+
+static int proto_mod=0;
+static int proto_val;
+
+#define CHECK(x, var) proto_val=(x); if ((x) != var) { proto_mod=1; var=proto_val;}
+#endif
+
 //static int buffer_size=BUFFER_SIZE;
 
 static int display_width;
@@ -1185,6 +1215,11 @@ void ozy_send_buffer() {
         output_buffer[C3] |= 0x80;
        break;
     }
+#ifdef DEBUG_PROTO
+    CHECK(i, CASE1);
+    CHECK((output_buffer[C3] & 0x80) >> 7, C3_RX1_OUT);
+    CHECK((output_buffer[C3] & 0x60) >> 5, C3_RX1_ANT);
+#endif
 
 
     output_buffer[C4]=0x04;  // duplex
@@ -1230,6 +1265,11 @@ void ozy_send_buffer() {
           output_buffer[C4]|=0x03;
           break;
     }
+#ifdef DEBUG_PROTO
+    CHECK(i, CASE2);
+    CHECK(output_buffer[C4] & 0x03, C4_TX_REL);
+#endif
+
     // end of "C0=0" packet
   } else {
     //
@@ -1316,8 +1356,41 @@ void ozy_send_buffer() {
         if (isTransmitting() && transmitter->puresignal && receiver[PS_RX_FEEDBACK]->alex_antenna == 6) {
           output_buffer[C2] |= 0x40;  // enable manual filter selection
           output_buffer[C3] &= 0x80;  // preserve ONLY "PA enable" bit and clear all filters including "6m LNA"
-          output_buffer[C3] |= 0x20;  // bypass all filters
-        }
+          output_buffer[C3] |= 0x20;  // bypass all RX filters
+         //
+         // For "manual" filter selection we also need to select the appropriate TX LPF
+         // 
+         // We here use the transition frequencies used in Thetis by default. Note the
+         // P1 firmware has different default transition frequences.
+         // Even more odd, HERMES routes 15m through the 10/12 LPF, while
+         // Angelia routes 12m through the 17/15m LPF.
+         //
+         long long txFrequency = channel_freq(-1);
+         if (txFrequency > 35600000L) {                // > 10m so use 6m LPF
+           output_buffer[C4] = 0x10;
+         } else if (txFrequency > 24000000L)  {        // > 15m so use 10/12m LPF
+           output_buffer[C4] = 0x20;
+         } else if (txFrequency > 16500000L) {         // > 20m so use 17/15m LPF
+           output_buffer[C4] = 0x40;
+         } else if (txFrequency >  8000000L) {         // > 40m so use 30/20m LPF
+           output_buffer[C4] = 0x01;
+         } else if (txFrequency >  5000000L) {         // > 80m so use 60/40m LPF
+           output_buffer[C4] = 0x02;
+         } else if (txFrequency >  2500000L) {         // > 160m so use 80m LPF
+           output_buffer[C4] = 0x04;
+         } else {                                      // < 2.5 MHz use 160m LPF
+           output_buffer[C4] = 0x08;
+         }
+       }
+#endif
+#ifdef DEBUG_PROTO
+       CHECK(output_buffer[C1], C1_DRIVE);
+       CHECK((output_buffer[C2] & 0xE0) >> 5, C2_FB);
+       CHECK(output_buffer[C3] & 0x1F, C3_HPF);
+        CHECK((output_buffer[C3] & 0x20) >> 5, C3_BP);
+        CHECK((output_buffer[C3] & 0x40) >> 6, C3_LNA);
+        CHECK((output_buffer[C3] & 0x80) >> 7, C3_TXDIS);
+        CHECK(output_buffer[C4], C4_LPF);
 #endif
         }
         break;
@@ -1486,6 +1559,20 @@ void ozy_send_buffer() {
       output_buffer[C0]|=0x01;
     }
   }
+#ifdef DEBUG_PROTO
+  CHECK(output_buffer[C0] & 1, PC_PTT);
+
+/*
+ * ship out line after each complete run
+ */
+  if (proto_mod && command == 1) {
+    fprintf(stderr,"DIS=%d DRIVE=%3d PTT=%d i1=%4d RXout=%d RXant=%d i2=%d TXrel=%d FB=%d BP=%d LNA=%d HPF=%02x LPF=%02x\n",
+     C3_TXDIS, C1_DRIVE, PC_PTT, CASE1, C3_RX1_OUT, C3_RX1_ANT, CASE2, C4_TX_REL,
+     C2_FB, C3_BP, C3_LNA, C3_HPF, C4_LPF);
+    proto_mod=0;
+  }
+#endif
+     
 
 #ifdef USBOZY
 //