]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
Removed ptt variable. Update the mox/tune/vox variables AFTER
authorc vw <dl1ycf@darc.de>
Fri, 17 May 2019 08:21:41 +0000 (10:21 +0200)
committerc vw <dl1ycf@darc.de>
Fri, 17 May 2019 08:21:41 +0000 (10:21 +0200)
rxtx() has been successfully executed.

Makefile
Makefile.mac
ext.c
hpsdrsim.c [changed mode: 0755->0644]
new_protocol.c
old_protocol.c
radio.c
radio.h
rigctl.c
toolbar.c

index 7e0014e51e7ffd9577cc2106dadbd50fce87bc8a..9070658364e3d78cadfa604a148148ec0e68be33 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -455,7 +455,7 @@ release: $(PROGRAM)
 #############################################################################
 
 hpsdrsim.o:    hpsdrsim.c
-       $(CC) -c -O hpsdrsim.c
+       $(CC) -c -O -DPORTAUDIO hpsdrsim.c
 
 hpsdrsim:      hpsdrsim.o
-       $(LINK) -o hpsdrsim hpsdrsim.o -lm -lpthread
+       $(LINK) -o hpsdrsim hpsdrsim.o -lm -lpthread -lportaudio
index 45aa79f3196ac25802e82f03488aac2bdc552b99..26491ea216d6c499844c21ce96ce9f2633e427e2 100644 (file)
@@ -456,10 +456,10 @@ release: $(PROGRAM)
 #############################################################################
 
 hpsdrsim.o:     hpsdrsim.c
-       $(CC) -c -O hpsdrsim.c 
+       $(CC) -c -O $(PORTAUDIO_OPTIONS) hpsdrsim.c
         
 hpsdrsim:       hpsdrsim.o
-       $(LINK) -o hpsdrsim hpsdrsim.o -lm -lpthread
+       $(LINK) -o hpsdrsim hpsdrsim.o -lm -lpthread $(AUDIO_LIBS)
 
 #############################################################################
 #
diff --git a/ext.c b/ext.c
index 0838bcb1e377a3efd4a4ff6e13cc53d7db692455..c86cd5c73216f5c7fa2ebed7ca2f49bef65e0773 100644 (file)
--- a/ext.c
+++ b/ext.c
@@ -88,11 +88,6 @@ int ext_noise_update(void *data) {
   return 0;
 }
 
