From f15ad2b9a2f297a5380e0790e0c03eb557bfb97a Mon Sep 17 00:00:00 2001
From: Joe Taylor <joe@princeton.edu>
Date: Thu, 2 Mar 2023 11:56:01 -0500
Subject: [PATCH] Ctrl-click to delete a call from the Q65-pileup list.  Not
 finished!

---
 lib/get_q3list.f90         | 107 ++++++++++++++++++++++++++++++-------
 lib/q65_decode.f90         |  18 +++----
 lib/qra/q65/q65.f90        |  12 +++--
 lib/types.f90              |   1 +
 widgets/activeStations.cpp |   1 +
 widgets/mainwindow.cpp     |  19 +++++--
 6 files changed, 120 insertions(+), 38 deletions(-)

diff --git a/lib/get_q3list.f90 b/lib/get_q3list.f90
index 997c0ad9d..7ca54e447 100644
--- a/lib/get_q3list.f90
+++ b/lib/get_q3list.f90
@@ -5,6 +5,7 @@ subroutine get_q3list(fname,bDiskData,nlist,list)
      character*4 grid
      integer nsec
      integer nfreq
+     integer moonel
   end type q3list
 
   parameter (MAX_CALLERS=40)
@@ -15,51 +16,121 @@ subroutine get_q3list(fname,bDiskData,nlist,list)
   integer time
   integer nt(8)
   integer indx(MAX_CALLERS)
-  type(q3list) callers(MAX_CALLERS)
-  character*256 jpleph_file_name
+  type(q3list) ctmp(MAX_CALLERS),callers(MAX_CALLERS)
+  character*256 jpleph_file_name,file24name
   common/jplcom/jpleph_file_name
+  common/lu24com/file24name
 
   nhist2=0
-  open(24,file=fname,status='unknown',form='unformatted')
-  read(24,end=1) nhist2
+! open(24,file=fname,status='unknown',form='unformatted')
+  open(24,file=fname,status='unknown')
+!  read(24,end=1) nhist2
+  read(24,*,end=1) nhist2
   if(nhist2.ge.1 .and. nhist2.le.40) then
-     read(24,end=1) callers(1:nhist2)
+!     read(24,end=1) ctmp(1:nhist2)
+     read(24,3001,end=1) ctmp(1:nhist2)
+3001 format(a6,2x,a4,2x,i11,2i5)
   else
      nhist2=0
   endif
-1 close(24)
+1 rewind 24
+  if(nhist2.eq.0) go to 900
 
   now=time()
   call date_and_time(values=nt)
   uth=nt(5) + (nt(6)-nt(4))/60.0 + nt(7)/3600.0
-  nlist=nhist2
-  call indexx(callers(1:nlist)%nfreq,nlist,indx)
-  do i=1,nlist
-     age=(now - callers(i)%nsec)/3600.0
-     j=indx(i)
-     grid6=callers(j)%grid//'mm'
+  j=0
+  
+  do i=1,nhist2
+     age=(now - ctmp(i)%nsec)/3600.0
+     if(age.gt.24.0) cycle
+     grid6=ctmp(i)%grid//'mm'
      call grid2deg(grid6,xlon,xlat)
      call sun(nt(1),nt(2),nt(3),uth,-xlon,xlat,RASun,DecSun,xLST,        &
           AzSun,ElSun,mjd,day)
      call moondopjpl(nt(1),nt(2),nt(3),uth,-xlon,xlat,RAMoon,DecMoon,    &
           xLST,HA,AzMoon,ElMoon,vr,techo)
+     if(ElMoon.lt.0.0 .and. (.not.bDiskData)) cycle
+     j=j+1                                   !Keep this one...
+     callers(j)=ctmp(i)
+     callers(j)%moonel=nint(ElMoon)          !... and save its current moonel
+  enddo
+
+  nhist2=j
+!  write(24) nhist2
+  write(24,*) nhist2
+!  write(24) callers(1:nhist2)
+  write(24,3001) callers(1:nhist2)
+
+  call indexx(callers(1:nhist2)%nfreq,nhist2,indx)
+  do i=1,nhist2
+     j=indx(i)
      moon_el=nint(ElMoon)
+     age=(now - callers(j)%nsec)/3600.0
      write(list(i),1000) i,callers(j)%nfreq,callers(j)%call,    &
-          callers(j)%grid,moon_el,age,char(0)
+          callers(j)%grid,callers(j)%moonel,age,char(0)
 1000 format(i2,'.',i6,2x,a6,2x,a4,i5,f7.1,a1)
 
