mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	Merge branch 'develop' into feat-ft8-q3
This commit is contained in:
		
						commit
						6b2df37137
					
				@ -45,7 +45,7 @@ if (POLICY CMP0075)
 | 
				
			|||||||
endif ()
 | 
					endif ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
project (wsjtx
 | 
					project (wsjtx
 | 
				
			||||||
  VERSION 2.5.2.0
 | 
					  VERSION 2.6.0
 | 
				
			||||||
  LANGUAGES C CXX Fortran
 | 
					  LANGUAGES C CXX Fortran
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio")
 | 
					set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio")
 | 
				
			||||||
@ -71,7 +71,7 @@ message (STATUS "******************************************************")
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
include (set_build_type)
 | 
					include (set_build_type)
 | 
				
			||||||
# RC 0 or omitted is a development build, GA is a General Availability release build
 | 
					# RC 0 or omitted is a development build, GA is a General Availability release build
 | 
				
			||||||
set_build_type (RC GA)
 | 
					set_build_type (RC 1)
 | 
				
			||||||
set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}")
 | 
					set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
@ -506,6 +506,7 @@ set (wsjt_FSRCS
 | 
				
			|||||||
  lib/qra/q65/q65_set_list.f90
 | 
					  lib/qra/q65/q65_set_list.f90
 | 
				
			||||||
  lib/refspectrum.f90
 | 
					  lib/refspectrum.f90
 | 
				
			||||||
  lib/savec2.f90
 | 
					  lib/savec2.f90
 | 
				
			||||||
 | 
					  lib/save_dxbase.f90
 | 
				
			||||||
  lib/sec0.f90
 | 
					  lib/sec0.f90
 | 
				
			||||||
  lib/sec_midn.f90
 | 
					  lib/sec_midn.f90
 | 
				
			||||||
  lib/setup65.f90
 | 
					  lib/setup65.f90
 | 
				
			||||||
 | 
				
			|||||||
@ -208,7 +208,7 @@ namespace
 | 
				
			|||||||
  int const combo_box_item_disabled (0);
 | 
					  int const combo_box_item_disabled (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//  QRegExp message_alphabet {"[- A-Za-z0-9+./?]*"};
 | 
					//  QRegExp message_alphabet {"[- A-Za-z0-9+./?]*"};
 | 
				
			||||||
  QRegularExpression message_alphabet {"[- @A-Za-z0-9+./?#<>]*"};
 | 
					  QRegularExpression message_alphabet {"[- @A-Za-z0-9+./?#<>;$]*"};
 | 
				
			||||||
  QRegularExpression RTTY_roundup_exchange_re {
 | 
					  QRegularExpression RTTY_roundup_exchange_re {
 | 
				
			||||||
    R"(
 | 
					    R"(
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
@ -735,7 +735,7 @@ bool Configuration::monitor_last_used () const {return m_->rig_is_dummy_ || m_->
 | 
				
			|||||||
bool Configuration::log_as_RTTY () const {return m_->log_as_RTTY_;}
 | 
					bool Configuration::log_as_RTTY () const {return m_->log_as_RTTY_;}
 | 
				
			||||||
bool Configuration::report_in_comments () const {return m_->report_in_comments_;}
 | 
					bool Configuration::report_in_comments () const {return m_->report_in_comments_;}
 | 
				
			||||||
bool Configuration::prompt_to_log () const {return m_->prompt_to_log_;}
 | 
					bool Configuration::prompt_to_log () const {return m_->prompt_to_log_;}
 | 
				
			||||||
bool Configuration::autoLog() const {return m_->autoLog_ && m_->bSpecialOp_;}
 | 
					bool Configuration::autoLog() const {return m_->autoLog_;}
 | 
				
			||||||
bool Configuration::decodes_from_top () const {return m_->decodes_from_top_;}
 | 
					bool Configuration::decodes_from_top () const {return m_->decodes_from_top_;}
 | 
				
			||||||
bool Configuration::insert_blank () const {return m_->insert_blank_;}
 | 
					bool Configuration::insert_blank () const {return m_->insert_blank_;}
 | 
				
			||||||
bool Configuration::DXCC () const {return m_->DXCC_;}
 | 
					bool Configuration::DXCC () const {return m_->DXCC_;}
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,39 @@ extern "C" {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace
 | 
					namespace
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  QRegularExpression words_re {R"(^(?:(?<word1>(?:CQ|DE|QRZ)(?:\s?DX|\s(?:[A-Z]{1,4}|\d{3}))|[A-Z0-9/]+|\.{3})\s)(?:(?<word2>[A-Z0-9/]+)(?:\s(?<word3>[-+A-Z0-9]+)(?:\s(?<word4>(?:OOO|(?!RR73)[A-R]{2}[0-9]{2})))?)?)?)"};
 | 
					  QRegularExpression tokens_re {R"(
 | 
				
			||||||
 | 
					^
 | 
				
			||||||
 | 
					  (?:(?<dual>[A-Z0-9/]+)\sRR73;\s)? # dual reply DXpedition message
 | 
				
			||||||
 | 
					  (?:
 | 
				
			||||||
 | 
					    (?<word1>
 | 
				
			||||||
 | 
					      (?:CQ|DE|QRZ)
 | 
				
			||||||
 | 
					      (?:\s?DX|\s
 | 
				
			||||||
 | 
					        (?:[A-Z]{1,4}|\d{3})  # directional CQ
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					      | [A-Z0-9/]+            # DX call
 | 
				
			||||||
 | 
					      |\.{3}                  # unknown hash code
 | 
				
			||||||
 | 
					    )\s
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					  (?:
 | 
				
			||||||
 | 
					    (?<word2>[A-Z0-9/]+)      # DE call
 | 
				
			||||||
 | 
					    (?:\s
 | 
				
			||||||
 | 
					      (?<word3>[-+A-Z0-9]+)   # report
 | 
				
			||||||
 | 
					      (?:\s
 | 
				
			||||||
 | 
					        (?<word4>
 | 
				
			||||||
 | 
					          (?:
 | 
				
			||||||
 | 
					            OOO               # EME
 | 
				
			||||||
 | 
					            | (?!RR73)[A-R]{2}[0-9]{2} # grid square (not RR73)
 | 
				
			||||||
 | 
					            | 5[0-9]{5}       # EU VHF Contest report & serial
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        (?:\s
 | 
				
			||||||
 | 
					          (?<word5>[A-R]{2}[0-9]{2}[A-X]{2}) # EU VHF Contest grid locator
 | 
				
			||||||
 | 
					        )?
 | 
				
			||||||
 | 
					      )?
 | 
				
			||||||
 | 
					    )?
 | 
				
			||||||
 | 
					  )?
 | 
				
			||||||
 | 
					)"
 | 
				
			||||||
 | 
					                               , QRegularExpression::ExtendedPatternSyntaxOption};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DecodedText::DecodedText (QString const& the_string)
 | 
					DecodedText::DecodedText (QString const& the_string)
 | 
				
			||||||
@ -23,13 +55,13 @@ DecodedText::DecodedText (QString const& the_string)
 | 
				
			|||||||
  , is_standard_ {false}
 | 
					  , is_standard_ {false}
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // discard appended AP info
 | 
					  // discard appended AP info
 | 
				
			||||||
  clean_string_.replace (QRegularExpression {R"(^(.*?)(?:\?\s)?(?:a|q)[0-9].*$)"}, "\\1");
 | 
					  clean_string_.replace (QRegularExpression {R"(^(.*?)(?:\?\s)?[aq][0-9].*$)"}, "\\1");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//  qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp);
 | 
					//  qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp);
 | 
				
			||||||
  if (message_.length() >= 1)
 | 
					  if (message_.length() >= 1)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
       message0_ = message_.left(36);
 | 
					       message0_ = message_.left(37);
 | 
				
			||||||
       message_ = message_.left(36).remove (QRegularExpression {"[<>]"});
 | 
					       message_ = message_.left(37).remove (QRegularExpression {"[<>]"});
 | 
				
			||||||
      int i1 = message_.indexOf ('\r');
 | 
					      int i1 = message_.indexOf ('\r');
 | 
				
			||||||
      if (i1 > 0)
 | 
					      if (i1 > 0)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@ -60,11 +92,13 @@ QStringList DecodedText::messageWords () const
 | 
				
			|||||||
    // extract up to the first four message words
 | 
					    // extract up to the first four message words
 | 
				
			||||||
    QString t=message_;
 | 
					    QString t=message_;
 | 
				
			||||||
    if(t.left(4)=="TU; ") t=message_.mid(4,-1);
 | 
					    if(t.left(4)=="TU; ") t=message_.mid(4,-1);
 | 
				
			||||||
    return words_re.match(t).capturedTexts();
 | 
					    return tokens_re.match(t).capturedTexts();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  // simple word split for free text messages
 | 
					  // simple word split for free text messages
 | 
				
			||||||
  auto words = message_.split (' ', SkipEmptyParts);
 | 
					  auto words = message_.split (' ', SkipEmptyParts);
 | 
				
			||||||
  // add whole message as item 0 to mimic RE capture list
 | 
					  // add whole message and two empty strings as item 0 & 1 to mimic RE
 | 
				
			||||||
 | 
					  // capture list
 | 
				
			||||||
 | 
					  words.prepend (QString {});
 | 
				
			||||||
  words.prepend (message_);
 | 
					  words.prepend (message_);
 | 
				
			||||||
  return words;
 | 
					  return words;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -94,7 +128,7 @@ bool DecodedText::isTX() const
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
bool DecodedText::isLowConfidence () const
 | 
					bool DecodedText::isLowConfidence () const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return QChar {'?'} == string_.mid (padding_ + column_qsoText + 21, 1);
 | 
					  return QChar {'?'} == string_.mid (padding_ + column_qsoText + 36, 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int DecodedText::frequencyOffset() const
 | 
					int DecodedText::frequencyOffset() const
 | 
				
			||||||
@ -128,18 +162,23 @@ bool DecodedText::report(QString const& myBaseCall, QString const& dxBaseCall, /
 | 
				
			|||||||
  if (message_.size () < 1) return false;
 | 
					  if (message_.size () < 1) return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  QStringList const& w = message_.split(" ", SkipEmptyParts);
 | 
					  QStringList const& w = message_.split(" ", SkipEmptyParts);
 | 
				
			||||||
  if (w.size ()
 | 
					  int offset {0};
 | 
				
			||||||
      && is_standard_ && (w[0] == myBaseCall
 | 
					  if (w.size () > 2)
 | 
				
			||||||
                          || w[0].endsWith ("/" + myBaseCall)
 | 
					    {
 | 
				
			||||||
                          || w[0].startsWith (myBaseCall + "/")
 | 
					      if ("RR73;" == w[1] && w.size () > 3)
 | 
				
			||||||
                          || (w.size () > 1 && !dxBaseCall.isEmpty ()
 | 
					        {
 | 
				
			||||||
                              && (w[1] == dxBaseCall
 | 
					          offset = 2;
 | 
				
			||||||
                                  || w[1].endsWith ("/" + dxBaseCall)
 | 
					        }
 | 
				
			||||||
                                  || w[1].startsWith (dxBaseCall + "/")))))
 | 
					      if (is_standard_ && (w[offset] == myBaseCall
 | 
				
			||||||
 | 
					                           || w[offset].endsWith ("/" + myBaseCall)
 | 
				
			||||||
 | 
					                           || w[offset].startsWith (myBaseCall + "/")
 | 
				
			||||||
 | 
					                           || (w.size () > offset + 1 && !dxBaseCall.isEmpty ()
 | 
				
			||||||
 | 
					                               && (w[offset + 1] == dxBaseCall
 | 
				
			||||||
 | 
					                                   || w[offset + 1].endsWith ("/" + dxBaseCall)
 | 
				
			||||||
 | 
					                                   || w[offset + 1].startsWith (dxBaseCall + "/")))))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
      QString tt="";
 | 
					 | 
				
			||||||
      if(w.size() > 2) tt=w[2];
 | 
					 | 
				
			||||||
          bool ok;
 | 
					          bool ok;
 | 
				
			||||||
 | 
					          auto tt = w[offset + 2];
 | 
				
			||||||
          auto i1=tt.toInt(&ok);
 | 
					          auto i1=tt.toInt(&ok);
 | 
				
			||||||
          if (ok and i1>=-50 and i1<50)
 | 
					          if (ok and i1>=-50 and i1<50)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@ -157,13 +196,14 @@ bool DecodedText::report(QString const& myBaseCall, QString const& dxBaseCall, /
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  return is_standard_;
 | 
					  return is_standard_;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// get the first text word, usually the call
 | 
					// get the first text word, usually the call
 | 
				
			||||||
QString DecodedText::call() const
 | 
					QString DecodedText::call() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return words_re.match (message_).captured ("word1");
 | 
					  return tokens_re.match (message_).captured ("word1");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// get the second word, most likely the de call and the third word, most likely grid
 | 
					// get the second word, most likely the de call and the third word, most likely grid
 | 
				
			||||||
@ -175,7 +215,7 @@ void DecodedText::deCallAndGrid(/*out*/QString& call, QString& grid) const
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
      msg = msg.mid (p + 2);
 | 
					      msg = msg.mid (p + 2);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  auto const& match = words_re.match (msg);
 | 
					  auto const& match = tokens_re.match (msg);
 | 
				
			||||||
  call = match.captured ("word2");
 | 
					  call = match.captured ("word2");
 | 
				
			||||||
  grid = match.captured ("word3");
 | 
					  grid = match.captured ("word3");
 | 
				
			||||||
  if ("R" == grid) grid = match.captured ("word4");
 | 
					  if ("R" == grid) grid = match.captured ("word4");
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										50
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								NEWS
									
									
									
									
									
								
							@ -11,6 +11,56 @@
 | 
				
			|||||||
                                                         
 | 
					                                                         
 | 
				
			||||||
Copyright 2001 - 2021 by Joe Taylor, K1JT.
 | 
					Copyright 2001 - 2021 by Joe Taylor, K1JT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						        Release: WSJT-X 2.5.2
 | 
				
			||||||
 | 
						             Nov 4, 2021
 | 
				
			||||||
 | 
						        ----------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is mostly a bug fix  release.  It has the following changes since
 | 
				
			||||||
 | 
					release 2.5.1:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Repair a  longstanding regression  that caused signal  reports from
 | 
				
			||||||
 | 
					   tail-ended Tx2 messages to be omitted from logged information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Parse   "dx-call-1 RR73; dx-call-2 <de-call> +nn"  messages  (i3=0,
 | 
				
			||||||
 | 
					   n3=1 DXpedition mode) in regular 77-bit modes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Repair a regression  associated with setting the  main window width
 | 
				
			||||||
 | 
					   on program startup.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Repair a problem with Q65 decodes  of type 'q3' for messages of the
 | 
				
			||||||
 | 
					   form "<Call_1> Call_2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Execute code associated with Q65 decodes of type 'q5' only when the
 | 
				
			||||||
 | 
					   Max   Drift   control   is   set  to   50.    This   fix   prevents
 | 
				
			||||||
 | 
					   double-incrementing of  the message averaging counter  on the first
 | 
				
			||||||
 | 
					   decoding sequence.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Polarization offset 'Dpol' from the astronomical data window is now
 | 
				
			||||||
 | 
					   written    to    file     azel.dat    if    environment    variable
 | 
				
			||||||
 | 
					   WSJT_AZEL_EXTRA_LINES has  been defined as  1 or greater.   Dpol is
 | 
				
			||||||
 | 
					   especially useful for EME on the higher microwave bands.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - The Auto  Log QSO option  in "Settings->Reporting" now  behaves the
 | 
				
			||||||
 | 
					   same  as  the Prompt  to  log  QSO option  when  not  in a  special
 | 
				
			||||||
 | 
					   operating context mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - The Fast/Normal/Deep  setting in  Q65 mode is  now a sticky setting
 | 
				
			||||||
 | 
					   and is no longer reset to Fast on program startup or  when Settings
 | 
				
			||||||
 | 
					   has  been opened. The user selection is used for automatic decodes,
 | 
				
			||||||
 | 
					   but Deep is used for any subsequent manual decode attempts.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - New hamlib code to correct minor flaws in controlling several rigs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Update  the  Chinese  and  Hong   Kong  translations  of  the  user
 | 
				
			||||||
 | 
					   interface.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Note  that since  the WSJT-X  v2.5.0 GA  release we  have not  been
 | 
				
			||||||
 | 
					   providing pre-built 32-bit  packages for Linux on  Intel CPUs, this
 | 
				
			||||||
 | 
					   is  due to  the mainstream  Linux Desktop  distributions no  longer
 | 
				
			||||||
 | 
					   providing updates for 32-bit only  systems. 32-bit WSJT-X can still
 | 
				
			||||||
 | 
					   be  built for  Linux Intel  and is  supported at  least until  some
 | 
				
			||||||
 | 
					   prerequisite package is no longer available.
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
	        Release: WSJT-X 2.5.1
 | 
						        Release: WSJT-X 2.5.1
 | 
				
			||||||
	             Oct 21, 2021
 | 
						             Oct 21, 2021
 | 
				
			||||||
	        ----------------------
 | 
						        ----------------------
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,90 @@
 | 
				
			|||||||
                                                         
 | 
					                                                         
 | 
				
			||||||
Copyright 2001 - 2021 by Joe Taylor, K1JT.
 | 
					Copyright 2001 - 2021 by Joe Taylor, K1JT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						        Release: WSJT-X 2.5.4
 | 
				
			||||||
 | 
						             Dec 28, 2021
 | 
				
			||||||
 | 
						        ----------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is mostly a bug fix  release.  It has the following changes since
 | 
				
			||||||
 | 
					release 2.5.3:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WSJTX:
 | 
				
			||||||
 | 
					 - Repair a defect that caused occasional crashes when in QSO with 
 | 
				
			||||||
 | 
					   stations using nonstandard callsigns.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MAP65:
 | 
				
			||||||
 | 
					 - Allowing MAP65 "Best-fit Delta phi" solution to be displayed to the
 | 
				
			||||||
 | 
					   user.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						        Release: WSJT-X 2.5.3
 | 
				
			||||||
 | 
						             Dec 7, 2021
 | 
				
			||||||
 | 
						        ----------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This release has the following changes since release 2.5.2:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Add a note in memory of G4WJS to the About window
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Add a simple $DXCALL macro capability for Tx messages, and update
 | 
				
			||||||
 | 
					   the User Guide accordingly
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Ensure that MAIN VFO is used for receiving on rigs that require it
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 - Repair a defect in reporting low-confidence decodes to PskReporter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Updated CTY.DAT database, tnx to Jim AD1C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						        Release: WSJT-X 2.5.2
 | 
				
			||||||
 | 
						             Nov 4, 2021
 | 
				
			||||||
 | 
						        ----------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is mostly a bug fix  release.  It has the following changes since
 | 
				
			||||||
 | 
					release 2.5.1:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Repair a  longstanding regression  that caused signal  reports from
 | 
				
			||||||
 | 
					   tail-ended Tx2 messages to be omitted from logged information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Parse   "dx-call-1 RR73; dx-call-2 <de-call> +nn"  messages  (i3=0,
 | 
				
			||||||
 | 
					   n3=1 DXpedition mode) in regular 77-bit modes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Repair a regression  associated with setting the  main window width
 | 
				
			||||||
 | 
					   on program startup.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Repair a problem with Q65 decodes  of type 'q3' for messages of the
 | 
				
			||||||
 | 
					   form "<Call_1> Call_2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Execute code associated with Q65 decodes of type 'q5' only when the
 | 
				
			||||||
 | 
					   Max   Drift   control   is   set  to   50.    This   fix   prevents
 | 
				
			||||||
 | 
					   double-incrementing of  the message averaging counter  on the first
 | 
				
			||||||
 | 
					   decoding sequence.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Polarization offset 'Dpol' from the astronomical data window is now
 | 
				
			||||||
 | 
					   written    to    file     azel.dat    if    environment    variable
 | 
				
			||||||
 | 
					   WSJT_AZEL_EXTRA_LINES has  been defined as  1 or greater.   Dpol is
 | 
				
			||||||
 | 
					   especially useful for EME on the higher microwave bands.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - The Auto  Log QSO option  in "Settings->Reporting" now  behaves the
 | 
				
			||||||
 | 
					   same  as  the Prompt  to  log  QSO option  when  not  in a  special
 | 
				
			||||||
 | 
					   operating context mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - The Fast/Normal/Deep  setting in  Q65 mode is  now a sticky setting
 | 
				
			||||||
 | 
					   and is no longer reset to Fast on program startup or  when Settings
 | 
				
			||||||
 | 
					   has  been opened. The user selection is used for automatic decodes,
 | 
				
			||||||
 | 
					   but Deep is used for any subsequent manual decode attempts.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - New hamlib code to correct minor flaws in controlling several rigs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Update  the  Chinese  and  Hong   Kong  translations  of  the  user
 | 
				
			||||||
 | 
					   interface.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - Note  that since  the WSJT-X  v2.5.0 GA  release we  have not  been
 | 
				
			||||||
 | 
					   providing pre-built 32-bit  packages for Linux on  Intel CPUs, this
 | 
				
			||||||
 | 
					   is  due to  the mainstream  Linux Desktop  distributions no  longer
 | 
				
			||||||
 | 
					   providing updates for 32-bit only  systems. 32-bit WSJT-X can still
 | 
				
			||||||
 | 
					   be  built for  Linux Intel  and is  supported at  least until  some
 | 
				
			||||||
 | 
					   prerequisite package is no longer available.
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
	        Release: WSJT-X 2.5.1
 | 
						        Release: WSJT-X 2.5.1
 | 
				
			||||||
	             Oct 21, 2021
 | 
						             Oct 21, 2021
 | 
				
			||||||
	        ----------------------
 | 
						        ----------------------
 | 
				
			||||||
 | 
				
			|||||||
@ -385,7 +385,7 @@ auto DXLabSuiteCommanderTransceiver::get_mode () -> MODE
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd)
 | 
					void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Q_ASSERT (commander_);
 | 
					  if (!commander_) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  CAT_TRACE (cmd);
 | 
					  CAT_TRACE (cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -398,7 +398,7 @@ void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
QString DXLabSuiteCommanderTransceiver::command_with_reply (QString const& cmd)
 | 
					QString DXLabSuiteCommanderTransceiver::command_with_reply (QString const& cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Q_ASSERT (commander_);
 | 
					  if (!commander_) return QString {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!write_to_port (cmd))
 | 
					  if (!write_to_port (cmd))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
				
			|||||||
@ -1005,7 +1005,7 @@ void HRDTransceiver::do_poll ()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
QString HRDTransceiver::send_command (QString const& cmd, bool prepend_context, bool recurse)
 | 
					QString HRDTransceiver::send_command (QString const& cmd, bool prepend_context, bool recurse)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Q_ASSERT (hrd_);
 | 
					  if (!hrd_) return QString {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  QString result;
 | 
					  QString result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -882,7 +882,12 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
      // for the 1st time as a band change may cause a recalled mode to be
 | 
					      // for the 1st time as a band change may cause a recalled mode to be
 | 
				
			||||||
      // set
 | 
					      // set
 | 
				
			||||||
      m_->error_check (rig_set_freq (m_->rig_.data (), RIG_VFO_CURR, f), tr ("setting frequency"));
 | 
					      vfo_t target_vfo = RIG_VFO_CURR;
 | 
				
			||||||
 | 
					      if (!(m_->rig_->state.vfo_list & RIG_VFO_B))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          target_vfo = RIG_VFO_MAIN; // no VFO A/B so force to Rx on MAIN
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      m_->error_check (rig_set_freq (m_->rig_.data (), target_vfo, f), tr ("setting frequency"));
 | 
				
			||||||
      update_rx_frequency (f);
 | 
					      update_rx_frequency (f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (m_->mode_query_works_ && UNK != m)
 | 
					      if (m_->mode_query_works_ && UNK != m)
 | 
				
			||||||
@ -890,13 +895,13 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
 | 
				
			|||||||
          rmode_t current_mode;
 | 
					          rmode_t current_mode;
 | 
				
			||||||
          pbwidth_t current_width;
 | 
					          pbwidth_t current_width;
 | 
				
			||||||
          auto new_mode = m_->map_mode (m);
 | 
					          auto new_mode = m_->map_mode (m);
 | 
				
			||||||
          m_->error_check (rig_get_mode (m_->rig_.data (), RIG_VFO_CURR, ¤t_mode, ¤t_width), tr ("getting current VFO mode"));
 | 
					          m_->error_check (rig_get_mode (m_->rig_.data (), target_vfo, ¤t_mode, ¤t_width), tr ("getting current VFO mode"));
 | 
				
			||||||
          CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
 | 
					          CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if (new_mode != current_mode)
 | 
					          if (new_mode != current_mode)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
              CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
 | 
					              CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
 | 
				
			||||||
              m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
 | 
					              m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              // for the 2nd time because a mode change may have caused a
 | 
					              // for the 2nd time because a mode change may have caused a
 | 
				
			||||||
              // frequency change
 | 
					              // frequency change
 | 
				
			||||||
@ -905,7 +910,7 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
 | 
				
			|||||||
              // for the second time because some rigs change mode according
 | 
					              // for the second time because some rigs change mode according
 | 
				
			||||||
              // to frequency such as the TS-2000 auto mode setting
 | 
					              // to frequency such as the TS-2000 auto mode setting
 | 
				
			||||||
              CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
 | 
					              CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
 | 
				
			||||||
              m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
 | 
					              m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          update_mode (m);
 | 
					          update_mode (m);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -1037,16 +1042,22 @@ void HamlibTransceiver::do_mode (MODE mode)
 | 
				
			|||||||
  pbwidth_t current_width;
 | 
					  pbwidth_t current_width;
 | 
				
			||||||
  auto new_mode = m_->map_mode (mode);
 | 
					  auto new_mode = m_->map_mode (mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  vfo_t target_vfo = RIG_VFO_CURR;
 | 
				
			||||||
 | 
					  if (!(m_->rig_->state.vfo_list & RIG_VFO_B))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      target_vfo = RIG_VFO_MAIN; // no VFO A/B so force to Rx on MAIN
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // only change when receiving or simplex if direct VFO addressing unavailable
 | 
					  // only change when receiving or simplex if direct VFO addressing unavailable
 | 
				
			||||||
  if (!(state ().ptt () && state ().split () && m_->one_VFO_))
 | 
					  if (!(state ().ptt () && state ().split () && m_->one_VFO_))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      m_->error_check (rig_get_mode (m_->rig_.data (), RIG_VFO_CURR, ¤t_mode, ¤t_width), tr ("getting current VFO mode"));
 | 
					      m_->error_check (rig_get_mode (m_->rig_.data (), target_vfo, ¤t_mode, ¤t_width), tr ("getting current VFO mode"));
 | 
				
			||||||
      CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
 | 
					      CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (new_mode != current_mode)
 | 
					      if (new_mode != current_mode)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
 | 
					          CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
 | 
				
			||||||
          m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
 | 
					          m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,9 @@ image::main-ui-controls.png[align="center",width=650,alt="Main UI Controls"]
 | 
				
			|||||||
* *Log QSO* raises a dialog window pre-filled with known information
 | 
					* *Log QSO* raises a dialog window pre-filled with known information
 | 
				
			||||||
about a QSO you have nearly completed.  You can edit or add to this
 | 
					about a QSO you have nearly completed.  You can edit or add to this
 | 
				
			||||||
information before clicking *OK* to log the QSO.  If you check *Prompt
 | 
					information before clicking *OK* to log the QSO.  If you check *Prompt
 | 
				
			||||||
me to log QSO* on the *File -> Settings -> Reporting* tab, the program raises the confirmation screen automatically when you send a message containing +73+.  *Start Date* and *Start Time* are set when you click
 | 
					me to log QSO* on the *File -> Settings -> Reporting* tab, the program
 | 
				
			||||||
 | 
					raises the confirmation screen automatically when you send a message
 | 
				
			||||||
 | 
					containing +73+.  *Start Date* and *Start Time* are set when you click
 | 
				
			||||||
to send the *Tx 2* or *Tx 3* message, and backed up by one or two
 | 
					to send the *Tx 2* or *Tx 3* message, and backed up by one or two
 | 
				
			||||||
sequence lengths, respectively.  (Note that the actual start time may
 | 
					sequence lengths, respectively.  (Note that the actual start time may
 | 
				
			||||||
have been earlier if repeats of early transmissions were required.)
 | 
					have been earlier if repeats of early transmissions were required.)
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 7.0 KiB  | 
@ -7,8 +7,11 @@ messages such as the examples shown below.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
image::tx-macros.png[align="center",alt="Tx Macros Screen"]
 | 
					image::tx-macros.png[align="center",alt="Tx Macros Screen"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- To add a new message to the list, enter the desired text (up to 13
 | 
					- To add a new message to the list, enter the desired text in the
 | 
				
			||||||
characters) in the entry field at top, then click *Add*.
 | 
					entry field at top, then click *Add*.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Remember that a transmitted free-text message is limited to 13
 | 
				
			||||||
 | 
					characters, including blanks.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- To remove an unwanted message, click on the message and then on
 | 
					- To remove an unwanted message, click on the message and then on
 | 
				
			||||||
*Delete*.
 | 
					*Delete*.
 | 
				
			||||||
@ -18,3 +21,7 @@ new order will be preserved when _WSJT-X_ is restarted.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
- Messages can also be added from the main window's *Tx5*
 | 
					- Messages can also be added from the main window's *Tx5*
 | 
				
			||||||
  field. Simply hit [Enter] after the message has been entered.
 | 
					  field. Simply hit [Enter] after the message has been entered.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- If the first word of a message is $DXCALL (or the shortened form
 | 
				
			||||||
 | 
					$DX), that word will be replaced on transmission by the base callsign
 | 
				
			||||||
 | 
					in the *DxCall* field.
 | 
				
			||||||
 | 
				
			|||||||
@ -333,6 +333,27 @@ correlation algorithm.  JT65 and Q65 offer _a priori_ (AP)
 | 
				
			|||||||
decoding, which takes advantage of naturally accumulating information
 | 
					decoding, which takes advantage of naturally accumulating information
 | 
				
			||||||
during a QSO.
 | 
					during a QSO.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For CW mode on SHF and microwave EME WSJT-X can be used to do Doppler
 | 
				
			||||||
 | 
					shift correction if desired:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Check the *Settings -> Radio -> Mode -> None* option, this stops _WSJT-X_
 | 
				
			||||||
 | 
					  from trying to set the mode of your rig.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Put you rig into CW mode as normal.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Before transmitting press *Tune* in _WSJT-X_, no tones will be
 | 
				
			||||||
 | 
					  transmitted as the rig is in CW mode, but importantly WSJT-X knows
 | 
				
			||||||
 | 
					  your are transmitting and adjusts the Doppler shift correction as
 | 
				
			||||||
 | 
					  needed for the currently selected Doppler shift correction mode in
 | 
				
			||||||
 | 
					  transmit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- When you have finish transmitting CW press *Tune* again to revert to
 | 
				
			||||||
 | 
					  receive mode and the correct Doppler shift correction for receiving.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NOTE: The above assumes you are already set up for _WSJT-X_
 | 
				
			||||||
 | 
					<<VHF_SETUP,Doppler shift correction>> with working CAT control, and
 | 
				
			||||||
 | 
					*Monitor* enabled etc..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
////
 | 
					////
 | 
				
			||||||
The following tutorial aims to familiarize you with
 | 
					The following tutorial aims to familiarize you with
 | 
				
			||||||
these program features, all of which are of special interest for EME
 | 
					these program features, all of which are of special interest for EME
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										569
									
								
								g4wjs.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										569
									
								
								g4wjs.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,569 @@
 | 
				
			|||||||
 | 
					Joe Taylor, K1JT:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I am very sorry to convey the sad news that Bill Somerville,
 | 
				
			||||||
 | 
					G4WJS, died suddenly and unexpectedly a few days ago.  He was only
 | 
				
			||||||
 | 
					about 65 years old.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bill was a dear friend and very close colleague, though (as is often
 | 
				
			||||||
 | 
					the case with worldwide ham radio friendships) we had met in person
 | 
				
			||||||
 | 
					only a few times.  In 2013 he was the first to join me in forming a
 | 
				
			||||||
 | 
					core development group for WSJT-X, which at that time was at program
 | 
				
			||||||
 | 
					version 0.99.  Bill has been closely involved with WSJT-X and related
 | 
				
			||||||
 | 
					software projects ever since.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Our free, open-source software could not have achieved its extensive
 | 
				
			||||||
 | 
					worldwide popularity and influence in ham radio without Bill's
 | 
				
			||||||
 | 
					essential contributions.  In addition to writing code for important
 | 
				
			||||||
 | 
					portions of the Qt-based user interface for WSJT-X, Bill helped to
 | 
				
			||||||
 | 
					bring the overall program structure more nearly up to professional
 | 
				
			||||||
 | 
					standards.  Moreover, he devoted countless hours to program support,
 | 
				
			||||||
 | 
					patiently answering user's questions on WSJT-related forums.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I have only started to think about the many ways in which I will miss
 | 
				
			||||||
 | 
					Bill -- not no mention how we all will miss his immense and positive
 | 
				
			||||||
 | 
					impact on WSJT-X and related projects.  For more than eight years Bill
 | 
				
			||||||
 | 
					and I communicated closely and regularly on ham radio topics,
 | 
				
			||||||
 | 
					sometimes many times per day.  Perhaps I will be able to write more
 | 
				
			||||||
 | 
					about it in the near future.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Rest in peace, dear friend G4WJS.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Stan Gammons, KM4HQE:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So sad to hear that Joe. Bill will be greatly missed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Prayers for his family and friends.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Rest in peace Bill
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Colin Haig, VE3MSC: 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Joe, this is truly sad news.  Bill has been a wonderful resource and
 | 
				
			||||||
 | 
					supported all of us.  Please pass condolences to his family.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PA3GCU:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					May he rest in peace.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Philip Hazelton, G8PJH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is shocking news, he was such talent, he will be sorely missed,
 | 
				
			||||||
 | 
					condolences to his family.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Philip Rose, GM3ZZA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You have provided an excellent service to the WSJT-X community. I
 | 
				
			||||||
 | 
					think your last post was a couple of days ago. We will all miss you,
 | 
				
			||||||
 | 
					and your incisive resolution of all our problems.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					Requiescat in pace.
 | 
				
			||||||
 | 
					Dave, AA6YQ: 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A huge loss for all of us. Bill always took the time to provide a
 | 
				
			||||||
 | 
					friendly, accurate, and helpful answer to any question that came his
 | 
				
			||||||
 | 
					way.  He set one good example after another.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Reino Talarmo, OH3MA:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RIP Bill, We will miss your kind advice.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Tom V. Segalstad, LA4LN:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The silent key of Bill is very sad news.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bill has been extremely helpful for radio amateurs to make WSJT-X fit
 | 
				
			||||||
 | 
					their different radios and computers. We have seen E-mail answers from
 | 
				
			||||||
 | 
					him coming at all times during borh day and night. And we wonder if he
 | 
				
			||||||
 | 
					ever got time to sleep or eat, in-between his good answers and advices
 | 
				
			||||||
 | 
					to radio amateurs world wide.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So rest in peace Bill, and thank you very much for all the help you
 | 
				
			||||||
 | 
					have provided to radio amateurs world wide, for making their digital
 | 
				
			||||||
 | 
					radio amateur activity very successful.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					John, VE7KKQ:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So long, Bill, condolences to his family.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Tom, M0LTE:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unreal. Deeply shocking. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Heartfelt condolences from us all at the Reading club, where Bill was
 | 
				
			||||||
 | 
					a member.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Борис Романов (Boris Romanov), UX8IW:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sad news. Condolences to Bill's family and friends.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Ken Cox, WA8OMR:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sorry to hear about Bill's passing. I will miss reading his answers to
 | 
				
			||||||
 | 
					the many questions posted. I have learned a lot from them.Ken WA8OMR.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Gary Trock: 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Very Sad.
 | 
				
			||||||
 | 
					I’ve been reading his posts since I joined.
 | 
				
			||||||
 | 
					RIP.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Dave Sellars, KB4JB:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Very sad news indeed.  Amateur Radio worldwide has lost a tremendous
 | 
				
			||||||
 | 
					ham and friend.  His contributions to WSJT-X and this group will never
 | 
				
			||||||
 | 
					be forgotten.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Lynn Mears, K0CLM:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Extremely sad news. I haven’t been involved with WSJT that long, but
 | 
				
			||||||
 | 
					it was obvious that Bill donated a lot of time and effort towards WSJT
 | 
				
			||||||
 | 
					and helping in many different ways.  He will be missed greatly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Peter, M0PWX:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sad news indeed, Bill was a great resource and font of so much
 | 
				
			||||||
 | 
					knowledge, as well as having the patience of a saint when dealing with
 | 
				
			||||||
 | 
					some members / questions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Will be greatly missed on here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Russ Ravella:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Incredibly sad news.  What a wonderful, valuable and kind man Bill
 | 
				
			||||||
 | 
					was.  How much better the world would be with more Bill’s in it.
 | 
				
			||||||
 | 
					Thank you and Rest In Peace Bill Somerville.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sam Birnbaum, W2JDB:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So very sorry to hear this sad news. Bill has been very extremely
 | 
				
			||||||
 | 
					helpful to me in providing the information that allowed me to provide
 | 
				
			||||||
 | 
					a complimentary program for WSJT-X so that visually impaired/blind
 | 
				
			||||||
 | 
					hams can also partake in this fantastic program and its modes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Rest In Peace Bill, you will be sorely missed by all.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Jack Trampler, N2JT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I never worked Bill.  Did he even have time to operate?  I never met
 | 
				
			||||||
 | 
					Bill.  But I would have liked to.  I never sent him an email, either
 | 
				
			||||||
 | 
					personal or on this group.  I wish I had.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I enjoyed my daily (actually several times a day) reading of the
 | 
				
			||||||
 | 
					messages posted in this group and his replies.  I learned a lot from
 | 
				
			||||||
 | 
					them.  This man had so much knowledge and the fact that he took the
 | 
				
			||||||
 | 
					time to deal with almost every post in this group and share that
 | 
				
			||||||
 | 
					knowledge, its truly a testament to this man.  I for one will surely
 | 
				
			||||||
 | 
					miss him.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I wish I knew him better.  Rest in Peace, Bill.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Pete Smith, N4ZR:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Terrible news.  Though I'm not a great devotee of the digital modes
 | 
				
			||||||
 | 
					(except CW), without Bill I'm convinced I would not have made a single
 | 
				
			||||||
 | 
					QSO using WSJT-X.  My sympathy to his family and friends.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Neil Zampella, KN3ILZ:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I agree.  Bill was patient with everyone, even me when I replied to a
 | 
				
			||||||
 | 
					post and chewed my foot up to the ankle.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					His passing will affect much done within WSJT-X, as well as Hamlib.
 | 
				
			||||||
 | 
					He was a font of knowledge and 'corporate' memory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We may not see his like again.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Jim Brown, K9YC:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If Bill had done nothing more than provide what seemed like 24/7
 | 
				
			||||||
 | 
					support here, his contribution would have been monumental. Thanks
 | 
				
			||||||
 | 
					Bill, RIP.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Jeff, K3JRZ: 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Wow. Very sad to hear.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I had sent many emails to him looking for help with WSJT-X when I
 | 
				
			||||||
 | 
					first started having my first issues with it when I started with the
 | 
				
			||||||
 | 
					software and then again after several macOS updates. Always a great
 | 
				
			||||||
 | 
					guy to get help from. He will surely be missed. My condolences to his
 | 
				
			||||||
 | 
					family and to all that knew him.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Lance Collister, W7GJ:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Our heart-felt condolences to you, Joe, and to all the folks like me
 | 
				
			||||||
 | 
					whom he so patiently helped over the years. He was an amazing member
 | 
				
			||||||
 | 
					of the WSJT-X team, and I found myself always amazed at how in the
 | 
				
			||||||
 | 
					world he was able to answer all the questions posed to him by users of
 | 
				
			||||||
 | 
					WSJT-X on such a myriad of different rigs with different software. His
 | 
				
			||||||
 | 
					contributions will be long remembered, and very much appreciated. So
 | 
				
			||||||
 | 
					sad to see someone go who gave so much so freely to our
 | 
				
			||||||
 | 
					community. RIP, Bill.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Klaus Werner, G7RTI:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thanks to Bill’s helpful explanations I was able to get going on
 | 
				
			||||||
 | 
					WSJTX.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I didn’t know him or anything about him except what has been written
 | 
				
			||||||
 | 
					in previous comments.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					May he rest in peace.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Wayne Rash, N4HCR:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is so sad. Bill always showed great patience with my dumb
 | 
				
			||||||
 | 
					questions. He played a big role in making WSJTX a joy to use. Ham
 | 
				
			||||||
 | 
					radio owes him a huge debt.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Rest In Peace, Bill. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Dave: 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Very sad to hear. He will live in our memories and our operating.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Ed Radlo, AJ6V:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bill always answered the various online queries vey quickly, and his
 | 
				
			||||||
 | 
					vast knowledge helped many of us get on track with all of these new
 | 
				
			||||||
 | 
					digital modes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A great loss to ham radio.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bob Bownes: (?)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Very sad to hear. May his memory be a blessing to his family and all
 | 
				
			||||||
 | 
					who knew him.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In the Law Enforcement, Fire and Emergency Medical Services, the
 | 
				
			||||||
 | 
					passing on of one such is often marked with a 'Last Call' or 'Final
 | 
				
			||||||
 | 
					Dispatch' in which the departed's call sign is requested thrice for
 | 
				
			||||||
 | 
					one last time. Usually at a pre-arranged or significant time. Seems
 | 
				
			||||||
 | 
					appropriate in this case as well. Perhaps you could do that for us
 | 
				
			||||||
 | 
					Joe.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Rick, I2BRT:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Very sad news and a great loss for our cumunity.  Thanks for all the
 | 
				
			||||||
 | 
					effort and friendship Bill.  Rest in peace.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Andy, GD0TEP:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I never worked Bill.  Did he even have time to operate?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Yes, I worked him on 15m in August just gone, and on 6m back in
 | 
				
			||||||
 | 
					May. Both on FT8 of course.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Gwen, KI5PXQ:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I also worked him, 1600Z on the 24th of October, 15 meters, FT8.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Ria, N2RJ:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is truly awful news. Bill will certainly be missed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Walter, OE6IWG:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VY sad News :-(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bill was a GREAT helper - also for me.  My condolences to his family
 | 
				
			||||||
 | 
					and friends.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Ed Wilson, K0KC:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is a tremendous loss to the amateur radio community, but as
 | 
				
			||||||
 | 
					someone who lost his brother only a few weeks ago, I know that the
 | 
				
			||||||
 | 
					loss is much greater to his family and close friends...my condolences
 | 
				
			||||||
 | 
					to each of them. RIP, Bill...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Amos Sobel, 4X4MF:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Me and the WSJT-X community mourn the departure of Bill Somerville
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bob, K4RCG:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I deeply regret not sending Bill a "personal thank you" e-mail for his
 | 
				
			||||||
 | 
					support of our hobby.  I had planned on doing so, but didn't want to
 | 
				
			||||||
 | 
					add traffic to his in-box admin!  He will be missed, but fondly
 | 
				
			||||||
 | 
					remembered.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Hamish, G0GLG:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Very sad day for amateur radio.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Paul Welford, G4YKQ:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A Tribute to my dearest friend Bill Somerville G4WJS.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I apologize for length of this post. This might answer a few previous
 | 
				
			||||||
 | 
					posts Knowing Bill he will be still reading all these posts from a
 | 
				
			||||||
 | 
					better place.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I thank you for your speedy post Joe.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bill G4WJS was one of my dearest friends living just 4 miles apart.We
 | 
				
			||||||
 | 
					spoke 2/3 times a week and at times several times a day.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					After a 20 year plus break Bill spurred me on to come back into the
 | 
				
			||||||
 | 
					radio family. I OWE HIM A LOT. Thanks to him my major interest in the
 | 
				
			||||||
 | 
					last 10 years has been WSJT-X. Bill also had a passion for Photography
 | 
				
			||||||
 | 
					and me being a Photographer for The Sun Newspaper In London before I
 | 
				
			||||||
 | 
					retired had another common interest we liked to have a good natter but
 | 
				
			||||||
 | 
					I often came off the worst.Bill lived on his own so we kept a close
 | 
				
			||||||
 | 
					eye on each other.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bill had a degree in Chemistry but as I understand was self taught in
 | 
				
			||||||
 | 
					computing and electronics.Please see his QRZ page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					He was a whizz. He was a great natural teacher and Joe I think this was
 | 
				
			||||||
 | 
					one of the reasons he got on so well with you and the group.He
 | 
				
			||||||
 | 
					remarked to me many times "I never mind helping anyone provided they
 | 
				
			||||||
 | 
					help themselves" At times glaring at me muttering under his breath
 | 
				
			||||||
 | 
					"Read the notes and the posts" Sometimes it so annoyed him when I
 | 
				
			||||||
 | 
					could not keep a straight face..we all know the story.Bill always
 | 
				
			||||||
 | 
					willing to help with a computer grafted to his hand.  Over the last
 | 
				
			||||||
 | 
					ten years he has like others in the group spent hours and hours
 | 
				
			||||||
 | 
					involved with WSJX-X.He had a great admiration for open source
 | 
				
			||||||
 | 
					programs.Made many friends within the digital community and a big
 | 
				
			||||||
 | 
					respect for Dxlabs {Dave] JTalert [Laurie] among others. I was always
 | 
				
			||||||
 | 
					giving him praise for taking a break and TXing winding up this 4 ele
 | 
				
			||||||
 | 
					,of late not often[Bill head in PC} every day I would have a crafty
 | 
				
			||||||
 | 
					check on his PSK. Bill was very much in favour of Using L.O.T.W but
 | 
				
			||||||
 | 
					never collected awards,but on receiving a trophy for technical
 | 
				
			||||||
 | 
					achievement announced at Dayton when he told me there was no emotion
 | 
				
			||||||
 | 
					but I knew Bill just to well he was chuffed !
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sadly last Friday after never responding to my calls I found Bill
 | 
				
			||||||
 | 
					seated in his shack at peace surrounded by the things he loved most.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I am still total shock!!!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Such a loss of a talented and loyal friend and as I have said he shall
 | 
				
			||||||
 | 
					be greatly missed by many in our radio family.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					R.I.P.William [Bill ] G4WJS.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					God Bless you and till we meet again 73.................. Cheers mate!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Ronnie Hull:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I am greatly saddened to hear this news.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Keith Wood, W4RPE:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Great tribute to a wonderful man.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Carlos, OE3JAG:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					May I also do my sadly condolences to his family and his friends !  He
 | 
				
			||||||
 | 
					will surely be missed by all the hams.  Thanks for got in touch with
 | 
				
			||||||
 | 
					you, dear Bill.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Good luck in your new place, Bill, I miss you,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					William Hensley, WG8S:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A great tribute, Paul!  I'm sorry you were the one to find him, yet I
 | 
				
			||||||
 | 
					sense you would both want it that way.  I did not know Bill, but he
 | 
				
			||||||
 | 
					made a tremendous contribution to the WSJT-X community.  He will be
 | 
				
			||||||
 | 
					missed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RIP, Bill.  Thank you, Paul.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bernd, KB7AK:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thank you for your tribute Paul, we will all miss Bill dearly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Philip Rose, GM3ZZA:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As far as I can see we as amateurs who have been helped by Bill,
 | 
				
			||||||
 | 
					should keep up his good work. I know I can’t alone.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					His advice was definitive. Others not so.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Jim Brown, K9YC:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thanks very much, Paul, for this lovely and loving post. As you and
 | 
				
			||||||
 | 
					Joe have so eloquently written, Bill exemplified the best of the ham
 | 
				
			||||||
 | 
					spirit, by giving and sharing far more than he received.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Erik, VA7QI:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Very sorry to hear about Bill.  I enjoyed reading his comments and
 | 
				
			||||||
 | 
					very much appreciate his contribution for WSTJ-X.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					His name and callsign will be remembered for a long time as a shining
 | 
				
			||||||
 | 
					light of the ham radio community.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					73 de va7qi,               ....Erik.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Marco, PY1ZRJ: 
 | 
				
			||||||
 | 
					My God!  Whats terrible news is this!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bill helped me in many occasions with WSJT-X always with a very pure
 | 
				
			||||||
 | 
					"ham-spirit" and availability.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					My very sincere condolence to all his family and friends, I will miss
 | 
				
			||||||
 | 
					him a lot despite I never had the pleasure to meet him.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Martin Davies, G0HDB:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					That is truly unwelcome and most distressing news, Joe; I'm sure the
 | 
				
			||||||
 | 
					vast amounts of time and effort that Bill devoted to the development
 | 
				
			||||||
 | 
					and support of WSJT-X will be very sorely missed by everyone in the
 | 
				
			||||||
 | 
					community, whether or not they had ever had any direct dealings with
 | 
				
			||||||
 | 
					Bill.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please convey all our sympathies and our deepest condolences to Bill's
 | 
				
			||||||
 | 
					relatives and friends.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					John Nelson, G4KLA:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I am saddened to learn of your news.  This is blow to the WSJT-X
 | 
				
			||||||
 | 
					community.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In the early days of Bill’s involvement with WSJT he often logged into
 | 
				
			||||||
 | 
					my Macs at home to test his software modifications on a Mac until he
 | 
				
			||||||
 | 
					got a VM working.  He and I had numerous discussions while testing new
 | 
				
			||||||
 | 
					versions on various Mac OS.  He was generous with his time in helping
 | 
				
			||||||
 | 
					folks with problems either running the codes or attempting to build
 | 
				
			||||||
 | 
					the software on various platforms.  The multitude of emails to the
 | 
				
			||||||
 | 
					development list is a tribute to his commitment to ensure that the
 | 
				
			||||||
 | 
					various programs operated flawlessly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					His involvement with the development of WSJT-X code especially with
 | 
				
			||||||
 | 
					modernising the structure of the whole program has been immense.  I
 | 
				
			||||||
 | 
					will certainly miss his advice.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A sad day…
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Alan, G0TLK:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Shocking and saddening news, he will be greatly missed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					My condolences to his family and friends, and RIP Bill.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Robin, G8DQX:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I only knew Bill through his contributions to the WSJT lists. Those
 | 
				
			||||||
 | 
					contributions were sharp, radical, and usually encouraging. He was a
 | 
				
			||||||
 | 
					clearly essential part of a team that is helping Amateur Radio to
 | 
				
			||||||
 | 
					grow, expand and develop, far beyond what you and I knew when,
 | 
				
			||||||
 | 
					soldering iron in hand, we first played with radio, all those years
 | 
				
			||||||
 | 
					ago.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					My condolences to his family and friends. We shall all miss him.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Robin, G8DQX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Charlie Suckling, G3WDG/DL3WDG:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We were also shocked and very sorry to hear of Bill's sudden
 | 
				
			||||||
 | 
					passing. I never had the pleasure of meeting him in person.  Like Bob,
 | 
				
			||||||
 | 
					he attended the same University and read the same degree.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We are so grateful for his contributions over many years to
 | 
				
			||||||
 | 
					WSJT-X. His support for users was first class, and he even joined the
 | 
				
			||||||
 | 
					EME reflectors to give support to EME users during the roll-out of
 | 
				
			||||||
 | 
					Q65, despite not being active himself on EME.  He was contributing
 | 
				
			||||||
 | 
					there regularly, and some of his last efforts were to support the use
 | 
				
			||||||
 | 
					of WSJT-X for Doppler control on CW on the microwave bands.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					He was also a very patient and diligent teacher, tutoring and helping
 | 
				
			||||||
 | 
					those who wished to make small contributions to the project. I am very
 | 
				
			||||||
 | 
					grateful for the time he spent in such ways.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bill will surely be greatly missed, and sincere condolences to his
 | 
				
			||||||
 | 
					family and many friends.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RIP Bill.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					James Shaver, N2ADV:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I had the pleasure of talking to Bill over Skype a few times during
 | 
				
			||||||
 | 
					the development of 1.7 and later 1.8 to chase down some CAT control
 | 
				
			||||||
 | 
					gremlins with several radios I happen to own. His patience and
 | 
				
			||||||
 | 
					intelligence was incredible. Such a huge loss to us all.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					My sincerest condolences to his family and friends. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					He will definitely be missed but his contributions to the advancement
 | 
				
			||||||
 | 
					of amateur radio will live on indefinitely.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Alessandro Gorobey, IK2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Very sad news and a great loss.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A great teacher.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					My sincerest condolences to his family and friends.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Jim Preston, N6VH:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is definitely very sad news. Bill was a very important part of
 | 
				
			||||||
 | 
					the WSJT team. He will be missed very much.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					My condolences to his family.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Gary Lane, VK4OO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Very sad news, my condolences to Bills friends and family….
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bob Atkins, KA1GT:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I was shocked and saddened by the news of Bill's passing.  We chatted
 | 
				
			||||||
 | 
					on line quite often though we never met in person.  He attended the
 | 
				
			||||||
 | 
					same university as I didn't, reading the same subjects, but was a hear
 | 
				
			||||||
 | 
					of two behind me, so we never met their either. Bill will be greatly
 | 
				
			||||||
 | 
					missed and I send my condolences to his friends and family.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RIP Bill.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Dave Schmocker, KJ9I:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is incredibly sad news.  Bill was always so helpful, highly
 | 
				
			||||||
 | 
					responsive, and on-target with deep technical solutions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					What a wonderful asset Bill was to the hobby and to all with whom he
 | 
				
			||||||
 | 
					interfaced.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Jim, WB4CGS:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I am very sorry for this loss.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Conrad Farlow, Jim WB4GCS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Joe I am absolutely lost for words. What a terrible shock. I cannot
 | 
				
			||||||
 | 
					imagine him not being there. My condolences to you, Bill's family and
 | 
				
			||||||
 | 
					well the whole dev team. We will all miss him Most of all I am sorry
 | 
				
			||||||
 | 
					that you lost such a good friend.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sam Jewell, G4DDK:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So sad to hear this news. One of the team who have revolutionised ham
 | 
				
			||||||
 | 
					radio operation, popularised digital and helped realise what we
 | 
				
			||||||
 | 
					thought should be possible.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Vale Bill.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Nick, NN3Y:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					R I. P. Bill.  He'll be missed. My sincere condolences to his family
 | 
				
			||||||
 | 
					and friends.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Jay, KA9CFD:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Shocking and very sorry news. RIP Bill.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Mirek, OK2AQ:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Very sad news  for us WSJT-X users. R.I.P. Bill
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OH6KTL, Lasse:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ge and  sad to hear about Bill
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -8,6 +8,7 @@ module packjt77
 | 
				
			|||||||
  character (len=13), dimension(1:MAXRECENT) :: recent_calls=''
 | 
					  character (len=13), dimension(1:MAXRECENT) :: recent_calls=''
 | 
				
			||||||
  character (len=13) :: mycall13=''
 | 
					  character (len=13) :: mycall13=''
 | 
				
			||||||
  character (len=13) :: dxcall13=''
 | 
					  character (len=13) :: dxcall13=''
 | 
				
			||||||
 | 
					  character (len=6)  :: dxbase=''
 | 
				
			||||||
  integer, dimension(1:MAXHASH) :: ihash22=-1
 | 
					  integer, dimension(1:MAXHASH) :: ihash22=-1
 | 
				
			||||||
  integer :: nzhash=0
 | 
					  integer :: nzhash=0
 | 
				
			||||||
  integer n28a,n28b
 | 
					  integer n28a,n28b
 | 
				
			||||||
@ -124,6 +125,11 @@ subroutine pack77(msg0,i3,n3,c77)
 | 
				
			|||||||
  integer ntel(3)
 | 
					  integer ntel(3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  msg=msg0
 | 
					  msg=msg0
 | 
				
			||||||
 | 
					  if(msg(1:3).eq.'$DX') then
 | 
				
			||||||
 | 
					     i1=index(msg,' ')
 | 
				
			||||||
 | 
					     msg=trim(dxbase)//' '//msg(i1+1:)
 | 
				
			||||||
 | 
					  endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  i3_hint=i3
 | 
					  i3_hint=i3
 | 
				
			||||||
  n3_hint=n3
 | 
					  n3_hint=n3
 | 
				
			||||||
  i3=-1
 | 
					  i3=-1
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ module q65
 | 
				
			|||||||
  integer apmask(13),apsymbols(13)
 | 
					  integer apmask(13),apsymbols(13)
 | 
				
			||||||
  integer,dimension(22) ::  isync = (/1,9,12,13,15,22,23,26,27,33,35,   &
 | 
					  integer,dimension(22) ::  isync = (/1,9,12,13,15,22,23,26,27,33,35,   &
 | 
				
			||||||
                                     38,46,50,55,60,62,66,69,74,76,85/)
 | 
					                                     38,46,50,55,60,62,66,69,74,76,85/)
 | 
				
			||||||
  integer codewords(63,207)
 | 
					  integer codewords(63,206)
 | 
				
			||||||
  integer ibwa,ibwb,ncw,nsps,mode_q65,nfa,nfb,nqd
 | 
					  integer ibwa,ibwb,ncw,nsps,mode_q65,nfa,nfb,nqd
 | 
				
			||||||
  integer idfbest,idtbest,ibw,ndistbest,maxiters,max_drift
 | 
					  integer idfbest,idtbest,ibw,ndistbest,maxiters,max_drift
 | 
				
			||||||
  integer istep,nsmo,lag1,lag2,npasses,nused,iseq,ncand,nrc
 | 
					  integer istep,nsmo,lag1,lag2,npasses,nused,iseq,ncand,nrc
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
subroutine q65_set_list(mycall,hiscall,hisgrid,codewords,ncw)
 | 
					subroutine q65_set_list(mycall,hiscall,hisgrid,codewords,ncw)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  parameter (MAX_NCW=207)
 | 
					  parameter (MAX_NCW=206)
 | 
				
			||||||
  character*12 mycall,hiscall
 | 
					  character*12 mycall,hiscall
 | 
				
			||||||
  character*6 hisgrid
 | 
					  character*6 hisgrid
 | 
				
			||||||
  character*37 msg0,msg,msgsent
 | 
					  character*37 msg0,msg,msgsent
 | 
				
			||||||
@ -44,7 +44,6 @@ subroutine q65_set_list(mycall,hiscall,hisgrid,codewords,ncw)
 | 
				
			|||||||
           if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
 | 
					           if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
 | 
				
			||||||
        endif
 | 
					        endif
 | 
				
			||||||
     endif
 | 
					     endif
 | 
				
			||||||
     if(i.eq.207) msg='TNX 73 GL'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
10   call genq65(msg,0,msgsent,itone,i3,n3)
 | 
					10   call genq65(msg,0,msgsent,itone,i3,n3)
 | 
				
			||||||
     i0=1
 | 
					     i0=1
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										9
									
								
								lib/save_dxbase.f90
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								lib/save_dxbase.f90
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					subroutine save_dxbase(dxbase0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  use packjt77
 | 
				
			||||||
 | 
					  character*6 dxbase0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  dxbase=dxbase0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return
 | 
				
			||||||
 | 
					end subroutine save_dxbase
 | 
				
			||||||
@ -1410,7 +1410,7 @@ void MainWindow::readFromStdout()                             //readFromStdout
 | 
				
			|||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
      m=3;
 | 
					      m=3;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
      if(n>=30) ui->decodedTextBrowser->append(t.mid(1,n-m));
 | 
					      if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m));
 | 
				
			||||||
      n=ui->decodedTextBrowser->verticalScrollBar()->maximum();
 | 
					      n=ui->decodedTextBrowser->verticalScrollBar()->maximum();
 | 
				
			||||||
      ui->decodedTextBrowser->verticalScrollBar()->setValue(n);
 | 
					      ui->decodedTextBrowser->verticalScrollBar()->setValue(n);
 | 
				
			||||||
      m_messagesText="";
 | 
					      m_messagesText="";
 | 
				
			||||||
@ -1439,7 +1439,6 @@ void MainWindow::readFromStdout()                             //readFromStdout
 | 
				
			|||||||
      int n=t.size();
 | 
					      int n=t.size();
 | 
				
			||||||
      qDebug() << t.mid(1,n-3).trimmed();
 | 
					      qDebug() << t.mid(1,n-3).trimmed();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,10 @@ CAboutDlg::CAboutDlg(QWidget *parent) :
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  ui->labelTxt->setText ("<h2>" + QString {"WSJT-X v"
 | 
					  ui->labelTxt->setText ("<h2>" + QString {"WSJT-X v"
 | 
				
			||||||
                                             + QCoreApplication::applicationVersion ()
 | 
					                                             + QCoreApplication::applicationVersion ()
 | 
				
			||||||
                                             + " " + revision ()}.simplified () + "</h2><br />"
 | 
					                                             + " " + revision ()}.simplified () + "</h2>"
 | 
				
			||||||
 | 
					    "<h3> In memory of G4WJS, Bill Somerville (1956-2021),<br />"
 | 
				
			||||||
 | 
					    "who gave so much of himself to the WSJT project. </h3>"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    "WSJT-X implements a number of digital modes designed for <br />"
 | 
					    "WSJT-X implements a number of digital modes designed for <br />"
 | 
				
			||||||
    "weak-signal Amateur Radio communication.  <br /><br />"
 | 
					    "weak-signal Amateur Radio communication.  <br /><br />"
 | 
				
			||||||
    "© 2001-2021 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
 | 
					    "© 2001-2021 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
 | 
				
			||||||
 | 
				
			|||||||
@ -184,6 +184,8 @@ extern "C" {
 | 
				
			|||||||
  void get_ft4msg_(int* idecode, char* line, int len);
 | 
					  void get_ft4msg_(int* idecode, char* line, int len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void chk_samples_(int* m_ihsym,int* k, int* m_hsymStop);
 | 
					  void chk_samples_(int* m_ihsym,int* k, int* m_hsymStop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void save_dxbase_(char* dxbase, int len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int volatile itone[MAX_NUM_SYMBOLS];   //Audio tones for all Tx symbols
 | 
					int volatile itone[MAX_NUM_SYMBOLS];   //Audio tones for all Tx symbols
 | 
				
			||||||
@ -210,7 +212,7 @@ using SpecOp = Configuration::SpecialOperatingActivity;
 | 
				
			|||||||
namespace
 | 
					namespace
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Radio::Frequency constexpr default_frequency {14076000};
 | 
					  Radio::Frequency constexpr default_frequency {14076000};
 | 
				
			||||||
  QRegExp message_alphabet {"[- @A-Za-z0-9+./?#<>;]*"};
 | 
					  QRegExp message_alphabet {"[- @A-Za-z0-9+./?#<>;$]*"};
 | 
				
			||||||
  // grid exact match excluding RR73
 | 
					  // grid exact match excluding RR73
 | 
				
			||||||
  QRegularExpression grid_regexp {"\\A(?![Rr]{2}73)[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2}){0,1}\\z"};
 | 
					  QRegularExpression grid_regexp {"\\A(?![Rr]{2}73)[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2}){0,1}\\z"};
 | 
				
			||||||
  auto quint32_max = std::numeric_limits<quint32>::max ();
 | 
					  auto quint32_max = std::numeric_limits<quint32>::max ();
 | 
				
			||||||
@ -3641,9 +3643,11 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  auto const& message_words = message.messageWords ();
 | 
					  auto const& message_words = message.messageWords ();
 | 
				
			||||||
  auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size();
 | 
					  auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size();
 | 
				
			||||||
 | 
					  auto msg_no_hash = message.clean_string();
 | 
				
			||||||
 | 
					  msg_no_hash = msg_no_hash.mid(22).remove("<").remove(">");
 | 
				
			||||||
  bool is_OK=false;
 | 
					  bool is_OK=false;
 | 
				
			||||||
  if(m_mode=="MSK144" and message.clean_string ().indexOf(ui->dxCallEntry->text()+" R ")>0) is_OK=true;
 | 
					  if(m_mode=="MSK144" && msg_no_hash.indexOf(ui->dxCallEntry->text()+" R ")>0) is_OK=true;
 | 
				
			||||||
  if (message_words.size () > 2 && (message.isStandardMessage() || (is_73 or is_OK))) {
 | 
					  if (message_words.size () > 3 && (message.isStandardMessage() || (is_73 or is_OK))) {
 | 
				
			||||||
    auto df = message.frequencyOffset ();
 | 
					    auto df = message.frequencyOffset ();
 | 
				
			||||||
    auto within_tolerance = (qAbs (ui->RxFreqSpinBox->value () - df) <= int (start_tolerance)
 | 
					    auto within_tolerance = (qAbs (ui->RxFreqSpinBox->value () - df) <= int (start_tolerance)
 | 
				
			||||||
       || qAbs (ui->TxFreqSpinBox->value () - df) <= int (start_tolerance));
 | 
					       || qAbs (ui->TxFreqSpinBox->value () - df) <= int (start_tolerance));
 | 
				
			||||||
@ -3657,7 +3661,7 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler
 | 
				
			|||||||
               || message_words.contains ("DE")))
 | 
					               || message_words.contains ("DE")))
 | 
				
			||||||
          || !message.isStandardMessage ()); // free text 73/RR73
 | 
					          || !message.isStandardMessage ()); // free text 73/RR73
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QStringList w=message.clean_string ().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts);
 | 
					    auto const& w = msg_no_hash.split(" ",SkipEmptyParts);
 | 
				
			||||||
    QString w2;
 | 
					    QString w2;
 | 
				
			||||||
    int nrpt=0;
 | 
					    int nrpt=0;
 | 
				
			||||||
    if (w.size () > 2)
 | 
					    if (w.size () > 2)
 | 
				
			||||||
@ -3675,27 +3679,29 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler
 | 
				
			|||||||
    if (m_auto
 | 
					    if (m_auto
 | 
				
			||||||
        && (m_QSOProgress==REPLYING  or (!ui->tx1->isEnabled () and m_QSOProgress==REPORT))
 | 
					        && (m_QSOProgress==REPLYING  or (!ui->tx1->isEnabled () and m_QSOProgress==REPORT))
 | 
				
			||||||
        && qAbs (ui->TxFreqSpinBox->value () - df) <= int (stop_tolerance)
 | 
					        && qAbs (ui->TxFreqSpinBox->value () - df) <= int (stop_tolerance)
 | 
				
			||||||
        && message_words.at (1) != "DE"
 | 
					        && message_words.at (2) != "DE"
 | 
				
			||||||
        && !message_words.at (1).contains (QRegularExpression {"(^(CQ|QRZ))|" + m_baseCall})
 | 
					        && !message_words.at (2).contains (QRegularExpression {"(^(CQ|QRZ))|" + m_baseCall})
 | 
				
			||||||
        && message_words.at (2).contains (Radio::base_callsign (ui->dxCallEntry->text ()))) {
 | 
					        && message_words.at (3).contains (Radio::base_callsign (ui->dxCallEntry->text ()))) {
 | 
				
			||||||
      // auto stop to avoid accidental QRM
 | 
					      // auto stop to avoid accidental QRM
 | 
				
			||||||
      ui->stopTxButton->click (); // halt any transmission
 | 
					      ui->stopTxButton->click (); // halt any transmission
 | 
				
			||||||
    } else if (m_auto             // transmit allowed
 | 
					    } else if (m_auto             // transmit allowed
 | 
				
			||||||
               && ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isEnabled () && ui->cbAutoSeq->isChecked () // auto-sequencing allowed
 | 
					               && ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isEnabled () && ui->cbAutoSeq->isChecked () // auto-sequencing allowed
 | 
				
			||||||
               && ((!m_bCallingCQ      // not calling CQ/QRZ
 | 
					               && ((!m_bCallingCQ      // not calling CQ/QRZ
 | 
				
			||||||
                    && !m_sentFirst73       // not finished QSO
 | 
					                    && !m_sentFirst73       // not finished QSO
 | 
				
			||||||
        && ((message_words.at (1).contains (m_baseCall)
 | 
					                    && ((message_words.at (2).contains (m_baseCall)
 | 
				
			||||||
                         // being called and not already in a QSO
 | 
					                         // being called and not already in a QSO
 | 
				
			||||||
        && (message_words.at(2).contains(Radio::base_callsign(ui->dxCallEntry->text())) or bEU_VHF))
 | 
					                         && (message_words.at(3).contains(Radio::base_callsign(ui->dxCallEntry->text()))
 | 
				
			||||||
 | 
					                             or bEU_VHF))
 | 
				
			||||||
 | 
					                        || message_words.at(1) == m_baseCall // <de-call> RR73; ...
 | 
				
			||||||
                        // type 2 compound replies
 | 
					                        // type 2 compound replies
 | 
				
			||||||
                        || (within_tolerance &&
 | 
					                        || (within_tolerance &&
 | 
				
			||||||
                            (acceptable_73 ||
 | 
					                            (acceptable_73 ||
 | 
				
			||||||
            ("DE" == message_words.at (1) &&
 | 
					                             ("DE" == message_words.at (2) &&
 | 
				
			||||||
                              w2.contains(Radio::base_callsign (m_hisCall)))))))
 | 
					                              w2.contains(Radio::base_callsign (m_hisCall)))))))
 | 
				
			||||||
                   || (m_bCallingCQ && m_bAutoReply
 | 
					                   || (m_bCallingCQ && m_bAutoReply
 | 
				
			||||||
                       // look for type 2 compound call replies on our Tx and Rx offsets
 | 
					                       // look for type 2 compound call replies on our Tx and Rx offsets
 | 
				
			||||||
                && ((within_tolerance && "DE" == message_words.at (1))
 | 
					                       && ((within_tolerance && "DE" == message_words.at (2))
 | 
				
			||||||
                    || message_words.at (1).contains (m_baseCall))))) {
 | 
					                           || message_words.at (2).contains (m_baseCall))))) {
 | 
				
			||||||
      if(SpecOp::FOX != m_config.special_op_id()) processMessage (message);
 | 
					      if(SpecOp::FOX != m_config.special_op_id()) processMessage (message);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -4806,7 +4812,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
 | 
				
			|||||||
  ui->txFirstCheckBox->setChecked(m_txFirst);
 | 
					  ui->txFirstCheckBox->setChecked(m_txFirst);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  auto const& message_words = message.messageWords ();
 | 
					  auto const& message_words = message.messageWords ();
 | 
				
			||||||
  if (message_words.size () < 2) return;
 | 
					  if (message_words.size () < 3) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  QString hiscall;
 | 
					  QString hiscall;
 | 
				
			||||||
  QString hisgrid;
 | 
					  QString hisgrid;
 | 
				
			||||||
@ -4824,7 +4830,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
 | 
				
			|||||||
  QStringList w=message.clean_string ().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts);
 | 
					  QStringList w=message.clean_string ().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts);
 | 
				
			||||||
  int nw=w.size();
 | 
					  int nw=w.size();
 | 
				
			||||||
  if(nw>=4) {
 | 
					  if(nw>=4) {
 | 
				
			||||||
    if(message_words.size()<3) return;
 | 
					    if(message_words.size()<4) return;
 | 
				
			||||||
    int n=w.at(nw-2).toInt();
 | 
					    int n=w.at(nw-2).toInt();
 | 
				
			||||||
    if(n>=520001 and n<=592047) {
 | 
					    if(n>=520001 and n<=592047) {
 | 
				
			||||||
      hiscall=w.at(1);
 | 
					      hiscall=w.at(1);
 | 
				
			||||||
@ -4847,7 +4853,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // ignore calls by other hounds
 | 
					  // ignore calls by other hounds
 | 
				
			||||||
  if (SpecOp::HOUND == m_config.special_op_id()
 | 
					  if (SpecOp::HOUND == m_config.special_op_id()
 | 
				
			||||||
      && message.messageWords ().indexOf (QRegularExpression {R"(R\+-[0-9]+)"}) >= 0)
 | 
					      && message.messageWords ().indexOf (QRegularExpression {R"(R\+-[0-9]+)"}) >= 1)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -4926,22 +4932,22 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
 | 
				
			|||||||
      MessageBox::information_message (this, tr ("Should you switch to RTTY contest mode?"));
 | 
					      MessageBox::information_message (this, tr ("Should you switch to RTTY contest mode?"));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(SpecOp::EU_VHF==m_config.special_op_id() and message_words.at(1).contains(m_baseCall) and
 | 
					    if(SpecOp::EU_VHF==m_config.special_op_id() and message_words.at(2).contains(m_baseCall) and
 | 
				
			||||||
       (!message_words.at(2).contains(qso_partner_base_call)) and (!m_bDoubleClicked)) {
 | 
					       (!message_words.at(3).contains(qso_partner_base_call)) and (!m_bDoubleClicked)) {
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool bContestOK=(m_mode=="FT4" or m_mode=="FT8" or m_mode=="Q65" or m_mode=="MSK144");
 | 
					    bool bContestOK=(m_mode=="FT4" or m_mode=="FT8" or m_mode=="Q65" or m_mode=="MSK144");
 | 
				
			||||||
    if(message_words.size () > 3   // enough fields for a normal message
 | 
					    if(message_words.size () > 4   // enough fields for a normal message
 | 
				
			||||||
       && (message_words.at(1).contains(m_baseCall) || "DE" == message_words.at(1))
 | 
					       && (message_words.at(2).contains(m_baseCall) || "DE" == message_words.at(2))
 | 
				
			||||||
       && (message_words.at(2).contains(qso_partner_base_call) or m_bDoubleClicked
 | 
					       && (message_words.at(3).contains(qso_partner_base_call) or m_bDoubleClicked
 | 
				
			||||||
           or bEU_VHF_w2 or (m_QSOProgress==CALLING))) {
 | 
					           or bEU_VHF_w2 or (m_QSOProgress==CALLING))) {
 | 
				
			||||||
      if(message_words.at(3).contains(grid_regexp) and SpecOp::EU_VHF!=m_config.special_op_id()) {
 | 
					      if(message_words.at(4).contains(grid_regexp) and SpecOp::EU_VHF!=m_config.special_op_id()) {
 | 
				
			||||||
        if((SpecOp::NA_VHF==m_config.special_op_id() or SpecOp::WW_DIGI==m_config.special_op_id()) and bContestOK){
 | 
					        if((SpecOp::NA_VHF==m_config.special_op_id() or SpecOp::WW_DIGI==m_config.special_op_id()) and bContestOK){
 | 
				
			||||||
          setTxMsg(3);
 | 
					          setTxMsg(3);
 | 
				
			||||||
          m_QSOProgress=ROGER_REPORT;
 | 
					          m_QSOProgress=ROGER_REPORT;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          if(m_mode=="JT65" and message_words.size()>4 and message_words.at(4)=="OOO") {
 | 
					          if(m_mode=="JT65" and message_words.size()>5 and message_words.at(5)=="OOO") {
 | 
				
			||||||
            setTxMsg(3);
 | 
					            setTxMsg(3);
 | 
				
			||||||
            m_QSOProgress=ROGER_REPORT;
 | 
					            m_QSOProgress=ROGER_REPORT;
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
@ -4981,7 +4987,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
 | 
				
			|||||||
          m_QSOProgress=ROGER_REPORT;
 | 
					          m_QSOProgress=ROGER_REPORT;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      } else {  // no grid on end of msg
 | 
					      } else {  // no grid on end of msg
 | 
				
			||||||
        auto const& word_3 = message_words.at (3);
 | 
					        auto const& word_3 = message_words.at (4);
 | 
				
			||||||
        auto word_3_as_number = word_3.toInt ();
 | 
					        auto word_3_as_number = word_3.toInt ();
 | 
				
			||||||
        if (("RRR" == word_3
 | 
					        if (("RRR" == word_3
 | 
				
			||||||
             || (word_3_as_number == 73 && ROGERS == m_QSOProgress)
 | 
					             || (word_3_as_number == 73 && ROGERS == m_QSOProgress)
 | 
				
			||||||
@ -5103,17 +5109,29 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
 | 
				
			|||||||
          }
 | 
					          }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    else if (5 == message_words.size ()
 | 
				
			||||||
 | 
					             && m_baseCall == message_words.at (1)) {
 | 
				
			||||||
 | 
					      // dual Fox style message, possibly from MSHV
 | 
				
			||||||
 | 
					      if (m_config.prompt_to_log() || m_config.autoLog()) {
 | 
				
			||||||
 | 
					        logQSOTimer.start(0);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else {
 | 
				
			||||||
 | 
					        cease_auto_Tx_after_QSO ();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      m_ntx=6;
 | 
				
			||||||
 | 
					      ui->txrb6->setChecked(true);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    else if (m_QSOProgress >= ROGERS
 | 
					    else if (m_QSOProgress >= ROGERS
 | 
				
			||||||
             && message_words.size () > 2 && message_words.at (1).contains (m_baseCall)
 | 
					             && message_words.size () > 3 && message_words.at (2).contains (m_baseCall)
 | 
				
			||||||
             && message_words.at (2) == "73") {
 | 
					             && message_words.at (3) == "73") {
 | 
				
			||||||
      // 73 back to compound call holder
 | 
					      // 73 back to compound call holder
 | 
				
			||||||
      m_ntx=5;
 | 
					      m_ntx=5;
 | 
				
			||||||
      ui->txrb5->setChecked(true);
 | 
					      ui->txrb5->setChecked(true);
 | 
				
			||||||
      m_QSOProgress = SIGNOFF;
 | 
					      m_QSOProgress = SIGNOFF;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (!(m_bAutoReply && (m_QSOProgress > CALLING))) {
 | 
					    else if (!(m_bAutoReply && (m_QSOProgress > CALLING))) {
 | 
				
			||||||
      if ((message_words.size () > 4 && message_words.at (1).contains (m_baseCall)
 | 
					      if ((message_words.size () > 5 && message_words.at (2).contains (m_baseCall)
 | 
				
			||||||
           && message_words.at (4) == "OOO")) {
 | 
					           && message_words.at (5) == "OOO")) {
 | 
				
			||||||
        // EME short code report or MSK144/FT8 contest mode reply, send back Tx3
 | 
					        // EME short code report or MSK144/FT8 contest mode reply, send back Tx3
 | 
				
			||||||
        m_ntx=3;
 | 
					        m_ntx=3;
 | 
				
			||||||
        m_QSOProgress = ROGER_REPORT;
 | 
					        m_QSOProgress = ROGER_REPORT;
 | 
				
			||||||
@ -5136,7 +5154,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
 | 
				
			|||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else if (firstcall == "DE" && message_words.size () > 3 && message_words.at (3) == "73") {
 | 
					  else if (firstcall == "DE" && message_words.size () > 4 && message_words.at (4) == "73") {
 | 
				
			||||||
    if (m_QSOProgress >= ROGERS && base_call == qso_partner_base_call && m_currentMessageType) {
 | 
					    if (m_QSOProgress >= ROGERS && base_call == qso_partner_base_call && m_currentMessageType) {
 | 
				
			||||||
      // 73 back to compound call holder
 | 
					      // 73 back to compound call holder
 | 
				
			||||||
      m_ntx=5;
 | 
					      m_ntx=5;
 | 
				
			||||||
@ -5356,6 +5374,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
 | 
				
			|||||||
  auto is_type_one = !is77BitMode () && is_compound && shortList (my_callsign);
 | 
					  auto is_type_one = !is77BitMode () && is_compound && shortList (my_callsign);
 | 
				
			||||||
  auto const& my_grid = m_config.my_grid ().left (4);
 | 
					  auto const& my_grid = m_config.my_grid ().left (4);
 | 
				
			||||||
  auto const& hisBase = Radio::base_callsign (hisCall);
 | 
					  auto const& hisBase = Radio::base_callsign (hisCall);
 | 
				
			||||||
 | 
					  save_dxbase_(const_cast <char *> ((hisBase + "   ").left (6).toLatin1().constData()),6);
 | 
				
			||||||
  auto eme_short_codes = m_config.enable_VHF_features () && ui->cbShMsgs->isChecked ()
 | 
					  auto eme_short_codes = m_config.enable_VHF_features () && ui->cbShMsgs->isChecked ()
 | 
				
			||||||
      && m_mode == "JT65";
 | 
					      && m_mode == "JT65";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -5837,6 +5856,13 @@ void MainWindow::on_dxCallEntry_textChanged (QString const& call)
 | 
				
			|||||||
  statusUpdate ();
 | 
					  statusUpdate ();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::on_dxCallEntry_editingFinished()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  auto const& dxBase = Radio::base_callsign (m_hisCall);
 | 
				
			||||||
 | 
					  save_dxbase_(const_cast <char *> ((dxBase + "   ").left (6).toLatin1().constData()),6);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MainWindow::on_dxCallEntry_returnPressed ()
 | 
					void MainWindow::on_dxCallEntry_returnPressed ()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  on_lookupButton_clicked();
 | 
					  on_lookupButton_clicked();
 | 
				
			||||||
@ -7743,10 +7769,11 @@ void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 de
 | 
				
			|||||||
                            , bool /*low_confidence*/, quint8 modifiers)
 | 
					                            , bool /*low_confidence*/, quint8 modifiers)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  QString format_string {"%1 %2 %3 %4 %5 %6"};
 | 
					  QString format_string {"%1 %2 %3 %4 %5 %6"};
 | 
				
			||||||
  auto const& time_string = time.toString ("~" == mode || "&" == mode
 | 
					  auto const& time_string = time.toString ("~" == mode || "&" == mode || "+" == mode
 | 
				
			||||||
                                           || "+" == mode ? "hhmmss" : "hhmm");
 | 
					                                           || (m_TRperiod < 60. && ("`" == mode || ":" == mode))
 | 
				
			||||||
 | 
					                                           ? "hhmmss" : "hhmm");
 | 
				
			||||||
  auto text = message_text;
 | 
					  auto text = message_text;
 | 
				
			||||||
  auto ap_pos = text.lastIndexOf (QRegularExpression {R"((?:\?\s)?a[0-9]$)"});
 | 
					  auto ap_pos = text.lastIndexOf (QRegularExpression {R"((?:\?\s)?(?:a[0-9]|q[0-9][0-9]?)$)"});
 | 
				
			||||||
  if (ap_pos >= 0)
 | 
					  if (ap_pos >= 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      // beware of decodes ending on shorter version of wanted call so
 | 
					      // beware of decodes ending on shorter version of wanted call so
 | 
				
			||||||
@ -7867,7 +7894,7 @@ void MainWindow::postDecode (bool is_new, QString const& message)
 | 
				
			|||||||
                               , parts[1].toInt ()
 | 
					                               , parts[1].toInt ()
 | 
				
			||||||
                               , parts[2].toFloat (), parts[3].toUInt (), parts[4]
 | 
					                               , parts[2].toFloat (), parts[3].toUInt (), parts[4]
 | 
				
			||||||
                               , decode.mid (has_seconds ? 24 : 22)
 | 
					                               , decode.mid (has_seconds ? 24 : 22)
 | 
				
			||||||
                               , QChar {'?'} == decode.mid (has_seconds ? 24 + 21 : 22 + 21, 1)
 | 
					                               , QChar {'?'} == decode.mid (has_seconds ? 24 + 36 : 22 + 36, 1)
 | 
				
			||||||
                               , m_diskData);
 | 
					                               , m_diskData);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -204,6 +204,7 @@ private slots:
 | 
				
			|||||||
  void on_addButton_clicked();
 | 
					  void on_addButton_clicked();
 | 
				
			||||||
  void on_dxCallEntry_textChanged (QString const&);
 | 
					  void on_dxCallEntry_textChanged (QString const&);
 | 
				
			||||||
  void on_dxGridEntry_textChanged (QString const&);
 | 
					  void on_dxGridEntry_textChanged (QString const&);
 | 
				
			||||||
 | 
					  void on_dxCallEntry_editingFinished();
 | 
				
			||||||
  void on_dxCallEntry_returnPressed ();
 | 
					  void on_dxCallEntry_returnPressed ();
 | 
				
			||||||
  void on_genStdMsgsPushButton_clicked();
 | 
					  void on_genStdMsgsPushButton_clicked();
 | 
				
			||||||
  void on_logQSOButton_clicked();
 | 
					  void on_logQSOButton_clicked();
 | 
				
			||||||
 | 
				
			|||||||
@ -1701,9 +1701,6 @@ When not checked you can view the calibration results.</string>
 | 
				
			|||||||
                          <verstretch>0</verstretch>
 | 
					                          <verstretch>0</verstretch>
 | 
				
			||||||
                         </sizepolicy>
 | 
					                         </sizepolicy>
 | 
				
			||||||
                        </property>
 | 
					                        </property>
 | 
				
			||||||
                        <property name="maxLength">
 | 
					 | 
				
			||||||
                         <number>30</number>
 | 
					 | 
				
			||||||
                        </property>
 | 
					 | 
				
			||||||
                       </widget>
 | 
					                       </widget>
 | 
				
			||||||
                      </item>
 | 
					                      </item>
 | 
				
			||||||
                      <item row="4" column="1">
 | 
					                      <item row="4" column="1">
 | 
				
			||||||
@ -1755,9 +1752,6 @@ Double click to toggle the use of the Tx1 message to start a QSO with a station
 | 
				
			|||||||
                          <verstretch>0</verstretch>
 | 
					                          <verstretch>0</verstretch>
 | 
				
			||||||
                         </sizepolicy>
 | 
					                         </sizepolicy>
 | 
				
			||||||
                        </property>
 | 
					                        </property>
 | 
				
			||||||
                        <property name="maxLength">
 | 
					 | 
				
			||||||
                         <number>30</number>
 | 
					 | 
				
			||||||
                        </property>
 | 
					 | 
				
			||||||
                       </widget>
 | 
					                       </widget>
 | 
				
			||||||
                      </item>
 | 
					                      </item>
 | 
				
			||||||
                      <item row="5" column="2">
 | 
					                      <item row="5" column="2">
 | 
				
			||||||
@ -1804,9 +1798,6 @@ Double-click to reset to the standard 73 message</string>
 | 
				
			|||||||
                          <verstretch>0</verstretch>
 | 
					                          <verstretch>0</verstretch>
 | 
				
			||||||
                         </sizepolicy>
 | 
					                         </sizepolicy>
 | 
				
			||||||
                        </property>
 | 
					                        </property>
 | 
				
			||||||
                        <property name="maxLength">
 | 
					 | 
				
			||||||
                         <number>30</number>
 | 
					 | 
				
			||||||
                        </property>
 | 
					 | 
				
			||||||
                       </widget>
 | 
					                       </widget>
 | 
				
			||||||
                      </item>
 | 
					                      </item>
 | 
				
			||||||
                      <item row="0" column="2">
 | 
					                      <item row="0" column="2">
 | 
				
			||||||
@ -1846,9 +1837,6 @@ Double-click to reset to the standard 73 message</string>
 | 
				
			|||||||
                          <verstretch>0</verstretch>
 | 
					                          <verstretch>0</verstretch>
 | 
				
			||||||
                         </sizepolicy>
 | 
					                         </sizepolicy>
 | 
				
			||||||
                        </property>
 | 
					                        </property>
 | 
				
			||||||
                        <property name="maxLength">
 | 
					 | 
				
			||||||
                         <number>30</number>
 | 
					 | 
				
			||||||
                        </property>
 | 
					 | 
				
			||||||
                       </widget>
 | 
					                       </widget>
 | 
				
			||||||
                      </item>
 | 
					                      </item>
 | 
				
			||||||
                      <item row="3" column="0">
 | 
					                      <item row="3" column="0">
 | 
				
			||||||
@ -1859,9 +1847,6 @@ Double-click to reset to the standard 73 message</string>
 | 
				
			|||||||
                          <verstretch>0</verstretch>
 | 
					                          <verstretch>0</verstretch>
 | 
				
			||||||
                         </sizepolicy>
 | 
					                         </sizepolicy>
 | 
				
			||||||
                        </property>
 | 
					                        </property>
 | 
				
			||||||
                        <property name="maxLength">
 | 
					 | 
				
			||||||
                         <number>30</number>
 | 
					 | 
				
			||||||
                        </property>
 | 
					 | 
				
			||||||
                       </widget>
 | 
					                       </widget>
 | 
				
			||||||
                      </item>
 | 
					                      </item>
 | 
				
			||||||
                      <item row="0" column="0">
 | 
					                      <item row="0" column="0">
 | 
				
			||||||
@ -2863,6 +2848,14 @@ Yellow when too low</string>
 | 
				
			|||||||
   </layout>
 | 
					   </layout>
 | 
				
			||||||
  </widget>
 | 
					  </widget>
 | 
				
			||||||
  <widget class="QMenuBar" name="menuBar">
 | 
					  <widget class="QMenuBar" name="menuBar">
 | 
				
			||||||
 | 
					   <property name="geometry">
 | 
				
			||||||
 | 
					    <rect>
 | 
				
			||||||
 | 
					     <x>0</x>
 | 
				
			||||||
 | 
					     <y>0</y>
 | 
				
			||||||
 | 
					     <width>842</width>
 | 
				
			||||||
 | 
					     <height>21</height>
 | 
				
			||||||
 | 
					    </rect>
 | 
				
			||||||
 | 
					   </property>
 | 
				
			||||||
   <widget class="QMenu" name="menuFile">
 | 
					   <widget class="QMenu" name="menuFile">
 | 
				
			||||||
    <property name="title">
 | 
					    <property name="title">
 | 
				
			||||||
     <string>File</string>
 | 
					     <string>File</string>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user