-int ext_ptt_update(void *data) {
-  ptt_update((int)(uintptr_t)data);
-  return 0;
-}
-
 int ext_mox_update(void *data) {
   mox_update((int)(uintptr_t)data);
   return 0;
old mode 100755 (executable)
new mode 100644 (file)
index 7860577..667db75
@@ -11,9 +11,9 @@
  *
  * RF1: ADC noise (16-bit ADC) plus a  800 Hz signal at -100dBm
  * RF2: ADC noise (16-bit ADC) plus a 2000 Hz signal at - 80dBm
- * RF3: (upon TX with sample rate=48000): TX feedback signal with some distortion. This signal is modulated
+ * RF3: TX feedback signal with some distortion. This signal is modulated
  *      according to the "TX drive" and "TX ATT" settings.
- * RF4: (upon TX with sample rate=48000): TX signal with a peak value of 0.400
+ * RF4: TX signal with a peak value of 0.400
  *
  * RF1 and RF2 are attenuated according to the preamp/attenuator settings.
  * RF3 respects the "TX drive" and "TX ATT" settings
@@ -31,8 +31,6 @@
  * DEVICE=HERMES:   RX3=RF3, RX4=RF4  (also for DEVICE=StemLab)
  * DEVICE=ORION2:   RX4=RF3, RX5=RF5  (also for DEVICE=ANGELIA and ORION)
  *
- * Note that currently, RF3 and RF4 only exist when using 48000 Hz sample rate. 
- * 
  */
 #include <stdio.h>
 #include <errno.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
+#ifdef PORTAUDIO
+#include "portaudio.h"
+void audio_get_cards(void);
+void audio_open_output();
+void audio_write(short, short);
+#endif
+
 
 #ifndef __APPLE__
 // using clock_nanosleep of librt
@@ -76,12 +81,10 @@ static int          MicTS = -1;
 static int             duplex = -1;
 static int             receivers = -1;
 static int             rate = -1;
-static int             preamp = -1;
+static int              preamp = -1;
 static int             LTdither = -1;
 static int             LTrandom = -1;
-static int             AlexRXant = -1;
-static int             AlexRXout = -1;
-static int             ref10 = -1;
+static int              ref10 = -1;
 static int             src122 = -1;
 static int             PMconfig = -1;
 static int             MicSrc = -1;
@@ -110,6 +113,11 @@ static long                rx_freq[7] = {-1,-1,-1,-1,-1,-1,-1};
 static int             hermes_config=-1;
 static int             alex_lpf=-1;
 static int             alex_hpf=-1;
+static int             alex_manual=-1;
+static int             alex_bypass=-1;
+static int             lna6m=-1;
+static int             alexTRdisable=-1;
+static int             vna=-1;
 static int             c25_ext_board_i2c_data=-1;
 static int             rx_adc[7]={0,1,1,2,-1,-1,-1};
 static int             cw_hang = -1;
@@ -120,7 +128,7 @@ static int          cw_weight = -1;
 static int             cw_spacing = -1;
 static int             cw_delay = -1;
 static int             CommonMercuryFreq = -1;
-static int             freq=-1;
+static int              freq=-1;
 
 
 // floating-point represeners of TX att, RX att, and RX preamp settings
@@ -147,10 +155,16 @@ void *handler_ep6(void *arg);
  * The TX data ring buffer
  */
 
-// 63 * 130,  RTXLEN must be an even multiple of 63!
-#define RTXLEN 8190
+// RTXLEN must be an sixteen-fold multiple of 63
+// because we have 63 samples per 512-byte METIS packet,
+// and two METIS packets per TCP/UDP packet,
+// and two/four/eight-fold up-sampling if the TX sample
+// rate is 96000/192000/384000
+#define RTXLEN 64512
 static double  isample[RTXLEN];
 static double  qsample[RTXLEN];
+static double  last_i_sample=0.0;
+static double  last_q_sample=0.0;
 static int  txptr=0;
 static int  rxptr=0;
 
@@ -168,7 +182,7 @@ int main(int argc, char *argv[])
 
        uint8_t id[4] = { 0xef, 0xfe, 1, 6 };
        uint32_t code;
-        int16_t  sample;
+        int16_t  sample,l,r;
 
        struct sockaddr_in addr_ep2, addr_from;
        uint8_t buffer[1032];
@@ -185,10 +199,15 @@ int main(int argc, char *argv[])
        int bytes_read, bytes_left;
        uint32_t *code0 = (uint32_t *) buffer;  // fast access to code of first buffer
 
+#ifdef PORTAUDIO
+       audio_get_cards();
+        audio_open_output();
+#endif
 /*
- *      Examples for METIS:    ANAN10E, ANAN100B
- *      Examples for HERMES:   HERMES, ANAN10, ANAN100
- *     Examples for ORION:     ANAN100D, ANAN200D
+ *      Examples for METIS:    Mercury/Penelope boards
+ *      Examples for HERMES:   ANAN10, ANAN100
+ *      Examples for ANGELIA:   ANAN100D
+ *     Examples for ORION:     ANAN200D
  *     Examples for ORION2:    ANAN7000D, ANAN8000D
  */
 
@@ -396,46 +415,91 @@ int main(int argc, char *argv[])
 
                                last_seqnum = seqnum;
 
-                                // Put TX IQ samples into the ring buffer
-                               // In the old protocol, samples come in groups of 8 bytes L1 L0 R1 R0 I1 I0 Q1 Q0
-                               // Here, L1/L0 and R1/R0 are audio samples, and I1/I0 and Q1/Q0 are the TX iq samples
-                               // I1 contains bits 8-15 and I0 bits 0-7 of a signed 16-bit integer. We convert this
-                               // here to double
-                                if (ptt) {
-                                   bp=buffer+16;  // skip 8 header and 8 SYNC/C&C bytes
-                                   for (j=0; j<63; j++) {
-                                       bp += 4;  // skip microphone samples
-                                       sample  = (int)((signed char) *bp++)<<8;
-                                       sample |= (int) ((signed char) *bp++ & 0xFF);
-                                        isample[txptr]=(double) sample/ 32768.0;
+                               process_ep2(buffer + 11);
+                               process_ep2(buffer + 523);
+
+                               if (active_thread) {
+                                  // Put TX IQ samples into the ring buffer
+                                 // In the old protocol, samples come in groups of 8 bytes L1 L0 R1 R0 I1 I0 Q1 Q0
+                                 // Here, L1/L0 and R1/R0 are audio samples, and I1/I0 and Q1/Q0 are the TX iq samples
+                                 // I1 contains bits 8-15 and I0 bits 0-7 of a signed 16-bit integer. We convert this
+                                 // here to double. If the RX sample rate is larger than the TX on, we perform a
+                                 // simple linear interpolation between the last and current sample.
+                                 // Note that this interpolation causes weak "sidebands" at 48/96/... kHz distance (the
+                                 // strongest ones at 48 kHz).
+                                 double disample,dqsample,idelta,qdelta;
+                                  bp=buffer+16;  // skip 8 header and 8 SYNC/C&C bytes
+                                  for (j=0; j<126; j++) {
+#ifdef PORTAUDIO
+                                       // write audio samples
+                                       r  = (int)((signed char) *bp++)<<8;
+                                       r |= (int)((signed char) *bp++ & 0xFF);
+                                       l  = (int)((signed char) *bp++)<<8;
+                                       l |= (int)((signed char) *bp++ & 0xFF);
+                                        audio_write(r,l);
+#else
+                                       bp += 4;
+#endif
                                        sample  = (int)((signed char) *bp++)<<8;
                                        sample |= (int) ((signed char) *bp++ & 0xFF);
-                                       qsample[txptr]=(double) sample/32768.0;
-                                       txptr++;
-                                   }
-                                   bp+=8; // skip 8  SYNC/C&C bytes of second 512-byte-block
-                                   for (j=0; j<63; j++) {
-                                       bp += 4;  // skip microphone samples
-                                       sample  = (int)((signed char) *bp++)<<8;
-                                       sample |= (int)((signed char) *bp++ & 0xFF);
-                                        isample[txptr]=(double) sample/32768.0;
+                                       disample=(double) sample / 32768.0;
                                        sample  = (int)((signed char) *bp++)<<8;
                                        sample |= (int) ((signed char) *bp++ & 0xFF);
-                                       qsample[txptr]=(double) sample/32768.0;
-                                       txptr++;
-                                   }
-                                } else {
-                                  // put silence into TX buffer
-                                  for (j=0; j<126; j++) {
-                                       isample[txptr]=0.0;
-                                       qsample[txptr++]=0.0;
-                                  }    
+                                       dqsample=(double) sample / 32768.0;
+
+                                       switch (rate) {
+                                           case 0:  // RX sample rate = TX sample rate = 48000
+                                               isample[txptr  ]=disample;
+                                               qsample[txptr++]=dqsample;
+                                               break;
+                                           case 1: // RX sample rate = 96000; TX sample rate = 48000
+                                               idelta=0.5*(disample-last_i_sample);
+                                               qdelta=0.5*(dqsample-last_q_sample);
+                                               isample[txptr  ]=last_i_sample+idelta;
+                                               qsample[txptr++]=last_q_sample+qdelta;
+                                               isample[txptr  ]=disample;
+                                               qsample[txptr++]=dqsample;
+                                               break;
+                                           case 2: // RX sample rate = 192000; TX sample rate = 48000
+                                               idelta=0.25*(disample-last_i_sample);
+                                               qdelta=0.25*(dqsample-last_q_sample);
+                                               isample[txptr  ]=last_i_sample+idelta;
+                                               qsample[txptr++]=last_q_sample+qdelta;
+                                               isample[txptr  ]=last_i_sample+2.0*idelta;
+                                               qsample[txptr++]=last_q_sample+2.0*qdelta;
+                                               isample[txptr  ]=last_i_sample+3.0*idelta;
+                                               qsample[txptr++]=last_q_sample+3.0*qdelta;
+                                               isample[txptr  ]=disample;
+                                               qsample[txptr++]=dqsample;
+                                               break;
+                                           case 3: // RX sample rate = 384000; TX sample rate = 48000
+                                               idelta=0.125*(disample-last_i_sample);
+                                               qdelta=0.125*(dqsample-last_q_sample);
+                                               isample[txptr  ]=last_i_sample+idelta;
+                                               qsample[txptr++]=last_q_sample+qdelta;
+                                               isample[txptr  ]=last_i_sample+2.0*idelta;
+                                               qsample[txptr++]=last_q_sample+2.0*qdelta;
+                                               isample[txptr  ]=last_i_sample+3.0*idelta;
+                                               qsample[txptr++]=last_q_sample+3.0*qdelta;
+                                               isample[txptr  ]=last_i_sample+4.0*idelta;
+                                               qsample[txptr++]=last_q_sample+4.0*qdelta;
+                                               isample[txptr  ]=last_i_sample+5.0*idelta;
+                                               qsample[txptr++]=last_q_sample+5.0*qdelta;
+                                               isample[txptr  ]=last_i_sample+6.0*idelta;
+                                               qsample[txptr++]=last_q_sample+6.0*qdelta;
+                                               isample[txptr  ]=last_i_sample+7.0*idelta;
+                                               qsample[txptr++]=last_q_sample+7.0*qdelta;
+                                               isample[txptr  ]=disample;
+                                               qsample[txptr++]=dqsample;
+                                               break;
+                                       }
+                                       last_i_sample=disample;
+                                       last_q_sample=dqsample;
+                                       if (j == 62) bp+=8; // skip 8 SYNC/C&C bytes of second block
+                                 }
+                                // wrap-around of ring buffer
+                                 if (txptr >= RTXLEN) txptr=0;
                                }
-                               // wrap-around of ring buffer
-                                if (txptr >= RTXLEN) txptr=0;
-
-                               process_ep2(buffer + 11);
-                               process_ep2(buffer + 523);
                                break;
 
                                // respond to an incoming Metis detection request
@@ -527,7 +591,7 @@ int main(int argc, char *argv[])
                                addr_ep6.sin_addr.s_addr = addr_from.sin_addr.s_addr;
                                addr_ep6.sin_port = addr_from.sin_port;
 
-                                txptr=3150;  // must be even multiple of 63
+                                txptr=(25 << rate) * 126;  // must be even multiple of 63
                                 rxptr=0;
                                memset(isample, 0, RTXLEN*sizeof(double));
                                memset(qsample, 0, RTXLEN*sizeof(double));
@@ -607,7 +671,8 @@ void process_ep2(uint8_t *frame)
 
          if (isc25) {
              // Charly25: has two 18-dB preamps that are switched with "preamp" and "dither"
-             //           and a step-attenuator triggered by Alex ATT ONLY RX1!
+             //           and two attenuators encoded in Alex-ATT
+            //           Both only applies to RX1!
                rxatt_dbl[0]=pow(10.0, -0.05*(12*att-18*LTdither-18*preamp));
                rxatt_dbl[1]=1.0;
           }
@@ -656,8 +721,13 @@ void process_ep2(uint8_t *frame)
        case 18:
        case 19:
           chk_data(frame[1],txdrive,"TX DRIVE");
-          chk_data(frame[2],hermes_config,"HERMES CONFIG");
-          chk_data(frame[3],alex_hpf,"ALEX HPF");
+          chk_data(frame[2] & 0x3F,hermes_config,"HERMES CONFIG");
+          chk_data(frame[2] & 0x40, alex_manual,"ALEX manual HPF/LPF");
+          chk_data(frame[2] & 0x70, vna     ,"VNA mode");
+          chk_data(frame[3] & 0x1F,alex_hpf,"ALEX HPF");
+          chk_data(frame[3] & 0x20,alex_bypass,"ALEX Bypass HPFs");
+          chk_data(frame[3] & 0x40,lna6m,"ALEX 6m LNA");
+          chk_data(frame[3] & 0x80,alexTRdisable,"ALEX T/R disable");
           chk_data(frame[4],alex_lpf,"ALEX LPF");
            // reset TX level
           txdrv_dbl=(double) txdrive / 255.0;
@@ -861,9 +931,11 @@ void *handler_ep6(void *arg)
 
 //
 //             This defines the distortion as well as the amplification
+//              Use PA settings such that there is full drive at full
+//              power (39 dB)
 //
-#define IM3a  0.70
-#define IM3b  0.15
+#define IM3a  0.60
+#define IM3b  0.20
 
                for (i = 0; i < 2; ++i)
                {
@@ -908,7 +980,7 @@ void *handler_ep6(void *arg)
                            myqsample=0;
                            switch (k) {
                              case 0: // RX1
-                               if (rate == 0 && ptt && ismetis) {
+                               if (ptt && ismetis) {
                                    myisample=rf3isample;
                                    myqsample=rf3qsample;
                                } else {
@@ -917,7 +989,7 @@ void *handler_ep6(void *arg)
                                }
                                break;
                              case 1: // RX2
-                               if (rate == 0 && ptt && ismetis) {
+                               if (ptt && ismetis) {
                                    myisample=rf4isample;
                                    myqsample=rf4qsample;
                                } else {
@@ -926,7 +998,7 @@ void *handler_ep6(void *arg)
                                }
                                break;
                              case 2:
-                                if (rate == 0 && ptt && ishermes) {
+                                if (ptt && ishermes) {
                                    myisample=rf3isample;
                                    myqsample=rf3qsample;
                                 } else {
@@ -935,16 +1007,16 @@ void *handler_ep6(void *arg)
                                }
                                break;
                              case 3: // RX4
-                               if (rate == 0 && ptt && ishermes) {
+                               if (ptt && ishermes) {
                                    myisample=rf4isample;
                                    myqsample=rf4qsample;
-                                       } else if (rate == 0 && ptt && isorion) {
+                                       } else if (ptt && isorion) {
                                    myisample=rf3isample;
                                    myqsample=rf3qsample;
                                }
                                break;
                              case 4: // RX5
-                                       if (rate == 0 && ptt && isorion) {
+                                       if (ptt && isorion) {
                                    myisample=rf4isample;
                                    myqsample=rf4qsample;
                                }
@@ -1008,3 +1080,98 @@ void *handler_ep6(void *arg)
        active_thread = 0;
        return NULL;
 }
+
+#ifdef PORTAUDIO
+// PORTAUDIO output function
+
+static int padev = -1;
+static float playback_buffer[256];
+static PaStream  *playback_handle=NULL;
+int playback_offset;
+
+
+void audio_get_cards()
+{
+  int i, numDevices;
+  const PaDeviceInfo *deviceInfo;
+  PaStreamParameters inputParameters, outputParameters;
+
+  PaError err;
+
+  err = Pa_Initialize();
+  if( err != paNoError )
+  {
+        fprintf(stderr, "PORTAUDIO ERROR: Pa_Initialize: %s\n", Pa_GetErrorText(err));
+        return;
+  }
+  numDevices = Pa_GetDeviceCount();
+  if( numDevices < 0 ) return;
+
+  for( i=0; i<numDevices; i++ )
+  {
+        deviceInfo = Pa_GetDeviceInfo( i );
+
+        outputParameters.device = i;
+        outputParameters.channelCount = 1;
+        outputParameters.sampleFormat = paFloat32;
+        outputParameters.suggestedLatency = 0; /* ignored by Pa_IsFormatSupported() */
+        outputParameters.hostApiSpecificStreamInfo = NULL;
+        if (Pa_IsFormatSupported(NULL, &outputParameters, 48000.0) == paFormatIsSupported) {
+          padev=i;
+          fprintf(stderr,"PORTAUDIO OUTPUT DEVICE, No=%d, Name=%s\n", i, deviceInfo->name);
+         return;
+        }
+  }
+}
+
+void audio_open_output()
+{
+  PaError err;
+  PaStreamParameters outputParameters;
+  long framesPerBuffer=256;
+
+  bzero( &outputParameters, sizeof( outputParameters ) ); //not necessary if you are filling in all the fields
+  outputParameters.channelCount = 1;   // Always MONO
+  outputParameters.device = padev;
+  outputParameters.hostApiSpecificStreamInfo = NULL;
+  outputParameters.sampleFormat = paFloat32;
+  outputParameters.suggestedLatency = Pa_GetDeviceInfo(padev)->defaultLowOutputLatency ;
+  outputParameters.hostApiSpecificStreamInfo = NULL; //See you specific host's API docs for info on using this field
+
+  // Try using AudioWrite without a call-back function
+
+  playback_offset=0;
+  err = Pa_OpenStream(&(playback_handle), NULL, &outputParameters, 48000.0, framesPerBuffer, paNoFlag, NULL, NULL);
+  if (err != paNoError) {
+    fprintf(stderr,"PORTAUDIO ERROR: AOO open stream: %s\n",Pa_GetErrorText(err));
+    playback_handle = NULL;
+    return;
+  }
+
+  err = Pa_StartStream(playback_handle);
+  if (err != paNoError) {
+    fprintf(stderr,"PORTAUDIO ERROR: AOO start stream:%s\n",Pa_GetErrorText(err));
+    playback_handle=NULL;
+    return;
+  }
+  // Write one buffer to avoid under-flow errors
+  // (this gives us 5 msec to pass before we have to call audio_write the first time)
+  bzero(playback_buffer, (size_t) (256*sizeof(float)));
+  err=Pa_WriteStream(playback_handle, (void *) playback_buffer, (unsigned long) 256);
+
+  return;
+}
+
+void audio_write (short l, short r)
+{
+  PaError err;
+  if (playback_handle != NULL) {
+    playback_buffer[playback_offset++] = (r + l) *0.000015259;  //   65536 --> 1.0
+    if (playback_offset == 256) {
+      playback_offset=0;
+      err=Pa_WriteStream(playback_handle, (void *) playback_buffer, (unsigned long) 256);
+    }
+  }
+}
+
+#endif
index 072ea09d2f34b13831c39f25e67bcbb9777f7f58..9d855e7b12fc557b5a9d1f4f4d2efd4519d7f7a0 100644 (file)
@@ -1513,11 +1513,11 @@ static void process_high_priority(unsigned char *buffer) {
 
     sequence=((high_priority_buffer[0]&0xFF)<<24)+((high_priority_buffer[1]&0xFF)<<16)+((high_priority_buffer[2]&0xFF)<<8)+(high_priority_buffer[3]&0xFF);
 
-    previous_ptt=ptt;
+    previous_ptt=local_ptt;
     previous_dot=dot;
     previous_dash=dash;
 
-    ptt=high_priority_buffer[4]&0x01;
+    local_ptt=high_priority_buffer[4]&0x01;
     dot=(high_priority_buffer[4]>>1)&0x01;
     dash=(high_priority_buffer[4]>>2)&0x01;
     pll_locked=(high_priority_buffer[4]>>3)&0x01;
@@ -1528,12 +1528,11 @@ static void process_high_priority(unsigned char *buffer) {
     supply_volts=((high_priority_buffer[49]&0xFF)<<8)|(high_priority_buffer[50]&0xFF);
 
     int tx_vfo=split?VFO_B:VFO_A;
-    local_ptt=ptt;
     if(vfo[tx_vfo].mode==modeCWL || vfo[tx_vfo].mode==modeCWU) {
-      local_ptt=ptt|dot|dash;
+      local_ptt=local_ptt|dot|dash;
     }
     if(previous_ptt!=local_ptt) {
-      g_idle_add(ext_ptt_update,(gpointer)(long)(local_ptt));
+      g_idle_add(ext_mox_update,(gpointer)(long)(local_ptt));
     }
 }
 
index c12a7b19ce72931cd44da0c0fa33df893781946f..9ed692693531bcd2e901e83914efb78bd8b9e802 100644 (file)
@@ -571,20 +571,22 @@ static void process_ozy_input_buffer(unsigned char  *buffer) {
     control_in[3]=buffer[b++];
     control_in[4]=buffer[b++];
 
+    // do not set ptt. In PURESIGNAL, this would stop the
+    // receiver sending samples to WDSP abruptly.
+    // Do the RX-TX change only via ext_mox_update.
     previous_ptt=local_ptt;
     previous_dot=dot;
     previous_dash=dash;
-    ptt=(control_in[0]&0x01)==0x01;
+    local_ptt=(control_in[0]&0x01)==0x01;
     dash=(control_in[0]&0x02)==0x02;
     dot=(control_in[0]&0x04)==0x04;
 
-    local_ptt=ptt;
     if (dot || dash) cw_key_hit=1;
     if(vfo[tx_vfo].mode==modeCWL || vfo[tx_vfo].mode==modeCWU) {
-      local_ptt=ptt|dot|dash;
+      local_ptt=local_ptt|dot|dash;
     }
     if(previous_ptt!=local_ptt) {
-      g_idle_add(ext_ptt_update,(gpointer)(long)(local_ptt));
+      g_idle_add(ext_mox_update,(gpointer)(long)(local_ptt));
     }
 
 
diff --git a/radio.c b/radio.c
index b4ccf889e3e7cf9eb99331ae7d8f5063d9d2c03b..ad396ae4b7a14a46b46d68870cc6597b8058594c 100644 (file)
--- a/radio.c
+++ b/radio.c
@@ -228,7 +228,6 @@ int device;
 int ozy_software_version;
 int mercury_software_version;
 int penelope_software_version;
-int ptt;
 int dot;
 int dash;
 int adc_overload;
@@ -728,7 +727,11 @@ static void rxtx(int state) {
 #endif
 
     for(i=0;i<receivers;i++) {
+#ifdef PURESIGNAL
+#else
+      // Original code: wait 
       SetChannelState(receiver[i]->id,0,i==(receivers-1));
+#endif
       set_displaying(receiver[i],0);
       if(protocol==NEW_PROTOCOL) {
         schedule_high_priority();
@@ -785,12 +788,12 @@ static void rxtx(int state) {
 
 void setMox(int state) {
   if(mox!=state) {
-    mox=state;
     if(vox_enabled && vox) {
       vox_cancel();
     } else {
       rxtx(state);
     }
+    mox=state;
   }
 }
 
@@ -800,8 +803,8 @@ int getMox() {
 
 void setVox(int state) {
   if(vox!=state && !tune) {
-    vox=state;
     rxtx(state);
+    vox=state;
   }
   g_idle_add(ext_vfo_update,(gpointer)NULL);
 }
@@ -815,11 +818,10 @@ void setTune(int state) {
   int i;
 
   if(tune!=state) {
-    tune=state;
     if(vox_enabled && vox) {
       vox_cancel();
     }
-    if(tune) {
+    if(state) {
       if(full_tune) {
         if(OCfull_tune_time!=0) {
           struct timeval te;
@@ -839,7 +841,7 @@ void setTune(int state) {
       schedule_high_priority();
       //schedule_general();
     }
-    if(tune) {
+    if(state) {
       for(i=0;i<receivers;i++) {
         SetChannelState(receiver[i]->id,0,i==(receivers-1));
         set_displaying(receiver[i],0);
@@ -887,9 +889,9 @@ void setTune(int state) {
           tx_set_mode(transmitter,modeUSB);
           break;
       }
-      rxtx(tune);
+      rxtx(state);
     } else {
-      rxtx(tune);
+      rxtx(state);
       SetTXAPostGenRun(transmitter->id,0);
       switch(pre_tune_mode) {
         case modeCWL:
@@ -898,8 +900,8 @@ void setTune(int state) {
           cw_keyer_internal=1;
           break;
       }
-
     }
+    tune=state;
   }
 }
 
@@ -929,7 +931,7 @@ void radio_cw_key(int state) {
 }
 
 int isTransmitting() {
-  return ptt | mox | vox | tune;
+  return mox | vox | tune;
 }
 
 void setFrequency(long long f) {
diff --git a/radio.h b/radio.h
index 943ed24e6008bcfc80c68abac92456e86a4ebf7d..3f38bfc08bbd74014d369809b677953ddfb845ae 100644 (file)
--- a/radio.h
+++ b/radio.h
@@ -183,7 +183,6 @@ extern int mox;
 extern int tune;
 extern int memory_tune;
 extern int full_tune;
-extern int ptt;
 extern int dot;
 extern int dash;
 extern int adc_overload;
index f60f5db7b0d87105948f730193823d84f77de2e6..7ec96d95ecfb696c14b4a21e61304517d6b04e72 100644 (file)
--- a/rigctl.c
+++ b/rigctl.c
@@ -549,7 +549,7 @@ static gpointer rigctl_cw_thread(gpointer data)
     CAT_cw_is_active=1;
     if (!mox) {
        // activate PTT
-        g_idle_add(ext_ptt_update ,(gpointer)1);
+        g_idle_add(ext_mox_update ,(gpointer)1);
        // have to wait until it is really there
        // Note that if out-of-band, we would wait
        // forever here, so allow at most 500 msec
@@ -571,7 +571,7 @@ static gpointer rigctl_cw_thread(gpointer data)
        // If a CW key has been hit, we continue in TX mode.
        // Otherwise, switch PTT off.
        if (!cw_key_hit && mox) {
-         g_idle_add(ext_ptt_update ,(gpointer)0);
+         g_idle_add(ext_mox_update ,(gpointer)0);
        }
        // Let the CAT system swallow incoming CW commands by setting cw_busy to -1.
        // Do so until no CAT CW message has arrived for 1 second
@@ -596,7 +596,7 @@ static gpointer rigctl_cw_thread(gpointer data)
       if (cw_busy || num_buf > 0) continue;
       CAT_cw_is_active=0;
       if (!cw_key_hit) {
-        g_idle_add(ext_ptt_update ,(gpointer)0);
+        g_idle_add(ext_mox_update ,(gpointer)0);
         // wait up to 500 msec for MOX having gone
         // otherwise there might be a race condition when sending
         // the next character really soon
@@ -614,7 +614,7 @@ static gpointer rigctl_cw_thread(gpointer data)
   cw_busy=0;
   if (CAT_cw_is_active) {
     CAT_cw_is_active=0;
-    g_idle_add(ext_ptt_update ,(gpointer)0);
+    g_idle_add(ext_mox_update ,(gpointer)0);
   }
   return NULL;
 }
index b1fc62a97a658b731b7ff30d4169aa3adac34c1d..4a1ad9f7eccbd014b577a1e4fbd6732ac0b2d082 100644 (file)
--- a/toolbar.c
+++ b/toolbar.c
@@ -342,9 +342,6 @@ void mox_cb(GtkWidget *widget, gpointer data) {
   }
   if(getMox()==1) {
     setMox(0);
-    if(ptt) {
-      ptt=0;
-    }
   } else if(canTransmit() || tx_out_of_band) {
     setMox(1);
   } else {
@@ -369,10 +366,6 @@ void mox_update(int state) {
   g_idle_add(ext_vfo_update,NULL);
 }
 
-void ptt_update(int state) {
-  mox_update(state);
-}
-
 void tune_cb(GtkWidget *widget, gpointer data) {
   if(getMox()==1) {
     setMox(0);