-     h1=mod(now,86400)/3600.0
-     h2=mod(callers(i)%nsec,86400)/3600.0
-     hd=h1-h2
-     if(hd.lt.0.0) hd=hd+24.0
+!     h1=mod(now,86400)/3600.0
+!     h2=mod(callers(i)%nsec,86400)/3600.0
+!     hd=h1-h2
+!     if(hd.lt.0.0) hd=hd+24.0
 !     write(*,3301) i,callers(i)%call,now,callers(i)%nsec,h1,h2,hd
 !3301 format(i3,2x,a6,2i12,3f10.6)
 
   enddo
-  
+
+900 close(24)
+  nlist=nhist2
+  file24name=fname
+
   return
 end subroutine get_q3list
 
+subroutine rm_q3list(dxcall0)
+
+  parameter (MAX_CALLERS=40)
+  type q3list
+     character*6 call
+     character*4 grid
+     integer nsec
+     integer nfreq
+     integer moonel
+  end type q3list
+  character*(*) dxcall0
+  character*6 dxcall
+  character*256 file24name
+  type(q3list) callers(MAX_CALLERS)
+  common/lu24com/file24name
+
+  dxcall=dxcall0
+  open(24,file=trim(file24name),status='unknown')
+  read(24,*) nhist2
+  read(24,3001) callers(1:nhist2)
+3001 format(a6,2x,a4,2x,i11,2i5)
+
+  if(nhist2.eq.MAX_CALLERS .and. dxcall.eq.callers(nhist2)%call) then
+     nhist2=MAX_CALLERS - 1
+     go to 10
+  endif
+
+  iz=nhist2
+  do i=1,iz
+     if(callers(i)%call .eq. dxcall) then
+        nhist2=nhist2-1
+        callers(i:nhist2)=callers(i+1:nhist2+1)    !Remove dxcall from q3list
+        exit
+     endif
+  enddo
+
+10 rewind 24
+  write(24,*) nhist2
+  write(24,3001) callers(1:nhist2)
+  close(24)
+
+  return
+end subroutine rm_q3list
+
 subroutine jpl_setup(fname)
   character*256 fname,jpleph_file_name
   common/jplcom/jpleph_file_name
diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90
index 95c7d91f7..1feb6b23c 100644
--- a/lib/q65_decode.f90
+++ b/lib/q65_decode.f90
@@ -114,11 +114,15 @@ contains
     mycall13=mycall
     if(ncontest.eq.1) then
 ! NA VHF, WW-Digi, or ARRL Digi Contest
-       open(24,file=trim(data_dir)//'/tsil.3q',status='unknown',     &
-            form='unformatted')
-       read(24,end=2) nhist2
+!       open(24,file=trim(data_dir)//'/tsil.3q',status='unknown',     &
+!            form='unformatted')
+       open(24,file=trim(data_dir)//'/tsil.3q',status='unknown')
+!       read(24,end=2) nhist2
+       read(24,*,end=2) nhist2
        if(nhist2.ge.1 .and. nhist2.le.40) then
-          read(24,end=2) callers(1:nhist2)
+!          read(24,end=2) callers(1:nhist2)
+          read(24,3001,end=2) callers(1:nhist2)
+3001      format(a6,2x,a4,2x,i11,2i5)
           now=time()
           do i=1,nhist2
              hours=(now - callers(i)%nsec)/3600.0
@@ -331,10 +335,7 @@ contains
           call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded,    &
                idec,nused,ntrperiod)
           if(ncontest.eq.1) then
-             open(24,file=trim(data_dir)//'/tsil.3q',status='unknown',     &
-                  form='unformatted')
              call q65_hist2(nint(f0dec),decoded,callers,nhist2)
-             close(24)
           else
              call q65_hist(nint(f0dec),msg0=decoded)
           endif
@@ -446,10 +447,7 @@ contains
              call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded,    &
                   idec,nused,ntrperiod)
              if(ncontest.eq.1) then
-                open(24,file=trim(data_dir)//'/tsil.3q',status='unknown',     &
-                     form='unformatted')
                 call q65_hist2(nint(f0dec),decoded,callers,nhist2)
-                close(24)
              else
                 call q65_hist(nint(f0dec),msg0=decoded)
              endif
diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90
index a93b12719..d044631b2 100644
--- a/lib/qra/q65/q65.f90
+++ b/lib/qra/q65/q65.f90
@@ -879,7 +879,7 @@ subroutine q65_hist2(nfreq,msg0,callers,nhist2)
        g4(4:4).ge.'0' .and. g4(4:4).le.'9' .and. g4(1:4).ne.'RR73'
 
   msg=msg0
-  if(index(msg,'/').gt.0) goto 900            !Ignore messages withcompound calls
+  if(index(msg,'/').gt.0) goto 900         !Ignore messages with compound calls
   i0=index(msg,' R ')
   if(i0.ge.7) msg=msg(1:i0)//msg(i0+3:)
   i1=index(msg,' ')
@@ -914,10 +914,12 @@ subroutine q65_hist2(nfreq,msg0,callers,nhist2)
   endif
 
   if(nhist2.ge.1 .and. nhist2.le.40) then
-     open(24,file=trim(data_dir)//'/tsil.3q',status='unknown',     &
-          form='unformatted')
-     write(24) nhist2
-     write(24) callers(1:nhist2)
+!     open(24,file=trim(data_dir)//'/tsil.3q',status='unknown',     &
+!          form='unformatted')
+     open(24,file=trim(data_dir)//'/tsil.3q',status='unknown')
+     write(24,*) nhist2
+     write(24,3001) callers(1:nhist2)
+3001 format(a6,2x,a4,2x,i11,2i5)
      close(24)
   endif
 
diff --git a/lib/types.f90 b/lib/types.f90
index 2b4be6272..0fb823202 100644
--- a/lib/types.f90
+++ b/lib/types.f90
@@ -12,6 +12,7 @@ module types
      character*4 grid
      integer nsec
      integer nfreq
+     integer moonel
   end type q3list
 
 end module types
diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp
index cc35ad3cd..2e29b6d85 100644
--- a/widgets/activeStations.cpp
+++ b/widgets/activeStations.cpp
@@ -83,6 +83,7 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t)
     ui->label->setVisible(b);
     ui->rate->setVisible(b);
   }
+  if(mode=="Q65-pileup") ui->RecentStationsPlainTextEdit->clear();
   ui->RecentStationsPlainTextEdit->insertPlainText(t);
 }
 
diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp
index 87a590e0c..7d03f84c4 100644
--- a/widgets/mainwindow.cpp
+++ b/widgets/mainwindow.cpp
@@ -188,6 +188,8 @@ extern "C" {
 
   void get_q3list_(char* fname, bool* bDiskData, int* nlist, char* list, FCL len1, FCL len2);
 
+  void rm_q3list_(char* callsign, FCL len);
+
   void jpl_setup_(char* fname, FCL len);
 }
 
@@ -3469,8 +3471,10 @@ void MainWindow::decode()                                       //decode()
         decodeBusy(true);
       }
     }
-  if((m_mode=="FT4" or (m_mode=="FT8" and m_ihsym==41) or m_diskData or m_mode=="Q65") and
-     m_ActiveStationsWidget != NULL) m_ActiveStationsWidget->erase();  //TEMP
+  if((m_mode=="FT4" or (m_mode=="FT8" and m_ihsym==41) or m_diskData) and
+     m_ActiveStationsWidget != NULL) {
+    if(m_mode!="Q65") m_ActiveStationsWidget->erase();  //TEMP
+  }
 }
 
 void::MainWindow::fast_decode_done()
@@ -3782,14 +3786,19 @@ void MainWindow::ARRL_Digi_Display()
 
 void MainWindow::callSandP2(int n)
 {
-  bool bHoldFreq = (n<0);
+  bool bCtrl = (n<0);
   n=qAbs(n)-1;
   if(m_mode!="Q65" and m_ready2call[n]=="") return;
   QStringList w=m_ready2call[n].split(' ', SkipEmptyParts);
   if(m_mode=="Q65" and m_specOp==SpecOp::Q65_PILEUP and n <= m_callers->size()) {
-    // This is the mode for 6m EME DXpeditions
+    // This code is for 6m EME DXpedition operator
     w=m_callers[n].split(' ', SkipEmptyParts);
     m_deCall=w[2];
+    if(bCtrl) {
+      // Remove this call from q3list.
+      rm_q3list_(const_cast<char *> (m_deCall.toLatin1().constData()), m_deCall.size());
+      return;
+    }
     m_deGrid=w[3];
     m_bDoubleClicked=true;               //### needed?
     m_txFirst=true;
@@ -3804,7 +3813,7 @@ void MainWindow::callSandP2(int n)
   }
 
   if(m_mode=="Q65") {
-    if(!bHoldFreq) {
+    if(!bCtrl) {                          //Do not reset m_freqNominal if CTRL was down
       double kHz=w[1].toDouble();
       int nMHz=m_freqNominal/1000000;
       m_freqNominal=(nMHz*1000 + kHz)* 1000;