diff --git a/CMake/Modules/BundleUtilities.cmake b/CMake/Modules/BundleUtilities.cmake deleted file mode 100644 index b7975d3ea..000000000 --- a/CMake/Modules/BundleUtilities.cmake +++ /dev/null @@ -1,975 +0,0 @@ -#.rst: -# BundleUtilities -# --------------- -# -# Functions to help assemble a standalone bundle application. -# -# A collection of CMake utility functions useful for dealing with .app -# bundles on the Mac and bundle-like directories on any OS. -# -# The following functions are provided by this module: -# -# :: -# -# fixup_bundle -# copy_and_fixup_bundle -# verify_app -# get_bundle_main_executable -# get_dotapp_dir -# get_bundle_and_executable -# get_bundle_all_executables -# get_item_key -# get_item_rpaths -# clear_bundle_keys -# set_bundle_key_values -# get_bundle_keys -# copy_resolved_item_into_bundle -# copy_resolved_framework_into_bundle -# fixup_bundle_item -# verify_bundle_prerequisites -# verify_bundle_symlinks -# -# Requires CMake 2.6 or greater because it uses function, break and -# PARENT_SCOPE. Also depends on GetPrerequisites.cmake. -# -# :: -# -# FIXUP_BUNDLE( ) -# -# Fix up a bundle in-place and make it standalone, such that it can be -# drag-n-drop copied to another machine and run on that machine as long -# as all of the system libraries are compatible. -# -# If you pass plugins to fixup_bundle as the libs parameter, you should -# install them or copy them into the bundle before calling fixup_bundle. -# The "libs" parameter is a list of libraries that must be fixed up, but -# that cannot be determined by otool output analysis. (i.e., plugins) -# -# Gather all the keys for all the executables and libraries in a bundle, -# and then, for each key, copy each prerequisite into the bundle. Then -# fix each one up according to its own list of prerequisites. -# -# Then clear all the keys and call verify_app on the final bundle to -# ensure that it is truly standalone. -# -# :: -# -# COPY_AND_FIXUP_BUNDLE( ) -# -# Makes a copy of the bundle at location and then fixes up -# the new copied bundle in-place at ... -# -# :: -# -# VERIFY_APP() -# -# Verifies that an application appears valid based on running -# analysis tools on it. Calls "message(FATAL_ERROR" if the application -# is not verified. -# -# :: -# -# GET_BUNDLE_MAIN_EXECUTABLE( ) -# -# The result will be the full path name of the bundle's main executable -# file or an "error:" prefixed string if it could not be determined. -# -# :: -# -# GET_DOTAPP_DIR( ) -# -# Returns the nearest parent dir whose name ends with ".app" given the -# full path to an executable. If there is no such parent dir, then -# simply return the dir containing the executable. -# -# The returned directory may or may not exist. -# -# :: -# -# GET_BUNDLE_AND_EXECUTABLE( ) -# -# Takes either a ".app" directory name or the name of an executable -# nested inside a ".app" directory and returns the path to the ".app" -# directory in and the path to its main executable in -# -# -# :: -# -# GET_BUNDLE_ALL_EXECUTABLES( ) -# -# Scans the given bundle recursively for all executable files and -# accumulates them into a variable. -# -# :: -# -# GET_ITEM_KEY( ) -# -# Given a file (item) name, generate a key that should be unique -# considering the set of libraries that need copying or fixing up to -# make a bundle standalone. This is essentially the file name including -# extension with "." replaced by "_" -# -# This key is used as a prefix for CMake variables so that we can -# associate a set of variables with a given item based on its key. -# -# :: -# -# CLEAR_BUNDLE_KEYS() -# -# Loop over the list of keys, clearing all the variables associated with -# each key. After the loop, clear the list of keys itself. -# -# Caller of get_bundle_keys should call clear_bundle_keys when done with -# list of keys. -# -# :: -# -# SET_BUNDLE_KEY_VALUES( -# []) -# -# Add a key to the list (if necessary) for the given item. If added, -# also set all the variables associated with that key. -# -# :: -# -# GET_BUNDLE_KEYS( ) -# -# Loop over all the executable and library files within the bundle (and -# given as extra ) and accumulate a list of keys representing -# them. Set values associated with each key such that we can loop over -# all of them and copy prerequisite libs into the bundle and then do -# appropriate install_name_tool fixups. -# -# :: -# -# COPY_RESOLVED_ITEM_INTO_BUNDLE( ) -# -# Copy a resolved item into the bundle if necessary. Copy is not -# necessary if the resolved_item is "the same as" the -# resolved_embedded_item. -# -# :: -# -# COPY_RESOLVED_FRAMEWORK_INTO_BUNDLE( ) -# -# Copy a resolved framework into the bundle if necessary. Copy is not -# necessary if the resolved_item is "the same as" the -# resolved_embedded_item. -# -# By default, BU_COPY_FULL_FRAMEWORK_CONTENTS is not set. If you want -# full frameworks embedded in your bundles, set -# BU_COPY_FULL_FRAMEWORK_CONTENTS to ON before calling fixup_bundle. By -# default, COPY_RESOLVED_FRAMEWORK_INTO_BUNDLE copies the framework -# dylib itself plus the framework Resources directory. -# -# :: -# -# FIXUP_BUNDLE_ITEM( ) -# -# Get the direct/non-system prerequisites of the resolved embedded item. -# For each prerequisite, change the way it is referenced to the value of -# the _EMBEDDED_ITEM keyed variable for that prerequisite. (Most likely -# changing to an "@executable_path" style reference.) -# -# This function requires that the resolved_embedded_item be "inside" the -# bundle already. In other words, if you pass plugins to fixup_bundle -# as the libs parameter, you should install them or copy them into the -# bundle before calling fixup_bundle. The "libs" parameter is a list of -# libraries that must be fixed up, but that cannot be determined by -# otool output analysis. (i.e., plugins) -# -# Also, change the id of the item being fixed up to its own -# _EMBEDDED_ITEM value. -# -# Accumulate changes in a local variable and make *one* call to -# install_name_tool at the end of the function with all the changes at -# once. -# -# If the BU_CHMOD_BUNDLE_ITEMS variable is set then bundle items will be -# marked writable before install_name_tool tries to change them. -# -# :: -# -# VERIFY_BUNDLE_PREREQUISITES( ) -# -# Verifies that the sum of all prerequisites of all files inside the -# bundle are contained within the bundle or are "system" libraries, -# presumed to exist everywhere. -# -# :: -# -# VERIFY_BUNDLE_SYMLINKS( ) -# -# Verifies that any symlinks found in the bundle point to other files -# that are already also in the bundle... Anything that points to an -# external file causes this function to fail the verification. - -#============================================================================= -# Copyright 2008-2009 Kitware, Inc. -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - -# The functions defined in this file depend on the get_prerequisites function -# (and possibly others) found in: -# -get_filename_component(BundleUtilities_cmake_dir "${CMAKE_CURRENT_LIST_FILE}" PATH) -include("${BundleUtilities_cmake_dir}/GetPrerequisites.cmake") - - -function(get_bundle_main_executable bundle result_var) - set(result "error: '${bundle}/Contents/Info.plist' file does not exist") - - if(EXISTS "${bundle}/Contents/Info.plist") - set(result "error: no CFBundleExecutable in '${bundle}/Contents/Info.plist' file") - set(line_is_main_executable 0) - set(bundle_executable "") - - # Read Info.plist as a list of lines: - # - set(eol_char "E") - file(READ "${bundle}/Contents/Info.plist" info_plist) - string(REPLACE ";" "\\;" info_plist "${info_plist}") - string(REPLACE "\n" "${eol_char};" info_plist "${info_plist}") - string(REPLACE "\r" "${eol_char};" info_plist "${info_plist}") - - # Scan the lines for "CFBundleExecutable" - the line after that - # is the name of the main executable. - # - foreach(line ${info_plist}) - if(line_is_main_executable) - string(REGEX REPLACE "^.*(.*).*$" "\\1" bundle_executable "${line}") - break() - endif() - - if(line MATCHES "CFBundleExecutable") - set(line_is_main_executable 1) - endif() - endforeach() - - if(NOT "${bundle_executable}" STREQUAL "") - if(EXISTS "${bundle}/Contents/MacOS/${bundle_executable}") - set(result "${bundle}/Contents/MacOS/${bundle_executable}") - else() - - # Ultimate goal: - # If not in "Contents/MacOS" then scan the bundle for matching files. If - # there is only one executable file that matches, then use it, otherwise - # it's an error... - # - #file(GLOB_RECURSE file_list "${bundle}/${bundle_executable}") - - # But for now, pragmatically, it's an error. Expect the main executable - # for the bundle to be in Contents/MacOS, it's an error if it's not: - # - set(result "error: '${bundle}/Contents/MacOS/${bundle_executable}' does not exist") - endif() - endif() - else() - # - # More inclusive technique... (This one would work on Windows and Linux - # too, if a developer followed the typical Mac bundle naming convention...) - # - # If there is no Info.plist file, try to find an executable with the same - # base name as the .app directory: - # - endif() - - set(${result_var} "${result}" PARENT_SCOPE) -endfunction() - - -function(get_dotapp_dir exe dotapp_dir_var) - set(s "${exe}") - - if(s MATCHES "/.*\\.app/") - # If there is a ".app" parent directory, - # ascend until we hit it: - # (typical of a Mac bundle executable) - # - set(done 0) - while(NOT ${done}) - get_filename_component(snamewe "${s}" NAME_WE) - get_filename_component(sname "${s}" NAME) - get_filename_component(sdir "${s}" PATH) - set(s "${sdir}") - if(sname MATCHES "\\.app$") - set(done 1) - set(dotapp_dir "${sdir}/${sname}") - endif() - endwhile() - else() - # Otherwise use a directory containing the exe - # (typical of a non-bundle executable on Mac, Windows or Linux) - # - is_file_executable("${s}" is_executable) - if(is_executable) - get_filename_component(sdir "${s}" PATH) - set(dotapp_dir "${sdir}") - else() - set(dotapp_dir "${s}") - endif() - endif() - - - set(${dotapp_dir_var} "${dotapp_dir}" PARENT_SCOPE) -endfunction() - - -function(get_bundle_and_executable app bundle_var executable_var valid_var) - set(valid 0) - - if(EXISTS "${app}") - # Is it a directory ending in .app? - if(IS_DIRECTORY "${app}") - if(app MATCHES "\\.app$") - get_bundle_main_executable("${app}" executable) - if(EXISTS "${app}" AND EXISTS "${executable}") - set(${bundle_var} "${app}" PARENT_SCOPE) - set(${executable_var} "${executable}" PARENT_SCOPE) - set(valid 1) - #message(STATUS "info: handled .app directory case...") - else() - message(STATUS "warning: *NOT* handled - .app directory case...") - endif() - else() - message(STATUS "warning: *NOT* handled - directory but not .app case...") - endif() - else() - # Is it an executable file? - is_file_executable("${app}" is_executable) - if(is_executable) - get_dotapp_dir("${app}" dotapp_dir) - if(EXISTS "${dotapp_dir}") - set(${bundle_var} "${dotapp_dir}" PARENT_SCOPE) - set(${executable_var} "${app}" PARENT_SCOPE) - set(valid 1) - #message(STATUS "info: handled executable file in .app dir case...") - else() - get_filename_component(app_dir "${app}" PATH) - set(${bundle_var} "${app_dir}" PARENT_SCOPE) - set(${executable_var} "${app}" PARENT_SCOPE) - set(valid 1) - #message(STATUS "info: handled executable file in any dir case...") - endif() - else() - message(STATUS "warning: *NOT* handled - not .app dir, not executable file...") - endif() - endif() - else() - message(STATUS "warning: *NOT* handled - directory/file does not exist...") - endif() - - if(NOT valid) - set(${bundle_var} "error: not a bundle" PARENT_SCOPE) - set(${executable_var} "error: not a bundle" PARENT_SCOPE) - endif() - - set(${valid_var} ${valid} PARENT_SCOPE) -endfunction() - - -function(get_bundle_all_executables bundle exes_var) - set(exes "") - - if(UNIX) - find_program(find_cmd "find") - mark_as_advanced(find_cmd) - endif() - - # find command is much quicker than checking every file one by one on Unix - # which can take long time for large bundles, and since anyway we expect - # executable to have execute flag set we can narrow the list much quicker. - if(find_cmd) - execute_process(COMMAND "${find_cmd}" "${bundle}" - -type f \( -perm -0100 -o -perm -0010 -o -perm -0001 \) - OUTPUT_VARIABLE file_list - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - string(REPLACE "\n" ";" file_list "${file_list}") - else() - file(GLOB_RECURSE file_list "${bundle}/*") - endif() - - foreach(f ${file_list}) - is_file_executable("${f}" is_executable) - if(is_executable) - set(exes ${exes} "${f}") - endif() - endforeach() - - set(${exes_var} "${exes}" PARENT_SCOPE) -endfunction() - - -function(get_item_rpaths item rpaths_var) - if(APPLE) - find_program(otool_cmd "otool") - mark_as_advanced(otool_cmd) - endif() - - if(otool_cmd) - execute_process( - COMMAND "${otool_cmd}" -l "${item}" - OUTPUT_VARIABLE load_cmds_ov - ) - string(REGEX REPLACE "[^\n]+cmd LC_RPATH\n[^\n]+\n[^\n]+path ([^\n]+) \\(offset[^\n]+\n" "rpath \\1\n" load_cmds_ov "${load_cmds_ov}") - string(REGEX MATCHALL "rpath [^\n]+" load_cmds_ov "${load_cmds_ov}") - string(REGEX REPLACE "rpath " "" load_cmds_ov "${load_cmds_ov}") - if(load_cmds_ov) - gp_append_unique(${rpaths_var} "${load_cmds_ov}") - endif() - endif() - - set(${rpaths_var} ${${rpaths_var}} PARENT_SCOPE) -endfunction() - - -function(get_item_key item key_var) - get_filename_component(item_name "${item}" NAME) - if(WIN32) - string(TOLOWER "${item_name}" item_name) - endif() - string(REPLACE "." "_" ${key_var} "${item_name}") - set(${key_var} ${${key_var}} PARENT_SCOPE) -endfunction() - - -function(clear_bundle_keys keys_var) - foreach(key ${${keys_var}}) - set(${key}_ITEM PARENT_SCOPE) - set(${key}_RESOLVED_ITEM PARENT_SCOPE) - set(${key}_DEFAULT_EMBEDDED_PATH PARENT_SCOPE) - set(${key}_EMBEDDED_ITEM PARENT_SCOPE) - set(${key}_RESOLVED_EMBEDDED_ITEM PARENT_SCOPE) - set(${key}_COPYFLAG PARENT_SCOPE) - set(${key}_RPATHS PARENT_SCOPE) - endforeach() - set(${keys_var} PARENT_SCOPE) -endfunction() - - -function(set_bundle_key_values keys_var context item exepath dirs copyflag) - if(ARGC GREATER 6) - set(rpaths "${ARGV6}") - else() - set(rpaths "") - endif() - get_filename_component(item_name "${item}" NAME) - - get_item_key("${item}" key) - - list(LENGTH ${keys_var} length_before) - gp_append_unique(${keys_var} "${key}") - list(LENGTH ${keys_var} length_after) - - if(NOT length_before EQUAL length_after) - gp_resolve_item("${context}" "${item}" "${exepath}" "${dirs}" resolved_item "${rpaths}") - - gp_item_default_embedded_path("${item}" default_embedded_path) - - get_item_rpaths("${resolved_item}" item_rpaths) - - if(item MATCHES "[^/]+\\.framework/") - # For frameworks, construct the name under the embedded path from the - # opening "${item_name}.framework/" to the closing "/${item_name}": - # - string(REGEX REPLACE "^.*(${item_name}.framework/.*/?${item_name}).*$" "${default_embedded_path}/\\1" embedded_item "${item}") - else() - # For other items, just use the same name as the original, but in the - # embedded path: - # - set(embedded_item "${default_embedded_path}/${item_name}") - endif() - - # Replace @executable_path and resolve ".." references: - # - string(REPLACE "@executable_path" "${exepath}" resolved_embedded_item "${embedded_item}") - get_filename_component(resolved_embedded_item "${resolved_embedded_item}" ABSOLUTE) - - # *But* -- if we are not copying, then force resolved_embedded_item to be - # the same as resolved_item. In the case of multiple executables in the - # original bundle, using the default_embedded_path results in looking for - # the resolved executable next to the main bundle executable. This is here - # so that exes in the other sibling directories (like "bin") get fixed up - # properly... - # - if(NOT copyflag) - set(resolved_embedded_item "${resolved_item}") - endif() - - set(${keys_var} ${${keys_var}} PARENT_SCOPE) - set(${key}_ITEM "${item}" PARENT_SCOPE) - set(${key}_RESOLVED_ITEM "${resolved_item}" PARENT_SCOPE) - set(${key}_DEFAULT_EMBEDDED_PATH "${default_embedded_path}" PARENT_SCOPE) - set(${key}_EMBEDDED_ITEM "${embedded_item}" PARENT_SCOPE) - set(${key}_RESOLVED_EMBEDDED_ITEM "${resolved_embedded_item}" PARENT_SCOPE) - set(${key}_COPYFLAG "${copyflag}" PARENT_SCOPE) - set(${key}_RPATHS "${item_rpaths}" PARENT_SCOPE) - set(${key}_RDEP_RPATHS "${rpaths}" PARENT_SCOPE) - else() - #message("warning: item key '${key}' already in the list, subsequent references assumed identical to first") - endif() -endfunction() - - -function(get_bundle_keys app libs dirs keys_var) - set(${keys_var} PARENT_SCOPE) - - get_bundle_and_executable("${app}" bundle executable valid) - if(valid) - # Always use the exepath of the main bundle executable for @executable_path - # replacements: - # - get_filename_component(exepath "${executable}" PATH) - - # But do fixups on all executables in the bundle: - # - get_bundle_all_executables("${bundle}" exes) - - # Set keys for main executable first: - # - set_bundle_key_values(${keys_var} "${executable}" "${executable}" "${exepath}" "${dirs}" 0) - - # Get rpaths specified by main executable: - # - get_item_key("${executable}" executable_key) - set(main_rpaths "${${executable_key}_RPATHS}") - - # For each extra lib, accumulate a key as well and then also accumulate - # any of its prerequisites. (Extra libs are typically dynamically loaded - # plugins: libraries that are prerequisites for full runtime functionality - # but that do not show up in otool -L output...) - # - foreach(lib ${libs}) - set_bundle_key_values(${keys_var} "${lib}" "${lib}" "${exepath}" "${dirs}" 0 "${main_rpaths}") - - set(prereqs "") - get_prerequisites("${lib}" prereqs 1 1 "${exepath}" "${dirs}" "${main_rpaths}") - foreach(pr ${prereqs}) - set_bundle_key_values(${keys_var} "${lib}" "${pr}" "${exepath}" "${dirs}" 1 "${main_rpaths}") - endforeach() - endforeach() - - # For each executable found in the bundle, accumulate keys as we go. - # The list of keys should be complete when all prerequisites of all - # binaries in the bundle have been analyzed. - # - foreach(exe ${exes}) - # Main executable is scanned first above: - # - if(NOT "${exe}" STREQUAL "${executable}") - # Add the exe itself to the keys: - # - set_bundle_key_values(${keys_var} "${exe}" "${exe}" "${exepath}" "${dirs}" 0 "${main_rpaths}") - - # Get rpaths specified by executable: - # - get_item_key("${exe}" exe_key) - set(exe_rpaths "${main_rpaths}" "${${exe_key}_RPATHS}") - else() - set(exe_rpaths "${main_rpaths}") - endif() - - # Add each prerequisite to the keys: - # - set(prereqs "") - get_prerequisites("${exe}" prereqs 1 1 "${exepath}" "${dirs}" "${exe_rpaths}") - foreach(pr ${prereqs}) - set_bundle_key_values(${keys_var} "${exe}" "${pr}" "${exepath}" "${dirs}" 1 "${exe_rpaths}") - endforeach() - endforeach() - - # Propagate values to caller's scope: - # - set(${keys_var} ${${keys_var}} PARENT_SCOPE) - foreach(key ${${keys_var}}) - set(${key}_ITEM "${${key}_ITEM}" PARENT_SCOPE) - set(${key}_RESOLVED_ITEM "${${key}_RESOLVED_ITEM}" PARENT_SCOPE) - set(${key}_DEFAULT_EMBEDDED_PATH "${${key}_DEFAULT_EMBEDDED_PATH}" PARENT_SCOPE) - set(${key}_EMBEDDED_ITEM "${${key}_EMBEDDED_ITEM}" PARENT_SCOPE) - set(${key}_RESOLVED_EMBEDDED_ITEM "${${key}_RESOLVED_EMBEDDED_ITEM}" PARENT_SCOPE) - set(${key}_COPYFLAG "${${key}_COPYFLAG}" PARENT_SCOPE) - set(${key}_RPATHS "${${key}_RPATHS}" PARENT_SCOPE) - set(${key}_RDEP_RPATHS "${${key}_RDEP_RPATHS}" PARENT_SCOPE) - endforeach() - endif() -endfunction() - - -function(copy_resolved_item_into_bundle resolved_item resolved_embedded_item) - if(WIN32) - # ignore case on Windows - string(TOLOWER "${resolved_item}" resolved_item_compare) - string(TOLOWER "${resolved_embedded_item}" resolved_embedded_item_compare) - else() - set(resolved_item_compare "${resolved_item}") - set(resolved_embedded_item_compare "${resolved_embedded_item}") - endif() - - if("${resolved_item_compare}" STREQUAL "${resolved_embedded_item_compare}") - message(STATUS "warning: resolved_item == resolved_embedded_item - not copying...") - else() - #message(STATUS "copying COMMAND ${CMAKE_COMMAND} -E copy ${resolved_item} ${resolved_embedded_item}") - execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${resolved_item}" "${resolved_embedded_item}") - if(UNIX AND NOT APPLE) - file(RPATH_REMOVE FILE "${resolved_embedded_item}") - endif() - endif() - -endfunction() - - -function(copy_resolved_framework_into_bundle resolved_item resolved_embedded_item) - if(WIN32) - # ignore case on Windows - string(TOLOWER "${resolved_item}" resolved_item_compare) - string(TOLOWER "${resolved_embedded_item}" resolved_embedded_item_compare) - else() - set(resolved_item_compare "${resolved_item}") - set(resolved_embedded_item_compare "${resolved_embedded_item}") - endif() - - if("${resolved_item_compare}" STREQUAL "${resolved_embedded_item_compare}") - message(STATUS "warning: resolved_item == resolved_embedded_item - not copying...") - else() - if(BU_COPY_FULL_FRAMEWORK_CONTENTS) - # Full Framework (everything): - get_filename_component(resolved_dir "${resolved_item}" PATH) - get_filename_component(resolved_dir "${resolved_dir}/../.." ABSOLUTE) - get_filename_component(resolved_embedded_dir "${resolved_embedded_item}" PATH) - get_filename_component(resolved_embedded_dir "${resolved_embedded_dir}/../.." ABSOLUTE) - #message(STATUS "copying COMMAND ${CMAKE_COMMAND} -E copy_directory '${resolved_dir}' '${resolved_embedded_dir}'") - execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory "${resolved_dir}" "${resolved_embedded_dir}") - else() - # Framework lib itself: - #message(STATUS "copying COMMAND ${CMAKE_COMMAND} -E copy ${resolved_item} ${resolved_embedded_item}") - execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${resolved_item}" "${resolved_embedded_item}") - - # Plus Resources, if they exist: - string(REGEX REPLACE "^(.*)/[^/]+$" "\\1/Resources" resolved_resources "${resolved_item}") - string(REGEX REPLACE "^(.*)/[^/]+$" "\\1/Resources" resolved_embedded_resources "${resolved_embedded_item}") - if(EXISTS "${resolved_resources}") - #message(STATUS "copying COMMAND ${CMAKE_COMMAND} -E copy_directory '${resolved_resources}' '${resolved_embedded_resources}'") - execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory "${resolved_resources}" "${resolved_embedded_resources}") - endif() - - # Some frameworks e.g. Qt put Info.plist in wrong place, so when it is - # missing in resources, copy it from other well known incorrect locations: - if(NOT EXISTS "${resolved_resources}/Info.plist") - # Check for Contents/Info.plist in framework root (older Qt SDK): - string(REGEX REPLACE "^(.*)/[^/]+/[^/]+/[^/]+$" "\\1/Contents/Info.plist" resolved_info_plist "${resolved_item}") - string(REGEX REPLACE "^(.*)/[^/]+$" "\\1/Resources/Info.plist" resolved_embedded_info_plist "${resolved_embedded_item}") - if(EXISTS "${resolved_info_plist}") - #message(STATUS "copying COMMAND ${CMAKE_COMMAND} -E copy_directory '${resolved_info_plist}' '${resolved_embedded_info_plist}'") - execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${resolved_info_plist}" "${resolved_embedded_info_plist}") - endif() - endif() - - # Check if framework is versioned and fix it layout - string(REGEX REPLACE "^.*/([^/]+)/[^/]+$" "\\1" resolved_embedded_version "${resolved_embedded_item}") - string(REGEX REPLACE "^(.*)/[^/]+/[^/]+$" "\\1" resolved_embedded_versions "${resolved_embedded_item}") - string(REGEX REPLACE "^.*/([^/]+)/[^/]+/[^/]+$" "\\1" resolved_embedded_versions_basename "${resolved_embedded_item}") - if(resolved_embedded_versions_basename STREQUAL "Versions") - # Ensure Current symlink points to the framework version - if(NOT EXISTS "${resolved_embedded_versions}/Current") - execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${resolved_embedded_version}" "${resolved_embedded_versions}/Current") - endif() - # Restore symlinks in framework root pointing to current framework - # binary and resources: - string(REGEX REPLACE "^(.*)/[^/]+/[^/]+/[^/]+$" "\\1" resolved_embedded_root "${resolved_embedded_item}") - string(REGEX REPLACE "^.*/([^/]+)$" "\\1" resolved_embedded_item_basename "${resolved_embedded_item}") - if(NOT EXISTS "${resolved_embedded_root}/${resolved_embedded_item_basename}") - execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "Versions/Current/${resolved_embedded_item_basename}" "${resolved_embedded_root}/${resolved_embedded_item_basename}") - endif() - if(NOT EXISTS "${resolved_embedded_root}/Resources") - execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "Versions/Current/Resources" "${resolved_embedded_root}/Resources") - endif() - endif() - endif() - if(UNIX AND NOT APPLE) - file(RPATH_REMOVE FILE "${resolved_embedded_item}") - endif() - endif() - -endfunction() - - -function(fixup_bundle_item resolved_embedded_item exepath dirs) - # This item's key is "ikey": - # - get_item_key("${resolved_embedded_item}" ikey) - - # Ensure the item is "inside the .app bundle" -- it should not be fixed up if - # it is not in the .app bundle... Otherwise, we'll modify files in the build - # tree, or in other varied locations around the file system, with our call to - # install_name_tool. Make sure that doesn't happen here: - # - get_dotapp_dir("${exepath}" exe_dotapp_dir) - string(LENGTH "${exe_dotapp_dir}/" exe_dotapp_dir_length) - string(LENGTH "${resolved_embedded_item}" resolved_embedded_item_length) - set(path_too_short 0) - set(is_embedded 0) - if(${resolved_embedded_item_length} LESS ${exe_dotapp_dir_length}) - set(path_too_short 1) - endif() - if(NOT path_too_short) - string(SUBSTRING "${resolved_embedded_item}" 0 ${exe_dotapp_dir_length} item_substring) - if("${exe_dotapp_dir}/" STREQUAL "${item_substring}") - set(is_embedded 1) - endif() - endif() - if(NOT is_embedded) - message(" exe_dotapp_dir/='${exe_dotapp_dir}/'") - message(" item_substring='${item_substring}'") - message(" resolved_embedded_item='${resolved_embedded_item}'") - message("") - message("Install or copy the item into the bundle before calling fixup_bundle.") - message("Or maybe there's a typo or incorrect path in one of the args to fixup_bundle?") - message("") - message(FATAL_ERROR "cannot fixup an item that is not in the bundle...") - endif() - - set(rpaths "${${ikey}_RPATHS}" "${${ikey}_RDEP_RPATHS}") - - set(prereqs "") - get_prerequisites("${resolved_embedded_item}" prereqs 1 0 "${exepath}" "${dirs}" "${rpaths}") - - set(changes "") - - foreach(pr ${prereqs}) - # Each referenced item's key is "rkey" in the loop: - # - get_item_key("${pr}" rkey) - - if(NOT "${${rkey}_EMBEDDED_ITEM}" STREQUAL "") - set(changes ${changes} "-change" "${pr}" "${${rkey}_EMBEDDED_ITEM}") - else() - message("warning: unexpected reference to '${pr}'") - endif() - endforeach() - - if(BU_CHMOD_BUNDLE_ITEMS) - execute_process(COMMAND chmod u+w "${resolved_embedded_item}") - endif() - - # Only if install_name_tool supports -delete_rpath: - # - execute_process(COMMAND install_name_tool - OUTPUT_VARIABLE install_name_tool_usage - ERROR_VARIABLE install_name_tool_usage - ) - if(install_name_tool_usage MATCHES ".*-delete_rpath.*") - foreach(rpath ${${ikey}_RPATHS}) - set(changes ${changes} -delete_rpath "${rpath}") - endforeach() - endif() - - if(${ikey}_EMBEDDED_ITEM) - set(changes ${changes} -id "${${ikey}_EMBEDDED_ITEM}") - endif() - - # Change this item's id and all of its references in one call - # to install_name_tool: - # - if(changes) - set(cmd install_name_tool ${changes} "${resolved_embedded_item}") - execute_process(COMMAND ${cmd} RESULT_VARIABLE install_name_tool_result) - if(NOT install_name_tool_result EQUAL 0) - string(REPLACE ";" "' '" msg "'${cmd}'") - message(FATAL_ERROR "Command failed:\n ${msg}") - endif() - endif() -endfunction() - - -function(fixup_bundle app libs dirs) - message(STATUS "fixup_bundle") - message(STATUS " app='${app}'") - message(STATUS " libs='${libs}'") - message(STATUS " dirs='${dirs}'") - - get_bundle_and_executable("${app}" bundle executable valid) - if(valid) - get_filename_component(exepath "${executable}" PATH) - - message(STATUS "fixup_bundle: preparing...") - get_bundle_keys("${app}" "${libs}" "${dirs}" keys) - - message(STATUS "fixup_bundle: copying...") - list(LENGTH keys n) - math(EXPR n ${n}*2) - - set(i 0) - foreach(key ${keys}) - math(EXPR i ${i}+1) - if(${${key}_COPYFLAG}) - message(STATUS "${i}/${n}: copying '${${key}_RESOLVED_ITEM}'") - else() - message(STATUS "${i}/${n}: *NOT* copying '${${key}_RESOLVED_ITEM}'") - endif() - - set(show_status 0) - if(show_status) - message(STATUS "key='${key}'") - message(STATUS "item='${${key}_ITEM}'") - message(STATUS "resolved_item='${${key}_RESOLVED_ITEM}'") - message(STATUS "default_embedded_path='${${key}_DEFAULT_EMBEDDED_PATH}'") - message(STATUS "embedded_item='${${key}_EMBEDDED_ITEM}'") - message(STATUS "resolved_embedded_item='${${key}_RESOLVED_EMBEDDED_ITEM}'") - message(STATUS "copyflag='${${key}_COPYFLAG}'") - message(STATUS "") - endif() - - if(${${key}_COPYFLAG}) - set(item "${${key}_ITEM}") - if(item MATCHES "[^/]+\\.framework/") - copy_resolved_framework_into_bundle("${${key}_RESOLVED_ITEM}" - "${${key}_RESOLVED_EMBEDDED_ITEM}") - else() - copy_resolved_item_into_bundle("${${key}_RESOLVED_ITEM}" - "${${key}_RESOLVED_EMBEDDED_ITEM}") - endif() - endif() - endforeach() - - message(STATUS "fixup_bundle: fixing...") - foreach(key ${keys}) - math(EXPR i ${i}+1) - if(APPLE) - message(STATUS "${i}/${n}: fixing up '${${key}_RESOLVED_EMBEDDED_ITEM}'") - fixup_bundle_item("${${key}_RESOLVED_EMBEDDED_ITEM}" "${exepath}" "${dirs}") - else() - message(STATUS "${i}/${n}: fix-up not required on this platform '${${key}_RESOLVED_EMBEDDED_ITEM}'") - endif() - endforeach() - - message(STATUS "fixup_bundle: cleaning up...") - clear_bundle_keys(keys) - - message(STATUS "fixup_bundle: verifying...") - verify_app("${app}") - else() - message(SEND_ERROR "error: fixup_bundle: not a valid bundle") - endif() - - message(STATUS "fixup_bundle: done") -endfunction() - - -function(copy_and_fixup_bundle src dst libs dirs) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory "${src}" "${dst}") - fixup_bundle("${dst}" "${libs}" "${dirs}") -endfunction() - - -function(verify_bundle_prerequisites bundle result_var info_var) - set(result 1) - set(info "") - set(count 0) - - get_bundle_main_executable("${bundle}" main_bundle_exe) - - get_bundle_all_executables("${bundle}" file_list) - foreach(f ${file_list}) - get_filename_component(exepath "${f}" PATH) - math(EXPR count "${count} + 1") - - message(STATUS "executable file ${count}: ${f}") - - set(prereqs "") - get_prerequisites("${f}" prereqs 1 1 "${exepath}" "") - - # On the Mac, - # "embedded" and "system" prerequisites are fine... anything else means - # the bundle's prerequisites are not verified (i.e., the bundle is not - # really "standalone") - # - # On Windows (and others? Linux/Unix/...?) - # "local" and "system" prereqs are fine... - # - set(external_prereqs "") - - foreach(p ${prereqs}) - set(p_type "") - gp_file_type("${f}" "${p}" p_type) - - if(APPLE) - if(NOT "${p_type}" STREQUAL "embedded" AND NOT "${p_type}" STREQUAL "system") - set(external_prereqs ${external_prereqs} "${p}") - endif() - else() - if(NOT "${p_type}" STREQUAL "local" AND NOT "${p_type}" STREQUAL "system") - set(external_prereqs ${external_prereqs} "${p}") - endif() - endif() - endforeach() - - if(external_prereqs) - # Found non-system/somehow-unacceptable prerequisites: - set(result 0) - set(info ${info} "external prerequisites found:\nf='${f}'\nexternal_prereqs='${external_prereqs}'\n") - endif() - endforeach() - - if(result) - set(info "Verified ${count} executable files in '${bundle}'") - endif() - - set(${result_var} "${result}" PARENT_SCOPE) - set(${info_var} "${info}" PARENT_SCOPE) -endfunction() - - -function(verify_bundle_symlinks bundle result_var info_var) - set(result 1) - set(info "") - set(count 0) - - # TODO: implement this function for real... - # Right now, it is just a stub that verifies unconditionally... - - set(${result_var} "${result}" PARENT_SCOPE) - set(${info_var} "${info}" PARENT_SCOPE) -endfunction() - - -function(verify_app app) - set(verified 0) - set(info "") - - get_bundle_and_executable("${app}" bundle executable valid) - - message(STATUS "===========================================================================") - message(STATUS "Analyzing app='${app}'") - message(STATUS "bundle='${bundle}'") - message(STATUS "executable='${executable}'") - message(STATUS "valid='${valid}'") - - # Verify that the bundle does not have any "external" prerequisites: - # - verify_bundle_prerequisites("${bundle}" verified info) - message(STATUS "verified='${verified}'") - message(STATUS "info='${info}'") - message(STATUS "") - - if(verified) - # Verify that the bundle does not have any symlinks to external files: - # - verify_bundle_symlinks("${bundle}" verified info) - message(STATUS "verified='${verified}'") - message(STATUS "info='${info}'") - message(STATUS "") - endif() - - if(NOT verified) - message(FATAL_ERROR "error: verify_app failed") - endif() -endfunction() diff --git a/CMake/Modules/FindHamlib.cmake b/CMake/Modules/FindHamlib.cmake new file mode 100644 index 000000000..581b89491 --- /dev/null +++ b/CMake/Modules/FindHamlib.cmake @@ -0,0 +1,64 @@ +# +# Find the hamlib library +# +# This will define the following variables:: +# +# Hamlib_FOUND - True if the system has the usb library +# Hamlib_VERSION - The verion of the usb library which was found +# +# and the following imported targets:: +# +# Hamlib::Hamlib - The hamlib library +# + +include (LibFindMacros) + +libfind_pkg_detect (Hamlib hamlib + FIND_PATH hamlib/rig.h PATH_SUFFIXES hamlib + FIND_LIBRARY hamlib + ) + +libfind_package (Hamlib Usb) + +libfind_process (Hamlib) + +if (NOT Hamlib_PKGCONF_FOUND) + if (WIN32) + set (Hamlib_LIBRARIES ${Hamlib_LIBRARIES};${Usb_LIBRARY};ws2_32) + else () + set (Hamlib_LIBRARIES ${Hamlib_LIBRARIES};m;dl) + endif () +elseif (UNIX AND NOT APPLE) + set (Hamlib_LIBRARIES ${Hamlib_PKGCONF_STATIC_LDFLAGS}) +endif () + +# fix up extra link libraries for macOS as target_link_libraries gets +# it wrong for frameworks +unset (_next_is_framework) +unset (_Hamlib_EXTRA_LIBS) +foreach (_lib IN LISTS Hamlib_LIBRARIES Hamlib_PKGCONF_LDFLAGS) + if (_next_is_framework) + list (APPEND _Hamlib_EXTRA_LIBS "-framework ${_lib}") + unset (_next_is_framework) + elseif (${_lib} STREQUAL "-framework") + set (_next_is_framework TRUE) + else () + list (APPEND _Hamlib_EXTRA_LIBS ${_lib}) + endif () +endforeach () + +if (Hamlib_FOUND AND NOT TARGET Hamlib::Hamlib) + add_library (Hamlib::Hamlib UNKNOWN IMPORTED) + set_target_properties (Hamlib::Hamlib PROPERTIES + IMPORTED_LOCATION "${Hamlib_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${Hamlib_PKGCONF_STATIC_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${Hamlib_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${_Hamlib_EXTRA_LIBS}" + ) +endif () + +mark_as_advanced ( + Hamlib_INCLUDE_DIR + Hamlib_LIBRARY + Hamlib_LIBRARIES + ) diff --git a/CMake/Modules/FindPortaudio.cmake b/CMake/Modules/FindPortaudio.cmake new file mode 100644 index 000000000..4a38cc445 --- /dev/null +++ b/CMake/Modules/FindPortaudio.cmake @@ -0,0 +1,50 @@ +# - Try to find portaudio +# +# Once done, this will define: +# +# Portaudio_FOUND - system has portaudio +# Portaudio_VERSION - The version of the portaudio library which was found +# +# and the following imported targets:: +# +# Portaudio::Portaudio - The portaudio library +# + +include (LibFindMacros) + +libfind_pkg_detect (Portaudio portaudio-2.0 + FIND_PATH portaudio.h + FIND_LIBRARY portaudio + ) + +libfind_process (Portaudio) + +# fix up extra link libraries for macOS as target_link_libraries gets +# it wrong for frameworks +unset (_next_is_framework) +unset (_Portaudio_EXTRA_LIBS) +foreach (_lib IN LISTS Portaudio_PKGCONF_LDFLAGS) + if (_next_is_framework) + list (APPEND _Portaudio_EXTRA_LIBS "-framework ${_lib}") + unset (_next_is_framework) + elseif (${_lib} STREQUAL "-framework") + set (_next_is_framework TRUE) + else () + list (APPEND _Portaudio_EXTRA_LIBS ${_lib}) + endif () +endforeach () + +if (Portaudio_FOUND AND NOT TARGET Portaudio::Portaudio) + add_library (Portaudio::Portaudio UNKNOWN IMPORTED) + set_target_properties (Portaudio::Portaudio PROPERTIES + IMPORTED_LOCATION "${Portaudio_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${Portaudio_PKGCONF_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${Portaudio_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${_Portaudio_EXTRA_LIBS}" + ) +endif () + +mark_as_advanced ( + Portaudio_INCLUDE_DIR + Portaudio_LIBRARY + ) diff --git a/CMake/Modules/FindUsb.cmake b/CMake/Modules/FindUsb.cmake new file mode 100644 index 000000000..9e76f2448 --- /dev/null +++ b/CMake/Modules/FindUsb.cmake @@ -0,0 +1,49 @@ +# Findlibusb +# ========== +# +# Find the usb library +# +# This will define the following variables:: +# +# Usb_FOUND - True if the system has the usb library +# Usb_VERSION - The verion of the usb library which was found +# +# and the following imported targets:: +# +# Usb::Usb - The libusb library +# + +include (LibFindMacros) + +if (WIN32) + # Use path suffixes on MS Windows as we probably shouldn't + # trust the PATH envvar. PATH will still be searched to find the + # library as last resort. + if (CMAKE_SIZEOF_VOID_P MATCHES "8") + set (_library_options PATH_SUFFIXES MinGW64/dll MinGW64/static) + else () + set (_library_options PATH_SUFFIXES MinGW32/dll MinGW32/static) + endif () +endif () +libfind_pkg_detect (Usb usb-1.0 + FIND_PATH libusb.h PATH_SUFFIXES libusb-1.0 + FIND_LIBRARY usb-1.0 ${_library_options} + ) + +libfind_process (Usb) + +if (Usb_FOUND AND NOT TARGET Usb::Usb) + add_library (Usb::Usb UNKNOWN IMPORTED) + set_target_properties (Usb::Usb PROPERTIES + IMPORTED_LOCATION "${Usb_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${Usb_PKGCONF_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${Usb_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${Usb_LIBRARIES}" + ) +endif () + +mark_as_advanced ( + Usb_INCLUDE_DIR + Usb_LIBRARY + Usb_LIBRARIES + ) diff --git a/CMake/Modules/Findhamlib.cmake b/CMake/Modules/Findhamlib.cmake deleted file mode 100644 index 234083ae1..000000000 --- a/CMake/Modules/Findhamlib.cmake +++ /dev/null @@ -1,88 +0,0 @@ -# - Try to find hamlib -# -# Once done, this will define: -# -# hamlib_FOUND - system has Hamlib -# hamlib_INCLUDE_DIRS - the Hamlib include directories -# hamlib_LIBRARIES - link these to use Hamlib -# hamlib_LIBRARY_DIRS - required shared/dynamic libraries are here -# -# If hamlib_STATIC is TRUE then static linking will be assumed -# - -include (LibFindMacros) - -set (hamlib_LIBRARY_DIRS) - -# pkg-config? -find_path (__hamlib_pc_path NAMES hamlib.pc - PATH_SUFFIXES lib/pkgconfig lib64/pkgconfig - ) -if (__hamlib_pc_path) - set (__pc_path $ENV{PKG_CONFIG_PATH}) - list (APPEND __pc_path "${__hamlib_pc_path}") - set (ENV{PKG_CONFIG_PATH} "${__pc_path}") - unset (__pc_path CACHE) -endif () -unset (__hamlib_pc_path CACHE) - -# Use pkg-config to get hints about paths, libs and, flags -unset (__pkg_config_checked_hamlib CACHE) -# pkg_config will fail on Windows if the Hamlib USB backends are -# configured since libusb-1.0 does not ship with a pkg_config file on -# Windows, that's OK because we fix it up below -libfind_pkg_check_modules (PC_HAMLIB hamlib) - -if (NOT PC_HAMLIB_FOUND) - # The headers - find_path (hamlib_INCLUDEDIR hamlib/rig.h) - # The libraries - if (hamlib_STATIC) - libfind_library (hamlib libhamlib.a) - else () - libfind_library (hamlib hamlib) - endif () - if (WIN32) - set (hamlib_EXTRA_LIBRARIES ws2_32) - else () - set (hamlib_EXTRA_LIBRARIES m dl) - endif () - - # libusb-1.0 has no pkg-config file on Windows so we have to find it - # ourselves - if (CMAKE_SIZEOF_VOID_P MATCHES "8") - find_library (LIBUSB NAMES usb-1.0 PATH_SUFFIXES MinGW64/dll) - else () - find_library (LIBUSB NAMES usb-1.0 PATH_SUFFIXES MinGW32/dll) - endif () - if (LIBUSB) - set (hamlib_EXTRA_LIBRARIES ${LIBUSB} ${hamlib_EXTRA_LIBRARIES}) - get_filename_component (hamlib_libusb_path ${LIBUSB} PATH) - set (hamlib_LIBRARY_DIRS ${hamlib_LIBRARY_DIRS} ${hamlib_libusb_path}) - endif (LIBUSB) - set (hamlib_PROCESS_INCLUDES hamlib_INCLUDEDIR) - set (hamlib_PROCESS_LIBS hamlib_LIBRARY hamlib_EXTRA_LIBRARIES) -else () - if (hamlib_STATIC) - set (hamlib_PROCESS_INCLUDES PC_HAMLIB_STATIC_INCLUDE_DIRS) - set (hamlib_PROCESS_LIBS PC_HAMLIB_STATIC_LDFLAGS) - set (hamlib_LIBRARY_DIRS ${PC_HAMLIB_STATIC_LIBRARY_DIRS}) - else () - set (hamlib_PROCESS_INCLUDES PC_HAMLIB_INCLUDE_DIRS) - set (hamlib_PROCESS_LIBS PC_HAMLIB_LDFLAGS) - set (hamlib_LIBRARY_DIRS ${PC_HAMLIB_LIBRARY_DIRS}) - endif () -endif () -libfind_process (hamlib) - -if (WIN32) - find_path (hamlib_dll_path libhamlib-2.dll) - if (hamlib_dll_path) - set (hamlib_LIBRARY_DIRS ${hamlib_LIBRARY_DIRS} ${hamlib_dll_path}) - endif () -endif () - -# Handle the QUIETLY and REQUIRED arguments and set HAMLIB_FOUND to -# TRUE if all listed variables are TRUE -include (FindPackageHandleStandardArgs) -find_package_handle_standard_args (hamlib DEFAULT_MSG hamlib_INCLUDE_DIRS hamlib_LIBRARIES hamlib_LIBRARY_DIRS) diff --git a/CMake/Modules/GetPrerequisites.cmake b/CMake/Modules/GetPrerequisites.cmake deleted file mode 100644 index e4018b670..000000000 --- a/CMake/Modules/GetPrerequisites.cmake +++ /dev/null @@ -1,998 +0,0 @@ -#.rst: -# GetPrerequisites -# ---------------- -# -# Functions to analyze and list executable file prerequisites. -# -# This module provides functions to list the .dll, .dylib or .so files -# that an executable or shared library file depends on. (Its -# prerequisites.) -# -# It uses various tools to obtain the list of required shared library -# files: -# -# :: -# -# dumpbin (Windows) -# objdump (MinGW on Windows) -# ldd (Linux/Unix) -# otool (Mac OSX) -# -# The following functions are provided by this module: -# -# :: -# -# get_prerequisites -# list_prerequisites -# list_prerequisites_by_glob -# gp_append_unique -# is_file_executable -# gp_item_default_embedded_path -# (projects can override with gp_item_default_embedded_path_override) -# gp_resolve_item -# (projects can override with gp_resolve_item_override) -# gp_resolved_file_type -# (projects can override with gp_resolved_file_type_override) -# gp_file_type -# -# Requires CMake 2.6 or greater because it uses function, break, return -# and PARENT_SCOPE. -# -# :: -# -# GET_PREREQUISITES( -# []) -# -# Get the list of shared library files required by . The list -# in the variable named should be empty on first -# entry to this function. On exit, will contain the -# list of required shared library files. -# -# is the full path to an executable file. -# is the name of a CMake variable to contain the results. -# must be 0 or 1 indicating whether to include or -# exclude "system" prerequisites. If is set to 1 all -# prerequisites will be found recursively, if set to 0 only direct -# prerequisites are listed. is the path to the top level -# executable used for @executable_path replacment on the Mac. is -# a list of paths where libraries might be found: these paths are -# searched first when a target without any path info is given. Then -# standard system locations are also searched: PATH, Framework -# locations, /usr/lib... -# -# :: -# -# LIST_PREREQUISITES( [ [ []]]) -# -# Print a message listing the prerequisites of . -# -# is the name of a shared library or executable target or the -# full path to a shared library or executable file. If is set -# to 1 all prerequisites will be found recursively, if set to 0 only -# direct prerequisites are listed. must be 0 or 1 -# indicating whether to include or exclude "system" prerequisites. With -# set to 0 only the full path names of the prerequisites are -# printed, set to 1 extra informatin will be displayed. -# -# :: -# -# LIST_PREREQUISITES_BY_GLOB( ) -# -# Print the prerequisites of shared library and executable files -# matching a globbing pattern. is GLOB or GLOB_RECURSE and -# is a globbing expression used with "file(GLOB" or -# "file(GLOB_RECURSE" to retrieve a list of matching files. If a -# matching file is executable, its prerequisites are listed. -# -# Any additional (optional) arguments provided are passed along as the -# optional arguments to the list_prerequisites calls. -# -# :: -# -# GP_APPEND_UNIQUE( ) -# -# Append to the list variable only if the value is -# not already in the list. -# -# :: -# -# IS_FILE_EXECUTABLE( ) -# -# Return 1 in if is a binary executable, 0 -# otherwise. -# -# :: -# -# GP_ITEM_DEFAULT_EMBEDDED_PATH( ) -# -# Return the path that others should refer to the item by when the item -# is embedded inside a bundle. -# -# Override on a per-project basis by providing a project-specific -# gp_item_default_embedded_path_override function. -# -# :: -# -# GP_RESOLVE_ITEM( -# []) -# -# Resolve an item into an existing full path file. -# -# Override on a per-project basis by providing a project-specific -# gp_resolve_item_override function. -# -# :: -# -# GP_RESOLVED_FILE_TYPE( -# []) -# -# Return the type of with respect to . String -# describing type of prerequisite is returned in variable named -# . -# -# Use and if necessary to resolve non-absolute -# values -- but only for non-embedded items. -# -# Possible types are: -# -# :: -# -# system -# local -# embedded -# other -# -# Override on a per-project basis by providing a project-specific -# gp_resolved_file_type_override function. -# -# :: -# -# GP_FILE_TYPE( ) -# -# Return the type of with respect to . String -# describing type of prerequisite is returned in variable named -# . -# -# Possible types are: -# -# :: -# -# system -# local -# embedded -# other - -#============================================================================= -# Copyright 2008-2009 Kitware, Inc. -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - -function(gp_append_unique list_var value) - set(contains 0) - - foreach(item ${${list_var}}) - if(item STREQUAL "${value}") - set(contains 1) - break() - endif() - endforeach() - - if(NOT contains) - set(${list_var} ${${list_var}} "${value}" PARENT_SCOPE) - endif() -endfunction() - - -function(is_file_executable file result_var) - # - # A file is not executable until proven otherwise: - # - set(${result_var} 0 PARENT_SCOPE) - - get_filename_component(file_full "${file}" ABSOLUTE) - string(TOLOWER "${file_full}" file_full_lower) - - # If file name ends in .exe on Windows, *assume* executable: - # - if(WIN32 AND NOT UNIX) - if("${file_full_lower}" MATCHES "\\.exe$") - set(${result_var} 1 PARENT_SCOPE) - return() - endif() - - # A clause could be added here that uses output or return value of dumpbin - # to determine ${result_var}. In 99%+? practical cases, the exe name - # match will be sufficient... - # - endif() - - # Use the information returned from the Unix shell command "file" to - # determine if ${file_full} should be considered an executable file... - # - # If the file command's output contains "executable" and does *not* contain - # "text" then it is likely an executable suitable for prerequisite analysis - # via the get_prerequisites macro. - # - if(UNIX) - if(NOT file_cmd) - find_program(file_cmd "file") - mark_as_advanced(file_cmd) - endif() - - if(file_cmd) - execute_process(COMMAND "${file_cmd}" "${file_full}" - RESULT_VARIABLE file_rv - OUTPUT_VARIABLE file_ov - ERROR_VARIABLE file_ev - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if(NOT file_rv STREQUAL "0") - message(FATAL_ERROR "${file_cmd} failed: ${file_rv}\n${file_ev}") - endif() - - # Replace the name of the file in the output with a placeholder token - # (the string " _file_full_ ") so that just in case the path name of - # the file contains the word "text" or "executable" we are not fooled - # into thinking "the wrong thing" because the file name matches the - # other 'file' command output we are looking for... - # - string(REPLACE "${file_full}" " _file_full_ " file_ov "${file_ov}") - string(TOLOWER "${file_ov}" file_ov) - - #message(STATUS "file_ov='${file_ov}'") - if("${file_ov}" MATCHES "executable") - #message(STATUS "executable!") - if("${file_ov}" MATCHES "text") - #message(STATUS "but text, so *not* a binary executable!") - else() - set(${result_var} 1 PARENT_SCOPE) - return() - endif() - endif() - - # Also detect position independent executables on Linux, - # where "file" gives "shared object ... (uses shared libraries)" - if("${file_ov}" MATCHES "shared object.*\(uses shared libs\)") - set(${result_var} 1 PARENT_SCOPE) - return() - endif() - - # "file" version 5.22 does not print "(used shared libraries)" - # but uses "interpreter" - if("${file_ov}" MATCHES "shared object.*interpreter") - set(${result_var} 1 PARENT_SCOPE) - return() - endif() - - else() - message(STATUS "warning: No 'file' command, skipping execute_process...") - endif() - endif() -endfunction() - - -function(gp_item_default_embedded_path item default_embedded_path_var) - - # On Windows and Linux, "embed" prerequisites in the same directory - # as the executable by default: - # - set(path "@executable_path") - set(overridden 0) - - # On the Mac, relative to the executable depending on the type - # of the thing we are embedding: - # - if(APPLE) - # - # The assumption here is that all executables in the bundle will be - # in same-level-directories inside the bundle. The parent directory - # of an executable inside the bundle should be MacOS or a sibling of - # MacOS and all embedded paths returned from here will begin with - # "@executable_path/../" and will work from all executables in all - # such same-level-directories inside the bundle. - # - - # By default, embed things right next to the main bundle executable: - # - set(path "@executable_path/../../Contents/MacOS") - - # Embed .dylibs right next to the main bundle executable: - # - if(item MATCHES "\\.dylib$") - set(path "@executable_path/../MacOS") - set(overridden 1) - endif() - - # Embed frameworks in the embedded "Frameworks" directory (sibling of MacOS): - # - if(NOT overridden) - if(item MATCHES "[^/]+\\.framework/") - set(path "@executable_path/../Frameworks") - set(overridden 1) - endif() - endif() - endif() - - # Provide a hook so that projects can override the default embedded location - # of any given library by whatever logic they choose: - # - if(COMMAND gp_item_default_embedded_path_override) - gp_item_default_embedded_path_override("${item}" path) - endif() - - set(${default_embedded_path_var} "${path}" PARENT_SCOPE) -endfunction() - - -function(gp_resolve_item context item exepath dirs resolved_item_var) - set(resolved 0) - set(resolved_item "${item}") - if(ARGC GREATER 5) - set(rpaths "${ARGV5}") - else() - set(rpaths "") - endif() - - # Is it already resolved? - # - if(IS_ABSOLUTE "${resolved_item}" AND EXISTS "${resolved_item}") - set(resolved 1) - endif() - - if(NOT resolved) - if(item MATCHES "^@executable_path") - # - # @executable_path references are assumed relative to exepath - # - string(REPLACE "@executable_path" "${exepath}" ri "${item}") - get_filename_component(ri "${ri}" ABSOLUTE) - - if(EXISTS "${ri}") - #message(STATUS "info: embedded item exists (${ri})") - set(resolved 1) - set(resolved_item "${ri}") - else() - message(STATUS "warning: embedded item does not exist '${ri}'") - endif() - endif() - endif() - - if(NOT resolved) - if(item MATCHES "^@loader_path") - # - # @loader_path references are assumed relative to the - # PATH of the given "context" (presumably another library) - # - get_filename_component(contextpath "${context}" PATH) - string(REPLACE "@loader_path" "${contextpath}" ri "${item}") - get_filename_component(ri "${ri}" ABSOLUTE) - - if(EXISTS "${ri}") - #message(STATUS "info: embedded item exists (${ri})") - set(resolved 1) - set(resolved_item "${ri}") - else() - message(STATUS "warning: embedded item does not exist '${ri}'") - endif() - endif() - endif() - - if(NOT resolved) - if(item MATCHES "^@rpath") - # - # @rpath references are relative to the paths built into the binaries with -rpath - # We handle this case like we do for other Unixes - # - string(REPLACE "@rpath/" "" norpath_item "${item}") - - set(ri "ri-NOTFOUND") - find_file(ri "${norpath_item}" ${exepath} ${dirs} ${rpaths} NO_DEFAULT_PATH) - if(ri) - #message(STATUS "info: 'find_file' in exepath/dirs/rpaths (${ri})") - set(resolved 1) - set(resolved_item "${ri}") - set(ri "ri-NOTFOUND") - endif() - - endif() - endif() - - if(NOT resolved) - set(ri "ri-NOTFOUND") - find_file(ri "${item}" ${exepath} ${dirs} NO_DEFAULT_PATH) - find_file(ri "${item}" ${exepath} ${dirs} /usr/lib) - if(ri) - #message(STATUS "info: 'find_file' in exepath/dirs (${ri})") - set(resolved 1) - set(resolved_item "${ri}") - set(ri "ri-NOTFOUND") - endif() - endif() - - if(NOT resolved) - if(item MATCHES "[^/]+\\.framework/") - set(fw "fw-NOTFOUND") - find_file(fw "${item}" - "~/Library/Frameworks" - "/Library/Frameworks" - "/System/Library/Frameworks" - ) - if(fw) - #message(STATUS "info: 'find_file' found framework (${fw})") - set(resolved 1) - set(resolved_item "${fw}") - set(fw "fw-NOTFOUND") - endif() - endif() - endif() - - # Using find_program on Windows will find dll files that are in the PATH. - # (Converting simple file names into full path names if found.) - # - if(WIN32 AND NOT UNIX) - if(NOT resolved) - set(ri "ri-NOTFOUND") - find_program(ri "${item}" PATHS "${exepath};${dirs}" NO_DEFAULT_PATH) - find_program(ri "${item}" PATHS "${exepath};${dirs}") - if(ri) - #message(STATUS "info: 'find_program' in exepath/dirs (${ri})") - set(resolved 1) - set(resolved_item "${ri}") - set(ri "ri-NOTFOUND") - endif() - endif() - endif() - - # Provide a hook so that projects can override item resolution - # by whatever logic they choose: - # - if(COMMAND gp_resolve_item_override) - gp_resolve_item_override("${context}" "${item}" "${exepath}" "${dirs}" resolved_item resolved) - endif() - - if(NOT resolved) - message(STATUS " -warning: cannot resolve item '${item}' - - possible problems: - need more directories? - need to use InstallRequiredSystemLibraries? - run in install tree instead of build tree? -") -# message(STATUS " -#****************************************************************************** -#warning: cannot resolve item '${item}' -# -# possible problems: -# need more directories? -# need to use InstallRequiredSystemLibraries? -# run in install tree instead of build tree? -# -# context='${context}' -# item='${item}' -# exepath='${exepath}' -# dirs='${dirs}' -# resolved_item_var='${resolved_item_var}' -#****************************************************************************** -#") - endif() - - set(${resolved_item_var} "${resolved_item}" PARENT_SCOPE) -endfunction() - - -function(gp_resolved_file_type original_file file exepath dirs type_var) - if(ARGC GREATER 5) - set(rpaths "${ARGV5}") - else() - set(rpaths "") - endif() - #message(STATUS "**") - - if(NOT IS_ABSOLUTE "${original_file}") - message(STATUS "warning: gp_resolved_file_type expects absolute full path for first arg original_file") - endif() - - set(is_embedded 0) - set(is_local 0) - set(is_system 0) - - set(resolved_file "${file}") - - if("${file}" MATCHES "^@(executable|loader)_path") - set(is_embedded 1) - endif() - - if(NOT is_embedded) - if(NOT IS_ABSOLUTE "${file}") - gp_resolve_item("${original_file}" "${file}" "${exepath}" "${dirs}" resolved_file "${rpaths}") - endif() - - string(TOLOWER "${original_file}" original_lower) - string(TOLOWER "${resolved_file}" lower) - - if(UNIX) - if(resolved_file MATCHES "^(/lib/|/lib32/|/lib64/|/usr/lib/|/usr/lib32/|/usr/lib64/|/usr/X11R6/|/usr/bin/)") - set(is_system 1) - endif() - endif() - - if(APPLE) - if(resolved_file MATCHES "^(/System/Library/|/usr/lib/)") - set(is_system 1) - endif() - endif() - - if(WIN32) - string(TOLOWER "$ENV{SystemRoot}" sysroot) - file(TO_CMAKE_PATH "${sysroot}" sysroot) - - string(TOLOWER "$ENV{windir}" windir) - file(TO_CMAKE_PATH "${windir}" windir) - - if(lower MATCHES "^(${sysroot}/sys(tem|wow)|${windir}/sys(tem|wow)|(.*/)*msvc[^/]+dll)") - set(is_system 1) - endif() - - if(UNIX) - # if cygwin, we can get the properly formed windows paths from cygpath - find_program(CYGPATH_EXECUTABLE cygpath) - - if(CYGPATH_EXECUTABLE) - execute_process(COMMAND ${CYGPATH_EXECUTABLE} -W - RESULT_VARIABLE env_rv - OUTPUT_VARIABLE env_windir - ERROR_VARIABLE env_ev - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(NOT env_rv STREQUAL "0") - message(FATAL_ERROR "${CYGPATH_EXECUTABLE} -W failed: ${env_rv}\n${env_ev}") - endif() - execute_process(COMMAND ${CYGPATH_EXECUTABLE} -S - RESULT_VARIABLE env_rv - OUTPUT_VARIABLE env_sysdir - ERROR_VARIABLE env_ev - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(NOT env_rv STREQUAL "0") - message(FATAL_ERROR "${CYGPATH_EXECUTABLE} -S failed: ${env_rv}\n${env_ev}") - endif() - string(TOLOWER "${env_windir}" windir) - string(TOLOWER "${env_sysdir}" sysroot) - - if(lower MATCHES "^(${sysroot}/sys(tem|wow)|${windir}/sys(tem|wow)|(.*/)*msvc[^/]+dll)") - set(is_system 1) - endif() - endif() - endif() - endif() - - if(NOT is_system) - get_filename_component(original_path "${original_lower}" PATH) - get_filename_component(path "${lower}" PATH) - if(original_path STREQUAL path) - set(is_local 1) - else() - string(LENGTH "${original_path}/" original_length) - string(LENGTH "${lower}" path_length) - if(${path_length} GREATER ${original_length}) - string(SUBSTRING "${lower}" 0 ${original_length} path) - if("${original_path}/" STREQUAL path) - set(is_embedded 1) - endif() - endif() - endif() - endif() - endif() - - # Return type string based on computed booleans: - # - set(type "other") - - if(is_system) - set(type "system") - elseif(is_embedded) - set(type "embedded") - elseif(is_local) - set(type "local") - endif() - - #message(STATUS "gp_resolved_file_type: '${file}' '${resolved_file}'") - #message(STATUS " type: '${type}'") - - if(NOT is_embedded) - if(NOT IS_ABSOLUTE "${resolved_file}") - if(lower MATCHES "^msvc[^/]+dll" AND is_system) - message(STATUS "info: non-absolute msvc file '${file}' returning type '${type}'") - else() - message(STATUS "warning: gp_resolved_file_type non-absolute file '${file}' returning type '${type}' -- possibly incorrect") - endif() - endif() - endif() - - # Provide a hook so that projects can override the decision on whether a - # library belongs to the system or not by whatever logic they choose: - # - if(COMMAND gp_resolved_file_type_override) - gp_resolved_file_type_override("${resolved_file}" type) - endif() - - set(${type_var} "${type}" PARENT_SCOPE) - - #message(STATUS "**") -endfunction() - - -function(gp_file_type original_file file type_var) - if(NOT IS_ABSOLUTE "${original_file}") - message(STATUS "warning: gp_file_type expects absolute full path for first arg original_file") - endif() - - get_filename_component(exepath "${original_file}" PATH) - - set(type "") - gp_resolved_file_type("${original_file}" "${file}" "${exepath}" "" type) - - set(${type_var} "${type}" PARENT_SCOPE) -endfunction() - - -function(get_prerequisites target prerequisites_var exclude_system recurse exepath dirs) - set(verbose 0) - set(eol_char "E") - if(ARGC GREATER 6) - set(rpaths "${ARGV6}") - else() - set(rpaths "") - endif() - - if(NOT IS_ABSOLUTE "${target}") - message("warning: target '${target}' is not absolute...") - endif() - - if(NOT EXISTS "${target}") - message("warning: target '${target}' does not exist...") - endif() - - set(gp_cmd_paths ${gp_cmd_paths} - "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin" - "C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin" - "C:/Program Files/Microsoft Visual Studio 8/VC/BIN" - "C:/Program Files (x86)/Microsoft Visual Studio 8/VC/BIN" - "C:/Program Files/Microsoft Visual Studio .NET 2003/VC7/BIN" - "C:/Program Files (x86)/Microsoft Visual Studio .NET 2003/VC7/BIN" - "/usr/local/bin" - "/usr/bin" - ) - - # - # - # Try to choose the right tool by default. Caller can set gp_tool prior to - # calling this function to force using a different tool. - # - if(NOT gp_tool) - set(gp_tool "ldd") - - if(APPLE) - set(gp_tool "otool") - endif() - - if(WIN32 AND NOT UNIX) # This is how to check for cygwin, har! - find_program(gp_dumpbin "dumpbin" PATHS ${gp_cmd_paths}) - if(gp_dumpbin) - set(gp_tool "dumpbin") - else() # Try harder. Maybe we're on MinGW - set(gp_tool "objdump") - endif() - endif() - endif() - - find_program(gp_cmd ${gp_tool} PATHS ${gp_cmd_paths}) - - if(NOT gp_cmd) - message(STATUS "warning: could not find '${gp_tool}' - cannot analyze prerequisites...") - return() - endif() - - set(gp_cmd_maybe_filter) # optional command to pre-filter gp_tool results - - if(gp_tool STREQUAL "ldd") - set(gp_cmd_args "") - set(gp_regex "^[\t ]*[^\t ]+ => ([^\t\(]+) .*${eol_char}$") - set(gp_regex_error "not found${eol_char}$") - set(gp_regex_fallback "^[\t ]*([^\t ]+) => ([^\t ]+).*${eol_char}$") - set(gp_regex_cmp_count 1) - elseif(gp_tool STREQUAL "otool") - set(gp_cmd_args "-L") - set(gp_regex "^\t([^\t]+) \\(compatibility version ([0-9]+.[0-9]+.[0-9]+), current version ([0-9]+.[0-9]+.[0-9]+)\\)${eol_char}$") - set(gp_regex_error "") - set(gp_regex_fallback "") - set(gp_regex_cmp_count 3) - elseif(gp_tool STREQUAL "dumpbin") - set(gp_cmd_args "/dependents") - set(gp_regex "^ ([^ ].*[Dd][Ll][Ll])${eol_char}$") - set(gp_regex_error "") - set(gp_regex_fallback "") - set(gp_regex_cmp_count 1) - elseif(gp_tool STREQUAL "objdump") - set(gp_cmd_args "-p") - set(gp_regex "^\t*DLL Name: (.*\\.[Dd][Ll][Ll])${eol_char}$") - set(gp_regex_error "") - set(gp_regex_fallback "") - set(gp_regex_cmp_count 1) - # objdump generaates copious output so we create a grep filter to pre-filter results - find_program(gp_grep_cmd grep) - if(gp_grep_cmd) - set(gp_cmd_maybe_filter COMMAND ${gp_grep_cmd} "^[[:blank:]]*DLL Name: ") - endif() - else() - message(STATUS "warning: gp_tool='${gp_tool}' is an unknown tool...") - message(STATUS "CMake function get_prerequisites needs more code to handle '${gp_tool}'") - message(STATUS "Valid gp_tool values are dumpbin, ldd, objdump and otool.") - return() - endif() - - - if(gp_tool STREQUAL "dumpbin") - # When running dumpbin, it also needs the "Common7/IDE" directory in the - # PATH. It will already be in the PATH if being run from a Visual Studio - # command prompt. Add it to the PATH here in case we are running from a - # different command prompt. - # - get_filename_component(gp_cmd_dir "${gp_cmd}" PATH) - get_filename_component(gp_cmd_dlls_dir "${gp_cmd_dir}/../../Common7/IDE" ABSOLUTE) - # Use cmake paths as a user may have a PATH element ending with a backslash. - # This will escape the list delimiter and create havoc! - if(EXISTS "${gp_cmd_dlls_dir}") - # only add to the path if it is not already in the path - set(gp_found_cmd_dlls_dir 0) - file(TO_CMAKE_PATH "$ENV{PATH}" env_path) - foreach(gp_env_path_element ${env_path}) - if(gp_env_path_element STREQUAL gp_cmd_dlls_dir) - set(gp_found_cmd_dlls_dir 1) - endif() - endforeach() - - if(NOT gp_found_cmd_dlls_dir) - file(TO_NATIVE_PATH "${gp_cmd_dlls_dir}" gp_cmd_dlls_dir) - set(ENV{PATH} "$ENV{PATH};${gp_cmd_dlls_dir}") - endif() - endif() - endif() - # - # - - if(gp_tool STREQUAL "ldd") - set(old_ld_env "$ENV{LD_LIBRARY_PATH}") - set(new_ld_env "${exepath}") - foreach(dir ${dirs}) - set(new_ld_env "${new_ld_env}:${dir}") - endforeach() - set(ENV{LD_LIBRARY_PATH} "${new_ld_env}:$ENV{LD_LIBRARY_PATH}") - endif() - - - # Track new prerequisites at each new level of recursion. Start with an - # empty list at each level: - # - set(unseen_prereqs) - - # Run gp_cmd on the target: - # - execute_process( - COMMAND ${gp_cmd} ${gp_cmd_args} ${target} - ${gp_cmd_maybe_filter} - RESULT_VARIABLE gp_rv - OUTPUT_VARIABLE gp_cmd_ov - ERROR_VARIABLE gp_ev - ) - if(NOT gp_rv STREQUAL "0") - if(gp_tool STREQUAL "dumpbin") - # dumpbin error messages seem to go to stdout - message(FATAL_ERROR "${gp_cmd} failed: ${gp_rv}\n${gp_ev}\n${gp_cmd_ov}") - else() - message(FATAL_ERROR "${gp_cmd} failed: ${gp_rv}\n${gp_ev}") - endif() - endif() - - if(gp_tool STREQUAL "ldd") - set(ENV{LD_LIBRARY_PATH} "${old_ld_env}") - endif() - - if(verbose) - message(STATUS "") - message(STATUS "gp_cmd_ov='${gp_cmd_ov}'") - message(STATUS "") - endif() - - get_filename_component(target_dir "${target}" PATH) - - # Convert to a list of lines: - # - string(REPLACE ";" "\\;" candidates "${gp_cmd_ov}") - string(REPLACE "\n" "${eol_char};" candidates "${candidates}") - - # check for install id and remove it from list, since otool -L can include a - # reference to itself - set(gp_install_id) - if(gp_tool STREQUAL "otool") - execute_process( - COMMAND otool -D ${target} - RESULT_VARIABLE otool_rv - OUTPUT_VARIABLE gp_install_id_ov - ERROR_VARIABLE otool_ev - ) - if(NOT otool_rv STREQUAL "0") - message(FATAL_ERROR "otool -D failed: ${otool_rv}\n${otool_ev}") - endif() - # second line is install name - string(REGEX REPLACE ".*:\n" "" gp_install_id "${gp_install_id_ov}") - if(gp_install_id) - # trim - string(REGEX MATCH "[^\n ].*[^\n ]" gp_install_id "${gp_install_id}") - #message("INSTALL ID is \"${gp_install_id}\"") - endif() - endif() - - # Analyze each line for file names that match the regular expression: - # - foreach(candidate ${candidates}) - if("${candidate}" MATCHES "${gp_regex}") - - # Extract information from each candidate: - if(gp_regex_error AND "${candidate}" MATCHES "${gp_regex_error}") - string(REGEX REPLACE "${gp_regex_fallback}" "\\1" raw_item "${candidate}") - else() - string(REGEX REPLACE "${gp_regex}" "\\1" raw_item "${candidate}") - endif() - - if(gp_regex_cmp_count GREATER 1) - string(REGEX REPLACE "${gp_regex}" "\\2" raw_compat_version "${candidate}") - string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" compat_major_version "${raw_compat_version}") - string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" compat_minor_version "${raw_compat_version}") - string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" compat_patch_version "${raw_compat_version}") - endif() - - if(gp_regex_cmp_count GREATER 2) - string(REGEX REPLACE "${gp_regex}" "\\3" raw_current_version "${candidate}") - string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" current_major_version "${raw_current_version}") - string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" current_minor_version "${raw_current_version}") - string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" current_patch_version "${raw_current_version}") - endif() - - # Use the raw_item as the list entries returned by this function. Use the - # gp_resolve_item function to resolve it to an actual full path file if - # necessary. - # - set(item "${raw_item}") - - # Add each item unless it is excluded: - # - set(add_item 1) - - if(item STREQUAL gp_install_id) - set(add_item 0) - endif() - - if(add_item AND ${exclude_system}) - set(type "") - gp_resolved_file_type("${target}" "${item}" "${exepath}" "${dirs}" type "${rpaths}") - - if(type STREQUAL "system") - set(add_item 0) - endif() - endif() - - if(add_item) - list(LENGTH ${prerequisites_var} list_length_before_append) - gp_append_unique(${prerequisites_var} "${item}") - list(LENGTH ${prerequisites_var} list_length_after_append) - - if(${recurse}) - # If item was really added, this is the first time we have seen it. - # Add it to unseen_prereqs so that we can recursively add *its* - # prerequisites... - # - # But first: resolve its name to an absolute full path name such - # that the analysis tools can simply accept it as input. - # - if(NOT list_length_before_append EQUAL list_length_after_append) - gp_resolve_item("${target}" "${item}" "${exepath}" "${dirs}" resolved_item "${rpaths}") - set(unseen_prereqs ${unseen_prereqs} "${resolved_item}") - endif() - endif() - endif() - else() - if(verbose) - message(STATUS "ignoring non-matching line: '${candidate}'") - endif() - endif() - endforeach() - - list(LENGTH ${prerequisites_var} prerequisites_var_length) - if(prerequisites_var_length GREATER 0) - list(SORT ${prerequisites_var}) - endif() - if(${recurse}) - set(more_inputs ${unseen_prereqs}) - foreach(input ${more_inputs}) - get_prerequisites("${input}" ${prerequisites_var} ${exclude_system} ${recurse} "${exepath}" "${dirs}" "${rpaths}") - endforeach() - endif() - - set(${prerequisites_var} ${${prerequisites_var}} PARENT_SCOPE) -endfunction() - - -function(list_prerequisites target) - if(ARGC GREATER 1 AND NOT "${ARGV1}" STREQUAL "") - set(all "${ARGV1}") - else() - set(all 1) - endif() - - if(ARGC GREATER 2 AND NOT "${ARGV2}" STREQUAL "") - set(exclude_system "${ARGV2}") - else() - set(exclude_system 0) - endif() - - if(ARGC GREATER 3 AND NOT "${ARGV3}" STREQUAL "") - set(verbose "${ARGV3}") - else() - set(verbose 0) - endif() - - set(count 0) - set(count_str "") - set(print_count "${verbose}") - set(print_prerequisite_type "${verbose}") - set(print_target "${verbose}") - set(type_str "") - - get_filename_component(exepath "${target}" PATH) - - set(prereqs "") - get_prerequisites("${target}" prereqs ${exclude_system} ${all} "${exepath}" "") - - if(print_target) - message(STATUS "File '${target}' depends on:") - endif() - - foreach(d ${prereqs}) - math(EXPR count "${count} + 1") - - if(print_count) - set(count_str "${count}. ") - endif() - - if(print_prerequisite_type) - gp_file_type("${target}" "${d}" type) - set(type_str " (${type})") - endif() - - message(STATUS "${count_str}${d}${type_str}") - endforeach() -endfunction() - - -function(list_prerequisites_by_glob glob_arg glob_exp) - message(STATUS "=============================================================================") - message(STATUS "List prerequisites of executables matching ${glob_arg} '${glob_exp}'") - message(STATUS "") - file(${glob_arg} file_list ${glob_exp}) - foreach(f ${file_list}) - is_file_executable("${f}" is_f_executable) - if(is_f_executable) - message(STATUS "=============================================================================") - list_prerequisites("${f}" ${ARGN}) - message(STATUS "") - endif() - endforeach() -endfunction() diff --git a/CMake/Modules/LibFindMacros.cmake b/CMake/Modules/LibFindMacros.cmake index aa2143c82..e293efff8 100644 --- a/CMake/Modules/LibFindMacros.cmake +++ b/CMake/Modules/LibFindMacros.cmake @@ -1,46 +1,101 @@ -# Version 1.0 (2013-04-12) -# Public Domain, originally written by Lasse Kärkkäinen -# Published at http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries +# Version 2.3 +# Public Domain, originally written by Lasse Kärkkäinen +# Maintained at https://github.com/Tronic/cmake-modules +# Please send your improvements as pull requests on Github. -# If you improve the script, please modify the forementioned wiki page because -# I no longer maintain my scripts (hosted as static files at zi.fi). Feel free -# to remove this entire header if you use real version control instead. - -# Changelog: -# 2013-04-12 Added version number (1.0) and this header, no other changes -# 2009-10-08 Originally published - - -# Works the same as find_package, but forwards the "REQUIRED" and "QUIET" arguments -# used for the current package. For this to work, the first parameter must be the -# prefix of the current package, then the prefix of the new package etc, which are -# passed to find_package. -macro (libfind_package PREFIX) - set (LIBFIND_PACKAGE_ARGS ${ARGN}) - if (${PREFIX}_FIND_QUIETLY) - set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} QUIET) - endif (${PREFIX}_FIND_QUIETLY) +# Find another package and make it a dependency of the current package. +# This also automatically forwards the "REQUIRED" argument. +# Usage: libfind_package( [extra args to find_package]) +macro (libfind_package PREFIX PKG) + set(${PREFIX}_args ${PKG} ${ARGN}) if (${PREFIX}_FIND_REQUIRED) - set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} REQUIRED) - endif (${PREFIX}_FIND_REQUIRED) - find_package(${LIBFIND_PACKAGE_ARGS}) -endmacro (libfind_package) + set(${PREFIX}_args ${${PREFIX}_args} REQUIRED) + endif() + find_package(${${PREFIX}_args}) + set(${PREFIX}_DEPENDENCIES ${${PREFIX}_DEPENDENCIES};${PKG}) + unset(${PREFIX}_args) +endmacro() -# CMake developers made the UsePkgConfig system deprecated in the same release (2.6) -# where they added pkg_check_modules. Consequently I need to support both in my scripts -# to avoid those deprecated warnings. Here's a helper that does just that. -# Works identically to pkg_check_modules, except that no checks are needed prior to use. -macro (libfind_pkg_check_modules PREFIX PKGNAME) - if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) - include(UsePkgConfig) - pkgconfig(${PKGNAME} ${PREFIX}_INCLUDE_DIRS ${PREFIX}_LIBRARY_DIRS ${PREFIX}_LDFLAGS ${PREFIX}_CFLAGS) - else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) - find_package(PkgConfig) - if (PKG_CONFIG_FOUND) - pkg_check_modules(${PREFIX} ${PKGNAME}) - endif (PKG_CONFIG_FOUND) - endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) -endmacro (libfind_pkg_check_modules) +# A simple wrapper to make pkg-config searches a bit easier. +# Works the same as CMake's internal pkg_check_modules but is always quiet. +macro (libfind_pkg_check_modules) + find_package(PkgConfig QUIET) + if (PKG_CONFIG_FOUND) + pkg_check_modules(${ARGN} QUIET) + endif() +endmacro() + +# Avoid useless copy&pasta by doing what most simple libraries do anyway: +# pkg-config, find headers, find library. +# Usage: libfind_pkg_detect( FIND_PATH [other args] FIND_LIBRARY [other args]) +# E.g. libfind_pkg_detect(SDL2 sdl2 FIND_PATH SDL.h PATH_SUFFIXES SDL2 FIND_LIBRARY SDL2) +function (libfind_pkg_detect PREFIX) + # Parse arguments + set(argname pkgargs) + foreach (i ${ARGN}) + if ("${i}" STREQUAL "FIND_PATH") + set(argname pathargs) + elseif ("${i}" STREQUAL "FIND_LIBRARY") + set(argname libraryargs) + else() + set(${argname} ${${argname}} ${i}) + endif() + endforeach() + if (NOT pkgargs) + message(FATAL_ERROR "libfind_pkg_detect requires at least a pkg_config package name to be passed.") + endif() + # Find library + libfind_pkg_check_modules(${PREFIX}_PKGCONF ${pkgargs}) + if (pathargs) + find_path(${PREFIX}_INCLUDE_DIR NAMES ${pathargs} HINTS ${${PREFIX}_PKGCONF_INCLUDE_DIRS}) + endif() + if (libraryargs) + find_library(${PREFIX}_LIBRARY NAMES ${libraryargs} HINTS ${${PREFIX}_PKGCONF_LIBRARY_DIRS}) + endif() + # Read pkg-config version + if (${PREFIX}_PKGCONF_VERSION) + set(${PREFIX}_VERSION ${${PREFIX}_PKGCONF_VERSION} PARENT_SCOPE) + endif() +endfunction() + +# Extracts a version #define from a version.h file, output stored to _VERSION. +# Usage: libfind_version_header(Foobar foobar/version.h FOOBAR_VERSION_STR) +# Fourth argument "QUIET" may be used for silently testing different define names. +# This function does nothing if the version variable is already defined. +function (libfind_version_header PREFIX VERSION_H DEFINE_NAME) + # Skip processing if we already have a version or if the include dir was not found + if (${PREFIX}_VERSION OR NOT ${PREFIX}_INCLUDE_DIR) + return() + endif() + set(quiet ${${PREFIX}_FIND_QUIETLY}) + # Process optional arguments + foreach(arg ${ARGN}) + if (arg STREQUAL "QUIET") + set(quiet TRUE) + else() + message(AUTHOR_WARNING "Unknown argument ${arg} to libfind_version_header ignored.") + endif() + endforeach() + # Read the header and parse for version number + set(filename "${${PREFIX}_INCLUDE_DIR}/${VERSION_H}") + if (NOT EXISTS ${filename}) + if (NOT quiet) + message(AUTHOR_WARNING "Unable to find ${${PREFIX}_INCLUDE_DIR}/${VERSION_H}") + endif() + return() + endif() + file(READ "${filename}" header) + string(REGEX REPLACE ".*#[ \t]*define[ \t]*${DEFINE_NAME}[ \t]*\"([^\n]*)\".*" "\\1" match "${header}") + # No regex match? + if (match STREQUAL header) + if (NOT quiet) + message(AUTHOR_WARNING "Unable to find \#define ${DEFINE_NAME} \"\" from ${${PREFIX}_INCLUDE_DIR}/${VERSION_H}") + endif() + return() + endif() + # Export the version string + set(${PREFIX}_VERSION "${match}" PARENT_SCOPE) +endfunction() # Do the final processing once the paths have been detected. # If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain @@ -48,65 +103,167 @@ endmacro (libfind_pkg_check_modules) # Ditto for ${PREFIX}_PROCESS_LIBS and library files. # Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES. # Also handles errors in case library detection was required, etc. -macro (libfind_process PREFIX) - # Skip processing if already processed during this run - if (NOT ${PREFIX}_FOUND) - # Start with the assumption that the library was found - set (${PREFIX}_FOUND TRUE) +function (libfind_process PREFIX) + # Skip processing if already processed during this configuration run + if (${PREFIX}_FOUND) + return() + endif() - # Process all includes and set _FOUND to false if any are missing - foreach (i ${${PREFIX}_PROCESS_INCLUDES}) - if (${i}) - set (${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIRS} ${${i}}) - mark_as_advanced(${i}) - else (${i}) - set (${PREFIX}_FOUND FALSE) - endif (${i}) - endforeach (i) + set(found TRUE) # Start with the assumption that the package was found - # Process all libraries and set _FOUND to false if any are missing - foreach (i ${${PREFIX}_PROCESS_LIBS}) - if (${i}) - set (${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARIES} ${${i}}) - mark_as_advanced(${i}) - else (${i}) - set (${PREFIX}_FOUND FALSE) - endif (${i}) - endforeach (i) + # Did we find any files? Did we miss includes? These are for formatting better error messages. + set(some_files FALSE) + set(missing_headers FALSE) - # Print message and/or exit on fatal error - if (${PREFIX}_FOUND) - if (NOT ${PREFIX}_FIND_QUIETLY) - message (STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}") - endif (NOT ${PREFIX}_FIND_QUIETLY) - else (${PREFIX}_FOUND) - if (${PREFIX}_FIND_REQUIRED) - foreach (i ${${PREFIX}_PROCESS_INCLUDES} ${${PREFIX}_PROCESS_LIBS}) - message("${i}=${${i}}") - endforeach (i) - message (FATAL_ERROR "Required library ${PREFIX} NOT FOUND.\nInstall the library (dev version) and try again. If the library is already installed, use ccmake to set the missing variables manually.") - endif (${PREFIX}_FIND_REQUIRED) - endif (${PREFIX}_FOUND) - endif (NOT ${PREFIX}_FOUND) -endmacro (libfind_process) + # Shorthands for some variables that we need often + set(quiet ${${PREFIX}_FIND_QUIETLY}) + set(required ${${PREFIX}_FIND_REQUIRED}) + set(exactver ${${PREFIX}_FIND_VERSION_EXACT}) + set(findver "${${PREFIX}_FIND_VERSION}") + set(version "${${PREFIX}_VERSION}") -macro(libfind_library PREFIX basename) - set(TMP "") - if(MSVC80) - set(TMP -vc80) - endif(MSVC80) - if(MSVC90) - set(TMP -vc90) - endif(MSVC90) - set(${PREFIX}_LIBNAMES ${basename}${TMP}) - if(${ARGC} GREATER 2) - set(${PREFIX}_LIBNAMES ${basename}${TMP}-${ARGV2}) - string(REGEX REPLACE "\\." "_" TMP ${${PREFIX}_LIBNAMES}) - set(${PREFIX}_LIBNAMES ${${PREFIX}_LIBNAMES} ${TMP}) - endif(${ARGC} GREATER 2) - find_library(${PREFIX}_LIBRARY - NAMES ${${PREFIX}_LIBNAMES} - PATHS ${${PREFIX}_PKGCONF_LIBRARY_DIRS} - ) -endmacro(libfind_library) + # Lists of config option names (all, includes, libs) + unset(configopts) + set(includeopts ${${PREFIX}_PROCESS_INCLUDES}) + set(libraryopts ${${PREFIX}_PROCESS_LIBS}) + # Process deps to add to + foreach (i ${PREFIX} ${${PREFIX}_DEPENDENCIES}) + if (DEFINED ${i}_INCLUDE_OPTS OR DEFINED ${i}_LIBRARY_OPTS) + # The package seems to export option lists that we can use, woohoo! + list(APPEND includeopts ${${i}_INCLUDE_OPTS}) + list(APPEND libraryopts ${${i}_LIBRARY_OPTS}) + else() + # If plural forms don't exist or they equal singular forms + if ((NOT DEFINED ${i}_INCLUDE_DIRS AND NOT DEFINED ${i}_LIBRARIES) OR + (${i}_INCLUDE_DIR STREQUAL ${i}_INCLUDE_DIRS AND ${i}_LIBRARY STREQUAL ${i}_LIBRARIES)) + # Singular forms can be used + if (DEFINED ${i}_INCLUDE_DIR) + list(APPEND includeopts ${i}_INCLUDE_DIR) + endif() + if (DEFINED ${i}_LIBRARY) + list(APPEND libraryopts ${i}_LIBRARY) + endif() + else() + # Oh no, we don't know the option names + message(FATAL_ERROR "We couldn't determine config variable names for ${i} includes and libs. Aieeh!") + endif() + endif() + endforeach() + + if (includeopts) + list(REMOVE_DUPLICATES includeopts) + endif() + + if (libraryopts) + list(REMOVE_DUPLICATES libraryopts) + endif() + + string(REGEX REPLACE ".*[ ;]([^ ;]*(_INCLUDE_DIRS|_LIBRARIES))" "\\1" tmp "${includeopts} ${libraryopts}") + if (NOT tmp STREQUAL "${includeopts} ${libraryopts}") + message(AUTHOR_WARNING "Plural form ${tmp} found in config options of ${PREFIX}. This works as before but is now deprecated. Please only use singular forms INCLUDE_DIR and LIBRARY, and update your find scripts for LibFindMacros > 2.0 automatic dependency system (most often you can simply remove the PROCESS variables entirely).") + endif() + + # Include/library names separated by spaces (notice: not CMake lists) + unset(includes) + unset(libs) + + # Process all includes and set found false if any are missing + foreach (i ${includeopts}) + list(APPEND configopts ${i}) + if (NOT "${${i}}" STREQUAL "${i}-NOTFOUND") + list(APPEND includes "${${i}}") + else() + set(found FALSE) + set(missing_headers TRUE) + endif() + endforeach() + + # Process all libraries and set found false if any are missing + foreach (i ${libraryopts}) + list(APPEND configopts ${i}) + if (NOT "${${i}}" STREQUAL "${i}-NOTFOUND") + list(APPEND libs "${${i}}") + else() + set (found FALSE) + endif() + endforeach() + + # Version checks + if (found AND findver) + if (NOT version) + message(WARNING "The find module for ${PREFIX} does not provide version information, so we'll just assume that it is OK. Please fix the module or remove package version requirements to get rid of this warning.") + elseif (version VERSION_LESS findver OR (exactver AND NOT version VERSION_EQUAL findver)) + set(found FALSE) + set(version_unsuitable TRUE) + endif() + endif() + + # If all-OK, hide all config options, export variables, print status and exit + if (found) + foreach (i ${configopts}) + mark_as_advanced(${i}) + endforeach() + if (NOT quiet) + message(STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}") + if (LIBFIND_DEBUG) + message(STATUS " ${PREFIX}_DEPENDENCIES=${${PREFIX}_DEPENDENCIES}") + message(STATUS " ${PREFIX}_INCLUDE_OPTS=${includeopts}") + message(STATUS " ${PREFIX}_INCLUDE_DIRS=${includes}") + message(STATUS " ${PREFIX}_LIBRARY_OPTS=${libraryopts}") + message(STATUS " ${PREFIX}_LIBRARIES=${libs}") + endif() + endif() + set (${PREFIX}_INCLUDE_OPTS ${includeopts} PARENT_SCOPE) + set (${PREFIX}_LIBRARY_OPTS ${libraryopts} PARENT_SCOPE) + set (${PREFIX}_INCLUDE_DIRS ${includes} PARENT_SCOPE) + set (${PREFIX}_LIBRARIES ${libs} PARENT_SCOPE) + set (${PREFIX}_FOUND TRUE PARENT_SCOPE) + return() + endif() + + # Format messages for debug info and the type of error + set(vars "Relevant CMake configuration variables:\n") + foreach (i ${configopts}) + mark_as_advanced(CLEAR ${i}) + set(val ${${i}}) + if ("${val}" STREQUAL "${i}-NOTFOUND") + set (val "") + elseif (val AND NOT EXISTS ${val}) + set (val "${val} (does not exist)") + else() + set(some_files TRUE) + endif() + set(vars "${vars} ${i}=${val}\n") + endforeach() + set(vars "${vars}You may use CMake GUI, cmake -D or ccmake to modify the values. Delete CMakeCache.txt to discard all values and force full re-detection if necessary.\n") + if (version_unsuitable) + set(msg "${PREFIX} ${${PREFIX}_VERSION} was found but") + if (exactver) + set(msg "${msg} only version ${findver} is acceptable.") + else() + set(msg "${msg} version ${findver} is the minimum requirement.") + endif() + else() + if (missing_headers) + set(msg "We could not find development headers for ${PREFIX}. Do you have the necessary dev package installed?") + elseif (some_files) + set(msg "We only found some files of ${PREFIX}, not all of them. Perhaps your installation is incomplete or maybe we just didn't look in the right place?") + if(findver) + set(msg "${msg} This could also be caused by incompatible version (if it helps, at least ${PREFIX} ${findver} should work).") + endif() + else() + set(msg "We were unable to find package ${PREFIX}.") + endif() + endif() + + # Fatal error out if REQUIRED + if (required) + set(msg "REQUIRED PACKAGE NOT FOUND\n${msg} This package is REQUIRED and you need to install it or adjust CMake configuration in order to continue building ${CMAKE_PROJECT_NAME}.") + message(FATAL_ERROR "${msg}\n${vars}") + endif() + # Otherwise just print a nasty warning + if (NOT quiet) + message(WARNING "WARNING: MISSING PACKAGE\n${msg} This package is NOT REQUIRED and you may ignore this warning but by doing so you may miss some functionality of ${CMAKE_PROJECT_NAME}. \n${vars}") + endif() +endfunction() diff --git a/CMakeLists.txt b/CMakeLists.txt index 187a2685b..10fb1e396 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ if (POLICY CMP0075) endif () project (wsjtx - VERSION 2.4.0.0 + VERSION 2.5.0.0 LANGUAGES C CXX Fortran ) set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio") @@ -71,7 +71,7 @@ message (STATUS "******************************************************") include (set_build_type) # RC 0 or omitted is a development build, GA is a General Availability release build -set_build_type (GA) +set_build_type (RC 1) set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") # @@ -333,6 +333,7 @@ set (wsjt_FSRCS lib/timer_impl.f90 lib/timer_module.f90 lib/wavhdr.f90 + lib/qra/q65/q65_encoding_modules.f90 # remaining non-module sources lib/addit.f90 @@ -462,6 +463,7 @@ set (wsjt_FSRCS lib/lorentzian.f90 lib/fst4/lorentzian_fading.f90 lib/lpf1.f90 + lib/map65_mmdec.f90 lib/mixlpf.f90 lib/makepings.f90 lib/moondopjpl.f90 @@ -813,12 +815,27 @@ endif (APPLE) # include (CheckTypeSize) include (CheckCSourceCompiles) +include (CheckIncludeFiles) include (CheckSymbolExists) include (generate_version_info) find_program(CTAGS ctags) find_program(ETAGS etags) +# +# Platform checks +# +check_include_files ("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) +check_include_files (stdio.h HAVE_STDIO_H) +check_include_files (stdlib.h HAVE_STDLIB_H) +check_include_files (unistd.h HAVE_UNISTD_H) +check_include_files (sys/ioctl.h HAVE_SYS_IOCTL_H) +check_include_files (sys/types.h HAVE_SYS_TYPES_H) +check_include_files (fcntl.h HAVE_FCNTL_H) +check_include_files (sys/stat.h HAVE_SYS_STAT_H) +check_include_files ("linux/ppdev.h;linux/parport.h" HAVE_LINUX_PPDEV_H) +check_include_files ("dev/ppbus/ppi.h;dev/ppbus/ppbconf.h" HAVE_DEV_PPBUS_PPI_H) + # # Standard C Math Library # @@ -855,24 +872,19 @@ find_package (OpenMP) find_package (FFTW3 COMPONENTS single threads REQUIRED) # -# libhamlib setup +# hamlib setup # -set (hamlib_STATIC 1) -find_package (hamlib 3 REQUIRED) +find_package (Hamlib REQUIRED) find_program (RIGCTL_EXE rigctl) find_program (RIGCTLD_EXE rigctld) find_program (RIGCTLCOM_EXE rigctlcom) -message (STATUS "hamlib_INCLUDE_DIRS: ${hamlib_INCLUDE_DIRS}") -message (STATUS "hamlib_LIBRARIES: ${hamlib_LIBRARIES}") -message (STATUS "hamlib_LIBRARY_DIRS: ${hamlib_LIBRARY_DIRS}") - -set (CMAKE_REQUIRED_INCLUDES "${hamlib_INCLUDE_DIRS}") -set (CMAKE_REQUIRED_LIBRARIES "${hamlib_LIBRARIES}") -set (CMAKE_EXTRA_INCLUDE_FILES "hamlib/rig.h") check_type_size (CACHE_ALL HAMLIB_OLD_CACHING) check_symbol_exists (rig_set_cache_timeout_ms "hamlib/rig.h" HAVE_HAMLIB_CACHING) +find_package (Portaudio REQUIRED) + +find_package (Usb REQUIRED) # # Qt5 setup @@ -886,19 +898,6 @@ if (WIN32) find_package (Qt5AxContainer REQUIRED) endif (WIN32) -# -# sub-directories -# -if (EXISTS ${CMAKE_SOURCE_DIR}/samples AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/samples) - add_subdirectory (samples) -endif () -if (WSJT_GENERATE_DOCS) - add_subdirectory (doc) -endif (WSJT_GENERATE_DOCS) -if (EXISTS ${CMAKE_SOURCE_DIR}/tests AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/tests) - add_subdirectory (tests) -endif () - # # Library building setup # @@ -961,8 +960,15 @@ if (Fortran_COMPILER_NAME MATCHES "gfortran.*") set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -isysroot ${CMAKE_OSX_SYSROOT}") endif (CMAKE_OSX_SYSROOT) - set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fbounds-check -funroll-all-loops -fno-f2c ${General_FFLAGS}") - set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -fbounds-check -fno-f2c ${General_FFLAGS}") + set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fbounds-check -funroll-all-loops -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") + +set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -g -fbacktrace -fbounds-check -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") + + # FPE traps currently disabled in Debug configuration builds until + # we decide if they are meaningful, without these FP instructions + # run in nonstop mode and do not trap + #set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} ${CMAKE_Fortran_FLAGS_DEBUG} -ffpe-trap=invalid,zero,overflow") + elseif (Fortran_COMPILER_NAME MATCHES "ifort.*") # ifort (untested) set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -f77rtl ${General_FFLAGS}") @@ -1064,6 +1070,19 @@ elseif (CMAKE_HOST_WIN32) add_definitions (-DWIN32) endif () +# +# sub-directories +# +if (EXISTS ${CMAKE_SOURCE_DIR}/samples AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/samples) + add_subdirectory (samples) +endif () +if (WSJT_GENERATE_DOCS) + add_subdirectory (doc) +endif (WSJT_GENERATE_DOCS) +if (EXISTS ${CMAKE_SOURCE_DIR}/tests AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/tests) + add_subdirectory (tests) +endif () + # build a library of package functionality (without and optionally with OpenMP support) add_library (wsjt_cxx STATIC ${wsjt_CSRCS} ${wsjt_CXXSRCS}) target_link_libraries (wsjt_cxx ${LIBM_LIBRARIES} Boost::log_setup ${LIBM_LIBRARIES}) @@ -1110,6 +1129,9 @@ target_link_libraries (sumsim wsjt_fort wsjt_cxx) add_executable (q65sim lib/qra/q65/q65sim.f90) target_link_libraries (q65sim wsjt_fort wsjt_cxx) +add_executable (q65code lib/qra/q65/q65code.f90) +target_link_libraries (q65code wsjt_fort wsjt_cxx) + add_executable (test_q65 lib/test_q65.f90) target_link_libraries (test_q65 wsjt_fort wsjt_cxx) @@ -1317,8 +1339,7 @@ target_link_libraries (qcp Qt5::Widgets Qt5::PrintSupport) add_library (wsjt_qt STATIC ${wsjt_qt_CXXSRCS} ${wsjt_qt_GENUISRCS} ${GENAXSRCS}) # set wsjtx_udp exports to static variants target_compile_definitions (wsjt_qt PUBLIC UDP_STATIC_DEFINE) -target_link_libraries (wsjt_qt Boost::log qcp Qt5::Widgets Qt5::Network Qt5::Sql) -target_include_directories (wsjt_qt BEFORE PRIVATE ${hamlib_INCLUDE_DIRS}) +target_link_libraries (wsjt_qt Hamlib::Hamlib Boost::log qcp Qt5::Widgets Qt5::Network Qt5::Sql) if (WIN32) target_link_libraries (wsjt_qt Qt5::AxContainer Qt5::AxBase) endif (WIN32) @@ -1380,6 +1401,9 @@ else (${OPENMP_FOUND} OR APPLE) target_link_libraries (jt9 wsjt_fort wsjt_cxx fort_qt) endif (${OPENMP_FOUND} OR APPLE) +# build map65 +add_subdirectory (map65) + # build the main application generate_version_info (wsjtx_VERSION_RESOURCES NAME wsjtx @@ -1432,7 +1456,7 @@ else () ) endif () endif () -target_link_libraries (wsjtx Qt5::SerialPort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES} ${LIBM_LIBRARIES}) +target_link_libraries (wsjtx Qt5::SerialPort wsjt_cxx wsjt_qt wsjt_qtmm ${FFTW3_LIBRARIES} ${LIBM_LIBRARIES}) # make a library for WSJT-X UDP servers # add_library (wsjtx_udp SHARED ${UDP_library_CXXSRCS}) @@ -1543,7 +1567,8 @@ install (TARGETS jt9 wsprd fmtave fcal fmeasure ) if(WSJT_BUILD_UTILS) -install (TARGETS ft8code jt65code jt9code jt4code msk144code fst4sim q65sim +install (TARGETS ft8code jt65code jt9code jt4code msk144code + q65code fst4sim q65sim RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime ) @@ -1663,174 +1688,27 @@ if (NOT WIN32 AND NOT APPLE) ) endif (NOT WIN32 AND NOT APPLE) +if (APPLE) + set (CMAKE_POSTFLIGHT_SCRIPT + "${wsjtx_BINARY_DIR}/postflight.sh") + set (CMAKE_POSTUPGRADE_SCRIPT + "${wsjtx_BINARY_DIR}/postupgrade.sh") + configure_file ("${wsjtx_SOURCE_DIR}/Darwin/postflight.sh.in" + "${CMAKE_POSTFLIGHT_SCRIPT}") + configure_file ("${wsjtx_SOURCE_DIR}/Darwin/postupgrade.sh.in" + "${CMAKE_POSTUPGRADE_SCRIPT}") +endif () + # # bundle fixup only done in non-Debug configurations # if (NOT is_debug_build) - - get_target_property (QtCore_location Qt5::Core LOCATION) - get_filename_component (QtCore_location ${QtCore_location} PATH) - list (APPEND fixup_library_dirs ${QtCore_location}) - - if (APPLE) - set (CMAKE_POSTFLIGHT_SCRIPT - "${wsjtx_BINARY_DIR}/postflight.sh") - set (CMAKE_POSTUPGRADE_SCRIPT - "${wsjtx_BINARY_DIR}/postupgrade.sh") - configure_file ("${wsjtx_SOURCE_DIR}/Darwin/postflight.sh.in" - "${CMAKE_POSTFLIGHT_SCRIPT}") - configure_file ("${wsjtx_SOURCE_DIR}/Darwin/postupgrade.sh.in" - "${CMAKE_POSTUPGRADE_SCRIPT}") - endif () - - if (APPLE OR WIN32) - # install rules for including 3rd party libs such as Qt - - # install a qt.conf file - install (CODE " - get_filename_component (the_qt_conf \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${WSJT_QT_CONF_DESTINATION}/qt.conf\" REALPATH) - file (WRITE \"\${the_qt_conf}\" -\"[Paths] -\") -" - #COMPONENT runtime - ) - - # if a system Qt is used (e.g. installed in /usr/lib/), it will not be included in the installation - set (fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/${CMAKE_PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}") - - #get_filename_component (hamlib_lib_dir ${hamlib_LIBRARIES} PATH) - - if (APPLE) - # install required Qt plugins - install ( - DIRECTORY - ${QT_PLUGINS_DIR}/platforms - ${QT_PLUGINS_DIR}/audio - ${QT_PLUGINS_DIR}/accessible - ${QT_PLUGINS_DIR}/imageformats - ${QT_PLUGINS_DIR}/styles - DESTINATION ${WSJT_PLUGIN_DESTINATION} - CONFIGURATIONS Release MinSizeRel RelWithDebInfo - #COMPONENT runtime - FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}" - PATTERN "*minimal*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - PATTERN "*offscreen*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - PATTERN "*webgl*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - PATTERN "*_debug${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}.dSYM" EXCLUDE - ) - install ( - FILES - ${QT_PLUGINS_DIR}/sqldrivers/libqsqlite${CMAKE_SHARED_LIBRARY_SUFFIX} - DESTINATION ${WSJT_PLUGIN_DESTINATION}/sqldrivers - CONFIGURATIONS Release MinSizeRel RelWithDebInfo - #COMPONENT runtime - ) - # install ( - # DIRECTORY - # ${QT_PLUGINS_DIR}/platforms - # ${QT_PLUGINS_DIR}/audio - # ${QT_PLUGINS_DIR}/accessible - # DESTINATION ${WSJT_PLUGIN_DESTINATION} - # CONFIGURATIONS Debug - # #COMPONENT runtime - # FILES_MATCHING PATTERN "*_debug${CMAKE_SHARED_LIBRARY_SUFFIX}" - # PATTERN "*minimal*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - # PATTERN "*offscreen*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - # PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - # ) - - # add plugins path for Mac Bundle - install (CODE " - get_filename_component (the_qt_conf \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${WSJT_QT_CONF_DESTINATION}/qt.conf\" REALPATH) - file (APPEND \"\${the_qt_conf}\" -\"Plugins = PlugIns -\") -" - #COMPONENT runtime - ) - endif (APPLE) - - if (WIN32) - # DLL directory - #set (hamlib_lib_dir ${hamlib_lib_dir}/../bin) - - get_filename_component (fftw_lib_dir ${FFTW3F_LIBRARY} PATH) - list (APPEND fixup_library_dirs ${fftw_lib_dir}) - - # install required Qt plugins - install ( - DIRECTORY - ${QT_PLUGINS_DIR}/platforms - ${QT_PLUGINS_DIR}/styles - ${QT_PLUGINS_DIR}/accessible - ${QT_PLUGINS_DIR}/audio - ${QT_PLUGINS_DIR}/imageformats - DESTINATION ${WSJT_PLUGIN_DESTINATION} - CONFIGURATIONS Release MinSizeRel RelWithDebInfo - #COMPONENT runtime - FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}" - PATTERN "*minimal*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - PATTERN "*offscreen*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - PATTERN "*d${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - ) - install ( - FILES - ${QT_PLUGINS_DIR}/sqldrivers/qsqlite${CMAKE_SHARED_LIBRARY_SUFFIX} - DESTINATION ${WSJT_PLUGIN_DESTINATION}/sqldrivers - CONFIGURATIONS Release MinSizeRel RelWithDebInfo - #COMPONENT runtime - ) - # install ( - # DIRECTORY - # ${QT_PLUGINS_DIR}/platforms - # ${QT_PLUGINS_DIR}/accessible - # ${QT_PLUGINS_DIR}/audio - # DESTINATION ${WSJT_PLUGIN_DESTINATION} - # CONFIGURATIONS Debug - # #COMPONENT runtime - # FILES_MATCHING PATTERN "*d${CMAKE_SHARED_LIBRARY_SUFFIX}" - # PATTERN "*minimal*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - # PATTERN "*offscreen*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - # PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE - # ) - - # add paths for WIN32 - file (RELATIVE_PATH _plugins_path "${CMAKE_INSTALL_PREFIX}/${WSJT_QT_CONF_DESTINATION}" "${CMAKE_INSTALL_PREFIX}/${WSJT_PLUGIN_DESTINATION}") - install (CODE " - get_filename_component (the_qt_conf \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${WSJT_QT_CONF_DESTINATION}/qt.conf\" REALPATH) - file (APPEND \"\${the_qt_conf}\" -\"Plugins = ${_plugins_path} -\") -" - #COMPONENT runtime - ) - - set (gp_tool "objdump") # we want MinGW tool - not MSVC (See GetPrerequisites.cmake) - endif (WIN32) - - #list (APPEND fixup_library_dirs ${hamlib_lib_dir}) - list (APPEND fixup_library_dirs ${hamlib_LIBRARY_DIRS}) - - install (CODE " - get_filename_component (the_path \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${WSJT_PLUGIN_DESTINATION}\" REALPATH) - file (GLOB_RECURSE QTPLUGINS \"\${the_path}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\") - set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/Modules ${CMAKE_MODULE_PATH}) - include (BundleUtilities) - set (BU_CHMOD_BUNDLE_ITEMS ON) - set (gp_tool ${gp_tool}) - # canonicalize path in install context - get_filename_component (the_exe ${fixup_exe} REALPATH) - fixup_bundle (\"\${the_exe}\" \"\${QTPLUGINS}\" \"${fixup_library_dirs}\")" - #COMPONENT runtime - ) - endif (APPLE OR WIN32) - -endif (NOT is_debug_build) + # add this sub-sirectory after all install steps and other + # sub-directories to ensure that all executables are in-place before + # any fixup is done + add_subdirectory (bundle_fixup) +endif () # diff --git a/bundle_fixup/CMakeLists.txt b/bundle_fixup/CMakeLists.txt new file mode 100644 index 000000000..79e7c7eb6 --- /dev/null +++ b/bundle_fixup/CMakeLists.txt @@ -0,0 +1,153 @@ +get_target_property (QtCore_location Qt5::Core LOCATION) +get_filename_component (QtCore_location ${QtCore_location} PATH) +list (APPEND fixup_library_dirs ${QtCore_location}) + +if (APPLE OR WIN32) + # install rules for including 3rd party libs such as Qt + + # install a qt.conf file + install (CODE " + get_filename_component (the_qt_conf \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${WSJT_QT_CONF_DESTINATION}/qt.conf\" REALPATH) + file (WRITE \"\${the_qt_conf}\" +\"[Paths] +\") +" + #COMPONENT runtime + ) + + # if a system Qt is used (e.g. installed in /usr/lib/), it will not be included in the installation + set (fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/${CMAKE_PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}") + + #get_filename_component (hamlib_lib_dir ${Hamlib_LIBRARIES} PATH) + + if (APPLE) + # install required Qt plugins + install ( + DIRECTORY + ${QT_PLUGINS_DIR}/platforms + ${QT_PLUGINS_DIR}/audio + ${QT_PLUGINS_DIR}/accessible + ${QT_PLUGINS_DIR}/imageformats + ${QT_PLUGINS_DIR}/styles + DESTINATION ${WSJT_PLUGIN_DESTINATION} + CONFIGURATIONS Release MinSizeRel RelWithDebInfo + #COMPONENT runtime + FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}" + PATTERN "*minimal*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*offscreen*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*webgl*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*_debug${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}.dSYM" EXCLUDE + ) + install ( + FILES + ${QT_PLUGINS_DIR}/sqldrivers/libqsqlite${CMAKE_SHARED_LIBRARY_SUFFIX} + DESTINATION ${WSJT_PLUGIN_DESTINATION}/sqldrivers + CONFIGURATIONS Release MinSizeRel RelWithDebInfo + #COMPONENT runtime + ) + # install ( + # DIRECTORY + # ${QT_PLUGINS_DIR}/platforms + # ${QT_PLUGINS_DIR}/audio + # ${QT_PLUGINS_DIR}/accessible + # DESTINATION ${WSJT_PLUGIN_DESTINATION} + # CONFIGURATIONS Debug + # #COMPONENT runtime + # FILES_MATCHING PATTERN "*_debug${CMAKE_SHARED_LIBRARY_SUFFIX}" + # PATTERN "*minimal*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + # PATTERN "*offscreen*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + # PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + # ) + + # add plugins path for Mac Bundle + install (CODE " + get_filename_component (the_qt_conf \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${WSJT_QT_CONF_DESTINATION}/qt.conf\" REALPATH) + file (APPEND \"\${the_qt_conf}\" +\"Plugins = PlugIns +\") +" + #COMPONENT runtime + ) + endif (APPLE) + + if (WIN32) + # DLL directories + get_filename_component (hamlib_lib_dir ${Hamlib_LIBRARY} PATH) + list (APPEND fixup_library_dirs ${hamlib_lib_dir}/../bin) + + get_filename_component (usb_lib_dir ${Usb_LIBRARY} PATH) + list (APPEND fixup_library_dirs ${usb_lib_dir}) + + get_filename_component (portaudio_lib_dir ${Portaudio_LIBRARY} PATH) + list (APPEND fixup_library_dirs ${portaudio_lib_dir}/../bin) + + get_filename_component (fftw_lib_dir ${FFTW3F_LIBRARY} PATH) + list (APPEND fixup_library_dirs ${fftw_lib_dir}) + + # install required Qt plugins + install ( + DIRECTORY + ${QT_PLUGINS_DIR}/platforms + ${QT_PLUGINS_DIR}/styles + ${QT_PLUGINS_DIR}/accessible + ${QT_PLUGINS_DIR}/audio + ${QT_PLUGINS_DIR}/imageformats + DESTINATION ${WSJT_PLUGIN_DESTINATION} + CONFIGURATIONS Release MinSizeRel RelWithDebInfo + #COMPONENT runtime + FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}" + PATTERN "*minimal*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*offscreen*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + PATTERN "*d${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + ) + install ( + FILES + ${QT_PLUGINS_DIR}/sqldrivers/qsqlite${CMAKE_SHARED_LIBRARY_SUFFIX} + DESTINATION ${WSJT_PLUGIN_DESTINATION}/sqldrivers + CONFIGURATIONS Release MinSizeRel RelWithDebInfo + #COMPONENT runtime + ) + # install ( + # DIRECTORY + # ${QT_PLUGINS_DIR}/platforms + # ${QT_PLUGINS_DIR}/accessible + # ${QT_PLUGINS_DIR}/audio + # DESTINATION ${WSJT_PLUGIN_DESTINATION} + # CONFIGURATIONS Debug + # #COMPONENT runtime + # FILES_MATCHING PATTERN "*d${CMAKE_SHARED_LIBRARY_SUFFIX}" + # PATTERN "*minimal*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + # PATTERN "*offscreen*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + # PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE + # ) + + # add paths for WIN32 + file (RELATIVE_PATH _plugins_path "${CMAKE_INSTALL_PREFIX}/${WSJT_QT_CONF_DESTINATION}" "${CMAKE_INSTALL_PREFIX}/${WSJT_PLUGIN_DESTINATION}") + install (CODE " + get_filename_component (the_qt_conf \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${WSJT_QT_CONF_DESTINATION}/qt.conf\" REALPATH) + file (APPEND \"\${the_qt_conf}\" +\"Plugins = ${_plugins_path} +\") +" + #COMPONENT runtime + ) + + set (gp_tool "objdump") # we want MinGW tool - not MSVC (See GetPrerequisites.cmake) + endif (WIN32) + + INSTALL (CODE " + get_filename_component (the_path \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${WSJT_PLUGIN_DESTINATION}\" REALPATH) + file (GLOB_RECURSE QTPLUGINS \"\${the_path}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\") + include (BundleUtilities) + set (BU_CHMOD_BUNDLE_ITEMS ON) + set (gp_tool ${gp_tool}) + # canonicalize path in install context + get_filename_component (the_exe ${fixup_exe} REALPATH) + fixup_bundle (\"\${the_exe}\" \"\${QTPLUGINS}\" \"${fixup_library_dirs}\")" + #COMPONENT runtime + ) +endif (APPLE OR WIN32) + diff --git a/commons.h b/commons.h index 0a3872048..9bd097b6d 100644 --- a/commons.h +++ b/commons.h @@ -26,10 +26,9 @@ typedef struct dec_data { int nutc; //UTC as integer, HHMM bool ndiskdat; //true ==> data read from *.wav file int ntrperiod; //TR period (seconds) - int nQSOProgress; /* QSO state machine state */ + int nQSOProgress; //QSO state machine state int nfqso; //User-selected QSO freq (kHz) - int nftx; /* Transmit audio offset where - replies might be expected */ + int nftx; //TX audio offset where replies might be expected bool newdat; //true ==> new data, must do long FFT int npts8; //npts for c0() array int nfa; //Low decode limit (Hz) @@ -59,6 +58,7 @@ typedef struct dec_data { int naggressive; bool nrobust; int nexp_decode; + int max_drift; char datetime[20]; char mycall[12]; char mygrid[6]; diff --git a/cty.dat b/cty.dat index 621c66443..5ef100b0d 100644 --- a/cty.dat +++ b/cty.dat @@ -682,12 +682,12 @@ Bosnia-Herzegovina: 15: 28: EU: 44.32: -17.57: -1.0: E7: E7,=YU4WU; Spain: 14: 37: EU: 40.32: 3.43: -1.0: EA: AM,AN,AO,EA,EB,EC,ED,EE,EF,EG,EH,=AM95WARD,=AN92EXPO,=EF6,=EG90IARU, - =AM1TDH/LH,=EA1APV/LH,=EA1BEY/Y,=EA1EEY/L,=EA1EEY/LGT,=EA1EEY/LH,=EA1EK/ZAP,=EA1FGS/LH,=EA1HLW/YL, - =EA1RCG/CPV,=EA1RCG/SEU,=EA1RCG/YOA,=EA1RCI/CA,=EA1RCI/CR,=EA1RCI/CVG,=EA1RCI/DAC,=EA1RCI/ESM, - =EA1RCI/IA,=EA1RCI/ICA,=EA1RCI/JBN,=EA1RCI/KD,=EA1RCI/PAZ,=EA1RCI/PCV,=EA1RCI/RCC,=EA1RCI/RSM, - =EA1RCI/YOA,=EA1RCP/NM,=EA1URL/CVL,=EA1URO/D,=EA1URO/KD,=EA5AER/P,=EA6QB/1,=EA8BFH/1,=EA8CZT/1, - =EA8FC/1,=EA8RV/P,=EA9CD/1,=EA9CI/1,=EA9CP/1,=EA9PD/1,=EB1DH/LH,=ED1IRM/LH,=EG1ILW/LH,=EG1LWB/LH, - =EG1LWC/LH,=EG1LWI/LH,=EG1LWN/LH,=EG1TDH/LH,=EG90IARU/1, + =AM1TDH/LH,=EA1APV/LH,=EA1BEY/Y,=EA1BPC/DE,=EA1EEY/L,=EA1EEY/LGT,=EA1EEY/LH,=EA1EK/ZAP,=EA1FDD/DE, + =EA1FGS/LH,=EA1HLW/YL,=EA1RCG/CPV,=EA1RCG/SEU,=EA1RCG/YOA,=EA1RCI/CA,=EA1RCI/CR,=EA1RCI/CVG, + =EA1RCI/DAC,=EA1RCI/ESM,=EA1RCI/IA,=EA1RCI/ICA,=EA1RCI/JBN,=EA1RCI/KD,=EA1RCI/PAZ,=EA1RCI/PCV, + =EA1RCI/RCC,=EA1RCI/RSM,=EA1RCI/YOA,=EA1RCP/NM,=EA1URL/CVL,=EA1URO/D,=EA1URO/KD,=EA5AER/P, + =EA6QB/1,=EA8BFH/1,=EA8CZT/1,=EA8FC/1,=EA8RV/P,=EA9CD/1,=EA9CI/1,=EA9CP/1,=EA9PD/1,=EB1DH/LH, + =ED1IRM/LH,=EG1ILW/LH,=EG1LWB/LH,=EG1LWC/LH,=EG1LWI/LH,=EG1LWN/LH,=EG1TDH/LH,=EG90IARU/1, =AM08ATU/H,=AM08CAZ/H,=AM08CYQ/H,=AM08EIE/Z,=AM08FAC/H,=AN08ADE/H,=AO08BQH/Z,=AO08BTM/Z, =AO08CIK/H,=AO08CVV/Z,=AO08CXK/H,=AO08CYL/H,=AO08DI/Z,=AO08EIE/Z,=AO08HV/Z,=AO08ICA/Z,=AO08ID/Z, =AO08KJ/Z,=AO08KV/Z,=AO08OK/H,=AO08PB/Z,=AO08RKO/H,=AO08VK/Z,=AO2016DSS/LH,=EA2/ON7RU/LH, @@ -1257,22 +1257,22 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =AL1B(5)[8],=AL1B/M(5)[8],=AL2G(5)[8],=AL3C(5)[8],=AL7AB(5)[8],=AL7NN(5)[8],=AL7NN/3(5)[8], =AL7RS(5)[8],=KH2EI(5)[8],=KH2JH(5)[8],=KH2JX(5)[8],=KH2SX(5)[8],=KH6CUJ(5)[8],=KH6GRG(5)[8], =KH6ILR/3(5)[8],=KH6JGA(5)[8],=KH6LDO(5)[8],=KH6PX(5)[8],=KH6RE(5)[8],=KH8CN(5)[8],=KL1CNN(5)[8], - =KL1HA(5)[8],=KL1KM(5)[8],=KL2A/3(5)[8],=KL2BV(5)[8],=KL2UR(5)[8],=KL2XF(5)[8],=KL7FD(5)[8], - =KL7GLK/3(5)[8],=KL7HR/3(5)[8],=KL7IUI(5)[8],=KL7IUI/3(5)[8],=KL7JO(5)[8],=KL7OF/3(5)[8], - =KL7OQ(5)[8],=KL7YN(5)[8],=KL9A/3(5)[8],=KP3M(5)[8],=KP3N(5)[8],=KP4BEP(5)[8],=KP4CAM(5)[8], - =KP4FCF(5)[8],=KP4GB/3(5)[8],=KP4IP(5)[8],=KP4JB(5)[8],=KP4N(5)[8],=KP4N/3(5)[8],=KP4PRI(5)[8], - =KP4UV(5)[8],=KP4VW(5)[8],=KP4WR(5)[8],=KP4XO(5)[8],=KP4XX(5)[8],=KP4YH(5)[8],=NH2CW(5)[8], - =NH2LA(5)[8],=NH6BD(5)[8],=NH6BK(5)[8],=NH7C(5)[8],=NH7C/3(5)[8],=NH7CC(5)[8],=NH7TV(5)[8], - =NH7YK(5)[8],=NL7CK(5)[8],=NL7PJ(5)[8],=NL7V/3(5)[8],=NL7WA(5)[8],=NL7XM(5)[8],=NL7XM/B(5)[8], - =NP2EP(5)[8],=NP2G(5)[8],=NP2NC(5)[8],=NP3ES(5)[8],=NP3IP(5)[8],=NP3YN(5)[8],=NP4RH(5)[8], - =NP4YZ(5)[8],=WH6ADS(5)[8],=WH6AWO(5)[8],=WH6AZN(5)[8],=WH6CE(5)[8],=WH6CTO(5)[8],=WH6DOA(5)[8], - =WH6ECO(5)[8],=WH6EEL(5)[8],=WH6EEN(5)[8],=WH6EIJ(5)[8],=WH6FPS(5)[8],=WH6GEU(5)[8],=WH6IO(5)[8], - =WH6OB(5)[8],=WH6RN(5)[8],=WH7F(5)[8],=WH7USA(5)[8],=WL7AF(5)[8],=WL7L(5)[8],=WP2XX(5)[8], - =WP3BX(5)[8],=WP3CC(5)[8],=WP3EC(5)[8],=WP3FK(5)[8],=WP4DA(5)[8],=WP4DCK(5)[8],=WP4EDM(5)[8], - =WP4GJL(5)[8],=WP4HRK(5)[8],=WP4HSZ(5)[8],=WP4IYE(5)[8],=WP4KDN(5)[8],=WP4KKX(5)[8],=WP4KTU(5)[8], - =WP4LEM(5)[8],=WP4LNP(5)[8],=WP4LTI(5)[8],=WP4MNV(5)[8],=WP4MSX(5)[8],=WP4MYN(5)[8],=WP4NXG(5)[8], - =WP4OSQ(5)[8],=WP4PPH(5)[8],=WP4PUR(5)[8],=WP4PYL(5)[8],=WP4PYM(5)[8],=WP4PYU(5)[8],=WP4PYV(5)[8], - =WP4PYZ(5)[8],=WP4PZA(5)[8], + =KL1HA(5)[8],=KL1KM(5)[8],=KL2A/3(5)[8],=KL2BV(5)[8],=KL2UR(5)[8],=KL2XF(5)[8],=KL4QG(5)[8], + =KL7FD(5)[8],=KL7GLK/3(5)[8],=KL7HR/3(5)[8],=KL7IUI(5)[8],=KL7IUI/3(5)[8],=KL7JO(5)[8], + =KL7OF/3(5)[8],=KL7OQ(5)[8],=KL7YN(5)[8],=KL9A/3(5)[8],=KP3M(5)[8],=KP3N(5)[8],=KP4BEP(5)[8], + =KP4CAM(5)[8],=KP4FCF(5)[8],=KP4GB/3(5)[8],=KP4IP(5)[8],=KP4JB(5)[8],=KP4N(5)[8],=KP4N/3(5)[8], + =KP4PRI(5)[8],=KP4UV(5)[8],=KP4VW(5)[8],=KP4WR(5)[8],=KP4XO(5)[8],=KP4XX(5)[8],=KP4YH(5)[8], + =NH2CW(5)[8],=NH2LA(5)[8],=NH6BD(5)[8],=NH6BK(5)[8],=NH7C(5)[8],=NH7C/3(5)[8],=NH7CC(5)[8], + =NH7TV(5)[8],=NH7YK(5)[8],=NL7CK(5)[8],=NL7PJ(5)[8],=NL7V/3(5)[8],=NL7WA(5)[8],=NL7XM(5)[8], + =NL7XM/B(5)[8],=NP2EP(5)[8],=NP2G(5)[8],=NP2NC(5)[8],=NP3ES(5)[8],=NP3IP(5)[8],=NP3YN(5)[8], + =NP4RH(5)[8],=NP4YZ(5)[8],=WH6ADS(5)[8],=WH6AWO(5)[8],=WH6AZN(5)[8],=WH6CE(5)[8],=WH6CTO(5)[8], + =WH6DOA(5)[8],=WH6ECO(5)[8],=WH6EEL(5)[8],=WH6EEN(5)[8],=WH6EIJ(5)[8],=WH6FPS(5)[8],=WH6GEU(5)[8], + =WH6IO(5)[8],=WH6OB(5)[8],=WH6RN(5)[8],=WH7F(5)[8],=WH7USA(5)[8],=WL7AF(5)[8],=WL7L(5)[8], + =WP2XX(5)[8],=WP3BX(5)[8],=WP3CC(5)[8],=WP3EC(5)[8],=WP3FK(5)[8],=WP4DA(5)[8],=WP4DCK(5)[8], + =WP4EDM(5)[8],=WP4GJL(5)[8],=WP4HRK(5)[8],=WP4HSZ(5)[8],=WP4IYE(5)[8],=WP4KDN(5)[8],=WP4KKX(5)[8], + =WP4KTU(5)[8],=WP4LEM(5)[8],=WP4LNP(5)[8],=WP4LTI(5)[8],=WP4MNV(5)[8],=WP4MSX(5)[8],=WP4MYN(5)[8], + =WP4NXG(5)[8],=WP4OSQ(5)[8],=WP4PPH(5)[8],=WP4PUR(5)[8],=WP4PYL(5)[8],=WP4PYM(5)[8],=WP4PYU(5)[8], + =WP4PYV(5)[8],=WP4PYZ(5)[8],=WP4PZA(5)[8], =AH0BV(5)[8],=AH0BZ(5)[8],=AH0G(5)[8],=AH2AJ(5)[8],=AH2AM(5)[8],=AH2AV/4(5)[8],=AH2DF(5)[8], =AH2EB(5)[8],=AH2EJ(5)[8],=AH2X(5)[8],=AH3B(5)[8],=AH6AL(5)[8],=AH6AT(5)[8],=AH6AU(5)[8], =AH6BJ(5)[8],=AH6C(5)[8],=AH6EZ/4(5)[8],=AH6FX(5)[8],=AH6FX/4(5)[8],=AH6IC(5)[8],=AH6IW(5)[8], @@ -1348,37 +1348,37 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =WH2ABJ(5)[8],=WH2G(5)[8],=WH6A(5)[8],=WH6ACF(5)[8],=WH6AJS(5)[8],=WH6AQ(5)[8],=WH6AVU(5)[8], =WH6AX(5)[8],=WH6BRQ(5)[8],=WH6CEF(5)[8],=WH6CMT(5)[8],=WH6CNC(5)[8],=WH6CTC(5)[8],=WH6CXA(5)[8], =WH6CXT(5)[8],=WH6DBX(5)[8],=WH6DMJ(5)[8],=WH6DNF(5)[8],=WH6DOL(5)[8],=WH6DUJ(5)[8],=WH6DXT(5)[8], - =WH6DZ(5)[8],=WH6ECQ(5)[8],=WH6EFI(5)[8],=WH6EFX(5)[8],=WH6EIK(5)[8],=WH6EIR(5)[8],=WH6EKW(5)[8], - =WH6ELG(5)[8],=WH6ELM(5)[8],=WH6ETF(5)[8],=WH6FCP(5)[8],=WH6GHO(5)[8],=WH6HA(5)[8],=WH6IF(5)[8], - =WH6IZ(5)[8],=WH6J(5)[8],=WH6L(5)[8],=WH6LE(5)[8],=WH6LE/4(5)[8],=WH6LE/M(5)[8],=WH6LE/P(5)[8], - =WH6NE(5)[8],=WH6NU(5)[8],=WH6WX(5)[8],=WH6YH(5)[8],=WH6YH/4(5)[8],=WH6YM(5)[8],=WH6ZF(5)[8], - =WH7GD(5)[8],=WH7HX(5)[8],=WH7NI(5)[8],=WH7XK(5)[8],=WH7XU(5)[8],=WH7YL(5)[8],=WH7YV(5)[8], - =WH7ZM(5)[8],=WH9AAF(5)[8],=WL4X(5)[8],=WL7AUL(5)[8],=WL7AX(5)[8],=WL7CHA(5)[8],=WL7CIB(5)[8], - =WL7CKJ(5)[8],=WL7COL(5)[8],=WL7CPA(5)[8],=WL7CQT(5)[8],=WL7CUY(5)[8],=WL7E/4(5)[8],=WL7GV(5)[8], - =WL7IO(5)[8],=WL7JE(5)[8],=WL7SR(5)[8],=WL7UN(5)[8],=WL7YX(5)[8],=WP2AGD(5)[8],=WP2AGO(5)[8], - =WP2AHC(5)[8],=WP2AIG(5)[8],=WP2AIL(5)[8],=WP2BB(5)[8],=WP2C(5)[8],=WP2J(5)[8],=WP2L(5)[8], - =WP2MA(5)[8],=WP2P(5)[8],=WP3AY(5)[8],=WP3BC(5)[8],=WP3DW(5)[8],=WP3HL(5)[8],=WP3IM(5)[8], - =WP3JE(5)[8],=WP3JQ(5)[8],=WP3JU(5)[8],=WP3K(5)[8],=WP3LE(5)[8],=WP3MB(5)[8],=WP3ME(5)[8], - =WP3NIS(5)[8],=WP3O(5)[8],=WP3PW(5)[8],=WP3QE(5)[8],=WP3TQ(5)[8],=WP3ZA(5)[8],=WP4AIE(5)[8], - =WP4AIL(5)[8],=WP4AIZ(5)[8],=WP4ALH(5)[8],=WP4AQK(5)[8],=WP4AVW(5)[8],=WP4B(5)[8],=WP4BFP(5)[8], - =WP4BGM(5)[8],=WP4BIN(5)[8],=WP4BJS(5)[8],=WP4BK(5)[8],=WP4BOC(5)[8],=WP4BQV(5)[8],=WP4BXS(5)[8], - =WP4BZG(5)[8],=WP4CKW(5)[8],=WP4CLS(5)[8],=WP4CMH(5)[8],=WP4DC(5)[8],=WP4DCB(5)[8],=WP4DFK(5)[8], - =WP4DMV(5)[8],=WP4DNE(5)[8],=WP4DPX(5)[8],=WP4ENX(5)[8],=WP4EXH(5)[8],=WP4FEI(5)[8],=WP4FRK(5)[8], - =WP4FS(5)[8],=WP4GAK(5)[8],=WP4GFH(5)[8],=WP4GX(5)[8],=WP4GYA(5)[8],=WP4HFZ(5)[8],=WP4HNN(5)[8], - =WP4HOX(5)[8],=WP4IF(5)[8],=WP4IJ(5)[8],=WP4IK(5)[8],=WP4ILP(5)[8],=WP4INP(5)[8],=WP4JC(5)[8], - =WP4JKO(5)[8],=WP4JNB(5)[8],=WP4JQJ(5)[8],=WP4JSR(5)[8],=WP4JSV(5)[8],=WP4JT(5)[8],=WP4KCJ(5)[8], - =WP4KDH(5)[8],=WP4KFP(5)[8],=WP4KGE(5)[8],=WP4KGI(5)[8],=WP4KI(5)[8],=WP4KJV(5)[8],=WP4KPK(5)[8], - =WP4KSK(5)[8],=WP4KTD(5)[8],=WP4LBK(5)[8],=WP4LDG(5)[8],=WP4LDL(5)[8],=WP4LDP(5)[8],=WP4LE(5)[8], - =WP4LEO(5)[8],=WP4LHA(5)[8],=WP4LTA(5)[8],=WP4MAE(5)[8],=WP4MD(5)[8],=WP4MO(5)[8],=WP4MQF(5)[8], - =WP4MWE(5)[8],=WP4MWK(5)[8],=WP4MWS(5)[8],=WP4MXE(5)[8],=WP4MYG(5)[8],=WP4MYK(5)[8],=WP4NAI(5)[8], - =WP4NAQ(5)[8],=WP4NBF(5)[8],=WP4NBG(5)[8],=WP4NFU(5)[8],=WP4NKU(5)[8],=WP4NLQ(5)[8],=WP4NVL(5)[8], - =WP4NWV(5)[8],=WP4NWW(5)[8],=WP4NYU(5)[8],=WP4O/4(5)[8],=WP4O/M(5)[8],=WP4OAT(5)[8],=WP4OBD(5)[8], - =WP4OBH(5)[8],=WP4ODR(5)[8],=WP4ODT(5)[8],=WP4OEO(5)[8],=WP4OFA(5)[8],=WP4OFL(5)[8],=WP4OHJ(5)[8], - =WP4OKI(5)[8],=WP4OLM(5)[8],=WP4OMG(5)[8],=WP4OMV(5)[8],=WP4ONR(5)[8],=WP4OOI(5)[8],=WP4OPD(5)[8], - =WP4OPF(5)[8],=WP4OQH(5)[8],=WP4OTP(5)[8],=WP4OXA(5)[8],=WP4P(5)[8],=WP4PEP(5)[8],=WP4PR(5)[8], - =WP4PUV(5)[8],=WP4PWV(5)[8],=WP4PXG(5)[8],=WP4QER(5)[8],=WP4QGV(5)[8],=WP4QHU(5)[8],=WP4RRR(5)[8], - =WP4TD(5)[8],=WP4TX(5)[8],=WP4UC(5)[8],=WP4UM(5)[8],=WP4UO(5)[8],=WP4VL(5)[8],=WP4VM(5)[8], - =WP4YG(5)[8],=WP4ZW(5)[8], + =WH6DZ(5)[8],=WH6ECQ(5)[8],=WH6EFI(5)[8],=WH6EFX(5)[8],=WH6EFY(5)[8],=WH6EIK(5)[8],=WH6EIR(5)[8], + =WH6EKW(5)[8],=WH6ELG(5)[8],=WH6ELM(5)[8],=WH6ETF(5)[8],=WH6FCP(5)[8],=WH6GHO(5)[8],=WH6HA(5)[8], + =WH6IF(5)[8],=WH6IZ(5)[8],=WH6J(5)[8],=WH6L(5)[8],=WH6LE(5)[8],=WH6LE/4(5)[8],=WH6LE/M(5)[8], + =WH6LE/P(5)[8],=WH6NE(5)[8],=WH6NU(5)[8],=WH6WX(5)[8],=WH6YH(5)[8],=WH6YH/4(5)[8],=WH6YM(5)[8], + =WH6ZF(5)[8],=WH7GD(5)[8],=WH7HX(5)[8],=WH7NI(5)[8],=WH7XK(5)[8],=WH7XU(5)[8],=WH7YL(5)[8], + =WH7YV(5)[8],=WH7ZM(5)[8],=WH9AAF(5)[8],=WL4X(5)[8],=WL7AUL(5)[8],=WL7AX(5)[8],=WL7CHA(5)[8], + =WL7CIB(5)[8],=WL7CKJ(5)[8],=WL7COL(5)[8],=WL7CPA(5)[8],=WL7CQT(5)[8],=WL7CUY(5)[8],=WL7E/4(5)[8], + =WL7GV(5)[8],=WL7IO(5)[8],=WL7JE(5)[8],=WL7SR(5)[8],=WL7UN(5)[8],=WL7YX(5)[8],=WP2AGD(5)[8], + =WP2AGO(5)[8],=WP2AHC(5)[8],=WP2AIG(5)[8],=WP2AIL(5)[8],=WP2BB(5)[8],=WP2C(5)[8],=WP2J(5)[8], + =WP2L(5)[8],=WP2MA(5)[8],=WP2P(5)[8],=WP3AY(5)[8],=WP3BC(5)[8],=WP3DW(5)[8],=WP3HL(5)[8], + =WP3IM(5)[8],=WP3JE(5)[8],=WP3JQ(5)[8],=WP3JU(5)[8],=WP3K(5)[8],=WP3LE(5)[8],=WP3MB(5)[8], + =WP3ME(5)[8],=WP3NIS(5)[8],=WP3O(5)[8],=WP3PW(5)[8],=WP3QE(5)[8],=WP3TQ(5)[8],=WP3ZA(5)[8], + =WP4AIE(5)[8],=WP4AIL(5)[8],=WP4AIZ(5)[8],=WP4ALH(5)[8],=WP4AQK(5)[8],=WP4AVW(5)[8],=WP4B(5)[8], + =WP4BFP(5)[8],=WP4BGM(5)[8],=WP4BIN(5)[8],=WP4BJS(5)[8],=WP4BK(5)[8],=WP4BOC(5)[8],=WP4BQV(5)[8], + =WP4BXS(5)[8],=WP4BZG(5)[8],=WP4CKW(5)[8],=WP4CLS(5)[8],=WP4CMH(5)[8],=WP4DC(5)[8],=WP4DCB(5)[8], + =WP4DFK(5)[8],=WP4DMV(5)[8],=WP4DNE(5)[8],=WP4DPX(5)[8],=WP4ENX(5)[8],=WP4EXH(5)[8],=WP4FEI(5)[8], + =WP4FRK(5)[8],=WP4FS(5)[8],=WP4GAK(5)[8],=WP4GFH(5)[8],=WP4GX(5)[8],=WP4GYA(5)[8],=WP4HFZ(5)[8], + =WP4HNN(5)[8],=WP4HOX(5)[8],=WP4IF(5)[8],=WP4IJ(5)[8],=WP4IK(5)[8],=WP4ILP(5)[8],=WP4INP(5)[8], + =WP4JC(5)[8],=WP4JKO(5)[8],=WP4JNB(5)[8],=WP4JQJ(5)[8],=WP4JSR(5)[8],=WP4JSV(5)[8],=WP4JT(5)[8], + =WP4KCJ(5)[8],=WP4KDH(5)[8],=WP4KFP(5)[8],=WP4KGE(5)[8],=WP4KGI(5)[8],=WP4KI(5)[8],=WP4KJV(5)[8], + =WP4KPK(5)[8],=WP4KSK(5)[8],=WP4KTD(5)[8],=WP4LBK(5)[8],=WP4LDG(5)[8],=WP4LDL(5)[8],=WP4LDP(5)[8], + =WP4LE(5)[8],=WP4LEO(5)[8],=WP4LHA(5)[8],=WP4LTA(5)[8],=WP4MAE(5)[8],=WP4MD(5)[8],=WP4MO(5)[8], + =WP4MQF(5)[8],=WP4MWE(5)[8],=WP4MWK(5)[8],=WP4MWS(5)[8],=WP4MXE(5)[8],=WP4MYG(5)[8],=WP4MYK(5)[8], + =WP4NAI(5)[8],=WP4NAQ(5)[8],=WP4NBF(5)[8],=WP4NBG(5)[8],=WP4NFU(5)[8],=WP4NKU(5)[8],=WP4NLQ(5)[8], + =WP4NVL(5)[8],=WP4NWV(5)[8],=WP4NWW(5)[8],=WP4NYU(5)[8],=WP4O/4(5)[8],=WP4O/M(5)[8],=WP4OAT(5)[8], + =WP4OBD(5)[8],=WP4OBH(5)[8],=WP4ODR(5)[8],=WP4ODT(5)[8],=WP4OEO(5)[8],=WP4OFA(5)[8],=WP4OFL(5)[8], + =WP4OHJ(5)[8],=WP4OKI(5)[8],=WP4OLM(5)[8],=WP4OMG(5)[8],=WP4OMV(5)[8],=WP4ONR(5)[8],=WP4OOI(5)[8], + =WP4OPD(5)[8],=WP4OPF(5)[8],=WP4OQH(5)[8],=WP4OTP(5)[8],=WP4OXA(5)[8],=WP4P(5)[8],=WP4PEP(5)[8], + =WP4PR(5)[8],=WP4PUV(5)[8],=WP4PWV(5)[8],=WP4PXG(5)[8],=WP4QER(5)[8],=WP4QGV(5)[8],=WP4QHU(5)[8], + =WP4RRR(5)[8],=WP4TD(5)[8],=WP4TX(5)[8],=WP4UC(5)[8],=WP4UM(5)[8],=WP4UO(5)[8],=WP4VL(5)[8], + =WP4VM(5)[8],=WP4YG(5)[8],=WP4ZW(5)[8], AA5(4)[7],AB5(4)[7],AC5(4)[7],AD5(4)[7],AE5(4)[7],AF5(4)[7],AG5(4)[7],AI5(4)[7],AJ5(4)[7], AK5(4)[7],K5(4)[7],KA5(4)[7],KB5(4)[7],KC5(4)[7],KD5(4)[7],KE5(4)[7],KF5(4)[7],KG5(4)[7], KI5(4)[7],KJ5(4)[7],KK5(4)[7],KM5(4)[7],KN5(4)[7],KO5(4)[7],KQ5(4)[7],KR5(4)[7],KS5(4)[7], @@ -1403,45 +1403,45 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KH6TG(4)[7],=KH6UW(4)[7],=KH7CF(4)[7],=KH7CU(4)[7],=KH7FB(4)[7],=KH7IC(4)[7],=KH7JE(4)[7], =KH7QL(4)[7],=KH7QO(4)[7],=KH8CG(4)[7],=KH9AE(4)[7],=KL0EX(4)[7],=KL0HU(4)[7],=KL0IF(4)[7], =KL0PG(4)[7],=KL0WH(4)[7],=KL0XI(4)[7],=KL0ZY(4)[7],=KL1DA(4)[7],=KL1DJ(4)[7],=KL1DY(4)[7], - =KL1MM(4)[7],=KL1RX(4)[7],=KL1TS(4)[7],=KL1UR(4)[7],=KL1WG(4)[7],=KL1WO(4)[7],=KL1XK(4)[7], - =KL1Y(4)[7],=KL1ZW(4)[7],=KL2AX(4)[7],=KL2AX/5(4)[7],=KL2CD(4)[7],=KL2HC(4)[7],=KL2HN(4)[7], - =KL2MI(4)[7],=KL2OY(4)[7],=KL2RA(4)[7],=KL2RB(4)[7],=KL2TV(4)[7],=KL2UO(4)[7],=KL2UP(4)[7], - =KL2VA(4)[7],=KL2ZJ(4)[7],=KL2ZK(4)[7],=KL3DB(4)[7],=KL3DP(4)[7],=KL3FI(4)[7],=KL3HK(4)[7], - =KL3HX(4)[7],=KL3HZ(4)[7],=KL3JL(4)[7],=KL3KH(4)[7],=KL3KI(4)[7],=KL3TB(4)[7],=KL4JQ(4)[7], - =KL4LS(4)[7],=KL4QZ(4)[7],=KL4RA(4)[7],=KL5L(4)[7],=KL5Z(4)[7],=KL7AH(4)[7],=KL7AU(4)[7], - =KL7AX(4)[7],=KL7BCD(4)[7],=KL7BL(4)[7],=KL7BOB(4)[7],=KL7BX(4)[7],=KL7BZ/5(4)[7],=KL7BZL(4)[7], - =KL7CD(4)[7],=KL7DB(4)[7],=KL7EBE(4)[7],=KL7EMH(4)[7],=KL7EMH/M(4)[7],=KL7EQQ(4)[7],=KL7F(4)[7], - =KL7FB(4)[7],=KL7FHX(4)[7],=KL7FLY(4)[7],=KL7FQR(4)[7],=KL7GNW(4)[7],=KL7HH(4)[7],=KL7IDM(4)[7], - =KL7IK(4)[7],=KL7ITF(4)[7],=KL7IWU(4)[7],=KL7IZW(4)[7],=KL7JAR(4)[7],=KL7JEX(4)[7],=KL7JIU(4)[7], - =KL7JR/5(4)[7],=KL7JW(4)[7],=KL7LJ(4)[7],=KL7LY(4)[7],=KL7MA(4)[7],=KL7ME(4)[7],=KL7ML(4)[7], - =KL7NE(4)[7],=KL7NI(4)[7],=KL7OI(4)[7],=KL7PZ(4)[7],=KL7QC(4)[7],=KL7SG(4)[7],=KL7TN/5(4)[7], - =KL7U(4)[7],=KL7UHF(4)[7],=KL7USI/5(4)[7],=KL7XA(4)[7],=KL7XP(4)[7],=KL7XS(4)[7],=KL7YY/5(4)[7], - =KP2AZ(4)[7],=KP4CV(4)[7],=KP4DJT(4)[7],=KP4FF(4)[7],=KP4FFW(4)[7],=KP4GMC(4)[7],=KP4JE(4)[7], - =KP4JG(4)[7],=KP4JY(4)[7],=KP4YP(4)[7],=KP4YY(4)[7],=NH0V/5(4)[7],=NH2BV(4)[7],=NH2LP(4)[7], - =NH6AZ(4)[7],=NH6CJ(4)[7],=NH6EF(4)[7],=NH6FA(4)[7],=NH6KN(4)[7],=NH6L(4)[7],=NH6MG(4)[7], - =NH6PK(4)[7],=NH6TD(4)[7],=NH6VB(4)[7],=NH6VJ(4)[7],=NH6VR(4)[7],=NH6WL(4)[7],=NH6WL/5(4)[7], - =NH7FO(4)[7],=NH7MV(4)[7],=NH7PZ(4)[7],=NH7R(4)[7],=NH7RO(4)[7],=NH7RO/5(4)[7],=NH7TR(4)[7], - =NH7VA(4)[7],=NH7WB(4)[7],=NL5J(4)[7],=NL7AX(4)[7],=NL7C(4)[7],=NL7CO(4)[7],=NL7CO/5(4)[7], - =NL7DC(4)[7],=NL7HB(4)[7],=NL7IE(4)[7],=NL7JH(4)[7],=NL7JI(4)[7],=NL7JV(4)[7],=NL7JZ(4)[7], - =NL7K/5(4)[7],=NL7KB(4)[7],=NL7LE(4)[7],=NL7NP(4)[7],=NL7OM(4)[7],=NL7PD(4)[7],=NL7RQ(4)[7], - =NL7RQ/5(4)[7],=NL7SI(4)[7],=NL7TO(4)[7],=NL7WY(4)[7],=NL7ZL(4)[7],=NP2EE(4)[7],=NP2PR(4)[7], - =NP2RA(4)[7],=NP3BA(4)[7],=NP3CV(4)[7],=NP3NT(4)[7],=NP3PG(4)[7],=NP3RG(4)[7],=NP3SU(4)[7], - =NP3TY(4)[7],=NP4EA(4)[7],=NP4NQ(4)[7],=NP4NQ/5(4)[7],=NP4RW(4)[7],=NP4RZ(4)[7],=WH2ACT(4)[7], - =WH2ACT/5(4)[7],=WH6ARN(4)[7],=WH6BYJ(4)[7],=WH6BYP(4)[7],=WH6CCQ(4)[7],=WH6CDU(4)[7], - =WH6CUL(4)[7],=WH6DMP(4)[7],=WH6DSR(4)[7],=WH6DZU(4)[7],=WH6ECJ(4)[7],=WH6EMW(4)[7],=WH6EOF(4)[7], - =WH6ERS(4)[7],=WH6EUA(4)[7],=WH6EXQ(4)[7],=WH6FAD(4)[7],=WH6FGK(4)[7],=WH6FGM(4)[7],=WH6FTZ(4)[7], - =WH6FZ/5(4)[7],=WH6FZL(4)[7],=WH6FZN(4)[7],=WH6GBC(4)[7],=WH6GEA(4)[7],=WH6GL(4)[7],=WH6KK(4)[7], - =WH6L/5(4)[7],=WH7DC(4)[7],=WH7DW(4)[7],=WH7IN(4)[7],=WH7R(4)[7],=WH7YM(4)[7],=WH7YN(4)[7], - =WL3WX(4)[7],=WL5H(4)[7],=WL7AIU(4)[7],=WL7AWC(4)[7],=WL7BBV(4)[7],=WL7BKF(4)[7],=WL7BPY(4)[7], - =WL7CA(4)[7],=WL7CJA(4)[7],=WL7CJC(4)[7],=WL7CQE(4)[7],=WL7CTP(4)[7],=WL7CTQ(4)[7],=WL7D(4)[7], - =WL7FC(4)[7],=WL7FE(4)[7],=WL7FT(4)[7],=WL7FT/5(4)[7],=WL7K/5(4)[7],=WL7ME(4)[7],=WL7MQ/5(4)[7], - =WL7OP(4)[7],=WL7OU(4)[7],=WL7SG(4)[7],=WL7W(4)[7],=WL7WN(4)[7],=WL7XI(4)[7],=WL7XR(4)[7], - =WP2AHG(4)[7],=WP2N(4)[7],=WP2U(4)[7],=WP2WP(4)[7],=WP3AL(4)[7],=WP3HG(4)[7],=WP3JM(4)[7], - =WP3JN(4)[7],=WP4A(4)[7],=WP4ADA(4)[7],=WP4APJ(4)[7],=WP4BAB(4)[7],=WP4BAT(4)[7],=WP4CJY(4)[7], - =WP4EVA(4)[7],=WP4EVL(4)[7],=WP4IXT(4)[7],=WP4IYJ(4)[7],=WP4KSP(4)[7],=WP4KTF(4)[7],=WP4KUW(4)[7], - =WP4LKA(4)[7],=WP4LQR(4)[7],=WP4MJP(4)[7],=WP4MYI(4)[7],=WP4MZR(4)[7],=WP4NAK(4)[7],=WP4NEP(4)[7], - =WP4NQA(4)[7],=WP4NQL(4)[7],=WP4OEB(4)[7],=WP4OUE(4)[7],=WP4OZK(4)[7],=WP4OZP(4)[7],=WP4QLB(4)[7], - =WP4RON(4)[7], + =KL1DZ(4)[7],=KL1MM(4)[7],=KL1RX(4)[7],=KL1TS(4)[7],=KL1UR(4)[7],=KL1WG(4)[7],=KL1WO(4)[7], + =KL1XK(4)[7],=KL1Y(4)[7],=KL1ZW(4)[7],=KL2AX(4)[7],=KL2AX/5(4)[7],=KL2CD(4)[7],=KL2HC(4)[7], + =KL2HN(4)[7],=KL2MI(4)[7],=KL2OY(4)[7],=KL2RA(4)[7],=KL2RB(4)[7],=KL2TV(4)[7],=KL2UO(4)[7], + =KL2UP(4)[7],=KL2VA(4)[7],=KL2ZJ(4)[7],=KL2ZK(4)[7],=KL3DB(4)[7],=KL3DP(4)[7],=KL3FI(4)[7], + =KL3HK(4)[7],=KL3HX(4)[7],=KL3HZ(4)[7],=KL3JL(4)[7],=KL3KH(4)[7],=KL3KI(4)[7],=KL3TB(4)[7], + =KL4JQ(4)[7],=KL4LS(4)[7],=KL4QZ(4)[7],=KL4RA(4)[7],=KL5L(4)[7],=KL5Z(4)[7],=KL7AH(4)[7], + =KL7AU(4)[7],=KL7AX(4)[7],=KL7BCD(4)[7],=KL7BL(4)[7],=KL7BOB(4)[7],=KL7BX(4)[7],=KL7BZ/5(4)[7], + =KL7BZL(4)[7],=KL7CD(4)[7],=KL7DB(4)[7],=KL7EBE(4)[7],=KL7EMH(4)[7],=KL7EMH/M(4)[7],=KL7EQQ(4)[7], + =KL7F(4)[7],=KL7FB(4)[7],=KL7FHX(4)[7],=KL7FLY(4)[7],=KL7FQR(4)[7],=KL7GNW(4)[7],=KL7HH(4)[7], + =KL7IDM(4)[7],=KL7IK(4)[7],=KL7ITF(4)[7],=KL7IWU(4)[7],=KL7IZW(4)[7],=KL7JAR(4)[7],=KL7JEX(4)[7], + =KL7JIU(4)[7],=KL7JR/5(4)[7],=KL7JW(4)[7],=KL7LJ(4)[7],=KL7LY(4)[7],=KL7MA(4)[7],=KL7ME(4)[7], + =KL7ML(4)[7],=KL7NE(4)[7],=KL7NI(4)[7],=KL7OI(4)[7],=KL7PZ(4)[7],=KL7QC(4)[7],=KL7SG(4)[7], + =KL7TN/5(4)[7],=KL7U(4)[7],=KL7UHF(4)[7],=KL7USI/5(4)[7],=KL7XA(4)[7],=KL7XP(4)[7],=KL7XS(4)[7], + =KL7YY/5(4)[7],=KP2AZ(4)[7],=KP4CV(4)[7],=KP4DJT(4)[7],=KP4FF(4)[7],=KP4FFW(4)[7],=KP4GMC(4)[7], + =KP4JE(4)[7],=KP4JG(4)[7],=KP4JY(4)[7],=KP4YP(4)[7],=KP4YY(4)[7],=NH0V/5(4)[7],=NH2BV(4)[7], + =NH2LP(4)[7],=NH6AZ(4)[7],=NH6CJ(4)[7],=NH6EF(4)[7],=NH6FA(4)[7],=NH6KN(4)[7],=NH6L(4)[7], + =NH6MG(4)[7],=NH6PK(4)[7],=NH6TD(4)[7],=NH6VB(4)[7],=NH6VJ(4)[7],=NH6VR(4)[7],=NH6WL(4)[7], + =NH6WL/5(4)[7],=NH7FO(4)[7],=NH7MV(4)[7],=NH7PZ(4)[7],=NH7R(4)[7],=NH7RO(4)[7],=NH7RO/5(4)[7], + =NH7TR(4)[7],=NH7VA(4)[7],=NH7WB(4)[7],=NL5J(4)[7],=NL7AX(4)[7],=NL7C(4)[7],=NL7CO(4)[7], + =NL7CO/5(4)[7],=NL7DC(4)[7],=NL7HB(4)[7],=NL7IE(4)[7],=NL7JH(4)[7],=NL7JI(4)[7],=NL7JV(4)[7], + =NL7JZ(4)[7],=NL7K/5(4)[7],=NL7KB(4)[7],=NL7LE(4)[7],=NL7NP(4)[7],=NL7OM(4)[7],=NL7PD(4)[7], + =NL7RQ(4)[7],=NL7RQ/5(4)[7],=NL7SI(4)[7],=NL7TO(4)[7],=NL7WY(4)[7],=NL7ZL(4)[7],=NP2EE(4)[7], + =NP2PR(4)[7],=NP2RA(4)[7],=NP3BA(4)[7],=NP3CV(4)[7],=NP3NT(4)[7],=NP3PG(4)[7],=NP3RG(4)[7], + =NP3SU(4)[7],=NP3TY(4)[7],=NP4EA(4)[7],=NP4NQ(4)[7],=NP4NQ/5(4)[7],=NP4RW(4)[7],=NP4RZ(4)[7], + =WH2ACT(4)[7],=WH2ACT/5(4)[7],=WH6ARN(4)[7],=WH6BYJ(4)[7],=WH6BYP(4)[7],=WH6CCQ(4)[7], + =WH6CDU(4)[7],=WH6CUL(4)[7],=WH6DMP(4)[7],=WH6DSR(4)[7],=WH6DZU(4)[7],=WH6ECJ(4)[7],=WH6EMW(4)[7], + =WH6EOF(4)[7],=WH6ERS(4)[7],=WH6EUA(4)[7],=WH6EXQ(4)[7],=WH6FAD(4)[7],=WH6FGK(4)[7],=WH6FGM(4)[7], + =WH6FTZ(4)[7],=WH6FZ/5(4)[7],=WH6FZL(4)[7],=WH6FZN(4)[7],=WH6GBC(4)[7],=WH6GEA(4)[7],=WH6GL(4)[7], + =WH6KK(4)[7],=WH6L/5(4)[7],=WH7DC(4)[7],=WH7DW(4)[7],=WH7IN(4)[7],=WH7R(4)[7],=WH7YM(4)[7], + =WH7YN(4)[7],=WL3WX(4)[7],=WL5H(4)[7],=WL7AIU(4)[7],=WL7AWC(4)[7],=WL7BBV(4)[7],=WL7BKF(4)[7], + =WL7BPY(4)[7],=WL7CA(4)[7],=WL7CJA(4)[7],=WL7CJC(4)[7],=WL7CQE(4)[7],=WL7CTP(4)[7],=WL7CTQ(4)[7], + =WL7D(4)[7],=WL7FC(4)[7],=WL7FE(4)[7],=WL7FT(4)[7],=WL7FT/5(4)[7],=WL7K/5(4)[7],=WL7ME(4)[7], + =WL7MQ/5(4)[7],=WL7OP(4)[7],=WL7OU(4)[7],=WL7SG(4)[7],=WL7W(4)[7],=WL7WN(4)[7],=WL7XI(4)[7], + =WL7XR(4)[7],=WP2AHG(4)[7],=WP2N(4)[7],=WP2U(4)[7],=WP2WP(4)[7],=WP3AL(4)[7],=WP3HG(4)[7], + =WP3JM(4)[7],=WP3JN(4)[7],=WP4A(4)[7],=WP4ADA(4)[7],=WP4APJ(4)[7],=WP4BAB(4)[7],=WP4BAT(4)[7], + =WP4CJY(4)[7],=WP4EVA(4)[7],=WP4EVL(4)[7],=WP4IXT(4)[7],=WP4IYJ(4)[7],=WP4KSP(4)[7],=WP4KTF(4)[7], + =WP4KUW(4)[7],=WP4LKA(4)[7],=WP4LQR(4)[7],=WP4MJP(4)[7],=WP4MYI(4)[7],=WP4MZR(4)[7],=WP4NAK(4)[7], + =WP4NEP(4)[7],=WP4NQA(4)[7],=WP4NQL(4)[7],=WP4OEB(4)[7],=WP4OFH(4)[7],=WP4OUE(4)[7],=WP4OZK(4)[7], + =WP4OZP(4)[7],=WP4QLB(4)[7],=WP4RON(4)[7], AA6(3)[6],AB6(3)[6],AC6(3)[6],AD6(3)[6],AE6(3)[6],AF6(3)[6],AG6(3)[6],AI6(3)[6],AJ6(3)[6], AK6(3)[6],K6(3)[6],KA6(3)[6],KB6(3)[6],KC6(3)[6],KD6(3)[6],KE6(3)[6],KF6(3)[6],KG6(3)[6], KI6(3)[6],KJ6(3)[6],KK6(3)[6],KM6(3)[6],KN6(3)[6],KO6(3)[6],KQ6(3)[6],KR6(3)[6],KS6(3)[6], @@ -1519,11 +1519,11 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =AH2DP(3)[6],=AH2DS(3)[6],=AH2S(3)[6],=AH6B/7(3)[6],=AH6D(3)[6],=AH6ET(3)[6],=AH6EZ(3)[6], =AH6EZ/7(3)[6],=AH6FC/7(3)[6],=AH6GA(3)[6],=AH6HK(3)[6],=AH6HS(3)[6],=AH6HX(3)[6],=AH6I(3)[6], =AH6IP(3)[6],=AH6JS(3)[6],=AH6LA(3)[6],=AH6LE(3)[6],=AH6LE/7(3)[6],=AH6NJ(3)[6],=AH6NR(3)[6], - =AH6OD(3)[6],=AH6PJ(3)[6],=AH6PW(3)[6],=AH6QW(3)[6],=AH6RI/7(3)[6],=AH6SV(3)[6],=AH6VM(3)[6], - =AH6Y(3)[6],=AH7MP(3)[6],=AH7Q(3)[6],=AH8AC(3)[6],=AH8DX(3)[6],=AH8K(3)[6],=AH9A(3)[6], - =AH9AC(3)[6],=AL0AA(3)[6],=AL0FT(3)[6],=AL0H(3)[6],=AL0X(3)[6],=AL1N(3)[6],=AL1P(3)[6], - =AL1R(3)[6],=AL1VE(3)[6],=AL2B(3)[6],=AL2GR(3)[6],=AL2I(3)[6],=AL2N(3)[6],=AL3L(3)[6],=AL4D(3)[6], - =AL4F(3)[6],=AL4K(3)[6],=AL4Q/7(3)[6],=AL4R(3)[6],=AL5B(3)[6],=AL5W(3)[6],=AL6U(3)[6], + =AH6OD(3)[6],=AH6P(3)[6],=AH6PJ(3)[6],=AH6PW(3)[6],=AH6QW(3)[6],=AH6RI/7(3)[6],=AH6SV(3)[6], + =AH6VM(3)[6],=AH6Y(3)[6],=AH7MP(3)[6],=AH7Q(3)[6],=AH8AC(3)[6],=AH8DX(3)[6],=AH8K(3)[6], + =AH9A(3)[6],=AH9AC(3)[6],=AL0AA(3)[6],=AL0FT(3)[6],=AL0H(3)[6],=AL0X(3)[6],=AL1N(3)[6], + =AL1P(3)[6],=AL1R(3)[6],=AL1VE(3)[6],=AL2B(3)[6],=AL2GR(3)[6],=AL2I(3)[6],=AL2N(3)[6],=AL3L(3)[6], + =AL4D(3)[6],=AL4F(3)[6],=AL4K(3)[6],=AL4Q/7(3)[6],=AL4R(3)[6],=AL5B(3)[6],=AL5W(3)[6],=AL6U(3)[6], =AL7AA(3)[6],=AL7AN(3)[6],=AL7AW(3)[6],=AL7BN(3)[6],=AL7BQ(3)[6],=AL7CC(3)[6],=AL7CG(3)[6], =AL7CM(3)[6],=AL7CM/7(3)[6],=AL7CR(3)[6],=AL7CS(3)[6],=AL7D(3)[6],=AL7D/7(3)[6],=AL7D/P(3)[6], =AL7D/R(3)[6],=AL7DD(3)[6],=AL7DU(3)[6],=AL7EI(3)[6],=AL7EJ(3)[6],=AL7FA(3)[6],=AL7FB(3)[6], @@ -1558,80 +1558,81 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KL0PC(3)[6],=KL0PP(3)[6],=KL0QD(3)[6],=KL0RA(3)[6],=KL0SA(3)[6],=KL0SZ(3)[6],=KL0TQ(3)[6], =KL0TR(3)[6],=KL0TU(3)[6],=KL0VB(3)[6],=KL0VZ(3)[6],=KL0WN(3)[6],=KL0ZF(3)[6],=KL0ZL(3)[6], =KL1AA(3)[6],=KL1AE(3)[6],=KL1AK(3)[6],=KL1CQ(3)[6],=KL1DO(3)[6],=KL1DW(3)[6],=KL1ED(3)[6], - =KL1HS(3)[6],=KL1JF(3)[6],=KL1K(3)[6],=KL1KU(3)[6],=KL1LE(3)[6],=KL1LZ(3)[6],=KL1MF(3)[6], - =KL1OH(3)[6],=KL1QL(3)[6],=KL1RH(3)[6],=KL1RV(3)[6],=KL1SF/7(3)[6],=KL1SO(3)[6],=KL1SP(3)[6], - =KL1U(3)[6],=KL1UA(3)[6],=KL1UM(3)[6],=KL1XI(3)[6],=KL1YO(3)[6],=KL1YY/7(3)[6],=KL1ZN(3)[6], - =KL1ZP(3)[6],=KL1ZR(3)[6],=KL2A(3)[6],=KL2A/7(3)[6],=KL2BO(3)[6],=KL2BP(3)[6],=KL2BW(3)[6], - =KL2BY(3)[6],=KL2BZ(3)[6],=KL2FD(3)[6],=KL2FL(3)[6],=KL2JY(3)[6],=KL2K(3)[6],=KL2KY(3)[6], - =KL2LA(3)[6],=KL2LN(3)[6],=KL2LT(3)[6],=KL2MA(3)[6],=KL2MB(3)[6],=KL2MP(3)[6],=KL2NJ(3)[6], - =KL2NU(3)[6],=KL2NW(3)[6],=KL2OH(3)[6],=KL2OJ(3)[6],=KL2P(3)[6],=KL2QE(3)[6],=KL2TR(3)[6], - =KL2TZ(3)[6],=KL2VK(3)[6],=KL2WE(3)[6],=KL2XQ(3)[6],=KL2YH(3)[6],=KL2YQ(3)[6],=KL3DL(3)[6], - =KL3ET(3)[6],=KL3EZ(3)[6],=KL3FE(3)[6],=KL3FY(3)[6],=KL3HL(3)[6],=KL3IC(3)[6],=KL3II(3)[6], - =KL3IO(3)[6],=KL3ML(3)[6],=KL3NE(3)[6],=KL3NO(3)[6],=KL3OQ(3)[6],=KL3PD(3)[6],=KL3TW(3)[6], - =KL3TY(3)[6],=KL3VJ(3)[6],=KL3XS(3)[6],=KL4BQ(3)[6],=KL4BS(3)[6],=KL4FX(3)[6],=KL4KF(3)[6], - =KL4LB(3)[6],=KL4NG(3)[6],=KL4QJ(3)[6],=KL4RKH(3)[6],=KL4RY(3)[6],=KL4YFD(3)[6],=KL7AB(3)[6], - =KL7AD(3)[6],=KL7AW(3)[6],=KL7BB(3)[6],=KL7BD(3)[6],=KL7BDC(3)[6],=KL7BH(3)[6],=KL7BJ(3)[6], - =KL7BR(3)[6],=KL7BS(3)[6],=KL7BT(3)[6],=KL7BUR(3)[6],=KL7BXP(3)[6],=KL7C(3)[6],=KL7CPO(3)[6], - =KL7CR(3)[6],=KL7CT(3)[6],=KL7CY(3)[6],=KL7DC(3)[6],=KL7DF(3)[6],=KL7DI(3)[6],=KL7DK(3)[6], - =KL7DLG(3)[6],=KL7DSI(3)[6],=KL7DZQ(3)[6],=KL7EBN(3)[6],=KL7EF(3)[6],=KL7EFL(3)[6],=KL7EH(3)[6], - =KL7EIN(3)[6],=KL7EU(3)[6],=KL7FDQ(3)[6],=KL7FDQ/7(3)[6],=KL7FIR(3)[6],=KL7FLR(3)[6], - =KL7FOZ(3)[6],=KL7FRQ(3)[6],=KL7FS(3)[6],=KL7GA(3)[6],=KL7GCS(3)[6],=KL7GKY(3)[6],=KL7GRF(3)[6], - =KL7GT(3)[6],=KL7GU(3)[6],=KL7HB(3)[6],=KL7HBV(3)[6],=KL7HFI/7(3)[6],=KL7HFV(3)[6],=KL7HI(3)[6], - =KL7HJR(3)[6],=KL7HLF(3)[6],=KL7HM(3)[6],=KL7HMK(3)[6],=KL7HQL(3)[6],=KL7HSR(3)[6],=KL7IAL(3)[6], - =KL7IBT(3)[6],=KL7IDY(3)[6],=KL7IEI(3)[6],=KL7IFK(3)[6],=KL7IG(3)[6],=KL7IGB(3)[6],=KL7IHK(3)[6], - =KL7IIK(3)[6],=KL7IKV(3)[6],=KL7IL(3)[6],=KL7IME(3)[6],=KL7IOW(3)[6],=KL7IPV(3)[6],=KL7ISE(3)[6], - =KL7IUX(3)[6],=KL7IWC/7(3)[6],=KL7IZC(3)[6],=KL7IZH(3)[6],=KL7JAV(3)[6],=KL7JBB(3)[6], - =KL7JDQ(3)[6],=KL7JEA(3)[6],=KL7JES(3)[6],=KL7JIJ(3)[6],=KL7JJE(3)[6],=KL7JKV(3)[6],=KL7KA(3)[6], - =KL7KG/7(3)[6],=KL7LG(3)[6],=KL7LI(3)[6],=KL7LX(3)[6],=KL7LZ(3)[6],=KL7M(3)[6],=KL7MY(3)[6], - =KL7MZ(3)[6],=KL7NA(3)[6],=KL7NP(3)[6],=KL7NP/7(3)[6],=KL7OA(3)[6],=KL7OF(3)[6],=KL7OL(3)[6], - =KL7OR(3)[6],=KL7OR/7(3)[6],=KL7OS(3)[6],=KL7OY(3)[6],=KL7PC(3)[6],=KL7PO(3)[6],=KL7QA(3)[6], - =KL7QK(3)[6],=KL7QK/140(3)[6],=KL7QK/7(3)[6],=KL7QR(3)[6],=KL7QR/7(3)[6],=KL7R(3)[6],=KL7RC(3)[6], - =KL7RK(3)[6],=KL7RM(3)[6],=KL7RN(3)[6],=KL7RS(3)[6],=KL7S(3)[6],=KL7SK(3)[6],=KL7SP(3)[6], - =KL7SV(3)[6],=KL7T(3)[6],=KL7TU(3)[6],=KL7UP(3)[6],=KL7UT(3)[6],=KL7VK(3)[6],=KL7VL(3)[6], - =KL7VN(3)[6],=KL7VQ(3)[6],=KL7WC(3)[6],=KL7WG(3)[6],=KL7WM(3)[6],=KL7WN(3)[6],=KL7WP(3)[6], - =KL7WP/7(3)[6],=KL7WT(3)[6],=KL7XL(3)[6],=KL7YJ(3)[6],=KL7YQ(3)[6],=KL7YY/M(3)[6],=KL7ZH(3)[6], - =KL7ZW(3)[6],=KL8RV(3)[6],=KL8SU(3)[6],=KL9PC(3)[6],=KP2BX(3)[6],=KP2CB(3)[6],=KP2CT(3)[6], - =KP4EFZ(3)[6],=KP4UZ(3)[6],=KP4X(3)[6],=NH0F(3)[6],=NH0K(3)[6],=NH0O(3)[6],=NH2DM(3)[6], - =NH2JE(3)[6],=NH2KR(3)[6],=NH6AD(3)[6],=NH6AJ(3)[6],=NH6AY(3)[6],=NH6B(3)[6],=NH6BF(3)[6], - =NH6CI(3)[6],=NH6CO(3)[6],=NH6DQ(3)[6],=NH6DX(3)[6],=NH6F(3)[6],=NH6FF(3)[6],=NH6GZ(3)[6], - =NH6HE(3)[6],=NH6HZ(3)[6],=NH6KF(3)[6],=NH6LF(3)[6],=NH6LM(3)[6],=NH6NS(3)[6],=NH6SO(3)[6], - =NH6U(3)[6],=NH6WE(3)[6],=NH6XN(3)[6],=NH6XP(3)[6],=NH6YR(3)[6],=NH6Z(3)[6],=NH6ZA(3)[6], - =NH6ZE(3)[6],=NH7DZ(3)[6],=NH7FU(3)[6],=NH7FZ(3)[6],=NH7L(3)[6],=NH7M(3)[6],=NH7MY(3)[6], - =NH7N(3)[6],=NH7ND(3)[6],=NH7NJ/7(3)[6],=NH7OC(3)[6],=NH7PL(3)[6],=NH7RS(3)[6],=NH7S(3)[6], - =NH7SH(3)[6],=NH7TG(3)[6],=NH7VZ(3)[6],=NH7W(3)[6],=NH7WT(3)[6],=NH7WU(3)[6],=NH7YE(3)[6], - =NH7YI(3)[6],=NH8A(3)[6],=NL5L(3)[6],=NL7AH(3)[6],=NL7AR(3)[6],=NL7AZ(3)[6],=NL7BI(3)[6], - =NL7CH(3)[6],=NL7D(3)[6],=NL7D/7(3)[6],=NL7DH(3)[6],=NL7DY(3)[6],=NL7EO(3)[6],=NL7FQ(3)[6], - =NL7FX(3)[6],=NL7FY(3)[6],=NL7GM(3)[6],=NL7GN(3)[6],=NL7GO(3)[6],=NL7GU(3)[6],=NL7GW(3)[6], - =NL7HH(3)[6],=NL7HK(3)[6],=NL7HQ(3)[6],=NL7HU(3)[6],=NL7IN(3)[6],=NL7JE(3)[6],=NL7JJ(3)[6], - =NL7JN(3)[6],=NL7KV(3)[6],=NL7LI(3)[6],=NL7MS(3)[6],=NL7MT(3)[6],=NL7NL(3)[6],=NL7OF(3)[6], - =NL7PN(3)[6],=NL7QI(3)[6],=NL7RL(3)[6],=NL7RN(3)[6],=NL7TK(3)[6],=NL7UE(3)[6],=NL7US(3)[6], - =NL7VS(3)[6],=NL7WD(3)[6],=NL7WJ(3)[6],=NL7XX(3)[6],=NL7ZM(3)[6],=NL7ZN(3)[6],=NL7ZP(3)[6], - =NP2CT(3)[6],=NP2KL(3)[6],=NP2LK(3)[6],=NP2X/7(3)[6],=NP3PH(3)[6],=NP4AI/M(3)[6],=NP4ES(3)[6], - =NP4FP(3)[6],=NP4I(3)[6],=NP4JV(3)[6],=NP4JV/7(3)[6],=VA2GLB/P(3)[6],=WH0AAM(3)[6],=WH0J(3)[6], - =WH2ACV(3)[6],=WH2AJF(3)[6],=WH6ANB(3)[6],=WH6ARU(3)[6],=WH6ASB(3)[6],=WH6B(3)[6],=WH6BDR(3)[6], - =WH6BLM(3)[6],=WH6BPL(3)[6],=WH6BPU(3)[6],=WH6CF(3)[6],=WH6CMS(3)[6],=WH6CN(3)[6],=WH6CUS(3)[6], - =WH6CWD(3)[6],=WH6CXB(3)[6],=WH6CXE(3)[6],=WH6CXN(3)[6],=WH6CYB(3)[6],=WH6CZ(3)[6],=WH6DAP(3)[6], - =WH6DAY(3)[6],=WH6DJO(3)[6],=WH6DKC(3)[6],=WH6DKG(3)[6],=WH6DKO(3)[6],=WH6DLQ(3)[6],=WH6DMS(3)[6], - =WH6DQ(3)[6],=WH6DRP(3)[6],=WH6DST(3)[6],=WH6DTH(3)[6],=WH6EEC(3)[6],=WH6EEG(3)[6],=WH6EGM(3)[6], - =WH6EHW(3)[6],=WH6EJV(3)[6],=WH6EQB(3)[6],=WH6EQE(3)[6],=WH6EQH(3)[6],=WH6ESS(3)[6],=WH6ETO(3)[6], - =WH6EWE(3)[6],=WH6FCT(3)[6],=WH6FEU(3)[6],=WH6FJR(3)[6],=WH6FL(3)[6],=WH6FOJ(3)[6],=WH6FPR(3)[6], - =WH6FPV(3)[6],=WH6FQ(3)[6],=WH6FQK(3)[6],=WH6GCT(3)[6],=WH6GEV(3)[6],=WH6OL(3)[6],=WH6OY(3)[6], - =WH6QV(3)[6],=WH6SD(3)[6],=WH6SR(3)[6],=WH6TI(3)[6],=WH6U(3)[6],=WH6XV(3)[6],=WH6YT(3)[6], - =WH6YX(3)[6],=WH6ZR(3)[6],=WH6ZV(3)[6],=WH7A(3)[6],=WH7CY(3)[6],=WH7DA(3)[6],=WH7DB(3)[6], - =WH7DE(3)[6],=WH7G(3)[6],=WH7GC(3)[6],=WH7GY(3)[6],=WH7HU(3)[6],=WH7LB(3)[6],=WH7NS(3)[6], - =WH7OK(3)[6],=WH7P(3)[6],=WH7RG(3)[6],=WH7TC(3)[6],=WH7TN(3)[6],=WH7TR(3)[6],=WH7U(3)[6], - =WH7UP(3)[6],=WH7WP(3)[6],=WH7WT(3)[6],=WH7XP(3)[6],=WH8AAG(3)[6],=WL7AAW(3)[6],=WL7AL(3)[6], - =WL7AP(3)[6],=WL7AQ(3)[6],=WL7AUY(3)[6],=WL7AWD(3)[6],=WL7AXI(3)[6],=WL7AZG(3)[6],=WL7AZL(3)[6], - =WL7BCR(3)[6],=WL7BHR(3)[6],=WL7BLM(3)[6],=WL7BM(3)[6],=WL7BNQ(3)[6],=WL7BON(3)[6],=WL7BOO(3)[6], - =WL7BSW(3)[6],=WL7BUI(3)[6],=WL7BVN(3)[6],=WL7BVS(3)[6],=WL7CAZ(3)[6],=WL7CBF(3)[6],=WL7CES(3)[6], - =WL7COQ(3)[6],=WL7CPE(3)[6],=WL7CPI(3)[6],=WL7CQX(3)[6],=WL7CRJ(3)[6],=WL7CSL(3)[6],=WL7CTB(3)[6], - =WL7CTC(3)[6],=WL7CTE(3)[6],=WL7DD(3)[6],=WL7FA(3)[6],=WL7FR(3)[6],=WL7FU(3)[6],=WL7H(3)[6], - =WL7HE(3)[6],=WL7HK(3)[6],=WL7HL(3)[6],=WL7IQ(3)[6],=WL7IS(3)[6],=WL7JG(3)[6],=WL7JM(3)[6], - =WL7K(3)[6],=WL7K/7(3)[6],=WL7K/M(3)[6],=WL7LB(3)[6],=WL7LK(3)[6],=WL7OA(3)[6],=WL7P(3)[6], - =WL7PJ(3)[6],=WL7QC(3)[6],=WL7QX(3)[6],=WL7RV/140(3)[6],=WL7SD(3)[6],=WL7SO(3)[6],=WL7SV(3)[6], - =WL7T/P(3)[6],=WL7VK(3)[6],=WL7VV(3)[6],=WL7WB(3)[6],=WL7WF(3)[6],=WL7WG(3)[6],=WL7WK(3)[6], - =WL7WM(3)[6],=WL7WU(3)[6],=WL7XE(3)[6],=WL7XJ(3)[6],=WL7XN(3)[6],=WL7XW(3)[6],=WL7Z(3)[6], - =WL7ZM(3)[6],=WP2ADG(3)[6],=WP3ZO(3)[6],=WP4DYP(3)[6],=WP4NBP(3)[6], + =KL1HF(3)[6],=KL1HS(3)[6],=KL1JF(3)[6],=KL1K(3)[6],=KL1KU(3)[6],=KL1LE(3)[6],=KL1LZ(3)[6], + =KL1MF(3)[6],=KL1OH(3)[6],=KL1QL(3)[6],=KL1RH(3)[6],=KL1RV(3)[6],=KL1SF/7(3)[6],=KL1SO(3)[6], + =KL1SP(3)[6],=KL1U(3)[6],=KL1UA(3)[6],=KL1UM(3)[6],=KL1XI(3)[6],=KL1YO(3)[6],=KL1YY/7(3)[6], + =KL1ZN(3)[6],=KL1ZP(3)[6],=KL1ZR(3)[6],=KL2A(3)[6],=KL2A/7(3)[6],=KL2BO(3)[6],=KL2BP(3)[6], + =KL2BW(3)[6],=KL2BY(3)[6],=KL2BZ(3)[6],=KL2FD(3)[6],=KL2FL(3)[6],=KL2JY(3)[6],=KL2K(3)[6], + =KL2KY(3)[6],=KL2LA(3)[6],=KL2LN(3)[6],=KL2LT(3)[6],=KL2MA(3)[6],=KL2MB(3)[6],=KL2MP(3)[6], + =KL2NJ(3)[6],=KL2NU(3)[6],=KL2NW(3)[6],=KL2OH(3)[6],=KL2OJ(3)[6],=KL2P(3)[6],=KL2QE(3)[6], + =KL2TR(3)[6],=KL2TZ(3)[6],=KL2VK(3)[6],=KL2WE(3)[6],=KL2XQ(3)[6],=KL2YH(3)[6],=KL2YQ(3)[6], + =KL3DL(3)[6],=KL3ET(3)[6],=KL3EZ(3)[6],=KL3FE(3)[6],=KL3FY(3)[6],=KL3HL(3)[6],=KL3HM(3)[6], + =KL3HN(3)[6],=KL3IC(3)[6],=KL3II(3)[6],=KL3IO(3)[6],=KL3ML(3)[6],=KL3NE(3)[6],=KL3NO(3)[6], + =KL3OQ(3)[6],=KL3PD(3)[6],=KL3RH(3)[6],=KL3TW(3)[6],=KL3TY(3)[6],=KL3VJ(3)[6],=KL3XS(3)[6], + =KL4BQ(3)[6],=KL4BS(3)[6],=KL4FX(3)[6],=KL4KF(3)[6],=KL4LB(3)[6],=KL4NG(3)[6],=KL4QJ(3)[6], + =KL4RKH(3)[6],=KL4RY(3)[6],=KL4YFD(3)[6],=KL7AB(3)[6],=KL7AD(3)[6],=KL7AW(3)[6],=KL7BB(3)[6], + =KL7BD(3)[6],=KL7BDC(3)[6],=KL7BH(3)[6],=KL7BJ(3)[6],=KL7BR(3)[6],=KL7BS(3)[6],=KL7BT(3)[6], + =KL7BUR(3)[6],=KL7BXP(3)[6],=KL7C(3)[6],=KL7CPO(3)[6],=KL7CR(3)[6],=KL7CT(3)[6],=KL7CY(3)[6], + =KL7DC(3)[6],=KL7DF(3)[6],=KL7DI(3)[6],=KL7DK(3)[6],=KL7DLG(3)[6],=KL7DSI(3)[6],=KL7DZQ(3)[6], + =KL7EBN(3)[6],=KL7EF(3)[6],=KL7EFL(3)[6],=KL7EH(3)[6],=KL7EIN(3)[6],=KL7EU(3)[6],=KL7FDQ(3)[6], + =KL7FDQ/7(3)[6],=KL7FIR(3)[6],=KL7FLR(3)[6],=KL7FOZ(3)[6],=KL7FRQ(3)[6],=KL7FS(3)[6],=KL7GA(3)[6], + =KL7GCS(3)[6],=KL7GKY(3)[6],=KL7GRF(3)[6],=KL7GT(3)[6],=KL7GU(3)[6],=KL7HB(3)[6],=KL7HBV(3)[6], + =KL7HFI/7(3)[6],=KL7HFV(3)[6],=KL7HI(3)[6],=KL7HJR(3)[6],=KL7HLF(3)[6],=KL7HM(3)[6],=KL7HMK(3)[6], + =KL7HQL(3)[6],=KL7HSR(3)[6],=KL7IAL(3)[6],=KL7IBT(3)[6],=KL7IDY(3)[6],=KL7IEI(3)[6],=KL7IFK(3)[6], + =KL7IG(3)[6],=KL7IGB(3)[6],=KL7IHK(3)[6],=KL7IIK(3)[6],=KL7IKV(3)[6],=KL7IL(3)[6],=KL7IME(3)[6], + =KL7IOW(3)[6],=KL7IPV(3)[6],=KL7ISE(3)[6],=KL7IUX(3)[6],=KL7IWC/7(3)[6],=KL7IZC(3)[6], + =KL7IZH(3)[6],=KL7JAV(3)[6],=KL7JBB(3)[6],=KL7JDQ(3)[6],=KL7JEA(3)[6],=KL7JES(3)[6],=KL7JIJ(3)[6], + =KL7JJE(3)[6],=KL7JKV(3)[6],=KL7KA(3)[6],=KL7KG/7(3)[6],=KL7LG(3)[6],=KL7LI(3)[6],=KL7LX(3)[6], + =KL7LZ(3)[6],=KL7M(3)[6],=KL7MY(3)[6],=KL7MZ(3)[6],=KL7NA(3)[6],=KL7NP(3)[6],=KL7NP/7(3)[6], + =KL7OA(3)[6],=KL7OF(3)[6],=KL7OL(3)[6],=KL7OR(3)[6],=KL7OR/7(3)[6],=KL7OS(3)[6],=KL7OY(3)[6], + =KL7PC(3)[6],=KL7PO(3)[6],=KL7QA(3)[6],=KL7QK(3)[6],=KL7QK/140(3)[6],=KL7QK/7(3)[6],=KL7QR(3)[6], + =KL7QR/7(3)[6],=KL7R(3)[6],=KL7RC(3)[6],=KL7RK(3)[6],=KL7RM(3)[6],=KL7RN(3)[6],=KL7RS(3)[6], + =KL7S(3)[6],=KL7SK(3)[6],=KL7SP(3)[6],=KL7SV(3)[6],=KL7T(3)[6],=KL7TU(3)[6],=KL7UP(3)[6], + =KL7UT(3)[6],=KL7VK(3)[6],=KL7VL(3)[6],=KL7VN(3)[6],=KL7VQ(3)[6],=KL7WC(3)[6],=KL7WG(3)[6], + =KL7WM(3)[6],=KL7WN(3)[6],=KL7WP(3)[6],=KL7WP/7(3)[6],=KL7WT(3)[6],=KL7XL(3)[6],=KL7YJ(3)[6], + =KL7YQ(3)[6],=KL7YY/M(3)[6],=KL7ZH(3)[6],=KL7ZW(3)[6],=KL8RV(3)[6],=KL8SU(3)[6],=KL9PC(3)[6], + =KP2BX(3)[6],=KP2CB(3)[6],=KP2CT(3)[6],=KP4EFZ(3)[6],=KP4UZ(3)[6],=KP4X(3)[6],=NH0F(3)[6], + =NH0K(3)[6],=NH0O(3)[6],=NH2DM(3)[6],=NH2JE(3)[6],=NH2KR(3)[6],=NH6AD(3)[6],=NH6AJ(3)[6], + =NH6AY(3)[6],=NH6B(3)[6],=NH6BF(3)[6],=NH6CI(3)[6],=NH6CO(3)[6],=NH6DQ(3)[6],=NH6DX(3)[6], + =NH6F(3)[6],=NH6FF(3)[6],=NH6GZ(3)[6],=NH6HE(3)[6],=NH6HZ(3)[6],=NH6KF(3)[6],=NH6LF(3)[6], + =NH6LM(3)[6],=NH6NS(3)[6],=NH6SO(3)[6],=NH6U(3)[6],=NH6WE(3)[6],=NH6XN(3)[6],=NH6XP(3)[6], + =NH6YR(3)[6],=NH6Z(3)[6],=NH6ZA(3)[6],=NH6ZE(3)[6],=NH7DZ(3)[6],=NH7FU(3)[6],=NH7FZ(3)[6], + =NH7L(3)[6],=NH7M(3)[6],=NH7MY(3)[6],=NH7N(3)[6],=NH7ND(3)[6],=NH7NJ/7(3)[6],=NH7OC(3)[6], + =NH7PL(3)[6],=NH7RS(3)[6],=NH7S(3)[6],=NH7SH(3)[6],=NH7TG(3)[6],=NH7VZ(3)[6],=NH7W(3)[6], + =NH7WT(3)[6],=NH7WU(3)[6],=NH7YE(3)[6],=NH7YI(3)[6],=NH8A(3)[6],=NL5L(3)[6],=NL7AH(3)[6], + =NL7AR(3)[6],=NL7AZ(3)[6],=NL7BI(3)[6],=NL7CH(3)[6],=NL7D(3)[6],=NL7D/7(3)[6],=NL7DH(3)[6], + =NL7DY(3)[6],=NL7EO(3)[6],=NL7FQ(3)[6],=NL7FX(3)[6],=NL7FY(3)[6],=NL7GM(3)[6],=NL7GN(3)[6], + =NL7GO(3)[6],=NL7GU(3)[6],=NL7GW(3)[6],=NL7HH(3)[6],=NL7HK(3)[6],=NL7HQ(3)[6],=NL7HU(3)[6], + =NL7IN(3)[6],=NL7JE(3)[6],=NL7JJ(3)[6],=NL7JN(3)[6],=NL7KV(3)[6],=NL7LI(3)[6],=NL7MS(3)[6], + =NL7MT(3)[6],=NL7NL(3)[6],=NL7OF(3)[6],=NL7PN(3)[6],=NL7QI(3)[6],=NL7RL(3)[6],=NL7RN(3)[6], + =NL7TK(3)[6],=NL7UE(3)[6],=NL7US(3)[6],=NL7VS(3)[6],=NL7WD(3)[6],=NL7WJ(3)[6],=NL7XX(3)[6], + =NL7ZM(3)[6],=NL7ZN(3)[6],=NL7ZP(3)[6],=NP2CT(3)[6],=NP2KL(3)[6],=NP2LK(3)[6],=NP2X/7(3)[6], + =NP3PH(3)[6],=NP4AI/M(3)[6],=NP4ES(3)[6],=NP4FP(3)[6],=NP4I(3)[6],=NP4JV(3)[6],=NP4JV/7(3)[6], + =VA2GLB/P(3)[6],=WH0AAM(3)[6],=WH0J(3)[6],=WH2ACV(3)[6],=WH2AJF(3)[6],=WH6ANB(3)[6],=WH6ARU(3)[6], + =WH6ASB(3)[6],=WH6B(3)[6],=WH6BDR(3)[6],=WH6BLM(3)[6],=WH6BPL(3)[6],=WH6BPU(3)[6],=WH6CF(3)[6], + =WH6CMS(3)[6],=WH6CN(3)[6],=WH6CUS(3)[6],=WH6CWD(3)[6],=WH6CXB(3)[6],=WH6CXE(3)[6],=WH6CXN(3)[6], + =WH6CYB(3)[6],=WH6CZ(3)[6],=WH6DAP(3)[6],=WH6DAY(3)[6],=WH6DJO(3)[6],=WH6DKC(3)[6],=WH6DKG(3)[6], + =WH6DKO(3)[6],=WH6DLQ(3)[6],=WH6DMS(3)[6],=WH6DQ(3)[6],=WH6DRP(3)[6],=WH6DST(3)[6],=WH6DTH(3)[6], + =WH6EEC(3)[6],=WH6EEG(3)[6],=WH6EGM(3)[6],=WH6EHW(3)[6],=WH6EJV(3)[6],=WH6EQB(3)[6],=WH6EQE(3)[6], + =WH6EQH(3)[6],=WH6ESS(3)[6],=WH6ETO(3)[6],=WH6EWE(3)[6],=WH6FCT(3)[6],=WH6FEU(3)[6],=WH6FJR(3)[6], + =WH6FL(3)[6],=WH6FOJ(3)[6],=WH6FPR(3)[6],=WH6FPV(3)[6],=WH6FQ(3)[6],=WH6FQK(3)[6],=WH6GCT(3)[6], + =WH6GEV(3)[6],=WH6OL(3)[6],=WH6OY(3)[6],=WH6QV(3)[6],=WH6SD(3)[6],=WH6SR(3)[6],=WH6TI(3)[6], + =WH6U(3)[6],=WH6XV(3)[6],=WH6YT(3)[6],=WH6YX(3)[6],=WH6ZR(3)[6],=WH6ZV(3)[6],=WH7A(3)[6], + =WH7CY(3)[6],=WH7DA(3)[6],=WH7DB(3)[6],=WH7DE(3)[6],=WH7G(3)[6],=WH7GC(3)[6],=WH7GY(3)[6], + =WH7HU(3)[6],=WH7LB(3)[6],=WH7NS(3)[6],=WH7OK(3)[6],=WH7P(3)[6],=WH7RG(3)[6],=WH7TC(3)[6], + =WH7TN(3)[6],=WH7TR(3)[6],=WH7U(3)[6],=WH7UP(3)[6],=WH7WP(3)[6],=WH7WT(3)[6],=WH7XP(3)[6], + =WH8AAG(3)[6],=WL7AAW(3)[6],=WL7AL(3)[6],=WL7AP(3)[6],=WL7AQ(3)[6],=WL7AUY(3)[6],=WL7AWD(3)[6], + =WL7AXI(3)[6],=WL7AZG(3)[6],=WL7AZL(3)[6],=WL7BCR(3)[6],=WL7BHR(3)[6],=WL7BLM(3)[6],=WL7BM(3)[6], + =WL7BNQ(3)[6],=WL7BON(3)[6],=WL7BOO(3)[6],=WL7BSW(3)[6],=WL7BUI(3)[6],=WL7BVN(3)[6],=WL7BVS(3)[6], + =WL7CAZ(3)[6],=WL7CBF(3)[6],=WL7CES(3)[6],=WL7COQ(3)[6],=WL7CPE(3)[6],=WL7CPI(3)[6],=WL7CQX(3)[6], + =WL7CRJ(3)[6],=WL7CSL(3)[6],=WL7CTB(3)[6],=WL7CTC(3)[6],=WL7CTE(3)[6],=WL7DD(3)[6],=WL7FA(3)[6], + =WL7FR(3)[6],=WL7FU(3)[6],=WL7H(3)[6],=WL7HE(3)[6],=WL7HK(3)[6],=WL7HL(3)[6],=WL7IQ(3)[6], + =WL7IS(3)[6],=WL7JG(3)[6],=WL7JM(3)[6],=WL7K(3)[6],=WL7K/7(3)[6],=WL7K/M(3)[6],=WL7LB(3)[6], + =WL7LK(3)[6],=WL7OA(3)[6],=WL7P(3)[6],=WL7PJ(3)[6],=WL7QC(3)[6],=WL7QX(3)[6],=WL7RV/140(3)[6], + =WL7SD(3)[6],=WL7SO(3)[6],=WL7SV(3)[6],=WL7T/P(3)[6],=WL7VK(3)[6],=WL7VV(3)[6],=WL7WB(3)[6], + =WL7WF(3)[6],=WL7WG(3)[6],=WL7WK(3)[6],=WL7WM(3)[6],=WL7WU(3)[6],=WL7XE(3)[6],=WL7XJ(3)[6], + =WL7XN(3)[6],=WL7XW(3)[6],=WL7Z(3)[6],=WL7ZM(3)[6],=WP2ADG(3)[6],=WP3ZO(3)[6],=WP4DYP(3)[6], + =WP4NBP(3)[6], AA8(4)[8],AB8(4)[8],AC8(4)[8],AD8(4)[8],AE8(4)[8],AF8(4)[8],AG8(4)[8],AI8(4)[8],AJ8(4)[8], AK8(4)[8],K8(4)[8],KA8(4)[8],KB8(4)[8],KC8(4)[8],KD8(4)[8],KE8(4)[8],KF8(4)[8],KG8(4)[8], KI8(4)[8],KJ8(4)[8],KK8(4)[8],KM8(4)[8],KN8(4)[8],KO8(4)[8],KQ8(4)[8],KR8(4)[8],KS8(4)[8], @@ -1778,7 +1779,7 @@ Hawaii: 31: 61: OC: 21.12: 157.48: 10.0: KH6: =WA6IIQ,=WA6JDA,=WA6JJQ,=WA6QDQ,=WA6UVF,=WA7ESE,=WA7HEO,=WA7TFE,=WA7WSU,=WA7ZK,=WA8HEB,=WA8JQP, =WB0RUA,=WB0TZQ,=WB1HAL,=WB2AHM,=WB2SQW,=WB4JTT,=WB4MNF,=WB5ZDH,=WB5ZOV,=WB6CVJ,=WB6PIO,=WB6PJT, =WB6SAA,=WB6VBM,=WB8NCD,=WB9SMM,=WD0FTF,=WD0LFN,=WD4MLF,=WD8LIB,=WD8OBO,=WH2Y,=WH7K,=WK1K,=WL7CSW, - =WL7CSW/H,=WV0Z,=WV6K,=WX0H,=WY6F; + =WL7CSW/H,=WL7M,=WV0Z,=WV6K,=WX0H,=WY6F; Kure Island: 31: 61: OC: 29.00: 178.00: 10.0: KH7K: AH7K,KH7K,NH7K,WH7K; American Samoa: 32: 62: OC: -14.32: 170.78: 11.0: KH8: @@ -1792,9 +1793,9 @@ Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL: =AC9QX,=AD0DK,=AD0FQ,=AD0ZL,=AD3BJ,=AD5PT,=AD6GC,=AD7MF,=AD7VV,=AE1DJ,=AE4QH,=AE5CP,=AE5EX,=AE5FN, =AE5IR,=AE7ES,=AE7KS,=AE7SB,=AF7FV,=AG5LN,=AG5OF,=AH0AH,=AH0H,=AI7CF,=AJ4MY,=AJ4ZI,=AK0O,=AK4CM, =K0AZZ,=K0BHC,=K0ESQ,=K1BZD,=K1IEE,=K1KAO,=K1LQ,=K1MAT,=K1TMT,=K2ICW,=K2NPS,=K3JMI,=K4DRC,=K4ETC, - =K4HOE,=K4PSG,=K4RND,=K4WGX,=K4WPK,=K5DOW,=K5HL,=K5RD,=K5RSO,=K5RZW,=K5TDN,=K6ANE,=K6GKW,=K7BUF, - =K7CAP,=K7EJM,=K7GRW,=K7LOP,=K7MVX,=K7OCL,=K7RDR,=K7UNX,=K7VRK,=K8IEL,=K8OUA,=K9DUG,=KA0SIM, - =KA0YPV,=KA1NCN,=KA2TJZ,=KA2ZSD,=KA6DBB,=KA6PJV,=KA6UGT,=KA7ETQ,=KA7HHF,=KA7HOX,=KA7JOR,=KA7PUB, + =K4HOE,=K4PSG,=K4RND,=K4WGX,=K4WPK,=K5DOW,=K5HL,=K5RD,=K5RSO,=K5RZW,=K5TDN,=K5VOR,=K6ANE,=K6GKW, + =K7BUF,=K7CAP,=K7EJM,=K7GRW,=K7LOP,=K7MVX,=K7OCL,=K7RDR,=K7UNX,=K7VRK,=K8IEL,=K8OUA,=K9DUG, + =KA0SIM,=KA0YPV,=KA1NCN,=KA2TJZ,=KA6DBB,=KA6PJV,=KA6UGT,=KA7ETQ,=KA7HHF,=KA7HOX,=KA7JOR,=KA7PUB, =KA7TMU,=KA7TOM,=KA7UKN,=KA7VCR,=KA7YEY,=KA7ZSX,=KA9GYQ,=KB0APK,=KB0LOW,=KB0TSU,=KB0UGE,=KB0UVK, =KB1CRT,=KB1FCX,=KB1IEV,=KB1KLH,=KB1PHP,=KB1QCD,=KB1QCE,=KB1SYV,=KB1WQL,=KB2FWF,=KB2JWV,=KB2ZME, =KB3CYB,=KB3JFK,=KB3NCR,=KB3VQE,=KB4DX,=KB5DNT,=KB5HEV,=KB5NOW,=KB5UWU,=KB5YLG,=KB6DKJ,=KB7AMA, @@ -1837,18 +1838,18 @@ Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL: =N8EX,=N8JKB,=N8KCJ,=N8KYW,=N8SUG,=N9AIG,=N9YD,=NA7WM,=NC2US,=NC4OI,=NE7EK,=NH2GZ,=NH2LS,=NH7UO, =NM0H,=NN5H,=NP4FU,=NU9Q,=NW7F,=W0EZM,=W0FJN,=W0HPD,=W0OPT,=W0RWS,=W0UZJ,=W0ZEE,=W1JM,=W1LYD, =W1RSC,=W1ZKA,=W2DLS,=W2KRZ,=W2LUV,=W3ICG,=W3JPN,=W3MKG,=W4AUL,=W4BMR,=W4RSB,=W5AIT,=W5JKT,=W5SPY, - =W6DDP,=W6GTE,=W6ROW,=W7DDG,=W7EGG,=W7EIK,=W7JMR,=W7PWA,=W7RAZ,=W7ROS,=W7WEZ,=W7ZWT,=W8MDD,=W8PVZ, - =W8TCX,=W9ITU,=W9JMC,=W9WLN,=WA0JS,=WA1FVJ,=WA1OUS,=WA2BGL,=WA2BIW,=WA4RRE,=WA6GFS,=WA7B,=WA7MDS, - =WA7PXH,=WA7USX,=WA7YXF,=WB0CMZ,=WB1GZL,=WB1ILS,=WB6COP,=WB7ULO,=WB8BRU,=WB9JZL,=WD6CET,=WE3B, - =WH6CYY,=WH6DPL,=WH6GBB,=WH6GCO,=WH7AK,=WI5GUY,=WJ6AA,=WJ8M,=WT5T,=WW4AL,=WX1NCC; + =W6DDP,=W6GTE,=W6ROW,=W6SMA,=W7DDG,=W7EGG,=W7EIK,=W7JMR,=W7PWA,=W7RAZ,=W7ROS,=W7WEZ,=W7ZWT,=W8MDD, + =W8PVZ,=W8TCX,=W9ITU,=W9JMC,=W9WLN,=WA0JS,=WA1FVJ,=WA1OUS,=WA2BGL,=WA2BIW,=WA4RRE,=WA6GFS,=WA7B, + =WA7MDS,=WA7PXH,=WA7USX,=WA7YXF,=WB0CMZ,=WB1GZL,=WB1ILS,=WB6COP,=WB7ULO,=WB8BRU,=WB9JZL,=WD6CET, + =WE3B,=WH6CYY,=WH6DPL,=WH6GBB,=WH6GCO,=WH7AK,=WI5GUY,=WJ6AA,=WJ8M,=WT5T,=WW4AL,=WX1NCC; Navassa Island: 08: 11: NA: 18.40: 75.00: 5.0: KP1: KP1,NP1,WP1; US Virgin Islands: 08: 11: NA: 17.73: 64.80: 4.0: KP2: KP2,NP2,WP2,=AC7FX,=AJ2O,=K5KFL,=K5KUB,=K5TP,=K8RF,=K9VV,=KA7KDU,=KB1MDZ,=KB1ZTY,=KB3ZUD,=KB9ALR, =KC9MCN,=KD4SGB,=KD5QJN,=KE3QL,=KF2HC,=KF4CGR,=KF4MSI,=KG4CZD,=KG4SZC,=KG5KHO,=KG6KVR,=KH2XQ, =KH2XR,=KI4FOE,=KI4FZD,=KI6BLD,=KJ6IR,=KL7NZ,=KO4ALI,=KR7O/R,=KV4/W2KW,=KV4AD,=KV4BA,=KV4BT, - =KV4BW,=KV4CF,=KV4CQ/P,=KV4DN,=KV4EY,=KV4FZ,=KV4HR,=KV4IH,=KV4JC,=KV4KW,=N1TKK,=N1VKI,=N4QXL, - =W0AIH/KV4,=W0YNY,=W2AZK,=W2KW/KV4,=W3K/KD2CLB,=W4LIS,=WA4HLB,=WB2KQW,=WB4WFU,=WD8AHQ; + =KV4BW,=KV4CF,=KV4CQ/P,=KV4EY,=KV4FZ,=KV4HR,=KV4IH,=KV4JC,=KV4KW,=N1TKK,=N1VKI,=N4QXL,=W0AIH/KV4, + =W0YNY,=W2AZK,=W2KW/KV4,=W3K/KD2CLB,=W4LIS,=WA4HLB,=WB2KQW,=WB4WFU,=WD8AHQ; Puerto Rico: 08: 11: NA: 18.18: 66.55: 4.0: KP4: KP3,KP4,NP3,NP4,WP3,WP4,=AA2ZN,=AB2DR,=AF4OU,=AF5IZ,=AG4CD,=AI4EZ,=K1NDN,=K4C/LH,=K4LCR,=K4PFH, =K5YJR,=K6BOT,=K9JOS,=KA2ABJ,=KA2GNG,=KA2MBR,=KA2UCX,=KA2YGB,=KA3ZGQ,=KA4ROB,=KA7URH,=KA9UTY, @@ -2431,7 +2432,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =R90DOSAAF,=R9AV/6,=R9FCH/6,=R9HV/6,=R9JBF/1,=R9JBH/7,=R9JI/1,=R9KC/6/M,=R9WR/1,=R9XAU/6,=RA0AM/6, =RA0BM/6,=RA0ZZ/3,=RA3CQ/9/M(17)[20],=RA80SP,=RA9JR/3,=RA9JX/3,=RA9P/4,=RA9RT/3,=RA9UEZ/6, =RA9UUY/6,=RA9YA/6,=RC80SP,=RG0F/5,=RG50P(17),=RG50P/9(17)[30],=RJ80SP,=RK0HWW/1,=RK80X(17)[19], - =RK8O/4,=RL9AA/6,=RM80SP,=RM8A/4/M,=RM94AE,=RN9M/4,=RN9OI/3,=RO6C/8(17),=RO80RO,=RP61XX(17)[19], + =RK8O/4,=RL9AA/6,=RM80SP,=RM8A/4/M,=RM94AE,=RN9M/4,=RN9OI/3,=RO80RO,=RP61XX(17)[19], =RP62X(17)[19],=RP63X(17)[19],=RP63XO(17)[19],=RP64X(17)[19],=RP65FPP(17)[30],=RP8X(17)[30], =RQ80SP,=RT9T/3,=RU0ZW/6,=RU2FB/3,=RU2FB/3/P,=RU4SS/9(17)[30],=RU4WA/9(17)[30],=RU9MU/3,=RV9LM/3, =RV9XX/3,=RW0IM/1,=RW0QE/6,=RW2F/6,=RW9FF/3,=RW9W/3,=RW9W/4,=RX2FS/3,=RX9TC/1,=RX9UL/1,=RZ9AWN/6, @@ -2444,8 +2445,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =UA9B/1,=UA9KG/1,=UA9KGH/1,=UA9KK/1,=UA9UDX/1,=UB9YUW/1,=UE21A,=UE21B,=UE21M,=UE22A,=UE25AC, =UE25AQ,=UE2AT/1, =R0XAC/1,=R1CF/M,=R8FF/1,=R8XF/1,=R8XF/M,=R90LPU,=R9JNO/1,=RA0FU/1,=RA9FNV/1,=RN2FA/1,=RN9N/1, - =RU9MU/1,=RV0CA/1,=RV1CC/1,=RV2FW/1,=RV9JD/1,=RX9TN/1,=UA0BDS/1,=UA0SIK/1,=UA1CDA/LH,=UA1CIO/LH, - =UA9MA/1,=UA9MQR/1,=UB5O/1/M, + =RU9MU/1,=RV0CA/1,=RV1CC/1,=RV1CC/M,=RV2FW/1,=RV9JD/1,=RX9TN/1,=UA0BDS/1,=UA0SIK/1,=UA1CDA/LH, + =UA1CIO/LH,=UA9MA/1,=UA9MQR/1,=UB5O/1/M, R1N[19],RA1N[19],RC1N[19],RD1N[19],RE1N[19],RF1N[19],RG1N[19],RJ1N[19],RK1N[19],RL1N[19],RM1N[19], RN1N[19],RO1N[19],RQ1N[19],RT1N[19],RU1N[19],RV1N[19],RW1N[19],RX1N[19],RY1N[19],RZ1N[19],U1N[19], UA1N[19],UB1N[19],UC1N[19],UD1N[19],UE1N[19],UF1N[19],UG1N[19],UH1N[19],UI1N[19],=R01DTV/1[19], @@ -2477,9 +2478,9 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =R01DTV/3,=R85PAR,=R870B,=R870C,=R870K,=R870M,=R870O,=R9FM/3,=RA2AT,=RA2FDX/3,=RA3AL/M,=RA9CO/3, =RA9USU/3,=RC85MP,=RL3AB/FF,=RT2F/3/M,=RT9K/3,=RW0LF/3,=RX9UL/3,=RX9WN/3,=RZ9UA/3,=UA0KCX/3, =UA3AV/ANT,=UA8AA/3,=UA8AA/5,=UA9KHD/3,=UA9MA/3,=UA9MDU/3,=UA9MRX/3,=UA9QCP/3,=UA9UAX/3,=UE24SU, - =R85AAL,=R85QMR,=R85WDW,=R8B,=R8FF/3,=R90DNF,=R90PAR,=R90WDW,=R99FSB,=R9YU/3,=RA0BY/3,=RA80KEDR, - =RA9KV/3,=RA9SB/3,=RA9XY/3,=RD0L/3,=RK3DSW/ANT,=RK3DWA/3/N,=RN9MD/3,=RT80KEDR,=RU0LM/3,=RU2FA/3, - =RU3HD/ANT,=RV0AO/3,=RV1CC/M,=RV9LM/3/P,=RW0IM/3,=RW3DU/N,=RW9UEW/3,=RX9SN/3,=RZ9OL/3/M, + =R18JPN,=R85AAL,=R85QMR,=R85WDW,=R8B,=R8FF/3,=R90DNF,=R90PAR,=R90WDW,=R99FSB,=R9YU/3,=RA0BY/3, + =RA80KEDR,=RA9KV/3,=RA9SB/3,=RA9XY/3,=RD0L/3,=RK3DSW/ANT,=RK3DWA/3/N,=RN9MD/3,=RT80KEDR,=RU0LM/3, + =RU2FA/3,=RU3HD/ANT,=RV0AO/3,=RV9LM/3/P,=RW0IM/3,=RW3DU/N,=RW9UEW/3,=RX9SN/3,=RZ9OL/3/M, =RZ9OL/3/P,=RZ9SZ/3,=RZ9W/3,=UA0JAD/3,=UA0KCL/3,=UA0ZAZ/3,=UA9AJ/3/M,=UA9DD/3,=UA9HSI/3,=UA9ONJ/3, =UA9XGD/3,=UA9XMC/3,=UE23DSA,=UE25FO,=UE95GA,=UE96WS, =R80ORL,=UA0QGM/3,=UE80O,=UE80OL, @@ -2489,9 +2490,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =RZ90W/3,=UA3LMR/P,=UA9JFM/3,=UA9XZ/3,=UE80G,=UE80V,=UE80YG, =R800AN,=R800RAN,=RK3MXT/FF,=RV9AZ/3,=UA0AD/3, =R870T,=RT90PK,=RU0ZW/3,=RW0UM/3,=RW9JV/3, - =R0AI/M,=R0AIB/3,=R89AFG,=RA0CCV/3,=RA0QA/3,=RC9YA/3/P,=RM8X/3,=RU9SO/M,=RV9LC/3,=UA0QJE/3, - =UA0QQO/3,=UA9CGL/3,=UA9JLY/3,=UA9XLE/3,=UB0AJJ/3,=UC0LAF/3,=UE25AFG,=UE25R,=UE27AFG,=UE28AFG, - =UE96SN, + =R0AI/M,=R0AIB/3,=R89AFG,=RA0CCV/3,=RA0QA/3,=RC9YA/3/P,=RM8X/3,=RV9LC/3,=UA0QJE/3,=UA0QQO/3, + =UA9CGL/3,=UA9JLY/3,=UA9XLE/3,=UB0AJJ/3,=UC0LAF/3,=UE25AFG,=UE25R,=UE27AFG,=UE28AFG,=UE96SN, =R80RTL,=R90IARU,=R9CZ/3,=RU80TO,=RZ9HK/3/P, =R920RZ,=R925RZ,=R95DOD,=RA0QQ/3,=UA0KBA/3,=UE80S,=UE85NKN,=UE85WDW, =R3TT/FF,=R800ANG,=R8TA/4/P,=R8TR/3,=R90NOR,=R9KW/3,=R9KW/4,=R9PA/4,=RA95FL,=RA9AP/3,=RA9CKQ/4, @@ -2503,8 +2503,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =R110A/P,=R80PVB,=RK3AW/M, =R8XF/3,=RA9XF/3,=RC80KEDR,=RK0BWW/3,=RN80KEDR,=RW9XC/3/M,=RX3XX/N,=UA0KBA/3/P,=UA9SIV/3, =UE0ZOO/3, - =R85WTA,=R8FF/3/P,=R90WDWR,=R98KPM,=R99KPM,=RA3YV/ANT,=RK0UT/3,=RW0LX/3,=UA3YH/ANT,=UA9KZ/3, - =UB8JAF/3,=UE91L,=UE95K,=UE95RA, + =R85WTA,=R8FF/3/P,=R90WDWR,=R90WTA,=R98KPM,=R99KPM,=RA3YV/ANT,=RK0UT/3,=RW0LX/3,=UA3YH/ANT, + =UA9KZ/3,=UB8JAF/3,=UE91L,=UE95K,=UE95RA, =R3ZK/FF,=RA3ZZ/ANT,=RA9AK/3,=RA9KD/3,=RU3ZK/FF,=RW0BG/3,=UA0QBC/3, =R89DRA,=RA07DR,=RA9DF/4/P,=RA9ODR/4/M,=RC4AF/FF,=RN4ACA/FF,=RV9CX/6/M,=UA4ASE/FF,=UA4ATL/FF, =UA8WAA/6,=UA9FGR/4,=UE00S,=UE00S/P,=UE09VG,=UE80RWW, @@ -2544,23 +2544,23 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UA4W[30],UB4W[30],UC4W[30],UD4W[30],UE4W[30],UF4W[30],UG4W[30],UH4W[30],UI4W[30],=R0CM/4[30], =R100MTK[30],=R100UD[30],=R9GM/4[30],=R9UT/4[30],=RA9FDR/4/P[30],=RA9KV/4/M[30],=RA9WU/4[30], =RA9WU/4/M[30],=RA9WU/4/P[30],=RP72IZ[30],=RP73IZ[30],=RP74IZ[30],=RP75IZ[30],=RP76IZ[30], - =RT20NY[30],=RT21NY[30],=RT30DX[30],=RT60YG[30],=RT78ML[30],=RW9FWB/4[30],=RW9FWR/4[30], - =RW9FWR/4/M[30],=RX9FW/4[30],=UA9UAX/4/M[30], + =RT20NY[30],=RT21NY[30],=RT30DX[30],=RT36MS[30],=RT60YG[30],=RT78ML[30],=RW9FWB/4[30], + =RW9FWR/4[30],=RW9FWR/4/M[30],=RX9FW/4[30],=UA9UAX/4/M[30], =RT9T/4,=RV9MD/4,=UA4PCM/M,=UE04YCS,=UE85AGN,=UE90AGN, - =R01DTV,=R01DTV/7,=R0IT/6,=R80TV,=R8XW/6,=R9JO/6,=R9KD/6,=R9OM/6,=R9WGM/6/M,=RA0APW/6,=RA0FW/6, - =RA0LIF/6,=RA0LLW/6,=RA0QR/6,=RA9ODR/6,=RA9ODR/6/M,=RA9SAS/6,=RA9UWD/6,=RA9WW/6,=RD9CX/6, + =R01DTV,=R01DTV/7,=R0IT/6,=R7AB/M,=R80TV,=R8XW/6,=R9JO/6,=R9KD/6,=R9OM/6,=R9WGM/6/M,=RA0APW/6, + =RA0FW/6,=RA0LIF/6,=RA0LLW/6,=RA0QR/6,=RA9ODR/6,=RA9ODR/6/M,=RA9SAS/6,=RA9UWD/6,=RA9WW/6,=RD9CX/6, =RD9CX/6/P,=RK6AH/LH,=RK75KH,=RK75MP,=RK9JA/6,=RM8W/6,=RN0CF/6,=RN0JT/6,=RQ0C/6,=RT9K/6,=RT9K/6/P, - =RT9K/6/QRP,=RU2FB/6,=RU9MX/6,=RU9QRP/6/M,=RU9QRP/6/P,=RU9SO/6,=RV9FQ/6,=RW0LIF/6,=RW0LIF/6/LH, - =RW6AWW/LH,=RW9JZ/6,=RW9WA/6,=RX6AA/ANT,=RX6AAP/ANT,=RX9TX/6,=RZ9HG/6,=RZ9HT/6,=RZ9UF/6,=RZ9UZV/6, - =UA0AGE/6,=UA0IT/6,=UA0JL/6,=UA0LQQ/6/P,=UA0SEP/6,=UA2FT/6,=UA6ADC/N,=UA9COO/6,=UA9CTT/6, - =UA9JON/6,=UA9JPX/6,=UA9KB/6,=UA9KJ/6,=UA9KW/6,=UA9MQR/6,=UA9UAX/6,=UA9VR/6,=UA9XC/6,=UA9XCI/6, - =UE9WDA/6,=UE9WFF/6,=UF0W/6, + =RT9K/6/QRP,=RU2FB/6,=RU9MX/6,=RU9QRP/6/M,=RU9QRP/6/P,=RU9SO/6,=RU9SO/M,=RV9FQ/6,=RW0LIF/6, + =RW0LIF/6/LH,=RW6AWW/LH,=RW9JZ/6,=RW9WA/6,=RX6AA/ANT,=RX6AAP/ANT,=RX9TX/6,=RZ9HG/6,=RZ9HT/6, + =RZ9UF/6,=RZ9UZV/6,=UA0AGE/6,=UA0IT/6,=UA0JL/6,=UA0LQQ/6/P,=UA0SEP/6,=UA2FT/6,=UA6ADC/N,=UA9COO/6, + =UA9CTT/6,=UA9JON/6,=UA9JPX/6,=UA9KB/6,=UA9KJ/6,=UA9KW/6,=UA9MQR/6,=UA9UAX/6,=UA9VR/6,=UA9XC/6, + =UA9XCI/6,=UE9WDA/6,=UE9WFF/6,=UF0W/6, =RA6EE/FF,=RN7G/FF,=UA0LEC/6,=UA9KAS/6,=UA9KAS/6/P, - =R7AB/M,=R7AB/P,=R9XV/6,=RA0ZG/6,=RA9CHS/6,=RA9CHS/7,=RK7G/FF,=RT9K/7,=RU9CK/7,=RU9ZA/7,=RZ7G/FF, - =RZ9ON/6,=UA0ZDA/6,=UA0ZS/6,=UA6HBO/N,=UA6HBO/ST30,=UA6IC/6/FF,=UA9CE/6,=UA9UAX/7/M,=UE80HS, + =R9XV/6,=RA0ZG/6,=RA9CHS/6,=RA9CHS/7,=RK7G/FF,=RT9K/7,=RU9CK/7,=RU9ZA/7,=RZ7G/FF,=RZ9ON/6, + =UA0ZDA/6,=UA0ZS/6,=UA6HBO/N,=UA6HBO/ST30,=UA6IC/6/FF,=UA9CE/6,=UA9UAX/7/M,=UE80HS, =RM8A/6/M,=UA6IC/FF, =RU2FB/6/P,=UA9UAX/7, - =R6LCA/J,=R8WC/6,=R8WC/6/P,=RA20NY,=RA21NY,=RA98AE,=RU97AE,=RV9CMT/6,=RV9DC/6/P,=RV9LC/6, + =R6LCA/J,=R7AB/P,=R8WC/6,=R8WC/6/P,=RA20NY,=RA21NY,=RA98AE,=RU97AE,=RV9CMT/6,=RV9DC/6/P,=RV9LC/6, =RW9XC/6/M,=RX9KT/6,=UA0QBR/6,=UA0ZED/6,=UA6LP/P/LH,=UA6LV/ANT,=UA6MM/LH,=UE20DS,=UE28DX,=UE29DX, =UE92L, =RV0ANH/6,=RV0APR/6,=RW0AF/6, @@ -2641,7 +2641,7 @@ Kaliningrad: 15: 29: EU: 54.72: -20.52: -3.0: UA2: =RP75GC,=RP75IGS,=RP75KB,=RP75MW,=RP75STP,=RP76GC,=RP76IGS,=RP76KB,=RT9T/2,=RU3FS/2,=RU5A/2, =RU5D/2,=RV21NY,=RV30DX,=RV3FF/2,=RV3MA/2,=RV3UK/2,=RV60YG,=RV9WZ/2,=RW9QA/2,=RY1AAA/2,=RZ3FA/2, =RZ6HB/2,=UA0SIK/2,=UA1AAE/2,=UA1AFT/2,=UA2DC/RP,=UA2FM/MM(13),=UA3DJG/2,=UA4RC/2,=UA4WHX/2, - =UA9UAX/2,=UB5O/2,=UB5O/2/M,=UB9KAA/2,=UE08F,=UE1RLH/2,=UE3QRP/2,=UE6MAC/2,=UF1M/2; + =UA9UAX/2,=UB5O/2,=UB5O/2/M,=UB9KAA/2,=UE08F,=UE1RLH/2,=UE3QRP/2,=UE6MAC/2,=UE90WTA,=UF1M/2; Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: R0(19)[33],R8,R9,RA0(19)[33],RA8,RA9,RC0(19)[33],RC8,RC9,RD0(19)[33],RD8,RD9,RE0(19)[33],RE8,RE9, RF0(19)[33],RF8,RF9,RG0(19)[33],RG8,RG9,RI0(19)[33],RI8,RI9,RJ0(19)[33],RJ8,RJ9,RK0(19)[33],RK8, @@ -2665,10 +2665,10 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RP76U,=RQ4D/8,=RT60RT,=RT73AB,=RU22AZ,=RV1AQ/9,=RV1CC/8,=RV1CC/9,=RV3BA/9,=RV9WB/9/M,=RV9WMZ/9/P, =RV9WMZ/P,=RX3RC/9,=RX9WN/9/M,=RX9WT/8,=RZ0OO/9,=RZ6DR/9/M,=RZ9OO/9/M,=UA0MF/9,=UA3AKO/8,=UA4RC/9, =UA6A/9,=UA6CW/9,=UA6YGY/8,=UA6YGY/9,=UA8WAA/9,=UA8WAA/9/P,=UA8WAA/M,=UA9SG/9,=UA9TO/9/M, - =UA9WMN/9/P,=UE45AWT,=UE70AAA,=UE9WDA/9, - =R01DTV/8,=R100RGA,=R105WWS,=R14CWC/8,=R14CWC/9,=R150DMP,=R155AP,=R15CWC/8,=R15CWC/8/QRP,=R160DMP, - =R16SVK,=R170GS/8,=R2015BP,=R2015R,=R2016DR,=R20EKB,=R22SKJ,=R27EKB,=R30ZF,=R35CZF,=R375I, - =R44YETI/8,=R4WAB/9/P,=R55EPC,=R55EPC/P,=R6UAE/9,=R70NIK,=R7LZ/8,=R8FF/8,=R9GM/8,=R9GM/8/M, + =UA9WMN/9/P,=UB5O/8,=UE45AWT,=UE70AAA,=UE9WDA/9, + =R01DTV/8,=R100RGA,=R103PS,=R105WWS,=R14CWC/8,=R14CWC/9,=R150DMP,=R155AP,=R15CWC/8,=R15CWC/8/QRP, + =R160DMP,=R16SVK,=R170GS/8,=R2015BP,=R2015R,=R2016DR,=R20EKB,=R22SKJ,=R27EKB,=R30ZF,=R35CZF, + =R375I,=R44YETI/8,=R4WAB/9/P,=R55EPC,=R55EPC/P,=R6UAE/9,=R70NIK,=R7LZ/8,=R8FF/8,=R9GM/8,=R9GM/8/M, =R9WCJ/8,=RA/DL6XK,=RA/US5ETV,=RA0BA/8,=RA0BA/9,=RA27AA,=RA27EK,=RA36GS,=RA36ZF,=RA4YW/9, =RA4YW/9/M,=RA9FW/9,=RC18EK,=RD0B/8,=RK3AW/8,=RK9AD/9/M,=RK9DR/N,=RL20NY,=RL21NY,=RL4R/8,=RL60YG, =RM0B/9,=RM19NY,=RN16CW,=RN3QBG/9,=RP68DT,=RP68RG,=RP68TG,=RP68TK,=RP69GR,=RP70DT,=RP70G,=RP70GB, @@ -2679,7 +2679,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RT73HE,=RT73KB,=RT73SK,=RU22CR,=RU5D/8,=RU5D/9,=RU9CK/M,=RV6LGY/9,=RV6LGY/9/M,=RV6LGY/9/P, =RV6MD/9,=RV9WB/8,=RW4NX/9,=RW9C[20],=RX0SD/9,=RX3Q/8,=RX3Q/9,=RX9UL/9,=RY9C/P,=RZ1CWC/8,=RZ37ZF, =RZ38ZF,=RZ39ZF,=UA0BA/8,=UA3FQ/8,=UA3IHJ/8,=UA4WHX/9,=UA8WAA/8,=UA9CGL/M,=UA9MW/9,=UA9UAX/8, - =UA9UAX/8/M,=UB5O/8,=UE16SR,=UE25F,=UE40CZF,=UE4NFF/9,=UE56S,=UE64RWA,=UE70SL,=UE75DT, + =UA9UAX/8/M,=UE16SR,=UE25F,=UE40CZF,=UE4NFF/9,=UE56S,=UE64RWA,=UE70SL,=UE75DT, R8H(18)[31],R8I(18)[31],R9H(18)[31],R9I(18)[31],RA8H(18)[31],RA8I(18)[31],RA9H(18)[31], RA9I(18)[31],RC8H(18)[31],RC8I(18)[31],RC9H(18)[31],RC9I(18)[31],RD8H(18)[31],RD8I(18)[31], RD9H(18)[31],RD9I(18)[31],RE8H(18)[31],RE8I(18)[31],RE9H(18)[31],RE9I(18)[31],RF8H(18)[31], @@ -2734,19 +2734,19 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RW4HIF/9[20],=RW4HIH/9[20],=RW6BA/9[20],=RW9XU/9[20],=RX6CP/8[20],=RX6LMA/9[20],=RX9SN/8[20], =UA0KY/9[20],=UA0QMU/0[20],=UA0QQO/9/P[20],=UA1FBP/9[20],=UA1PBA/9[20],=UA1PBP/9[20], =UA3DFM/8[20],=UA3DFM/9[20],=UA3MGA/9[20],=UA6BTN/9[20],=UA9SUV/8[20], - =R110WG,=R115AN,=R11QRP/8,=R11QRP/8/P,=R120RL,=R18POR,=R1PN/8,=R2015EP,=R2015LY,=R2015LY/8, - =R22BIA,=R30STM,=R430LT,=R4FAA/8,=R8MC/9,=R8MD/9,=RA/EW8ADX,=RA0UAC/8,=RA0UF/8,=RA3CW/9,=RA9JG/9, - =RC1M/8/M,=RO25TN,=RP67JH,=RP67LK,=RP67LL,=RP67TT,=RP68LS,=RP68TT,=RP69CM,=RP69DK,=RP69GP,=RP69LK, - =RP69LL,=RP69LS,=RP69MM,=RP69P,=RP69YN,=RP70GP,=RP70LL,=RP70LM,=RP70P,=RP70TM,=RP71GP,=RP71LL, - =RP71P,=RP72GP,=RP72LL,=RP72P,=RP72PJ,=RP73LL,=RP73P,=RP74LL,=RP74P,=RP75GP,=RP75LL,=RP75P, - =RP75YN,=RP76P,=RR110RAEM,=RU22LR,=RW0QJ/9,=RX4W/8,=RX6DL/8,=RX6DL/8/P,=RX6DL/8/P/QRP,=RX6DL/9/P, - =RZ9MXM/9/M,=UB5O/8/P,=UE44Y/8,=UE9FDA/9/M,=UE9MDA/9, + R18J,=R110WG,=R115AN,=R11QRP/8,=R11QRP/8/P,=R120RL,=R18POR,=R18UGRA,=R1PN/8,=R2015EP,=R2015LY, + =R2015LY/8,=R22BIA,=R30STM,=R430LT,=R4FAA/8,=R8MC/9,=R8MD/9,=RA/EW8ADX,=RA0UAC/8,=RA0UF/8, + =RA3CW/9,=RA9JG/9,=RC1M/8/M,=RO25TN,=RO6C/8,=RO6C/8/P,=RP67JH,=RP67LK,=RP67LL,=RP67TT,=RP68LS, + =RP68TT,=RP69CM,=RP69DK,=RP69GP,=RP69LK,=RP69LL,=RP69LS,=RP69MM,=RP69P,=RP69YN,=RP70GP,=RP70LL, + =RP70LM,=RP70P,=RP70TM,=RP71GP,=RP71LL,=RP71P,=RP72GP,=RP72LL,=RP72P,=RP72PJ,=RP73LL,=RP73P, + =RP74LL,=RP74P,=RP75GP,=RP75LL,=RP75P,=RP75YN,=RP76P,=RR110RAEM,=RU22LR,=RW0QJ/9,=RX4W/8,=RX6DL/8, + =RX6DL/8/P,=RX6DL/8/P/QRP,=RX6DL/9/P,=RZ9MXM/9/M,=UB5O/8/P,=UE44Y/8,=UE9FDA/9/M,=UE9MDA/9, =R16CAN,=R1716K,=R1716M,=R1716O,=R1716S,=R21HNY,=R30MDXC,=R9MJ/M,=RA/DK2AI/M,=RA22MX,=RA4CQ/9/M, =RA9MR/0,=RA9MX/P,=RC20MX,=RG78ML,=RK6YYA/9,=RN0SZ/9,=RN9N/9,=RN9N/M,=RP65MOH,=RP67MC,=RP67MD, =RP68MC,=RP68MD,=RP69MC,=RP69MD,=RP70GK,=RP70MC,=RP70MD,=RP70OB,=RP70OF,=RP70OS,=RP71GK,=RP71MJ, =RP71OB,=RP72GK,=RP72MJ,=RP72OB,=RP72ZW,=RP73GK,=RP73OB,=RP74PO,=RP75GK,=RP8M,=RT22MC,=RT22MD, - =RU20NY,=RU20RU,=RV0SR/9,=RW22MW,=RY22MC,=RZ5D/9,=UA1ZGD/9,=UA3AKO/9,=UA9UAX/M,=UB5O/9,=UE55OM, - =UE70KRM/9,=UE70KRM/9/M,=UE9OFF/9, + =RU20NY,=RU20RU,=RV0SR/9,=RW22MW,=RY22MC,=RZ5D/9,=UA1ZGD/9,=UA3AKO/9,=UA9MA/M,=UA9UAX/M,=UB5O/9, + =UE55OM,=UE70KRM/9,=UE70KRM/9/M,=UE9OFF/9, R8O(18)[31],R8P(18)[31],R9O(18)[31],R9P(18)[31],RA8O(18)[31],RA8P(18)[31],RA9O(18)[31], RA9P(18)[31],RC8O(18)[31],RC8P(18)[31],RC9O(18)[31],RC9P(18)[31],RD8O(18)[31],RD8P(18)[31], RD9O(18)[31],RD9P(18)[31],RE8O(18)[31],RE8P(18)[31],RE9O(18)[31],RE9P(18)[31],RF8O(18)[31], @@ -2829,7 +2829,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RP70ZF(18)[31],=RP71KM(18)[31],=RP72KM(18)[31],=RP72NM(18)[31],=RP73KM(18)[31],=RP73NZ(18)[31], =RP73ZF(18)[31],=RP74KM(18)[31],=RP75KM(18)[31],=RP75YE(18)[31],=RP76KM(18)[31],=RP76KUF(18)[31], =RT22UA(18)[31],=RT77VV(18)[31],=RW0CE/9(18)[31],=RW4CG/9(18)[31],=UA9JFE/9/P(18)[31], - =UA9MA/M(18)[31],=UE3ATV/9(18)[31], + =UE3ATV/9(18)[31], R8W(16),R9W(16),RA8W(16),RA9W(16),RC8W(16),RC9W(16),RD8W(16),RD9W(16),RE8W(16),RE9W(16),RF8W(16), RF9W(16),RG8W(16),RG9W(16),RJ8W(16),RJ9W(16),RK8W(16),RK9W(16),RL8W(16),RL9W(16),RM8W(16), RM9W(16),RN8W(16),RN9W(16),RO8W(16),RO9W(16),RQ8W(16),RQ9W(16),RT8W(16),RT9W(16),RU8W(16), @@ -3141,7 +3141,7 @@ Marshall Islands: 31: 65: OC: 9.08: -167.33: -12.0: V7: Brunei Darussalam: 28: 54: OC: 4.50: -114.60: -8.0: V8: V8; Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE: - CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20210517, + CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20210526, =CF7AAW/1,=CK7IG/1,=VA3QSL/1,=VA3WR/1,=VE1REC/LH,=VE1REC/M/LH,=VE3RSA/1,=VE7IG/1, CF2[4],CG2[4],CJ2[4],CK2[4],VA2[4],VB2[4],VC2[4],VE2[4],VG2[4],VX2[4],XL2[4],XM2[4],=4Y1CAO[4], =CY2ZT/2[4],=VA3MPM/2[4],=VA7AQ/P[4],=VE2/G3ZAY/P[4],=VE2/M0BLF/P[4],=VE2FK[9],=VE2HAY/P[4], @@ -3272,7 +3272,7 @@ South Sandwich Islands: 13: 73: SA: -58.43: 26.33: 2.0: VP8/s: Bermuda: 05: 11: NA: 32.32: 64.73: 4.0: VP9: VP9,=VP400BO,=VP9400/HW; Chagos Islands: 39: 41: AF: -7.32: -72.42: -6.0: VQ9: - VQ9; + VQ9,=VERSION; Hong Kong: 24: 44: AS: 22.28: -114.18: -8.0: VR: VR; India: 22: 41: AS: 22.50: -77.58: -5.5: VU: @@ -3386,7 +3386,7 @@ New Zealand: 32: 60: OC: -39.03: -174.47: -12.0: ZL: Chatham Islands: 32: 60: OC: -43.85: 176.48: -12.75: ZL7: ZL7,ZM7; Kermadec Islands: 32: 60: OC: -29.25: 177.92: -12.0: ZL8: - ZL8,ZM8,=VERSION,=ZL1GO/8; + ZL8,ZM8,=ZL1GO/8; N.Z. Subantarctic Is.: 32: 60: OC: -51.62: -167.62: -12.0: ZL9: ZL9; Paraguay: 11: 14: SA: -25.27: 57.67: 4.0: ZP: diff --git a/displayWidgets.txt b/displayWidgets.txt index 7a58347ef..eb74a9d91 100644 --- a/displayWidgets.txt +++ b/displayWidgets.txt @@ -1,34 +1,34 @@ Here are the "displayWidgets()" strings for WSJT-X modes 1 2 3 - 0123456789012345678901234567890123456 ------------------------------------------------- -JT4 1110100000001100001100000000000000000 -JT4/VHF 1111100100101101101111000000000000000 -JT9 1110100000001110000100000000000010000 -JT9/VHF 1111101010001111100100000000000000000 -JT9+JT65 1110100000011110000100000000000010000 -JT65 1110100000001110000100000000000010000 -JT65/VHF 1111100100001101101011000100000000000 -Q65 1111110101101101001110000001000000001 -ISCAT 1001110000000001100000000000000000000 -MSK144 1011111101000000000100010000000000000 -WSPR 0000000000000000010100000000000000000 -FST4 1111110001001110000100000001000000110 -FST4W 0000000000000000010100000000000001000 -Echo 0000000000000000000000100000000000000 -FCal 0011010000000000000000000000010000000 -FT8 1110100001001110000100001001100010000 -FT8/VHF 1110100001001110000100001001100010000 -FT8/Fox 1110100001001110000100000000001000000 -FT8/Hound 1110100001001110000100000000001100000 ----------------------------------------------- + 01234567890123456789012345678901234567 +------------------------------------------------- +JT4 11101000000011000011000000000000000000 +JT4/VHF 11111001001011011011110000000000000000 +JT9 11101000000011100001000000000000100000 +JT9/VHF 11111010100011111001000000000000000000 +JT9+JT65 11101000000111100001000000000000100000 +JT65 11101000000011100001000000000000100000 +JT65/VHF 11111001000011011010110001000000000000 +Q65 11111101011011010011100000010000000011 +ISCAT 10011100000000011000000000000000000000 +MSK144 10111111010000000001000100000000000000 +WSPR 00000000000000000101000000000000000000 +FST4 11111100010011100001000000010000001100 +FST4W 00000000000000000101000000000000010000 +Echo 00000000000000000000001000000000000000 +FCal 00110100000000000000000000000100000000 +FT8 11101000010011100001000010011000100000 +FT8/VHF 11101000010011100001000010011000100000 +FT8/Fox 11101000010011100001000000000010000000 +FT8/Hound 11101000010011100001000000000011000000 +------------------------------------------------- 1 2 3 - 012345678901234567890123456789012 + 01234567890123456789012345678901234567 ----------------------------------------------- +------------------------------------------------- Mapping of column numbers to widgets ----------------------------------------------- +------------------------------------------------- 0. txFirstCheckbox 1. TxFreqSpinBox 2. RxFreqSpinBox @@ -66,3 +66,4 @@ Mapping of column numbers to widgets 34. sbF_Low 35. sbF_High 36. AutoClrAvg +37. sbMaxDrift diff --git a/doc/building on MS Windows.txt b/doc/building on MS Windows.txt index 57b8e8d15..bb15e1f05 100644 --- a/doc/building on MS Windows.txt +++ b/doc/building on MS Windows.txt @@ -19,6 +19,7 @@ Here is an overview list, details are filled out below: * Hamlib rig control library * Pkg Config Lite * Boost C++ libraries (see separate document) + * portaudio library (used by map65) Qt Framework ------------ @@ -80,7 +81,7 @@ installed and updated you will need to install some packages, these are needed to provide the necessary *nix tools and utilities to build Hamlib from sources. - pacman -S autoconf automake libtool make + pacman -S autoconf automake libtool make tar Hamlib ------ @@ -98,13 +99,13 @@ fork is a git repository which can be cloned with this command: Next you must build Hamlib using the MinGW compiler tools bundled with Qt. As you will build Hamlib again when there are updates you should -set up you Msys2 command line environment for this. I use a +set up you MSYS2 command line environment for this. I use a $HOME/.bash_profile file containing these lines: dll_paths_64bit=/c/Tools/libusb-1.0.23/MinGW64/dll:$HOME/local/hamlib/mingw64/release/bin export PATH=/c/Qt/Tools/mingw810_64/bin:$dll_paths_64bit:$PATH -Test the amended ~/.bash_profile file by opening a new Msys2 shell and +Test the amended ~/.bash_profile file by opening a new MSYS2 shell and typing: which gcc @@ -117,7 +118,7 @@ Hamlib sources: cd ~/src/sf/bsomervi/hamlib ./bootstrap -Now you need to configure and build Hamlib from an Msys2 shell. Create +Now you need to configure and build Hamlib from an MSYS2 shell. Create a build directory outside of the Hamlib sources you have just cloned, then change working directory to that build directory. @@ -171,3 +172,74 @@ from https://sourceforge.net/projects/pkgconfiglite/files/0.28-1/ and unzip it into a convenient location, as with other ancillary tools and libraries I put these under C:\Tools\. +portaudio +--------- + +This library is only available as sources so must be built. It uses +autotools and building using MinGW tools from an MSYS2 shell is +recommended. Ensure your MSYS2 shell environment (PATH) is correctly +set up for the MinGW tool chain you wish to build with, i.e. the MinGW +tools bundled with the Qt installation for 32-, or 64-bit as required. + +Download this specific version's sources tarball from +http://files.portaudio.com/download.html , at the time of writing that +was the pa_stable_v190600_20161030.tgz file. Unzip and unpack the +tarball in a suitable location like ~/src : + + cd ~/src + tar xf ~/Downloads/pa_stable_v190600_20161030.tgz + + +Note that on Windows portaudio will only build static libraries using +the standard configuration, we prefer dynamic libraries for portaudio +as users may wish to substitute a build of the library with ASIO +support for personal use (we cannot redistribute binaries built from +proprietary closed source sources like the Steinberg ASIO SDK). + +In order to build DLLs on Windows the configure script requires a +patch as follows: + + sed -i -e 's/-luuid//g' ~/src/portaudio/configure + +This removes linker dependencies on the MS uuid library since it is +only available as a static archive and using that would disallow +shared library creation. + +Out-of-source-tree builds are recommended, create a build directory in +a suitable location like ~/build and change working directory to it: + + mkdir -p ~/build/portaudio/mingw64 + cd !$ + +Configure and build and install the library in a suitable place (I use +~/local as a root directory for installed packages. + + ~/src/portaudio/configure --prefix=$(HOME)/local/portaudio/mingw64 \ + --with-winapi=wmme,directx,wdmks --disable-static --enable-shared CFLAGS=-DNDEBUG + make && make install + +Repeat for the 32-bit architecture if required, using a suitable MSYS2 +environment for the required tool chain, different build directory, +and install location. + +Update your CMake tool chain files to include the install directory, +or directories, above. I have something like this in the 64-bit tool +chain files: + + # ... + set (PORTAUDIODIR C:/Users/bill/local/portaudio/mingw64) + # ... + set (CMAKE_PREFIX_PATH ... ${PORTAUDIODIR} ...) + #... + +and similarly with the 32-bit tool chain file specifying the mingw32 +portaudio installation root directory. + +To run Debug configuration WSJT-X builds you will also need to add the +location of the portaudio DLL to your PATH environment variable, like: + + SET "Path=%UserProfile%\local\portaudio\mingw64\bin;%Path%" + +Verify the setup with: + + WHERE libportaudio-2.dll diff --git a/doc/user_guide/en/new_features.adoc b/doc/user_guide/en/new_features.adoc index 93a104092..d5fa56193 100644 --- a/doc/user_guide/en/new_features.adoc +++ b/doc/user_guide/en/new_features.adoc @@ -1,15 +1,27 @@ [[NEW_FEATURES]] === New in Version {VERSION} -_WSJT-X 2.4.0_ introduces *Q65*, a new digital protocol designed for -minimal two-way QSOs over especially difficult propagation paths. On -paths with Doppler spread more than a few Hz, the weak-signal -performance of Q65 is the best among all WSJT-X modes. +_WSJT-X 2.5.0_ introduces an enhanced Q65 decoder that measures and +compensates for linear frequency drifts of Q65 signals. Activate this +feature by setting a spinner control *Max Drift* on the _WSJT-X_ main +window to a number greater than 0. We suggest a setting of 10 for +submode Q65-60A, the recommended submode for EME on 50 and 144 MHz, +which will accommodate drift rates up to 20 Hz/minute. Similarly, we +suggest *Max Drift* = 40 for submode Q65-15C, used for for 10 GHz QSOs +(up to 900 km) via aircraft scatter and drift rates up to about 20 +Hz/s. -Q65 uses message formats and sequencing identical to those used in -FST4, FT4, FT8, and MSK144. Submodes are provided with a wide variety -of tone spacings and T/R sequence lengths 15, 30, 60, 120, and 300 s. -A new, highly reliable list-decoding technique is used for messages -that contain previously copied message fragments. Message averaging -is provided for situations where single transmissions are too weak or -signal enhancements too sparse for a signal to be decoded. +On the Windows platform only, _WSJT-X 2.5.0_ installations now include +an early version of _MAP65 3.0_. This program works together with +suitable hardware that converts RF to baseband. The hardware/software +combination implements a wideband, highly optimized receiver for the +Q65 and JT65 protocols, with matching transmitting features that +require a standard SSB transceiver. _MAP65_ is effective in both +single-polarization and dual-polarization systems. If two +polarization channels are available, _MAP65_ determines and matches +the linear polarization angle of each decodable signal. This +capability provides a major advantage for efficient EME communication +on bands up to 432 MHz. A single-channel _MAP65_ system works +extremely well for EME on 1296 MHz and higher bands, displaying all +signals in a 90 kHz sub-band and decoding all the Q65 and JT65 +signals. diff --git a/lib/decode65a.f90 b/lib/decode65a.f90 index ec9fbd311..3b82178b2 100644 --- a/lib/decode65a.f90 +++ b/lib/decode65a.f90 @@ -41,9 +41,7 @@ subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, & if(nflip.eq.0) go to 900 ! Find best DF, drift, curvature, and DT. Start by downsampling to 344.53125 Hz - call timer('fil6521 ',0) call fil6521(cx,n5,c5x,n6) - call timer('fil6521 ',1) fsample=1378.125/4. @@ -60,10 +58,8 @@ subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, & ! Apply AFC corrections to the time-domain signal ! Now we are back to using the 1378.125 Hz sample rate, enough to ! accommodate the full JT65C bandwidth. - a(3)=0 - call timer('twkfreq ',0) + a(3)=0 call twkfreq65(cx,n5,a) - call timer('twkfreq ',1) ! Compute spectrum for each symbol. nsym=126 @@ -71,7 +67,6 @@ subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, & df=1378.125/nfft j=int(dtbest*1378.125) - call timer('sh_ffts ',0) c5a=cmplx(0.0,0.0) do k=1,nsym do i=1,nfft @@ -89,7 +84,6 @@ subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, & s1(jj,k)=real(c5a(i))**2 + aimag(c5a(i))**2 enddo enddo - call timer('sh_ffts ',1) call timer('dec65b ',0) qualbest=0. diff --git a/lib/decoder.f90 b/lib/decoder.f90 index d1a530092..1e2eba9c2 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -205,10 +205,11 @@ subroutine multimode_decoder(ss,id2,params,nfsample) open(17,file=trim(temp_dir)//'/red.dat',status='unknown') open(14,file=trim(temp_dir)//'/avemsg.txt',status='unknown') call timer('dec_q65 ',0) - call my_q65%decode(q65_decoded,id2,params%nutc,params%ntr, & + nqd=1 + call my_q65%decode(q65_decoded,id2,nqd,params%nutc,params%ntr, & params%nsubmode,params%nfqso,params%ntol,params%ndepth, & params%nfa,params%nfb,logical(params%nclearave), & - single_decode,logical(params%nagain), & + single_decode,logical(params%nagain),params%max_drift, & logical(params%newdat),params%emedelay,mycall,hiscall,hisgrid, & params%nQSOProgress,ncontest,logical(params%lapcqonly),navg0) call timer('dec_q65 ',1) diff --git a/lib/encode_rs.c b/lib/encode_rs.c index 911bc36dd..9d56d0bf1 100644 --- a/lib/encode_rs.c +++ b/lib/encode_rs.c @@ -13,24 +13,19 @@ #endif void ENCODE_RS( -#ifdef FIXED -DTYPE *data, DTYPE *bb,int pad){ -#else -void *p,DTYPE *data, DTYPE *bb){ +#ifndef FIXED +void *p, +#endif +DTYPE *data, DTYPE *bb){ +#ifndef FIXED struct rs *rs = (struct rs *)p; #endif int i, j; DTYPE feedback; -#ifdef FIXED - /* Check pad parameter for validity */ - if(pad < 0 || pad >= NN) - return; -#endif - memset(bb,0,NROOTS*sizeof(DTYPE)); - for(i=0;i 0 ? 1000.0*pp2/pp1 : 1000.0; param[5]=ntotal_min; param[6]=ntry[0]; param[7]=1000.0*pp2; diff --git a/lib/init_rs.c b/lib/init_rs.c index a80523651..876819f8c 100644 --- a/lib/init_rs.c +++ b/lib/init_rs.c @@ -28,10 +28,9 @@ void FREE_RS(void *p){ * fcr = first root of RS code generator polynomial, index form * prim = primitive element to generate polynomial roots * nroots = RS code generator polynomial degree (number of roots) - * pad = padding bytes at front of shortened block */ -void *INIT_RS(int symsize,int gfpoly,int fcr,int prim, - int nroots,int pad){ +void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned fcr,unsigned prim, + unsigned int nroots){ struct rs *rs; int i, j, sr,root,iprim; @@ -39,19 +38,16 @@ void *INIT_RS(int symsize,int gfpoly,int fcr,int prim, if(symsize < 0 || symsize > (int)(8*sizeof(DTYPE))) return NULL; /* Need version with ints rather than chars */ - if(fcr < 0 || fcr >= (1<= (1<= (1<= (1<= (1<= (1<= ((1<mm = symsize; rs->nn = (1<pad = pad; rs->alpha_to = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1)); if(rs->alpha_to == NULL){ diff --git a/lib/jt9.f90 b/lib/jt9.f90 index e07fd742e..3bfac6721 100644 --- a/lib/jt9.f90 +++ b/lib/jt9.f90 @@ -20,7 +20,7 @@ program jt9 real*8 TRperiod character c character(len=500) optarg, infile - character wisfile*80 + character wisfile*256 !### ndepth was defined as 60001. Why??? integer :: arglen,stat,offset,remain,mode=0,flow=200,fsplit=2700, & fhigh=4000,nrxfreq=1500,ndepth=1,nexp_decode=0,nQSOProg=0 @@ -301,6 +301,9 @@ program jt9 shared_data%params%napwid=75 shared_data%params%dttol=3. if(mode.eq.164 .and. nsubmode.lt.100) nsubmode=nsubmode+100 + shared_data%params%nagain=.false. + shared_data%params%nclearave=.false. + shared_data%params%lapcqonly=.false. shared_data%params%naggressive=0 shared_data%params%n2pass=2 shared_data%params%nQSOprogress=nQSOProg @@ -322,6 +325,10 @@ program jt9 shared_data%params%nmode=mode end if shared_data%params%nsubmode=nsubmode + +!### temporary, for MAP65: + if(mode.eq.66 .and. TRperiod.eq.60) shared_data%params%emedelay=2.5 + datetime="2013-Apr-16 15:13" !### Temp shared_data%params%datetime=transfer(datetime,shared_data%params%datetime) if(mode.eq.9 .and. fsplit.ne.2700) shared_data%params%nfa=fsplit diff --git a/lib/jt9com.f90 b/lib/jt9com.f90 index 3a6b8759c..5b2970c05 100644 --- a/lib/jt9com.f90 +++ b/lib/jt9com.f90 @@ -41,6 +41,7 @@ integer(c_int) :: naggressive logical(c_bool) :: nrobust integer(c_int) :: nexp_decode + integer(c_int) :: max_drift character(kind=c_char) :: datetime(20) character(kind=c_char) :: mycall(12) character(kind=c_char) :: mygrid(6) diff --git a/lib/map65_mmdec.f90 b/lib/map65_mmdec.f90 new file mode 100644 index 000000000..ca9f959ed --- /dev/null +++ b/lib/map65_mmdec.f90 @@ -0,0 +1,95 @@ +subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & + nagain,max_drift,mycall,hiscall,hisgrid) + + use prog_args + use timer_module, only: timer + use q65_decode + + include 'jt9com.f90' + include 'timer_common.inc' + + type, extends(q65_decoder) :: counting_q65_decoder + integer :: decoded + end type counting_q65_decoder + + logical single_decode,bVHF,lnewdat,lagain,lclearave,lapcqonly + integer*2 id2(300*12000) +! type(params_block) :: params + character(len=20) :: datetime + character(len=12) :: mycall, hiscall + character(len=6) :: hisgrid + data ntr0/-1/ + save + type(counting_q65_decoder) :: my_q65 + +! Cast C character arrays to Fortran character strings +! datetime=transfer(params%datetime, datetime) +! mycall=transfer(params%mycall,mycall) +! hiscall=transfer(params%hiscall,hiscall) +! mygrid=transfer(params%mygrid,mygrid) +! hisgrid=transfer(params%hisgrid,hisgrid) + datetime=' ' + + my_q65%decoded = 0 + ncontest=0 + nQSOprogress=0 + lclearave=.false. + single_decode=.false. + lapcqonly=.false. + lnewdat=(newdat.ne.0) + lagain=(nagain.ne.0) + bVHF=.true. + emedelay=2.5 + ndepth=1 + ntrperiod=60 + + open(17,file=trim(temp_dir)//'/red.dat',status='unknown') + open(14,file=trim(temp_dir)//'/avemsg.txt',status='unknown') + + call timer('dec_q65 ',0) + call my_q65%decode(q65_decoded,id2,nqd,nutc,ntrperiod,nsubmode,nfqso, & + ntol,ndepth,nfa,nfb,lclearave,single_decode,lagain,max_drift,lnewdat, & + emedelay,mycall,hiscall,hisgrid,nQSOProgress,ncontest,lapcqonly,navg0) + call timer('dec_q65 ',1) + + return + +contains + + subroutine q65_decoded (this,nutc,snr1,nsnr,dt,freq,decoded,idec, & + nused,ntrperiod) + + use q65_decode + implicit none + + class(q65_decoder), intent(inout) :: this + integer, intent(in) :: nutc + real, intent(in) :: snr1 + integer, intent(in) :: nsnr + real, intent(in) :: dt + real, intent(in) :: freq + character(len=37), intent(in) :: decoded + integer, intent(in) :: idec + integer, intent(in) :: nused + integer, intent(in) :: ntrperiod + + if(nutc+snr1+nsnr+dt+freq+idec+nused+ntrperiod.eq.-999) stop + if(decoded.eq.'-999') stop + + cq0='q ' + write(cq0(2:2),'(i1)') idec + if(nused.ge.2) write(cq0(3:3),'(i1)') nused + nsnr0=nsnr + xdt0=dt + nfreq0=nint(freq) + msg0=decoded + + select type(this) + type is (counting_q65_decoder) + if(idec.ge.0) this%decoded = this%decoded + 1 + end select + + return + end subroutine q65_decoded + +end subroutine map65_mmdec diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 5acc15f52..f917d5b7d 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -1,5 +1,9 @@ module q65_decode + integer nsnr0,nfreq0 + real xdt0 + character msg0*37,cq0*3 + type :: q65_decoder procedure(q65_decode_callback), pointer :: callback contains @@ -26,9 +30,10 @@ module q65_decode contains - subroutine decode(this,callback,iwave,nutc,ntrperiod,nsubmode,nfqso, & - ntol,ndepth,nfa0,nfb0,lclearave,single_decode,lagain,lnewdat0, & - emedelay,mycall,hiscall,hisgrid,nQSOprogress,ncontest,lapcqonly,navg0) + subroutine decode(this,callback,iwave,nqd0,nutc,ntrperiod,nsubmode,nfqso, & + ntol,ndepth,nfa0,nfb0,lclearave,single_decode,lagain,max_drift0, & + lnewdat0,emedelay,mycall,hiscall,hisgrid,nQSOprogress,ncontest, & + lapcqonly,navg0) ! Top-level routine that organizes the decoding of Q65 signals ! Input: iwave Raw data, i*2 @@ -67,15 +72,17 @@ contains integer dat4(13) !Decoded message as 12 6-bit integers integer dgen(13) logical lclearave,lnewdat0,lapcqonly,unpk77_success - logical single_decode,lagain,ex + logical single_decode,lagain complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s - + ! Start by setting some parameters and allocating storage for large arrays call sec0(0,tdecode) nfa=nfa0 nfb=nfb0 + nqd=nqd0 lnewdat=lnewdat0 + max_drift=max_drift0 idec=-1 idf=0 idt=0 @@ -84,6 +91,7 @@ contains npts=ntrperiod*12000 nfft1=ntrperiod*12000 nfft2=ntrperiod*6000 + npasses=1 ! Determine the T/R sequence: iseq=0 (even), or iseq=1 (odd) n=nutc @@ -116,33 +124,33 @@ contains baud=12000.0/nsps this%callback => callback nFadingModel=1 - - inquire(file='ndepth.dat',exist=ex) - if(.not.ex) ndepth=iand(ndepth,not(3)) + 1 !Treat any ndepth as "Fast" - maxiters=67 + maxiters=33 ibwa=max(1,int(1.8*log(baud*mode_q65)) + 1) - ibwb=min(10,ibwa+4) + ibwb=min(10,ibwa+2) if(iand(ndepth,3).ge.2) then ibwa=max(1,int(1.8*log(baud*mode_q65)) + 1) ibwb=min(10,ibwa+5) + maxiters=67 else if(iand(ndepth,3).eq.3) then ibwa=max(1,ibwa-1) ibwb=min(10,ibwb+1) maxiters=100 endif - -! Generate codewords for full-AP list decoding - call q65_set_list(mycall,hiscall,hisgrid,codewords,ncw) +! Generate codewords for full-AP list decoding + if(ichar(hiscall(1:1)).eq.0) hiscall=' ' + if(ichar(hisgrid(1:1)).eq.0) hisgrid=' ' + ncw=0 + if(nqd.eq.1 .or. lagain) then + call q65_set_list(mycall,hiscall,hisgrid,codewords,ncw) + endif dgen=0 call q65_enc(dgen,codewords) !Initialize the Q65 codec - nused=1 iavg=0 call timer('q65_dec0',0) ! Call top-level routine in q65 module: establish sync and try for a q3 decode. call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec) -! idec=-1 !### TEMPORARY ### call timer('q65_dec0',1) if(idec.ge.0) then @@ -298,7 +306,6 @@ contains call timer('q65loops',0) call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, & xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec) -! idec=-1 !### TEMPORARY ### call timer('q65loops',1) if(idec.ge.0) then dtdec=xdt1 diff --git a/lib/qra/q65/q65.c b/lib/qra/q65/q65.c index f7701792f..10d756d8a 100644 --- a/lib/qra/q65/q65.c +++ b/lib/qra/q65/q65.c @@ -434,11 +434,14 @@ int q65_intrinsics_fastfading(q65_codec_ds *pCodec, // exponentiate and accumulate the normalization constant sumix = 0.0f; - for (k=0;k 85.0) x= 85.0; + fTemp = expf(x); + pCurIx[k]=fTemp; + sumix +=fTemp; + } // scale to a probability distribution sumix = 1.0f/sumix; @@ -663,9 +666,11 @@ int q65_check_llh(float *llh, const int* ydec, const int nN, const int nM, const float t = 0; for (k=0;ks3lim) s3(1:LL*NN)=s3lim diff --git a/lib/qra/q65/q65code.f90 b/lib/qra/q65/q65code.f90 new file mode 100644 index 000000000..d61cba916 --- /dev/null +++ b/lib/qra/q65/q65code.f90 @@ -0,0 +1,29 @@ +program q65code + use q65_encoding + + implicit none + character*37 msg37 + integer nargs + integer codeword(65),tones(85) + + nargs=iargc() + if(nargs .ne. 1) then + print*,'Usage: q65code "msg"' + goto 999 + endif + call getarg(1,msg37) + + call get_q65_tones(msg37,codeword,tones) + + write(*,*) 'Generated message plus CRC (90 bits)' + write(*,'(a8,15i4)') '6 bit : ',codeword(1:15) + write(*,'(a8,15b6.6)') 'binary: ',codeword(1:15) + write(*,*) ' ' + write(*,*) 'Codeword with CRC symbols (65 symbols)' + write(*,'(20i3)') codeword + + write(*,*) ' ' + write(*,*) 'Channel symbols (85 total)' + write(*,'(20i3)') tones + +999 end program q65code diff --git a/lib/qra/q65/qra15_65_64_irr_e23.c b/lib/qra/q65/qra15_65_64_irr_e23.c index d56e057fd..88667169c 100644 --- a/lib/qra/q65/qra15_65_64_irr_e23.c +++ b/lib/qra/q65/qra15_65_64_irr_e23.c @@ -494,7 +494,7 @@ static const int qra_pmat[qra_M*qra_M] = { 3, 1, 7, 5, 11, 9, 15, 13, 19, 17, 23, 21, 27, 25, 31, 29, 35, 33, 39, 37, 43, 41, 47, 45, 51, 49, 55, 53, 59, 57, 63, 61 }; - +/* // SO array static const int SO[qra_N-qra_K+1] = { 14, 2, 4, 5, 9, 13, 10, 15, 11, 6, 1, 8, 2, 12, 9, 10, @@ -515,6 +515,7 @@ static const int LOGWO[qra_N-qra_K+1] = { static const int repfact[qra_K] = { 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3 }; +*/ const qracode qra15_65_64_irr_e23 = { qra_K, diff --git a/lib/symspec.f90 b/lib/symspec.f90 index 8f5ddd093..38189a3c2 100644 --- a/lib/symspec.f90 +++ b/lib/symspec.f90 @@ -126,35 +126,3 @@ subroutine symspec(shared_data,k,TRperiod,nsps,ingain,bLowSidelobes, & return end subroutine symspec - -subroutine chk_samples(ihsym,k,nstop) - - integer*8 count0,count1,clkfreq - integer itime(8) - real*8 dtime,fsample - character*12 ctime - data count0/-1/,k0/99999999/,maxhsym/0/ - save count0,k0,maxhsym - - if(k.lt.k0 .or. count0.eq.-1) then - call system_clock(count0,clkfreq) - maxhsym=0 - endif -! if((mod(ihsym,100).eq.0 .or. ihsym.ge.nstop-100) .and. & -! k0.ne.99999999) then -! call system_clock(count1,clkfreq) -! dtime=dfloat(count1-count0)/dfloat(clkfreq) -! if(dtime.lt.28.0) return -! if(dtime.gt.1.d-6) fsample=(k-3456)/dtime -! call date_and_time(values=itime) -! sec=itime(7)+0.001*itime(8) -! write(ctime,3000) itime(5)-itime(4)/60,itime(6),sec -!3000 format(i2.2,':',i2.2,':',f6.3) -! write(33,3033) ctime,dtime,ihsym,nstop,k,fsample -!3033 format(a12,f12.6,2i7,i10,f15.3) -! flush(33) -! endif - k0=k - - return -end subroutine chk_samples diff --git a/lib/test_q65.f90 b/lib/test_q65.f90 index 4135a290d..e2987d719 100644 --- a/lib/test_q65.f90 +++ b/lib/test_q65.f90 @@ -1,6 +1,6 @@ program test_q65 - character*82 cmd1,cmd2,line + character*84 cmd1,cmd2,line character*22 msg character*8 arg character*1 csubmode @@ -71,8 +71,8 @@ program test_q65 tsym=1.0/baud ! 1 2 3 4 5 6 7 -! 123456789012345678901234567890123456789012345678901234567890123456789012345' - cmd1='q65sim "K1ABC W9XYZ EN37 " A 1500 5.0 0.0 0.0 1 60 100 -10.0 > junk0' +! 1234567890123456789012345678901234567890123456789012345678901234567890123456' + cmd1='q65sim "K1ABC W9XYZ EN37 " A 1500 5.0 0.0 0.0 1 60 100 -10.0 > junk0' cmd2='jt9 -3 -p 15 -L 300 -H 3000 -d 3 -b A -Q 3 -f 1500 *.wav > junk' write(cmd1(10:33),'(a)') '"'//msg//'"' @@ -80,10 +80,10 @@ program test_q65 write(cmd1(37:40),'(i4)') nf0 write(cmd1(41:45),'(f5.0)') fDop write(cmd1(46:50),'(f5.2)') dt - write(cmd1(51:54),'(f4.0)') f1 - write(cmd1(55:57),'(i3)') nstp - write(cmd1(58:61),'(i4)') ntrperiod - write(cmd1(62:66),'(i5)') nfiles + write(cmd1(51:56),'(i6)') nint(f1) + write(cmd1(57:59),'(i3)') nstp + write(cmd1(60:63),'(i4)') ntrperiod + write(cmd1(64:68),'(i5)') nfiles write(cmd2(11:13),'(i3)') ntrperiod write(cmd2(33:35),'(i3)') ndepth @@ -94,7 +94,7 @@ program test_q65 call system('rm -f *.wav') write(*,1008) ntrperiod,csubmode,ndepth,fDop,f1,nstp -1008 format('Mode:',i4,a1,' Depth:',i3,' fDop:',f6.1,' Drift:',f6.1, & +1008 format('Mode:',i4,a1,' Depth:',i3,' fDop:',f6.1,' Drift:',f8.1, & ' Steps:',i3) write(*,1010) (j,j=0,5) write(12,1010) (j,j=0,5) @@ -112,7 +112,7 @@ program test_q65 nfalse=0 naptype=0 ndecn=0 - write(cmd1(70:74),'(f5.1)') snr1 + write(cmd1(72:76),'(f5.1)') snr1 call system(cmd1) call sec0(0,tdec) call system(cmd2) diff --git a/lib/twkfreq.f90 b/lib/twkfreq.f90 index 7c240d529..5188d5006 100644 --- a/lib/twkfreq.f90 +++ b/lib/twkfreq.f90 @@ -1,5 +1,9 @@ subroutine twkfreq(c3,c4,npts,fsample,a) + ! Adjust frequency of complex data + ! a(1) Hz + ! a(2) Hz/(0.5*TxT), where TxT = npts/fsample = file duration + complex c3(npts) complex c4(npts) complex w,wstep diff --git a/map65/.gitignore b/map65/.gitignore new file mode 100644 index 000000000..74b59e474 --- /dev/null +++ b/map65/.gitignore @@ -0,0 +1 @@ +~* diff --git a/map65/CMakeLists.txt b/map65/CMakeLists.txt new file mode 100644 index 000000000..2eba82efb --- /dev/null +++ b/map65/CMakeLists.txt @@ -0,0 +1,70 @@ +set (map65_CXXSRCS + about.cpp + astro.cpp + bandmap.cpp + devsetup.cpp + displaytext.cpp + getdev.cpp + getfile.cpp + main.cpp + mainwindow.cpp + messages.cpp + meterwidget.cpp + plotter.cpp + set570.cpp + signalmeter.cpp + soundin.cpp + soundout.cpp + txtune.cpp + widegraph.cpp + ) + +if (WIN32) + set (map65_CXXSRCS ${map65_CXXSRCS} killbyname.cpp) +endif (WIN32) + +set (map65_UISRCS + about.ui + astro.ui + bandmap.ui + devsetup.ui + mainwindow.ui + messages.ui + txtune.ui + widegraph.ui +) + +set (map65_C_and_CXXSRCS + ${map65_CSRCS} + ${map65_CXXSRCS} + ) +set_property (SOURCE ${map65_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS " -include wsjtx_config.h") +set_property (SOURCE ${map65_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/wsjtx_config.h) + +# build the subdirectories +add_subdirectory (libm65) + +# UI generation +qt5_wrap_ui (map65_GENUISRCS ${map65_UISRCS}) + +add_executable (map65 ${map65_CXXSRCS} ${map65_CSRCS} ${map65_GENUISRCS} map65.rc) +target_include_directories (map65 PRIVATE ${CMAKE_SOURCE_DIR} ${FFTW3_INCLUDE_DIRS}) +target_link_libraries (map65 wsjt_qt m65impl ${FFTW3_LIBRARIES} Qt5::Widgets Qt5::Network Portaudio::Portaudio Usb::Usb) + +if (WIN32) + install ( + CODE "get_filename_component (_path \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/wsjtx_dir.txt\" REALPATH) + if (WIN32) + set (_separator \"\\\\\") + else () + set (_separator \"/\") + endif () + file (WRITE \"\${_path}\" \".\${_separator}\\n\")" + ) + + install ( + TARGETS map65 + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime + BUNDLE DESTINATION . COMPONENT runtime + ) +endif () \ No newline at end of file diff --git a/map65/LICENSE_WHEATLEY.TXT b/map65/LICENSE_WHEATLEY.TXT new file mode 100644 index 000000000..8adb5204b --- /dev/null +++ b/map65/LICENSE_WHEATLEY.TXT @@ -0,0 +1,30 @@ ++ + + This Software is released under the "Simplified BSD License" + + + +Copyright 2010 Moe Wheatley. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY Moe Wheatley ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Moe Wheatley OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation +are those of the authors and should not be interpreted as representing +official policies, either expressed or implied, of Moe Wheatley. diff --git a/map65/MAP65_Beta_Release.docx b/map65/MAP65_Beta_Release.docx new file mode 100644 index 000000000..acdc02773 Binary files /dev/null and b/map65/MAP65_Beta_Release.docx differ diff --git a/map65/about.cpp b/map65/about.cpp new file mode 100644 index 000000000..c05b169e2 --- /dev/null +++ b/map65/about.cpp @@ -0,0 +1,23 @@ +#include "about.h" +#include "revision_utils.hpp" +#include "ui_about.h" + +CAboutDlg::CAboutDlg(QWidget *parent) : + QDialog(parent), + ui(new Ui::CAboutDlg) +{ + ui->setupUi(this); + ui->labelTxt->setText("

" + QString {"MAP65 v" + + QCoreApplication::applicationVersion () + + " " + revision ()}.simplified () + "


" + "MAP65 implements a wideband polarization-matching receiver
" + "for the JT65 protocol, with a matching transmitting facility.
" + "It is primarily intended for amateur radio EME communication.

" + "Copyright 2001-2021 by Joe Taylor, K1JT. Additional
" + "acknowledgments are contained in the source code."); +} + +CAboutDlg::~CAboutDlg() +{ + delete ui; +} diff --git a/map65/about.h b/map65/about.h new file mode 100644 index 000000000..a5206661a --- /dev/null +++ b/map65/about.h @@ -0,0 +1,23 @@ +#ifndef ABOUTDLG_H +#define ABOUTDLG_H + +#include + +namespace Ui { + class CAboutDlg; +} + +class CAboutDlg : public QDialog +{ + Q_OBJECT + +public: + explicit CAboutDlg(QWidget *parent = nullptr); + ~CAboutDlg(); + +private: + Ui::CAboutDlg *ui; + QString m_Str; +}; + +#endif // ABOUTDLG_H diff --git a/map65/about.ui b/map65/about.ui new file mode 100644 index 000000000..fb20f48db --- /dev/null +++ b/map65/about.ui @@ -0,0 +1,37 @@ + + + CAboutDlg + + + Qt::NonModal + + + + 0 + 0 + 374 + 164 + + + + + 0 + 0 + + + + About MAP65 + + + + + + + + + + + + + + diff --git a/map65/afmhot.dat b/map65/afmhot.dat new file mode 100644 index 000000000..7599d4aa8 --- /dev/null +++ b/map65/afmhot.dat @@ -0,0 +1,257 @@ + 0 0.0000 0.0000 0.0000 + 1 0.0000 0.0000 0.0000 + 2 0.0078 0.0000 0.0000 + 3 0.0157 0.0000 0.0000 + 4 0.0235 0.0000 0.0000 + 5 0.0314 0.0000 0.0000 + 6 0.0392 0.0000 0.0000 + 7 0.0471 0.0000 0.0000 + 8 0.0549 0.0000 0.0000 + 9 0.0627 0.0000 0.0000 + 10 0.0706 0.0000 0.0000 + 11 0.0784 0.0000 0.0000 + 12 0.0863 0.0000 0.0000 + 13 0.0941 0.0000 0.0000 + 14 0.1020 0.0000 0.0000 + 15 0.1098 0.0000 0.0000 + 16 0.1176 0.0000 0.0000 + 17 0.1255 0.0000 0.0000 + 18 0.1333 0.0000 0.0000 + 19 0.1412 0.0000 0.0000 + 20 0.1490 0.0000 0.0000 + 21 0.1569 0.0000 0.0000 + 22 0.1647 0.0000 0.0000 + 23 0.1725 0.0000 0.0000 + 24 0.1804 0.0000 0.0000 + 25 0.1882 0.0000 0.0000 + 26 0.1961 0.0000 0.0000 + 27 0.2039 0.0000 0.0000 + 28 0.2118 0.0000 0.0000 + 29 0.2196 0.0000 0.0000 + 30 0.2275 0.0000 0.0000 + 31 0.2353 0.0000 0.0000 + 32 0.2431 0.0000 0.0000 + 33 0.2510 0.0000 0.0000 + 34 0.2588 0.0000 0.0000 + 35 0.2667 0.0000 0.0000 + 36 0.2745 0.0000 0.0000 + 37 0.2824 0.0000 0.0000 + 38 0.2902 0.0000 0.0000 + 39 0.2980 0.0000 0.0000 + 40 0.3059 0.0000 0.0000 + 41 0.3137 0.0000 0.0000 + 42 0.3216 0.0000 0.0000 + 43 0.3294 0.0000 0.0000 + 44 0.3373 0.0000 0.0000 + 45 0.3451 0.0000 0.0000 + 46 0.3529 0.0000 0.0000 + 47 0.3608 0.0000 0.0000 + 48 0.3686 0.0000 0.0000 + 49 0.3765 0.0000 0.0000 + 50 0.3843 0.0000 0.0000 + 51 0.3922 0.0000 0.0000 + 52 0.4000 0.0000 0.0000 + 53 0.4078 0.0000 0.0000 + 54 0.4157 0.0000 0.0000 + 55 0.4235 0.0000 0.0000 + 56 0.4314 0.0000 0.0000 + 57 0.4392 0.0000 0.0000 + 58 0.4471 0.0000 0.0000 + 59 0.4549 0.0000 0.0000 + 60 0.4627 0.0000 0.0000 + 61 0.4706 0.0000 0.0000 + 62 0.4784 0.0000 0.0000 + 63 0.4863 0.0000 0.0000 + 64 0.4941 0.0000 0.0000 + 65 0.5020 0.0000 0.0000 + 66 0.5098 0.0098 0.0000 + 67 0.5176 0.0176 0.0000 + 68 0.5255 0.0255 0.0000 + 69 0.5333 0.0333 0.0000 + 70 0.5412 0.0412 0.0000 + 71 0.5490 0.0490 0.0000 + 72 0.5569 0.0569 0.0000 + 73 0.5647 0.0647 0.0000 + 74 0.5725 0.0725 0.0000 + 75 0.5804 0.0804 0.0000 + 76 0.5882 0.0882 0.0000 + 77 0.5961 0.0961 0.0000 + 78 0.6039 0.1039 0.0000 + 79 0.6118 0.1118 0.0000 + 80 0.6196 0.1196 0.0000 + 81 0.6275 0.1275 0.0000 + 82 0.6353 0.1353 0.0000 + 83 0.6431 0.1431 0.0000 + 84 0.6510 0.1510 0.0000 + 85 0.6588 0.1588 0.0000 + 86 0.6667 0.1667 0.0000 + 87 0.6745 0.1745 0.0000 + 88 0.6824 0.1824 0.0000 + 89 0.6902 0.1902 0.0000 + 90 0.6980 0.1980 0.0000 + 91 0.7059 0.2059 0.0000 + 92 0.7137 0.2137 0.0000 + 93 0.7216 0.2216 0.0000 + 94 0.7294 0.2294 0.0000 + 95 0.7373 0.2373 0.0000 + 96 0.7451 0.2451 0.0000 + 97 0.7529 0.2529 0.0000 + 98 0.7608 0.2608 0.0000 + 99 0.7686 0.2686 0.0000 + 100 0.7765 0.2765 0.0000 + 101 0.7843 0.2843 0.0000 + 102 0.7922 0.2922 0.0000 + 103 0.8000 0.3000 0.0000 + 104 0.8078 0.3078 0.0000 + 105 0.8157 0.3157 0.0000 + 106 0.8235 0.3235 0.0000 + 107 0.8314 0.3314 0.0000 + 108 0.8392 0.3392 0.0000 + 109 0.8471 0.3471 0.0000 + 110 0.8549 0.3549 0.0000 + 111 0.8627 0.3627 0.0000 + 112 0.8706 0.3706 0.0000 + 113 0.8784 0.3784 0.0000 + 114 0.8863 0.3863 0.0000 + 115 0.8941 0.3941 0.0000 + 116 0.9020 0.4020 0.0000 + 117 0.9098 0.4098 0.0000 + 118 0.9176 0.4176 0.0000 + 119 0.9255 0.4255 0.0000 + 120 0.9333 0.4333 0.0000 + 121 0.9412 0.4412 0.0000 + 122 0.9490 0.4490 0.0000 + 123 0.9569 0.4569 0.0000 + 124 0.9647 0.4647 0.0000 + 125 0.9725 0.4725 0.0000 + 126 0.9804 0.4804 0.0000 + 127 0.9882 0.4882 0.0000 + 128 0.9961 0.4961 0.0000 + 129 1.0000 0.5039 0.0000 + 130 1.0000 0.5118 0.0118 + 131 1.0000 0.5196 0.0196 + 132 1.0000 0.5275 0.0275 + 133 1.0000 0.5353 0.0353 + 134 1.0000 0.5431 0.0431 + 135 1.0000 0.5510 0.0510 + 136 1.0000 0.5588 0.0588 + 137 1.0000 0.5667 0.0667 + 138 1.0000 0.5745 0.0745 + 139 1.0000 0.5824 0.0824 + 140 1.0000 0.5902 0.0902 + 141 1.0000 0.5980 0.0980 + 142 1.0000 0.6059 0.1059 + 143 1.0000 0.6137 0.1137 + 144 1.0000 0.6216 0.1216 + 145 1.0000 0.6294 0.1294 + 146 1.0000 0.6373 0.1373 + 147 1.0000 0.6451 0.1451 + 148 1.0000 0.6529 0.1529 + 149 1.0000 0.6608 0.1608 + 150 1.0000 0.6686 0.1686 + 151 1.0000 0.6765 0.1765 + 152 1.0000 0.6843 0.1843 + 153 1.0000 0.6922 0.1922 + 154 1.0000 0.7000 0.2000 + 155 1.0000 0.7078 0.2078 + 156 1.0000 0.7157 0.2157 + 157 1.0000 0.7235 0.2235 + 158 1.0000 0.7314 0.2314 + 159 1.0000 0.7392 0.2392 + 160 1.0000 0.7471 0.2471 + 161 1.0000 0.7549 0.2549 + 162 1.0000 0.7627 0.2627 + 163 1.0000 0.7706 0.2706 + 164 1.0000 0.7784 0.2784 + 165 1.0000 0.7863 0.2863 + 166 1.0000 0.7941 0.2941 + 167 1.0000 0.8020 0.3020 + 168 1.0000 0.8098 0.3098 + 169 1.0000 0.8176 0.3176 + 170 1.0000 0.8255 0.3255 + 171 1.0000 0.8333 0.3333 + 172 1.0000 0.8412 0.3412 + 173 1.0000 0.8490 0.3490 + 174 1.0000 0.8569 0.3569 + 175 1.0000 0.8647 0.3647 + 176 1.0000 0.8725 0.3725 + 177 1.0000 0.8804 0.3804 + 178 1.0000 0.8882 0.3882 + 179 1.0000 0.8961 0.3961 + 180 1.0000 0.9039 0.4039 + 181 1.0000 0.9118 0.4118 + 182 1.0000 0.9196 0.4196 + 183 1.0000 0.9275 0.4275 + 184 1.0000 0.9353 0.4353 + 185 1.0000 0.9431 0.4431 + 186 1.0000 0.9510 0.4510 + 187 1.0000 0.9588 0.4588 + 188 1.0000 0.9667 0.4667 + 189 1.0000 0.9745 0.4745 + 190 1.0000 0.9824 0.4824 + 191 1.0000 0.9902 0.4902 + 192 1.0000 0.9980 0.4980 + 193 1.0000 1.0000 0.5059 + 194 1.0000 1.0000 0.5137 + 195 1.0000 1.0000 0.5216 + 196 1.0000 1.0000 0.5294 + 197 1.0000 1.0000 0.5373 + 198 1.0000 1.0000 0.5451 + 199 1.0000 1.0000 0.5529 + 200 1.0000 1.0000 0.5608 + 201 1.0000 1.0000 0.5686 + 202 1.0000 1.0000 0.5765 + 203 1.0000 1.0000 0.5843 + 204 1.0000 1.0000 0.5922 + 205 1.0000 1.0000 0.6000 + 206 1.0000 1.0000 0.6078 + 207 1.0000 1.0000 0.6157 + 208 1.0000 1.0000 0.6235 + 209 1.0000 1.0000 0.6314 + 210 1.0000 1.0000 0.6392 + 211 1.0000 1.0000 0.6471 + 212 1.0000 1.0000 0.6549 + 213 1.0000 1.0000 0.6627 + 214 1.0000 1.0000 0.6706 + 215 1.0000 1.0000 0.6784 + 216 1.0000 1.0000 0.6863 + 217 1.0000 1.0000 0.6941 + 218 1.0000 1.0000 0.7020 + 219 1.0000 1.0000 0.7098 + 220 1.0000 1.0000 0.7176 + 221 1.0000 1.0000 0.7255 + 222 1.0000 1.0000 0.7333 + 223 1.0000 1.0000 0.7412 + 224 1.0000 1.0000 0.7490 + 225 1.0000 1.0000 0.7569 + 226 1.0000 1.0000 0.7647 + 227 1.0000 1.0000 0.7725 + 228 1.0000 1.0000 0.7804 + 229 1.0000 1.0000 0.7882 + 230 1.0000 1.0000 0.7961 + 231 1.0000 1.0000 0.8039 + 232 1.0000 1.0000 0.8118 + 233 1.0000 1.0000 0.8196 + 234 1.0000 1.0000 0.8275 + 235 1.0000 1.0000 0.8353 + 236 1.0000 1.0000 0.8431 + 237 1.0000 1.0000 0.8510 + 238 1.0000 1.0000 0.8588 + 239 1.0000 1.0000 0.8667 + 240 1.0000 1.0000 0.8745 + 241 1.0000 1.0000 0.8824 + 242 1.0000 1.0000 0.8902 + 243 1.0000 1.0000 0.8980 + 244 1.0000 1.0000 0.9059 + 245 1.0000 1.0000 0.9137 + 246 1.0000 1.0000 0.9216 + 247 1.0000 1.0000 0.9294 + 248 1.0000 1.0000 0.9373 + 249 1.0000 1.0000 0.9451 + 250 1.0000 1.0000 0.9529 + 251 1.0000 1.0000 0.9608 + 252 1.0000 1.0000 0.9686 + 253 1.0000 1.0000 0.9765 + 254 1.0 0.0 0.0 + 255 1.0 1.0 0.0 + 256 0.0 1.000 0.0 diff --git a/map65/astro.cpp b/map65/astro.cpp new file mode 100644 index 000000000..b4bf83b67 --- /dev/null +++ b/map65/astro.cpp @@ -0,0 +1,122 @@ +#include "astro.h" +#include +#include "ui_astro.h" +#include +#include +#include +#include +#include "SettingsGroup.hpp" +#include "commons.h" + +extern "C" { + void astrosub_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, + const char* mygrid, const char* hisgrid, double* azsun, + double* elsun, double* azmoon, double* elmoon, double* azmoondx, + double* elmoondx, int* ntsky, int* ndop, int* ndop00, + double* ramoon, double* decmoon, double* dgrd, double* poloffset, + double* xnr, int len1, int len2); +} + +Astro::Astro (QString const& settings_filename, QWidget *parent) : + QWidget(parent), + ui(new Ui::Astro), + m_settings_filename {settings_filename} +{ + ui->setupUi (this); + setWindowTitle ("Astronomical Data"); + setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for + // historical reasons + setGeometry (settings.value ("AstroGeom", QRect {71, 390, 227, 403}).toRect ()); + ui->astroTextBrowser->setStyleSheet( + "QTextBrowser { background-color : cyan; color : black; }"); + ui->astroTextBrowser->clear(); + m_AzElDir0=""; +} + +Astro::~Astro() +{ + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue ("AstroGeom", geometry ()); + delete ui; +} + +void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, + int fQSO, int nsetftx, int ntxFreq, QString azelDir) +{ + static int ntxFreq0=-99; + char cc[300]; + double azsun,elsun,azmoon,elmoon,azmoondx,elmoondx; + double ramoon,decmoon,dgrd,poloffset,xnr; + int ntsky,ndop,ndop00; + QString date = t.date().toString("yyyy MMM dd"); + QString utc = t.time().toString(); + int nyear=t.date().year(); + int month=t.date().month(); + int nday=t.date().day(); + int nhr=t.time().hour(); + int nmin=t.time().minute(); + double sec=t.time().second() + 0.001*t.time().msec(); + int isec=sec; + double uth=nhr + nmin/60.0 + sec/3600.0; + int nfreq=(int)datcom_.fcenter; + if(nfreq<10 or nfreq > 50000) nfreq=144; + + astrosub_(&nyear, &month, &nday, &uth, &nfreq, mygrid.toLatin1(), + hisgrid.toLatin1(), &azsun, &elsun, &azmoon, &elmoon, + &azmoondx, &elmoondx, &ntsky, &ndop, &ndop00,&ramoon, &decmoon, + &dgrd, &poloffset, &xnr, 6, 6); + + sprintf(cc, + "Az: %6.1f\n" + "El: %6.1f\n" + "MyDop: %6d\n" + "DxAz: %6.1f\n" + "DxEl: %6.1f\n" + "DxDop: %6d\n" + "Dec: %6.1f\n" + "SunAz: %6.1f\n" + "SunEl: %6.1f\n" + "Tsky: %6d\n" + "MNR: %6.1f\n" + "Dgrd: %6.1f", + azmoon,elmoon,ndop00,azmoondx,elmoondx,ndop,decmoon,azsun,elsun, + ntsky,xnr,dgrd); + ui->astroTextBrowser->setText(" "+ date + "\nUTC: " + utc + "\n" + cc); + + QString fname=azelDir+"/azel.dat"; + QFile f(fname); + if(!f.open(QIODevice::WriteOnly | QIODevice::Text)) { + if(azelDir==m_AzElDir0) return; + m_AzElDir0=azelDir; + QMessageBox mb; + mb.setText("Cannot open " + fname + "\nCorrect the setting of AzEl Directory in Setup?"); + mb.exec(); + return; + } + int ndiff=0; + if(ntxFreq != ntxFreq0) ndiff=1; + ntxFreq0=ntxFreq; + QTextStream out(&f); + sprintf(cc,"%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Moon\n" + "%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Sun\n" + "%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Source\n" + "%4d,%6d,Doppler\n" + "%3d,%1d,fQSO\n" + "%3d,%1d,fQSO2\n", + nhr,nmin,isec,azmoon,elmoon, + nhr,nmin,isec,azsun,elsun, + nhr,nmin,isec,0.0,0.0, + nfreq,ndop, + fQSO,nsetftx, + ntxFreq,ndiff); + out << cc; + f.close(); +} + +void Astro::setFontSize(int n) +{ + ui->astroTextBrowser->setFontPointSize(n); +} diff --git a/map65/astro.h b/map65/astro.h new file mode 100644 index 000000000..f425f3e73 --- /dev/null +++ b/map65/astro.h @@ -0,0 +1,28 @@ +#ifndef ASTRO_H +#define ASTRO_H + +#include +#include + +namespace Ui { + class Astro; +} + +class Astro : public QWidget +{ + Q_OBJECT + +public: + explicit Astro (QString const& settings_filename, QWidget *parent = 0); + void astroUpdate(QDateTime t, QString mygrid, QString hisgrid, + int fQSO, int nsetftx, int ntxFreq, QString azelDir); + void setFontSize(int n); + ~Astro (); + +private: + Ui::Astro *ui; + QString m_settings_filename; + QString m_AzElDir0; +}; + +#endif diff --git a/map65/astro.ui b/map65/astro.ui new file mode 100644 index 000000000..30cce70bb --- /dev/null +++ b/map65/astro.ui @@ -0,0 +1,37 @@ + + + Astro + + + + 0 + 0 + 262 + 483 + + + + Form + + + + + 0 + 10 + 256 + 451 + + + + + Courier New + 20 + 75 + true + + + + + + + diff --git a/map65/bandmap.cpp b/map65/bandmap.cpp new file mode 100644 index 000000000..3c4daecb3 --- /dev/null +++ b/map65/bandmap.cpp @@ -0,0 +1,100 @@ +#include "bandmap.h" +#include +#include "ui_bandmap.h" +#include "qt_helpers.hpp" +#include "SettingsGroup.hpp" +#include + +BandMap::BandMap (QString const& settings_filename, QWidget * parent) + : QWidget {parent}, + ui {new Ui::BandMap}, + m_settings_filename {settings_filename} +{ + ui->setupUi (this); + setWindowTitle ("Band Map"); + setWindowFlags (Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for + // historical reasons + setGeometry (settings.value ("BandMapGeom", QRect {280, 400, 142, 400}).toRect ()); + ui->bmTextBrowser->setStyleSheet( + "QTextBrowser { background-color : #000066; color : red; }"); +} + +BandMap::~BandMap () +{ + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue ("BandMapGeom", geometry ()); + delete ui; +} + +void BandMap::setText(QString t) +{ + m_bandMapText=t; + int w=ui->bmTextBrowser->size().width(); + int ncols=1; + if(w>220) ncols=2; + QString s="QTextBrowser{background-color: "+m_colorBackground+"}"; + ui->bmTextBrowser->setStyleSheet(s); + QString t0="" + "
\n"; + QString tfreq,tspace,tcall; + QString s0,s1,s2,s3,bg; + bg="."; + s0=""; + s1=""; + s2=""; + s3=""; + + ui->bmTextBrowser->clear(); + QStringList lines = t.split( "\n", SkipEmptyParts ); + int nrows=(lines.length()+ncols-1)/ncols; + + for(int i=0; i=3) t0 += s3; + t0 += (tfreq + tspace + tcall + "
\n"); + } + + if(ncols==2) { //2-column display + t0 += "

\n"; + for(int i=nrows; i=3) t0 += s3; + t0 += (tfreq + tspace + tcall + "
\n"); + } + if(2*nrows>lines.length()) t0 += (s0 + "
\n"); + } + ui->bmTextBrowser->setHtml(t0); +} + +void BandMap::resizeEvent(QResizeEvent* ) +{ + setText(m_bandMapText); +} + +void BandMap::setColors(QString t) +{ + m_colorBackground = "#"+t.mid(0,6); + m_color0 = "#"+t.mid(6,6); + m_color1 = "#"+t.mid(12,6); + m_color2 = "#"+t.mid(18,6); + m_color3 = "#"+t.mid(24,6); + setText(m_bandMapText); +} diff --git a/map65/bandmap.h b/map65/bandmap.h new file mode 100644 index 000000000..857925800 --- /dev/null +++ b/map65/bandmap.h @@ -0,0 +1,35 @@ +#ifndef BANDMAP_H +#define BANDMAP_H + +#include + +namespace Ui { + class BandMap; +} + +class BandMap : public QWidget +{ + Q_OBJECT + +public: + explicit BandMap (QString const& settings_filename, QWidget *parent = 0); + void setText(QString t); + void setColors(QString t); + + ~BandMap(); + +protected: + void resizeEvent(QResizeEvent* event); + +private: + Ui::BandMap *ui; + QString m_settings_filename; + QString m_bandMapText; + QString m_colorBackground; + QString m_color0; + QString m_color1; + QString m_color2; + QString m_color3; +}; + +#endif diff --git a/map65/bandmap.ui b/map65/bandmap.ui new file mode 100644 index 000000000..cd87a41dd --- /dev/null +++ b/map65/bandmap.ui @@ -0,0 +1,43 @@ + + + BandMap + + + + 0 + 0 + 329 + 379 + + + + + 0 + 0 + + + + Form + + + + + + + 107 + 0 + + + + + Courier New + 9 + + + + + + + + + diff --git a/map65/blue.dat b/map65/blue.dat new file mode 100644 index 000000000..852295114 --- /dev/null +++ b/map65/blue.dat @@ -0,0 +1,256 @@ + 0 0.0000 0.0000 0.0000 + 1 0.0902 0.0902 0.2558 + 2 0.1176 0.1176 0.2694 + 3 0.1412 0.1412 0.2820 + 4 0.1569 0.1569 0.2938 + 5 0.1725 0.1725 0.3049 + 6 0.1843 0.1843 0.3154 + 7 0.1961 0.1961 0.3254 + 8 0.2039 0.2039 0.3349 + 9 0.2157 0.2157 0.3440 + 10 0.2235 0.2235 0.3528 + 11 0.2314 0.2314 0.3612 + 12 0.2392 0.2392 0.3693 + 13 0.2471 0.2471 0.3772 + 14 0.2549 0.2549 0.3848 + 15 0.2588 0.2588 0.3921 + 16 0.2667 0.2667 0.3992 + 17 0.2706 0.2706 0.4061 + 18 0.2784 0.2784 0.4129 + 19 0.2824 0.2824 0.4194 + 20 0.2902 0.2902 0.4258 + 21 0.2941 0.2941 0.4319 + 22 0.2980 0.2980 0.4380 + 23 0.3059 0.3059 0.4439 + 24 0.3098 0.3098 0.4496 + 25 0.3137 0.3137 0.4553 + 26 0.3176 0.3176 0.4608 + 27 0.3216 0.3216 0.4661 + 28 0.3294 0.3294 0.4714 + 29 0.3333 0.3333 0.4765 + 30 0.3373 0.3373 0.4815 + 31 0.3412 0.3412 0.4865 + 32 0.3451 0.3451 0.4913 + 33 0.3490 0.3490 0.4960 + 34 0.3529 0.3529 0.5006 + 35 0.3569 0.3569 0.5052 + 36 0.3608 0.3608 0.5096 + 37 0.3647 0.3647 0.5140 + 38 0.3686 0.3686 0.5183 + 39 0.3725 0.3725 0.5225 + 40 0.3765 0.3765 0.5266 + 41 0.3804 0.3804 0.5306 + 42 0.3843 0.3843 0.5346 + 43 0.3843 0.3843 0.5385 + 44 0.3882 0.3882 0.5423 + 45 0.3922 0.3922 0.5460 + 46 0.3961 0.3961 0.5497 + 47 0.4000 0.4000 0.5533 + 48 0.4039 0.4039 0.5569 + 49 0.4078 0.4078 0.5603 + 50 0.4118 0.4118 0.5638 + 51 0.4118 0.4118 0.5671 + 52 0.4157 0.4157 0.5704 + 53 0.4196 0.4196 0.5736 + 54 0.4235 0.4235 0.5768 + 55 0.4275 0.4275 0.5799 + 56 0.4314 0.4314 0.5829 + 57 0.4314 0.4314 0.5859 + 58 0.4353 0.4353 0.5889 + 59 0.4392 0.4392 0.5917 + 60 0.4431 0.4431 0.5946 + 61 0.4471 0.4471 0.5973 + 62 0.4471 0.4471 0.6001 + 63 0.4510 0.4510 0.6027 + 64 0.4549 0.4549 0.6053 + 65 0.4588 0.4588 0.6079 + 66 0.4627 0.4627 0.6104 + 67 0.4627 0.4627 0.6129 + 68 0.4667 0.4667 0.6153 + 69 0.4706 0.4706 0.6176 + 70 0.4745 0.4745 0.6199 + 71 0.4745 0.4745 0.6222 + 72 0.4784 0.4784 0.6244 + 73 0.4824 0.4824 0.6266 + 74 0.4863 0.4863 0.6287 + 75 0.4863 0.4863 0.6308 + 76 0.4902 0.4902 0.6328 + 77 0.4941 0.4941 0.6348 + 78 0.4980 0.4980 0.6367 + 79 0.5020 0.5020 0.6386 + 80 0.5020 0.5020 0.6404 + 81 0.5059 0.5059 0.6422 + 82 0.5098 0.5098 0.6440 + 83 0.5098 0.5098 0.6457 + 84 0.5137 0.5137 0.6474 + 85 0.5176 0.5176 0.6490 + 86 0.5216 0.5216 0.6506 + 87 0.5216 0.5216 0.6521 + 88 0.5255 0.5255 0.6536 + 89 0.5294 0.5294 0.6551 + 90 0.5333 0.5333 0.6565 + 91 0.5333 0.5333 0.6578 + 92 0.5373 0.5373 0.6591 + 93 0.5412 0.5412 0.6604 + 94 0.5451 0.5451 0.6617 + 95 0.5451 0.5451 0.6629 + 96 0.5490 0.5490 0.6640 + 97 0.5529 0.5529 0.6651 + 98 0.5569 0.5569 0.6662 + 99 0.5569 0.5569 0.6672 + 100 0.5608 0.5608 0.6682 + 101 0.5647 0.5647 0.6692 + 102 0.5647 0.5647 0.6701 + 103 0.5686 0.5686 0.6710 + 104 0.5725 0.5725 0.6718 + 105 0.5765 0.5765 0.6726 + 106 0.5765 0.5765 0.6733 + 107 0.5804 0.5804 0.6740 + 108 0.5843 0.5843 0.6747 + 109 0.5843 0.5843 0.6753 + 110 0.5882 0.5882 0.6759 + 111 0.5922 0.5922 0.6765 + 112 0.5961 0.5961 0.6770 + 113 0.5961 0.5961 0.6774 + 114 0.6000 0.6000 0.6779 + 115 0.6039 0.6039 0.6783 + 116 0.6039 0.6039 0.6786 + 117 0.6078 0.6078 0.6789 + 118 0.6118 0.6118 0.6792 + 119 0.6157 0.6157 0.6794 + 120 0.6157 0.6157 0.6796 + 121 0.6196 0.6196 0.6798 + 122 0.6235 0.6235 0.6799 + 123 0.6235 0.6235 0.6800 + 124 0.6275 0.6275 0.6800 + 125 0.6314 0.6314 0.6800 + 126 0.6353 0.6353 0.6799 + 127 0.6353 0.6353 0.6799 + 128 0.6392 0.6392 0.6797 + 129 0.6431 0.6431 0.6796 + 130 0.6431 0.6431 0.6794 + 131 0.6471 0.6471 0.6791 + 132 0.6510 0.6510 0.6789 + 133 0.6549 0.6549 0.6785 + 134 0.6549 0.6549 0.6782 + 135 0.6588 0.6588 0.6778 + 136 0.6627 0.6627 0.6773 + 137 0.6627 0.6627 0.6769 + 138 0.6667 0.6667 0.6763 + 139 0.6706 0.6706 0.6758 + 140 0.6745 0.6745 0.6752 + 141 0.6745 0.6745 0.6746 + 142 0.6784 0.6784 0.6739 + 143 0.6824 0.6824 0.6732 + 144 0.6824 0.6824 0.6724 + 145 0.6863 0.6863 0.6716 + 146 0.6902 0.6902 0.6708 + 147 0.6941 0.6941 0.6699 + 148 0.6941 0.6941 0.6690 + 149 0.6980 0.6980 0.6680 + 150 0.7020 0.7020 0.6670 + 151 0.7020 0.7020 0.6660 + 152 0.7059 0.7059 0.6649 + 153 0.7098 0.7098 0.6638 + 154 0.7098 0.7098 0.6626 + 155 0.7137 0.7137 0.6614 + 156 0.7176 0.7176 0.6601 + 157 0.7216 0.7216 0.6589 + 158 0.7216 0.7216 0.6575 + 159 0.7255 0.7255 0.6561 + 160 0.7294 0.7294 0.6547 + 161 0.7294 0.7294 0.6533 + 162 0.7333 0.7333 0.6518 + 163 0.7373 0.7373 0.6502 + 164 0.7412 0.7412 0.6486 + 165 0.7412 0.7412 0.6470 + 166 0.7451 0.7451 0.6453 + 167 0.7490 0.7490 0.6436 + 168 0.7490 0.7490 0.6418 + 169 0.7529 0.7529 0.6400 + 170 0.7569 0.7569 0.6382 + 171 0.7608 0.7608 0.6363 + 172 0.7608 0.7608 0.6343 + 173 0.7647 0.7647 0.6324 + 174 0.7686 0.7686 0.6303 + 175 0.7686 0.7686 0.6282 + 176 0.7725 0.7725 0.6261 + 177 0.7765 0.7765 0.6239 + 178 0.7804 0.7804 0.6217 + 179 0.7804 0.7804 0.6194 + 180 0.7843 0.7843 0.6171 + 181 0.7882 0.7882 0.6147 + 182 0.7882 0.7882 0.6123 + 183 0.7922 0.7922 0.6098 + 184 0.7961 0.7961 0.6073 + 185 0.8000 0.8000 0.6047 + 186 0.8000 0.8000 0.6021 + 187 0.8039 0.8039 0.5994 + 188 0.8078 0.8078 0.5967 + 189 0.8078 0.8078 0.5939 + 190 0.8118 0.8118 0.5911 + 191 0.8157 0.8157 0.5882 + 192 0.8196 0.8196 0.5853 + 193 0.8196 0.8196 0.5823 + 194 0.8235 0.8235 0.5792 + 195 0.8275 0.8275 0.5761 + 196 0.8275 0.8275 0.5729 + 197 0.8314 0.8314 0.5697 + 198 0.8353 0.8353 0.5664 + 199 0.8392 0.8392 0.5630 + 200 0.8392 0.8392 0.5596 + 201 0.8431 0.8431 0.5561 + 202 0.8471 0.8471 0.5525 + 203 0.8471 0.8471 0.5489 + 204 0.8510 0.8510 0.5452 + 205 0.8549 0.8549 0.5414 + 206 0.8588 0.8588 0.5376 + 207 0.8588 0.8588 0.5337 + 208 0.8627 0.8627 0.5297 + 209 0.8667 0.8667 0.5257 + 210 0.8667 0.8667 0.5215 + 211 0.8706 0.8706 0.5173 + 212 0.8745 0.8745 0.5130 + 213 0.8784 0.8784 0.5086 + 214 0.8784 0.8784 0.5042 + 215 0.8824 0.8824 0.4996 + 216 0.8863 0.8863 0.4950 + 217 0.8863 0.8863 0.4902 + 218 0.8902 0.8902 0.4854 + 219 0.8941 0.8941 0.4804 + 220 0.8980 0.8980 0.4754 + 221 0.8980 0.8980 0.4702 + 222 0.9020 0.9020 0.4649 + 223 0.9059 0.9059 0.4595 + 224 0.9098 0.9098 0.4540 + 225 0.9098 0.9098 0.4484 + 226 0.9137 0.9137 0.4426 + 227 0.9176 0.9176 0.4366 + 228 0.9176 0.9176 0.4306 + 229 0.9216 0.9216 0.4243 + 230 0.9255 0.9255 0.4179 + 231 0.9294 0.9294 0.4114 + 232 0.9294 0.9294 0.4046 + 233 0.9333 0.9333 0.3977 + 234 0.9373 0.9373 0.3905 + 235 0.9373 0.9373 0.3831 + 236 0.9412 0.9412 0.3754 + 237 0.9451 0.9451 0.3675 + 238 0.9490 0.9490 0.3594 + 239 0.9490 0.9490 0.3509 + 240 0.9529 0.9529 0.3420 + 241 0.9569 0.9569 0.3328 + 242 0.9608 0.9608 0.3232 + 243 0.9608 0.9608 0.3131 + 244 0.9647 0.9647 0.3024 + 245 0.9686 0.9686 0.2912 + 246 0.9686 0.9686 0.2792 + 247 0.9725 0.9725 0.2664 + 248 0.9765 0.9765 0.2526 + 249 0.9804 0.9804 0.2375 + 250 0.9804 0.9804 0.2208 + 251 0.9843 0.9843 0.2020 + 252 0.9882 0.9882 0.1800 + 253 1.0 0.0 0.0 + 254 1.0 1.0 0.0 + 255 0.0 1.000 0.0 diff --git a/map65/commons.h b/map65/commons.h new file mode 100644 index 000000000..257c2ac2e --- /dev/null +++ b/map65/commons.h @@ -0,0 +1,45 @@ +#ifndef COMMONS_H +#define COMMONS_H + +#define NFFT 32768 + +extern "C" { + +extern struct { //This is "common/datcom/..." in Fortran + float d4[4*5760000]; //Raw I/Q data from Linrad + float ss[4*322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol + float savg[4*NFFT]; //Avg spectra at 0,45,90,135 deg pol + double fcenter; //Center freq from Linrad (MHz) + int nutc; //UTC as integer, HHMM + int idphi; //Phase correction for Y pol'n, degrees + int mousedf; //User-selected DF + int mousefqso; //User-selected QSO freq (kHz) + int nagain; //1 ==> decode only at fQSO +/- Tol + int ndepth; //How much hinted decoding to do? + int ndiskdat; //1 ==> data read from *.tf2 or *.iq file + int neme; //Hinted decoding tries only for EME calls + int newdat; //1 ==> new data, must do long FFT + int nfa; //Low decode limit (kHz) + int nfb; //High decode limit (kHz) + int nfcal; //Frequency correction, for calibration (Hz) + int nfshift; //Shift of displayed center freq (kHz) + int mcall3; //1 ==> CALL3.TXT has been modified + int ntimeout; //Max for timeouts in Messages and BandMap + int ntol; //+/- decoding range around fQSO (Hz) + int nxant; //1 ==> add 45 deg to measured pol angle + int map65RxLog; //Flags to control log files + int nfsample; //Input sample rate + int nxpol; //1 if using xpol antennas, 0 otherwise + int nmode; //nmode = 10*m_modeQ65 + m_modeJT65 + int nfast; //No longer used + int nsave; //Number of s3(64,63) spectra saved + int max_drift; //Maximum Q65 drift: units symbol_rate/TxT + char mycall[12]; + char mygrid[6]; + char hiscall[12]; + char hisgrid[6]; + char datetime[20]; +} datcom_; +} + +#endif // COMMONS_H diff --git a/map65/devsetup.cpp b/map65/devsetup.cpp new file mode 100644 index 000000000..01f373e60 --- /dev/null +++ b/map65/devsetup.cpp @@ -0,0 +1,384 @@ +#include "devsetup.h" +#include "mainwindow.h" +#include +#include +#include +#include + +#define MAXDEVICES 200 + +//----------------------------------------------------------- DevSetup() +DevSetup::DevSetup(QWidget *parent) : QDialog(parent) +{ + ui.setupUi(this); //setup the dialog form + m_restartSoundIn=false; + m_restartSoundOut=false; +} + +DevSetup::~DevSetup() +{ +} + +void DevSetup::initDlg() +{ + int k,id; + int valid_devices=0; + int minChan[MAXDEVICES]; + int maxChan[MAXDEVICES]; + int minSpeed[MAXDEVICES]; + int maxSpeed[MAXDEVICES]; + char hostAPI_DeviceName[MAXDEVICES][50]; + char s[256]; + int numDevices=Pa_GetDeviceCount(); + getDev(&numDevices,hostAPI_DeviceName,minChan,maxChan,minSpeed,maxSpeed); + k=0; + for(id=0; id= minSpeed[id] && 96000 <= maxSpeed[id]) { + m_inDevList[k]=id; + k++; + sprintf(s,"%2d %d %-49s",id,maxChan[id],hostAPI_DeviceName[id]); + QString t(s); + ui.comboBoxSndIn->addItem(t); + valid_devices++; + } + } + + const PaDeviceInfo *pdi; + int nchout; + char *p,*p1; + char p2[256]; + char pa_device_name[128]; + char pa_device_hostapi[128]; + + k=0; + for(id=0; idmaxOutputChannels; + if(nchout>=2) { + m_outDevList[k]=id; + k++; + sprintf((char*)(pa_device_name),"%s",pdi->name); + sprintf((char*)(pa_device_hostapi),"%s", + Pa_GetHostApiInfo(pdi->hostApi)->name); + + p1=(char*)""; + p=strstr(pa_device_hostapi,"MME"); + if(p!=NULL) p1=(char*)"MME"; + p=strstr(pa_device_hostapi,"Direct"); + if(p!=NULL) p1=(char*)"DirectX"; + p=strstr(pa_device_hostapi,"WASAPI"); + if(p!=NULL) p1=(char*)"WASAPI"; + p=strstr(pa_device_hostapi,"ASIO"); + if(p!=NULL) p1=(char*)"ASIO"; + p=strstr(pa_device_hostapi,"WDM-KS"); + if(p!=NULL) p1=(char*)"WDM-KS"; + + sprintf(p2,"%2d %-8s %-39s",id,p1,pa_device_name); + QString t(p2); + ui.comboBoxSndOut->addItem(t); + } + } + + ui.myCallEntry->setText(m_myCall); + ui.myGridEntry->setText(m_myGrid); + ui.idIntSpinBox->setValue(m_idInt); + ui.pttComboBox->setCurrentIndex(m_pttPort); + ui.astroFont->setValue(m_astroFont); + ui.cbXpol->setChecked(m_xpol); + ui.rbAntennaX->setChecked(m_xpolx); + ui.saveDirEntry->setText(m_saveDir); + ui.azelDirEntry->setText(m_azelDir); + ui.editorEntry->setText(m_editorCommand); + ui.dxccEntry->setText(m_dxccPfx); + ui.timeoutSpinBox->setValue(m_timeout); + ui.dPhiSpinBox->setValue(m_dPhi); + ui.fCalSpinBox->setValue(m_fCal); + ui.faddEntry->setText(QString::number(m_fAdd,'f',3)); + ui.networkRadioButton->setChecked(m_network); + ui.soundCardRadioButton->setChecked(!m_network); + ui.rb96000->setChecked(m_fs96000); + ui.rb95238->setChecked(!m_fs96000); + ui.rbIQXT->setChecked(m_bIQxt); + ui.rbSi570->setChecked(!m_bIQxt); + ui.mult570TxSpinBox->setEnabled(m_bIQxt); + ui.comboBoxSndIn->setEnabled(!m_network); + ui.comboBoxSndIn->setCurrentIndex(m_nDevIn); + ui.comboBoxSndOut->setCurrentIndex(m_nDevOut); + ui.sbPort->setValue(m_udpPort); + ui.cbIQswap->setChecked(m_IQswap); + ui.cb10db->setChecked(m_10db); + ui.cbInitIQplus->setChecked(m_initIQplus); + ui.mult570SpinBox->setValue(m_mult570); + ui.mult570TxSpinBox->setValue(m_mult570Tx); + ui.cal570SpinBox->setValue(m_cal570); + ui.sbTxOffset->setValue(m_TxOffset); + ::sscanf (m_colors.toLatin1(),"%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", + &r,&g,&b,&r0,&g0,&b0,&r1,&g1,&b1,&r2,&g2,&b2,&r3,&g3,&b3); + updateColorLabels(); + ui.sbBackgroundRed->setValue(r); + ui.sbBackgroundGreen->setValue(g); + ui.sbBackgroundBlue->setValue(b); + ui.sbRed0->setValue(r0); + ui.sbRed1->setValue(r1); + ui.sbRed2->setValue(r2); + ui.sbRed3->setValue(r3); + ui.sbGreen0->setValue(g0); + ui.sbGreen1->setValue(g1); + ui.sbGreen2->setValue(g2); + ui.sbGreen3->setValue(g3); + ui.sbBlue0->setValue(b0); + ui.sbBlue1->setValue(b1); + ui.sbBlue2->setValue(b2); + ui.sbBlue3->setValue(b3); + + m_paInDevice=m_inDevList[m_nDevIn]; + m_paOutDevice=m_outDevList[m_nDevOut]; + +} + +//------------------------------------------------------- accept() +void DevSetup::accept() +{ + // Called when OK button is clicked. + // Check to see whether SoundInThread must be restarted, + // and save user parameters. + + if(m_network!=ui.networkRadioButton->isChecked() or + m_nDevIn!=ui.comboBoxSndIn->currentIndex() or + m_paInDevice!=m_inDevList[m_nDevIn] or + m_xpol!=ui.cbXpol->isChecked() or + m_udpPort!=ui.sbPort->value()) m_restartSoundIn=true; + + if(m_nDevOut!=ui.comboBoxSndOut->currentIndex() or + m_paOutDevice!=m_outDevList[m_nDevOut]) m_restartSoundOut=true; + + m_myCall=ui.myCallEntry->text(); + m_myGrid=ui.myGridEntry->text(); + m_idInt=ui.idIntSpinBox->value(); + m_pttPort=ui.pttComboBox->currentIndex(); + m_astroFont=ui.astroFont->value(); + m_xpol=ui.cbXpol->isChecked(); + m_xpolx=ui.rbAntennaX->isChecked(); + m_saveDir=ui.saveDirEntry->text(); + m_azelDir=ui.azelDirEntry->text(); + m_editorCommand=ui.editorEntry->text(); + m_dxccPfx=ui.dxccEntry->text(); + m_timeout=ui.timeoutSpinBox->value(); + m_dPhi=ui.dPhiSpinBox->value(); + m_fCal=ui.fCalSpinBox->value(); + m_fAdd=ui.faddEntry->text().toDouble(); + m_network=ui.networkRadioButton->isChecked(); + m_fs96000=ui.rb96000->isChecked(); + m_bIQxt=ui.rbIQXT->isChecked(); + m_nDevIn=ui.comboBoxSndIn->currentIndex(); + m_paInDevice=m_inDevList[m_nDevIn]; + m_nDevOut=ui.comboBoxSndOut->currentIndex(); + m_paOutDevice=m_outDevList[m_nDevOut]; + m_udpPort=ui.sbPort->value(); + m_IQswap=ui.cbIQswap->isChecked(); + m_10db=ui.cb10db->isChecked(); + m_initIQplus=ui.cbInitIQplus->isChecked(); + m_mult570=ui.mult570SpinBox->value(); + m_mult570Tx=ui.mult570TxSpinBox->value(); + m_cal570=ui.cal570SpinBox->value(); + m_TxOffset=ui.sbTxOffset->value(); + + QDialog::accept(); +} + +void DevSetup::on_soundCardRadioButton_toggled(bool checked) +{ + ui.comboBoxSndIn->setEnabled(ui.soundCardRadioButton->isChecked()); + ui.rb96000->setChecked(checked); + ui.rb95238->setEnabled(!checked); + ui.label_InputDev->setEnabled(checked); + ui.label_Port->setEnabled(!checked); + ui.sbPort->setEnabled(!checked); + ui.cbIQswap->setEnabled(checked); + ui.cb10db->setEnabled(checked); +} + +void DevSetup::on_cbXpol_stateChanged(int n) +{ + m_xpol = (n!=0); + ui.rbAntenna->setEnabled(m_xpol); + ui.rbAntennaX->setEnabled(m_xpol); + ui.dPhiSpinBox->setEnabled(m_xpol); + ui.labelDphi->setEnabled(m_xpol); +} + +void DevSetup::on_cal570SpinBox_valueChanged(double ppm) +{ + m_cal570=ppm; +} + +void DevSetup::on_mult570SpinBox_valueChanged(int mult) +{ + m_mult570=mult; +} + +void DevSetup::updateColorLabels() +{ + QString t; + int r=ui.sbBackgroundRed->value(); + int g=ui.sbBackgroundGreen->value(); + int b=ui.sbBackgroundBlue->value(); + int r0=ui.sbRed0->value(); + int r1=ui.sbRed1->value(); + int r2=ui.sbRed2->value(); + int r3=ui.sbRed3->value(); + int g0=ui.sbGreen0->value(); + int g1=ui.sbGreen1->value(); + int g2=ui.sbGreen2->value(); + int g3=ui.sbGreen3->value(); + int b0=ui.sbBlue0->value(); + int b1=ui.sbBlue1->value(); + int b2=ui.sbBlue2->value(); + int b3=ui.sbBlue3->value(); + + ui.lab0->setStyleSheet ( + QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} + .arg (r, 2, 16, QLatin1Char {'0'}) + .arg (g, 2, 16, QLatin1Char {'0'}) + .arg (b, 2, 16, QLatin1Char {'0'}) + .arg (r0, 2, 16, QLatin1Char {'0'}) + .arg (g0, 2, 16, QLatin1Char {'0'}) + .arg (b0, 2, 16, QLatin1Char {'0'}) + ); + ui.lab1->setStyleSheet( + QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} + .arg (r, 2, 16, QLatin1Char {'0'}) + .arg (g, 2, 16, QLatin1Char {'0'}) + .arg (b, 2, 16, QLatin1Char {'0'}) + .arg (r1, 2, 16, QLatin1Char {'0'}) + .arg (g1, 2, 16, QLatin1Char {'0'}) + .arg (b1, 2, 16, QLatin1Char {'0'}) + ); + ui.lab2->setStyleSheet( + QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} + .arg (r, 2, 16, QLatin1Char {'0'}) + .arg (g, 2, 16, QLatin1Char {'0'}) + .arg (b, 2, 16, QLatin1Char {'0'}) + .arg (r2, 2, 16, QLatin1Char {'0'}) + .arg (g2, 2, 16, QLatin1Char {'0'}) + .arg (b2, 2, 16, QLatin1Char {'0'}) + ); + ui.lab3->setStyleSheet( + QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} + .arg (r, 2, 16, QLatin1Char {'0'}) + .arg (g, 2, 16, QLatin1Char {'0'}) + .arg (b, 2, 16, QLatin1Char {'0'}) + .arg (r3, 2, 16, QLatin1Char {'0'}) + .arg (g3, 2, 16, QLatin1Char {'0'}) + .arg (b3, 2, 16, QLatin1Char {'0'}) + ); + + m_colors.clear (); + QTextStream ots {&m_colors, QIODevice::WriteOnly}; + ots.setIntegerBase (16); + ots.setFieldWidth (2); + ots.setPadChar ('0'); + ots << r << g << b << r0 << g0 << b0 << r1 << g1 << b1 << r2 << g2 << b2 << r3 << g3 << b3; +} + +void DevSetup::on_sbBackgroundRed_valueChanged(int /*r*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBackgroundGreen_valueChanged(int /*g*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBackgroundBlue_valueChanged(int /*b*/) +{ + updateColorLabels(); +} + + +void DevSetup::on_sbRed0_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbGreen0_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBlue0_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbRed1_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbGreen1_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBlue1_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbRed2_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbGreen2_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBlue2_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbRed3_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbGreen3_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBlue3_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_pushButton_5_clicked() +{ + QColor color = QColorDialog::getColor(Qt::green, this); + if (color.isValid()) { + } +} + +void DevSetup::on_mult570TxSpinBox_valueChanged(int n) +{ + m_mult570Tx=n; +} + +void DevSetup::on_rbIQXT_toggled(bool checked) +{ + m_bIQxt=checked; + ui.mult570TxSpinBox->setEnabled(m_bIQxt); + ui.label_25->setEnabled(m_bIQxt); + ui.sbTxOffset->setEnabled(m_bIQxt); + ui.label_26->setEnabled(m_bIQxt); +} + +void DevSetup::on_sbTxOffset_valueChanged(double f) +{ + m_TxOffset=f; +} diff --git a/map65/devsetup.h b/map65/devsetup.h new file mode 100644 index 000000000..148f76c4e --- /dev/null +++ b/map65/devsetup.h @@ -0,0 +1,90 @@ +#ifndef DEVSETUP_H +#define DEVSETUP_H + +#include +#include "ui_devsetup.h" + +class DevSetup : public QDialog +{ + Q_OBJECT +public: + DevSetup(QWidget *parent=0); + ~DevSetup(); + + void initDlg(); + qint32 m_idInt; + qint32 m_pttPort; + qint32 m_nDevIn; + qint32 m_nDevOut; + qint32 m_inDevList[100]; + qint32 m_outDevList[100]; + qint32 m_paInDevice; + qint32 m_paOutDevice; + qint32 m_timeout; + qint32 m_dPhi; + qint32 m_fCal; + qint32 m_udpPort; + qint32 m_astroFont; + qint32 m_mult570; + qint32 m_mult570Tx; + + double m_fAdd; + double m_cal570; + double m_TxOffset; + + bool m_xpolx; + bool m_network; + bool m_fs96000; + bool m_xpol; + bool m_IQswap; + bool m_restartSoundIn; + bool m_restartSoundOut; + bool m_10db; + bool m_initIQplus; + bool m_bIQxt; + + QString m_myCall; + QString m_myGrid; + QString m_saveDir; + QString m_azelDir; + QString m_dxccPfx; + QString m_colors; + QString m_editorCommand; + + QColor m_colorBackground; + +public slots: + void accept(); + +private slots: + void on_soundCardRadioButton_toggled(bool checked); + void on_cbXpol_stateChanged(int arg1); + void on_cal570SpinBox_valueChanged(double ppm); + void on_mult570SpinBox_valueChanged(int mult); + void on_sbBackgroundRed_valueChanged(int arg1); + void on_sbBackgroundGreen_valueChanged(int arg1); + void on_sbBackgroundBlue_valueChanged(int arg1); + void updateColorLabels(void); + void on_sbRed0_valueChanged(int arg1); + void on_sbGreen0_valueChanged(int arg1); + void on_sbBlue0_valueChanged(int arg1); + void on_sbRed1_valueChanged(int arg1); + void on_sbGreen1_valueChanged(int arg1); + void on_sbBlue1_valueChanged(int arg1); + void on_sbRed2_valueChanged(int arg1); + void on_sbGreen2_valueChanged(int arg1); + void on_sbBlue2_valueChanged(int arg1); + void on_sbRed3_valueChanged(int arg1); + void on_sbGreen3_valueChanged(int arg1); + void on_sbBlue3_valueChanged(int arg1); + void on_pushButton_5_clicked(); + void on_mult570TxSpinBox_valueChanged(int arg1); + void on_rbIQXT_toggled(bool checked); + void on_sbTxOffset_valueChanged(double f); + +private: + int r,g,b,r0,g0,b0,r1,g1,b1,r2,g2,b2,r3,g3,b3; + Ui::DialogSndCard ui; +}; + +#endif // DEVSETUP_H diff --git a/map65/devsetup.ui b/map65/devsetup.ui new file mode 100644 index 000000000..81ae68e6a --- /dev/null +++ b/map65/devsetup.ui @@ -0,0 +1,1801 @@ + + + DialogSndCard + + + + 0 + 0 + 463 + 390 + + + + Setup / Options + + + + + + 0 + + + + Station + + + + + 10 + 34 + 421 + 275 + + + + + + + + + + + + 0 + 20 + + + + My Call: + + + + + + + + 0 + 20 + + + + My Grid: + + + + + + + + 0 + 20 + + + + ID Interval (min): + + + + + + + + 0 + 20 + + + + PTT Port: + + + + + + + Astro Font Size: + + + + + + + + + + + + 60 + 16777215 + + + + K1JT + + + + + + + + 60 + 16777215 + + + + FN20qi + + + + + + + -20 + + + 10 + + + + + + + + 60 + 16777215 + + + + false + + + + None + + + + + COM1 + + + + + COM2 + + + + + COM3 + + + + + COM4 + + + + + COM5 + + + + + COM6 + + + + + COM7 + + + + + COM8 + + + + + COM9 + + + + + COM10 + + + + + COM11 + + + + + COM12 + + + + + COM13 + + + + + + + + 12 + + + 32 + + + 20 + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + + + + 0 + 20 + + + + DXCC: + + + + + + + + 0 + 20 + + + + Timeout (min): + + + + + + + + 0 + 20 + + + + Fcal (Hz): + + + + + + + + 0 + 20 + + + + Fadd (MHz) + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + + + + + 16777215 + 16777215 + + + + PJ9 + + + + + + + 40 + + + + + + + -20000 + + + 20000 + + + + + + + 0.0 + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + + + + + 0 + 0 + + + + + 0 + 55 + + + + Antennas: + + + + + 10 + 23 + 321 + 22 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Xpol + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + + + + + true + + + + + + + x + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + + 0 + 20 + + + + Dphi: + + + + + + + + 0 + 20 + + + + -180 + + + 180 + + + 10 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + 80 + 20 + + + + Save Directory: + + + + + + + C:\Users\joe\wsjt\map65\save + + + + + + + + + + + + 80 + 20 + + + + AzEl Directory: + + + + + + + C:\Users\joe\wsjt\map65 + + + + + + + + + + + + 80 + 20 + + + + Editor command: + + + + + + + + 328 + 16777215 + + + + notepad + + + + + + + + + + + I/O Devices + + + + + 0 + 10 + 361 + 291 + + + + + + + Input Source (Rx, Baseband) + + + + + 13 + 14 + 341 + 211 + + + + + + + + + true + + + SoundCard + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Network + + + true + + + + + + + + + + + false + + + + 0 + 20 + + + + Swap I/Q + + + + + + + false + + + +10 dB + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 57 + 0 + + + + 20000 + + + 51000 + + + 50004 + + + + + + + + 0 + 0 + + + + + 26 + 0 + + + + + 16777215 + 20 + + + + Port + + + + + + + + + false + + + + 0 + 0 + + + + Dev Ch API Name + + + + + + + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 50 + 13 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 13 + + + + + + + + + 0 + 0 + + + + + 16777215 + 60 + + + + Sample Rate + + + + + 30 + 20 + 282 + 22 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 96000 Hz + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 95238 Hz + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 55 + + + + Output Device (Tx Audio) + + + + + 10 + 20 + 291 + 22 + + + + + + + + + + + Colors + + + + + 12 + 21 + 351 + 281 + + + + + + + + 10 + + + + Choose colors for Band Map and Messages Windows + + + Qt::AlignCenter + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 80 + 20 + + + + + + + + Red + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 31 + 20 + + + + + + + + Green + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 34 + 20 + + + + + + + + Blue + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 80 + 20 + + + + + + + + + + + + + 60 + 16777215 + + + + Background + + + Qt::AlignCenter + + + + + + + 255 + + + + + + + 255 + + + + + + + 255 + + + 102 + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 55 + 20 + + + + + + + + + + + + + 60 + 16777215 + + + + Newest + + + Qt::AlignCenter + + + + + + + 255 + + + 255 + + + + + + + 255 + + + + + + + 255 + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + + Courier New + 9 + + + + K1ABC + + + + + + + + + + + + 60 + 16777215 + + + + 2nd + + + Qt::AlignCenter + + + + + + + 255 + + + 255 + + + + + + + 255 + + + 255 + + + + + + + 255 + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + + Courier New + 9 + + + + K1ABC + + + + + + + + + + + + 60 + 16777215 + + + + 3rd + + + Qt::AlignCenter + + + + + + + 255 + + + 150 + + + + + + + 255 + + + 150 + + + + + + + 255 + + + 150 + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + + Courier New + 9 + + + + K1ABC + + + + + + + + + + + + 60 + 16777215 + + + + Oldest + + + Qt::AlignCenter + + + + + + + 255 + + + 100 + + + + + + + 255 + + + 100 + + + + + + + 255 + + + 100 + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + + Courier New + 9 + + + + K1ABC + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Color Selector + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Si570 Control + + + + + 41 + 41 + 272 + 248 + + + + + + + + + LO Selection: + + + + + + + IQ+, Generic Si570 + + + true + + + + + + + IQ+ Rx/XT + + + false + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + + + Rx frequency multiplier: + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 47 + 20 + + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + 1 + + + 8 + + + 2 + + + + + + + + + + + Tx Offset (MHz): + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + 3 + + + 150.000000000000000 + + + 130.900000000000006 + + + + + + + + + + + false + + + Tx frequency multiplier: + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 47 + 20 + + + + + + + + false + + + + 0 + 0 + + + + + 80 + 0 + + + + 1 + + + + + + + + + + + Frequency correction (ppm): + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 10 + 20 + + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + 3 + + + -200.000000000000000 + + + 200.000000000000000 + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + Initialize IQ+ on startup + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + DialogSndCard + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + DialogSndCard + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/map65/displaytext.cpp b/map65/displaytext.cpp new file mode 100644 index 000000000..4d7286d3b --- /dev/null +++ b/map65/displaytext.cpp @@ -0,0 +1,15 @@ +#include "displaytext.h" +#include +#include + +DisplayText::DisplayText(QWidget *parent) : + QTextBrowser(parent) +{ +} + +void DisplayText::mouseDoubleClickEvent(QMouseEvent *e) +{ + bool ctrl = (e->modifiers() & 0x4000000); + emit(selectCallsign(ctrl)); + QTextBrowser::mouseDoubleClickEvent(e); +} diff --git a/map65/displaytext.h b/map65/displaytext.h new file mode 100644 index 000000000..4553d53fb --- /dev/null +++ b/map65/displaytext.h @@ -0,0 +1,22 @@ +#ifndef DISPLAYTEXT_H +#define DISPLAYTEXT_H + +#include + +class DisplayText : public QTextBrowser +{ + Q_OBJECT +public: + explicit DisplayText(QWidget *parent = 0); + +signals: + void selectCallsign(bool ctrl); + +public slots: + +protected: + void mouseDoubleClickEvent(QMouseEvent *e); + +}; + +#endif // DISPLAYTEXT_H diff --git a/map65/ffft.f b/map65/ffft.f new file mode 100644 index 000000000..9c3c091a7 --- /dev/null +++ b/map65/ffft.f @@ -0,0 +1,69 @@ + subroutine ffft(d,npts,isign,ireal) + +C Fourier transform of length npts=2**k, performed in place. +C Input data in array d, treated as complex if ireal=0, and as real if ireal=1. +C In either case the transform values are returned in array d, treated as +C complex. The DC term is d(1), and d(npts/2+1) is the term at the Nyquist +C frequency. The basic algorithm is the same as Norm Brenner's FOUR1, and +C uses radix-2 transforms. + +C J. H. Taylor, Princeton University. + + complex d(npts),t,w,wstep,tt,uu + data pi/3.14159265359/ + +C Shuffle the data to bit-reversed order. + + imax=npts/(ireal+1) + irev=1 + do 5 i=1,imax + if(i.ge.irev) go to 2 + t=d(i) + d(i)=d(irev) + d(irev)=t +2 mmax=imax/2 +3 if(irev.le.mmax) go to 5 + irev=irev-mmax + mmax=mmax/2 + if(mmax.ge.1) go to 3 +5 irev=irev+mmax + +C The radix-2 transform begins here. + + api=isign*pi/2. + mmax=1 +6 istep=2*mmax + wstep=cmplx(-2.*sin(api/mmax)**2,sin(2.*api/mmax)) + w=1. + do 9 m=1,mmax + +C This in the inner-most loop -- optimization here is important! + do 8 i=m,imax,istep + t=w*d(i+mmax) + d(i+mmax)=d(i)-t +8 d(i)=d(i)+t + +9 w=w*(1.+wstep) + mmax=istep + if(mmax.lt.imax) go to 6 + + if(ireal.eq.0) return + +C Now complete the last stage of a doubled-up real transform. + + jmax=imax/2 + 1 + wstep=cmplx(-2.*sin(isign*pi/npts)**2,sin(isign*pi/imax)) + w=1.0 + d(imax+1)=d(1) + + do 10 j=1,jmax + uu=cmplx(real(d(j))+real(d(2+imax-j)),aimag(d(j)) - + + aimag(d(2+imax-j))) + tt=w*cmplx(aimag(d(j))+aimag(d(2+imax-j)),-real(d(j)) + + + real(d(2+imax-j))) + d(j)=uu+tt + d(2+imax-j)=conjg(uu-tt) +10 w=w*(1.+wstep) + + return + end diff --git a/map65/ft2000_freq.sh b/map65/ft2000_freq.sh new file mode 100644 index 000000000..8bf9d07e9 --- /dev/null +++ b/map65/ft2000_freq.sh @@ -0,0 +1 @@ +rigctl-wsjtx -m 129 -r COM1 -s 38400 -C data_bits=8 -C stop_bits=2 -C serial_handshake=Hardware f diff --git a/map65/getdev.cpp b/map65/getdev.cpp new file mode 100644 index 000000000..45addfa01 --- /dev/null +++ b/map65/getdev.cpp @@ -0,0 +1,259 @@ +#include +#define MAXDEVICES 100 +#include +#include +#include + +//------------------------------------------------------- pa_get_device_info +int pa_get_device_info (int n, + void *pa_device_name, + void *pa_device_hostapi, + double *pa_device_max_speed, + double *pa_device_min_speed, + int *pa_device_max_bytes, + int *pa_device_min_bytes, + int *pa_device_max_channels, + int *pa_device_min_channels ) +{ + + (void) n ; + (void) pa_device_name; + (void) pa_device_hostapi; + (void) pa_device_max_speed; + (void) pa_device_min_speed; + (void) pa_device_max_bytes; + (void) pa_device_min_bytes; + (void) pa_device_max_channels; + (void) pa_device_min_channels; + const PaDeviceInfo *deviceInfo; + PaError pa_err; + PaStreamParameters inputParameters; + int i,j, speed_warning; + int minBytes, maxBytes; + double maxStandardSampleRate; + double minStandardSampleRate; + int minInputChannels; + int maxInputChannels; + +// negative terminated list + static double standardSampleRates[] = {8000.0, 9600.0, + 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, + 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1}; +// ******************************************************* + + + *pa_device_max_speed=0; + *pa_device_min_speed=0; + *pa_device_max_bytes=0; + *pa_device_min_bytes=0; + *pa_device_max_channels=0; + *pa_device_min_channels=0; + minInputChannels=0; + if(n >= Pa_GetDeviceCount() ) return -1; + deviceInfo = Pa_GetDeviceInfo(n); + if (deviceInfo->maxInputChannels==0) return -1; + sprintf((char*)(pa_device_name),"%s",deviceInfo->name); + sprintf((char*)(pa_device_hostapi),"%s", + Pa_GetHostApiInfo( deviceInfo->hostApi )->name); + speed_warning=0; + +// bypass bug in Juli@ ASIO driver: +// this driver hangs after a Pa_IsFormatSupported call + i = strncmp(deviceInfo->name, "ASIO 2.0 - ESI Juli@", 19); + if (i == 0) { + minStandardSampleRate=44100; + maxStandardSampleRate=192000; + minBytes=1; + maxBytes=4; + maxInputChannels= deviceInfo->maxInputChannels; + minInputChannels= 1; + goto end_pa_get_device_info; + } + +// Investigate device capabilities. +// Check min and max samplerates with 16 bit data. + maxStandardSampleRate=0; + minStandardSampleRate=0; + inputParameters.device = n; + inputParameters.channelCount = deviceInfo->maxInputChannels; + inputParameters.sampleFormat = paInt16; + inputParameters.suggestedLatency = 0; + inputParameters.hostApiSpecificStreamInfo = NULL; + +// ************************************************************************ +//filter for portaudio Windows hostapi's with non experts. +//only allow ASIO or WASAPI or WDM-KS + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, "ASIO", 4); + if (i==0 ) goto end_filter_hostapi; + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, + "Windows WASAPI", 14); + if (i==0 ) goto end_filter_hostapi; + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, + "Windows WDM-KS", 14); + if (i==0 ) goto end_filter_hostapi; + speed_warning=1; +end_filter_hostapi:; + +// ************************************************************************ + i=0; + while(standardSampleRates[i] > 0 && minStandardSampleRate==0) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + standardSampleRates[i] ); + if(pa_err == paDeviceUnavailable) return -1; + if(pa_err == paInvalidDevice) return -1; + if(pa_err == paFormatIsSupported ) { + minStandardSampleRate=standardSampleRates[i]; + } + i++; + } + if(minStandardSampleRate == 0) return -1; + j=i; + while(standardSampleRates[i] > 0 ) i++; + i--; + + while(i >= j && maxStandardSampleRate==0) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + standardSampleRates[i] ); + if(pa_err == paDeviceUnavailable) return -1; + if(pa_err == paInvalidDevice) return -1; + if( pa_err == paFormatIsSupported ) { + maxStandardSampleRate=standardSampleRates[i]; + } + i--; + } + +// check if min SampleRate = max SampleRate + if(maxStandardSampleRate==0 && (minStandardSampleRate != 0)) { + maxStandardSampleRate= minStandardSampleRate; + } + +// check min and max bytes + minBytes=2; + maxBytes=2; + inputParameters.sampleFormat = paUInt8; + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + if( pa_err == paFormatIsSupported ) { + minBytes=1; + } + inputParameters.sampleFormat = paInt32; + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + if( pa_err == paFormatIsSupported ) { + maxBytes=4; + } + +// check min channel count + maxInputChannels= deviceInfo->maxInputChannels; + inputParameters.channelCount = 1; + inputParameters.sampleFormat = paInt16; + pa_err=paFormatIsSupported+32000; + while(pa_err != paFormatIsSupported && + ( inputParameters.channelCount < (maxInputChannels+1)) ) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + inputParameters.channelCount++; + } + if( pa_err == paFormatIsSupported ) { + minInputChannels=inputParameters.channelCount-1; + } else { + return -1; + } + +end_pa_get_device_info:; + + *pa_device_max_speed=maxStandardSampleRate; + *pa_device_min_speed=minStandardSampleRate; + *pa_device_max_bytes=maxBytes; + *pa_device_min_bytes=minBytes; + *pa_device_max_channels= maxInputChannels; + *pa_device_min_channels= minInputChannels; + + return speed_warning; +} + + +void paInputDevice(int id, char* hostAPI_DeviceName, int* minChan, + int* maxChan, int* minSpeed, int* maxSpeed) +{ + int i; + char pa_device_name[128]; + char pa_device_hostapi[128]; + double pa_device_max_speed; + double pa_device_min_speed; + int pa_device_max_bytes; + int pa_device_min_bytes; + int pa_device_max_channels; + int pa_device_min_channels; + char p2[256]; + char *p,*p1; + static int iret, valid_dev_cnt; + + iret=pa_get_device_info (id, + &pa_device_name, + &pa_device_hostapi, + &pa_device_max_speed, + &pa_device_min_speed, + &pa_device_max_bytes, + &pa_device_min_bytes, + &pa_device_max_channels, + &pa_device_min_channels); + + if (iret >= 0 ) { + valid_dev_cnt++; + + p1=(char*)""; + p=strstr(pa_device_hostapi,"MME"); + if(p!=NULL) p1=(char*)"MME"; + p=strstr(pa_device_hostapi,"Direct"); + if(p!=NULL) p1=(char*)"DirectX"; + p=strstr(pa_device_hostapi,"WASAPI"); + if(p!=NULL) p1=(char*)"WASAPI"; + p=strstr(pa_device_hostapi,"ASIO"); + if(p!=NULL) p1=(char*)"ASIO"; + p=strstr(pa_device_hostapi,"WDM-KS"); + if(p!=NULL) p1=(char*)"WDM-KS"; + + sprintf(p2,"%-8s %-39s",p1,pa_device_name); + for(i=0; i<50; i++) { + hostAPI_DeviceName[i]=p2[i]; + if(p2[i]==0) break; + } + *minChan=pa_device_min_channels; + *maxChan=pa_device_max_channels; + *minSpeed=(int)pa_device_min_speed; + *maxSpeed=(int)pa_device_max_speed; + } else { + for(i=0; i<50; i++) { + hostAPI_DeviceName[i]=0; + } + *minChan=0; + *maxChan=0; + *minSpeed=0; + *maxSpeed=0; + } +} + +void getDev(int* numDevices0, char hostAPI_DeviceName[][50], + int minChan[], int maxChan[], + int minSpeed[], int maxSpeed[]) +{ + int i,id,numDevices; + int minch,maxch,minsp,maxsp; + char apidev[256]; + + numDevices=Pa_GetDeviceCount(); + *numDevices0=numDevices; + + for(id=0; id +#include +#include +#include + +extern qint16 id[4*60*96000]; + +void getfile(QString fname, bool xpol, int dbDgrd) +{ + int npts=2*52*96000; + if(xpol) npts=2*npts; + +// Degrade S/N by dbDgrd dB -- for tests only!! + float dgrd=0.0; + if(dbDgrd<0) dgrd = 23.0*sqrt(pow(10.0,-0.1*(double)dbDgrd) - 1.0); + float fac=23.0/sqrt(dgrd*dgrd + 23.0*23.0); + + memset(id,0,2*npts); + char name[80]; + strcpy(name,fname.toLatin1()); + FILE* fp=fopen(name,"rb"); + + if(fp != NULL) { + auto n = fread(&datcom_.fcenter,sizeof(datcom_.fcenter),1,fp); + n = fread(id,2,npts,fp); + Q_UNUSED (n); + int j=0; + + if(dbDgrd<0) { + for(int i=0; i0) { + datcom_.nutc=100*fname.mid(i0-4,2).toInt() + fname.mid(i0-2,2).toInt(); + } + } +} + +void savetf2(QString fname, bool xpol) +{ + int npts=2*52*96000; + if(xpol) npts=2*npts; + + qint16* buf=(qint16*)malloc(2*npts); + char name[80]; + strcpy(name,fname.toLatin1()); + FILE* fp=fopen(name,"wb"); + + if(fp != NULL) { + fwrite(&datcom_.fcenter,sizeof(datcom_.fcenter),1,fp); + int j=0; + for(int i=0; i= 1.0 || rsq == 0.0); + fac = sqrt(-2.0*log(rsq)/rsq); + gset = v1*fac; + iset++; + return v2*fac; +} diff --git a/map65/getfile.h b/map65/getfile.h new file mode 100644 index 000000000..796c31e5c --- /dev/null +++ b/map65/getfile.h @@ -0,0 +1,12 @@ +#ifndef GETFILE_H +#define GETFILE_H +#include +#include +#include +#include "commons.h" + +void getfile(QString fname, bool xpol, int dbDgrd); +void savetf2(QString fname, bool xpol); +float gran(); + +#endif // GETFILE_H diff --git a/map65/getsvn.cmake b/map65/getsvn.cmake new file mode 100644 index 000000000..d1007b2c4 --- /dev/null +++ b/map65/getsvn.cmake @@ -0,0 +1,16 @@ +find_package (Subversion) +if (Subversion_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.svn) + # the FindSubversion.cmake module is part of the standard distribution + include (FindSubversion) + # extract working copy information for SOURCE_DIR into MY_XXX variables + Subversion_WC_INFO (${SOURCE_DIR} MY) + # write a file with the SVNVERSION define + file (WRITE svnversion.h.txt "#define SVNVERSION ${MY_WC_REVISION}\n") +else (Subversion_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.svn) + file (WRITE svnversion.h.txt "#define SVNVERSION local\n") +endif (Subversion_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.svn) + +# copy the file to the final header only if the version changes +# reduces needless rebuilds +execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different + svnversion.h.txt svnversion.h) diff --git a/map65/in.dat b/map65/in.dat new file mode 100644 index 000000000..5294129cb --- /dev/null +++ b/map65/in.dat @@ -0,0 +1,16 @@ + 35 36 22 8 31 11 14 55 20 36 55 13 24 15 56 38 16 28 61 58 + 15 26 45 8 41 53 37 57 59 60 29 29 41 46 44 35 52 61 24 26 + 16 20 53 35 2 6 9 27 47 28 57 6 15 9 16 10 56 9 63 46 + 9 15 3 + 74 61 44 233 29 245 254 64 119 64 250 111 38 145 53 29 140 194 119 99 + 55 86 48 110 142 95 48 120 61 66 252 252 245 88 62 41 124 249 246 68 + 250 249 65 64 140 142 88 190 237 90 240 52 79 216 55 31 112 135 66 44 + 99 57 68 + 54 61 26 5 13 60 3 56 30 58 57 4 16 43 28 43 6 61 13 19 + 56 8 4 9 45 32 9 7 14 52 4 38 40 27 3 26 51 54 40 29 + 36 63 34 43 3 48 36 49 46 30 8 20 40 59 29 28 17 11 8 19 + 11 63 5 + 38 25 35 8 28 0 0 60 60 25 0 31 28 52 14 24 9 30 18 54 + 49 55 48 15 27 54 26 22 30 27 1 1 4 31 35 29 23 2 2 27 + 0 1 25 32 21 84 28 19 5 60 2 27 15 9 39 23 42 12 29 17 + 16 50 49 diff --git a/map65/killbyname.cpp b/map65/killbyname.cpp new file mode 100644 index 000000000..11629e657 --- /dev/null +++ b/map65/killbyname.cpp @@ -0,0 +1,282 @@ +#include +#include +#include + +int killbyname(const char *szToTerminate) +// Created: 6/23/2000 (Ravi Kochhar) +// Last modified: 3/10/2002 (RK) +// Please report any problems or bugs to kochhar@physiology.wisc.edu +// The latest version of this routine can be found at: +// http://www.neurophys.wisc.edu/ravi/software/killproc/ +// Terminate the process "szToTerminate" if it is currently running +// This works for Win/95/98/ME and also Win/NT/2000/XP +// The process name is case-insensitive, i.e. "notepad.exe" and "NOTEPAD.EXE" +// will both work (for szToTerminate) +// Return codes are as follows: +// 0 = Process was successfully terminated +// 602 = Unable to terminate process for some other reason +// 603 = Process was not currently running +// 604 = No permission to terminate process +// 605 = Unable to load PSAPI.DLL +// 606 = Unable to identify system type +// 607 = Unsupported OS +// 632 = Invalid process name +// 700 = Unable to get procedure address from PSAPI.DLL +// 701 = Unable to get process list, EnumProcesses failed +// 702 = Unable to load KERNEL32.DLL +// 703 = Unable to get procedure address from KERNEL32.DLL +// 704 = CreateToolhelp32Snapshot failed + +{ + BOOL bResult,bResultm; + DWORD aiPID[1000],iCb=1000,iNumProc; //,iV2000=0; + DWORD iCbneeded,i,iFound=0; + char szName[MAX_PATH],szToTermUpper[MAX_PATH]; + HANDLE hProc,hSnapShot,hSnapShotm; + OSVERSIONINFO osvi; + HINSTANCE hInstLib; + int iLenP,indx; + HMODULE hMod; + PROCESSENTRY32 procentry; + MODULEENTRY32 modentry; + + // Transfer Process name into "szToTermUpper" and convert to upper case + iLenP=strlen(szToTerminate); + if(iLenP<1 || iLenP>MAX_PATH) return 632; + for(indx=0;indx +#include +#include +#include +#include +#include +// #include +// #include +// #include +#include "sleep.h" +#include "timeval.h" + +/* FORTRAN: fd = close(filedes) */ +int close_(int *filedes) +{ +return(close(*filedes)); +} +/* FORTRAN: fd = open(filnam,mode) */ +int open_(char filnam[], int *mode) +{ + return(open(filnam,*mode)); +} +/* FORTRAN: fd = creat(filnam,mode) */ +int creat_(char filnam[],int *mode) +{ + return(creat(filnam,*mode)); +} +/* FORTRAN: nread = read(fd,buf,n) */ +int read_(int *fd, char buf[], int *n) +{ + return(read(*fd,buf,*n)); +} +/* FORTRAN: nwrt = write(fd,buf,n) */ +int write_(int *fd, char buf[], int *n) +{ + return(write(*fd,buf,*n)); +} +/* FORTRAN: ns = lseek(fd,offset,origin) */ +int lseek_(int *fd,int *offset, int *origin) +{ + return(lseek(*fd,*offset,*origin)); +} +/* times(2) */ +//int times_(struct tms *buf) +//{ +// return (times(buf)); +//} +/* ioperm(2) */ +//ioperm_(from,num,turn_on) +//unsigned long *from,*num,*turn_on; +//{ +// return (ioperm(*from,*num,*turn_on)); +// return (i386_get_ioperm(*from,*num,*turn_on)); +//} + +/* usleep(3) */ +void usleep_(unsigned long *microsec) +{ + usleep(*microsec); +} + +/* returns random numbers between 0 and 32767 to FORTRAN program */ +int iran_(int *arg) +{ + return (rand()); +} + +int exit_(int *n) +{ + printf("\n\n"); + exit(*n); +} + +/* +struct tm * +gmtime_r_(const time_t *clock, struct tm *result) +{ + gmtime_r(clock, result); +} +*/ + +time_t time_(void) +{ + return time(0); +} + +/* hrtime() */ +double hrtime_(void) +{ + struct timeval tv; + gettimeofday(&tv,NULL); + return(tv.tv_sec+1.e-6*tv.tv_usec); +} diff --git a/map65/libm65/dcoord.f90 b/map65/libm65/dcoord.f90 new file mode 100644 index 000000000..5ef6877aa --- /dev/null +++ b/map65/libm65/dcoord.f90 @@ -0,0 +1,40 @@ +SUBROUTINE DCOORD(A0,B0,AP,BP,A1,B1,A2,B2) + + implicit real*8 (a-h,o-z) +! Examples: +! 1. From ha,dec to az,el: +! call coord(pi,pio2-lat,0.,lat,ha,dec,az,el) +! 2. From az,el to ha,dec: +! call coord(pi,pio2-lat,0.,lat,az,el,ha,dec) +! 3. From ra,dec to l,b +! call coord(4.635594495,-0.504691042,3.355395488,0.478220215, +! ra,dec,l,b) +! 4. From l,b to ra,dec +! call coord(1.705981071d0,-1.050357016d0,2.146800277d0, +! 0.478220215d0,l,b,ra,dec) +! 5. From ecliptic latitude (eb) and longitude (el) to ra, dec: +! call coord(0.d0,0.d0,-pio2,pio2-23.443*pi/180,ra,dec,el,eb) + + SB0=sin(B0) + CB0=cos(B0) + SBP=sin(BP) + CBP=cos(BP) + SB1=sin(B1) + CB1=cos(B1) + SB2=SBP*SB1 + CBP*CB1*cos(AP-A1) + CB2=SQRT(1.D0-SB2**2) + B2=atan(SB2/CB2) + SAA=sin(AP-A1)*CB1/CB2 + CAA=(SB1-SB2*SBP)/(CB2*CBP) + CBB=SB0/CBP + SBB=sin(AP-A0)*CB0 + SA2=SAA*CBB-CAA*SBB + CA2=CAA*CBB+SAA*SBB + TA2O2=0.0 !Shut up compiler warnings. -db + IF(CA2.LE.0.D0) TA2O2=(1.D0-CA2)/SA2 + IF(CA2.GT.0.D0) TA2O2=SA2/(1.D0+CA2) + A2=2.D0*atan(TA2O2) + IF(A2.LT.0.D0) A2=A2+6.2831853071795864D0 + + RETURN +END SUBROUTINE DCOORD diff --git a/map65/libm65/decode0.f90 b/map65/libm65/decode0.f90 new file mode 100644 index 000000000..23a46d9eb --- /dev/null +++ b/map65/libm65/decode0.f90 @@ -0,0 +1,64 @@ +subroutine decode0(dd,ss,savg,nstandalone) + + use timer_module, only: timer + parameter (NSMAX=60*96000) + + real*4 dd(4,NSMAX),ss(4,322,NFFT),savg(4,NFFT) + real*8 fcenter + integer hist(0:32768) + character mycall*12,hiscall*12,mygrid*6,hisgrid*6,datetime*20 + character mycall0*12,hiscall0*12,hisgrid0*6 + common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & + ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & + mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & + nfast,nsave,max_drift,mycall,mygrid,hiscall,hisgrid,datetime + data neme0/-99/,mcall3b/1/ + save + + call timer('decode0 ',0) + if(newdat.ne.0) then + nz=52*96000 + hist=0 + do i=1,nz + j1=min(abs(dd(1,i)),32768.0) + hist(j1)=hist(j1)+1 + j2=min(abs(dd(2,i)),32768.0) + hist(j2)=hist(j2)+1 + j3=min(abs(dd(3,i)),32768.0) + hist(j3)=hist(j3)+1 + j4=min(abs(dd(4,i)),32768.0) + hist(j4)=hist(j4)+1 + enddo + m=0 + do i=0,32768 + m=m+hist(i) + if(m.ge.2*nz) go to 10 + enddo +10 rmsdd=1.5*i + endif + nhsym=279 + ndphi=0 + if(iand(nrxlog,8).ne.0) ndphi=1 + + if(mycall.ne.mycall0 .or. hiscall.ne.hiscall0 .or. & + hisgrid.ne.hisgrid0 .or. mcall3.ne.0 .or. neme.ne.neme0) mcall3b=1 + + mycall0=mycall + hiscall0=hiscall + hisgrid0=hisgrid + neme0=neme + + call timer('map65a ',0) + call map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & + mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & + nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & + neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample,nxpol,nmode) + call timer('map65a ',1) + call timer('decode0 ',1) + + write(*,1010) nsum,nsave +1010 format('',2i4) + flush(6) + + return +end subroutine decode0 diff --git a/map65/libm65/decode1a.f90 b/map65/libm65/decode1a.f90 new file mode 100644 index 000000000..4219c0043 --- /dev/null +++ b/map65/libm65/decode1a.f90 @@ -0,0 +1,145 @@ +subroutine decode1a(dd,newdat,f0,nflip,mode65,nfsample,xpol, & + mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi,ndphi, & + nutc,nkhz,ndf,ipol,ntol,sync2,a,dt,pol,nkv,nhist,nsum,nsave, & + qual,decoded) + +! Apply AFC corrections to a candidate JT65 signal, then decode it. + + use timer_module, only: timer + parameter (NMAX=60*96000) !Samples per 60 s + real*4 dd(4,NMAX) !92 MB: raw data from Linrad timf2 + complex cx(NMAX/64), cy(NMAX/64) !Data at 1378.125 samples/s + complex c5x(NMAX/256),c5y(NMAX/256) !Data at 344.53125 Hz + complex c5a(512) + complex z + real s2(66,126) + real s3(64,63),sy(63) + real a(5) + logical first,xpol + character decoded*22 + character mycall*12,hiscall*12,hisgrid*6 + data first/.true./,jjjmin/1000/,jjjmax/-1000/ + data nutc0/-999/,nhz0/-9999999/ + save + +! Mix sync tone to baseband, low-pass filter, downsample to 1378.125 Hz + dt00=dt + call timer('filbig ',0) + call filbig(dd,NMAX,f0,newdat,nfsample,xpol,cx,cy,n5) +! NB: cx, cy have sample rate 96000*77125/5376000 = 1378.125 Hz + call timer('filbig ',1) + if(mode65.eq.0) goto 900 + sqa=0. + sqb=0. + do i=1,n5 + sqa=sqa + real(cx(i))**2 + aimag(cx(i))**2 + if(xpol) sqb=sqb + real(cy(i))**2 + aimag(cy(i))**2 + enddo + sqa=sqa/n5 + sqb=sqb/n5 + +! Find best DF, f1, f2, DT, and pol. Start by downsampling to 344.53125 Hz + if(xpol) then + z=cmplx(cos(dphi),sin(dphi)) + cy(:n5)=z*cy(:n5) !Adjust for cable length difference + endif +! Add some zeros at start of c5 arrays -- empirical fix for negative DT's + nadd=1089 + c5x(:nadd)=0. + call fil6521(cx,n5,c5x(nadd+1),n6) + if(xpol) then + c5y(:nadd)=0. + call fil6521(cy,n5,c5y(nadd+1),n6) + endif + n6=n6+nadd + + fsample=1378.125/4. + a(5)=dt00 + i0=nint((a(5)+0.5)*fsample) - 2 + nadd + if(i0.lt.1) then + write(13,*) 'i0 too small in decode1a:',i0,f0 + flush(13) + i0=1 + endif + nz=n6+1-i0 + +! We're looking only at sync tone here... so why not downsample by another +! factor of 1/8, say? Should be a significant execution speed-up. +! Best fit for DF, f1, f2, pol + call afc65b(c5x(i0),c5y(i0),nz,fsample,nflip,ipol,xpol,ndphi,a,ccfbest,dtbest) + + pol=a(4)/57.2957795 + aa=cos(pol) + bb=sin(pol) + sq0=aa*aa*sqa + bb*bb*sqb + sync2=3.7*ccfbest/sq0 + +! Apply AFC corrections to the time-domain signal +! Now we are back to using the 1378.125 Hz sample rate, enough to +! accommodate the full JT65C bandwidth. + + call twkfreq_xy(cx,cy,n5,a) + +! Compute spectrum at best polarization for each half symbol. +! Adding or subtracting a small number (e.g., 5) to j may make it decode.\ +! NB: might want to try computing full-symbol spectra (nfft=512, even for +! submodes B and C). + + nsym=126 + nfft=512 + j=(dt00+dtbest+2.685)*1378.125 + if(j.lt.0) j=0 + + +! Perhaps should try full-symbol-length FFTs even in B, C sub-modes? +! (Tried this, found no significant difference in decodes.) + + do k=1,nsym +! do n=1,mode65 + do n=1,1 + do i=1,nfft + j=min(j+1,NMAX/64) + c5a(i)=aa*cx(j) + bb*cy(j) + enddo + call four2a(c5a,nfft,1,1,1) + if(n.eq.1) then + do i=1,66 +! s2(i,k)=real(c5a(i))**2 + aimag(c5a(i))**2 + jj=i + if(mode65.eq.2) jj=2*i-1 + if(mode65.eq.4) jj=4*i-3 + s2(i,k)=real(c5a(jj))**2 + aimag(c5a(jj))**2 + enddo + else + do i=1,66 + s2(i,k)=s2(i,k) + real(c5a(i))**2 + aimag(c5a(i))**2 + enddo + endif + enddo + enddo + + flip=nflip + call timer('dec65b ',0) + call decode65b(s2,flip,mycall,hiscall,hisgrid,mode65,neme,ndepth, & + nqd,nkv,nhist,qual,decoded,s3,sy) + dt=dt00 + dtbest + 1.7 + call timer('dec65b ',1) + + if(nqd.eq.1 .and. decoded.eq.' ') then + nhz=1000*nkhz + ndf + ihzdiff=min(500,ntol) + if(nutc.ne.nutc0 .or. abs(nhz-nhz0).ge.ihzdiff) syncbest=0. + if(sync2.gt.0.99999*syncbest) then + nsave=nsave+1 + nsave=mod(nsave-1,64)+1 + npol=nint(57.296*pol) + + call s3avg(nsave,mode65,nutc,nhz,xdt,npol,ntol,s3,nsum,nkv,decoded) + syncbest=sync2 + nhz0=nhz + endif + nutc0=nutc + endif + +900 return +end subroutine decode1a diff --git a/map65/libm65/decode65b.f90 b/map65/libm65/decode65b.f90 new file mode 100644 index 000000000..9b3ebccda --- /dev/null +++ b/map65/libm65/decode65b.f90 @@ -0,0 +1,48 @@ +subroutine decode65b(s2,flip,mycall,hiscall,hisgrid,mode65,neme,ndepth, & + nqd,nkv,nhist,qual,decoded,s3,sy) + + real s2(66,126) + real s3(64,63),sy(63) + logical first,ltext + character decoded*22,deepmsg*22 + character mycall*12,hiscall*12,hisgrid*6 + common/prcom/pr(126),mdat(126),mref(126,2),mdat2(126),mref2(126,2) + data first/.true./ + save + + if(first) call setup65 + first=.false. + + do j=1,63 + k=mdat(j) !Points to data symbol + if(flip.lt.0.0) k=mdat2(j) + do i=1,64 + s3(i,j)=s2(i+2,k) + enddo + k=mdat2(j) !Points to data symbol + if(flip.lt.0.0) k=mdat(j) + sy(j)=s2(1,k) + enddo + + nadd=mode65 + call extract(s3,nadd,ncount,nhist,decoded,ltext) !Extract the message +! Suppress "birdie messages" and other garbage decodes: + if(decoded(1:7).eq.'000AAA ') ncount=-1 + if(decoded(1:7).eq.'0L6MWK ') ncount=-1 + if(flip.lt.0.0 .and. ltext) ncount=-1 + nkv=1 + if(ncount.lt.0) then + nkv=0 + decoded=' ' + endif + + qual=0. + if(ndepth.ge.1 .and. (nqd.eq.1 .or. flip.eq.1.0)) then + call deep65(s3,mode65,neme,flip,mycall,hiscall,hisgrid,deepmsg,qual) + if(nqd.ne.1 .and. qual.lt.10.0) qual=0.0 + if(ndepth.lt.2 .and. qual.lt.6.0) qual=0.0 + endif + if(nkv.eq.0 .and. qual.ge.1.0) decoded=deepmsg + + return +end subroutine decode65b diff --git a/map65/libm65/decode_rs.c b/map65/libm65/decode_rs.c new file mode 100644 index 000000000..91f582ac1 --- /dev/null +++ b/map65/libm65/decode_rs.c @@ -0,0 +1,268 @@ +/* Reed-Solomon decoder + * Copyright 2002 Phil Karn, KA9Q + * May be used under the terms of the GNU General Public License (GPL) + * Modified by Steve Franke, K9AN, for use in a soft-symbol RS decoder + */ + +#ifdef DEBUG +#include +#endif + +#include + +#define NULL ((void *)0) +#define min(a,b) ((a) < (b) ? (a) : (b)) + +#ifdef FIXED +#include "fixed.h" +#elif defined(BIGSYM) +#include "int.h" +#else +#include "char.h" +#endif + +int DECODE_RS( +#ifndef FIXED + void *p, +#endif + DTYPE *data, int *eras_pos, int no_eras, int calc_syn){ + +#ifndef FIXED + struct rs *rs = (struct rs *)p; +#endif + int deg_lambda, el, deg_omega; + int i, j, r,k; + DTYPE u,q,tmp,num1,num2,den,discr_r; + DTYPE lambda[NROOTS+1]; // Err+Eras Locator poly + static DTYPE s[51]; // and syndrome poly + DTYPE b[NROOTS+1], t[NROOTS+1], omega[NROOTS+1]; + DTYPE root[NROOTS], reg[NROOTS+1], loc[NROOTS]; + int syn_error, count; + + if( calc_syn ) { + /* form the syndromes; i.e., evaluate data(x) at roots of g(x) */ + for(i=0;i 0) { + /* Init lambda to be the erasure locator polynomial */ + lambda[1] = ALPHA_TO[MODNN(PRIM*(NN-1-eras_pos[0]))]; + for (i = 1; i < no_eras; i++) { + u = MODNN(PRIM*(NN-1-eras_pos[i])); + for (j = i+1; j > 0; j--) { + tmp = INDEX_OF[lambda[j - 1]]; + if(tmp != A0) + lambda[j] ^= ALPHA_TO[MODNN(u + tmp)]; + } + } + +#if DEBUG >= 1 + /* Test code that verifies the erasure locator polynomial just constructed + Needed only for decoder debugging. */ + + /* find roots of the erasure location polynomial */ + for(i=1;i<=no_eras;i++) + reg[i] = INDEX_OF[lambda[i]]; + + count = 0; + for (i = 1,k=IPRIM-1; i <= NN; i++,k = MODNN(k+IPRIM)) { + q = 1; + for (j = 1; j <= no_eras; j++) + if (reg[j] != A0) { + reg[j] = MODNN(reg[j] + j); + q ^= ALPHA_TO[reg[j]]; + } + if (q != 0) + continue; + /* store root and error location number indices */ + root[count] = i; + loc[count] = k; + count++; + } + if (count != no_eras) { + printf("count = %d no_eras = %d\n lambda(x) is WRONG\n",count,no_eras); + count = -1; + goto finish; + } +#if DEBUG >= 2 + printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n"); + for (i = 0; i < count; i++) + printf("%d ", loc[i]); + printf("\n"); +#endif +#endif + } + for(i=0;i 0; j--){ + if (reg[j] != A0) { + reg[j] = MODNN(reg[j] + j); + q ^= ALPHA_TO[reg[j]]; + } + } + if (q != 0) + continue; /* Not a root */ + /* store root (index-form) and error location number */ +#if DEBUG>=2 + printf("count %d root %d loc %d\n",count,i,k); +#endif + root[count] = i; + loc[count] = k; + /* If we've already found max possible roots, + * abort the search to save time + */ + if(++count == deg_lambda) + break; + } + if (deg_lambda != count) { + /* + * deg(lambda) unequal to number of roots => uncorrectable + * error detected + */ + count = -1; + goto finish; + } + /* + * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo + * x**NROOTS). in index form. Also find deg(omega). + */ + deg_omega = 0; + for (i = 0; i < NROOTS;i++){ + tmp = 0; + j = (deg_lambda < i) ? deg_lambda : i; + for(;j >= 0; j--){ + if ((s[i - j] != A0) && (lambda[j] != A0)) + tmp ^= ALPHA_TO[MODNN(s[i - j] + lambda[j])]; + } + if(tmp != 0) + deg_omega = i; + omega[i] = INDEX_OF[tmp]; + } + omega[NROOTS] = A0; + + /* + * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = + * inv(X(l))**(FCR-1) and den = lambda_pr(inv(X(l))) all in poly-form + */ + for (j = count-1; j >=0; j--) { + num1 = 0; + for (i = deg_omega; i >= 0; i--) { + if (omega[i] != A0) + num1 ^= ALPHA_TO[MODNN(omega[i] + i * root[j])]; + } + num2 = ALPHA_TO[MODNN(root[j] * (FCR - 1) + NN)]; + den = 0; + + /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ + for (i = min(deg_lambda,NROOTS-1) & ~1; i >= 0; i -=2) { + if(lambda[i+1] != A0) + den ^= ALPHA_TO[MODNN(lambda[i+1] + i * root[j])]; + } + if (den == 0) { +#if DEBUG >= 1 + printf("\n ERROR: denominator = 0\n"); +#endif + count = -1; + goto finish; + } + /* Apply error to data */ + if (num1 != 0) { + data[loc[j]] ^= ALPHA_TO[MODNN(INDEX_OF[num1] + INDEX_OF[num2] + NN - INDEX_OF[den])]; + } + } +finish: + if(eras_pos != NULL){ + for(i=0;i0 means compound mycall + j4=index(callsign,'/') ! j4>0 means compound hiscall + callgrid(icall)=callsign(1:j2) + + mz=1 +! Allow MyCall + HisCall + rpt (?) + if(n.eq.1 .and. j3.lt.1 .and. j4.lt.1 .and. callsign(1:6).ne.' ') & + mz=MAXRPT+1 + do m=1,mz + if(m.gt.1) grid=rpt(m-1) + if(j3.lt.1 .and.j4.lt.1) callgrid(icall)=callsign(1:j2)//' '//grid + message=mycall(1:j1)//' '//callgrid(icall) + k=k+1 + testmsg(k)=message + call encode65(message,ncode(1,k)) + +! Insert CQ message + if(j4.lt.1) callgrid(icall)=callsign(1:j2)//' '//grid + message='CQ '//callgrid(icall) + k=k+1 + testmsg(k)=message + call encode65(message,ncode(1,k)) + enddo +10 continue + enddo + +20 continue + ntot=k + call timer('deep65a ',1) + +30 continue + call timer('deep65b ',0) + ref0=0. + do j=1,63 + ref0=ref0 + s3(mrs(j),j) + enddo + + p1=-1.e30 + do k=1,ntot + pp(k)=0. + if(k.ge.2 .and. k.le.64 .and. flip.lt.0.0) cycle +! Test all messages if flip=+1; skip the CQ messages if flip=-1. + if(flip.gt.0.0 .or. testmsg(k)(1:3).ne.'CQ ') then + sum=0. + ref=ref0 + do j=1,63 + i=ncode(j,k)+1 + sum=sum + s3(i,j) + if(i.eq.mrs(j)) ref=ref - s3(i,j) + s3(mrs2(j),j) + enddo + p=sum/ref + pp(k)=p + if(p.gt.p1) then + p1=p + ip1=k + bestmsg=testmsg(k) + endif + endif + enddo + + p2=-1.e30 + do i=1,ntot + if(pp(i).gt.p2 .and. testmsg(i).ne.bestmsg) p2=pp(i) + enddo + + if(mode65.eq.1) bias=max(1.12*p2,0.335) + if(mode65.eq.2) bias=max(1.08*p2,0.405) + if(mode65.ge.4) bias=max(1.04*p2,0.505) + + if(p2.eq.p1 .and. p1.ne.-1.e30) then + open(77,file='error.log',status='unknown',access='append') + write(77,*) p1,p2,ip1,bestmsg + close(77) + endif + + qual=100.0*(p1-bias) + + decoded=' ' + c=' ' + + if(qual.gt.1.0) then + if(qual.lt.6.0) c='?' + decoded=testmsg(ip1) + else + qual=0. + endif + decoded(22:22)=c + +! Make sure everything is upper case. + do i=1,22 + if(decoded(i:i).ge.'a' .and. decoded(i:i).le.'z') & + decoded(i:i)=char(ichar(decoded(i:i))-32) + enddo + call timer('deep65b ',1) + + return +end subroutine deep65 diff --git a/map65/libm65/deg2grid.f90 b/map65/libm65/deg2grid.f90 new file mode 100644 index 000000000..9ca3602f8 --- /dev/null +++ b/map65/libm65/deg2grid.f90 @@ -0,0 +1,30 @@ +subroutine deg2grid(dlong0,dlat,grid) + + real dlong !West longitude (deg) + real dlat !Latitude (deg) + character grid*6 + + dlong=dlong0 + if(dlong.lt.-180.0) dlong=dlong+360.0 + if(dlong.gt.180.0) dlong=dlong-360.0 + +! Convert to units of 5 min of longitude, working east from 180 deg. + nlong=60.0*(180.0-dlong)/5.0 + n1=nlong/240 !20-degree field + n2=(nlong-240*n1)/24 !2 degree square + n3=nlong-240*n1-24*n2 !5 minute subsquare + grid(1:1)=char(ichar('A')+n1) + grid(3:3)=char(ichar('0')+n2) + grid(5:5)=char(ichar('a')+n3) + +! Convert to units of 2.5 min of latitude, working north from -90 deg. + nlat=60.0*(dlat+90)/2.5 + n1=nlat/240 !10-degree field + n2=(nlat-240*n1)/24 !1 degree square + n3=nlat-240*n1-24*n2 !2.5 minuts subsquare + grid(2:2)=char(ichar('A')+n1) + grid(4:4)=char(ichar('0')+n2) + grid(6:6)=char(ichar('a')+n3) + + return +end subroutine deg2grid diff --git a/map65/libm65/demod64a.f90 b/map65/libm65/demod64a.f90 new file mode 100644 index 000000000..3b8ee03ce --- /dev/null +++ b/map65/libm65/demod64a.f90 @@ -0,0 +1,77 @@ +subroutine demod64a(s3,nadd,mrsym,mrprob,mr2sym,mr2prob,ntest,nlow) + +! Demodulate the 64-bin spectra for each of 63 symbols in a frame. + +! Parameters +! nadd number of spectra already summed +! mrsym most reliable symbol value +! mr2sym second most likely symbol value +! mrprob probability that mrsym was the transmitted value +! mr2prob probability that mr2sym was the transmitted value + + implicit real*8 (a-h,o-z) + real*4 s3(64,63) + real*8 fs(64) + integer mrsym(63),mrprob(63),mr2sym(63),mr2prob(63) + common/mrscom/ mrs(63),mrs2(63) + + afac=1.1 * float(nadd)**0.64 + scale=255.999 + +! Compute average spectral value + sum=0. + do j=1,63 + do i=1,64 + sum=sum+s3(i,j) + enddo + enddo + ave=sum/(64.*63.) + i1=1 !Silence warning + i2=1 + +! Compute probabilities for most reliable symbol values + do j=1,63 + s1=-1.e30 + fsum=0. + psum=0. + do i=1,64 + x=min(afac*s3(i,j)/ave,50.d0) + fs(i)=exp(x) + fsum=fsum+fs(i) + psum=psum + s3(i,j) + if(s3(i,j).gt.s1) then + s1=s3(i,j) + i1=i !Most reliable + endif + enddo + + s2=-1.e30 + do i=1,64 + if(i.ne.i1 .and. s3(i,j).gt.s2) then + s2=s3(i,j) + i2=i !Second most reliable + endif + enddo +! p1=fs(i1)/fsum !Normalized probabilities +! p2=fs(i2)/fsum + p1=s1/psum + p2=s2/psum + mrsym(j)=i1-1 + mr2sym(j)=i2-1 + mrprob(j)=scale*p1 + mr2prob(j)=scale*p2 + mrs(j)=i1 + mrs2(j)=i2 + enddo + + sum=0. + nlow=0 + do j=1,63 + sum=sum+mrprob(j) + if(mrprob(j).le.5) nlow=nlow+1 + enddo +! ntest=sum/63 + ntest=sum + + return +end subroutine demod64a diff --git a/map65/libm65/display.f90 b/map65/libm65/display.f90 new file mode 100644 index 000000000..a9f9ffab8 --- /dev/null +++ b/map65/libm65/display.f90 @@ -0,0 +1,169 @@ +subroutine display(nkeep,ftol) + + parameter (MAXLINES=400,MX=400,MAXCALLS=500) + integer indx(MAXLINES),indx2(MX) + character*83 line(MAXLINES),line2(MX),line3(MAXLINES) + character out*52,cfreq0*3,livecq*58 + character*6 callsign,callsign0 + character*12 freqcall(MAXCALLS) + real freqkHz(MAXLINES) + integer utc(MAXLINES),utc2(MX),utcz + real*8 f0 + + rewind 26 + + do i=1,MAXLINES + read(26,1010,end=10) line(i) +1010 format(a77) + read(line(i),1020) f0,ndf,nh,nm +1020 format(f8.3,i5,25x,i3,i2) + utc(i)=60*nh + nm + freqkHz(i)=1000.d0*(f0-144.d0) + 0.001d0*ndf + enddo + +10 backspace(26) + nz=i-1 + utcz=utc(nz) + nz=nz-1 + if(nz.lt.1) go to 999 + nquad=max(nkeep/4,3) + do i=1,nz + nage=utcz-utc(i) + if(nage.lt.0) nage=nage+1440 + iage=nage/nquad + write(line(i)(73:74),1021) iage +1021 format(i2) + enddo + + nage=utcz-utc(1) + if(nage.lt.0) nage=nage+1440 + if(nage.gt.nkeep) then + do i=1,nz + nage=utcz-utc(i) + if(nage.lt.0) nage=nage+1440 + if(nage.le.nkeep) go to 20 + enddo +20 i0=i + nz=nz-i0+1 + rewind 26 + if(nz.lt.1) go to 999 + do i=1,nz + j=i+i0-1 + line(i)=line(j) + utc(i)=utc(j) + freqkHz(i)=freqkHz(j) + write(26,1022) line(i) +1022 format(a77) + enddo + endif + + call flush(26) + call indexx(freqkHz,nz,indx) + + nstart=1 + k3=0 + k=1 + m=indx(1) + if(m.lt.1 .or. m.gt.MAXLINES) then + print*,'Error in display.f90: ',nz,m + m=1 + endif + line2(1)=line(m) + utc2(1)=utc(m) + do i=2,nz + j0=indx(i-1) + j=indx(i) + if(freqkHz(j)-freqkHz(j0).gt.2.0*ftol) then + if(nstart.eq.0) then + k=k+1 + line2(k)="" + utc2(k)=-1 + endif + kz=k + if(nstart.eq.1) then + call indexx(float(utc2(1:kz)),kz,indx2) + k3=0 + do k=1,kz + k3=min(k3+1,400) + line3(k3)=line2(indx2(k)) + enddo + nstart=0 + else + call indexx(float(utc2(1:kz)),kz,indx2) + do k=1,kz + k3=min(k3+1,400) + line3(k3)=line2(indx2(k)) + enddo + endif + k=0 + endif + if(i.eq.nz) then + k=k+1 + line2(k)="" + utc2(k)=-1 + endif + k=k+1 + line2(k)=line(j) + utc2(k)=utc(j) + j0=j + enddo + kz=k + call indexx(float(utc2(1:kz)),kz,indx2) + do k=1,kz + k3=min(k3+1,400) + line3(k3)=line2(indx2(k)) + enddo + + rewind 19 + rewind 20 + cfreq0=' ' + nc=0 + callsign0=' ' + do k=1,k3 + out=line3(k)(6:13)//line3(k)(28:31)//line3(k)(39:45)// & + line3(k)(35:38)//line3(k)(46:74) + if(out(1:3).ne.' ') then + cfreq0=out(1:3) + livecq=line3(k)(6:13)//line3(k)(28:31)//line3(k)(39:45)// & + line3(k)(23:27)//line3(k)(35:38)//line3(k)(46:70)// & + line3(k)(73:77) + if(index(livecq,' CQ ').gt.0 .or. index(livecq,' QRZ ').gt.0 .or. & + index(livecq,' QRT ').gt.0 .or. index(livecq,' CQV ').gt.0 .or. & + index(livecq,' CQH ').gt.0) write(19,1029) livecq +1029 format(a58) + write(*,1030) out !Messages +1030 format('@',a52) + i1=index(out(26:),' ') + callsign=out(i1+26:) + i2=index(callsign,' ') + if(i2.gt.1) callsign(i2:)=' ' + if(callsign.ne.' ' .and. callsign.ne.callsign0) then + len=i2-1 + if(len.lt.0) len=6 + if(len.ge.4) then !Omit short "callsigns" + if(nc.lt.MAXCALLS) nc=nc+1 + freqcall(nc)=cfreq0//' '//callsign//line3(k)(73:74) + callsign0=callsign + endif + endif + if(callsign.ne.' ' .and. callsign.eq.callsign0) then + freqcall(nc)=cfreq0//' '//callsign//line3(k)(73:74) + endif + endif + enddo + flush(19) + if(nc.lt.MAXCALLS) nc=nc+1 + freqcall(nc)=' ' + if(nc.lt.MAXCALLS) nc=nc+1 + freqcall(nc)=' ' + freqcall(nc+1)=' ' + freqcall(nc+2)=' ' + + do i=1,nc + write(*,1042) freqcall(i) !Band Map +1042 format('&',a12) + enddo + +999 continue + return +end subroutine display diff --git a/map65/libm65/dot.f90 b/map65/libm65/dot.f90 new file mode 100644 index 000000000..5829e8787 --- /dev/null +++ b/map65/libm65/dot.f90 @@ -0,0 +1,11 @@ +real*8 function dot(x,y) + + real*8 x(3),y(3) + + dot=0.d0 + do i=1,3 + dot=dot+x(i)*y(i) + enddo + + return +end function dot diff --git a/map65/libm65/dpol.f90 b/map65/libm65/dpol.f90 new file mode 100644 index 000000000..3f8085c0a --- /dev/null +++ b/map65/libm65/dpol.f90 @@ -0,0 +1,41 @@ +real function dpol(mygrid,hisgrid) + +! Compute spatial polartzation offset in degrees for the present +! time, between two specified grid locators. + + character*6 MyGrid,HisGrid + real lat,lon,LST + character cdate*8,ctime2*10,czone*5 + integer it(8) + data rad/57.2957795/ + + call date_and_time(cdate,ctime2,czone,it) + nyear=it(1) + month=it(2) + nday=it(3) + nh=it(5)-it(4)/60 + nm=it(6) + ns=it(7) + uth=nh + nm/60.0 + ns/3600.0 + + call grid2deg(MyGrid,lon,lat) + call MoonDop(nyear,month,nday,uth,-lon,lat,RAMoon,DecMoon, & + LST,HA,AzMoon,ElMoon,vr,dist) + xx=sin(lat/rad)*cos(ElMoon/rad) - cos(lat/rad)* & + cos(AzMoon/rad)*sin(ElMoon/rad) + yy=cos(lat/rad)*sin(AzMoon/rad) + poloffset1=rad*atan2(yy,xx) + + call grid2deg(hisGrid,lon,lat) + call MoonDop(nyear,month,nday,uth,-lon,lat,RAMoon,DecMoon, & + LST,HA,AzMoon,ElMoon,vr,dist) + xx=sin(lat/rad)*cos(ElMoon/rad) - cos(lat/rad)* & + cos(AzMoon/rad)*sin(ElMoon/rad) + yy=cos(lat/rad)*sin(AzMoon/rad) + poloffset2=rad*atan2(yy,xx) + + dpol=mod(poloffset2-poloffset1+720.0,180.0) + if(dpol.gt.90.0) dpol=dpol-180.0 + + return +end function dpol diff --git a/map65/libm65/encode65.f90 b/map65/libm65/encode65.f90 new file mode 100644 index 000000000..920d9c841 --- /dev/null +++ b/map65/libm65/encode65.f90 @@ -0,0 +1,14 @@ +subroutine encode65(message,sent) + + use packjt + character message*22 + integer dgen(12) + integer sent(63) + + call packmsg(message,dgen,itype) + call rs_encode(dgen,sent) + call interleave63(sent,1) + call graycode(sent,63,1) + + return +end subroutine encode65 diff --git a/map65/libm65/encode_rs.c b/map65/libm65/encode_rs.c new file mode 100644 index 000000000..9d56d0bf1 --- /dev/null +++ b/map65/libm65/encode_rs.c @@ -0,0 +1,47 @@ +/* Reed-Solomon encoder + * Copyright 2002, Phil Karn, KA9Q + * May be used under the terms of the GNU General Public License (GPL) + */ +#include + +#ifdef FIXED +#include "fixed.h" +#elif defined(BIGSYM) +#include "int.h" +#else +#include "char.h" +#endif + +void ENCODE_RS( +#ifndef FIXED +void *p, +#endif +DTYPE *data, DTYPE *bb){ +#ifndef FIXED + struct rs *rs = (struct rs *)p; +#endif + int i, j; + DTYPE feedback; + + memset(bb,0,NROOTS*sizeof(DTYPE)); + + for(i=0;i +#include +#include +#include +#include +#include "rs2.h" + +static void *rs; +void getpp_(int workdat[], float *pp); + +void ftrsd2_(int mrsym[], int mrprob[], int mr2sym[], int mr2prob[], + int* ntrials0, int correct[], int param[], int ntry[]) +{ + int rxdat[63], rxprob[63], rxdat2[63], rxprob2[63]; + int workdat[63]; + int indexes[63]; + int era_pos[51]; + int i, j, numera, nerr, nn=63; + int ntrials = *ntrials0; + int nhard=0,nhard_min=32768,nsoft=0,nsoft_min=32768; + int ntotal=0,ntotal_min=32768,ncandidates; + int nera_best=0; + float pp,pp1,pp2; + static unsigned int nseed; + +// Power-percentage symbol metrics - composite gnnf/hf + int perr[8][8] = { + { 4, 9, 11, 13, 14, 14, 15, 15}, + { 2, 20, 20, 30, 40, 50, 50, 50}, + { 7, 24, 27, 40, 50, 50, 50, 50}, + {13, 25, 35, 46, 52, 70, 50, 50}, + {17, 30, 42, 54, 55, 64, 71, 70}, + {25, 39, 48, 57, 64, 66, 77, 77}, + {32, 45, 54, 63, 66, 75, 78, 83}, + {51, 58, 57, 66, 72, 77, 82, 86}}; + + +// Initialize the KA9Q Reed-Solomon encoder/decoder + unsigned int symsize=6, gfpoly=0x43, fcr=3, prim=1, nroots=51; + rs=init_rs_int(symsize, gfpoly, fcr, prim, nroots, 0); + +// Reverse the received symbol vectors for BM decoder + for (i=0; i<63; i++) { + rxdat[i]=mrsym[62-i]; + rxprob[i]=mrprob[62-i]; + rxdat2[i]=mr2sym[62-i]; + rxprob2[i]=mr2prob[62-i]; + } + +// Sort rxprob to find indexes of the least reliable symbols + int k, pass, tmp, nsym=63; + int probs[63]; + for (i=0; i<63; i++) { + indexes[i]=i; + probs[i]=rxprob[i]; + } + for (pass = 1; pass <= nsym-1; pass++) { + for (k = 0; k < nsym - pass; k++) { + if( probs[k] < probs[k+1] ) { + tmp = probs[k]; + probs[k] = probs[k+1]; + probs[k+1] = tmp; + tmp = indexes[k]; + indexes[k] = indexes[k+1]; + indexes[k+1] = tmp; + } + } + } + +// See if we can decode using BM HDD, and calculate the syndrome vector. + memset(era_pos,0,51*sizeof(int)); + numera=0; + memcpy(workdat,rxdat,sizeof(rxdat)); + nerr=decode_rs_int(rs,workdat,era_pos,numera,1); + if( nerr >= 0 ) { + // Hard-decision decoding succeeded. Save codeword and some parameters. + nhard=0; + for (i=0; i<63; i++) { + if( workdat[i] != rxdat[i] ) nhard=nhard+1; + } + memcpy(correct,workdat,63*sizeof(int)); + param[0]=0; + param[1]=nhard; + param[2]=0; + param[3]=0; + param[4]=0; + param[5]=0; + param[7]=1000*1000; + ntry[0]=0; + return; + } + +/* +Hard-decision decoding failed. Try the FT soft-decision method. +Generate random erasure-locator vectors and see if any of them +decode. This will generate a list of "candidate" codewords. The +soft distance between each candidate codeword and the received +word is estimated by finding the largest (pp1) and second-largest +(pp2) outputs from a synchronized filter-bank operating on the +symbol spectra, and using these to decide which candidate +codeword is "best". +*/ + + nseed=1; //Seed for random numbers + float ratio; + int thresh, nsum; + int thresh0[63]; + ncandidates=0; + nsum=0; + int ii,jj; + for (i=0; i= 0 ) { + // We have a candidate codeword. Find its hard and soft distance from + // the received word. Also find pp1 and pp2 from the full array + // s3(64,63) of synchronized symbol spectra. + ncandidates=ncandidates+1; + nhard=0; + nsoft=0; + for (i=0; i<63; i++) { + if(workdat[i] != rxdat[i]) { + nhard=nhard+1; + if(workdat[i] != rxdat2[i]) { + nsoft=nsoft+rxprob[i]; + } + } + } + nsoft=63*nsoft/nsum; + ntotal=nsoft+nhard; + + getpp_(workdat,&pp); + if(pp>pp1) { + pp2=pp1; + pp1=pp; + nsoft_min=nsoft; + nhard_min=nhard; + ntotal_min=ntotal; + memcpy(correct,workdat,63*sizeof(int)); + nera_best=numera; + ntry[0]=k; + } else { + if(pp>pp2 && pp!=pp1) pp2=pp; + } + if(nhard_min <= 41 && ntotal_min <= 71) break; + } + if(k == ntrials) ntry[0]=k; + } + + param[0]=ncandidates; + param[1]=nhard_min; + param[2]=nsoft_min; + param[3]=nera_best; + param[4]= pp1 > 0 ? 1000.0*pp2/pp1 : 1000.0; + param[5]=ntotal_min; + param[6]=ntry[0]; + param[7]=1000.0*pp2; + param[8]=1000.0*pp1; + if(param[0]==0) param[2]=-1; + return; +} diff --git a/map65/libm65/gen65.f90 b/map65/libm65/gen65.f90 new file mode 100644 index 000000000..f09d0868a --- /dev/null +++ b/map65/libm65/gen65.f90 @@ -0,0 +1,99 @@ +subroutine gen65(message,mode65,samfac,nsendingsh,msgsent,iwave,nwave) + +! Encodes a JT65 message into a wavefile. +! Executes in 17 ms on opti-745. + + use packjt + + parameter (NMAX=2*60*11025) !Max length of wave file + character*22 message !Message to be generated + character*22 msgsent !Message as it will be received + character*3 cok !' ' or 'OOO' + real*8 dt,phi,f,f0,dfgen,dphi,twopi,samfac + integer*2 iwave(NMAX) !Generated wave file + integer dgen(12) + integer sent(63) + logical first + integer nprc(126) + real pr(126) + data nprc/1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & + 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & + 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & + 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & + 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & + 1,1,1,1,1,1/ + data twopi/6.283185307179586476d0/,first/.true./ + save + + if(first) then + do i=1,126 + pr(i)=2*nprc(i)-1 + enddo + first=.false. + endif + + call chkmsg(message,cok,nspecial,flip) + if(nspecial.eq.0) then + call packmsg(message,dgen,itype) !Pack message into 72 bits + nsendingsh=0 + if(iand(dgen(10),8).ne.0) nsendingsh=-1 !Plain text flag + + call rs_encode(dgen,sent) + call interleave63(sent,1) !Apply interleaving + call graycode(sent,63,1) !Apply Gray code + nsym=126 !Symbols per transmission + nsps=4096 + else + nsym=32 + nsps=16384 + nsendingsh=1 !Flag for shorthand message + endif + if(mode65.eq.0) go to 900 + +! Set up necessary constants + dt=1.d0/(samfac*11025.d0) + f0=118*11025.d0/1024 + dfgen=mode65*11025.d0/4096.d0 + phi=0.d0 + dphi=twopi*dt*f0 + i=0 + k=0 + do j=1,nsym + if(message(1:5).ne.'@TUNE') then + f=f0 + if(nspecial.ne.0 .and. mod(j,2).eq.0) f=f0+10*nspecial*dfgen + if(nspecial.eq.0 .and. flip*pr(j).lt.0.0) then + k=k+1 + f=f0+(sent(k)+2)*dfgen + endif + dphi=twopi*dt*f + endif + do ii=1,nsps + phi=phi+dphi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + i=i+1 + iwave(2*i-1)=32767.0*cos(xphi) + iwave(2*i)=32767.0*sin(xphi) + enddo + enddo + + iwave(2*nsym*nsps+1:)=0 + nwave=2*nsym*nsps + 5512 + call unpackmsg(dgen,msgsent) + if(flip.lt.0.0) then + do i=22,1,-1 + if(msgsent(i:i).ne.' ') goto 10 + enddo +10 msgsent=msgsent(1:i)//' OOO' + endif + + if(nsendingsh.eq.1) then + if(nspecial.eq.2) msgsent='RO' + if(nspecial.eq.3) msgsent='RRR' + if(nspecial.eq.4) msgsent='73' + endif + +900 return +end subroutine gen65 diff --git a/map65/libm65/gen_q65_cwave.f90 b/map65/libm65/gen_q65_cwave.f90 new file mode 100644 index 000000000..0e3d00074 --- /dev/null +++ b/map65/libm65/gen_q65_cwave.f90 @@ -0,0 +1,52 @@ +subroutine gen_q65_cwave(msg,ntxfreq,ntone_spacing,msgsent,cwave,nwave) + +! Encodes a Q65 message to yield complex cwave() at fsample = 96000 Hz + + use packjt + use q65_encoding + parameter (NMAX=60*96000) + character*22 msg + character*22 msgsent !Message as it will be received + character*37 msg37 + real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,tsym + complex cwave(NMAX) + integer codeword(65),itone(85) + integer icos7(0:6) + data icos7/2,5,6,0,4,1,3/ !Defines a 7x7 Costas array + data twopi/6.283185307179586476d0/ + save + + msgsent=msg + msg37='' + msg37(1:22)=msg + call get_q65_tones(msg37,codeword,itone) + +! Set up necessary constants + nsym=85 + tsym=7200.d0/12000.d0 + dt=1.d0/96000.d0 + f0=ntxfreq + dfgen=ntone_spacing*12000.d0/7200.d0 + phi=0.d0 + dphi=twopi*dt*f0 + i=0 + nwave=85*7200*96000.d0/12000.d0 + t=0.d0 + j0=0 + do i=1,nwave + t=t+dt + j=t/tsym + 1 + if(j.gt.85) exit + if(j.ne.j0) then + f=f0 + itone(j)*dfgen + dphi=twopi*dt*f + j0=j + endif + phi=phi+dphi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + cwave(i)=cmplx(cos(xphi),-sin(xphi)) + enddo + +999 return +end subroutine gen_q65_cwave diff --git a/map65/libm65/gen_q65_wave.f90 b/map65/libm65/gen_q65_wave.f90 new file mode 100644 index 000000000..08f84ab20 --- /dev/null +++ b/map65/libm65/gen_q65_wave.f90 @@ -0,0 +1,54 @@ +subroutine gen_q65_wave(msg,ntxfreq,mode65,msgsent,iwave,nwave) + +! Encodes a Q65 message to yield complex iwave() at fsample = 11025 Hz + + use packjt + use q65_encoding + parameter (NMAX=2*60*11025) + character*22 msg + character*22 msgsent !Message as it will be received + character*37 msg37 + real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,tsym + integer codeword(65),itone(85) + integer*2 iwave(NMAX) + integer icos7(0:6) + data icos7/2,5,6,0,4,1,3/ !Defines a 7x7 Costas array + data twopi/6.283185307179586476d0/ + save + + msgsent=msg + msg37='' + msg37(1:22)=msg + call get_q65_tones(msg37,codeword,itone) + +! Set up necessary constants + nsym=85 + tsym=7200.d0/12000.d0 + dt=1.d0/11025.d0 + f0=ntxfreq + ndf=2**(mode65-1) + dfgen=ndf*12000.d0/7200.d0 + phi=0.d0 + dphi=twopi*dt*f0 + i=0 + iz=85*7200*11025.d0/12000.d0 + t=0.d0 + j0=0 + do i=1,iz + t=t+dt + j=t/tsym + if(j.ne.j0) then + f=f0 + itone(j)*dfgen + dphi=twopi*dt*f + j0=j + endif + phi=phi+dphi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + iwave(2*i-1)=32767.0*cos(xphi) + iwave(2*i)=32767.0*sin(xphi) + enddo + nwave=2*iz + +999 return +end subroutine gen_q65_wave diff --git a/map65/libm65/geocentric.f90 b/map65/libm65/geocentric.f90 new file mode 100644 index 000000000..59ed90b51 --- /dev/null +++ b/map65/libm65/geocentric.f90 @@ -0,0 +1,17 @@ +subroutine geocentric(alat,elev,hlt,erad) + + implicit real*8 (a-h,o-z) + +! IAU 1976 flattening f, equatorial radius a + f = 1.d0/298.257d0 + a = 6378140.d0 + c = 1.d0/sqrt(1.d0 + (-2.d0 + f)*f*sin(alat)*sin(alat)) + arcf = (a*c + elev)*cos(alat) + arsf = (a*(1.d0 - f)*(1.d0 - f)*c + elev)*sin(alat) + hlt = datan2(arsf,arcf) + erad = sqrt(arcf*arcf + arsf*arsf) + erad = 0.001d0*erad + + return +end subroutine geocentric + diff --git a/map65/libm65/getdphi.f90 b/map65/libm65/getdphi.f90 new file mode 100644 index 000000000..e55d7120d --- /dev/null +++ b/map65/libm65/getdphi.f90 @@ -0,0 +1,18 @@ +subroutine getdphi(qphi) + + real qphi(12) + + s=0. + c=0. + do i=1,12 + th=i*30/57.2957795 + s=s+qphi(i)*sin(th) + c=c+qphi(i)*cos(th) + enddo + + dphi=57.2957795*atan2(s,c) + write(*,1010) nint(dphi) +1010 format('!Best-fit Dphi =',i4,' deg') + + return + end diff --git a/map65/libm65/getpfx1.f90 b/map65/libm65/getpfx1.f90 new file mode 100644 index 000000000..40fcc369c --- /dev/null +++ b/map65/libm65/getpfx1.f90 @@ -0,0 +1,96 @@ +subroutine getpfx1(callsign,k,nv2) + + character*12 callsign0,callsign,lof,rof + character*8 c + character addpfx*8,tpfx*4,tsfx*3 + logical ispfx,issfx,invalid + common/pfxcom/addpfx + include 'pfx.f90' + + callsign0=callsign + nv2=0 + iz=index(callsign,' ') - 1 + if(iz.lt.0) iz=12 + islash=index(callsign(1:iz),'/') + k=0 + c=' ' + if(islash.gt.0 .and. islash.le.(iz-4)) then +! Add-on prefix + c=callsign(1:islash-1) + callsign=callsign(islash+1:iz) + do i=1,NZ + if(pfx(i)(1:4).eq.c) then + k=i + go to 10 + endif + enddo + if(addpfx.eq.c) then + k=449 + go to 10 + endif + + else if(islash.eq.(iz-1)) then +! Add-on suffix + c=callsign(islash+1:iz) + callsign=callsign(1:islash-1) + do i=1,NZ2 + if(sfx(i).eq.c(1:1)) then + k=400+i + go to 10 + endif + enddo + endif + +10 if(islash.ne.0 .and.k.eq.0) then +! Original JT65 would force this compound callsign to be treated as +! plain text. In JT65v2, we will encode the prefix or suffix into nc1. +! The task here is to compute the proper value of k. + lof=callsign0(:islash-1) + rof=callsign0(islash+1:) + llof=len_trim(lof) + lrof=len_trim(rof) + ispfx=(llof.gt.0 .and. llof.le.4) + issfx=(lrof.gt.0 .and. lrof.le.3) + invalid=.not.(ispfx.or.issfx) + if(ispfx.and.issfx) then + if(llof.lt.3) issfx=.false. + if(lrof.lt.3) ispfx=.false. + if(ispfx.and.issfx) then + i=ichar(callsign0(islash-1:islash-1)) + if(i.ge.ichar('0') .and. i.le.ichar('9')) then + issfx=.false. + else + ispfx=.false. + endif + endif + endif + + if(invalid) then + k=-1 + else + if(ispfx) then + tpfx=lof(1:4) + k=nchar(tpfx(1:1)) + k=37*k + nchar(tpfx(2:2)) + k=37*k + nchar(tpfx(3:3)) + k=37*k + nchar(tpfx(4:4)) + nv2=1 + i=index(callsign0,'/') + callsign=callsign0(:i-1) + callsign=callsign0(i+1:) + endif + if(issfx) then + tsfx=rof(1:3) + k=nchar(tsfx(1:1)) + k=37*k + nchar(tsfx(2:2)) + k=37*k + nchar(tsfx(3:3)) + nv2=2 + i=index(callsign0,'/') + callsign=callsign0(:i-1) + endif + endif + endif + + return +end subroutine getpfx1 + diff --git a/map65/libm65/getpfx2.f90 b/map65/libm65/getpfx2.f90 new file mode 100644 index 000000000..d747e7f29 --- /dev/null +++ b/map65/libm65/getpfx2.f90 @@ -0,0 +1,24 @@ +subroutine getpfx2(k0,callsign) + + character callsign*12 + include 'pfx.f90' + character addpfx*8 + common/pfxcom/addpfx + + k=k0 + if(k.gt.450) k=k-450 + if(k.ge.1 .and. k.le.NZ) then + iz=index(pfx(k),' ') - 1 + callsign=pfx(k)(1:iz)//'/'//callsign + else if(k.ge.401 .and. k.le.400+NZ2) then + iz=index(callsign,' ') - 1 + callsign=callsign(1:iz)//'/'//sfx(k-400) + else if(k.eq.449) then + iz=index(addpfx,' ') - 1 + if(iz.lt.1) iz=8 + callsign=addpfx(1:iz)//'/'//callsign + endif + + return +end subroutine getpfx2 + diff --git a/map65/libm65/gran.c b/map65/libm65/gran.c new file mode 100644 index 000000000..24b986503 --- /dev/null +++ b/map65/libm65/gran.c @@ -0,0 +1,28 @@ +#include +#include + +/* Generate gaussian random float with mean=0 and std_dev=1 */ +float gran_() +{ + float fac,rsq,v1,v2; + static float gset; + static int iset; + + if(iset){ + /* Already got one */ + iset = 0; + return gset; + } + /* Generate two evenly distributed numbers between -1 and +1 + * that are inside the unit circle + */ + do { + v1 = 2.0 * (float)rand() / RAND_MAX - 1; + v2 = 2.0 * (float)rand() / RAND_MAX - 1; + rsq = v1*v1 + v2*v2; + } while(rsq >= 1.0 || rsq == 0.0); + fac = sqrt(-2.0*log(rsq)/rsq); + gset = v1*fac; + iset++; + return v2*fac; +} diff --git a/map65/libm65/graycode.f90 b/map65/libm65/graycode.f90 new file mode 100644 index 000000000..2074241a6 --- /dev/null +++ b/map65/libm65/graycode.f90 @@ -0,0 +1,10 @@ +subroutine graycode(dat,n,idir) + + integer dat(n) + do i=1,n + dat(i)=igray(dat(i),idir) + enddo + + return +end subroutine graycode + diff --git a/map65/libm65/graycode65.f90 b/map65/libm65/graycode65.f90 new file mode 100644 index 000000000..bb2c669ce --- /dev/null +++ b/map65/libm65/graycode65.f90 @@ -0,0 +1,9 @@ +subroutine graycode65(dat,n,idir) + + integer dat(n) + do i=1,n + dat(i)=igray(dat(i),idir) + enddo + + return +end subroutine graycode65 diff --git a/map65/libm65/grid2deg.f90 b/map65/libm65/grid2deg.f90 new file mode 100644 index 000000000..344351dd7 --- /dev/null +++ b/map65/libm65/grid2deg.f90 @@ -0,0 +1,38 @@ +subroutine grid2deg(grid0,dlong,dlat) + +! Converts Maidenhead grid locator to degrees of West longitude +! and North latitude. + + character*6 grid0,grid + character*1 g1,g2,g3,g4,g5,g6 + + grid=grid0 + i=ichar(grid(5:5)) + if(grid(5:5).eq.' ' .or. i.le.64 .or. i.ge.128) grid(5:6)='mm' + + if(grid(1:1).ge.'a' .and. grid(1:1).le.'z') grid(1:1)= & + char(ichar(grid(1:1))+ichar('A')-ichar('a')) + if(grid(2:2).ge.'a' .and. grid(2:2).le.'z') grid(2:2)= & + char(ichar(grid(2:2))+ichar('A')-ichar('a')) + if(grid(5:5).ge.'A' .and. grid(5:5).le.'Z') grid(5:5)= & + char(ichar(grid(5:5))-ichar('A')+ichar('a')) + if(grid(6:6).ge.'A' .and. grid(6:6).le.'Z') grid(6:6)= & + char(ichar(grid(6:6))-ichar('A')+ichar('a')) + + g1=grid(1:1) + g2=grid(2:2) + g3=grid(3:3) + g4=grid(4:4) + g5=grid(5:5) + g6=grid(6:6) + + nlong = 180 - 20*(ichar(g1)-ichar('A')) + n20d = 2*(ichar(g3)-ichar('0')) + xminlong = 5*(ichar(g5)-ichar('a')+0.5) + dlong = nlong - n20d - xminlong/60.0 + nlat = -90+10*(ichar(g2)-ichar('A')) + ichar(g4)-ichar('0') + xminlat = 2.5*(ichar(g6)-ichar('a')+0.5) + dlat = nlat + xminlat/60.0 + + return +end subroutine grid2deg diff --git a/map65/libm65/grid2k.f90 b/map65/libm65/grid2k.f90 new file mode 100644 index 000000000..f68b1409e --- /dev/null +++ b/map65/libm65/grid2k.f90 @@ -0,0 +1,12 @@ +subroutine grid2k(grid,k) + + character*6 grid + + call grid2deg(grid,xlong,xlat) + nlong=nint(xlong) + nlat=nint(xlat) + k=0 + if(nlat.ge.85) k=5*(nlong+179)/2 + nlat-84 + + return +end subroutine grid2k diff --git a/map65/libm65/igray.c b/map65/libm65/igray.c new file mode 100644 index 000000000..395f79712 --- /dev/null +++ b/map65/libm65/igray.c @@ -0,0 +1,22 @@ +#ifdef CVF +extern int __stdcall IGRAY(int *n0, int *idir) +#else +int igray_(int *n0, int *idir) +#endif +{ + int n; + unsigned long sh; + unsigned long nn; + n=*n0; + + if(*idir>0) return (n ^ (n >> 1)); + + sh = 1; + nn = (n >> sh); + while (nn > 0) { + n ^= nn; + sh <<= 1; + nn = (n >> sh); + } + return (n); +} diff --git a/map65/libm65/indexx.f90 b/map65/libm65/indexx.f90 new file mode 100644 index 000000000..7a35f53b8 --- /dev/null +++ b/map65/libm65/indexx.f90 @@ -0,0 +1,91 @@ +subroutine indexx(arr,n,indx) + + parameter (M=7,NSTACK=50) + integer n,indx(n) + real arr(n) + integer i,indxt,ir,itemp,j,jstack,k,l,istack(NSTACK) + real a + + do j=1,n + indx(j)=j + enddo + + jstack=0 + l=1 + ir=n +1 if(ir-l.lt.M) then + do j=l+1,ir + indxt=indx(j) + a=arr(indxt) + do i=j-1,1,-1 + if(arr(indx(i)).le.a) goto 2 + indx(i+1)=indx(i) + enddo + i=0 +2 indx(i+1)=indxt + enddo + if(jstack.eq.0) return + + ir=istack(jstack) + l=istack(jstack-1) + jstack=jstack-2 + + else + k=(l+ir)/2 + itemp=indx(k) + indx(k)=indx(l+1) + indx(l+1)=itemp + + if(arr(indx(l+1)).gt.arr(indx(ir))) then + itemp=indx(l+1) + indx(l+1)=indx(ir) + indx(ir)=itemp + endif + + if(arr(indx(l)).gt.arr(indx(ir))) then + itemp=indx(l) + indx(l)=indx(ir) + indx(ir)=itemp + endif + + if(arr(indx(l+1)).gt.arr(indx(l))) then + itemp=indx(l+1) + indx(l+1)=indx(l) + indx(l)=itemp + endif + + i=l+1 + j=ir + indxt=indx(l) + a=arr(indxt) +3 continue + i=i+1 + if(arr(indx(i)).lt.a) goto 3 + +4 continue + j=j-1 + if(arr(indx(j)).gt.a) goto 4 + if(j.lt.i) goto 5 + itemp=indx(i) + indx(i)=indx(j) + indx(j)=itemp + goto 3 + +5 indx(l)=indx(j) + indx(j)=indxt + jstack=jstack+2 + if(jstack.gt.NSTACK) stop 'NSTACK too small in indexx' + if(ir-i+1.ge.j-l)then + istack(jstack)=ir + istack(jstack-1)=i + ir=j-1 + else + istack(jstack)=j-1 + istack(jstack-1)=l + l=i + endif + endif + goto 1 + +end subroutine indexx + diff --git a/map65/libm65/init_rs.c b/map65/libm65/init_rs.c new file mode 100644 index 000000000..876819f8c --- /dev/null +++ b/map65/libm65/init_rs.c @@ -0,0 +1,120 @@ +/* Initialize a RS codec + * + * Copyright 2002 Phil Karn, KA9Q + * May be used under the terms of the GNU General Public License (GPL) + */ +#include + +#ifdef CCSDS +#include "ccsds.h" +#elif defined(BIGSYM) +#include "int.h" +#else +#include "char.h" +#endif + +void FREE_RS(void *p){ + struct rs *rs = (struct rs *)p; + + free(rs->alpha_to); + free(rs->index_of); + free(rs->genpoly); + free(rs); +} + +/* Initialize a Reed-Solomon codec + * symsize = symbol size, bits (1-8) + * gfpoly = Field generator polynomial coefficients + * fcr = first root of RS code generator polynomial, index form + * prim = primitive element to generate polynomial roots + * nroots = RS code generator polynomial degree (number of roots) + */ +void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned fcr,unsigned prim, + unsigned int nroots){ + struct rs *rs; + int i, j, sr,root,iprim; + + /* Check parameter ranges */ + if(symsize < 0 || symsize > (int)(8*sizeof(DTYPE))) + return NULL; /* Need version with ints rather than chars */ + + if(fcr >= (1<= (1<= (1<mm = symsize; + rs->nn = (1<alpha_to = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1)); + if(rs->alpha_to == NULL){ + free(rs); + return NULL; + } + rs->index_of = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1)); + if(rs->index_of == NULL){ + free(rs->alpha_to); + free(rs); + return NULL; + } + + /* Generate Galois field lookup tables */ + rs->index_of[0] = A0; /* log(zero) = -inf */ + rs->alpha_to[A0] = 0; /* alpha**-inf = 0 */ + sr = 1; + for(i=0;inn;i++){ + rs->index_of[sr] = i; + rs->alpha_to[i] = sr; + sr <<= 1; + if(sr & (1<nn; + } + if(sr != 1){ + /* field generator polynomial is not primitive! */ + free(rs->alpha_to); + free(rs->index_of); + free(rs); + return NULL; + } + + /* Form RS code generator polynomial from its roots */ + rs->genpoly = (DTYPE *)malloc(sizeof(DTYPE)*(nroots+1)); + if(rs->genpoly == NULL){ + free(rs->alpha_to); + free(rs->index_of); + free(rs); + return NULL; + } + rs->fcr = fcr; + rs->prim = prim; + rs->nroots = nroots; + + /* Find prim-th root of 1, used in decoding */ + for(iprim=1;(iprim % prim) != 0;iprim += rs->nn) + ; + rs->iprim = iprim / prim; + + rs->genpoly[0] = 1; + for (i = 0,root=fcr*prim; i < nroots; i++,root += prim) { + rs->genpoly[i+1] = 1; + + /* Multiply rs->genpoly[] by @**(root + x) */ + for (j = i; j > 0; j--){ + if (rs->genpoly[j] != 0) + rs->genpoly[j] = rs->genpoly[j-1] ^ rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[j]] + root)]; + else + rs->genpoly[j] = rs->genpoly[j-1]; + } + /* rs->genpoly[0] can never be zero */ + rs->genpoly[0] = rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[0]] + root)]; + } + /* convert rs->genpoly[] to index form for quicker encoding */ + for (i = 0; i <= nroots; i++) + rs->genpoly[i] = rs->index_of[rs->genpoly[i]]; + + return rs; +} diff --git a/map65/libm65/int.h b/map65/libm65/int.h new file mode 100644 index 000000000..ada5bfd4c --- /dev/null +++ b/map65/libm65/int.h @@ -0,0 +1,54 @@ +/* Include file to configure the RS codec for integer symbols + * + * Copyright 2002, Phil Karn, KA9Q + * May be used under the terms of the GNU General Public License (GPL) + */ +#define DTYPE int + +/* Reed-Solomon codec control block */ +struct rs { + unsigned int mm; /* Bits per symbol */ + unsigned int nn; /* Symbols per block (= (1<= rs->nn) { + x -= rs->nn; + x = (x >> rs->mm) + (x & rs->nn); + } + return x; +} +#define MODNN(x) modnn(rs,x) + +#define MM (rs->mm) +#define NN (rs->nn) +#define ALPHA_TO (rs->alpha_to) +#define INDEX_OF (rs->index_of) +#define GENPOLY (rs->genpoly) +#define NROOTS (rs->nroots) +#define FCR (rs->fcr) +#define PRIM (rs->prim) +#define IPRIM (rs->iprim) +#define A0 (NN) + +#define ENCODE_RS encode_rs_int +#define DECODE_RS decode_rs_int +#define INIT_RS init_rs_int +#define FREE_RS free_rs_int + +void ENCODE_RS(void *p,DTYPE *data,DTYPE *parity); +int DECODE_RS(void *p,DTYPE *data,int *eras_pos,int no_eras, int calc_syn); +void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned int fcr, + unsigned int prim,unsigned int nroots); +void FREE_RS(void *p); + + + + diff --git a/map65/libm65/interleave63.f90 b/map65/libm65/interleave63.f90 new file mode 100644 index 000000000..a32ef34cd --- /dev/null +++ b/map65/libm65/interleave63.f90 @@ -0,0 +1,25 @@ +subroutine interleave63(d1,idir) + +! Interleave (idir=1) or de-interleave (idir=-1) the array d1. + + integer d1(0:6,0:8) + integer d2(0:8,0:6) + + if(idir.ge.0) then + do i=0,6 + do j=0,8 + d2(j,i)=d1(i,j) + enddo + enddo + call move(d2,d1,63) + else + call move(d1,d2,63) + do i=0,6 + do j=0,8 + d1(i,j)=d2(j,i) + enddo + enddo + endif + + return +end subroutine interleave63 diff --git a/map65/libm65/ipcomm.cpp b/map65/libm65/ipcomm.cpp new file mode 100644 index 000000000..b40a09998 --- /dev/null +++ b/map65/libm65/ipcomm.cpp @@ -0,0 +1,34 @@ +#include +#include +#include + +QSharedMemory mem_m65("mem_m65"); +QSystemSemaphore sem_m65("sem_m65", 1, QSystemSemaphore::Open); + +extern "C" { + bool attach_m65_(); + bool create_m65_(int nsize); + bool detach_m65_(); + bool lock_m65_(); + bool unlock_m65_(); + char* address_m65_(); + int size_m65_(); + + bool acquire_m65_(); + bool release_m65_(); + + extern struct { + char c[10]; + } m65com_; +} + +bool attach_m65_() {return mem_m65.attach();} +bool create_m65_(int nsize) {return mem_m65.create(nsize);} +bool detach_m65_() {return mem_m65.detach();} +bool lock_m65_() {return mem_m65.lock();} +bool unlock_m65_() {return mem_m65.unlock();} +char* address_m65_() {return (char*)mem_m65.constData();} +int size_m65_() {return (int)mem_m65.size();} + +bool acquire_m65_() {return sem_m65.acquire();} +bool release_m65_() {return sem_m65.release();} diff --git a/map65/libm65/iqcal.f90 b/map65/libm65/iqcal.f90 new file mode 100644 index 000000000..c0c4fce2d --- /dev/null +++ b/map65/libm65/iqcal.f90 @@ -0,0 +1,30 @@ +subroutine iqcal(nn,c,nfft,gain,phase,zsum,ipk,reject) + + complex c(0:nfft-1) + complex z,zsum,zave + + if(nn.eq.0) then + zsum=0. + endif + nn=nn+1 + smax=0. + ipk=1 + do i=1,nfft-1 !Find strongest signal + s=real(c(i))**2 + aimag(c(i))**2 + if(s.gt.smax) then + smax=s + ipk=i + endif + enddo + pimage=real(c(nfft-ipk))**2 + aimag(c(nfft-ipk))**2 + p=smax + pimage + z=c(ipk)*c(nfft-ipk)/p !Synchronous detection of image + zsum=zsum+z + zave=zsum/nn + tmp=sqrt(1.0 - (2.0*real(zave))**2) + phase=asin(2.0*aimag(zave)/tmp) !Estimate phase + gain=tmp/(1.0-2.0*real(zave)) !Estimate gain + reject=10.0*log10(pimage/smax) + + return +end subroutine iqcal diff --git a/map65/libm65/iqfix.f90 b/map65/libm65/iqfix.f90 new file mode 100644 index 000000000..93cace4b1 --- /dev/null +++ b/map65/libm65/iqfix.f90 @@ -0,0 +1,28 @@ +subroutine iqfix(c,nfft,gain,phase) + + complex c(0:nfft-1) + complex z,h,u,v + + nh=nfft/2 + h=gain*cmplx(cos(phase),sin(phase)) + + do i=1,nh-1 + u=c(i) + v=c(nfft-i) + x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & + (real(u) - real(v))*real(h) + y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & + (real(u) - real(v))*aimag(h) + c(i)=0.5*cmplx(x,y) + z=u + u=v + v=z + x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & + (real(u) - real(v))*real(h) + y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & + (real(u) - real(v))*aimag(h) + c(nfft-i)=0.5*cmplx(x,y) + enddo + + return +end subroutine iqfix diff --git a/map65/libm65/jt65code.f90 b/map65/libm65/jt65code.f90 new file mode 100644 index 000000000..b232fcdd6 --- /dev/null +++ b/map65/libm65/jt65code.f90 @@ -0,0 +1,47 @@ +program JT65code + +! Provides examples of message packing, bit and symbol ordering, +! Reed Solomon encoding, and other necessary details of the JT65 +! protocol. + + character*22 msg0,msg,decoded,cok*3 + integer dgen(12),sent(63),recd(12),era(51) + + nargs=iargc() + if(nargs.ne.1) then + print*,'Usage: JT65code "message"' + go to 999 + endif + + call getarg(1,msg0) !Get message from command line + msg=msg0 + + call chkmsg(msg,cok,nspecial,flip) !See if it includes "OOO" report + if(nspecial.gt.0) then !or is a shorthand message + write(*,1010) +1010 format('Shorthand message.') + go to 999 + endif + + call packmsg(msg,dgen) !Pack message into 72 bits + write(*,1020) msg0 +1020 format('Message: ',a22) !Echo input message + if(iand(dgen(10),8).ne.0) write(*,1030) !Is plain text bit set? +1030 format('Plain text.') + write(*,1040) dgen +1040 format('Packed message, 6-bit symbols: ',12i3) !Display packed symbols + + call rs_encode(dgen,sent) !RS encode + call interleave63(sent,1) !Interleave channel symbols + call graycode(sent,63,1) !Apply Gray code + write(*,1050) sent +1050 format('Channel symbols, including FEC:'/(i5,20i3)) + + call graycode(sent,63,-1) + call interleave63(sent,-1) + call rs_decode(sent,era,0,recd,nerr) + call unpackmsg(recd,decoded) !Unpack the user message + write(*,1060) decoded,cok +1060 format('Decoded message: ',a22,2x,a3) + +999 end program JT65code diff --git a/map65/libm65/k2grid.f90 b/map65/libm65/k2grid.f90 new file mode 100644 index 000000000..aa7631579 --- /dev/null +++ b/map65/libm65/k2grid.f90 @@ -0,0 +1,12 @@ +subroutine k2grid(k,grid) + character grid*6 + + nlong=2*mod((k-1)/5,90)-179 + if(k.gt.450) nlong=nlong+180 + nlat=mod(k-1,5)+ 85 + dlat=nlat + dlong=nlong + call deg2grid(dlong,dlat,grid) + + return +end subroutine k2grid diff --git a/map65/libm65/lorentzian.f90 b/map65/libm65/lorentzian.f90 new file mode 100644 index 000000000..cd2257a75 --- /dev/null +++ b/map65/libm65/lorentzian.f90 @@ -0,0 +1,102 @@ +subroutine lorentzian(y,npts,a) + +! Input: y(npts); assume x(i)=i, i=1,npts +! Output: a(5) +! a(1) = baseline +! a(2) = amplitude +! a(3) = x0 +! a(4) = width +! a(5) = chisqr + + real y(npts) + real a(5) + real deltaa(4) + + a=0. + df=12000.0/8192.0 !df = 1.465 Hz + width=0. + ipk=0 + ymax=-1.e30 + do i=1,npts + if(y(i).gt.ymax) then + ymax=y(i) + ipk=i + endif +! write(50,3001) i,i*df,y(i) +!3001 format(i6,2f12.3) + enddo +! base=(sum(y(ipk-149:ipk-50)) + sum(y(ipk+51:ipk+150)))/200.0 + base=(sum(y(1:20)) + sum(y(npts-19:npts)))/40.0 + stest=ymax - 0.5*(ymax-base) + ssum=y(ipk) + do i=1,50 + if(ipk+i.gt.npts) exit + if(y(ipk+i).lt.stest) exit + ssum=ssum + y(ipk+i) + enddo + do i=1,50 + if(ipk-i.lt.1) exit + if(y(ipk-i).lt.stest) exit + ssum=ssum + y(ipk-i) + enddo + ww=ssum/y(ipk) + width=2 + t=ww*ww - 5.67 + if(t.gt.0.0) width=sqrt(t) + a(1)=base + a(2)=ymax-base + a(3)=ipk + a(4)=width + +! Now find Lorentzian parameters + + deltaa(1)=0.1 + deltaa(2)=0.1 + deltaa(3)=1.0 + deltaa(4)=1.0 + nterms=4 + +! Start the iteration + chisqr=0. + chisqr0=1.e6 + do iter=1,5 + do j=1,nterms + chisq1=fchisq0(y,npts,a) + fn=0. + delta=deltaa(j) +10 a(j)=a(j)+delta + chisq2=fchisq0(y,npts,a) + if(chisq2.eq.chisq1) go to 10 + if(chisq2.gt.chisq1) then + delta=-delta !Reverse direction + a(j)=a(j)+delta + tmp=chisq1 + chisq1=chisq2 + chisq2=tmp + endif +20 fn=fn+1.0 + a(j)=a(j)+delta + chisq3=fchisq0(y,npts,a) + if(chisq3.lt.chisq2) then + chisq1=chisq2 + chisq2=chisq3 + go to 20 + endif + +! Find minimum of parabola defined by last three points + delta=delta*(1./(1.+(chisq1-chisq2)/(chisq3-chisq2))+0.5) + a(j)=a(j)-delta + deltaa(j)=deltaa(j)*fn/3. +! write(*,4000) iter,j,a,chisq2 +!4000 format(i1,i2,4f10.4,f11.3) + enddo + chisqr=fchisq0(y,npts,a) +! write(*,4000) 0,0,a,chisqr + if(chisqr/chisqr0.gt.0.99) exit + chisqr0=chisqr + enddo + a(5)=chisqr + + return +end subroutine lorentzian + diff --git a/map65/libm65/m65.f90 b/map65/libm65/m65.f90 new file mode 100644 index 000000000..d79ecdcd7 --- /dev/null +++ b/map65/libm65/m65.f90 @@ -0,0 +1,179 @@ +program m65 + +! Decoder for map65. Can run stand-alone, reading data from *.tf2 files; +! or as the back end of map65, with data placed in a shared memory region. + +! Fortran logical units +! +! 10 binary input data, *.tf2 files +! 11 prefixes.txt +! 12 +! 13 map65.log +! 14 +! 15 +! 16 +! 17 saved *.tf2 files +! 18 test file to be transmitted (wsjtgen.f90) +! 19 livecq.txt +! 20 +! 21 map65_rx.log +! 22 +! 23 CALL3.TXT +! 24 +! 25 +! 26 tmp26.txt + + use timer_module, only: timer + use timer_impl, only: init_timer, fini_timer + + parameter (NFFT=32768) + parameter (NSMAX=60*96000) + parameter (NREAD=2048) + integer*2 i2(NREAD) + real*8 hsym + real*4 ssz5a(NFFT) + logical*1 lstrong(0:1023) + real*8 fc0,fcenter + character*80 arg,infile + character mycall*12,hiscall*12,mygrid*6,hisgrid*6,datetime*20 + common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fc0,nutc0,junk(37) + common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & + ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & + mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & + nfast,nsave,max_drift,mycall,mygrid,hiscall,hisgrid,datetime + + nargs=iargc() + if(nargs.ne.1 .and. nargs.lt.5) then + print*,'Usage: m65 Jsub Qsub Xpol <95238|96000> file1 [file2 ...]' + print*,'Examples: m65 B A X 96000 *.tf2' + print*,' m65 C C N 96000 *.iq' + print*,'' + print*,' m65 -s' + print*,' (Gets data from MAP65, via shared memory region.)' + go to 999 + endif + call getarg(1,arg) + if(arg(1:2).eq.'-s') then + call m65a + go to 999 + endif + n=1 + if(arg(1:1).eq.'0') n=0 + if(arg(1:1).eq.'A') n=1 + if(arg(1:1).eq.'B') n=2 + if(arg(1:1).eq.'C') n=3 + + call getarg(2,arg) + m=1 + if(arg(1:1).eq.'0') m=0 + if(arg(1:1).eq.'A') m=1 + if(arg(1:1).eq.'B') m=2 + if(arg(1:1).eq.'C') m=3 + if(arg(1:1).eq.'D') m=4 + if(arg(1:1).eq.'E') m=5 + nmode=10*m + n + + call getarg(3,arg) + nxpol=0 + if(arg(1:1).eq.'X') nxpol=1 + + call getarg(4,arg) + nfsample=96000 + if(arg.eq.'95238') nfsample=95238 + + ifile1=5 + +! Some default parameters for command-line execution, in early testing. + mycall='K1JT' + mygrid='FN20QI' + hiscall='K9AN' + hisgrid='EN50' + nfa=100 !144.100 + nfb=162 !144.162 + ntol=100 + nkeep=10 !??? + mousefqso=140 !For IK4WLV in 210220_1814.tf2 + mousedf=0 + nfcal=0 + nkhz_center=125 + + if(nxpol.eq.0) then + nfa=55 !For KA1GT files + nfb=143 + mousefqso=69 !W2HRO signal + nkhz_center=100 + endif + + call ftninit('.') + call init_timer('timer.out') + call timer('m65 ',0) + + do ifile=ifile1,nargs + call getarg(ifile,infile) + open(10,file=infile,access='stream',status='old',err=998) + i1=index(infile,'.tf2') + if(i1.lt.1) i1=index(infile,'.iq') + read(infile(i1-4:i1-1),*,err=1) nutc0 + go to 2 +1 nutc0=0 +2 hsym=2048.d0*96000.d0/11025.d0 !Samples per half symbol + read(10) fcenter + newdat=1 + nhsym0=-999 + k=0 + + nch=2 + if(nxpol.eq.1) nch=4 + + do irec=1,9999999 + read(10,end=10) i2 + do i=1,NREAD,nch + k=k+1 + if(k.gt.60*96000) exit + dd(1,k)=i2(i) + dd(2,k)=i2(i+1) + if(nxpol.eq.1) then + dd(3,k)=i2(i+2) + dd(4,k)=i2(i+3) + endif + enddo + nhsym=(k-2048)/hsym + if(nhsym.ge.1 .and. nhsym.ne.nhsym0) then + ndiskdat=1 + nb=0 +! Emit signal readyForFFT + fgreen=-13.0 + iqadjust=0 + iqapply=0 + nbslider=100 + gainx=0.9962 + gainy=1.0265 + phasex=0.01426 + phasey=-0.01195 + call timer('symspec ',0) + call symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & + fgreen,iqadjust,iqapply,gainx,gainy,phasex,phasey,rejectx, & + rejecty,pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong) + call timer('symspec ',1) + nhsym0=nhsym + endif + enddo ! irec + +10 continue + if(iqadjust.ne.0) write(*,3002) rejectx,rejecty +3002 format('Image rejection:',2f7.1,' dB') + nutc=nutc0 + nstandalone=1 + call decode0(dd,ss,savg,nstandalone) + enddo ! ifile + + call timer('m65 ',1) + call timer('m65 ',101) + go to 999 + +998 print*,'Cannot open file:' + print*,infile + +999 call fini_timer() + +end program m65 diff --git a/map65/libm65/m65a.f90 b/map65/libm65/m65a.f90 new file mode 100644 index 000000000..385254442 --- /dev/null +++ b/map65/libm65/m65a.f90 @@ -0,0 +1,99 @@ +subroutine m65a + + use timer_module, only: timer + use timer_impl, only: init_timer !, limtrace + use, intrinsic :: iso_c_binding, only: C_NULL_CHAR + use FFTW3 + + interface + function address_m65() + integer*1, pointer :: address_m65 + end function address_m65 + end interface + + integer*1 attach_m65 + integer size_m65 + integer*1, pointer :: p_m65 + character*80 cwd + character wisfile*256 + logical fileExists + + call getcwd(cwd) + call ftninit(trim(cwd)) + call init_timer (trim(cwd)//'/timer.out') + + limtrace=0 + lu=12 + i1=attach_m65() + +10 inquire(file=trim(cwd)//'/.lock',exist=fileExists) + if(fileExists) then + call sleep_msec(100) + go to 10 + endif + + inquire(file=trim(cwd)//'/.quit',exist=fileExists) + if(fileExists) then + call timer('decode0 ',101) + i=detach_m65() + ! Save FFTW wisdom and free memory + wisfile=trim(cwd)//'/m65_wisdom.dat'// C_NULL_CHAR + if(len(trim(wisfile)).gt.0) iret=fftwf_export_wisdom_to_filename(wisfile) + call four2a(a,-1,1,1,1) + call filbig(a,-1,1,0.0,0,0,0,0,0) !used for FFT plans + call fftwf_cleanup_threads() + call fftwf_cleanup() + go to 999 + endif + + nbytes=size_m65() + if(nbytes.le.0) then + print*,'m65a: Shared memory mem_m65 does not exist.' + print*,'Program m65a should be started automatically from within map65.' + go to 999 + endif + p_m65=>address_m65() + call m65b(p_m65,nbytes) + call sleep_msec(500) ! wait for .lock to be recreated + go to 10 + +999 return +end subroutine m65a + +subroutine m65b(m65com,nbytes) + integer*1 m65com(0:nbytes-1) + kss=4*4*60*96000 + ksavg=kss+4*4*322*32768 + kfcenter=ksavg+4*4*32768 + call m65c(m65com(0),m65com(kss),m65com(ksavg),m65com(kfcenter)) + return +end subroutine m65b + +subroutine m65c(dd,ss,savg,nparams0) + real*4 dd(4,5760000),ss(4,322,32768),savg(4,32768) + real*8 fcenter + integer nparams0(40),nparams(40) + character*12 mycall,hiscall + character*6 mygrid,hisgrid + character*20 datetime + common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & + ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & + mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & + nfast,nsave,max_drift,mycall,mygrid,hiscall,hisgrid,datetime + equivalence (nparams,fcenter) + + nparams=nparams0 !Copy parameters into common/npar/ + npatience=1 + if(iand(nrxlog,1).ne.0) then + write(21,1000) datetime(:17) +1000 format(/'UTC Date: 'a17/78('-')) + flush(21) + endif + if(iand(nrxlog,2).ne.0) rewind 21 + if(iand(nrxlog,4).ne.0) rewind 26 + + nstandalone=0 + if(sum(nparams).ne.0) call decode0(dd,ss,savg,nstandalone) + + return +end subroutine m65c diff --git a/map65/libm65/map65a.f90 b/map65/libm65/map65a.f90 new file mode 100644 index 000000000..091d270d4 --- /dev/null +++ b/map65/libm65/map65a.f90 @@ -0,0 +1,549 @@ +subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & + mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & + nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & + neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample,nxpol,nmode) + +! Processes timf2 data from Linrad to find and decode JT65 signals. + + use wideband_sync + use timer_module, only: timer + + parameter (MAXMSG=1000) !Size of decoded message list + parameter (NSMAX=60*96000) + real dd(4,NSMAX) + real*4 ss(4,322,NFFT),savg(4,NFFT) + real tavg(-50:50) !Temp for finding local base level + real base(4) !Local basel level at 4 pol'ns + real sig(MAXMSG,30) !Parameters of detected signals + real a(5) + real*8 fcenter + character*22 msg(MAXMSG) + character*3 shmsg0(4) + character mycall*12,hiscall*12,mygrid*6,hisgrid*6,grid*6,cp*1,cm*1 + integer indx(MAXMSG),nsiz(MAXMSG) + logical done(MAXMSG) + logical xpol,bq65,q65b_called + logical candec(MAX_CANDIDATES) + character decoded*22,blank*22,cmode*2 + real short(3,NFFT) !SNR dt ipol for potential shorthands + real qphi(12) + type(candidate) :: cand(MAX_CANDIDATES) + + common/c3com/ mcall3a + common/testcom/ifreq + + data blank/' '/,cm/'#'/ + data shmsg0/'ATT','RO ','RRR','73 '/ + data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/,mousefqso0/-999/ + save + + nkhz_center=nint(1000.0*(fcenter-int(fcenter))) + mfa=nfa-nkhz_center+48 + mfb=nfb-nkhz_center+48 + mode65=mod(nmode,10) + if(mode65.eq.3) mode65=4 + mode_q65=nmode/10 + + nts_jt65=2**(mode65-1) !JT65 tone separation factor + nts_q65=2**(mode_q65) !Q65 tone separation factor + if(nagain.eq.0) then + call timer('get_cand',0) + call get_candidates(ss,savg,mfa,mfb,nts_jt65,nts_q65,cand,ncand) + call timer('get_cand',1) + candec=.false. + endif +!### +! do k=1,ncand +! freq=cand(k)%f+nkhz_center-48.0-1.27046 +! write(70,3010) nutc,k,cand(k)%snr,cand(k)%f,freq,cand(k)%xdt, & +! cand(k)%ipol,cand(k)%iflip +!3010 format(i4.4,i5,f10.1,3f10.3,2i3) +! enddo +!### + + nwrite_q65=0 + bq65=mode_q65.gt.0 + + mcall3a=mcall3b + mousefqso0=mousefqso + xpol=(nxpol.ne.0) + if(.not.xpol) ndphi=0 + nsum=0 + +!### Should use AppDir! ### + open(23,file='CALL3.TXT',status='unknown') + + df=96000.0/NFFT !df = 96000/NFFT = 2.930 Hz + if(nfsample.eq.95238) df=95238.1/NFFT + ftol=0.010 !Frequency tolerance (kHz) + dphi=idphi/57.2957795 + foffset=0.001*(1270 + nfcal) !Offset from sync tone, plus CAL + fqso=mousefqso + foffset - 0.5*(nfa+nfb) + nfshift !fqso at baseband (khz) + iloop=0 + +2 if(ndphi.eq.1) dphi=30*iloop/57.2957795 + + if(nutc.ne.nutc0) nfile=nfile+1 + nutc0=nutc + + do nqd=1,0,-1 + if(nqd.eq.1) then !Quick decode, at fQSO + fa=1000.0*(fqso+0.001*mousedf) - ntol + fb=1000.0*(fqso+0.001*mousedf) + ntol + 4*53.8330078 + else !Wideband decode at all freqs + fa=-1000*0.5*(nfb-nfa) + 1000*nfshift + fb= 1000*0.5*(nfb-nfa) + 1000*nfshift + endif + ia=nint(fa/df) + 16385 + ib=nint(fb/df) + 16385 + ia=max(51,ia) + ib=min(32768-51,ib) + + km=0 + nkm=1 + nz=n/8 + freq0=-999. + sync10=-999. + fshort0=-999. + syncshort0=-999. + ntry=0 + short=0. !Zero the whole short array + jpz=1 + if(xpol) jpz=4 + + do i=ia,ib !Search over freq range + freq=0.001*(i-16385)*df +! Find the local base level for each polarization; update every 10 bins. + if(mod(i-ia,10).eq.0) then + do jp=1,jpz + do ii=-50,50 + iii=i+ii + if(iii.ge.1 .and. iii.le.32768) then + tavg(ii)=savg(jp,iii) + else + write(13,*) 'Error in iii:',iii,ia,ib,fa,fb + flush(13) + go to 900 + endif + enddo + call pctile(tavg,101,50,base(jp)) + enddo + endif + +! Find max signal at this frequency + smax=0. + do jp=1,jpz + if(savg(jp,i)/base(jp).gt.smax) then + smax=savg(jp,i)/base(jp) + jpmax=jp + endif + enddo + + if(smax.gt.1.1 .or. ia.eq.ib) then +! Look for JT65 sync patterns and shorthand square-wave patterns. + call timer('ccf65 ',0) + ! ssmax=smax + ssmax=1.e30 + call ccf65(ss(1,1,i),nhsym,ssmax,sync1,ipol,jpz,dt, & + flipk,syncshort,snr2,ipol2,dt2) + if(dt.lt.-2.6 .or. dt.gt.2.5) sync1=-99.0 !### + call timer('ccf65 ',1) + if(mode65.eq.0) syncshort=-99.0 !If "No JT65", don't waste time + +! ########################### Search for Shorthand Messages ################# +! Is there a shorthand tone above threshold? + thresh0=1.0 +! Use lower thresh0 at fQSO + if(nqd.eq.1 .and. ntol.le.100) thresh0=0. + if(syncshort.gt.thresh0) then +! ### Do shorthand AFC here (or maybe after finding a pair?) ### + short(1,i)=syncshort + short(2,i)=dt2 + short(3,i)=ipol2 + +! Check to see if lower tone of shorthand pair was found. + do j=2,4 + i0=i-nint(j*mode65*10.0*(11025.0/4096.0)/df) +! Should this be i0 +/- 1, or just i0? +! Should we also insist that difference in DT be either 1.5 or -1.5 s? + if(short(1,i0).gt.thresh0) then + fshort=0.001*(i0-16385)*df + noffset=0 + if(nqd.eq.1) noffset=nint(1000.0*(fshort-fqso)-mousedf) + if(abs(noffset).le.ntol) then +! Keep only the best candidate within ftol. +!### NB: sync2 was not defined here! +! sync2=syncshort !### try this ??? + if(fshort-fshort0.le.ftol .and. & + syncshort.gt.syncshort0 .and. nkm.eq.2) km=km-1 + if(fshort-fshort0.gt.ftol .or. & + syncshort.gt.syncshort0) then + if(km.lt.MAXMSG) km=km+1 + sig(km,1)=nfile + sig(km,2)=nutc + sig(km,3)=fshort + 0.5*(nfa+nfb) + sig(km,4)=syncshort + sig(km,5)=dt2 + sig(km,6)=45*(ipol2-1)/57.2957795 + sig(km,7)=0 + sig(km,8)=snr2 + sig(km,9)=0 + sig(km,10)=0 +! sig(km,11)=rms0 + sig(km,12)=savg(ipol2,i) + sig(km,13)=0 + sig(km,14)=0 + sig(km,15)=0 + sig(km,16)=0 +! sig(km,17)=0 + sig(km,18)=0 + msg(km)=shmsg0(j) + fshort0=fshort + syncshort0=syncshort + nkm=2 + endif + endif + endif + enddo + endif + +! ########################### Search for Normal Messages ########### +! Is sync1 above threshold? + thresh1=1.0 +! Use lower thresh1 at fQSO + if(nqd.eq.1 .and. ntol.le.100) thresh1=0. + noffset=0 + if(nqd.ge.1) noffset=nint(1000.0*(freq-fqso)-mousedf) + if(newdat.eq.1 .and. sync1.gt.-99.0) then + sync1=thresh1+1.0 + noffset=0 + endif + if(sync1.gt.thresh1 .and. abs(noffset).le.ntol) then +! Keep only the best candidate within ftol. +! (Am I deleting any good decodes by doing this?) + if(freq-freq0.le.ftol .and. sync1.gt.sync10 .and. & + nkm.eq.1) km=km-1 + if(freq-freq0.gt.ftol .or. sync1.gt.sync10) then + nflip=nint(flipk) + f00=(i-1)*df !Freq of detected sync tone (0-96000 Hz) + ntry=ntry+1 + if((nqd.eq.1 .and. ntry.ge.40) .or. & + (nqd.eq.0 .and. ntry.ge.400)) then +! Too many calls to decode1a! + write(*,*) '! Signal too strong, or suspect data? Decoding aborted.' + write(13,*) 'Signal too strong, or suspect data? Decoding aborted.' + call flush(13) + go to 900 + endif + + call timer('decode1a',0) + ifreq=i + ikhz=nint(freq+0.5*(nfa+nfb)-foffset)-nfshift + idf=nint(1000.0*(freq+0.5*(nfa+nfb)-foffset-(ikHz+nfshift))) + call decode1a(dd,newdat,f00,nflip,mode65,nfsample, & + xpol,mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi, & + ndphi,nutc,ikHz,idf,ipol,ntol,sync2, & + a,dt,pol,nkv,nhist,nsum,nsave,qual,decoded) + call timer('decode1a',1) + +! The case sync1=2.0 is just to make sure decode1a is called and bigfft done. + if(mode65.ne.0 .and. sync1.ne.2.000000) then + if(km.lt.MAXMSG) km=km+1 + sig(km,1)=nfile + sig(km,2)=nutc + sig(km,3)=freq + 0.5*(nfa+nfb) + sig(km,4)=sync1 + sig(km,5)=dt + sig(km,6)=pol + sig(km,7)=flipk + sig(km,8)=sync2 + sig(km,9)=nkv + sig(km,10)=qual +! sig(km,11)=idphi + sig(km,12)=savg(ipol,i) + sig(km,13)=a(1) + sig(km,14)=a(2) + sig(km,15)=a(3) + sig(km,16)=a(4) +! sig(km,17)=a(5) + sig(km,18)=nhist + msg(km)=decoded + freq0=freq + sync10=sync1 + nkm=1 + endif + endif + endif + endif + enddo !i=ia,ib + + if(nqd.eq.1) then + nwrite=0 + do k=1,km + decoded=msg(k) + if(decoded.ne.' ') then + nutc=sig(k,2) + freq=sig(k,3) + sync1=sig(k,4) + dt=sig(k,5) + npol=nint(57.2957795*sig(k,6)) + flip=sig(k,7) + sync2=sig(k,8) + nkv=sig(k,9) + nqual=sig(k,10) +! idphi=nint(sig(k,11)) + if(flip.lt.0.0) then + do i=22,1,-1 + if(decoded(i:i).ne.' ') go to 8 + enddo + stop 'Error in message format' +8 if(i.le.18) decoded(i+2:i+4)='OOO' + endif + nkHz=nint(freq-foffset)-nfshift + mhz=fcenter ! ... +fadd ??? + f0=mhz+0.001*nkHz + ndf=nint(1000.0*(freq-foffset-(nkHz+nfshift))) + nsync1=sync1 + + s2db=10.0*log10(sync2) - 40 !### empirical ### + nsync2=nint(s2db) + if(decoded(1:4).eq.'RO ' .or. decoded(1:4).eq.'RRR ' .or. & + decoded(1:4).eq.'73 ') then + nsync2=nint(1.33*s2db + 2.0) + endif + + nwrite=nwrite+1 + if(nxant.ne.0) then + npol=npol-45 + if(npol.lt.0) npol=npol+180 + endif + +! If Tx station's grid is in decoded message, compute optimum TxPol + i1=index(decoded,' ') + i2=index(decoded(i1+1:),' ') + i1 + grid=' ' + if(i2.ge.8 .and. i2.le.18) grid=decoded(i2+1:i2+4)//'mm' + ntxpol=0 + cp=' ' + if(xpol) then + if(grid(1:1).ge.'A' .and. grid(1:1).le.'R' .and. & + grid(2:2).ge.'A' .and. grid(2:2).le.'R' .and. & + grid(3:3).ge.'0' .and. grid(3:3).le.'9' .and. & + grid(4:4).ge.'0' .and. grid(4:4).le.'9') then + ntxpol=mod(npol-nint(2.0*dpol(mygrid,grid))+720,180) + if(nxant.eq.0) then + cp='H' + if(ntxpol.gt.45 .and. ntxpol.le.135) cp='V' + else + cp='/' + if(ntxpol.ge.90 .and. ntxpol.lt.180) cp='\' + endif + endif + endif + + if(ndphi.eq.0) then + write(*,1010) nkHz,ndf,npol,nutc,dt,nsync2, & + cm,decoded,nkv,nqual,ntxpol,cp +1010 format('!',i3,i5,i4,i6.4,f5.1,i5,1x,a1,1x,a22,i2,i5,i5,1x,a1) + else + if(iloop.ge.1) qphi(iloop)=sig(k,10) + write(*,1010) nkHz,ndf,npol,nutc,dt,nsync2, & + cm,decoded,nkv,nqual,30*iloop + write(27,1011) 30*iloop,nkHz,ndf,npol,nutc, & + dt,sync2,nkv,nqual,cm,decoded +1011 format(i3,i4,i5,i4,i6.4,1x,f5.1,f7.1,i3,i5,a1,1x,a22) + endif + endif + enddo ! k=1,km + + if(bq65) then + q65b_called=.false. + do icand=1,ncand + if(cand(icand)%iflip.ne.0) cycle !Keep only Q65 candidates + freq=cand(icand)%f+nkhz_center-48.0-1.27046 + nhzdiff=nint(1000.0*(freq-mousefqso)-mousedf) - nfcal +! Now looking for "quick decode" (nqd=1) candidates at cursor freq +/- ntol. + if(nqd.eq.1 .and. abs(nhzdiff).gt.ntol) cycle + ikhz=mousefqso + q65b_called=.true. + f0=cand(icand)%f + call timer('q65b ',0) + call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & + xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & + nagain,max_drift,idec) + call timer('q65b ',1) + if(idec.ge.0) candec(icand)=.true. + enddo + if(.not.q65b_called) then + freq=mousefqso + 0.001*mousedf + ikhz=mousefqso + f0=freq - (nkhz_center-48.0-1.27046) !### ??? ### + call timer('q65b ',0) + call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & + xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & + nagain,max_drift,idec) + call timer('q65b ',1) + endif + endif + + if(nwrite.eq.0 .and. nwrite_q65.eq.0) then + write(*,1012) mousefqso,nutc +1012 format('!',i3,9x,i6.4,' ') + endif + endif !nqd.eq.1 + + if(ndphi.eq.1 .and.iloop.lt.12) then + iloop=iloop+1 + go to 2 + endif + + if(ndphi.eq.1 .and.iloop.eq.12) call getdphi(qphi) + if(nqd.eq.1) then + write(*,1013) nsum,nsave +1013 format('',2i4) + flush(6) + endif + if(nqd.eq.1 .and. nagain.eq.1) go to 900 + + if(nqd.eq.0 .and. bq65) then +! Do the wideband Q65 decode + do icand=1,ncand + if(cand(icand)%iflip.ne.0) cycle !Do only Q65 candidates here + if(candec(icand)) cycle !Skip if already decoded + freq=cand(icand)%f+nkhz_center-48.0-1.27046 +! If here at nqd=1, do only candidates at mousefqso +/- ntol + if(nqd.eq.1 .and. abs(freq-mousefqso).gt.0.001*ntol) cycle + ikhz=nint(freq) + f0=cand(icand)%f + call timer('q65b ',0) + call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & + xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & + nagain,max_drift,idec) + call timer('q65b ',1) + if(idec.ge.0) candec(icand)=.true. + enddo ! icand + endif + + enddo ! nqd + +! Trim the list and produce a sorted index and sizes of groups. +! (Should trimlist remove all but best SNR for given UTC and message content?) + call trimlist(sig,km,ftol,indx,nsiz,nz) + + do i=1,km + done(i)=.false. + enddo + j=0 + ilatest=-1 + do n=1,nz + ifile0=0 + do m=1,nsiz(n) + i=indx(j+m) + ifile=sig(i,1) + if(ifile.gt.ifile0 .and.msg(i).ne.blank) then + ilatest=i + ifile0=ifile + endif + enddo + i=ilatest + + if(i.ge.1) then + if(.not.done(i)) then + done(i)=.true. + nutc=sig(i,2) + freq=sig(i,3) + sync1=sig(i,4) + dt=sig(i,5) + npol=nint(57.2957795*sig(i,6)) + flip=sig(i,7) + sync2=sig(i,8) + nkv=sig(i,9) + nqual=min(sig(i,10),10.0) +! rms0=sig(i,11) + do k=1,5 + a(k)=sig(i,12+k) + enddo + nhist=sig(i,18) + decoded=msg(i) + + if(flip.lt.0.0) then + do i=22,1,-1 + if(decoded(i:i).ne.' ') go to 10 + enddo + stop 'Error in message format' +10 if(i.le.18) decoded(i+2:i+4)='OOO' + endif + mhz=fcenter !... +fadd ??? + nkHz=nint(freq-foffset)-nfshift + f0=mhz+0.001*nkHz + ndf=nint(1000.0*(freq-foffset-(nkHz+nfshift))) + ndf0=nint(a(1)) + ndf1=nint(a(2)) + ndf2=nint(a(3)) + nsync1=sync1 + + s2db=10.0*log10(sync2) - 40 !### empirical ### + nsync2=nint(s2db) + if(decoded(1:4).eq.'RO ' .or. decoded(1:4).eq.'RRR ' .or. & + decoded(1:4).eq.'73 ') then + nsync2=nint(1.33*s2db + 2.0) + endif + + if(nxant.ne.0) then + npol=npol-45 + if(npol.lt.0) npol=npol+180 + endif + +! If Tx station's grid is in decoded message, compute optimum TxPol + i1=index(decoded,' ') + i2=index(decoded(i1+1:),' ') + i1 + grid=' ' + if(i2.ge.8 .and. i2.le.18) grid=decoded(i2+1:i2+4)//'mm' + ntxpol=0 + cp=' ' + if(xpol) then + if(grid(1:1).ge.'A' .and. grid(1:1).le.'R' .and. & + grid(2:2).ge.'A' .and. grid(2:2).le.'R' .and. & + grid(3:3).ge.'0' .and. grid(3:3).le.'9' .and. & + grid(4:4).ge.'0' .and. grid(4:4).le.'9') then + ntxpol=mod(npol-nint(2.0*dpol(mygrid,grid))+720,180) + if(nxant.eq.0) then + cp='H' + if(ntxpol.gt.45 .and. ntxpol.le.135) cp='V' + else + cp='/' + if(ntxpol.ge.90 .and. ntxpol.lt.180) cp='\' + endif + endif + endif + cmode='#A' + if(mode65.eq.2) cmode='#B' + if(mode65.eq.4) cmode='#C' + write(26,1014) f0,ndf,ndf0,ndf1,ndf2,dt,npol,nsync1, & + nsync2,nutc,decoded,cp,cmode +1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,2x,a1,3x,a2) + write(21,1016) f0,ndf,dt,npol,nsync2,nutc,decoded,cp, & + cmode(1:1),cmode(2:2) +1016 format(f8.3,i5,f5.1,2i4,i5.4,2x,a22,2x,a1,3x,a1,1x,a1) + +! write(21,1014) f0,ndf,ndf0,ndf1,ndf2,dt,npol,nsync1, & +! nutc,decoded,cp,cmode + + endif + endif + j=j+nsiz(n) + enddo !i=1,km + + write(26,1015) nutc +1015 format(37x,i6.4,' ') + call flush(21) + call flush(26) + call display(nkeep,ftol) + ndecdone=2 + +900 close(23) + ndphi=0 + mcall3b=mcall3a + + return +end subroutine map65a diff --git a/map65/libm65/mapsim.f90 b/map65/libm65/mapsim.f90 new file mode 100644 index 000000000..f47708322 --- /dev/null +++ b/map65/libm65/mapsim.f90 @@ -0,0 +1,228 @@ +program mapsim + +! Generate simulated data for testing of MAP65 + + parameter (NMAX=60*96000) + real*4 d4(4,NMAX) !Floating-point data + integer*2 id4(4,NMAX) !i*2 data, dual polarization + integer*2 id2(2,NMAX) !i*2 data, single polarization + complex cwave(NMAX) !Generated complex waveform (no noise) + complex z,zx,zy + real*8 fcenter,fsample,samfac,f,dt,twopi,phi,dphi + logical bq65 + character msg0*22,message*22,msgsent*22,arg*8,fname*11,mode*2 + character*16 msg_list(60) + data ilist/0/,msg_list/ & + 'W1AAA K2BBB EM00','W2CCC K3DDD EM01','W3EEE K4FFF EM02', & + 'W5GGG K6HHH EM03','W7III K8JJJ EM04','W9KKK K0LLL EM05', & + 'G0MMM F1NNN JN06','G2OOO F3PPP JN07','G4QQQ F5RRR JN08', & + 'G6SSS F7TTT JN09','W1XAA K2XBB EM10','W2XCC K3XDD EM11', & + 'W3XEE K4XFF EM12','W5XGG K6XHH EM13','W7XII K8XJJ EM14', & + 'W9XKK K0XLL EM15','G0XMM F1XNN JN16','G2XOO F3XPP JN17', & + 'G4XQQ F5XRR JN18','G6XSS F7XTT JN19','W1YAA K2YBB EM20', & + 'W2YCC K3YDD EM21','W3YEE K4YFF EM22','W5YGG K6YHH EM23', & + 'W7YII K8YJJ EM24','W9YKK K0YLL EM25','G0YMM F1YNN JN26', & + 'G2YOO F3YPP JN27','G4YQQ F5YRR JN28','G6YSS F7YTT JN29', & + 'W1ZAA K2ZBB EM30','W2ZCC K3ZDD EM31','W3ZEE K4ZFF EM32', & + 'W5ZGG K6ZHH EM33','W7ZII K8ZJJ EM34','W9ZKK K0ZLL EM35', & + 'G0ZMM F1ZNN JN36','G2ZOO F3ZPP JN37','G4ZQQ F5ZRR JN38', & + 'G6ZSS F7ZTT JN39','W1AXA K2BXB EM40','W2CXC K3DXD EM41', & + 'W3EXE K4FXF EM42','W5GXG K6HXH EM43','W7IXI K8JXJ EM44', & + 'W9KXK K0LXL EM45','G0MXM F1NXN JN46','G2OXO F3PXP JN47', & + 'G4QXQ F5RXR JN48','G6SXS F7TXT JN49','W1AYA K2BYB EM50', & + 'W2CYC K3DYD EM51','W3EYE K4FYF EM52','W5GYG K6HYH EM53', & + 'W7IYI K8JYJ EM54','W9KYK K0LYL EM55','G0MYM F1NYN JN56', & + 'G2OYO F3PYP JN57','G4QYQ F5RYR JN58','G6SYS F7TYT JN59'/ + + nargs=iargc() + if(nargs.ne.10) then + print*,'Usage: mapsim "message" mode DT fa fb nsigs pol fDop SNR nfiles' + print*,'Example: mapsim "CQ K1ABC FN42" B 2.5 -20 20 21 45 0.0 -20 1' + print*,' ' + print*,' mode = A B C for JT65; QA-QE for Q65-60A' + print*,' fa = lowest freq in kHz, relative to center' + print*,' fb = highest freq in kHz, relative to center' + print*,' message = "list" to use callsigns from list' + print*,' pol = -1 to generate a range of polarization angles.' + print*,' SNR = 0 to generate a range of SNRs.' + go to 999 + endif + + call getarg(1,msg0) + call getarg(2,mode) !JT65 sub-mode (A B C QA-QE) + call getarg(3,arg) + read(arg,*) dt0 !Time delay + call getarg(4,arg) + read(arg,*) fa !Lowest freq (kHz, relative to fcenter) + call getarg(5,arg) + read(arg,*) fb !Highest freq + call getarg(6,arg) + read(arg,*) nsigs !Number of signals in each file + call getarg(7,arg) + read(arg,*) npol !Polarization in degrees + pol=npol + call getarg(8,arg) + read(arg,*) fdop !Doppler spread + call getarg(9,arg) + read(arg,*) snrdb !S/N + call getarg(10,arg) + read(arg,*) nfiles !Number of files + + message=msg0 !Transmitted message + rmsdb=25. + rms=10.0**(0.05*rmsdb) + fcenter=144.125d0 !Center frequency (MHz) + fsample=96000.d0 !Sample rate (Hz) + dt=1.d0/fsample !Sample interval (s) + twopi=8.d0*atan(1.d0) + rad=360.0/twopi + samfac=1.d0 + bq65=(mode(1:1).eq.'Q') + ntone_spacing=1 + ntxfreq=1270 + fac=1.0/32767.0 + if(mode(1:1).eq.'B' .or. mode(2:2).eq.'B') ntone_spacing=2 + if(mode(1:1).eq.'C' .or. mode(2:2).eq.'C') ntone_spacing=4 + if(mode(2:2).eq.'D') ntone_spacing=8 + if(mode(2:2).eq.'E') ntone_spacing=16 + npts=NMAX + + write(*,1000) +1000 format('File N Mode DT freq pol fDop SNR Message'/68('-')) + + do ifile=1,nfiles + nmin=ifile-1 + if(mode(2:2).eq.' ') nmin=2*nmin + write(fname,1002) nmin !Create the output filenames +1002 format('000000_',i4.4) + open(10,file=fname//'.iq',access='stream',status='unknown') + open(11,file=fname//'.tf2',access='stream',status='unknown') + + call noisegen(d4,npts) !Generate Gaussuian noise + + if(msg0(1:4).ne.'list') then + if(bq65) then + call gen_q65_cwave(message,ntxfreq,ntone_spacing,msgsent, & + cwave,nwave) + else + call cgen65(message,ntone_spacing,samfac,nsendingsh,msgsent, & + cwave,nwave) + endif + endif + + if(fdop.gt.0.0) call dopspread(cwave,fdop) + + do isig=1,nsigs + + if(msg0(1:4).eq.'list') then + ilist=ilist+1 + message=msg_list(ilist) + if(bq65) then + call gen_q65_cwave(message,ntxfreq,ntone_spacing,msgsent, & + cwave,nwave) + else + call cgen65(message,ntone_spacing,samfac,nsendingsh,msgsent, & + cwave,nwave) + endif + endif + + if(npol.lt.0) pol=(isig-1)*180.0/nsigs + a=cos(pol/rad) + b=sin(pol/rad) + f=1000.0*(fa+fb)/2.0 + if(nsigs.gt.1) f=1000.0*(fa + (isig-1)*(fb-fa)/(nsigs-1.0)) + dphi=twopi*f*dt + 0.5*twopi + + snrdbx=snrdb + if(snrdb.ge.-1.0) snrdbx=-15.0 - 15.0*(isig-1.0)/nsigs + sig=sqrt(2.2*2500.0/96000.0) * 10.0**(0.05*snrdbx) + write(*,1020) ifile,isig,mode,dt0,0.001*f,nint(pol),fDop,snrdbx,msgsent +1020 format(i3,i3,2x,a2,f6.2,f8.3,i5,2f7.1,2x,a22) + + phi=0. +! i0=fsample*(3.5d0+0.05d0*(isig-1)) + i0=fsample*(1.d0 + dt0) + do i=1,nwave + phi=phi + dphi + if(phi.lt.-twopi) phi=phi+twopi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + z=sig*cwave(i)*cmplx(cos(xphi),-sin(xphi)) + zx=a*z + zy=b*z + j=i+i0 + d4(1,j)=d4(1,j) + real(zx) + d4(2,j)=d4(2,j) + aimag(zx) + d4(3,j)=d4(3,j) + real(zy) + d4(4,j)=d4(4,j) + aimag(zy) + enddo + enddo + + do i=1,npts + id4(1,i)=nint(rms*d4(1,i)) + id4(2,i)=nint(rms*d4(2,i)) + id4(3,i)=nint(rms*d4(3,i)) + id4(4,i)=nint(rms*d4(4,i)) + id2(1,i)=id4(1,i) + id2(2,i)=id4(2,i) + enddo + + write(10) fcenter,id2(1:2,1:npts) + write(11) fcenter,id4(1:4,1:npts) + close(10) + close(11) + enddo + +999 end program mapsim + +subroutine dopspread(cwave,fspread) + + parameter (NMAX=60*96000) + parameter (NFFT=NMAX,NH=NFFT/2) + complex cwave(NMAX) + complex cspread(0:NMAX-1) + + twopi=8.0*atan(1.0) + df=96000.0/nfft + cspread(0)=1.0 + cspread(NH)=0. + b=6.0 !Use truncated Lorenzian shape for fspread + do i=1,NH + f=i*df + x=b*f/fspread + z=0. + a=0. + if(x.lt.3.0) then !Cutoff beyond x=3 + a=sqrt(1.111/(1.0+x*x)-0.1) !Lorentzian amplitude + phi1=twopi*rran() !Random phase + z=a*cmplx(cos(phi1),sin(phi1)) + endif + cspread(i)=z + z=0. + if(x.lt.3.0) then !Same thing for negative freqs + phi2=twopi*rran() + z=a*cmplx(cos(phi2),sin(phi2)) + endif + cspread(nfft-i)=z + enddo + + call four2a(cspread,nfft,1,1,1) !Transform to time domain + + sum=0. + do i=0,nfft-1 + p=real(cspread(i))**2 + aimag(cspread(i))**2 + sum=sum+p + enddo + avep=sum/nfft + fac=sqrt(1.0/avep) + cspread=fac*cspread !Normalize to constant avg power + cwave=cspread*cwave !Apply Rayleigh fading + +! do i=0,nfft-1 +! p=real(cspread(i))**2 + aimag(cspread(i))**2 +! write(14,3010) i,p,cspread(i) +!3010 format(i8,3f12.6) +! enddo + + return +end subroutine dopspread diff --git a/map65/libm65/moon2.f90 b/map65/libm65/moon2.f90 new file mode 100644 index 000000000..9fa72f1df --- /dev/null +++ b/map65/libm65/moon2.f90 @@ -0,0 +1,163 @@ +subroutine moon2(y,m,Day,UT,lon,lat,RA,Dec,topRA,topDec,LST,HA,Az,El,dist) + + implicit none + + integer y !Year + integer m !Month + integer Day !Day + real*8 UT !UTC in hours + real*8 RA,Dec !RA and Dec of moon + +! NB: Double caps are single caps in the writeup. + + real*8 NN !Longitude of ascending node + real*8 i !Inclination to the ecliptic + real*8 w !Argument of perigee + real*8 a !Semi-major axis + real*8 e !Eccentricity + real*8 MM !Mean anomaly + + real*8 v !True anomaly + real*8 EE !Eccentric anomaly + real*8 ecl !Obliquity of the ecliptic + + real*8 d !Ephemeris time argument in days + real*8 r !Distance to sun, AU + real*8 xv,yv !x and y coords in ecliptic + real*8 lonecl,latecl !Ecliptic long and lat of moon + real*8 xg,yg,zg !Ecliptic rectangular coords + real*8 Ms !Mean anomaly of sun + real*8 ws !Argument of perihelion of sun + real*8 Ls !Mean longitude of sun (Ns=0) + real*8 Lm !Mean longitude of moon + real*8 DD !Mean elongation of moon + real*8 FF !Argument of latitude for moon + real*8 xe,ye,ze !Equatorial geocentric coords of moon + real*8 mpar !Parallax of moon (r_E / d) + real*8 lat,lon !Station coordinates on earth + real*8 gclat !Geocentric latitude + real*8 rho !Earth radius factor + real*8 GMST0,LST,HA + real*8 g + real*8 topRA,topDec !Topocentric coordinates of Moon + real*8 Az,El + real*8 dist + + real*8 rad,twopi,pi,pio2 + data rad/57.2957795131d0/,twopi/6.283185307d0/ + + d=367*y - 7*(y+(m+9)/12)/4 + 275*m/9 + Day - 730530 + UT/24.d0 + ecl = 23.4393d0 - 3.563d-7 * d + +! Orbital elements for Moon: + NN = 125.1228d0 - 0.0529538083d0 * d + i = 5.1454d0 + w = mod(318.0634d0 + 0.1643573223d0 * d + 360000.d0,360.d0) + a = 60.2666d0 + e = 0.054900d0 + MM = mod(115.3654d0 + 13.0649929509d0 * d + 360000.d0,360.d0) + + EE = MM + e*rad*sin(MM/rad) * (1.d0 + e*cos(MM/rad)) + EE = EE - (EE - e*rad*sin(EE/rad)-MM) / (1.d0 - e*cos(EE/rad)) + EE = EE - (EE - e*rad*sin(EE/rad)-MM) / (1.d0 - e*cos(EE/rad)) + + xv = a * (cos(EE/rad) - e) + yv = a * (sqrt(1.d0-e*e) * sin(EE/rad)) + + v = mod(rad*atan2(yv,xv)+720.d0,360.d0) + r = sqrt(xv*xv + yv*yv) + +! Get geocentric position in ecliptic rectangular coordinates: + + xg = r * (cos(NN/rad)*cos((v+w)/rad)-sin(NN/rad)*sin((v+w)/rad)*cos(i/rad)) + yg = r * (sin(NN/rad)*cos((v+w)/rad)+cos(NN/rad)*sin((v+w)/rad)*cos(i/rad)) + zg = r * (sin((v+w)/rad)*sin(i/rad)) + +! Ecliptic longitude and latitude of moon: + lonecl = mod(rad*atan2(yg/rad,xg/rad)+720.d0,360.d0) + latecl = rad*atan2(zg/rad,sqrt(xg*xg + yg*yg)/rad) + +! Now include orbital perturbations: + Ms = mod(356.0470d0 + 0.9856002585d0 * d + 3600000.d0,360.d0) + ws = 282.9404d0 + 4.70935d-5*d + Ls = mod(Ms + ws + 720.d0,360.d0) + Lm = mod(MM + w + NN+720.d0,360.d0) + DD = mod(Lm - Ls + 360.d0,360.d0) + FF = mod(Lm - NN + 360.d0,360.d0) + + lonecl = lonecl & + - 1.274d0 * sin((MM-2.d0*DD)/rad) & + + 0.658d0 * sin(2.d0*DD/rad) & + - 0.186d0 * sin(Ms/rad) & + - 0.059d0 * sin((2.d0*MM-2.d0*DD)/rad) & + - 0.057d0 * sin((MM-2.d0*DD+Ms)/rad) & + + 0.053d0 * sin((MM+2.d0*DD)/rad) & + + 0.046d0 * sin((2.d0*DD-Ms)/rad) & + + 0.041d0 * sin((MM-Ms)/rad) & + - 0.035d0 * sin(DD/rad) & + - 0.031d0 * sin((MM+Ms)/rad) & + - 0.015d0 * sin((2.d0*FF-2.d0*DD)/rad) & + + 0.011d0 * sin((MM-4.d0*DD)/rad) + + latecl = latecl & + - 0.173d0 * sin((FF-2.d0*DD)/rad) & + - 0.055d0 * sin((MM-FF-2.d0*DD)/rad) & + - 0.046d0 * sin((MM+FF-2.d0*DD)/rad) & + + 0.033d0 * sin((FF+2.d0*DD)/rad) & + + 0.017d0 * sin((2.d0*MM+FF)/rad) + + r = 60.36298d0 & + - 3.27746d0*cos(MM/rad) & + - 0.57994d0*cos((MM-2.d0*DD)/rad) & + - 0.46357d0*cos(2.d0*DD/rad) & + - 0.08904d0*cos(2.d0*MM/rad) & + + 0.03865d0*cos((2.d0*MM-2.d0*DD)/rad) & + - 0.03237d0*cos((2.d0*DD-Ms)/rad) & + - 0.02688d0*cos((MM+2.d0*DD)/rad) & + - 0.02358d0*cos((MM-2.d0*DD+Ms)/rad) & + - 0.02030d0*cos((MM-Ms)/rad) & + + 0.01719d0*cos(DD/rad) & + + 0.01671d0*cos((MM+Ms)/rad) + + dist=r*6378.140d0 + +! Geocentric coordinates: +! Rectangular ecliptic coordinates of the moon: + + xg = r * cos(lonecl/rad)*cos(latecl/rad) + yg = r * sin(lonecl/rad)*cos(latecl/rad) + zg = r * sin(latecl/rad) + +! Rectangular equatorial coordinates of the moon: + xe = xg + ye = yg*cos(ecl/rad) - zg*sin(ecl/rad) + ze = yg*sin(ecl/rad) + zg*cos(ecl/rad) + +! Right Ascension, Declination: + RA = mod(rad*atan2(ye,xe)+360.d0,360.d0) + Dec = rad*atan2(ze,sqrt(xe*xe + ye*ye)) + +! Now convert to topocentric system: + mpar=rad*asin(1.d0/r) +! alt_topoc = alt_geoc - mpar*cos(alt_geoc) + gclat = lat - 0.1924d0*sin(2.d0*lat/rad) + rho = 0.99883d0 + 0.00167d0*cos(2.d0*lat/rad) + GMST0 = (Ls + 180.d0)/15.d0 + LST = mod(GMST0+UT+lon/15.d0+48.d0,24.d0) !LST in hours + HA = 15.d0*LST - RA !HA in degrees + g = rad*atan(tan(gclat/rad)/cos(HA/rad)) + topRA = RA - mpar*rho*cos(gclat/rad)*sin(HA/rad)/cos(Dec/rad) + topDec = Dec - mpar*rho*sin(gclat/rad)*sin((g-Dec)/rad)/sin(g/rad) + + HA = 15.d0*LST - topRA !HA in degrees + if(HA.gt.180.d0) HA=HA-360.d0 + if(HA.lt.-180.d0) HA=HA+360.d0 + + pi=0.5d0*twopi + pio2=0.5d0*pi + call dcoord(pi,pio2-lat/rad,0.d0,lat/rad,ha*twopi/360,topDec/rad,az,el) + Az=az*rad + El=El*rad + + return +end subroutine moon2 diff --git a/map65/libm65/moondop.f90 b/map65/libm65/moondop.f90 new file mode 100644 index 000000000..096c3128e --- /dev/null +++ b/map65/libm65/moondop.f90 @@ -0,0 +1,72 @@ +subroutine MoonDop(nyear,month,nday,uth4,lon4,lat4,RAMoon4,DecMoon4, & + LST4,HA4,AzMoon4,ElMoon4,vr4,dist4) + + implicit real*8 (a-h,o-z) + real*4 uth4 !UT in hours + real*4 lon4 !West longitude, degrees + real*4 lat4 !Latitude, degrees + real*4 RAMoon4 !Topocentric RA of moon, hours + real*4 DecMoon4 !Topocentric Dec of Moon, degrees + real*4 LST4 !Locat sidereal time, hours + real*4 HA4 !Local Hour angle, degrees + real*4 AzMoon4 !Topocentric Azimuth of moon, degrees + real*4 ElMoon4 !Topocentric Elevation of moon, degrees + real*4 vr4 !Radial velocity of moon wrt obs, km/s + real*4 dist4 !Echo time, seconds + + real*8 LST + real*8 RME(6) !Vector from Earth center to Moon + real*8 RAE(6) !Vector from Earth center to Obs + real*8 RMA(6) !Vector from Obs to Moon + real*8 rme0(6) + logical km + + data rad/57.2957795130823d0/,twopi/6.28310530717959d0/ + + km=.true. + dlat=lat4/rad + dlong1=lon4/rad + elev1=200.d0 + call geocentric(dlat,elev1,dlat1,erad1) + + dt=100.d0 !For numerical derivative, in seconds + UT=uth4 + +! NB: geodetic latitude used here, but geocentric latitude used when +! determining Earth-rotation contribution to Doppler. + + call moon2(nyear,month,nDay,UT-dt/3600.d0,dlong1*rad,dlat*rad, & + RA,Dec,topRA,topDec,LST,HA,Az0,El0,dist) + call toxyz(RA/rad,Dec/rad,dist,rme0) !Convert to rectangular coords + + call moon2(nyear,month,nDay,UT,dlong1*rad,dlat*rad, & + RA,Dec,topRA,topDec,LST,HA,Az,El,dist) + call toxyz(RA/rad,Dec/rad,dist,rme) !Convert to rectangular coords + + phi=LST*twopi/24.d0 + call toxyz(phi,dlat1,erad1,rae) !Gencentric numbers used here! + radps=twopi/(86400.d0/1.002737909d0) + rae(4)=-rae(2)*radps !Vel of Obs wrt Earth center + rae(5)=rae(1)*radps + rae(6)=0.d0 + + do i=1,3 + rme(i+3)=(rme(i)-rme0(i))/dt + rma(i)=rme(i)-rae(i) + rma(i+3)=rme(i+3)-rae(i+3) + enddo + + call fromxyz(rma,alpha1,delta1,dtopo0) !Get topocentric coords + vr=dot(rma(4),rma)/dtopo0 + + RAMoon4=topRA + DecMoon4=topDec + LST4=LST + HA4=HA + AzMoon4=Az + ElMoon4=El + vr4=vr + dist4=dist + + return +end subroutine MoonDop diff --git a/map65/libm65/msgs.txt b/map65/libm65/msgs.txt new file mode 100644 index 000000000..cb0630423 --- /dev/null +++ b/map65/libm65/msgs.txt @@ -0,0 +1,60 @@ +W1AAA K2BBB EM00 +W2CCC K3DDD EM01 +W3EEE K4FFF EM02 +W5GGG K6HHH EM03 +W7III K8JJJ EM04 +W9KKK K0LLL EM05 +G0MMM F1NNN JN06 +G2OOO F3PPP JN07 +G4QQQ F5RRR JN08 +G6SSS F7TTT JN09 +W1XAA K2XBB EM10 +W2XCC K3XDD EM11 +W3XEE K4XFF EM12 +W5XGG K6XHH EM13 +W7XII K8XJJ EM14 +W9XKK K0XLL EM15 +G0XMM F1XNN JN16 +G2XOO F3XPP JN17 +G4XQQ F5XRR JN18 +G6XSS F7XTT JN19 +W1YAA K2YBB EM20 +W2YCC K3YDD EM21 +W3YEE K4YFF EM22 +W5YGG K6YHH EM23 +W7YII K8YJJ EM24 +W9YKK K0YLL EM25 +G0YMM F1YNN JN26 +G2YOO F3YPP JN27 +G4YQQ F5YRR JN28 +G6YSS F7YTT JN29 +W1ZAA K2ZBB EM30 +W2ZCC K3ZDD EM31 +W3ZEE K4ZFF EM32 +W5ZGG K6ZHH EM33 +W7ZII K8ZJJ EM34 +W9ZKK K0ZLL EM35 +G0ZMM F1ZNN JN36 +G2ZOO F3ZPP JN37 +G4ZQQ F5ZRR JN38 +G6ZSS F7ZTT JN39 +W1AXA K2BXB EM40 +W2CXC K3DXD EM41 +W3EXE K4FXF EM42 +W5GXG K6HXH EM43 +W7IXI K8JXJ EM44 +W9KXK K0LXL EM45 +G0MXM F1NXN JN46 +G2OXO F3PXP JN47 +G4QXQ F5RXR JN48 +G6SXS F7TXT JN49 +W1AYA K2BYB EM50 +W2CYC K3DYD EM51 +W3EYE K4FYF EM52 +W5GYG K6HYH EM53 +W7IYI K8JYJ EM54 +W9KYK K0LYL EM55 +G0MYM F1NYN JN56 +G2OYO F3PYP JN57 +G4QYQ F5RYR JN58 +G6SYS F7TYT JN59 diff --git a/map65/libm65/nchar.f90 b/map65/libm65/nchar.f90 new file mode 100644 index 000000000..21593bd13 --- /dev/null +++ b/map65/libm65/nchar.f90 @@ -0,0 +1,23 @@ +function nchar(c) + +! Convert ascii number, letter, or space to 0-36 for callsign packing. + + character c*1 + + n=0 !Silence compiler warning + if(c.ge.'0' .and. c.le.'9') then + n=ichar(c)-ichar('0') + else if(c.ge.'A' .and. c.le.'Z') then + n=ichar(c)-ichar('A') + 10 + else if(c.ge.'a' .and. c.le.'z') then + n=ichar(c)-ichar('a') + 10 + else if(c.ge.' ') then + n=36 + else + Print*,'Invalid character in callsign ',c,' ',ichar(c) + call exit(1) + endif + nchar=n + + return +end function nchar diff --git a/map65/libm65/noisegen.f90 b/map65/libm65/noisegen.f90 new file mode 100644 index 000000000..65d943161 --- /dev/null +++ b/map65/libm65/noisegen.f90 @@ -0,0 +1,13 @@ +subroutine noisegen(d4,nmax) + + real*4 d4(4,nmax) + + do i=1,nmax + d4(1,i)=gran() + d4(2,i)=gran() + d4(3,i)=gran() + d4(4,i)=gran() + enddo + + return +end subroutine noisegen diff --git a/map65/libm65/packjt.f90 b/map65/libm65/packjt.f90 new file mode 100644 index 000000000..c1fc0089d --- /dev/null +++ b/map65/libm65/packjt.f90 @@ -0,0 +1,996 @@ +module packjt + + contains + +subroutine packbits(dbits,nsymd,m0,sym) + + ! Pack 0s and 1s from dbits() into sym() with m0 bits per word. + ! NB: nsymd is the number of packed output words. + + integer sym(:) + integer*1 dbits(:) + + k=0 + do i=1,nsymd + n=0 + do j=1,m0 + k=k+1 + m=dbits(k) + n=ior(ishft(n,1),m) + enddo + sym(i)=n + enddo + + return + end subroutine packbits + + subroutine unpackbits(sym,nsymd,m0,dbits) + + ! Unpack bits from sym() into dbits(), one bit per byte. + ! NB: nsymd is the number of input words, and m0 their length. + ! there will be m0*nsymd output bytes, each 0 or 1. + + integer sym(:) + integer*1 dbits(:) + + k=0 + do i=1,nsymd + mask=ishft(1,m0-1) + do j=1,m0 + k=k+1 + dbits(k)=0 + if(iand(mask,sym(i)).ne.0) dbits(k)=1 + mask=ishft(mask,-1) + enddo + enddo + + return + end subroutine unpackbits + + subroutine packcall(callsign,ncall,text) + + ! Pack a valid callsign into a 28-bit integer. + + parameter (NBASE=37*36*10*27*27*27) + character callsign*6,c*1,tmp*6 + logical text + + text=.false. + + ! Work-around for Swaziland prefix: + if(callsign(1:4).eq.'3DA0') callsign='3D0'//callsign(5:6) + + if(callsign(1:3).eq.'CQ ') then + ncall=NBASE + 1 + if(callsign(4:4).ge.'0' .and. callsign(4:4).le.'9' .and. & + callsign(5:5).ge.'0' .and. callsign(5:5).le.'9' .and. & + callsign(6:6).ge.'0' .and. callsign(6:6).le.'9') then + read(callsign(4:6),*) nfreq + ncall=NBASE + 3 + nfreq + endif + return + else if(callsign(1:4).eq.'QRZ ') then + ncall=NBASE + 2 + return + else if(callsign(1:3).eq.'DE ') then + ncall=267796945 + return + endif + + tmp=' ' + if(callsign(3:3).ge.'0' .and. callsign(3:3).le.'9') then + tmp=callsign + else if(callsign(2:2).ge.'0' .and. callsign(2:2).le.'9') then + if(callsign(6:6).ne.' ') then + text=.true. + return + endif + tmp=' '//callsign(:5) + else + text=.true. + return + endif + + do i=1,6 + c=tmp(i:i) + if(c.ge.'a' .and. c.le.'z') & + tmp(i:i)=char(ichar(c)-ichar('a')+ichar('A')) + enddo + + n1=0 + if((tmp(1:1).ge.'A'.and.tmp(1:1).le.'Z').or.tmp(1:1).eq.' ') n1=1 + if(tmp(1:1).ge.'0' .and. tmp(1:1).le.'9') n1=1 + n2=0 + if(tmp(2:2).ge.'A' .and. tmp(2:2).le.'Z') n2=1 + if(tmp(2:2).ge.'0' .and. tmp(2:2).le.'9') n2=1 + n3=0 + if(tmp(3:3).ge.'0' .and. tmp(3:3).le.'9') n3=1 + n4=0 + if((tmp(4:4).ge.'A'.and.tmp(4:4).le.'Z').or.tmp(4:4).eq.' ') n4=1 + n5=0 + if((tmp(5:5).ge.'A'.and.tmp(5:5).le.'Z').or.tmp(5:5).eq.' ') n5=1 + n6=0 + if((tmp(6:6).ge.'A'.and.tmp(6:6).le.'Z').or.tmp(6:6).eq.' ') n6=1 + + if(n1+n2+n3+n4+n5+n6 .ne. 6) then + text=.true. + return + endif + + ncall=nchar(tmp(1:1)) + ncall=36*ncall+nchar(tmp(2:2)) + ncall=10*ncall+nchar(tmp(3:3)) + ncall=27*ncall+nchar(tmp(4:4))-10 + ncall=27*ncall+nchar(tmp(5:5))-10 + ncall=27*ncall+nchar(tmp(6:6))-10 + + return + end subroutine packcall + + subroutine unpackcall(ncall,word,iv2,psfx) + + parameter (NBASE=37*36*10*27*27*27) + character word*12,c*37,psfx*4 + + data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ '/ + + word='......' + psfx=' ' + n=ncall + iv2=0 + if(n.ge.262177560) go to 20 + word='......' + ! if(n.ge.262177560) go to 999 !Plain text message ... + i=mod(n,27)+11 + word(6:6)=c(i:i) + n=n/27 + i=mod(n,27)+11 + word(5:5)=c(i:i) + n=n/27 + i=mod(n,27)+11 + word(4:4)=c(i:i) + n=n/27 + i=mod(n,10)+1 + word(3:3)=c(i:i) + n=n/10 + i=mod(n,36)+1 + word(2:2)=c(i:i) + n=n/36 + i=n+1 + word(1:1)=c(i:i) + do i=1,4 + if(word(i:i).ne.' ') go to 10 + enddo + go to 999 + 10 word=word(i:) + go to 999 + + 20 if(n.ge.267796946) go to 999 + + ! We have a JT65v2 message + if((n.ge.262178563) .and. (n.le.264002071)) then + ! CQ with prefix + iv2=1 + n=n-262178563 + i=mod(n,37)+1 + psfx(4:4)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if((n.ge.264002072) .and. (n.le.265825580)) then + ! QRZ with prefix + iv2=2 + n=n-264002072 + i=mod(n,37)+1 + psfx(4:4)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if((n.ge.265825581) .and. (n.le.267649089)) then + ! DE with prefix + iv2=3 + n=n-265825581 + i=mod(n,37)+1 + psfx(4:4)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if((n.ge.267649090) .and. (n.le.267698374)) then + ! CQ with suffix + iv2=4 + n=n-267649090 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if((n.ge.267698375) .and. (n.le.267747659)) then + ! QRZ with suffix + iv2=5 + n=n-267698375 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if((n.ge.267747660) .and. (n.le.267796944)) then + ! DE with suffix + iv2=6 + n=n-267747660 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if(n.eq.267796945) then + ! DE with no prefix or suffix + iv2=7 + psfx = ' ' + endif + + 999 if(word(1:3).eq.'3D0') word='3DA0'//word(4:) + + return + end subroutine unpackcall + + subroutine packgrid(grid,ng,text) + + parameter (NGBASE=180*180) + character*4 grid + character*1 c1 + logical text + + text=.false. + if(grid.eq.' ') go to 90 !Blank grid is OK + + ! First, handle signal reports in the original range, -01 to -30 dB + if(grid(1:1).eq.'-') then + read(grid(2:3),*,err=800,end=800) n + if(n.ge.1 .and. n.le.30) then + ng=NGBASE+1+n + go to 900 + endif + go to 10 + else if(grid(1:2).eq.'R-') then + read(grid(3:4),*,err=800,end=800) n + if(n.ge.1 .and. n.le.30) then + ng=NGBASE+31+n + go to 900 + endif + go to 10 + ! Now check for RO, RRR, or 73 in the message field normally used for grid + else if(grid(1:4).eq.'RO ') then + ng=NGBASE+62 + go to 900 + else if(grid(1:4).eq.'RRR ') then + ng=NGBASE+63 + go to 900 + else if(grid(1:4).eq.'73 ') then + ng=NGBASE+64 + go to 900 + endif + + ! Now check for extended-range signal reports: -50 to -31, and 0 to +49. + 10 n=99 + c1=grid(1:1) + read(grid,*,err=20,end=20) n + go to 30 + 20 read(grid(2:4),*,err=30,end=30) n + 30 if(n.ge.-50 .and. n.le.49) then + if(c1.eq.'R') then + write(grid,1002) n+50 + 1002 format('LA',i2.2) + else + write(grid,1003) n+50 + 1003 format('KA',i2.2) + endif + go to 40 + endif + + ! Maybe it's free text ? + if(grid(1:1).lt.'A' .or. grid(1:1).gt.'R') text=.true. + if(grid(2:2).lt.'A' .or. grid(2:2).gt.'R') text=.true. + if(grid(3:3).lt.'0' .or. grid(3:3).gt.'9') text=.true. + if(grid(4:4).lt.'0' .or. grid(4:4).gt.'9') text=.true. + if(text) go to 900 + + ! OK, we have a properly formatted grid locator + 40 call grid2deg(grid//'mm',dlong,dlat) + long=int(dlong) + lat=int(dlat+ 90.0) + ng=((long+180)/2)*180 + lat + go to 900 + + 90 ng=NGBASE + 1 + go to 900 + + 800 text=.true. + 900 continue + + return + end subroutine packgrid + + subroutine unpackgrid(ng,grid) + + parameter (NGBASE=180*180) + character grid*4,grid6*6 + + grid=' ' + if(ng.ge.32400) go to 10 + dlat=mod(ng,180)-90 + dlong=(ng/180)*2 - 180 + 2 + call deg2grid(dlong,dlat,grid6) + grid=grid6(:4) + if(grid(1:2).eq.'KA') then + read(grid(3:4),*) n + n=n-50 + write(grid,1001) n + 1001 format(i3.2) + if(grid(1:1).eq.' ') grid(1:1)='+' + else if(grid(1:2).eq.'LA') then + read(grid(3:4),*) n + n=n-50 + write(grid,1002) n + 1002 format('R',i3.2) + if(grid(2:2).eq.' ') grid(2:2)='+' + endif + go to 900 + + 10 n=ng-NGBASE-1 + if(n.ge.1 .and.n.le.30) then + write(grid,1012) -n + 1012 format(i3.2) + else if(n.ge.31 .and.n.le.60) then + n=n-30 + write(grid,1022) -n + 1022 format('R',i3.2) + else if(n.eq.61) then + grid='RO' + else if(n.eq.62) then + grid='RRR' + else if(n.eq.63) then + grid='73' + endif + + 900 return + end subroutine unpackgrid + + subroutine packmsg(msg0,dat,itype) + + ! Packs a JT4/JT9/JT65 message into twelve 6-bit symbols + + ! itype Message Type + !-------------------- + ! 1 Standardd message + ! 2 Type 1 prefix + ! 3 Type 1 suffix + ! 4 Type 2 prefix + ! 5 Type 2 suffix + ! 6 Free text + ! -1 Does not decode correctly + + parameter (NBASE=37*36*10*27*27*27) + parameter (NBASE2=262178562) + character*22 msg0,msg + integer dat(:) + character*12 c1,c2 + character*4 c3 + character*6 grid6 + logical text1,text2,text3 + + msg=msg0 + itype=1 + call fmtmsg(msg,iz) + + if(msg(1:6).eq.'CQ DX ') msg(3:3)='9' + if(msg(1:3).eq."CQ " .and. & + msg(4:4).ge.'A' .and. msg(4:4).le.'Z' .and. & + msg(5:5).ge.'A' .and. msg(5:5).le.'Z' .and. & + msg(6:6).eq.' ') msg='E9'//msg(4:) + + ! See if it's a CQ message + if(msg(1:3).eq.'CQ ') then + i=3 + ! ... and if so, does it have a reply frequency? + if(msg(4:4).ge.'0' .and. msg(4:4).le.'9' .and. & + msg(5:5).ge.'0' .and. msg(5:5).le.'9' .and. & + msg(6:6).ge.'0' .and. msg(6:6).le.'9') i=7 + go to 1 + endif + + do i=1,22 + if(msg(i:i).eq.' ') go to 1 !Get 1st blank + enddo + go to 10 !Consider msg as plain text + + 1 ia=i + c1=msg(1:ia-1) + do i=ia+1,22 + if(msg(i:i).eq.' ') go to 2 !Get 2nd blank + enddo + go to 10 !Consider msg as plain text + + 2 ib=i + c2=msg(ia+1:ib-1) + + do i=ib+1,22 + if(msg(i:i).eq.' ') go to 3 !Get 3rd blank + enddo + go to 10 !Consider msg as plain text + + 3 ic=i + c3=' ' + if(ic.ge.ib+1) c3=msg(ib+1:ic) + if(c3.eq.'OOO ') c3=' ' !Strip out the OOO flag + call getpfx1(c1,k1,nv2a) + if(nv2a.ge.4) go to 10 + call packcall(c1,nc1,text1) + if(text1) go to 10 + call getpfx1(c2,k2,nv2b) + call packcall(c2,nc2,text2) + if(text2) go to 10 + if(nv2a.eq.2 .or. nv2a.eq.3 .or. nv2b.eq.2 .or. nv2b.eq.3) then + if(k1.lt.0 .or. k2.lt.0 .or. k1*k2.ne.0) go to 10 + if(k2.gt.0) k2=k2+450 + k=max(k1,k2) + if(k.gt.0) then + call k2grid(k,grid6) + c3=grid6(:4) + endif + endif + call packgrid(c3,ng,text3) + + if(nv2a.lt.4 .and. nv2b.lt.4 .and. (.not.text1) .and. (.not.text2) .and. & + (.not.text3)) go to 20 + + nc1=0 + if(nv2b.eq.4) then + if(c1(1:3).eq.'CQ ') nc1=262178563 + k2 + if(c1(1:4).eq.'QRZ ') nc1=264002072 + k2 + if(c1(1:3).eq.'DE ') nc1=265825581 + k2 + else if(nv2b.eq.5) then + if(c1(1:3).eq.'CQ ') nc1=267649090 + k2 + if(c1(1:4).eq.'QRZ ') nc1=267698375 + k2 + if(c1(1:3).eq.'DE ') nc1=267747660 + k2 + endif + if(nc1.ne.0) go to 20 + + ! The message will be treated as plain text. + 10 itype=6 + call packtext(msg,nc1,nc2,ng) + ng=ng+32768 + + ! Encode data into 6-bit words + 20 continue + if(itype.ne.6) itype=max(nv2a,nv2b) + dat(1)=iand(ishft(nc1,-22),63) !6 bits + dat(2)=iand(ishft(nc1,-16),63) !6 bits + dat(3)=iand(ishft(nc1,-10),63) !6 bits + dat(4)=iand(ishft(nc1, -4),63) !6 bits + dat(5)=4*iand(nc1,15)+iand(ishft(nc2,-26),3) !4+2 bits + dat(6)=iand(ishft(nc2,-20),63) !6 bits + dat(7)=iand(ishft(nc2,-14),63) !6 bits + dat(8)=iand(ishft(nc2, -8),63) !6 bits + dat(9)=iand(ishft(nc2, -2),63) !6 bits + dat(10)=16*iand(nc2,3)+iand(ishft(ng,-12),15) !2+4 bits + dat(11)=iand(ishft(ng,-6),63) + dat(12)=iand(ng,63) + + return + end subroutine packmsg + + subroutine unpackmsg(dat,msg) + + parameter (NBASE=37*36*10*27*27*27) + parameter (NGBASE=180*180) + integer dat(:) + character c1*12,c2*12,grid*4,msg*22,grid6*6,psfx*4,junk2*4 + logical cqnnn + + cqnnn=.false. + nc1=ishft(dat(1),22) + ishft(dat(2),16) + ishft(dat(3),10)+ & + ishft(dat(4),4) + iand(ishft(dat(5),-2),15) + + nc2=ishft(iand(dat(5),3),26) + ishft(dat(6),20) + & + ishft(dat(7),14) + ishft(dat(8),8) + ishft(dat(9),2) + & + iand(ishft(dat(10),-4),3) + + ng=ishft(iand(dat(10),15),12) + ishft(dat(11),6) + dat(12) + + if(ng.ge.32768) then + call unpacktext(nc1,nc2,ng,msg) + go to 100 + endif + + call unpackcall(nc1,c1,iv2,psfx) + if(iv2.eq.0) then + ! This is an "original JT65" message + if(nc1.eq.NBASE+1) c1='CQ ' + if(nc1.eq.NBASE+2) c1='QRZ ' + nfreq=nc1-NBASE-3 + if(nfreq.ge.0 .and. nfreq.le.999) then + write(c1,1002) nfreq + 1002 format('CQ ',i3.3) + cqnnn=.true. + endif + endif + + call unpackcall(nc2,c2,junk1,junk2) + call unpackgrid(ng,grid) + + if(iv2.gt.0) then + ! This is a JT65v2 message + do i=1,4 + if(ichar(psfx(i:i)).eq.0) psfx(i:i)=' ' + enddo + + n1=len_trim(psfx) + n2=len_trim(c2) + if(iv2.eq.1) msg='CQ '//psfx(:n1)//'/'//c2(:n2)//' '//grid + if(iv2.eq.2) msg='QRZ '//psfx(:n1)//'/'//c2(:n2)//' '//grid + if(iv2.eq.3) msg='DE '//psfx(:n1)//'/'//c2(:n2)//' '//grid + if(iv2.eq.4) msg='CQ '//c2(:n2)//'/'//psfx(:n1)//' '//grid + if(iv2.eq.5) msg='QRZ '//c2(:n2)//'/'//psfx(:n1)//' '//grid + if(iv2.eq.6) msg='DE '//c2(:n2)//'/'//psfx(:n1)//' '//grid + if(iv2.eq.7) msg='DE '//c2(:n2)//' '//grid + if(iv2.eq.8) msg=' ' + go to 100 + else + + endif + + grid6=grid//'ma' + call grid2k(grid6,k) + if(k.ge.1 .and. k.le.450) call getpfx2(k,c1) + if(k.ge.451 .and. k.le.900) call getpfx2(k,c2) + + i=index(c1,char(0)) + if(i.ge.3) c1=c1(1:i-1)//' ' + i=index(c2,char(0)) + if(i.ge.3) c2=c2(1:i-1)//' ' + + msg=' ' + j=0 + if(cqnnn) then + msg=c1//' ' + j=7 !### ??? ### + go to 10 + endif + + do i=1,12 + j=j+1 + msg(j:j)=c1(i:i) + if(c1(i:i).eq.' ') go to 10 + enddo + j=j+1 + msg(j:j)=' ' + + 10 do i=1,12 + if(j.le.21) j=j+1 + msg(j:j)=c2(i:i) + if(c2(i:i).eq.' ') go to 20 + enddo + if(j.le.21) j=j+1 + msg(j:j)=' ' + + 20 if(k.eq.0) then + do i=1,4 + if(j.le.21) j=j+1 + msg(j:j)=grid(i:i) + enddo + if(j.le.21) j=j+1 + msg(j:j)=' ' + endif + + 100 continue + if(msg(1:6).eq.'CQ9DX ') msg(3:3)=' ' + if(msg(1:2).eq.'E9' .and. & + msg(3:3).ge.'A' .and. msg(3:3).le.'Z' .and. & + msg(4:4).ge.'A' .and. msg(4:4).le.'Z' .and. & + msg(5:5).eq.' ') msg='CQ '//msg(3:) + + return + end subroutine unpackmsg + + subroutine packtext(msg,nc1,nc2,nc3) + + parameter (MASK28=2**28 - 1) + character*13 msg + character*42 c + data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ +-./?'/ + + nc1=0 + nc2=0 + nc3=0 + + do i=1,5 !First 5 characters in nc1 + do j=1,42 !Get character code + if(msg(i:i).eq.c(j:j)) go to 10 + enddo + j=37 + 10 j=j-1 !Codes should start at zero + nc1=42*nc1 + j + enddo + + do i=6,10 !Characters 6-10 in nc2 + do j=1,42 !Get character code + if(msg(i:i).eq.c(j:j)) go to 20 + enddo + j=37 + 20 j=j-1 !Codes should start at zero + nc2=42*nc2 + j + enddo + + do i=11,13 !Characters 11-13 in nc3 + do j=1,42 !Get character code + if(msg(i:i).eq.c(j:j)) go to 30 + enddo + j=37 + 30 j=j-1 !Codes should start at zero + nc3=42*nc3 + j + enddo + + ! We now have used 17 bits in nc3. Must move one each to nc1 and nc2. + nc1=nc1+nc1 + if(iand(nc3,32768).ne.0) nc1=nc1+1 + nc2=nc2+nc2 + if(iand(nc3,65536).ne.0) nc2=nc2+1 + nc3=iand(nc3,32767) + + return + end subroutine packtext + + subroutine unpacktext(nc1,nc2,nc3,msg) + + character*22 msg + character*44 c + data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ +-./?'/ + + nc3=iand(nc3,32767) !Remove the "plain text" bit + if(iand(nc1,1).ne.0) nc3=nc3+32768 + nc1=nc1/2 + if(iand(nc2,1).ne.0) nc3=nc3+65536 + nc2=nc2/2 + + do i=5,1,-1 + j=mod(nc1,42)+1 + msg(i:i)=c(j:j) + nc1=nc1/42 + enddo + + do i=10,6,-1 + j=mod(nc2,42)+1 + msg(i:i)=c(j:j) + nc2=nc2/42 + enddo + + do i=13,11,-1 + j=mod(nc3,42)+1 + msg(i:i)=c(j:j) + nc3=nc3/42 + enddo + msg(14:22) = ' ' + + return + end subroutine unpacktext + + subroutine getpfx1(callsign,k,nv2) + + character*12 callsign0,callsign,lof,rof + character*8 c + character addpfx*8,tpfx*4,tsfx*3 + logical ispfx,issfx,invalid + common/pfxcom/addpfx + include 'pfx.f90' + + callsign0=callsign + nv2=1 + iz=index(callsign,' ') - 1 + if(iz.lt.0) iz=12 + islash=index(callsign(1:iz),'/') + k=0 + ! if(k.eq.0) go to 10 !Tnx to DL9RDZ for reminder:this was for tests only! + c=' ' + if(islash.gt.0 .and. islash.le.(iz-4)) then + ! Add-on prefix + c=callsign(1:islash-1) + callsign=callsign(islash+1:iz) + do i=1,NZ + if(pfx(i)(1:4).eq.c) then + k=i + nv2=2 + go to 10 + endif + enddo + if(addpfx.eq.c) then + k=449 + nv2=2 + go to 10 + endif + + else if(islash.eq.(iz-1)) then + ! Add-on suffix + c=callsign(islash+1:iz) + callsign=callsign(1:islash-1) + do i=1,NZ2 + if(sfx(i).eq.c(1:1)) then + k=400+i + nv2=3 + go to 10 + endif + enddo + endif + + 10 if(islash.ne.0 .and.k.eq.0) then + ! Original JT65 would force this compound callsign to be treated as + ! plain text. In JT65v2, we will encode the prefix or suffix into nc1. + ! The task here is to compute the proper value of k. + lof=callsign0(:islash-1) + rof=callsign0(islash+1:) + llof=len_trim(lof) + lrof=len_trim(rof) + ispfx=(llof.gt.0 .and. llof.le.4) + issfx=(lrof.gt.0 .and. lrof.le.3) + invalid=.not.(ispfx.or.issfx) + if(ispfx.and.issfx) then + if(llof.lt.3) issfx=.false. + if(lrof.lt.3) ispfx=.false. + if(ispfx.and.issfx) then + i=ichar(callsign0(islash-1:islash-1)) + if(i.ge.ichar('0') .and. i.le.ichar('9')) then + issfx=.false. + else + ispfx=.false. + endif + endif + endif + + if(invalid) then + k=-1 + else + if(ispfx) then + tpfx=lof(1:4) + k=nchar(tpfx(1:1)) + k=37*k + nchar(tpfx(2:2)) + k=37*k + nchar(tpfx(3:3)) + k=37*k + nchar(tpfx(4:4)) + nv2=4 + i=index(callsign0,'/') + callsign=callsign0(:i-1) + callsign=callsign0(i+1:) + endif + if(issfx) then + tsfx=rof(1:3) + k=nchar(tsfx(1:1)) + k=37*k + nchar(tsfx(2:2)) + k=37*k + nchar(tsfx(3:3)) + nv2=5 + i=index(callsign0,'/') + callsign=callsign0(:i-1) + endif + endif + endif + + return + end subroutine getpfx1 + + subroutine getpfx2(k0,callsign) + + character callsign*12 + include 'pfx.f90' + character addpfx*8 + common/pfxcom/addpfx + + k=k0 + if(k.gt.450) k=k-450 + if(k.ge.1 .and. k.le.NZ) then + iz=index(pfx(k),' ') - 1 + callsign=pfx(k)(1:iz)//'/'//callsign + else if(k.ge.401 .and. k.le.400+NZ2) then + iz=index(callsign,' ') - 1 + callsign=callsign(1:iz)//'/'//sfx(k-400) + else if(k.eq.449) then + iz=index(addpfx,' ') - 1 + if(iz.lt.1) iz=8 + callsign=addpfx(1:iz)//'/'//callsign + endif + + return + end subroutine getpfx2 + + subroutine grid2k(grid,k) + + character*6 grid + + call grid2deg(grid,xlong,xlat) + nlong=nint(xlong) + nlat=nint(xlat) + k=0 + if(nlat.ge.85) k=5*(nlong+179)/2 + nlat-84 + + return + end subroutine grid2k + + subroutine k2grid(k,grid) + character grid*6 + + nlong=2*mod((k-1)/5,90)-179 + if(k.gt.450) nlong=nlong+180 + nlat=mod(k-1,5)+ 85 + dlat=nlat + dlong=nlong + call deg2grid(dlong,dlat,grid) + + return + end subroutine k2grid + + subroutine grid2n(grid,n) + character*4 grid + + i1=ichar(grid(1:1))-ichar('A') + i2=ichar(grid(3:3))-ichar('0') + i=10*i1 + i2 + n=-i - 31 + + return + end subroutine grid2n + + subroutine n2grid(n,grid) + character*4 grid + + if(n.gt.-31 .or. n.lt.-70) stop 'Error in n2grid' + i=-(n+31) !NB: 0 <= i <= 39 + i1=i/10 + i2=mod(i,10) + grid(1:1)=char(ichar('A')+i1) + grid(2:2)='A' + grid(3:3)=char(ichar('0')+i2) + grid(4:4)='0' + + return + end subroutine n2grid + + function nchar(c) + + ! Convert ascii number, letter, or space to 0-36 for callsign packing. + + character c*1 + + n=0 !Silence compiler warning + if(c.ge.'0' .and. c.le.'9') then + n=ichar(c)-ichar('0') + else if(c.ge.'A' .and. c.le.'Z') then + n=ichar(c)-ichar('A') + 10 + else if(c.ge.'a' .and. c.le.'z') then + n=ichar(c)-ichar('a') + 10 + else if(c.ge.' ') then + n=36 + else + Print*,'Invalid character in callsign ',c,' ',ichar(c) + stop + endif + nchar=n + + return + end function nchar + + subroutine pack50(n1,n2,dat) + + integer*1 dat(:),i1 + + i1=iand(ishft(n1,-20),255) !8 bits + dat(1)=i1 + i1=iand(ishft(n1,-12),255) !8 bits + dat(2)=i1 + i1=iand(ishft(n1, -4),255) !8 bits + dat(3)=i1 + i1=16*iand(n1,15)+iand(ishft(n2,-18),15) !4+4 bits + dat(4)=i1 + i1=iand(ishft(n2,-10),255) !8 bits + dat(5)=i1 + i1=iand(ishft(n2, -2),255) !8 bits + dat(6)=i1 + i1=64*iand(n2,3) !2 bits + dat(7)=i1 + dat(8)=0 + dat(9)=0 + dat(10)=0 + dat(11)=0 + + return + end subroutine pack50 + +subroutine packpfx(call1,n1,ng,nadd) + + character*12 call1,call0 + character*3 pfx + logical text + + i1=index(call1,'/') + if(call1(i1+2:i1+2).eq.' ') then +! Single-character add-on suffix (maybe also fourth suffix letter?) + call0=call1(:i1-1) + call packcall(call0,n1,text) + nadd=1 + nc=ichar(call1(i1+1:i1+1)) + if(nc.ge.48 .and. nc.le.57) then + n=nc-48 + else if(nc.ge.65 .and. nc.le.90) then + n=nc-65+10 + else + n=38 + endif + nadd=1 + ng=60000-32768+n + else if(call1(i1+3:i1+3).eq.' ') then +! Two-character numerical suffix, /10 to /99 + call0=call1(:i1-1) + call packcall(call0,n1,text) + nadd=1 + n=10*(ichar(call1(i1+1:i1+1))-48) + ichar(call1(i1+2:i1+2)) - 48 + nadd=1 + ng=60000 + 26 + n + else +! Prefix of 1 to 3 characters + pfx=call1(:i1-1) + if(pfx(3:3).eq.' ') pfx=' '//pfx(1:2) + if(pfx(3:3).eq.' ') pfx=' '//pfx(1:2) + call0=call1(i1+1:) + call packcall(call0,n1,text) + + ng=0 + do i=1,3 + nc=ichar(pfx(i:i)) + if(nc.ge.48 .and. nc.le.57) then + n=nc-48 + else if(nc.ge.65 .and. nc.le.90) then + n=nc-65+10 + else + n=36 + endif + ng=37*ng + n + enddo + nadd=0 + if(ng.ge.32768) then + ng=ng-32768 + nadd=1 + endif + endif + + return +end subroutine packpfx + +end module packjt diff --git a/map65/libm65/pfx.f90 b/map65/libm65/pfx.f90 new file mode 100644 index 000000000..724b0f8a3 --- /dev/null +++ b/map65/libm65/pfx.f90 @@ -0,0 +1,50 @@ + parameter (NZ=339) !Total number of prefixes + parameter (NZ2=12) !Total number of suffixes + character*1 sfx(NZ2) + character*5 pfx(NZ) + + data sfx/'P','0','1','2','3','4','5','6','7','8','9','A'/ + data pfx/ & + '1A ','1S ','3A ','3B6 ','3B8 ','3B9 ','3C ','3C0 ', & + '3D2 ','3D2C ','3D2R ','3DA ','3V ','3W ','3X ','3Y ', & + '3YB ','3YP ','4J ','4L ','4S ','4U1I ','4U1U ','4W ', & + '4X ','5A ','5B ','5H ','5N ','5R ','5T ','5U ', & + '5V ','5W ','5X ','5Z ','6W ','6Y ','7O ','7P ', & + '7Q ','7X ','8P ','8Q ','8R ','9A ','9G ','9H ', & + '9J ','9K ','9L ','9M2 ','9M6 ','9N ','9Q ','9U ', & + '9V ','9X ','9Y ','A2 ','A3 ','A4 ','A5 ','A6 ', & + 'A7 ','A9 ','AP ','BS7 ','BV ','BV9 ','BY ','C2 ', & + 'C3 ','C5 ','C6 ','C9 ','CE ','CE0X ','CE0Y ','CE0Z ', & + 'CE9 ','CM ','CN ','CP ','CT ','CT3 ','CU ','CX ', & + 'CY0 ','CY9 ','D2 ','D4 ','D6 ','DL ','DU ','E3 ', & + 'E4 ','EA ','EA6 ','EA8 ','EA9 ','EI ','EK ','EL ', & + 'EP ','ER ','ES ','ET ','EU ','EX ','EY ','EZ ', & + 'F ','FG ','FH ','FJ ','FK ','FKC ','FM ','FO ', & + 'FOA ','FOC ','FOM ','FP ','FR ','FRG ','FRJ ','FRT ', & + 'FT5W ','FT5X ','FT5Z ','FW ','FY ','M ','MD ','MI ', & + 'MJ ','MM ', 'MU ','MW ','H4 ','H40 ','HA ', & + 'HB ','HB0 ','HC ','HC8 ','HH ','HI ','HK ','HK0 ', & + 'HK0M ','HL ','HM ','HP ','HR ','HS ','HV ','HZ ', & + 'I ','IS ','IS0 ', 'J2 ','J3 ','J5 ','J6 ', & + 'J7 ','J8 ','JA ','JDM ','JDO ','JT ','JW ', & + 'JX ','JY ','K ','KG4 ','KH0 ','KH1 ','KH2 ','KH3 ', & + 'KH4 ','KH5 ','KH5K ','KH6 ','KH7 ','KH8 ','KH9 ','KL ', & + 'KP1 ','KP2 ','KP4 ','KP5 ','LA ','LU ','LX ','LY ', & + 'LZ ','OA ','OD ','OE ','OH ','OH0 ','OJ0 ','OK ', & + 'OM ','ON ','OX ','OY ','OZ ','P2 ','P4 ','PA ', & + 'PJ2 ','PJ7 ','PY ','PY0F ','PT0S ','PY0T ','PZ ','R1F ', & + 'R1M ','S0 ','S2 ','S5 ','S7 ','S9 ','SM ','SP ', & + 'ST ','SU ','SV ','SVA ','SV5 ','SV9 ','T2 ','T30 ', & + 'T31 ','T32 ','T33 ','T5 ','T7 ','T8 ','T9 ','TA ', & + 'TF ','TG ','TI ','TI9 ','TJ ','TK ','TL ', & + 'TN ','TR ','TT ','TU ','TY ','TZ ','UA ','UA2 ', & + 'UA9 ','UK ','UN ','UR ','V2 ','V3 ','V4 ','V5 ', & + 'V6 ','V7 ','V8 ','VE ','VK ','VK0H ','VK0M ','VK9C ', & + 'VK9L ','VK9M ','VK9N ','VK9W ','VK9X ','VP2E ','VP2M ','VP2V ', & + 'VP5 ','VP6 ','VP6D ','VP8 ','VP8G ','VP8H ','VP8O ','VP8S ', & + 'VP9 ','VQ9 ','VR ','VU ','VU4 ','VU7 ','XE ','XF4 ', & + 'XT ','XU ','XW ','XX9 ','XZ ','YA ','YB ','YI ', & + 'YJ ','YK ','YL ','YN ','YO ','YS ','YU ','YV ', & + 'YV0 ','Z2 ','Z3 ','ZA ','ZB ','ZC4 ','ZD7 ','ZD8 ', & + 'ZD9 ','ZF ','ZK1N ','ZK1S ','ZK2 ','ZK3 ','ZL ','ZL7 ', & + 'ZL8 ','ZL9 ','ZP ','ZS ','ZS8 ','KC4 ','E5 '/ diff --git a/map65/libm65/pfxdump.f90 b/map65/libm65/pfxdump.f90 new file mode 100644 index 000000000..7587dbf72 --- /dev/null +++ b/map65/libm65/pfxdump.f90 @@ -0,0 +1,13 @@ +subroutine pfxdump(fname) + character*(*) fname + include 'pfx.f90' + + open(11,file=fname,status='unknown') + write(11,1001) sfx +1001 format('Supported Suffixes:'/(11('/',a1,2x))) + write(11,1002) pfx +1002 format(/'Supported Add-On DXCC Prefixes:'/(15(a5,1x))) + close(11) + + return +end subroutine pfxdump diff --git a/map65/libm65/ptt.c b/map65/libm65/ptt.c new file mode 100644 index 000000000..0f99d1be8 --- /dev/null +++ b/map65/libm65/ptt.c @@ -0,0 +1,43 @@ +#include +#include + +int ptt_(int *nport, int *ntx, int *iptt) +{ + static HANDLE hFile; + static int open=0; + char s[10]; + int i3=0,i4=0,i5=0,i6=0,i9=0,i00=0; + + if(*nport==0) { + *iptt=*ntx; + return(0); + } + + if(*ntx && (!open)) { + sprintf(s,"COM%d",*nport); + hFile=CreateFile(TEXT(s),GENERIC_WRITE,0,NULL,OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL,NULL); + if(hFile==INVALID_HANDLE_VALUE) { + // printf("PTT: Cannot open COM port %d.\n",*nport); + return 1; + } + open=1; + } + + if(*ntx && open) { + EscapeCommFunction(hFile,3); + EscapeCommFunction(hFile,5); + *iptt=1; + } + + else { + EscapeCommFunction(hFile,4); + EscapeCommFunction(hFile,6); + EscapeCommFunction(hFile,9); + i00=CloseHandle(hFile); + *iptt=0; + open=0; + } + if((i00+i3+i4+i5+i6+i9)==-99) return -1; //Silence compiler warning + return 0; +} diff --git a/map65/libm65/ptt_unix.c b/map65/libm65/ptt_unix.c new file mode 100644 index 000000000..1c583f641 --- /dev/null +++ b/map65/libm65/ptt_unix.c @@ -0,0 +1,405 @@ +/* + * WSJT is Copyright (c) 2001-2006 by Joseph H. Taylor, Jr., K1JT, + * and is licensed under the GNU General Public License (GPL). + * + * Code used from cwdaemon for parallel port ptt only. + * + * cwdaemon - morse sounding daemon for the parallel or serial port + * Copyright (C) 2002 -2005 Joop Stakenborg + * and many authors, see the AUTHORS file. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +# if HAVE_STDIO_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if HAVE_SYS_IOCTL_H +# include +#endif +#if HAVE_FCNTL_H +# include +#endif + +#ifdef HAVE_LINUX_PPDEV_H +# include +# include +#endif +#ifdef HAVE_DEV_PPBUS_PPI_H +# include +# include +#endif + +int lp_reset (int fd); +int lp_ptt (int fd, int onoff); + +#ifdef HAVE_SYS_STAT_H +# include +#endif +#if (defined(__unix__) || defined(unix)) && !defined(USG) +# include +#endif + +#include +/* parport functions */ + +int dev_is_parport(int fd); +int ptt_parallel(int fd, int *ntx, int *iptt); +int ptt_serial(int fd, int *ntx, int *iptt); + +int fd=-1; /* Used for both serial and parallel */ + +/* + * ptt_ + * + * generic unix PTT routine called from Fortran + * + * Inputs + * unused Unused, to satisfy old windows calling convention + * ptt_port device name serial or parallel + * ntx pointer to fortran command on or off + * iptt pointer to fortran command status on or off + * Returns - non 0 if error +*/ + +/* Tiny state machine */ +#define STATE_PORT_CLOSED 0 +#define STATE_PORT_OPEN_PARALLEL 1 +#define STATE_PORT_OPEN_SERIAL 2 + +//int ptt_(int *unused, char *ptt_port, int *ntx, int *iptt) +int ptt_(int *unused, int *ntx, int *iptt) +{ + static int state=0; + char *p; + +// ### Temporary: + char* ptt_port; + if(*unused != -99) { + *iptt=*ntx; + return 0; + } +// ### + + /* In the very unlikely event of a NULL pointer, just return. + * Yes, I realise this should not be possible in WSJT. + */ + if (ptt_port == NULL) { + *iptt = *ntx; + return (0); + } + + switch (state) { + case STATE_PORT_CLOSED: + + /* Remove trailing ' ' */ + if ((p = strchr(ptt_port, ' ')) != NULL) + *p = '\0'; + + /* If all that is left is a '\0' then also just return */ + if (*ptt_port == '\0') { + *iptt = *ntx; + return(0); + } + + if ((fd = open(ptt_port, O_RDWR|O_NONBLOCK)) < 0) { + fprintf(stderr, "Can't open %s.\n", ptt_port); + return (1); + } + + if (dev_is_parport(fd)) { + state = STATE_PORT_OPEN_PARALLEL; + lp_reset(fd); + ptt_parallel(fd, ntx, iptt); + } else { + state = STATE_PORT_OPEN_SERIAL; + ptt_serial(fd, ntx, iptt); + } + break; + + case STATE_PORT_OPEN_PARALLEL: + ptt_parallel(fd, ntx, iptt); + break; + + case STATE_PORT_OPEN_SERIAL: + ptt_serial(fd, ntx, iptt); + break; + + default: + close(fd); + fd = -1; + state = STATE_PORT_CLOSED; + break; + } + return(0); +} + +/* + * ptt_serial + * + * generic serial unix PTT routine called indirectly from Fortran + * + * fd - already opened file descriptor + * ntx - pointer to fortran command on or off + * iptt - pointer to fortran command status on or off + */ + +int +ptt_serial(int fd, int *ntx, int *iptt) +{ + int control = TIOCM_RTS | TIOCM_DTR; + +#if defined (TIOCMBIS) && defined (TIOCMBIS) + if(*ntx) { + ioctl(fd, TIOCMBIS, &control); /* Set DTR and RTS */ + *iptt = 1; + } else { + ioctl(fd, TIOCMBIC, &control); + *iptt = 0; + } +#else + unsigned y; + ioctl(fd, TIOCMGET, &y); + if (*ntx) { + y |= control; + } else { + y &= ~control; + } + ioctl(fd, TIOCMSET, &y); +#endif + return(0); +} + + +/* parport functions */ + +/* + * dev_is_parport(fd): + * + * inputs - Already open fd + * output - 1 if parallel port, 0 if not + * side effects - Unfortunately, this is platform specific. + */ + +#if defined(HAVE_LINUX_PPDEV_H) /* Linux (ppdev) */ + +int +dev_is_parport(int fd) +{ + struct stat st; + int m; + + if ((fstat(fd, &st) == -1) || + ((st.st_mode & S_IFMT) != S_IFCHR) || + (ioctl(fd, PPGETMODE, &m) == -1)) + return(0); + + return(1); +} + +#elif defined(HAVE_DEV_PPBUS_PPI_H) /* FreeBSD (ppbus/ppi) */ + +int +dev_is_parport(int fd) +{ + struct stat st; + unsigned char c; + + if ((fstat(fd, &st) == -1) || + ((st.st_mode & S_IFMT) != S_IFCHR) || + (ioctl(fd, PPISSTATUS, &c) == -1)) + return(0); + + return(1); +} + +#else /* Fallback (nothing) */ + +int +dev_is_parport(int fd) +{ + return(0); +} + +#endif +/* Linux wrapper around PPFCONTROL */ +#ifdef HAVE_LINUX_PPDEV_H +static void +parport_control (int fd, unsigned char controlbits, int values) +{ + struct ppdev_frob_struct frob; + frob.mask = controlbits; + frob.val = values; + + if (ioctl (fd, PPFCONTROL, &frob) == -1) + { + fprintf(stderr, "Parallel port PPFCONTROL"); + exit (1); + } +} +#endif + +/* FreeBSD wrapper around PPISCTRL */ +#ifdef HAVE_DEV_PPBUS_PPI_H +static void +parport_control (int fd, unsigned char controlbits, int values) +{ + unsigned char val; + + if (ioctl (fd, PPIGCTRL, &val) == -1) + { + fprintf(stderr, "Parallel port PPIGCTRL"); + exit (1); + } + + val &= ~controlbits; + val |= values; + + if (ioctl (fd, PPISCTRL, &val) == -1) + { + fprintf(stderr, "Parallel port PPISCTRL"); + exit (1); + } +} +#endif + +/* Initialise a parallel port, given open fd */ +int +lp_init (int fd) +{ +#ifdef HAVE_LINUX_PPDEV_H + int mode; +#endif + +#ifdef HAVE_LINUX_PPDEV_H + mode = PARPORT_MODE_PCSPP; + + if (ioctl (fd, PPSETMODE, &mode) == -1) + { + fprintf(stderr, "Setting parallel port mode"); + close (fd); + return(-1); + } + + if (ioctl (fd, PPEXCL, NULL) == -1) + { + fprintf(stderr, "Parallel port is already in use.\n"); + close (fd); + return(-1); + } + if (ioctl (fd, PPCLAIM, NULL) == -1) + { + fprintf(stderr, "Claiming parallel port.\n"); + fprintf(stderr, "HINT: did you unload the lp kernel module?"); + close (fd); + return(-1); + } + + /* Enable CW & PTT - /STROBE bit (pin 1) */ + parport_control (fd, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE); +#endif +#ifdef HAVE_DEV_PPBUS_PPI_H + parport_control (fd, STROBE, STROBE); +#endif + lp_reset (fd); + return(0); +} + +/* release ppdev and close port */ +int +lp_free (int fd) +{ +#ifdef HAVE_LINUX_PPDEV_H + lp_reset (fd); + + /* Disable CW & PTT - /STROBE bit (pin 1) */ + parport_control (fd, PARPORT_CONTROL_STROBE, 0); + + ioctl (fd, PPRELEASE); +#endif +#ifdef HAVE_DEV_PPBUS_PPI_H + /* Disable CW & PTT - /STROBE bit (pin 1) */ + parport_control (fd, STROBE, 0); +#endif + close (fd); + return(0); +} + +/* set to a known state */ +int +lp_reset (int fd) +{ +#if defined (HAVE_LINUX_PPDEV_H) || defined (HAVE_DEV_PPBUS_PPI_H) + lp_ptt (fd, 0); +#endif + return(0); +} + +/* SSB PTT keying - /INIT bit (pin 16) (inverted) */ +int +lp_ptt (int fd, int onoff) +{ +#ifdef HAVE_LINUX_PPDEV_H + if (onoff == 1) + parport_control (fd, PARPORT_CONTROL_INIT, + PARPORT_CONTROL_INIT); + else + parport_control (fd, PARPORT_CONTROL_INIT, 0); +#endif +#ifdef HAVE_DEV_PPBUS_PPI_H + if (onoff == 1) + parport_control (fd, nINIT, + nINIT); + else + parport_control (fd, nINIT, 0); +#endif + return(0); +} + +/* + * ptt_parallel + * + * generic parallel unix PTT routine called indirectly from Fortran + * + * fd - already opened file descriptor + * ntx - pointer to fortran command on or off + * iptt - pointer to fortran command status on or off + */ + +int +ptt_parallel(int fd, int *ntx, int *iptt) +{ + if(*ntx) { + lp_ptt(fd, 1); + *iptt=1; + } else { + lp_ptt(fd, 0); + *iptt=0; + } + return(0); +} diff --git a/map65/libm65/q65b.f90 b/map65/libm65/q65b.f90 new file mode 100644 index 000000000..c85e3be3d --- /dev/null +++ b/map65/libm65/q65b.f90 @@ -0,0 +1,164 @@ +subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & + mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain,max_drift,idec) + +! This routine provides an interface between MAP65 and the Q65 decoder +! in WSJT-X. All arguments are input data obtained from the MAP65 GUI. +! Raw Rx data are available as the 96 kHz complex spectrum ca(MAXFFT1) +! in common/cacb. If xpol is true, we also have cb(MAXFFT1) for the +! orthogonal polarization. Decoded messages are sent back to the GUI +! on stdout. + +! use wavhdr + use q65_decode + use wideband_sync + use timer_module, only: timer + + parameter (MAXFFT1=5376000) !56*96000 + parameter (MAXFFT2=336000) !56*6000 (downsampled by 1/16) + parameter (NMAX=60*12000) +! type(hdr) h !Header for the .wav file + integer*2 iwave(60*12000) + complex ca(MAXFFT1),cb(MAXFFT1) !FFTs of raw x,y data + complex cx(0:MAXFFT2-1),cy(0:MAXFFT2-1),cz(0:MAXFFT2) + logical xpol + integer ipk1(1) + real*8 fcenter,freq0 + character*12 mycall0,hiscall0 + character*12 mycall,hiscall + character*6 hisgrid + character*4 grid4 + character*80 line + character*80 wsjtx_dir + common/cacb/ca,cb + save + + open(9,file='wsjtx_dir.txt',status='old') + read(9,'(a)') wsjtx_dir !Establish the working directory + close(9) + + if(mycall0(1:1).ne.' ') mycall=mycall0 + if(hiscall0(1:1).ne.' ') hiscall=hiscall0 + if(hisgrid(1:4).ne.' ') grid4=hisgrid(1:4) + +! Find best frequency and ipol from sync_dat, the "orange sync curve". + df3=96000.0/32768.0 + ifreq=nint((1000.0*f0)/df3) + ia=nint(ifreq-ntol/df3) + ib=nint(ifreq+ntol/df3) + ipk1=maxloc(sync(ia:ib)%ccfmax) + ipk=ia+ipk1(1)-1 + snr1=sync(ipk)%ccfmax + + ipol=1 + if(xpol) ipol=sync(ipk)%ipol + + nfft1=MAXFFT1 + nfft2=MAXFFT2 + df=96000.0/NFFT1 + if(nfsample.eq.95238) then + nfft1=5120000 + nfft2=322560 + df=96000.0/nfft1 + endif + nh=nfft2/2 + f_mouse=1000.0*(fqso+48.0) + mousedf + f_ipk=ipk*df3 + k0=nint((ipk*df3-1000.0)/df) + if(nagain.eq.1) k0=nint((f_mouse-1000.0)/df) + + if(k0.lt.nh .or. k0.gt.MAXFFT1-nfft2+1) go to 900 + if(snr1.lt.1.5) go to 900 !### Threshold needs work? ### + + fac=1.0/nfft2 + cx(0:nfft2-1)=ca(k0:k0+nfft2-1) + cx=fac*cx + if(xpol) then + cy(0:nfft2-1)=cb(k0:k0+nfft2-1) + cy=fac*cy + endif + +! Here cx and cy (if xpol) are frequency-domain data around the selected +! QSO frequency, taken from the full-length FFT computed in filbig(). +! Values for fsample, nfft1, nfft2, df, and the downsampled data rate +! are as follows: + +! fSample nfft1 df nfft2 fDownSampled +! (Hz) (Hz) (Hz) +!---------------------------------------------------- +! 96000 5376000 0.017857143 336000 6000.000 +! 95238 5120000 0.018601172 322560 5999.994 + + if(ipol.eq.1) cz(0:MAXFFT2-1)=cx + if(ipol.eq.2) cz(0:MAXFFT2-1)=0.707*(cx+cy) + if(ipol.eq.3) cz(0:MAXFFT2-1)=cy + if(ipol.eq.4) cz(0:MAXFFT2-1)=0.707*(cx-cy) + cz(MAXFFT2)=0. +! Roll off below 500 Hz and above 2500 Hz. + ja=nint(500.0/df) + jb=nint(2500.0/df) + do i=0,ja + r=0.5*(1.0+cos(i*3.14159/ja)) + cz(ja-i)=r*cz(ja-i) + cz(jb+i)=r*cz(jb+i) + enddo + cz(ja+jb+1:)=0. + +!Transform to time domain (real), fsample=12000 Hz + call four2a(cz,2*nfft2,1,1,-1) + do i=0,nfft2-1 + j=nfft2-1-i + iwave(2*i+2)=nint(real(cz(j))) !Note the reversed order! + iwave(2*i+1)=nint(aimag(cz(j))) + enddo + iwave(2*nfft2+1:)=0 + +! open(30,file='000000_0001.wav',status='unknown',access='stream') +! h=default_header(12000,NMAX) +! write(30) h,iwave +! close(30) + + nsubmode=mode_q65-1 + nfa=990 !Tight limits around ipk for the wideband decode + nfb=1010 + if(nagain.eq.1) then !For nagain=1, use limits of +/- ntol + nfa=max(100,1000-ntol) + nfb=min(2500,1000+ntol) + endif + nsnr0=-99 !Default snr for no decode + +! NB: Frequency of ipk is now shifted to 1000 Hz. + call map65_mmdec(nutc,iwave,nqd,nsubmode,nfa,nfb,1000,ntol, & + newdat,nagain,max_drift,mycall,hiscall,hisgrid) + + MHz=fcenter + freq0=MHz + 0.001*ikhz + + if(nsnr0.gt.-99) then + nq65df=nint(1000*(0.001*k0*df+nkhz_center-48.0+1.000-1.27046-ikhz))-nfcal + nq65df=nq65df + nfreq0 - 1000 + + if(nqd.eq.1 .and. abs(nq65df-mousedf).lt.ntol) then + write(line,1020) ikhz,nq65df,45*(ipol-1),nutc,xdt0,nsnr0,msg0(1:27),cq0 +1020 format('!',i3.3,i5,i4,i6.4,f5.1,i5,' : ',a27,a3) + write(*,1100) trim(line) +1100 format(a) + endif + +! Write to lu 26, for Messages and Band Map windows + write(26,1014) freq0,nq65df,0,0,0,xdt0,45*(ipol-1),0, & + nsnr0,nutc,msg0(1:22),':',char(ichar('A') + mode_q65-1) +1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,2x,a1,3x,':',a1) + +! Write to file map65_rx.log: + write(21,1110) freq0,nq65df,xdt0,45*(ipol-1),nsnr0,nutc,msg0(1:28),cq0 +1110 format(f8.3,i5,f5.1,2i4,i5.4,2x,a28,': A',2x,a3) + endif + +900 close(13) + close(17) + call flush(6) + idec=-1 + read(cq0(2:2),*) idec + + return +end subroutine q65b diff --git a/map65/libm65/recvpkt.f90 b/map65/libm65/recvpkt.f90 new file mode 100644 index 000000000..6b686a245 --- /dev/null +++ b/map65/libm65/recvpkt.f90 @@ -0,0 +1,71 @@ +subroutine recvpkt(nsam,nblock2,userx_no,k,buf4,buf8,buf16) + +! Reformat timf2 data from Linrad and stuff data into r*4 array dd(). + + parameter (NSMAX=60*96000) !Total sample intervals per minute + parameter (NFFT=32768) + integer*1 userx_no + real*4 d4,buf4(*) !(348) + real*8 d8,buf8(*) !(174) + complex*16 c16,buf16(*) !(87) + integer*2 jd(4),kd(2),nblock2 + real*4 xd(4),yd(2) + real*8 fcenter + common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fcenter,nutc,junk(36) + equivalence (kd,d4) + equivalence (jd,d8,yd) + equivalence (xd,c16) + + if(nblock2.eq.-9999) nblock2=-9998 !Silence a compiler warning + if(nsam.eq.-1) then +! Move data from the UDP packet buffer into array dd(). + if(userx_no.eq.-1) then + do i=1,174 !One RF channel, r*4 data + k=k+1 + d8=buf8(i) + dd(1,k)=yd(1) + dd(2,k)=yd(2) + enddo + else if(userx_no.eq.1) then + do i=1,348 !One RF channel, i*2 data + k=k+1 + d4=buf4(i) + dd(1,k)=kd(1) + dd(2,k)=kd(2) + enddo + else if(userx_no.eq.-2) then + do i=1,87 !Two RF channels, r*4 data + k=k+1 + c16=buf16(i) + dd(1,k)=xd(1) + dd(2,k)=xd(2) + dd(3,k)=xd(3) + dd(4,k)=xd(4) + enddo + else if(userx_no.eq.2) then + do i=1,174 !Two RF channels, i*2 data + k=k+1 + d8=buf8(i) + dd(1,k)=jd(1) + dd(2,k)=jd(2) + dd(3,k)=jd(3) + dd(4,k)=jd(4) + enddo + endif + else + if(userx_no.eq.1) then + do i=1,nsam !One RF channel, r*4 data + k=k+1 + d4=buf4(i) + dd(1,k)=kd(1) + dd(2,k)=kd(2) + + k=k+1 + dd(1,k)=kd(1) + dd(2,k)=kd(2) + enddo + endif + endif + + return +end subroutine recvpkt diff --git a/map65/libm65/rfile3a.f90 b/map65/libm65/rfile3a.f90 new file mode 100644 index 000000000..7e2266513 --- /dev/null +++ b/map65/libm65/rfile3a.f90 @@ -0,0 +1,14 @@ +subroutine rfile3a(infile,ibuf,n,fcenter,ierr) + + character*(*) infile + integer*8 ibuf(n) + real*8 fcenter + + open(10,file=infile,access='stream',status='old',err=998) + read(10,end=998) (ibuf(i),i=1,n/8),fcenter + ierr=0 + go to 999 +998 ierr=1002 +999 close(10) + return +end subroutine rfile3a diff --git a/map65/libm65/rs.h b/map65/libm65/rs.h new file mode 100644 index 000000000..06cbe344f --- /dev/null +++ b/map65/libm65/rs.h @@ -0,0 +1,35 @@ +/* User include file for the Reed-Solomon codec + * Copyright 2002, Phil Karn KA9Q + * May be used under the terms of the GNU General Public License (GPL) + */ + +/* General purpose RS codec, 8-bit symbols */ +void encode_rs_char(void *rs,unsigned char *data,unsigned char *parity); +int decode_rs_char(void *rs,unsigned char *data,int *eras_pos, + int no_eras); +void *init_rs_char(int symsize,int gfpoly, + int fcr,int prim,int nroots, + int pad); +void free_rs_char(void *rs); + +/* General purpose RS codec, integer symbols */ +void encode_rs_int(void *rs,int *data,int *parity); +int decode_rs_int(void *rs,int *data,int *eras_pos,int no_eras); +void *init_rs_int(int symsize,int gfpoly,int fcr, + int prim,int nroots,int pad); +void free_rs_int(void *rs); + +/* CCSDS standard (255,223) RS codec with conventional (*not* dual-basis) + * symbol representation + */ +void encode_rs_8(unsigned char *data,unsigned char *parity,int pad); +int decode_rs_8(unsigned char *data,int *eras_pos,int no_eras,int pad); + +/* CCSDS standard (255,223) RS codec with dual-basis symbol representation */ +void encode_rs_ccsds(unsigned char *data,unsigned char *parity,int pad); +int decode_rs_ccsds(unsigned char *data,int *eras_pos,int no_eras,int pad); + +/* Tables to map from conventional->dual (Taltab) and + * dual->conventional (Tal1tab) bases + */ +extern unsigned char Taltab[],Tal1tab[]; diff --git a/map65/libm65/rs2.h b/map65/libm65/rs2.h new file mode 100644 index 000000000..c2b807d15 --- /dev/null +++ b/map65/libm65/rs2.h @@ -0,0 +1,16 @@ +/* User include file for the Reed-Solomon codec + * Copyright 2002, Phil Karn KA9Q + * May be used under the terms of the GNU General Public License (GPL) + */ + +/* General purpose RS codec, integer symbols */ +void encode_rs_int(void *rs,int *data,int *parity); +int decode_rs_int(void *rs,int *data,int *eras_pos,int no_eras, int calc_syn); +void *init_rs_int(int symsize,int gfpoly,int fcr, + int prim,int nroots,int pad); +void free_rs_int(void *rs); + +/* Tables to map from conventional->dual (Taltab) and + * dual->conventional (Tal1tab) bases + */ +extern unsigned char Taltab[],Tal1tab[]; diff --git a/map65/libm65/s3avg.f90 b/map65/libm65/s3avg.f90 new file mode 100644 index 000000000..9d76637c4 --- /dev/null +++ b/map65/libm65/s3avg.f90 @@ -0,0 +1,60 @@ +subroutine s3avg(nsave,mode65,nutc,nhz,xdt,npol,ntol,s3,nsum,nkv,decoded) + +! Save the current synchronized spectra, s3(64,63), for possible +! decoding of average. + + real s3(64,63) !Synchronized spectra for 63 symbols + real s3a(64,63,64) !Saved spectra + real s3b(64,63) !Average spectra + integer iutc(64),ihz(64),ipol(64) + real dt(64) + character*22 decoded + logical ltext,first + data first/.true./ + save + + if(first) then + iutc=-1 + ihz=0 + ipol=0 + first=.false. + ihzdiff=min(100,ntol) + dtdiff=0.2 + endif + + do i=1,64 + if(nutc.eq.iutc(i) .and. abs(nhz-ihz(i)).lt.ihzdiff) then + nsave=mod(nsave-1+64,64)+1 + go to 10 + endif + enddo + + iutc(nsave)=nutc !Save UTC + ihz(nsave)=nhz !Save freq in Hz + ipol(nsave)=npol !Save pol + dt(nsave)=xdt !Save DT + s3a(1:64,1:63,nsave)=s3 !Save the spectra + +10 s3b=0. + do i=1,64 !Accumulate avg spectra + if(iutc(i).lt.0) cycle + if(mod(iutc(i),2).ne.mod(nutc,2)) cycle !Use only same sequence + if(abs(nhz-ihz(i)).gt.ihzdiff) cycle !Freq must match + if(abs(xdt-dt(i)).gt.dtdiff) cycle !DT must match + s3b=s3b + s3a(1:64,1:63,i) + nsum=nsum+1 + enddo + + decoded=' ' + if(nsum.ge.2) then !Try decoding the sverage + nadd=mode65*nsum + call extract(s3b,nadd,ncount,nhist,decoded,ltext) !Extract the message + nkv=nsum + if(ncount.lt.0) then + nkv=0 + decoded=' ' + endif + endif + + return +end subroutine s3avg diff --git a/map65/libm65/sec_midn.f90 b/map65/libm65/sec_midn.f90 new file mode 100644 index 000000000..0bbe62c2c --- /dev/null +++ b/map65/libm65/sec_midn.f90 @@ -0,0 +1,11 @@ +real function sec_midn() + sec_midn=secnds(0.0) + return +end function sec_midn + +subroutine sleep_msec(n) + + call usleep(1000*n) + + return +end subroutine sleep_msec diff --git a/map65/libm65/set.f90 b/map65/libm65/set.f90 new file mode 100644 index 000000000..ff7679889 --- /dev/null +++ b/map65/libm65/set.f90 @@ -0,0 +1,31 @@ +subroutine set(a,y,n) + real y(n) + do i=1,n + y(i)=a + enddo + return +end subroutine set + +subroutine move(x,y,n) + real x(n),y(n) + do i=1,n + y(i)=x(i) + enddo + return +end subroutine move + +subroutine zero(x,n) + real x(n) + do i=1,n + x(i)=0.0 + enddo + return +end subroutine zero + +subroutine add(a,b,c,n) + real a(n),b(n),c(n) + do i=1,n + c(i)=a(i)+b(i) + enddo + return +end subroutine add diff --git a/map65/libm65/setup65.f90 b/map65/libm65/setup65.f90 new file mode 100644 index 000000000..b1a867d18 --- /dev/null +++ b/map65/libm65/setup65.f90 @@ -0,0 +1,96 @@ +subroutine setup65 + +! Defines arrays related to the JT65 pseudo-random synchronizing pattern. +! Executed at program start. + + integer nprc(126) + common/prcom/pr(126),mdat(126),mref(126,2),mdat2(126),mref2(126,2) + +! JT65 + data nprc/ & + 1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & + 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & + 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & + 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & + 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & + 1,1,1,1,1,1/ + data mr2/0/ !Silence compiler warning + +! Put the appropriate pseudo-random sequence into pr + nsym=126 + do i=1,nsym + pr(i)=2*nprc(i)-1 + enddo + +! Determine locations of data and reference symbols + k=0 + mr1=0 + do i=1,nsym + if(pr(i).lt.0.0) then + k=k+1 + mdat(k)=i + else + mr2=i + if(mr1.eq.0) mr1=i + endif + enddo + nsig=k + +! Determine the reference symbols for each data symbol. + do k=1,nsig + m=mdat(k) + mref(k,1)=mr1 + do n=1,10 !Get ref symbol before data + if((m-n).gt.0) then + if (pr(m-n).gt.0.0) go to 10 + endif + enddo + go to 12 +10 mref(k,1)=m-n +12 mref(k,2)=mr2 + do n=1,10 !Get ref symbol after data + if((m+n).le.nsym) then + if (pr(m+n).gt.0.0) go to 20 + endif + enddo + go to 22 +20 mref(k,2)=m+n +22 enddo + +! Now do it all again, using opposite logic on pr(i) + k=0 + mr1=0 + do i=1,nsym + if(pr(i).gt.0.0) then + k=k+1 + mdat2(k)=i + else + mr2=i + if(mr1.eq.0) mr1=i + endif + enddo + nsig=k + + do k=1,nsig + m=mdat2(k) + mref2(k,1)=mr1 + do n=1,10 + if((m-n).gt.0) then + if (pr(m-n).lt.0.0) go to 110 + endif + enddo + go to 112 +110 mref2(k,1)=m-n +112 mref2(k,2)=mr2 + do n=1,10 + if((m+n).le.nsym) then + if (pr(m+n).lt.0.0) go to 120 + endif + enddo + go to 122 +120 mref2(k,2)=m+n +122 enddo + + return +end subroutine setup65 diff --git a/map65/libm65/shell.f90 b/map65/libm65/shell.f90 new file mode 100644 index 000000000..d7365bfc9 --- /dev/null +++ b/map65/libm65/shell.f90 @@ -0,0 +1,27 @@ +subroutine shell(n,a) + integer n + real a(n) + integer i,j,inc + real v + + inc=1 +1 inc=3*inc+1 + if(inc.le.n) go to 1 +2 inc=inc/3 + + do i=inc+1,n + v=a(i) + j=i +3 if(a(j-inc).gt.v) then + a(j)=a(j-inc) + j=j-inc + if(j.le.inc) go to 4 + go to 3 + endif +4 a(j)=v + enddo + + if(inc.gt.1) go to 2 + + return +end subroutine shell diff --git a/map65/libm65/sleep.h b/map65/libm65/sleep.h new file mode 100644 index 000000000..df60bc92a --- /dev/null +++ b/map65/libm65/sleep.h @@ -0,0 +1,32 @@ +/* + * sleep.h 1.0 02/03/10 + * + * Defines cross-platform sleep, usleep, etc. + * + * By Wu Yongwei + * + */ + +#ifndef _SLEEP_H +#define _SLEEP_H + +#ifdef _WIN32 +# if defined(_NEED_SLEEP_ONLY) && (defined(_MSC_VER) || defined(__MINGW32__)) +# include +# define sleep(t) _sleep((t) * 1000) +# else +# include +# define sleep(t) Sleep((t) * 1000) +# endif +# ifndef _NEED_SLEEP_ONLY +# define msleep(t) Sleep(t) +# define usleep(t) Sleep((t) / 1000) +# endif +#else +# include +# ifndef _NEED_SLEEP_ONLY +# define msleep(t) usleep((t) * 1000) +# endif +#endif + +#endif /* _SLEEP_H */ diff --git a/map65/libm65/sleep_msec.f90 b/map65/libm65/sleep_msec.f90 new file mode 100644 index 000000000..1a8dbe4f9 --- /dev/null +++ b/map65/libm65/sleep_msec.f90 @@ -0,0 +1,4 @@ +subroutine sleep_msec(n) + call usleep(n*1000) + return +end subroutine sleep_msec diff --git a/map65/libm65/smo.f90 b/map65/libm65/smo.f90 new file mode 100644 index 000000000..c42de7c60 --- /dev/null +++ b/map65/libm65/smo.f90 @@ -0,0 +1,19 @@ +subroutine smo(x,npts,y,nadd) + + real x(npts) + real y(npts) + + nh=nadd/2 + do i=1+nh,npts-nh + sum=0. + do j=-nh,nh + sum=sum + x(i+j) + enddo + y(i)=sum + enddo + x=y + x(:nh)=0. + x(npts-nh+1:)=0. + + return +end subroutine smo diff --git a/map65/libm65/sort.f90 b/map65/libm65/sort.f90 new file mode 100644 index 000000000..8a05da288 --- /dev/null +++ b/map65/libm65/sort.f90 @@ -0,0 +1,6 @@ +subroutine sort(n,arr) + + call ssort(arr,tmp,n,1) + + return +end subroutine sort diff --git a/map65/libm65/ssort.f b/map65/libm65/ssort.f new file mode 100644 index 000000000..fa508ace6 --- /dev/null +++ b/map65/libm65/ssort.f @@ -0,0 +1,287 @@ + subroutine ssort (x,y,n,kflag) +c***purpose sort an array and optionally make the same interchanges in +c an auxiliary array. the array may be sorted in increasing +c or decreasing order. a slightly modified quicksort +c algorithm is used. +c +c ssort sorts array x and optionally makes the same interchanges in +c array y. the array x may be sorted in increasing order or +c decreasing order. a slightly modified quicksort algorithm is used. +c +c description of parameters +c x - array of values to be sorted +c y - array to be (optionally) carried along +c n - number of values in array x to be sorted +c kflag - control parameter +c = 2 means sort x in increasing order and carry y along. +c = 1 means sort x in increasing order (ignoring y) +c = -1 means sort x in decreasing order (ignoring y) +c = -2 means sort x in decreasing order and carry y along. + + integer kflag, n +! real x(n), y(n) +! real r, t, tt, tty, ty + integer x(n), y(n) + integer r, t, tt, tty, ty + integer i, ij, j, k, kk, l, m, nn + integer il(21), iu(21) + + nn = n + if (nn .lt. 1) then +! print*,'ssort: The number of sort elements is not positive.' +! print*,'ssort: n = ',nn,' kflag = ',kflag + return + endif +c + kk = abs(kflag) + if (kk.ne.1 .and. kk.ne.2) then + print *, + + 'the sort control parameter, k, is not 2, 1, -1, or -2.' + return + endif +c +c alter array x to get decreasing order if needed +c + if (kflag .le. -1) then + do 10 i=1,nn + x(i) = -x(i) + 10 continue + endif +c + if (kk .eq. 2) go to 100 +c +c sort x only +c + m = 1 + i = 1 + j = nn + r = 0.375e0 +c + 20 if (i .eq. j) go to 60 + if (r .le. 0.5898437e0) then + r = r+3.90625e-2 + else + r = r-0.21875e0 + endif +c + 30 k = i +c +c select a central element of the array and save it in location t +c + ij = i + int((j-i)*r) + t = x(ij) +c +c if first element of array is greater than t, interchange with t +c + if (x(i) .gt. t) then + x(ij) = x(i) + x(i) = t + t = x(ij) + endif + l = j +c +c if last element of array is less than than t, interchange with t +c + if (x(j) .lt. t) then + x(ij) = x(j) + x(j) = t + t = x(ij) +c +c if first element of array is greater than t, interchange with t +c + if (x(i) .gt. t) then + x(ij) = x(i) + x(i) = t + t = x(ij) + endif + endif +c +c find an element in the second half of the array which is smaller +c than t +c + 40 l = l-1 + if (x(l) .gt. t) go to 40 +c +c find an element in the first half of the array which is greater +c than t +c + 50 k = k+1 + if (x(k) .lt. t) go to 50 +c +c interchange these elements +c + if (k .le. l) then + tt = x(l) + x(l) = x(k) + x(k) = tt + go to 40 + endif +c +c save upper and lower subscripts of the array yet to be sorted +c + if (l-i .gt. j-k) then + il(m) = i + iu(m) = l + i = k + m = m+1 + else + il(m) = k + iu(m) = j + j = l + m = m+1 + endif + go to 70 +c +c begin again on another portion of the unsorted array +c + 60 m = m-1 + if (m .eq. 0) go to 190 + i = il(m) + j = iu(m) +c + 70 if (j-i .ge. 1) go to 30 + if (i .eq. 1) go to 20 + i = i-1 +c + 80 i = i+1 + if (i .eq. j) go to 60 + t = x(i+1) + if (x(i) .le. t) go to 80 + k = i +c + 90 x(k+1) = x(k) + k = k-1 + if (t .lt. x(k)) go to 90 + x(k+1) = t + go to 80 +c +c sort x and carry y along +c + 100 m = 1 + i = 1 + j = nn + r = 0.375e0 +c + 110 if (i .eq. j) go to 150 + if (r .le. 0.5898437e0) then + r = r+3.90625e-2 + else + r = r-0.21875e0 + endif +c + 120 k = i +c +c select a central element of the array and save it in location t +c + ij = i + int((j-i)*r) + t = x(ij) + ty = y(ij) +c +c if first element of array is greater than t, interchange with t +c + if (x(i) .gt. t) then + x(ij) = x(i) + x(i) = t + t = x(ij) + y(ij) = y(i) + y(i) = ty + ty = y(ij) + endif + l = j +c +c if last element of array is less than t, interchange with t +c + if (x(j) .lt. t) then + x(ij) = x(j) + x(j) = t + t = x(ij) + y(ij) = y(j) + y(j) = ty + ty = y(ij) +c +c if first element of array is greater than t, interchange with t +c + if (x(i) .gt. t) then + x(ij) = x(i) + x(i) = t + t = x(ij) + y(ij) = y(i) + y(i) = ty + ty = y(ij) + endif + endif +c +c find an element in the second half of the array which is smaller +c than t +c + 130 l = l-1 + if (x(l) .gt. t) go to 130 +c +c find an element in the first half of the array which is greater +c than t +c + 140 k = k+1 + if (x(k) .lt. t) go to 140 +c +c interchange these elements +c + if (k .le. l) then + tt = x(l) + x(l) = x(k) + x(k) = tt + tty = y(l) + y(l) = y(k) + y(k) = tty + go to 130 + endif +c +c save upper and lower subscripts of the array yet to be sorted +c + if (l-i .gt. j-k) then + il(m) = i + iu(m) = l + i = k + m = m+1 + else + il(m) = k + iu(m) = j + j = l + m = m+1 + endif + go to 160 +c +c begin again on another portion of the unsorted array +c + 150 m = m-1 + if (m .eq. 0) go to 190 + i = il(m) + j = iu(m) +c + 160 if (j-i .ge. 1) go to 120 + if (i .eq. 1) go to 110 + i = i-1 +c + 170 i = i+1 + if (i .eq. j) go to 150 + t = x(i+1) + ty = y(i+1) + if (x(i) .le. t) go to 170 + k = i +c + 180 x(k+1) = x(k) + y(k+1) = y(k) + k = k-1 + if (t .lt. x(k)) go to 180 + x(k+1) = t + y(k+1) = ty + go to 170 +c +c clean up +c + 190 if (kflag .le. -1) then + do 200 i=1,nn + x(i) = -x(i) + 200 continue + endif + return + end diff --git a/map65/libm65/sun.f90 b/map65/libm65/sun.f90 new file mode 100644 index 000000000..ec011b66c --- /dev/null +++ b/map65/libm65/sun.f90 @@ -0,0 +1,88 @@ +subroutine sun(y,m,DD,UT,lon,lat,RA,Dec,LST,Az,El,mjd,day) + + implicit none + + integer y !Year + integer m !Month + integer DD !Day + integer mjd !Modified Julian Date + real UT !UTC in hours + real RA,Dec !RA and Dec of sun + +! NB: Double caps here are single caps in the writeup. + +! Orbital elements of the Sun (also N=0, i=0, a=1): + real w !Argument of perihelion + real e !Eccentricity + real MM !Mean anomaly + real Ls !Mean longitude + +! Other standard variables: + real v !True anomaly + real EE !Eccentric anomaly + real ecl !Obliquity of the ecliptic + real d !Ephemeris time argument in days + real r !Distance to sun, AU + real xv,yv !x and y coords in ecliptic + real lonsun !Ecliptic long and lat of sun +! Ecliptic coords of sun (geocentric) + real xs,ys +! Equatorial coords of sun (geocentric) + real xe,ye,ze + real lon,lat + real GMST0,LST,HA + real xx,yy,zz + real xhor,yhor,zhor + real Az,El + + real day + real rad + data rad/57.2957795/ + +! Time in days, with Jan 0, 2000 equal to 0.0: + d=367*y - 7*(y+(m+9)/12)/4 + 275*m/9 + DD - 730530 + UT/24.0 + mjd=d + 51543 + ecl = 23.4393 - 3.563e-7 * d + +! Compute updated orbital elements for Sun: + w = 282.9404 + 4.70935e-5 * d + e = 0.016709 - 1.151e-9 * d + MM = mod(356.0470d0 + 0.9856002585d0 * d + 360000.d0,360.d0) + Ls = mod(w+MM+720.0,360.0) + + EE = MM + e*rad*sin(MM/rad) * (1.0 + e*cos(M/rad)) + EE = EE - (EE - e*rad*sin(EE/rad)-MM) / (1.0 - e*cos(EE/rad)) + + xv = cos(EE/rad) - e + yv = sqrt(1.0-e*e) * sin(EE/rad) + v = rad*atan2(yv,xv) + r = sqrt(xv*xv + yv*yv) + lonsun = mod(v + w + 720.0,360.0) +! Ecliptic coordinates of sun (rectangular): + xs = r * cos(lonsun/rad) + ys = r * sin(lonsun/rad) + +! Equatorial coordinates of sun (rectangular): + xe = xs + ye = ys * cos(ecl/rad) + ze = ys * sin(ecl/rad) + +! RA and Dec in degrees: + RA = rad*atan2(ye,xe) + Dec = rad*atan2(ze,sqrt(xe*xe + ye*ye)) + + GMST0 = (Ls + 180.0)/15.0 + LST = mod(GMST0+UT+lon/15.0+48.0,24.0) !LST in hours + HA = 15.0*LST - RA !HA in degrees + xx = cos(HA/rad)*cos(Dec/rad) + yy = sin(HA/rad)*cos(Dec/rad) + zz = sin(Dec/rad) + xhor = xx*sin(lat/rad) - zz*cos(lat/rad) + yhor = yy + zhor = xx*cos(lat/rad) + zz*sin(lat/rad) + Az = mod(rad*atan2(yhor,xhor) + 180.0 + 360.0,360.0) + El = rad*asin(zhor) + day=d-1.5 + + return +end subroutine sun diff --git a/map65/libm65/symspec.f90 b/map65/libm65/symspec.f90 new file mode 100644 index 000000000..f7652ca06 --- /dev/null +++ b/map65/libm65/symspec.f90 @@ -0,0 +1,222 @@ +subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & + fgreen,iqadjust,iqapply,gainx,gainy,phasex,phasey,rejectx,rejecty, & + pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong) + +! k pointer to the most recent new data +! nxpol 0/1 to indicate single- or dual-polarization +! ndiskdat 0/1 to indicate if data from disk +! nb 0/1 status of noise blanker +! idphi Phase correction for Y channel, degrees +! nfsample sample rate (Hz) +! fgreen Frequency of green marker in I/Q calibrate mode (-48.0 to +48.0 kHz) +! iqadjust 0/1 to indicate whether IQ adjustment is active +! iqapply 0/1 to indicate whether to apply I/Q calibration +! pxdb power in x channel (0-60 dB) +! pydb power in y channel (0-60 dB) +! ssz5a polarized spectrum, for waterfall display +! nkhz integer kHz portion of center frequency, e.g., 125 for 144.125 +! ihsym index number of this half-symbol (1-322) +! nzap number of samples zero'ed by noise blanker + + parameter (NSMAX=60*96000) !Total sample intervals per minute + parameter (NFFT=32768) !Length of FFTs + real*8 ts,hsym + real*8 fcenter + common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fcenter,nutc,junk(36) + real*4 ssz5a(NFFT),w(NFFT),w2a(NFFT),w2b(NFFT) + complex z,zfac + complex zsumx,zsumy + complex cx(NFFT),cy(NFFT) + complex cx00(NFFT),cy00(NFFT) + complex cx0(0:1023),cx1(0:1023) + complex cy0(0:1023),cy1(0:1023) + logical*1 lstrong(0:1023) + data rms/999.0/,k0/99999999/,nadjx/0/,nadjy/0/ + save + + nfast=1 + if(k.gt.5751000) go to 999 + if(k.lt.NFFT) then + ihsym=0 + go to 999 !Wait for enough samples to start + endif + if(k0.eq.99999999) then + pi=4.0*atan(1.0) + w2a=0. + w2b=0. + do i=1,NFFT + w(i)=(sin(i*pi/NFFT))**2 !Window for nfast=1 + if(i.lt.17833) w2a(i)=(sin(i*pi/17832.925))**2 !Window a for nfast=2 + j=i-8916 + if(j.gt.0 .and. j.lt.17833) w2b(i)=(sin(j*pi/17832.925))**2 ! b + enddo + w2a=sqrt(2.0)*w2a + w2b=sqrt(2.0)*w2b + endif + + hsym=2048.d0*96000.d0/11025.d0 !Samples per JT65 half-symbol + if(nfsample.eq.95238) hsym=2048.d0*95238.1d0/11025.d0 + + if(k.lt.k0) then + ts=1.d0 - hsym + savg=0. + ihsym=0 + k1=0 + if(ndiskdat.eq.0) dd(1:4,k+1:5760000)=0. !### Should not be needed ??? ### + endif + k0=k + + nzap=0 + sigmas=1.5*(10.0**(0.01*nbslider)) + 0.7 + peaklimit=sigmas*max(10.0,rms) + faclim=3.0 + px=0. + py=0. + + iqapply0=0 + iqadjust0=0 + if(iqadjust.ne.0) iqapply0=0 + nwindow=2 +! nwindow=0 !### No windowing ### + nfft2=1024 + kstep=nfft2 + if(nwindow.ne.0) kstep=nfft2/2 + nblks=(k-k1)/kstep + do nblk=1,nblks + j=k1+1 + do i=0,nfft2-1 + cx0(i)=cmplx(dd(1,j+i),dd(2,j+i)) + if(nxpol.ne.0) cy0(i)=cmplx(dd(3,j+i),dd(4,j+i)) + enddo + call timf2(k,nxpol,nfft2,nwindow,nb,peaklimit,iqadjust0,iqapply0, & + faclim,cx0,cy0,gainx,gainy,phasex,phasey,cx1,cy1,slimit,lstrong, & + px,py,nzap) + + do i=0,kstep-1 + dd(1,j+i)=real(cx1(i)) + dd(2,j+i)=aimag(cx1(i)) + if(nxpol.ne.0) then + dd(3,j+i)=real(cy1(i)) + dd(4,j+i)=aimag(cy1(i)) + endif + enddo + k1=k1+kstep + enddo + + npts=NFFT !Samples used in each half-symbol FFT + + ts=ts+hsym + ja=ts !Index of first sample + jb=ja+npts-1 !Last sample + + i=0 + fac=0.0002 + dphi=idphi/57.2957795 + zfac=fac*cmplx(cos(dphi),sin(dphi)) + do j=ja,jb !Copy data into cx, cy + x1=dd(1,j) + x2=dd(2,j) + if(nxpol.ne.0) then + x3=dd(3,j) + x4=dd(4,j) + else + x3=0. + x4=0. + endif + i=i+1 + cx(i)=fac*cmplx(x1,x2) + cy(i)=zfac*cmplx(x3,x4) !NB: cy includes dphi correction + enddo + + if(nzap/178.lt.50 .and. (ndiskdat.eq.0 .or. ihsym.lt.280)) then + nsum=nblks*kstep - nzap + if(nsum.le.0) nsum=1 + rmsx=sqrt(0.5*px/nsum) + rmsy=sqrt(0.5*py/nsum) + rms=rmsx + if(nxpol.ne.0) rms=sqrt((px+py)/(4.0*nsum)) + endif + pxdb=0. + pydb=0. + if(rmsx.gt.1.0) pxdb=20.0*log10(rmsx) + if(rmsy.gt.1.0) pydb=20.0*log10(rmsy) + if(pxdb.gt.60.0) pxdb=60.0 + if(pydb.gt.60.0) pydb=60.0 + + cx00=cx + if(nxpol.ne.0) cy00=cy + + do mm=1,nfast + ihsym=ihsym+1 + if(nfast.eq.1) then + cx=w*cx00 !Apply window for 2nd forward FFT + if(nxpol.ne.0) cy=w*cy00 + else + if(mm.eq.1) then + cx=w2a*cx00 + if(nxpol.ne.0) cy=w2a*cy00 + else + cx=w2b*cx00 + if(nxpol.ne.0) cy=w2b*cy00 + endif + endif + + call four2a(cx,NFFT,1,1,1) !Second forward FFT (X) + if(iqadjust.eq.0) nadjx=0 + if(iqadjust.ne.0 .and. nadjx.lt.50) call iqcal(nadjx,cx,NFFT, & + gainx,phasex,zsumx,ipkx,rejectx0) + if(iqapply.ne.0) call iqfix(cx,NFFT,gainx,phasex) + + if(nxpol.ne.0) then + call four2a(cy,NFFT,1,1,1) !Second forward FFT (Y) + if(iqadjust.eq.0) nadjy=0 + if(iqadjust.ne.0 .and. nadjy.lt.50) call iqcal(nadjy,cy,NFFT, & + gainy,phasey,zsumy,ipky,rejecty) + if(iqapply.ne.0) call iqfix(cy,NFFT,gainy,phasey) + endif + + n=min(322,ihsym) + do i=1,NFFT + sx=real(cx(i))**2 + aimag(cx(i))**2 + ss(1,n,i)=sx ! Pol = 0 + savg(1,i)=savg(1,i) + sx + + if(nxpol.ne.0) then + z=cx(i) + cy(i) + s45=0.5*(real(z)**2 + aimag(z)**2) + ss(2,n,i)=s45 ! Pol = 45 + savg(2,i)=savg(2,i) + s45 + + sy=real(cy(i))**2 + aimag(cy(i))**2 + ss(3,n,i)=sy ! Pol = 90 + savg(3,i)=savg(3,i) + sy + + z=cx(i) - cy(i) + s135=0.5*(real(z)**2 + aimag(z)**2) + ss(4,n,i)=s135 ! Pol = 135 + savg(4,i)=savg(4,i) + s135 + + z=cx(i)*conjg(cy(i)) + q=sx - sy + u=2.0*real(z) + ssz5a(i)=0.707*sqrt(q*q + u*u) !Spectrum of linear polarization +! Leif's formula: +! ssz5a(i)=0.5*(sx+sy) + (real(z)**2 + aimag(z)**2 - sx*sy)/(sx+sy) + else + ssz5a(i)=sx + endif + enddo + enddo + + if(ihsym.eq.278) then + if(iqadjust.ne.0 .and. ipkx.ne.0 .and. ipky.ne.0) then + rejectx=10.0*log10(savg(1,1+nfft-ipkx)/savg(1,1+ipkx)) + rejecty=10.0*log10(savg(3,1+nfft-ipky)/savg(3,1+ipky)) + endif + endif + + nkhz=nint(1000.d0*(fcenter-int(fcenter))) + if(fcenter.eq.0.d0) nkhz=125 + +999 return +end subroutine symspec diff --git a/map65/libm65/synctest.f90 b/map65/libm65/synctest.f90 new file mode 100644 index 000000000..f84042eae --- /dev/null +++ b/map65/libm65/synctest.f90 @@ -0,0 +1,57 @@ +program synctest + + ! Program to test an algorithm for detecting sync signals for both + ! JT65 and Q65-60x signals and rejecting birdies in MAP65 data. + ! The important work is done in module wideband_sync. + + use timer_module, only: timer + use timer_impl, only: init_timer, fini_timer + use wideband_sync + + real ss(4,322,NFFT),savg(4,NFFT) +! real candidate(MAX_CANDIDATES,5) !snr1,f0,xdt0,ipol,flip + character*8 arg + type(candidate) :: cand(MAX_CANDIDATES) + + nargs=iargc() + if(nargs.ne.5) then + print*,'Usage: synctest iutc nfa nfb nts_jt65 nts_q65' + print*,'Example: synctest 1814 23 83 2 1' + go to 999 + endif + call getarg(1,arg) + read (arg,*) iutc + call getarg(2,arg) + read (arg,*) nfa + call getarg(3,arg) + read (arg,*) nfb + call getarg(4,arg) + read (arg,*) nts_jt65 + call getarg(5,arg) + read (arg,*) nts_q65 + + open(50,file='50.a',form='unformatted',status='old') + do ifile=1,9999 + read(50,end=998) nutc,npol,ss(1:npol,:,:),savg(1:npol,:) + if(nutc.eq.iutc) exit + enddo + close(50) + + call init_timer('timer.out') + call timer('synctest',0) + + call timer('get_cand',0) + call get_candidates(ss,savg,nfa,nfb,nts_jt65,nts_q65,cand,ncand) + call timer('get_cand',1) + + do k=1,ncand + write(*,1010) k,cand(k)%snr,cand(k)%f,cand(k)%f+77,cand(k)%xdt, & + cand(k)%ipol,cand(k)%iflip +1010 format(i3,4f10.3,2i3) + enddo + +998 call timer('synctest',1) + call timer('synctest',101) + call fini_timer() + +999 end program synctest diff --git a/map65/libm65/synctst.f90 b/map65/libm65/synctst.f90 new file mode 100644 index 000000000..248c7e197 --- /dev/null +++ b/map65/libm65/synctst.f90 @@ -0,0 +1,84 @@ +program synctst + +! Tests JT65B2 sync patterns + + parameter (LAGMAX=20) + real ccf0(0:LAGMAX),ccf2(0:LAGMAX),ccf3(0:LAGMAX) + character*12 arg + integer npr(126),np0(126),np1(126),npr2(126) + data npr/1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & + 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & + 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & + 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & + 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & + 1,1,1,1,1,1/ + + nargs=iargc() + if(nargs.ne.1) then + print*,'Usage: synctst iters' + go to 999 + endif + call getarg(1,arg) + read(arg,*) iters + + worst=0. + do lag=0,LAGMAX + nsum=0 + do i=1,126-lag + nsum=nsum + npr(i)*npr(lag+i) + enddo + ccf0(lag)=2.0*nsum/(126.0-lag) + if(lag.ge.1 .and. ccf0(lag).gt.worst) worst=ccf0(lag) + enddo + + best2=1.0 + do iter=1,iters + +10 np0=0 + np1=0 + n0=0 + do i=1,126 + if(npr(i).eq.1) then + call random_number(r) + if(r.lt.0.5) then + np0(i)=1 + n0=n0+1 + else + np1(i)=1 + endif + endif + enddo + if(n0.ne.31 .and. n0.ne.32) go to 10 + + worst2=0. + do lag=0,LAGMAX + nsum=0 + do i=1,126-lag + nsum=nsum + np0(i)*np0(lag+i) + np1(i)*np1(lag+i) + enddo + ccf2(lag)=2.0*nsum/(126.0-lag) + if(lag.ge.1 .and. ccf2(lag).gt.worst2) then + worst2=ccf2(lag) + lagbad=lag + endif + enddo + if(worst2.lt.best2) then + best2=worst2 + lagbest=lagbad + n0best=n0 + ccf3=ccf2 + npr2=np0 + 2*np1 + endif + enddo + + do lag=0,LAGMAX + write(13,1100) lag,ccf0(lag),ccf3(lag) +1100 format(i3,2f10.3) + enddo + + print*,worst,best2,n0best,lagbest + write(*,1110) npr2 +1110 format((8x,20(i1,','))) + +999 end program synctst diff --git a/map65/libm65/synctst2.f90 b/map65/libm65/synctst2.f90 new file mode 100644 index 000000000..8ff4971a3 --- /dev/null +++ b/map65/libm65/synctst2.f90 @@ -0,0 +1,91 @@ +program synctst2 + +! Tests JT65B2 sync patterns + + parameter (LAGMAX=20) + real ccf0(0:LAGMAX),ccf1(0:LAGMAX),ccf2(0:LAGMAX),ccf3(0:LAGMAX) + character arg*12,line*64 + integer*8 n8 + integer npr(126),np0(126),np1(126),npr1(126),npr2(126) + data npr/1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & + 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & + 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & + 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & + 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & + 1,1,1,1,1,1/ + + data npr2/1,0,0,1,2,0,0,0,2,1,1,2,2,2,0,2,0,2,0,0, & + 0,1,0,2,1,0,0,1,0,0,0,2,1,1,0,0,1,1,2,2, & + 0,2,2,0,2,1,1,1,0,0,0,1,2,0,1,0,2,0,1,1, & + 0,0,2,2,0,1,0,1,0,2,0,0,2,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,2,0,2,0,0,2,0,2,1,0,1, & + 0,2,0,1,0,0,2,2,0,0,1,0,0,2,0,0,0,0,1,1, & + 1,2,1,2,1,2/ + + data n8/x'4314f4725bb357e0'/ + + write(*,1102) n8 + write(line,1102) n8 +1102 format(b63) + read(line,1104) npr1(1:63) +1104 format(63i1) + npr1(64:126)=npr1(1:63) + + worst=0. + do lag=0,LAGMAX + nsum=0 + do i=1,126-lag + nsum=nsum + npr(i)*npr(lag+i) + enddo + ccf0(lag)=2.0*nsum/(126.0-lag) + if(lag.ge.1 .and. ccf0(lag).gt.worst) worst=ccf0(lag) + enddo + + + worst1=0. + do lag=0,LAGMAX + nsum=0 + do i=1,126-lag + nsum=nsum + npr1(i)*npr1(lag+i) + enddo + ccf1(lag)=(63.0/64.0)*2.0*nsum/(126.0-lag) + if(lag.ge.1 .and. ccf1(lag).gt.worst1) worst1=ccf1(lag) + enddo + ccf1=ccf1/ccf1(0) + worst1=worst1/ccf1(0) + + np0=0 + np1=0 + n0=0 + do i=1,126 + if(npr2(i).eq.1) then + np0(i)=1 + n0=n0+1 + else if(npr2(i).eq.2) then + np1(i)=1 + endif + enddo + + worst2=0. + do lag=0,LAGMAX + nsum=0 + do i=1,126-lag + nsum=nsum + np0(i)*np0(lag+i) + np1(i)*np1(lag+i) + enddo + ccf2(lag)=2.0*nsum/(126.0-lag) + if(lag.ge.1 .and. ccf2(lag).gt.worst2) then + worst2=ccf2(lag) + lagbad=lag + endif + enddo + + do lag=0,LAGMAX + write(13,1100) lag,ccf0(lag),ccf1(lag),ccf2(lag) +1100 format(i3,3f10.3) + enddo + + print*,worst,worst1,worst2,n0,lagbad + + +999 end program synctst2 diff --git a/map65/libm65/tastro.f90 b/map65/libm65/tastro.f90 new file mode 100644 index 000000000..fac5c8003 --- /dev/null +++ b/map65/libm65/tastro.f90 @@ -0,0 +1,35 @@ +program tastro + + implicit real*8 (a-h,o-z) + + character grid*6 + character*9 cauxra,cauxdec + + character*12 clock(3) + integer nt(8) + equivalence (nt(1),nyear) + + grid='FN20qi' + nfreq=144 + cauxra='00:00:00' + +10 call date_and_time(clock(1),clock(2),clock(3),nt) + ih=ihour-ntz/60 + if(ih.le.0) then + ih=ih+24 + nday=nday+1 + endif + uth8=ih + imin/60.d0 + isec/3600.d0 + ims/3600000.d0 + call astro0(nyear,month,nday,uth8,nfreq,grid,cauxra,cauxdec, & + AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8,ntsky,ndop,ndop00, & + dbMoon8,RAMoon8,DecMoon8,HA8,Dgrd8,sd8,poloffset8,xnr8,dfdt,dfdt0, & + RaAux8,DecAux8,AzAux8,ElAux8,width1,width2,w501,w502,xlst8) + + write(*,1010) nyear,month,nday,ih,imin,isec,AzMoon8,ElMoon8, & + AzSun8,ElSun8,ndop,dgrd8,ntsky +1010 format(i4,i3,i3,i4.2,':',i2.2,':',i2.2,4f8.1,i6,f6.1,i6) + + call system('sleep 1') + go to 10 + +end program tastro diff --git a/map65/libm65/timeval.h b/map65/libm65/timeval.h new file mode 100644 index 000000000..83c77d5a1 --- /dev/null +++ b/map65/libm65/timeval.h @@ -0,0 +1,76 @@ +/* + * timeval.h 1.0 01/12/19 + * + * Defines gettimeofday, timeval, etc. for Win32 + * + * By Wu Yongwei + * + */ + +#ifndef _TIMEVAL_H +#define _TIMEVAL_H + +#ifdef _WIN32 + +#define WIN32_LEAN_AND_MEAN +#include +#include + +#ifndef __GNUC__ +#define EPOCHFILETIME (116444736000000000i64) +#else +#define EPOCHFILETIME (116444736000000000LL) +#endif + +//struct timeval { +// long tv_sec; /* seconds */ +// long tv_usec; /* microseconds */ +//}; + +/* +struct timezone { + int tz_minuteswest; // minutes W of Greenwich +int tz_dsttime; // type of dst correction +}; +*/ + +__inline int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + FILETIME ft; + LARGE_INTEGER li; + __int64 t; + static int tzflag; + + if (tv) + { + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + t = li.QuadPart; /* In 100-nanosecond intervals */ + t -= EPOCHFILETIME; /* Offset to the Epoch time */ + t /= 10; /* In microseconds */ + tv->tv_sec = (long)(t / 1000000); + tv->tv_usec = (long)(t % 1000000); + } + + if (tz) + { + if (!tzflag) + { + _tzset(); + tzflag++; + } + tz->tz_minuteswest = _timezone / 60; + tz->tz_dsttime = _daylight; + } + + return 0; +} + +#else /* _WIN32 */ + +#include + +#endif /* _WIN32 */ + +#endif /* _TIMEVAL_H */ diff --git a/map65/libm65/timf2.f90 b/map65/libm65/timf2.f90 new file mode 100644 index 000000000..4873d0e95 --- /dev/null +++ b/map65/libm65/timf2.f90 @@ -0,0 +1,215 @@ +subroutine timf2(k,nxpol,nfft,nwindow,nb,peaklimit,iqadjust,iqapply,faclim, & + cx0,cy0,gainx,gainy,phasex,phasey,cx1,cy1,slimit,lstrong,px,py,nzap) + +! Sequential processing of time-domain I/Q data, using Linrad-like +! "first FFT" and "first backward FFT". + +! cx0,cy0 - complex input data +! nfft - length of FFTs +! nwindow - 0 for no window, 2 for sin^2 window +! iqapply - 0/1 determines if I/Q phase and amplitude corrections applied +! gainx,y - gain error in Q channel, relative to I +! phasex,y - phase error +! cx1,cy1 - output data + +! Non-windowed processing means no overlap, so kstep=nfft. +! Sin^2 window has 50% overlap, kstep=nfft/2. + +! Frequencies with strong signals are identified and separated. The back +! transforms are done separately for weak and strong signals, so that +! noise blanking can be applied to the weak-signal portion. Strong and +! weak are finally re-combined in the time domain. + + parameter (MAXFFT=1024,MAXNH=MAXFFT/2) + parameter (MAXSIGS=100) + complex cx0(0:nfft-1),cx1(0:nfft-1) + complex cy0(0:nfft-1),cy1(0:nfft-1) + complex cx(0:MAXFFT-1),cxt(0:MAXFFT-1) + complex cy(0:MAXFFT-1),cyt(0:MAXFFT-1) + complex cxs(0:MAXFFT-1),covxs(0:MAXNH-1) !Strong X signals + complex cys(0:MAXFFT-1),covys(0:MAXNH-1) !Strong Y signals + complex cxw(0:MAXFFT-1),covxw(0:MAXNH-1) !Weak X signals + complex cyw(0:MAXFFT-1),covyw(0:MAXNH-1) !Weak Y signals + real*4 w(0:MAXFFT-1) + real*4 s(0:MAXFFT-1) + logical*1 lstrong(0:MAXFFT-1),lprev + integer ia(MAXSIGS),ib(MAXSIGS) + complex h,u,v + logical first + data first/.true./ + data k0/99999999/ + save + + if(faclim+iqadjust.eq.-9999.0) iqadjust=0 !Silence compiler warning. + if(first) then + pi=4.0*atan(1.0) + do i=0,nfft-1 + w(i)=(sin(i*pi/nfft))**2 + enddo + s=0. + nh=nfft/2 + kstep=nfft + if(nwindow.eq.2) kstep=nh + fac=1.0/nfft + slimit=1.e30 + first=.false. + endif + + if(k.lt.k0) then + covxs=0. + covxw=0. + covys=0. + covyw=0. + endif + k0=k + + cx(0:nfft-1)=cx0 + if(nwindow.eq.2) cx(0:nfft-1)=w(0:nfft-1)*cx(0:nfft-1) + call four2a(cx,nfft,1,1,1) !First forward FFT (X) + + if(nxpol.ne.0) then + cy(0:nfft-1)=cy0 + if(nwindow.eq.2) cy(0:nfft-1)=w(0:nfft-1)*cy(0:nfft-1) + call four2a(cy,nfft,1,1,1) !First forward FFT (Y) + endif + + if(iqapply.ne.0) then !Apply I/Q corrections (X) + h=gainx*cmplx(cos(phasex),sin(phasex)) + v=0. + do i=0,nfft-1 + u=cx(i) + if(i.gt.0) v=cx(nfft-i) + x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & + (real(u) - real(v))*real(h) + y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & + (real(u) - real(v))*aimag(h) + cxt(i)=0.5*cmplx(x,y) + enddo + else + cxt(0:nfft-1)=cx(0:nfft-1) + endif + + if(nxpol.ne.0) then + if(iqapply.ne.0) then !Apply I/Q corrections (Y) + h=gainy*cmplx(cos(phasey),sin(phasey)) + v=0. + do i=0,nfft-1 + u=cy(i) + if(i.gt.0) v=cy(nfft-i) + x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & + (real(u) - real(v))*real(h) + y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & + (real(u) - real(v))*aimag(h) + cyt(i)=0.5*cmplx(x,y) + enddo + else + cyt(0:nfft-1)=cy(0:nfft-1) + endif + endif + +! Identify frequencies with strong signals, copy frequency-domain +! data into array cs (strong) or cw (weak). + + do i=0,nfft-1 + p=real(cxt(i))**2 + aimag(cxt(i))**2 + if(nxpol.ne.0) p=p + real(cyt(i))**2 + aimag(cyt(i))**2 + s(i)=p + enddo + ave=sum(s(0:nfft-1))/nfft + lstrong(0:nfft-1)=s(0:nfft-1).gt.10.0*ave + + nsigs=0 + lprev=.false. + iwid=1 + ib=-99 + do i=0,nfft-1 + if(lstrong(i) .and. (.not.lprev)) then + if(nsigs.lt.MAXSIGS) nsigs=nsigs+1 + ia(nsigs)=i-iwid + if(ia(nsigs).lt.0) ia(nsigs)=0 + endif + if(.not.lstrong(i) .and. lprev) then + ib(nsigs)=i-1+iwid + if(ib(nsigs).gt.nfft-1) ib(nsigs)=nfft-1 + endif + lprev=lstrong(i) + enddo + + if(nsigs.gt.0) then + do i=1,nsigs + ja=ia(i) + jb=ib(i) + if(ja.lt.0 .or. ja.gt.nfft-1 .or. jb.lt.0 .or. jb.gt.nfft-1) then + cycle + endif + if(jb.eq.-99) jb=ja + min(2*iwid,nfft-1) + lstrong(ja:jb)=.true. + enddo + endif + + do i=0,nfft-1 + if(lstrong(i)) then + cxs(i)=fac*cxt(i) + cxw(i)=0. + if(nxpol.ne.0) then + cys(i)=fac*cyt(i) + cyw(i)=0. + endif + else + cxw(i)=fac*cxt(i) + cxs(i)=0. + if(nxpol.ne.0) then + cyw(i)=fac*cyt(i) + cys(i)=0. + endif + endif + enddo + + call four2a(cxw,nfft,1,-1,1) !Transform weak and strong X + call four2a(cxs,nfft,1,-1,1) !back to time domain, separately + + if(nxpol.ne.0) then + call four2a(cyw,nfft,1,-1,1) !Transform weak and strong Y + call four2a(cys,nfft,1,-1,1) !back to time domain, separately + endif + + if(nwindow.eq.2) then + cxw(0:nh-1)=cxw(0:nh-1)+covxw(0:nh-1) !Add previous segment's 2nd half + covxw(0:nh-1)=cxw(nh:nfft-1) !Save 2nd half + cxs(0:nh-1)=cxs(0:nh-1)+covxs(0:nh-1) !Ditto for strong signals + covxs(0:nh-1)=cxs(nh:nfft-1) + + if(nxpol.ne.0) then + cyw(0:nh-1)=cyw(0:nh-1)+covyw(0:nh-1) !Add previous segment's 2nd half + covyw(0:nh-1)=cyw(nh:nfft-1) !Save 2nd half + cys(0:nh-1)=cys(0:nh-1)+covys(0:nh-1) !Ditto for strong signals + covys(0:nh-1)=cys(nh:nfft-1) + endif + endif + +! Apply noise blanking to weak data + if(nb.ne.0) then + do i=0,kstep-1 + peak=abs(cxw(i)) + if(nxpol.ne.0) peak=max(peak,abs(cyw(i))) + if(peak.gt.peaklimit) then + cxw(i)=0. + if(nxpol.ne.0) cyw(i)=0. + nzap=nzap+1 + endif + enddo + endif + +! Compute power levels from weak data only + do i=0,kstep-1 + px=px + real(cxw(i))**2 + aimag(cxw(i))**2 + if(nxpol.ne.0) py=py + real(cyw(i))**2 + aimag(cyw(i))**2 + enddo + + cx1(0:kstep-1)=cxw(0:kstep-1) + cxs(0:kstep-1) !Weak + strong (X) + if(nxpol.ne.0) then + cy1(0:kstep-1)=cyw(0:kstep-1) + cys(0:kstep-1) !Weak + strong (Y) + endif + + return +end subroutine timf2 diff --git a/map65/libm65/tm2.f90 b/map65/libm65/tm2.f90 new file mode 100644 index 000000000..fb831fab6 --- /dev/null +++ b/map65/libm65/tm2.f90 @@ -0,0 +1,14 @@ +subroutine tm2(day,xlat4,xlon4,xl4,b4) + + implicit real*8 (a-h,o-z) + parameter (RADS=0.0174532925199433d0) + + real*4 xlat4,xlon4,xl4,b4 + + glat=xlat4*RADS + glong=xlon4*RADS + call tmoonsub(day,glat,glong,el,rv,xl,b,pax) + xl4=xl + b4=b + +end subroutine tm2 diff --git a/map65/libm65/tmoonsub.c b/map65/libm65/tmoonsub.c new file mode 100644 index 000000000..29ac28b49 --- /dev/null +++ b/map65/libm65/tmoonsub.c @@ -0,0 +1,514 @@ +#include +#include +#include + +#define RADS 0.0174532925199433 +#define DEGS 57.2957795130823 +#define TPI 6.28318530717959 +#define PI 3.1415927 + +/* ratio of earth radius to astronomical unit */ +#define ER_OVER_AU 0.0000426352325194252 + +/* all prototypes here */ + +double getcoord(int coord); +void getargs(int argc, char *argv[], int *y, int *m, double *tz, double *glong, double *glat); +double range(double y); +double rangerad(double y); +double days(int y, int m, int dn, double hour); +double days_(int *y, int *m, int *dn, double *hour); +void moonpos(double, double *, double *, double *); +void sunpos(double , double *, double *, double *); +double moontransit(int y, int m, int d, double timezone, double glat, double glong, int *nt); +double atan22(double y, double x); +double epsilon(double d); +void equatorial(double d, double *lon, double *lat, double *r); +void ecliptic(double d, double *lon, double *lat, double *r); +double gst(double d); +void topo(double lst, double glat, double *alp, double *dec, double *r); +double alt(double glat, double ha, double dec); +void libration(double day, double lambda, double beta, double alpha, double *l, double *b, double *p); +void illumination(double day, double lra, double ldec, double dr, double sra, double sdec, double *pabl, double *ill); +int daysinmonth(int y, int m); +int isleap(int y); +void tmoonsub_(double *day, double *glat, double *glong, double *moonalt, + double *mrv, double *l, double *b, double *paxis); + +static const char +*usage = " Usage: tmoon date[yyyymm] timz[+/-h.hh] long[+/-dddmm] lat[+/-ddmm]\n" + "example: tmoon 200009 0 -00155 5230\n"; + +/* + getargs() gets the arguments from the command line, does some basic error + checking, and converts arguments into numerical form. Arguments are passed + back in pointers. Error messages print to stderr so re-direction of output + to file won't leave users blind. Error checking prints list of all errors + in a command line before quitting. +*/ +void getargs(int argc, char *argv[], int *y, int *m, double *tz, + double *glong, double *glat) { + + int date, latitude, longitude; + int mflag = 0, yflag = 0, longflag = 0, latflag = 0, tzflag = 0; + int longminflag = 0, latminflag = 0, dflag = 0; + + /* if not right number of arguments, then print example command line */ + + if (argc !=5) { + fprintf(stderr, usage); + exit(EXIT_FAILURE); + } + + date = atoi(argv[1]); + *y = date / 100; + *m = date - *y * 100; + *tz = (double) atof(argv[2]); + longitude = atoi(argv[3]); + latitude = atoi(argv[4]); + *glong = RADS * getcoord(longitude); + *glat = RADS * getcoord(latitude); + + /* set a flag for each error found */ + + if (*m > 12 || *m < 1) mflag = 1; + if (*y > 2500) yflag = 1; + if (date < 150001) dflag = 1; + if (fabs((float) *glong) > 180 * RADS) longflag = 1; + if (abs(longitude) % 100 > 59) longminflag = 1; + if (fabs((float) *glat) > 90 * RADS) latflag = 1; + if (abs(latitude) % 100 > 59) latminflag = 1; + if (fabs((float) *tz) > 12) tzflag = 1; + + /* print all the errors found */ + + if (dflag == 1) { + fprintf(stderr, "date: dates must be in form yyyymm, gregorian, and later than 1500 AD\n"); + } + if (yflag == 1) { + fprintf(stderr, "date: too far in future - accurate from 1500 to 2500\n"); + } + if (mflag == 1) { + fprintf(stderr, "date: month must be in range 0 to 12, eg - August 2000 is entered as 200008\n"); + } + if (tzflag == 1) { + fprintf(stderr, "timz: must be in range +/- 12 hours, eg -6 for Chicago\n"); + } + if (longflag == 1) { + fprintf(stderr, "long: must be in range +/- 180 degrees\n"); + } + if (longminflag == 1) { + fprintf(stderr, "long: last two digits are arcmin - max 59\n"); + } + if (latflag == 1) { + fprintf(stderr, " lat: must be in range +/- 90 degrees\n"); + } + if (latminflag == 1) { + fprintf(stderr, " lat: last two digits are arcmin - max 59\n"); + } + + /* quits if one or more flags set */ + + if (dflag + mflag + yflag + longflag + latflag + tzflag + longminflag + latminflag > 0) { + exit(EXIT_FAILURE); + } + +} + +/* + returns coordinates in decimal degrees given the + coord as a ddmm value stored in an integer. +*/ +double getcoord(int coord) { + int west = 1; + double glg, deg; + if (coord < 0) west = -1; + glg = fabs((double) coord/100); + deg = floor(glg); + glg = west* (deg + (glg - deg)*100 / 60); + return(glg); +} + +/* + days() takes the year, month, day in the month and decimal hours + in the day and returns the number of days since J2000.0. + Assumes Gregorian calendar. +*/ +double days(int y, int m, int d, double h) { + int a, b; + double day; + + /* + The lines below work from 1900 march to feb 2100 + a = 367 * y - 7 * (y + (m + 9) / 12) / 4 + 275 * m / 9 + d; + day = (double)a - 730531.5 + hour / 24; + */ + + /* These lines work for any Gregorian date since 0 AD */ + if (m ==1 || m==2) { + m +=12; + y -= 1; + } + a = y / 100; + b = 2 - a + a/4; + day = floor(365.25*(y + 4716)) + floor(30.6001*(m + 1)) + + d + b - 1524.5 - 2451545 + h/24; + return(day); +} +double days_(int *y0, int *m0, int *d0, double *h0) +{ + return days(*y0,*m0,*d0,*h0); +} + +/* +Returns 1 if y a leap year, and 0 otherwise, according +to the Gregorian calendar +*/ +int isleap(int y) { + int a = 0; + if(y % 4 == 0) a = 1; + if(y % 100 == 0) a = 0; + if(y % 400 == 0) a = 1; + return(a); +} + +/* +Given the year and the month, function returns the +number of days in the month. Valid for Gregorian +calendar. +*/ +int daysinmonth(int y, int m) { + int b = 31; + if(m == 2) { + if(isleap(y) == 1) b= 29; + else b = 28; + } + if(m == 4 || m == 6 || m == 9 || m == 11) b = 30; + return(b); +} + +/* +moonpos() takes days from J2000.0 and returns ecliptic coordinates +of moon in the pointers. Note call by reference. +This function is within a couple of arcminutes most of the time, +and is truncated from the Meeus Ch45 series, themselves truncations of +ELP-2000. Returns moon distance in earth radii. +Terms have been written out explicitly rather than using the +table based method as only a small number of terms is +retained. +*/ +void moonpos(double d, double *lambda, double *beta, double *rvec) { + double dl, dB, dR, L, D, M, M1, F, e, lm, bm, rm, t; + + t = d / 36525; + + L = range(218.3164591 + 481267.88134236 * t) * RADS; + D = range(297.8502042 + 445267.1115168 * t) * RADS; + M = range(357.5291092 + 35999.0502909 * t) * RADS; + M1 = range(134.9634114 + 477198.8676313 * t - .008997 * t * t) * RADS; + F = range(93.27209929999999 + 483202.0175273 * t - .0034029*t*t)*RADS; + e = 1 - .002516 * t; + + dl = 6288774 * sin(M1); + dl += 1274027 * sin(2 * D - M1); + dl += 658314 * sin(2 * D); + dl += 213618 * sin(2 * M1); + dl -= e * 185116 * sin(M); + dl -= 114332 * sin(2 * F) ; + dl += 58793 * sin(2 * D - 2 * M1); + dl += e * 57066 * sin(2 * D - M - M1) ; + dl += 53322 * sin(2 * D + M1); + dl += e * 45758 * sin(2 * D - M); + dl -= e * 40923 * sin(M - M1); + dl -= 34720 * sin(D) ; + dl -= e * 30383 * sin(M + M1) ; + dl += 15327 * sin(2 * D - 2 * F) ; + dl -= 12528 * sin(M1 + 2 * F); + dl += 10980 * sin(M1 - 2 * F); + lm = rangerad(L + dl / 1000000 * RADS); + + dB = 5128122 * sin(F); + dB += 280602 * sin(M1 + F); + dB += 277693 * sin(M1 - F); + dB += 173237 * sin(2 * D - F); + dB += 55413 * sin(2 * D - M1 + F); + dB += 46271 * sin(2 * D - M1 - F); + dB += 32573 * sin(2 * D + F); + dB += 17198 * sin(2 * M1 + F); + dB += 9266 * sin(2 * D + M1 - F); + dB += 8822 * sin(2 * M1 - F); + dB += e * 8216 * sin(2 * D - M - F); + dB += 4324 * sin(2 * D - 2 * M1 - F); + bm = dB / 1000000 * RADS; + + dR = -20905355 * cos(M1); + dR -= 3699111 * cos(2 * D - M1); + dR -= 2955968 * cos(2 * D); + dR -= 569925 * cos(2 * M1); + dR += e * 48888 * cos(M); + dR -= 3149 * cos(2 * F); + dR += 246158 * cos(2 * D - 2 * M1); + dR -= e * 152138 * cos(2 * D - M - M1) ; + dR -= 170733 * cos(2 * D + M1); + dR -= e * 204586 * cos(2 * D - M); + dR -= e * 129620 * cos(M - M1); + dR += 108743 * cos(D); + dR += e * 104755 * cos(M + M1); + dR += 79661 * cos(M1 - 2 * F); + rm = 385000.56 + dR / 1000; + + *lambda = lm; + *beta = bm; + /* distance to Moon must be in Earth radii */ + *rvec = rm / 6378.14; +} + +/* +topomoon() takes the local siderial time, the geographical +latitude of the observer, and pointers to the geocentric +equatorial coordinates. The function overwrites the geocentric +coordinates with topocentric coordinates on a simple spherical +earth model (no polar flattening). Expects Moon-Earth distance in +Earth radii. Formulas scavenged from Astronomical Almanac 'low +precision formulae for Moon position' page D46. +*/ + +void topo(double lst, double glat, double *alp, double *dec, double *r) { + double x, y, z, r1; + x = *r * cos(*dec) * cos(*alp) - cos(glat) * cos(lst); + y = *r * cos(*dec) * sin(*alp) - cos(glat) * sin(lst); + z = *r * sin(*dec) - sin(glat); + r1 = sqrt(x*x + y*y + z*z); + *alp = atan22(y, x); + *dec = asin(z / r1); + *r = r1; +} + +/* +moontransit() takes date, the time zone and geographic longitude +of observer and returns the time (decimal hours) of lunar transit +on that day if there is one, and sets the notransit flag if there +isn't. See Explanatory Supplement to Astronomical Almanac +section 9.32 and 9.31 for the method. +*/ + +double moontransit(int y, int m, int d, double tz, double glat, double glong, int *notransit) { + double hm, ht, ht1, lon, lat, rv, dnew, lst; + int itcount; + + ht1 = 180 * RADS; + ht = 0; + itcount = 0; + *notransit = 0; + do { + ht = ht1; + itcount++; + dnew = days(y, m, d, ht * DEGS/15) - tz/24; + lst = gst(dnew) + glong; + /* find the topocentric Moon ra (hence hour angle) and dec */ + moonpos(dnew, &lon, &lat, &rv); + equatorial(dnew, &lon, &lat, &rv); + topo(lst, glat, &lon, &lat, &rv); + hm = rangerad(lst - lon); + ht1 = rangerad(ht - hm); + /* if no convergence, then no transit on that day */ + if (itcount > 30) { + *notransit = 1; + break; + } + } + while (fabs(ht - ht1) > 0.04 * RADS); + return(ht1); +} + +/* + Calculates the selenographic coordinates of either the sub Earth point + (optical libration) or the sub-solar point (selen. coords of centre of + bright hemisphere). Based on Meeus chapter 51 but neglects physical + libration and nutation, with some simplification of the formulas. +*/ +void libration(double day, double lambda, double beta, double alpha, double *l, double *b, double *p) { + double i, f, omega, w, y, x, a, t, eps; + t = day / 36525; + i = 1.54242 * RADS; + eps = epsilon(day); + f = range(93.2720993 + 483202.0175273 * t - .0034029 * t * t) * RADS; + omega = range(125.044555 - 1934.1361849 * t + .0020762 * t * t) * RADS; + w = lambda - omega; + y = sin(w) * cos(beta) * cos(i) - sin(beta) * sin(i); + x = cos(w) * cos(beta); + a = atan22(y, x); + *l = a - f; + + /* kludge to catch cases of 'round the back' angles */ + if (*l < -90 * RADS) *l += TPI; + if (*l > 90 * RADS) *l -= TPI; + *b = asin(-sin(w) * cos(beta) * sin(i) - sin(beta) * cos(i)); + + /* pa pole axis - not used for Sun stuff */ + x = sin(i) * sin(omega); + y = sin(i) * cos(omega) * cos(eps) - cos(i) * sin(eps); + w = atan22(x, y); + *p = rangerad(asin(sqrt(x*x + y*y) * cos(alpha - w) / cos(*b))); +} + +/* + Takes: days since J2000.0, eq coords Moon, ratio of moon to sun distance, + eq coords Sun + Returns: position angle of bright limb wrt NCP, percentage illumination + of Sun +*/ +void illumination(double day, double lra, double ldec, double dr, double sra, double sdec, double *pabl, double *ill) { + double x, y, phi, i; + y = cos(sdec) * sin(sra - lra); + x = sin(sdec) * cos(ldec) - cos(sdec) * sin(ldec) * cos (sra - lra); + *pabl = atan22(y, x); + phi = acos(sin(sdec) * sin(ldec) + cos(sdec) * cos(ldec) * cos(sra-lra)); + i = atan22(sin(phi) , (dr - cos(phi))); + *ill = 0.5*(1 + cos(i)); +} + +/* +sunpos() takes days from J2000.0 and returns ecliptic longitude +of Sun in the pointers. Latitude is zero at this level of precision, +but pointer left in for consistency in number of arguments. +This function is within 0.01 degree (1 arcmin) almost all the time +for a century either side of J2000.0. This is from the 'low precision +fomulas for the Sun' from C24 of Astronomical Alamanac +*/ +void sunpos(double d, double *lambda, double *beta, double *rvec) { + double L, g, ls, bs, rs; + + L = range(280.461 + .9856474 * d) * RADS; + g = range(357.528 + .9856003 * d) * RADS; + ls = L + (1.915 * sin(g) + .02 * sin(2 * g)) * RADS; + bs = 0; + rs = 1.00014 - .01671 * cos(g) - .00014 * cos(2 * g); + *lambda = ls; + *beta = bs; + *rvec = rs; +} + +/* +this routine returns the altitude given the days since J2000.0 +the hour angle and declination of the object and the latitude +of the observer. Used to find the Sun's altitude to put a letter +code on the transit time, and to find the Moon's altitude at +transit just to make sure that the Moon is visible. +*/ +double alt(double glat, double ha, double dec) { + return(asin(sin(dec) * sin(glat) + cos(dec) * cos(glat) * cos(ha))); +} + +/* returns an angle in degrees in the range 0 to 360 */ +double range(double x) { + double a, b; + b = x / 360; + a = 360 * (b - floor(b)); + if (a < 0) + a = 360 + a; + return(a); +} + +/* returns an angle in rads in the range 0 to two pi */ +double rangerad(double x) { + double a, b; + b = x / TPI; + a = TPI * (b - floor(b)); + if (a < 0) + a = TPI + a; + return(a); +} + +/* +gets the atan2 function returning angles in the right +order and range +*/ +double atan22(double y, double x) { + double a; + + a = atan2(y, x); + if (a < 0) a += TPI; + return(a); +} + +/* +returns mean obliquity of ecliptic in radians given days since +J2000.0. +*/ +double epsilon(double d) { + double t = d/ 36525; + return((23.4392911111111 - (t* (46.8150 + 0.00059*t)/3600)) *RADS); +} + +/* +replaces ecliptic coordinates with equatorial coordinates +note: call by reference destroys original values +R is unchanged. +*/ +void equatorial(double d, double *lon, double *lat, double *r) { + double eps, ceps, seps, l, b; + + l = *lon; + b = * lat; + eps = epsilon(d); + ceps = cos(eps); + seps = sin(eps); + *lon = atan22(sin(l)*ceps - tan(b)*seps, cos(l)); + *lat = asin(sin(b)*ceps + cos(b)*seps*sin(l)); +} + +/* +replaces equatorial coordinates with ecliptic ones. Inverse +of above, but used to find topocentric ecliptic coords. +*/ +void ecliptic(double d, double *lon, double *lat, double *r) { + double eps, ceps, seps, alp, dec; + alp = *lon; + dec = *lat; + eps = epsilon(d); + ceps = cos(eps); + seps = sin(eps); + *lon = atan22(sin(alp)*ceps + tan(dec)*seps, cos(alp)); + *lat = asin(sin(dec)*ceps - cos(dec)*seps*sin(alp)); +} + +/* +returns the siderial time at greenwich meridian as +an angle in radians given the days since J2000.0 +*/ +double gst( double d) { + double t = d / 36525; + double theta; + theta = range(280.46061837 + 360.98564736629 * d + 0.000387933 * t * t); + return(theta * RADS); +} + +void tmoonsub_(double *day, double *glat, double *glong, double *moonalt, + double *mrv, double *l, double *b, double *paxis) +{ + double mlambda, mbeta; + double malpha, mdelta; + double lst, mhr; + double tlambda, tbeta, trv; + + lst = gst(*day) + *glong; + + /* find Moon topocentric coordinates for libration calculations */ + + moonpos(*day, &mlambda, &mbeta, mrv); + malpha = mlambda; + mdelta = mbeta; + equatorial(*day, &malpha, &mdelta, mrv); + topo(lst, *glat, &malpha, &mdelta, mrv); + mhr = rangerad(lst - malpha); + *moonalt = alt(*glat, mhr, mdelta); + + /* Optical libration and Position angle of the Pole */ + + tlambda = malpha; + tbeta = mdelta; + trv = *mrv; + ecliptic(*day, &tlambda, &tbeta, &trv); + libration(*day, tlambda, tbeta, malpha, l, b, paxis); +} diff --git a/map65/libm65/toxyz.f90 b/map65/libm65/toxyz.f90 new file mode 100644 index 000000000..aef160c9d --- /dev/null +++ b/map65/libm65/toxyz.f90 @@ -0,0 +1,25 @@ +subroutine toxyz(alpha,delta,r,vec) + + implicit real*8 (a-h,o-z) + real*8 vec(3) + + vec(1)=r*cos(delta)*cos(alpha) + vec(2)=r*cos(delta)*sin(alpha) + vec(3)=r*sin(delta) + + return +end subroutine toxyz + +subroutine fromxyz(vec,alpha,delta,r) + + implicit real*8 (a-h,o-z) + real*8 vec(3) + data twopi/6.283185307d0/ + + r=sqrt(vec(1)**2 + vec(2)**2 + vec(3)**2) + alpha=atan2(vec(2),vec(1)) + if(alpha.lt.0.d0) alpha=alpha+twopi + delta=asin(vec(3)/r) + + return +end subroutine fromxyz diff --git a/map65/libm65/trimlist.f90 b/map65/libm65/trimlist.f90 new file mode 100644 index 000000000..9e8a36e69 --- /dev/null +++ b/map65/libm65/trimlist.f90 @@ -0,0 +1,28 @@ +subroutine trimlist(sig,km,ftol,indx,nsiz,nz) + + parameter (MAXMSG=1000) !Size of decoded message list + real sig(MAXMSG,30) + integer indx(MAXMSG),nsiz(MAXMSG) + +! 1 2 3 4 5 6 7 8 +! nfile nutc freq snr dt ipol flip sync + + call indexx(sig(1,3),km,indx) !Sort list by frequency + + n=1 + i0=1 + do i=2,km + j0=indx(i-1) + j=indx(i) + if(sig(j,3)-sig(j0,3).gt.ftol) then + nsiz(n)=i-i0 + i0=i + n=n+1 + endif + enddo + nz=n + nsiz(nz)=km+1-i0 + nsiz(nz+1)=-1 + + return +end subroutine trimlist diff --git a/map65/libm65/twkfreq.f90 b/map65/libm65/twkfreq.f90 new file mode 100644 index 000000000..be1fef0fe --- /dev/null +++ b/map65/libm65/twkfreq.f90 @@ -0,0 +1,26 @@ +subroutine twkfreq(c3,c4,npts,fsample,a) + + complex c3(npts) + complex c4(npts) + complex w,wstep + real a(3) + data twopi/6.283185307/ + +! Mix the complex signal + w=1.0 + wstep=1.0 + x0=0.5*(npts+1) + s=2.0/npts + do i=1,npts + x=s*(i-x0) + p2=1.5*x*x - 0.5 +! p3=2.5*(x**3) - 1.5*x +! p4=4.375*(x**4) - 3.75*(x**2) + 0.375 + dphi=(a(1) + x*a(2) + p2*a(3)) * (twopi/fsample) + wstep=cmplx(cos(dphi),sin(dphi)) + w=w*wstep + c4(i)=w*c3(i) + enddo + + return +end subroutine twkfreq diff --git a/map65/libm65/twkfreq_xy.f90 b/map65/libm65/twkfreq_xy.f90 new file mode 100644 index 000000000..a5cc3769a --- /dev/null +++ b/map65/libm65/twkfreq_xy.f90 @@ -0,0 +1,29 @@ +subroutine twkfreq_xy(c4aa,c4bb,n5,a) + + complex c4aa(n5) + complex c4bb(n5) + real a(5) + complex w,wstep + data twopi/6.283185307/ + +! Apply AFC corrections to the c4aa and c4bb data + w=1.0 + wstep=1.0 + x0=0.5*(n5+1) + s=2.0/n5 + do i=1,n5 + x=s*(i-x0) + if(mod(i,1000).eq.1) then + p2=1.5*x*x - 0.5 +! p3=2.5*(x**3) - 1.5*x +! p4=4.375*(x**4) - 3.75*(x**2) + 0.375 + dphi=(a(1) + x*a(2) + p2*a(3)) * (twopi/1378.125) + wstep=cmplx(cos(dphi),sin(dphi)) + endif + w=w*wstep + c4aa(i)=w*c4aa(i) + c4bb(i)=w*c4bb(i) + enddo + + return +end subroutine twkfreq_xy diff --git a/map65/libm65/usleep.c b/map65/libm65/usleep.c new file mode 100644 index 000000000..21d242a68 --- /dev/null +++ b/map65/libm65/usleep.c @@ -0,0 +1,7 @@ +#include + +/* usleep(3) */ +void usleep_(unsigned long *microsec) +{ + usleep(*microsec); +} diff --git a/map65/libm65/wavhdr.f90 b/map65/libm65/wavhdr.f90 new file mode 100644 index 000000000..6568c1fa6 --- /dev/null +++ b/map65/libm65/wavhdr.f90 @@ -0,0 +1,110 @@ +module wavhdr + type hdr + character*4 ariff + integer*4 lenfile + character*4 awave + character*4 afmt + integer*4 lenfmt + integer*2 nfmt2 + integer*2 nchan2 + integer*4 nsamrate + integer*4 nbytesec + integer*2 nbytesam2 + integer*2 nbitsam2 + character*4 adata + integer*4 ndata + end type hdr + + contains + + function default_header(nsamrate,npts) + type(hdr) default_header,h + h%ariff='RIFF' + h%awave='WAVE' + h%afmt='fmt ' + h%lenfmt=16 + h%nfmt2=1 + h%nchan2=1 + h%nsamrate=nsamrate + h%nbitsam2=16 + h%nbytesam2=h%nbitsam2 * h%nchan2 / 8 + h%adata='data' + h%nbytesec=h%nsamrate * h%nbitsam2 * h%nchan2 / 8 + h%ndata=2*npts + h%lenfile=h%ndata + 44 - 8 + default_header=h + end function default_header + + subroutine set_wsjtx_wav_params(fMHz,mode,nsubmode,ntrperiod,id2) + + parameter (NBANDS=23,NMODES=13) + character*8 mode,modes(NMODES) + integer*2 id2(4) + integer iperiod(8) + real fband(NBANDS) + data fband/0.137,0.474,1.8,3.5,5.1,7.0,10.14,14.0,18.1,21.0,24.9, & + 28.0,50.0,144.0,222.0,432.0,902.0,1296.0,2304.0,3400.0, & + 5760.0,10368.0,24048.0/ + data modes/'Echo','FSK441','ISCAT','JT4','JT65','JT6M','JT9', & + 'JT9+JT65','JTMS','JTMSK','WSPR','FT8','FT2'/ + data iperiod/5,10,15,30,60,120,900,0/ + + dmin=1.e30 + iband=0 + do i=1,NBANDS + if(abs(fMHz-fband(i)).lt.dmin) then + dmin=abs(fMHz-fband(i)) + iband=i + endif + enddo + + imode=0 + do i=1,NMODES + if(mode.eq.modes(i)) imode=i + enddo + + ip=0 + do i=1,8 + if(ntrperiod.eq.iperiod(i)) ip=i + enddo + + id2(1)=iband + id2(2)=imode + id2(3)=nsubmode + id2(4)=ip + + return + end subroutine set_wsjtx_wav_params + + subroutine get_wsjtx_wav_params(id2,band,mode,nsubmode,ntrperiod,ok) + + parameter (NBANDS=23,NMODES=13) + character*8 mode,modes(NMODES) + character*6 band,bands(NBANDS) + integer*2 id2(4) + integer iperiod(8) + logical ok + data modes/'Echo','FSK441','ISCAT','JT4','JT65','JT6M','JT9', & + 'JT9+JT65','JTMS','JTMSK','WSPR','FT8','FT2'/ + data iperiod/5,10,15,30,60,120,900,0/ + data bands/'2190m','630m','160m','80m','60m','40m','30m','20m', & + '17m','15m','12m','10m','6m','2m','1.25m','70cm','33cm', & + '23cm','13cm','9cm','6cm','3cm','1.25cm'/ + + ok=.true. + if(id2(1).lt.1 .or. id2(1).gt.NBANDS) ok=.false. + if(id2(2).lt.1 .or. id2(2).gt.NMODES) ok=.false. + if(id2(3).lt.1 .or. id2(3).gt.8) ok=.false. + if(id2(4).lt.1 .or. id2(4).gt.8) ok=.false. + + if(ok) then + band=bands(id2(1)) + mode=modes(id2(2)) + nsubmode=id2(3) + ntrperiod=iperiod(id2(4)) + endif + + return + end subroutine get_wsjtx_wav_params + +end module wavhdr diff --git a/map65/libm65/wideband_sync.f90 b/map65/libm65/wideband_sync.f90 new file mode 100644 index 000000000..61d9b06c1 --- /dev/null +++ b/map65/libm65/wideband_sync.f90 @@ -0,0 +1,231 @@ +module wideband_sync + + type candidate + real :: snr !Relative S/N of sync detection + real :: f !Freq of sync tone, 0 to 96000 Hz + real :: xdt !DT of matching sync pattern, -1.0 to +4.0 s + integer :: ipol !Polarization angle, 1 to 4 ==> 0, 45, 90, 135 deg + integer :: iflip !Sync type: JT65 = +/- 1, Q65 = 0 + end type candidate + type sync_dat + real :: ccfmax + real :: xdt + integer :: ipol + integer :: iflip + logical :: birdie + end type sync_dat + + parameter (NFFT=32768) + parameter (MAX_CANDIDATES=50) + type(sync_dat) :: sync(NFFT) + integer nkhz_center + + contains + +subroutine get_candidates(ss,savg,nfa,nfb,nts_jt65,nts_q65,cand,ncand) + +! Search symbol spectra ss() over frequency range nfa to nfb (in kHz) for +! JT65 and Q65 sync patterns. The nts_* variables are the submode tone +! spacings: 1 2 4 8 16 for A B C D E. Birdies are detected and +! excised. Candidates are returned in the structure array cand(). + + parameter (MAX_PEAKS=300) + real ss(4,322,NFFT),savg(4,NFFT) + real pavg(-20:20) + integer indx(NFFT) + logical skip + type(candidate) :: cand(MAX_CANDIDATES) + + do j=322,1,-1 !Find end of data in ss() + if(sum(ss(1,j,1:NFFT)).gt.0.0) exit + enddo + jz=j + +call wb_sync(ss,savg,jz,nfa,nfb) + + tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 + df3=96000.0/NFFT + ia=nint(1000*nfa/df3) + 1 + ib=nint(1000*nfb/df3) + 1 + iz=ib-ia+1 + + call indexx(sync(ia:ib)%ccfmax,iz,indx) !Sort by relative snr + + k=0 + do i=1,MAX_PEAKS + n=indx(iz+1-i) + ia - 1 + f0=0.001*(n-1)*df3 + snr1=sync(n)%ccfmax +! print*,'=A',f0,snr1 + if(snr1.lt.4.5) exit + flip=sync(n)%iflip + if(flip.ne.0.0 .and. nts_jt65.eq.0) cycle + if(flip.eq.0.0 .and. nts_q65.eq.0) cycle + if(sync(n)%birdie) cycle + +! Test for signal outside of TxT range and set bw for this signal type + j1=(sync(n)%xdt + 1.0)/tstep - 1.0 + j2=(sync(n)%xdt + 52.0)/tstep + 1.0 + if(flip.ne.0) j2=(sync(n)%xdt + 47.811)/tstep + 1.0 + ipol=sync(n)%ipol + pavg=0. + do j=1,j1 + pavg=pavg + ss(ipol,j,n-20:n+20) + enddo + do j=j2,jz + pavg=pavg + ss(ipol,j,n-20:n+20) + enddo + jsum=j1 + (jz-j2+1) + pmax=maxval(pavg(-2:2)) !### Why not just pavg(0) ? + base=(sum(pavg)-pmax)/jsum + pmax=pmax/base + if(pmax.gt.5.0) cycle + skip=.false. + do m=1,k !Skip false syncs within signal bw + diffhz=1000.0*(f0-cand(m)%f) + bw=nts_q65*110.0 + if(cand(m)%iflip.ne.0) bw=nts_jt65*178.0 + if(diffhz.gt.-20.0 .and. diffhz.lt.bw+20.0) skip=.true. +! write(*,3301) i,k,m,f0,cand(m)%f,diffhz,snr1,skip +!3301 format('=',3i5,f10.1,3f10.3,L3) + enddo + if(skip) cycle + k=k+1 + cand(k)%snr=snr1 + cand(k)%f=f0 + cand(k)%xdt=sync(n)%xdt + cand(k)%ipol=sync(n)%ipol + cand(k)%iflip=nint(flip) + if(k.ge.MAX_CANDIDATES) exit + enddo + ncand=k + + return +end subroutine get_candidates + +subroutine wb_sync(ss,savg,jz,nfa,nfb) + +! Compute "orange sync curve" using the Q65 sync pattern + + parameter (NFFT=32768) + parameter (LAGMAX=30) + real ss(4,322,NFFT) + real savg(4,NFFT) + real savg_med(4) + logical first + integer isync(22) + integer jsync0(63),jsync1(63) + +! Q65 sync symbols + data isync/1,9,12,13,15,22,23,26,27,33,35,38,46,50,55,60,62,66,69,74,76,85/ + data jsync0/ & + 1, 4, 5, 9, 10, 11, 12, 13, 14, 16, 18, 22, 24, 25, 28, 32, & + 33, 34, 37, 38, 39, 40, 42, 43, 45, 46, 47, 48, 52, 53, 55, 57, & + 59, 60, 63, 64, 66, 68, 70, 73, 80, 81, 89, 90, 92, 95, 97, 98, & + 100,102,104,107,108,111,114,119,120,121,122,123,124,125,126/ + data jsync1/ & + 2, 3, 6, 7, 8, 15, 17, 19, 20, 21, 23, 26, 27, 29, 30, 31, & + 35, 36, 41, 44, 49, 50, 51, 54, 56, 58, 61, 62, 65, 67, 69, 71, & + 72, 74, 75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87, 88, 91, 93, & + 94, 96, 99,101,103,105,106,109,110,112,113,115,116,117,118/ + data first/.true./ + save first,isync,jsync0,jsync1 + + tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 + if(first) then + fac=0.6/tstep + do i=1,22 !Expand the Q65 sync stride + isync(i)=nint((isync(i)-1)*fac) + 1 + enddo + do i=1,63 + jsync0(i)=2*(jsync0(i)-1) + 1 + jsync1(i)=2*(jsync1(i)-1) + 1 + enddo + first=.false. + endif + + df3=96000.0/NFFT + ia=nint(1000*nfa/df3) + 1 !Flat frequency range for WSE converters + ib=nint(1000*nfb/df3) + 1 + + do i=1,4 + call pctile(savg(i,ia:ib),ib-ia+1,50,savg_med(i)) + enddo +! do i=ia,ib +! write(14,3014) 0.001*(i-1)*df3,savg(1:4,i) +!3014 format(5f10.3) +! enddo + + lagbest=0 + ipolbest=1 + flip=0. + + do i=ia,ib + ccfmax=0. + do ipol=1,4 + do lag=0,LAGMAX + + ccf=0. + do j=1,22 + k=isync(j) + lag + ccf=ccf + ss(ipol,k,i+1) + ss(ipol,k+1,i+1) + ss(ipol,k+2,i+1) + enddo + ccf=ccf - savg(ipol,i+1)*3*22/float(jz) + if(ccf.gt.ccfmax) then + ipolbest=ipol + lagbest=lag + ccfmax=ccf + flip=0. + endif + + ccf=0. + do j=1,63 + k=jsync0(j) + lag + ccf=ccf + ss(ipol,k,i+1) + ss(ipol,k+1,i+1) + enddo + ccf=ccf - savg(ipol,i+1)*2*63/float(jz) + if(ccf.gt.ccfmax) then + ipolbest=ipol + lagbest=lag + ccfmax=ccf + flip=1.0 + endif + + ccf=0. + do j=1,63 + k=jsync1(j) + lag + ccf=ccf + ss(ipol,k,i+1) + ss(ipol,k+1,i+1) + enddo + ccf=ccf - savg(ipol,i+1)*2*63/float(jz) + if(ccf.gt.ccfmax) then + ipolbest=ipol + lagbest=lag + ccfmax=ccf + flip=-1.0 + endif + + enddo ! lag + enddo !ipol + + sync(i)%ccfmax=ccfmax + sync(i)%xdt=lagbest*tstep-1.0 + sync(i)%ipol=ipolbest + sync(i)%iflip=flip + sync(i)%birdie=.false. + if(ccfmax/(savg(ipolbest,i)/savg_med(ipolbest)).lt.3.0) sync(i)%birdie=.true. + enddo ! i (frequency bin) + +! do i=ia,ib +! write(15,3015) 0.001*(i-1)*df3,sync(i)%ccfmax,sync(i)%xdt,sync(i)%ipol, & +! sync(i)%iflip,sync(i)%birdie +!3015 format(3f10.3,2i6,L5) +! enddo + + call pctile(sync(ia:ib)%ccfmax,ib-ia+1,50,base) + sync(ia:ib)%ccfmax=sync(ia:ib)%ccfmax/base +! print*,base + + return +end subroutine wb_sync + +end module wideband_sync diff --git a/map65/libm65/wrapkarn.c b/map65/libm65/wrapkarn.c new file mode 100644 index 000000000..9e0a51caf --- /dev/null +++ b/map65/libm65/wrapkarn.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include "rs.h" + +static void *rs; +static int first=1; + +void rs_encode_(int *dgen, int *sent) +// Encode JT65 data dgen[12], producing sent[63]. +{ + int dat1[12]; + int b[51]; + int i; + + if(first) { + // Initialize the JT65 codec + rs=init_rs_int(6,0x43,3,1,51,0); + first=0; + } + + // Reverse data order for the Karn codec. + for(i=0; i<12; i++) { + dat1[i]=dgen[11-i]; + } + // Compute the parity symbols + encode_rs_int(rs,dat1,b); + + // Move parity symbols and data into sent[] array, in reverse order. + for (i = 0; i < 51; i++) sent[50-i] = b[i]; + for (i = 0; i < 12; i++) sent[i+51] = dat1[11-i]; +} + +void rs_decode_(int *recd0, int *era0, int *numera0, int *decoded, int *nerr) +// Decode JT65 received data recd0[63], producing decoded[12]. +// Erasures are indicated in era0[numera]. The number of corrected +// errors is *nerr. If the data are uncorrectable, *nerr=-1 is returned. +{ + int numera; + int i; + int era_pos[50]; + int recd[63]; + + if(first) { + rs=init_rs_int(6,0x43,3,1,51,0); + first=0; + } + + numera=*numera0; + for(i=0; i<12; i++) recd[i]=recd0[62-i]; + for(i=0; i<51; i++) recd[12+i]=recd0[50-i]; + if(numera) + for(i=0; i +#ifdef QT5 +#include +#else +#include +#endif +#include + +#include "revision_utils.hpp" +#include "mainwindow.h" + +extern "C" { + // Fortran procedures we need + void four2a_ (_Complex float *, int * nfft, int * ndim, int * isign, int * iform, int len); +} + +int main(int argc, char *argv[]) +{ + QApplication a {argc, argv}; + // Override programs executable basename as application name. + a.setApplicationName ("MAP65"); + a.setApplicationVersion ("3.0.0-rc1"); + // switch off as we share an Info.plist file with WSJT-X + a.setAttribute (Qt::AA_DontUseNativeMenuBar); + MainWindow w; + w.show (); + QObject::connect (&a, &QApplication::lastWindowClosed, &a, &QApplication::quit); + auto result = a.exec (); + + // clean up lazily initialized FFTW3 resources + { + int nfft {-1}; + int ndim {1}; + int isign {1}; + int iform {1}; + // free FFT plan resources + four2a_ (nullptr, &nfft, &ndim, &isign, &iform, 0); + } + fftwf_forget_wisdom (); + fftwf_cleanup (); + + return result; +} diff --git a/map65/mainwindow.cpp b/map65/mainwindow.cpp new file mode 100644 index 000000000..947f25969 --- /dev/null +++ b/map65/mainwindow.cpp @@ -0,0 +1,2313 @@ +//------------------------------------------------------------------ MainWindow +#include "mainwindow.h" +#include +#include +#include +#include +#include +#include "revision_utils.hpp" +#include "qt_helpers.hpp" +#include "SettingsGroup.hpp" +#include "widgets/MessageBox.hpp" +#include "ui_mainwindow.h" +#include "devsetup.h" +#include "plotter.h" +#include "about.h" +#include "astro.h" +#include "widegraph.h" +#include "messages.h" +#include "bandmap.h" +#include "txtune.h" +#include "sleep.h" +#include + +#define NFFT 32768 + +short int iwave[2*60*11025]; //Wave file for Tx audio +int nwave; //Length of Tx waveform +bool btxok; //True if OK to transmit +bool bTune; +bool bIQxt; +double outputLatency; //Latency in seconds +int txPower; +int iqAmp; +int iqPhase; +qint16 id[4*60*96000]; + +TxTune* g_pTxTune = NULL; +QSharedMemory mem_m65("mem_m65"); + +extern const int RxDataFrequency = 96000; +extern const int TxDataFrequency = 11025; + +//-------------------------------------------------- MainWindow constructor +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow), + m_appDir {QApplication::applicationDirPath ()}, + m_settings_filename {m_appDir + "/map65.ini"}, + m_astro_window {new Astro {m_settings_filename}}, + m_band_map_window {new BandMap {m_settings_filename}}, + m_messages_window {new Messages {m_settings_filename}}, + m_wide_graph_window {new WideGraph {m_settings_filename}}, + m_gui_timer {new QTimer {this}} +{ + ui->setupUi(this); + on_EraseButton_clicked(); + ui->labUTC->setStyleSheet( \ + "QLabel { background-color : black; color : yellow; }"); + ui->labTol1->setStyleSheet( \ + "QLabel { background-color : white; color : black; }"); + ui->labTol1->setFrameStyle(QFrame::Panel | QFrame::Sunken); + ui->dxStationGroupBox->setStyleSheet("QFrame{border: 5px groove red}"); + + QActionGroup* paletteGroup = new QActionGroup(this); + ui->actionCuteSDR->setActionGroup(paletteGroup); + ui->actionLinrad->setActionGroup(paletteGroup); + ui->actionAFMHot->setActionGroup(paletteGroup); + ui->actionBlue->setActionGroup(paletteGroup); + + QActionGroup* modeGroup = new QActionGroup(this); + ui->actionNoJT65->setActionGroup(modeGroup); + ui->actionJT65A->setActionGroup(modeGroup); + ui->actionJT65B->setActionGroup(modeGroup); + ui->actionJT65C->setActionGroup(modeGroup); + + QActionGroup* modeGroup2 = new QActionGroup(this); + ui->actionNoQ65->setActionGroup(modeGroup2); + ui->actionQ65A->setActionGroup(modeGroup2); + ui->actionQ65B->setActionGroup(modeGroup2); + ui->actionQ65C->setActionGroup(modeGroup2); + ui->actionQ65D->setActionGroup(modeGroup2); + ui->actionQ65E->setActionGroup(modeGroup2); + + QActionGroup* saveGroup = new QActionGroup(this); + ui->actionSave_all->setActionGroup(saveGroup); + ui->actionNone->setActionGroup(saveGroup); + + QActionGroup* DepthGroup = new QActionGroup(this); + ui->actionNo_Deep_Search->setActionGroup(DepthGroup); + ui->actionNormal_Deep_Search->setActionGroup(DepthGroup); + ui->actionAggressive_Deep_Search->setActionGroup(DepthGroup); + + QButtonGroup* txMsgButtonGroup = new QButtonGroup; + txMsgButtonGroup->addButton(ui->txrb1,1); + txMsgButtonGroup->addButton(ui->txrb2,2); + txMsgButtonGroup->addButton(ui->txrb3,3); + txMsgButtonGroup->addButton(ui->txrb4,4); + txMsgButtonGroup->addButton(ui->txrb5,5); + txMsgButtonGroup->addButton(ui->txrb6,6); + connect(txMsgButtonGroup,SIGNAL(buttonClicked(int)),SLOT(set_ntx(int))); + connect(ui->decodedTextBrowser,SIGNAL(selectCallsign(bool)),this, + SLOT(selectCall2(bool))); + + setWindowTitle (program_title ()); + + connect(&soundInThread, SIGNAL(readyForFFT(int)), + this, SLOT(dataSink(int))); + connect(&soundInThread, SIGNAL(error(QString)), this, + SLOT(showSoundInError(QString))); + connect(&soundInThread, SIGNAL(status(QString)), this, + SLOT(showStatusMessage(QString))); + createStatusBar(); + + connect(&proc_m65, SIGNAL(readyReadStandardOutput()), this, SLOT(readFromStdout())); + connect(&proc_m65, &QProcess::errorOccurred, this, &MainWindow::m65_error); + connect(&proc_m65, static_cast (&QProcess::finished), + [this] (int exitCode, QProcess::ExitStatus status) { + if (subProcessFailed (&proc_m65, exitCode, status)) + { + QTimer::singleShot (0, this, SLOT (close ())); + } + }); + + connect(&proc_editor, SIGNAL(error(QProcess::ProcessError)), + this, SLOT(editor_error())); + + connect(m_gui_timer, &QTimer::timeout, this, &MainWindow::guiUpdate); + + m_auto=false; + m_waterfallAvg = 1; + m_network = true; + m_txFirst=false; + m_txMute=false; + btxok=false; + m_restart=false; + m_transmitting=false; + m_widebandDecode=false; + m_ntx=1; + m_myCall="K1JT"; + m_myGrid="FN20qi"; + m_saveDir="/users/joe/map65/install/save"; + m_azelDir="/users/joe/map65/install/"; + m_editorCommand="notepad"; + m_txFreq=125; + m_setftx=0; + m_loopall=false; + m_startAnother=false; + m_saveAll=false; + m_onlyEME=false; + m_sec0=-1; + m_hsym0=-1; + m_palette="CuteSDR"; + m_map65RxLog=1; //Write Date and Time to all65.txt + m_nutc0=9999; + m_kb8rq=false; + m_NB=false; + m_mode="JT65B"; + m_mode65=2; + m_fs96000=true; + m_udpPort=50004; + m_adjustIQ=0; + m_applyIQcal=0; + m_colors="000066ff0000ffff00969696646464"; + m_nsave=0; + m_modeJT65=0; + m_modeQ65=0; + m_TRperiod=60; + m_modeTx="JT65"; + bTune=false; + txPower=100; + iqAmp=0; + iqPhase=0; + + xSignalMeter = new SignalMeter(ui->xMeterFrame); + xSignalMeter->resize(50, 160); + ySignalMeter = new SignalMeter(ui->yMeterFrame); + ySignalMeter->resize(50, 160); + +#ifdef WIN32 + while(true) { + int iret=killbyname("m65.exe"); + if(iret == 603) break; + if(iret != 0) msgBox("KillByName return code: " + + QString::number(iret)); + } +#endif + + if(!mem_m65.attach()) { + if (!mem_m65.create(sizeof(datcom_))) { + msgBox("Unable to create shared memory segment."); + } + } + char *to = (char*)mem_m65.data(); + int size=sizeof(datcom_); + if(datcom_.newdat==0) { + int noffset = 4*4*5760000 + 4*4*322*32768 + 4*4*32768; + to += noffset; + size -= noffset; + } + memset(to,0,size); //Zero all decoding params in shared memory + + fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); + + PaError paerr=Pa_Initialize(); //Initialize Portaudio + if(paerr!=paNoError) { + msgBox("Unable to initialize PortAudio."); + } + readSettings(); //Restore user's setup params + QFile lockFile(m_appDir + "/.lock"); //Create .lock so m65 will wait + lockFile.open(QIODevice::ReadWrite); + QFile quitFile(m_appDir + "/.quit"); + quitFile.remove(); + proc_m65.start(QDir::toNativeSeparators(m_appDir + "/m65"), {"-s", }); + + m_pbdecoding_style1="QPushButton{background-color: cyan; \ + border-style: outset; border-width: 1px; border-radius: 5px; \ + border-color: black; min-width: 5em; padding: 3px;}"; + m_pbmonitor_style="QPushButton{background-color: #00ff00; \ + border-style: outset; border-width: 1px; border-radius: 5px; \ + border-color: black; min-width: 5em; padding: 3px;}"; + m_pbAutoOn_style="QPushButton{background-color: red; \ + border-style: outset; border-width: 1px; border-radius: 5px; \ + border-color: black; min-width: 5em; padding: 3px;}"; + + genStdMsgs(""); + + on_actionAstro_Data_triggered(); //Create the other windows + on_actionWide_Waterfall_triggered(); + on_actionMessages_triggered(); + on_actionBand_Map_triggered(); + if (m_messages_window) m_messages_window->setColors(m_colors); + m_band_map_window->setColors(m_colors); + if (m_astro_window) m_astro_window->setFontSize (m_astroFont); + + if(m_modeQ65==0) on_actionNoQ65_triggered(); + if(m_modeQ65==1) on_actionQ65A_triggered(); + if(m_modeQ65==2) on_actionQ65B_triggered(); + if(m_modeQ65==3) on_actionQ65C_triggered(); + if(m_modeQ65==4) on_actionQ65D_triggered(); + if(m_modeQ65==5) on_actionQ65E_triggered(); + + if(m_modeJT65==0) on_actionNoJT65_triggered(); + if(m_modeJT65==1) on_actionJT65A_triggered(); + if(m_modeJT65==2) on_actionJT65B_triggered(); + if(m_modeJT65==3) on_actionJT65C_triggered(); + future1 = new QFuture; + watcher1 = new QFutureWatcher; + connect(watcher1, SIGNAL(finished()),this,SLOT(diskDat())); + + future2 = new QFuture; + watcher2 = new QFutureWatcher; + connect(watcher2, SIGNAL(finished()),this,SLOT(diskWriteFinished())); + +// Assign input device and start input thread + soundInThread.setInputDevice(m_paInDevice); + if(m_fs96000) soundInThread.setRate(96000.0); + if(!m_fs96000) soundInThread.setRate(95238.1); + soundInThread.setBufSize(10*7056); + soundInThread.setNetwork(m_network); + soundInThread.setPort(m_udpPort); + if(!m_xpol) soundInThread.setNrx(1); + if(m_xpol) soundInThread.setNrx(2); + soundInThread.start(QThread::HighestPriority); + + // Assign output device and start output thread + soundOutThread.setOutputDevice(m_paOutDevice); +// soundOutThread.start(QThread::HighPriority); + + m_monitoring=true; // Start with Monitoring ON + soundInThread.setMonitoring(m_monitoring); + m_diskData=false; + m_tol=500; + m_wide_graph_window->setTol(m_tol); + m_wide_graph_window->setFcal(m_fCal); + if(m_fs96000) m_wide_graph_window->setFsample(96000); + if(!m_fs96000) m_wide_graph_window->setFsample(95238); + m_wide_graph_window->m_mult570=m_mult570; + m_wide_graph_window->m_mult570Tx=m_mult570Tx; + m_wide_graph_window->m_cal570=m_cal570; + m_wide_graph_window->m_TxOffset=m_TxOffset; + if(m_initIQplus) m_wide_graph_window->initIQplus(); + +// Create "m_worked", a dictionary of all calls in wsjt.log + QFile f("wsjt.log"); + f.open(QIODevice::ReadOnly); + if(f.isOpen()) { + QTextStream in(&f); + QString line,t,callsign; + for(int i=0; i<99999; i++) { + line=in.readLine(); + if(line.length()<=0) break; + t=line.mid(18,12); + callsign=t.mid(0,t.indexOf(",")); + m_worked[callsign]=true; + } + f.close(); + } + + if(ui->actionLinrad->isChecked()) on_actionLinrad_triggered(); + if(ui->actionCuteSDR->isChecked()) on_actionCuteSDR_triggered(); + if(ui->actionAFMHot->isChecked()) on_actionAFMHot_triggered(); + if(ui->actionBlue->isChecked()) on_actionBlue_triggered(); + + connect (m_messages_window.get (), &Messages::click2OnCallsign, this, &MainWindow::doubleClickOnMessages); + connect (m_wide_graph_window.get (), &WideGraph::freezeDecode2, this, &MainWindow::freezeDecode); + connect (m_wide_graph_window.get (), &WideGraph::f11f12, this, &MainWindow::bumpDF); + + // only start the guiUpdate timer after this constructor has finished + QTimer::singleShot (0, [=] { + m_gui_timer->start(100); //Don't change the 100 ms! + }); +} + + //--------------------------------------------------- MainWindow destructor +MainWindow::~MainWindow() +{ + writeSettings(); + if (soundInThread.isRunning()) { + soundInThread.quit(); + soundInThread.wait(3000); + } + if (soundOutThread.isRunning()) { + soundOutThread.quitExecution=true; + soundOutThread.wait(3000); + } + Pa_Terminate(); + fftwf_export_wisdom_to_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); + if(!m_decoderBusy) { + QFile lockFile(m_appDir + "/.lock"); + lockFile.remove(); + } + delete ui; +} + +//-------------------------------------------------------- writeSettings() +void MainWindow::writeSettings() +{ + QSettings settings(m_settings_filename, QSettings::IniFormat); + { + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue("geometry", saveGeometry()); + settings.setValue("MRUdir", m_path); + settings.setValue("TxFirst",m_txFirst); + settings.setValue("DXcall",ui->dxCallEntry->text()); + settings.setValue("DXgrid",ui->dxGridEntry->text()); + } + + SettingsGroup g {&settings, "Common"}; + settings.setValue("MyCall",m_myCall); + settings.setValue("MyGrid",m_myGrid); + settings.setValue("IDint",m_idInt); + settings.setValue("PTTport",m_pttPort); + settings.setValue("AstroFont",m_astroFont); + settings.setValue("Xpol",m_xpol); + settings.setValue("XpolX",m_xpolx); + settings.setValue("SaveDir",m_saveDir); + settings.setValue("AzElDir",m_azelDir); + settings.setValue("Editor",m_editorCommand); + settings.setValue("DXCCpfx",m_dxccPfx); + settings.setValue("Timeout",m_timeout); + settings.setValue("TxPower",txPower); + settings.setValue("IQamp",iqAmp); + settings.setValue("IQphase",iqPhase); + settings.setValue("ApplyIQcal",m_applyIQcal); + settings.setValue("dPhi",m_dPhi); + settings.setValue("Fcal",m_fCal); + settings.setValue("Fadd",m_fAdd); + settings.setValue("NetworkInput", m_network); + settings.setValue("FSam96000", m_fs96000); + settings.setValue("SoundInIndex",m_nDevIn); + settings.setValue("paInDevice",m_paInDevice); + settings.setValue("SoundOutIndex",m_nDevOut); + settings.setValue("paOutDevice",m_paOutDevice); + settings.setValue("IQswap",m_IQswap); + settings.setValue("Plus10dB",m_10db); + settings.setValue("IQxt",m_bIQxt); + settings.setValue("InitIQplus",m_initIQplus); + settings.setValue("UDPport",m_udpPort); + settings.setValue("PaletteCuteSDR",ui->actionCuteSDR->isChecked()); + settings.setValue("PaletteLinrad",ui->actionLinrad->isChecked()); + settings.setValue("PaletteAFMHot",ui->actionAFMHot->isChecked()); + settings.setValue("PaletteBlue",ui->actionBlue->isChecked()); + settings.setValue("Mode",m_mode); + settings.setValue("nModeJT65",m_modeJT65); + settings.setValue("nModeQ65",m_modeQ65); + settings.setValue("TxMode",m_modeTx); + settings.setValue("SaveNone",ui->actionNone->isChecked()); + settings.setValue("SaveAll",ui->actionSave_all->isChecked()); + settings.setValue("NDepth",m_ndepth); + settings.setValue("NEME",m_onlyEME); + settings.setValue("KB8RQ",m_kb8rq); + settings.setValue("NB",m_NB); + settings.setValue("NBslider",m_NBslider); + settings.setValue("GainX",(double)m_gainx); + settings.setValue("GainY",(double)m_gainy); + settings.setValue("PhaseX",(double)m_phasex); + settings.setValue("PhaseY",(double)m_phasey); + settings.setValue("Mult570",m_mult570); + settings.setValue("Mult570Tx",m_mult570Tx); + settings.setValue("Cal570",m_cal570); + settings.setValue("TxOffset",m_TxOffset); + settings.setValue("Colors",m_colors); + settings.setValue("MaxDrift",ui->sbMaxDrift->value()); +} + +//---------------------------------------------------------- readSettings() +void MainWindow::readSettings() +{ + QSettings settings(m_settings_filename, QSettings::IniFormat); + { + SettingsGroup g {&settings, "MainWindow"}; + restoreGeometry(settings.value("geometry").toByteArray()); + ui->dxCallEntry->setText(settings.value("DXcall","").toString()); + ui->dxGridEntry->setText(settings.value("DXgrid","").toString()); + m_path = settings.value("MRUdir", m_appDir + "/save").toString(); + m_txFirst = settings.value("TxFirst",false).toBool(); + ui->txFirstCheckBox->setChecked(m_txFirst); + } + + SettingsGroup g {&settings, "Common"}; + m_myCall=settings.value("MyCall","").toString(); + m_myGrid=settings.value("MyGrid","").toString(); + m_idInt=settings.value("IDint",0).toInt(); + m_pttPort=settings.value("PTTport",0).toInt(); + m_astroFont=settings.value("AstroFont",20).toInt(); + m_xpol=settings.value("Xpol",false).toBool(); + ui->actionFind_Delta_Phi->setEnabled(m_xpol); + m_xpolx=settings.value("XpolX",false).toBool(); + m_saveDir=settings.value("SaveDir",m_appDir + "/save").toString(); + m_azelDir=settings.value("AzElDir",m_appDir).toString(); + m_editorCommand=settings.value("Editor","notepad").toString(); + m_dxccPfx=settings.value("DXCCpfx","").toString(); + m_timeout=settings.value("Timeout",20).toInt(); + txPower=settings.value("TxPower",100).toInt(); + iqAmp=settings.value("IQamp",0).toInt(); + iqPhase=settings.value("IQphase",0).toInt(); + m_applyIQcal=settings.value("ApplyIQcal",0).toInt(); + ui->actionApply_IQ_Calibration->setChecked(m_applyIQcal!=0); + m_dPhi=settings.value("dPhi",0).toInt(); + m_fCal=settings.value("Fcal",0).toInt(); + m_fAdd=settings.value("FAdd",0).toDouble(); + soundInThread.setFadd(m_fAdd); + m_network = settings.value("NetworkInput",true).toBool(); + m_fs96000 = settings.value("FSam96000",true).toBool(); + m_nDevIn = settings.value("SoundInIndex", 0).toInt(); + m_paInDevice = settings.value("paInDevice",0).toInt(); + m_nDevOut = settings.value("SoundOutIndex", 0).toInt(); + m_paOutDevice = settings.value("paOutDevice",0).toInt(); + m_IQswap = settings.value("IQswap",false).toBool(); + m_10db = settings.value("Plus10dB",false).toBool(); + m_initIQplus = settings.value("InitIQplus",false).toBool(); + m_bIQxt = settings.value("IQxt",false).toBool(); + m_udpPort = settings.value("UDPport",50004).toInt(); + soundInThread.setSwapIQ(m_IQswap); + soundInThread.set10db(m_10db); + soundInThread.setPort(m_udpPort); + ui->actionCuteSDR->setChecked(settings.value( + "PaletteCuteSDR",true).toBool()); + ui->actionLinrad->setChecked(settings.value( + "PaletteLinrad",false).toBool()); + m_mode=settings.value("Mode","JT65B").toString(); + m_modeJT65=settings.value("nModeJT65",2).toInt(); + if(m_modeJT65==0) ui->actionNoJT65->setChecked(true); + if(m_modeJT65==1) ui->actionJT65A->setChecked(true); + if(m_modeJT65==2) ui->actionJT65B->setChecked(true); + if(m_modeJT65==3) ui->actionJT65C->setChecked(true); + + m_modeQ65=settings.value("nModeQ65",2).toInt(); + m_modeTx=settings.value("TxMode","JT65").toString(); + if(m_modeQ65==0) ui->actionNoQ65->setChecked(true); + if(m_modeQ65==1) ui->actionQ65A->setChecked(true); + if(m_modeQ65==2) ui->actionQ65B->setChecked(true); + if(m_modeQ65==3) ui->actionQ65C->setChecked(true); + if(m_modeQ65==4) ui->actionQ65D->setChecked(true); + if(m_modeQ65==5) ui->actionQ65E->setChecked(true); + if(m_modeTx=="JT65") ui->pbTxMode->setText("Tx JT65 #"); + if(m_modeTx=="Q65") ui->pbTxMode->setText("Tx Q65 :"); + + ui->actionNone->setChecked(settings.value("SaveNone",true).toBool()); + ui->actionSave_all->setChecked(settings.value("SaveAll",false).toBool()); + m_saveAll=ui->actionSave_all->isChecked(); + m_ndepth=settings.value("NDepth",0).toInt(); + m_onlyEME=settings.value("NEME",false).toBool(); + ui->actionOnly_EME_calls->setChecked(m_onlyEME); + m_kb8rq=settings.value("KB8RQ",false).toBool(); + ui->actionF4_sets_Tx6->setChecked(m_kb8rq); + m_NB=settings.value("NB",false).toBool(); + ui->NBcheckBox->setChecked(m_NB); + ui->sbMaxDrift->setValue(settings.value("MaxDrift",0).toInt()); + m_NBslider=settings.value("NBslider",40).toInt(); + ui->NBslider->setValue(m_NBslider); + m_gainx=settings.value("GainX",1.0).toFloat(); + m_gainy=settings.value("GainY",1.0).toFloat(); + m_phasex=settings.value("PhaseX",0.0).toFloat(); + m_phasey=settings.value("PhaseY",0.0).toFloat(); + m_mult570=settings.value("Mult570",2).toInt(); + m_mult570Tx=settings.value("Mult570Tx",1).toInt(); + m_cal570=settings.value("Cal570",0.0).toDouble(); + m_TxOffset=settings.value("TxOffset",130.9).toDouble(); + m_colors=settings.value("Colors","000066ff0000ffff00969696646464").toString(); + + if(!ui->actionLinrad->isChecked() && !ui->actionCuteSDR->isChecked() && + !ui->actionAFMHot->isChecked() && !ui->actionBlue->isChecked()) { + on_actionLinrad_triggered(); + ui->actionLinrad->setChecked(true); + } + if(m_ndepth==0) ui->actionNo_Deep_Search->setChecked(true); + if(m_ndepth==1) ui->actionNormal_Deep_Search->setChecked(true); + if(m_ndepth==2) ui->actionAggressive_Deep_Search->setChecked(true); +} + +//-------------------------------------------------------------- dataSink() +void MainWindow::dataSink(int k) +{ + static float s[NFFT],splot[NFFT]; + static int n=0; + static int ihsym=0; + static int nzap=0; + static int ntrz=0; + static int nkhz; + static int nfsample=96000; + static int nxpol=0; + static float fgreen; + static int ndiskdat; + static int nb; + static int nadj=0; + static float px=0.0,py=0.0; + static uchar lstrong[1024]; + static float rejectx; + static float rejecty; + static float slimit; + + + if(m_diskData) { + ndiskdat=1; + datcom_.ndiskdat=1; + } else { + ndiskdat=0; + datcom_.ndiskdat=0; + } +// Get x and y power, polarized spectrum, nkhz, and ihsym + nb=0; + if(m_NB) nb=1; + nfsample=96000; + if(!m_fs96000) nfsample=95238; + nxpol=0; + if(m_xpol) nxpol=1; + fgreen=m_wide_graph_window->fGreen(); + nadj++; + if(m_adjustIQ==0) nadj=0; + symspec_(&k, &nxpol, &ndiskdat, &nb, &m_NBslider, &m_dPhi, + &nfsample, &fgreen, &m_adjustIQ, &m_applyIQcal, + &m_gainx, &m_gainy, &m_phasex, &m_phasey, &rejectx, &rejecty, + &px, &py, s, &nkhz, &ihsym, &nzap, &slimit, lstrong); + QString t; + m_pctZap=nzap/178.3; + if(m_xpol) { + lab4->setText ( + QString {" Rx noise: %1 %2 %3 %% "} + .arg (px, 5, 'f', 1) + .arg (py, 5, 'f', 1) + .arg (m_pctZap, 5, 'f', 1) + ); + } else { + lab4->setText ( + QString {" Rx noise: %1 %2 %% "} + .arg (px, 5, 'f', 1) + .arg (m_pctZap, 5, 'f', 1) + ); + } + xSignalMeter->setValue(px); // Update the signal meters + ySignalMeter->setValue(py); + if(m_monitoring || m_diskData) { + m_wide_graph_window->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); + } + + if(nadj == 10) { + if(m_xpol) { + ui->decodedTextBrowser->append ( + QString {"Amp: %1 %2 Phase: %3 %4"} + .arg (m_gainx, 6, 'f', 4).arg (m_gainy, 6, 'f', 4) + .arg (m_phasex, 6, 'f', 4) + .arg (m_phasey, 6, 'f', 4) + ); + } else { + ui->decodedTextBrowser->append( + QString {"Amp: %1 Phase: %1"} + .arg (m_gainx, 6, 'f', 4) + .arg (m_phasex, 6, 'f', 4) + ); + } + ui->decodedTextBrowser->append(t); + m_adjustIQ=0; + } + + //Average over specified number of spectra + if (n==0) { + for (int i=0; i=m_waterfallAvg) { + for (int i=0; isetFuture(*future2); + } + } + soundInThread.m_dataSinkBusy=false; +} + +void MainWindow::showSoundInError(const QString& errorMsg) + {QMessageBox::critical(this, tr("Error in SoundIn"), errorMsg);} + +void MainWindow::showStatusMessage(const QString& statusMsg) + {statusBar()->showMessage(statusMsg);} + +void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog +{ + DevSetup dlg(this); + dlg.m_myCall=m_myCall; + dlg.m_myGrid=m_myGrid; + dlg.m_idInt=m_idInt; + dlg.m_pttPort=m_pttPort; + dlg.m_astroFont=m_astroFont; + dlg.m_xpol=m_xpol; + dlg.m_xpolx=m_xpolx; + dlg.m_saveDir=m_saveDir; + dlg.m_azelDir=m_azelDir; + dlg.m_editorCommand=m_editorCommand; + dlg.m_dxccPfx=m_dxccPfx; + dlg.m_timeout=m_timeout; + dlg.m_dPhi=m_dPhi; + dlg.m_fCal=m_fCal; + dlg.m_fAdd=m_fAdd; + dlg.m_network=m_network; + dlg.m_fs96000=m_fs96000; + dlg.m_nDevIn=m_nDevIn; + dlg.m_nDevOut=m_nDevOut; + dlg.m_udpPort=m_udpPort; + dlg.m_IQswap=m_IQswap; + dlg.m_10db=m_10db; + dlg.m_initIQplus=m_initIQplus; + dlg.m_bIQxt=m_bIQxt; + dlg.m_cal570=m_cal570; + dlg.m_TxOffset=m_TxOffset; + dlg.m_mult570=m_mult570; + dlg.m_mult570Tx=m_mult570Tx; + dlg.m_colors=m_colors; + + dlg.initDlg(); + if(dlg.exec() == QDialog::Accepted) { + m_myCall=dlg.m_myCall; + m_myGrid=dlg.m_myGrid; + m_idInt=dlg.m_idInt; + m_pttPort=dlg.m_pttPort; + m_astroFont=dlg.m_astroFont; + if(m_astro_window && m_astro_window->isVisible()) m_astro_window->setFontSize(m_astroFont); + m_xpol=dlg.m_xpol; + ui->actionFind_Delta_Phi->setEnabled(m_xpol); + m_xpolx=dlg.m_xpolx; + m_saveDir=dlg.m_saveDir; + m_azelDir=dlg.m_azelDir; + m_editorCommand=dlg.m_editorCommand; + m_dxccPfx=dlg.m_dxccPfx; + m_timeout=dlg.m_timeout; + m_dPhi=dlg.m_dPhi; + m_fCal=dlg.m_fCal; + m_fAdd=dlg.m_fAdd; + m_wide_graph_window->setFcal(m_fCal); + m_fs96000=dlg.m_fs96000; + m_network=dlg.m_network; + m_nDevIn=dlg.m_nDevIn; + m_paInDevice=dlg.m_paInDevice; + m_nDevOut=dlg.m_nDevOut; + m_paOutDevice=dlg.m_paOutDevice; + m_udpPort=dlg.m_udpPort; + m_IQswap=dlg.m_IQswap; + m_10db=dlg.m_10db; + m_initIQplus=dlg.m_initIQplus; + m_bIQxt=dlg.m_bIQxt; + m_colors=dlg.m_colors; + m_messages_window->setColors(m_colors); + m_band_map_window->setColors(m_colors); + m_cal570=dlg.m_cal570; + m_TxOffset=dlg.m_TxOffset; + m_mult570Tx=dlg.m_mult570Tx; + m_wide_graph_window->m_mult570=m_mult570; + m_wide_graph_window->m_mult570Tx=m_mult570Tx; + m_wide_graph_window->m_cal570=m_cal570; + soundInThread.setSwapIQ(m_IQswap); + soundInThread.set10db(m_10db); + + if(dlg.m_restartSoundIn) { + soundInThread.quit(); + soundInThread.wait(1000); + soundInThread.setNetwork(m_network); + if(m_fs96000) soundInThread.setRate(96000.0); + if(!m_fs96000) soundInThread.setRate(95238.1); + soundInThread.setFadd(m_fAdd); + if(!m_xpol) soundInThread.setNrx(1); + if(m_xpol) soundInThread.setNrx(2); + soundInThread.setInputDevice(m_paInDevice); + soundInThread.start(QThread::HighestPriority); + } + + if(dlg.m_restartSoundOut) { + soundOutThread.quitExecution=true; + soundOutThread.wait(1000); + soundOutThread.setOutputDevice(m_paOutDevice); +// soundOutThread.start(QThread::HighPriority); + } + } +} + +void MainWindow::on_monitorButton_clicked() //Monitor +{ + m_monitoring=true; + soundInThread.setMonitoring(true); + m_diskData=false; +} +void MainWindow::on_actionLinrad_triggered() //Linrad palette +{ + if(m_wide_graph_window) m_wide_graph_window->setPalette("Linrad"); +} + +void MainWindow::on_actionCuteSDR_triggered() //CuteSDR palette +{ + if(m_wide_graph_window) m_wide_graph_window->setPalette("CuteSDR"); +} + +void MainWindow::on_actionAFMHot_triggered() +{ + if(m_wide_graph_window) m_wide_graph_window->setPalette("AFMHot"); +} + +void MainWindow::on_actionBlue_triggered() +{ + if(m_wide_graph_window) m_wide_graph_window->setPalette("Blue"); +} + +void MainWindow::on_actionAbout_triggered() //Display "About" +{ + CAboutDlg dlg(this); + dlg.exec(); +} + +void MainWindow::on_autoButton_clicked() //Auto +{ + m_auto = !m_auto; + if(m_auto) { + ui->autoButton->setStyleSheet(m_pbAutoOn_style); + ui->autoButton->setText("Auto is ON"); + } else { + btxok=false; + ui->autoButton->setStyleSheet(""); + ui->autoButton->setText("Auto is OFF"); + on_monitorButton_clicked(); + } +} + +void MainWindow::on_stopTxButton_clicked() //Stop Tx +{ + if(m_auto) on_autoButton_clicked(); + btxok=false; +} + +void MainWindow::keyPressEvent( QKeyEvent *e ) //keyPressEvent +{ + switch(e->key()) + { + case Qt::Key_F3: + m_txMute=!m_txMute; + break; + case Qt::Key_F4: + ui->dxCallEntry->setText(""); + ui->dxGridEntry->setText(""); + if(m_kb8rq) { + m_ntx=6; + ui->txrb6->setChecked(true); + } + break; + case Qt::Key_F6: + if(e->modifiers() & Qt::ShiftModifier) { + on_actionDecode_remaining_files_in_directory_triggered(); + } + break; + case Qt::Key_F11: + if(e->modifiers() & Qt::ShiftModifier) { + } else { + int n0=m_wide_graph_window->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + m_wide_graph_window->setDF(n0-n); + } + break; + case Qt::Key_F12: + if(e->modifiers() & Qt::ShiftModifier) { + } else { + int n0=m_wide_graph_window->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + m_wide_graph_window->setDF(n0+n); + } + break; + case Qt::Key_G: + if(e->modifiers() & Qt::AltModifier) { + genStdMsgs(""); + } + break; + case Qt::Key_L: + if(e->modifiers() & Qt::ControlModifier) { + lookup(); + genStdMsgs(""); + break; + } + } +} + +void MainWindow::bumpDF(int n) //bumpDF() +{ + if(n==11) { + int n0=m_wide_graph_window->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + m_wide_graph_window->setDF(n0-n); + } + if(n==12) { + int n0=m_wide_graph_window->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + m_wide_graph_window->setDF(n0+n); + } +} + +bool MainWindow::eventFilter(QObject *object, QEvent *event) //eventFilter() +{ + if (event->type() == QEvent::KeyPress) { + //Use the event in parent using its keyPressEvent() + QKeyEvent *keyEvent = static_cast(event); + MainWindow::keyPressEvent(keyEvent); + return QObject::eventFilter(object, event); + } + return QObject::eventFilter(object, event); +} + +void MainWindow::createStatusBar() //createStatusBar +{ + lab1 = new QLabel("Receiving"); + lab1->setAlignment(Qt::AlignHCenter); + lab1->setMinimumSize(QSize(80,10)); + lab1->setStyleSheet("QLabel{background-color: #00ff00}"); + lab1->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab1); + + lab2 = new QLabel("QSO freq: 125"); + lab2->setAlignment(Qt::AlignHCenter); + lab2->setMinimumSize(QSize(90,10)); + lab2->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab2); + + lab3 = new QLabel("QSO DF: 0"); + lab3->setAlignment(Qt::AlignHCenter); + lab3->setMinimumSize(QSize(80,10)); + lab3->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab3); + + lab4 = new QLabel(""); + lab4->setAlignment(Qt::AlignHCenter); + lab4->setMinimumSize(QSize(80,10)); + lab4->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab4); + + lab5 = new QLabel(""); + lab5->setAlignment(Qt::AlignHCenter); + lab5->setMinimumSize(QSize(50,10)); + lab5->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab5); + + lab6 = new QLabel(""); + lab6->setAlignment(Qt::AlignHCenter); + lab6->setMinimumSize(QSize(50,10)); + lab6->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab6); + + lab7 = new QLabel("Avg: 0"); + lab7->setAlignment(Qt::AlignHCenter); + lab7->setMinimumSize(QSize(50,10)); + lab7->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab7); +} + +void MainWindow::on_tolSpinBox_valueChanged(int i) //tolSpinBox +{ + static int ntol[] = {10,20,50,100,200,500,1000}; + m_tol=ntol[i]; + m_wide_graph_window->setTol(m_tol); + ui->labTol1->setText(QString::number(ntol[i])); +} + +void MainWindow::on_actionExit_triggered() //Exit() +{ + close (); +} + +void MainWindow::closeEvent (QCloseEvent * e) +{ + if (m_gui_timer) m_gui_timer->stop (); + m_wide_graph_window->saveSettings(); + QFile quitFile(m_appDir + "/.quit"); + quitFile.open(QIODevice::ReadWrite); + QFile lockFile(m_appDir + "/.lock"); + lockFile.remove(); // Allow m65 to terminate + + // close pipes + proc_m65.closeReadChannel (QProcess::StandardOutput); + proc_m65.closeReadChannel (QProcess::StandardError); + + // flush all input + proc_m65.setReadChannel (QProcess::StandardOutput); + proc_m65.readAll (); + proc_m65.setReadChannel (QProcess::StandardError); + proc_m65.readAll (); + + // allow time for any decode cycle to finish + if (!proc_m65.waitForFinished ()) proc_m65.kill(); + quitFile.remove(); + mem_m65.detach(); + if (m_astro_window) m_astro_window->close (); + if (m_band_map_window) m_band_map_window->close (); + if (m_messages_window) m_messages_window->close (); + if (m_wide_graph_window) m_wide_graph_window->close (); + QMainWindow::closeEvent (e); +} + +void MainWindow::on_stopButton_clicked() //stopButton +{ + m_monitoring=false; + soundInThread.setMonitoring(m_monitoring); + m_loopall=false; +} + +void MainWindow::msgBox(QString t) //msgBox +{ + msgBox0.setText(t); + msgBox0.exec(); +} + +void MainWindow::stub() //stub() +{ + msgBox("Not yet implemented."); +} + +void MainWindow::on_actionOnline_Users_Guide_triggered() //Display manual +{ + QDesktopServices::openUrl(QUrl( + "https://www.physics.princeton.edu/pulsar/K1JT/MAP65_Users_Guide.pdf", + QUrl::TolerantMode)); +} + +void MainWindow::on_actionQSG_Q65_triggered() +{ + QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/Q65_Quick_Start.pdf"}); +} + +void MainWindow::on_actionQSG_MAP65_v3_triggered() +{ + QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/WSJTX_2.5.0_MAP65_3.0_Quick_Start.pdf"}); +} + +void MainWindow::on_actionQ65_Sensitivity_in_MAP65_3_0_triggered() +{ + QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/Q65_Sensitivity_in_MAP65.pdf"}); +} + +void MainWindow::on_actionAstro_Data_triggered() //Display Astro +{ + if (m_astro_window ) m_astro_window->show(); +} + +void MainWindow::on_actionWide_Waterfall_triggered() //Display Waterfalls +{ + m_wide_graph_window->show(); +} + +void MainWindow::on_actionBand_Map_triggered() //Display BandMap +{ + m_band_map_window->show (); +} + +void MainWindow::on_actionMessages_triggered() //Display Messages +{ + m_messages_window->show(); +} + +void MainWindow::on_actionOpen_triggered() //Open File +{ + m_monitoring=false; + soundInThread.setMonitoring(m_monitoring); + QString fname; + if(m_xpol) { + fname=QFileDialog::getOpenFileName(this, "Open File", m_path, + "MAP65 Files (*.tf2)"); + } else { + fname=QFileDialog::getOpenFileName(this, "Open File", m_path, + "MAP65 Files (*.iq)"); + } + if(fname != "") { + m_path=fname; + int i; + i=fname.indexOf(".iq") - 11; + if(m_xpol) i=fname.indexOf(".tf2") - 11; + if(i>=0) { + lab1->setStyleSheet("QLabel{background-color: #66ff66}"); + lab1->setText(" " + fname.mid(i,15) + " "); + } + on_stopButton_clicked(); + m_diskData=true; + int dbDgrd=0; + if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt; + *future1 = QtConcurrent::run(getfile, fname, m_xpol, dbDgrd); + watcher1->setFuture(*future1); + } +} + +void MainWindow::on_actionOpen_next_in_directory_triggered() //Open Next +{ + int i,len; + QFileInfo fi(m_path); + QStringList list; + if(m_xpol) { + list= fi.dir().entryList().filter(".tf2"); + } else { + list= fi.dir().entryList().filter(".iq"); + } + for (i = 0; i < list.size()-1; ++i) { + if(i==list.size()-2) m_loopall=false; + len=list.at(i).length(); + if(list.at(i)==m_path.right(len)) { + int n=m_path.length(); + QString fname=m_path.replace(n-len,len,list.at(i+1)); + m_path=fname; + int i; + i=fname.indexOf(".iq") - 11; + if(m_xpol) i=fname.indexOf(".tf2") - 11; + if(i>=0) { + lab1->setStyleSheet("QLabel{background-color: #66ff66}"); + lab1->setText(" " + fname.mid(i,len) + " "); + } + m_diskData=true; + int dbDgrd=0; + if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt; + *future1 = QtConcurrent::run(getfile, fname, m_xpol, dbDgrd); + watcher1->setFuture(*future1); + return; + } + } +} + //Open all remaining files +void MainWindow::on_actionDecode_remaining_files_in_directory_triggered() +{ + m_loopall=true; + on_actionOpen_next_in_directory_triggered(); +} + +void MainWindow::diskDat() //diskDat() +{ + double hsym; + //These may be redundant?? + m_diskData=true; + datcom_.newdat=1; + +// if(g_pWideGraph->m_bForceCenterFreq) datcom_.fcenter=g_pWideGraph->m_dForceCenterFreq; +// qDebug() << "aa" << datcom_.fcenter << g_pWideGraph->m_dForceCenterFreq +// << g_pWideGraph->m_bForceCenterFreq; + + if(m_fs96000) hsym=2048.0*96000.0/11025.0; //Samples per JT65 half-symbol + if(!m_fs96000) hsym=2048.0*95238.1/11025.0; + for(int i=0; i<304; i++) { // Do the half-symbol FFTs + int k = i*hsym + 2048.5; + dataSink(k); + if(i%10 == 0) qApp->processEvents(); //Keep the GUI responsive + } +} + +void MainWindow::diskWriteFinished() //diskWriteFinished +{ +// qDebug() << "diskWriteFinished"; +} + //Delete ../save/*.tf2 +void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() +{ + int i; + QString fname; + int ret = QMessageBox::warning(this, "Confirm Delete", + "Are you sure you want to delete all *.tf2 and *.iq files in\n" + + QDir::toNativeSeparators(m_saveDir) + " ?", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if(ret==QMessageBox::Yes) { + QDir dir(m_saveDir); + QStringList files=dir.entryList(QDir::Files); + QList::iterator f; + for(f=files.begin(); f!=files.end(); ++f) { + fname=*f; + i=(fname.indexOf(".tf2")); + if(i==11) dir.remove(fname); + i=(fname.indexOf(".iq")); + if(i==11) dir.remove(fname); + } + } +} + //Clear BandMap and Messages windows +void MainWindow::on_actionErase_Band_Map_and_Messages_triggered() +{ + m_band_map_window->setText(""); + m_messages_window->setText("",""); + m_map65RxLog |= 4; +} + +void MainWindow::on_actionFind_Delta_Phi_triggered() //Find dPhi +{ + m_map65RxLog |= 8; + on_DecodeButton_clicked(); +} + +void MainWindow::on_actionF4_sets_Tx6_triggered() //F4 sets Tx6 +{ + m_kb8rq = !m_kb8rq; +} + +void MainWindow::on_actionOnly_EME_calls_triggered() //EME calls only +{ + m_onlyEME = ui->actionOnly_EME_calls->isChecked(); +} + +void MainWindow::on_actionNo_shorthands_if_Tx1_triggered() +{ + stub(); +} + +void MainWindow::on_actionNo_Deep_Search_triggered() //No Deep Search +{ + m_ndepth=0; +} + +void MainWindow::on_actionNormal_Deep_Search_triggered() //Normal DS +{ + m_ndepth=1; +} + +void MainWindow::on_actionAggressive_Deep_Search_triggered() //Aggressive DS +{ + m_ndepth=2; +} + +void MainWindow::on_actionNone_triggered() //Save None +{ + m_saveAll=false; +} + +// ### Implement "Save Last" here? ### + +void MainWindow::on_actionSave_all_triggered() //Save All +{ + m_saveAll=true; +} + //Display list of keyboard shortcuts +void MainWindow::on_actionKeyboard_shortcuts_triggered() +{ + stub(); +} + //Display list of mouse commands +void MainWindow::on_actionSpecial_mouse_commands_triggered() +{ + stub(); +} + //Diaplay list of Add-On pfx/sfx +void MainWindow::on_actionAvailable_suffixes_and_add_on_prefixes_triggered() +{ + stub(); +} + +void MainWindow::on_DecodeButton_clicked() //Decode request +{ + int n=m_sec0%m_TRperiod; + if(m_monitoring and n>47 and (n<52 or m_decoderBusy)) return; + if(!m_decoderBusy) { + datcom_.newdat=0; + datcom_.nagain=1; + decode(); + } +} + +void MainWindow::freezeDecode(int n) //freezeDecode() +{ + if(n==2) { + ui->tolSpinBox->setValue(5); + datcom_.ntol=m_tol; + datcom_.mousedf=0; + } else { + ui->tolSpinBox->setValue(3); + datcom_.ntol=m_tol; + } + if(!m_decoderBusy) { + datcom_.nagain=1; + datcom_.newdat=0; + decode(); + } +} + +void MainWindow::decode() //decode() +{ + ui->DecodeButton->setStyleSheet(m_pbdecoding_style1); + if(datcom_.nagain==0 && (!m_diskData)) { + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + int imin=ms/60000; + int ihr=imin/60; + imin=imin % 60; + datcom_.nutc=100*ihr + imin; + } + + datcom_.idphi=m_dPhi; + datcom_.mousedf=m_wide_graph_window->DF(); + datcom_.mousefqso=m_wide_graph_window->QSOfreq(); + datcom_.ndepth=m_ndepth; + datcom_.ndiskdat=0; + if(m_diskData) datcom_.ndiskdat=1; + datcom_.neme=0; + if(ui->actionOnly_EME_calls->isChecked()) datcom_.neme=1; + + int ispan=int(m_wide_graph_window->fSpan()); + if(ispan%2 == 1) ispan++; + int ifc=int(1000.0*(datcom_.fcenter - int(datcom_.fcenter))+0.5); + int nfa=m_wide_graph_window->nStartFreq(); + int nfb=nfa+ispan; + int nfshift=nfa + ispan/2 - ifc; + + datcom_.nfa=nfa; + datcom_.nfb=nfb; + datcom_.nfcal=m_fCal; + datcom_.nfshift=nfshift; + datcom_.mcall3=0; + if(m_call3Modified) datcom_.mcall3=1; + datcom_.ntimeout=m_timeout; + datcom_.ntol=m_tol; + datcom_.nxant=0; + if(m_xpolx) datcom_.nxant=1; + if(datcom_.nutc < m_nutc0) m_map65RxLog |= 1; //Date and Time to all65.txt + m_nutc0=datcom_.nutc; + datcom_.map65RxLog=m_map65RxLog; + datcom_.nfsample=96000; + if(!m_fs96000) datcom_.nfsample=95238; + datcom_.nxpol=0; + if(m_xpol) datcom_.nxpol=1; + datcom_.nmode=10*m_modeQ65 + m_modeJT65; + datcom_.nfast=1; //No longer used + datcom_.nsave=m_nsave; + datcom_.max_drift=ui->sbMaxDrift->value(); + + QString mcall=(m_myCall+" ").mid(0,12); + QString mgrid=(m_myGrid+" ").mid(0,6); + QString hcall=(ui->dxCallEntry->text()+" ").mid(0,12); + QString hgrid=(ui->dxGridEntry->text()+" ").mid(0,6); + + memcpy(datcom_.mycall, mcall.toLatin1(), 12); + memcpy(datcom_.mygrid, mgrid.toLatin1(), 6); + memcpy(datcom_.hiscall, hcall.toLatin1(), 12); + memcpy(datcom_.hisgrid, hgrid.toLatin1(), 6); + memcpy(datcom_.datetime, m_dateTime.toLatin1(), 20); + + //newdat=1 ==> this is new data, must do the big FFT + //nagain=1 ==> decode only at fQSO +/- Tol + + char *to = (char*)mem_m65.data(); + char *from = (char*) datcom_.d4; + int size=sizeof(datcom_); + if(datcom_.newdat==0) { + int noffset = 4*4*5760000 + 4*4*322*32768 + 4*4*32768; + to += noffset; + from += noffset; + size -= noffset; + } + memcpy(to, from, qMin(mem_m65.size(), size)); + datcom_.nagain=0; + datcom_.ndiskdat=0; + m_call3Modified=false; + + QFile lockFile(m_appDir + "/.lock"); // Allow m65 to start + lockFile.remove(); + decodeBusy(true); +} + +bool MainWindow::subProcessFailed (QProcess * process, int exit_code, QProcess::ExitStatus status) +{ + if (exit_code || QProcess::NormalExit != status) + { + QStringList arguments; + for (auto argument: process->arguments ()) + { + if (argument.contains (' ')) argument = '"' + argument + '"'; + arguments << argument; + } + MessageBox::critical_message (this, tr ("Subprocess Error") + , tr ("Subprocess failed with exit code %1") + .arg (exit_code) + , tr ("Running: %1\n%2") + .arg (process->program () + ' ' + arguments.join (' ')) + .arg (QString {process->readAllStandardError()})); + return true; + } + return false; +} + +void MainWindow::m65_error (QProcess::ProcessError) +{ + msgBox("Error starting or running\n" + m_appDir + "/m65 -s\n\n" + + proc_m65.errorString ()); + QTimer::singleShot (0, this, SLOT (close ())); +} + +void MainWindow::editor_error() //editor_error +{ + msgBox("Error starting or running\n" + m_appDir + "/" + m_editorCommand); +} + +void MainWindow::readFromStdout() //readFromStdout +{ + while(proc_m65.canReadLine()) + { + QByteArray t=proc_m65.readLine(); + if(t.indexOf("") >= 0) { + m_nsum=t.mid(17,4).toInt(); + m_nsave=t.mid(21,4).toInt(); + lab7->setText (QString {"Avg: %1"}.arg (m_nsum)); + if(m_modeQ65>0) m_wide_graph_window->setDecodeFinished(); + } + if(t.indexOf("") >= 0) { + if(m_widebandDecode) { + m_messages_window->setText(m_messagesText,m_bandmapText); + m_band_map_window->setText(m_bandmapText); + m_widebandDecode=false; + } + QFile lockFile(m_appDir + "/.lock"); + lockFile.open(QIODevice::ReadWrite); + ui->DecodeButton->setStyleSheet(""); + decodeBusy(false); + m_map65RxLog=0; + m_startAnother=m_loopall; + return; + } + + if(t.indexOf("!") >= 0) { + int n=t.length(); + int m=2; +#ifdef WIN32 + m=3; +#endif + if(n>=30) ui->decodedTextBrowser->append(t.mid(1,n-m)); + n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); + ui->decodedTextBrowser->verticalScrollBar()->setValue(n); + m_messagesText=""; + m_bandmapText=""; + } + + if(t.indexOf("@") >= 0) { + m_messagesText += t.mid(1); + m_widebandDecode=true; + } + + if(t.indexOf("&") >= 0) { + QString q(t); + QString callsign=q.mid(5); + callsign=callsign.mid(0,callsign.indexOf(" ")); + if(callsign.length()>2) { + if(m_worked[callsign]) { + q=q.mid(1,4) + " " + q.mid(5); + } else { + q=q.mid(1,4) + " *" + q.mid(5); + } + m_bandmapText += q; + } + } + if(t.indexOf("=") >= 0) { + int n=t.size(); + qDebug() << t.mid(1,n-3).trimmed(); + } + + } +} + +void MainWindow::on_EraseButton_clicked() +{ + qint64 ms=QDateTime::currentMSecsSinceEpoch(); + ui->decodedTextBrowser->clear(); + if((ms-m_msErase)<500) { + on_actionErase_Band_Map_and_Messages_triggered(); + } + m_msErase=ms; +} + + +void MainWindow::decodeBusy(bool b) //decodeBusy() +{ + m_decoderBusy=b; + ui->DecodeButton->setEnabled(!b); + ui->actionOpen->setEnabled(!b); + ui->actionOpen_next_in_directory->setEnabled(!b); + ui->actionDecode_remaining_files_in_directory->setEnabled(!b); +} + +//------------------------------------------------------------- //guiUpdate() +void MainWindow::guiUpdate() +{ + static int iptt0=0; + static int iptt=0; + static bool btxok0=false; + static bool bTune0=false; + static bool bMonitoring0=false; + static int nc0=1; + static int nc1=1; + static char msgsent[23]; + static int nsendingsh=0; + int khsym=0; + + double tx1=0.0; + double tx2=126.0*4096.0/11025.0 + 1.8; + if(m_modeTx=="Q65") tx2=85.0*7200.0/12000.0 + 1.8; + + if(!m_txFirst) { + tx1 += m_TRperiod; + tx2 += m_TRperiod; + } + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + int nsec=ms/1000; + double tsec=0.001*ms; + double t2p=fmod(tsec,120.0); + bool bTxTime = (t2p >= tx1) and (t2p < tx2); + + if(bTune0 and !bTune) { + btxok=false; + m_monitoring=bMonitoring0; + soundInThread.setMonitoring(m_monitoring); + } + if(bTune and !bTune0) bMonitoring0=m_monitoring; + bTune0=bTune; + + if(m_auto or bTune) { + if((bTxTime or bTune) and iptt==0 and !m_txMute) { + int itx=1; + int ierr = ptt_(&m_pttPort,&itx,&iptt); // Raise PTT + if(ierr != 0) { + on_stopTxButton_clicked(); + char s[18]; + sprintf(s,"Cannot open COM%d",m_pttPort); + msgBox(s); + } + + if(m_bIQxt) m_wide_graph_window->tx570(); // Set Si570 to Tx Freq + + if(!soundOutThread.isRunning()) { + soundOutThread.start(QThread::HighPriority); + } + } + if((!bTxTime and !bTune) or m_txMute) { + btxok=false; + } + } + +// Calculate Tx waveform when needed + if((iptt==1 && iptt0==0) || m_restart) { + char message[23]; + QByteArray ba; + if(m_ntx == 1) ba=ui->tx1->text().toLocal8Bit(); + if(m_ntx == 2) ba=ui->tx2->text().toLocal8Bit(); + if(m_ntx == 3) ba=ui->tx3->text().toLocal8Bit(); + if(m_ntx == 4) ba=ui->tx4->text().toLocal8Bit(); + if(m_ntx == 5) ba=ui->tx5->text().toLocal8Bit(); + if(m_ntx == 6) ba=ui->tx6->text().toLocal8Bit(); + + ba2msg(ba,message); + int len1=22; + int mode65=m_mode65; + int ntxFreq=1000; + double samfac=1.0; + + if(m_modeTx=="JT65") { + gen65_(message,&mode65,&samfac,&nsendingsh,msgsent,iwave, + &nwave,len1,len1); + } else { + if(m_modeQ65==5) ntxFreq=700; + gen_q65_wave_(message,&ntxFreq,&m_modeQ65,msgsent,iwave, + &nwave,len1,len1); + } + msgsent[22]=0; + + if(m_restart) { + QFile f("map65_tx.log"); + f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); + QTextStream out(&f); + out << QDateTime::currentDateTimeUtc().toString("yyyy-MMM-dd hh:mm") + << " Tx message: " << QString::fromLatin1(msgsent) +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; + f.close(); + } + + m_restart=false; + } + +// If PTT was just raised, start a countdown for raising TxOK: + if(iptt==1 && iptt0==0) nc1=-9; // TxDelay = 0.8 s + if(nc1 <= 0) nc1++; + if(nc1 == 0) { + xSignalMeter->setValue(0); + ySignalMeter->setValue(0); + m_monitoring=false; + soundInThread.setMonitoring(false); + btxok=true; + m_transmitting=true; + m_wide_graph_window->enableSetRxHardware(false); + + QFile f("map65_tx.log"); + f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); + QTextStream out(&f); + out << QDateTime::currentDateTimeUtc().toString("yyyy-MMM-dd hh:mm") + << " Tx message: " << QString::fromLatin1(msgsent) +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; + f.close(); + } + +// If btxok was just lowered, start a countdown for lowering PTT + if(!btxok && btxok0 && iptt==1) nc0=-11; //RxDelay = 1.0 s + btxok0=btxok; + if(nc0 <= 0) nc0++; + if(nc0 == 0) { + if(m_bIQxt) m_wide_graph_window->rx570(); // Set Si570 back to Rx Freq + int itx=0; + ptt_(&m_pttPort,&itx,&iptt); // Lower PTT + if(!m_txMute) { + soundOutThread.quitExecution=true;\ + } + m_transmitting=false; + m_wide_graph_window->enableSetRxHardware(true); + if(m_auto) { + m_monitoring=true; + soundInThread.setMonitoring(m_monitoring); + } + } + + if(iptt == 0 && !btxok) { + // sending="" + // nsendingsh=0 + } + + if(m_monitoring) { + ui->monitorButton->setStyleSheet(m_pbmonitor_style); + } else { + ui->monitorButton->setStyleSheet(""); + } + + lab2->setText("QSO Freq: " + QString::number(m_wide_graph_window->QSOfreq())); + lab3->setText("QSO DF: " + QString::number(m_wide_graph_window->DF())); + + m_wide_graph_window->updateFreqLabel(); + + if(m_startAnother) { + m_startAnother=false; + on_actionOpen_next_in_directory_triggered(); + } + if(m_modeQ65==0 and m_modeTx=="Q65") on_pbTxMode_clicked(); + if(m_modeJT65==0 and m_modeTx=="JT65") on_pbTxMode_clicked(); + + if(nsec != m_sec0) { //Once per second +// qDebug() << "A" << nsec%60 << m_mode65 << m_modeQ65 << m_modeTx; + soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); + soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); + + if(m_pctZap>30.0 and !m_transmitting) { + lab4->setStyleSheet("QLabel{background-color: #ff0000}"); + } else { + lab4->setStyleSheet(""); + } + + if(m_transmitting) { + if(nsendingsh==1) { + lab1->setStyleSheet("QLabel{background-color: #66ffff}"); + } else if(nsendingsh==-1) { + lab1->setStyleSheet("QLabel{background-color: #ffccff}"); + } else { + lab1->setStyleSheet("QLabel{background-color: #ffff33}"); + } + char s[37]; + sprintf(s,"Tx: %s",msgsent); + lab1->setText(s); + } else if(m_monitoring) { + lab1->setStyleSheet("QLabel{background-color: #00ff00}"); + m_nrx=soundInThread.nrx(); + khsym=soundInThread.mhsym(); + QString t; + if(m_network) { + if(m_nrx==-1) t="F1"; + if(m_nrx==1) t="I1"; + if(m_nrx==-2) t="F2"; + if(m_nrx==+2) t="I2"; + } else { + if(m_nrx==1) t="S1"; + if(m_nrx==2) t="S2"; + } + if((abs(m_nrx)==1 and m_xpol) or (abs(m_nrx)==2 and !m_xpol)) + lab1->setStyleSheet("QLabel{background-color: #ff1493}"); + if(khsym==m_hsym0) { + t="Nil"; + lab1->setStyleSheet("QLabel{background-color: #ffc0cb}"); + } + lab1->setText("Receiving " + t); + } else if (!m_diskData) { + lab1->setStyleSheet(""); + lab1->setText(""); + } + + QDateTime t = QDateTime::currentDateTimeUtc(); + int fQSO=m_wide_graph_window->QSOfreq(); + m_astro_window->astroUpdate(t, m_myGrid, m_hisGrid, fQSO, m_setftx, + m_txFreq, m_azelDir); + m_setftx=0; + QString utc = t.date().toString(" yyyy MMM dd \n") + t.time().toString(); + ui->labUTC->setText(utc); + if((!m_monitoring and !m_diskData) or (khsym==m_hsym0)) { + xSignalMeter->setValue(0); + ySignalMeter->setValue(0); + lab4->setText(" Rx noise: 0.0 0.0 0.0% "); + } + m_hsym0=khsym; + m_sec0=nsec; + } + iptt0=iptt; + bIQxt=m_bIQxt; +} + +void MainWindow::ba2msg(QByteArray ba, char message[]) //ba2msg() +{ + bool eom; + eom=false; + for(int i=0;i<22; i++) { + if (i >= ba.size () || !ba[i]) eom=true; + if(eom) { + message[i] = ' '; + } else { + message[i]=ba[i]; + } + } + message[22] = '\0'; +} + +void MainWindow::on_txFirstCheckBox_stateChanged(int nstate) //TxFirst +{ + m_txFirst = (nstate==2); +} + +void MainWindow::set_ntx(int n) //set_ntx() +{ + m_ntx=n; +} + +void MainWindow::on_txb1_clicked() //txb1 +{ + m_ntx=1; + ui->txrb1->setChecked(true); + m_restart=true; +} + +void MainWindow::on_txb2_clicked() //txb2 +{ + m_ntx=2; + ui->txrb2->setChecked(true); + m_restart=true; +} + +void MainWindow::on_txb3_clicked() //txb3 +{ + m_ntx=3; + ui->txrb3->setChecked(true); + m_restart=true; +} + +void MainWindow::on_txb4_clicked() //txb4 +{ + m_ntx=4; + ui->txrb4->setChecked(true); + m_restart=true; +} + +void MainWindow::on_txb5_clicked() //txb5 +{ + m_ntx=5; + ui->txrb5->setChecked(true); + m_restart=true; +} + +void MainWindow::on_txb6_clicked() //txb6 +{ + m_ntx=6; + ui->txrb6->setChecked(true); + m_restart=true; +} + +void MainWindow::selectCall2(bool ctrl) //selectCall2 +{ + QString t = ui->decodedTextBrowser->toPlainText(); //Full contents + int i=ui->decodedTextBrowser->textCursor().position(); + int i0=t.lastIndexOf(" ",i); + int i1=t.indexOf(" ",i); + QString hiscall=t.mid(i0+1,i1-i0-1); + if(hiscall!="") { + int n=hiscall.length(); + if( n>2 and n<13 and hiscall.toDouble()==0.0 and \ + hiscall.mid(2,-1).toInt()==0) doubleClickOnCall(hiscall, ctrl); + } +} + //doubleClickOnCall +void MainWindow::doubleClickOnCall(QString hiscall, bool ctrl) +{ + if(m_worked[hiscall]) { + msgBox("Possible dupe: " + hiscall + " already in log."); + } + ui->dxCallEntry->setText(hiscall); + QString t = ui->decodedTextBrowser->toPlainText(); //Full contents + int i2=ui->decodedTextBrowser->textCursor().position(); + QString t1 = t.mid(0,i2); //contents up to text cursor + int i1=t1.lastIndexOf("\n") + 1; + QString t2 = t1.mid(i1,i2-i1); //selected line + int n = 60*t2.mid(14,2).toInt() + t2.mid(16,2).toInt(); + m_txFirst = ((n%2) == 1); + ui->txFirstCheckBox->setChecked(m_txFirst); + if((t2.indexOf("#")>0) and m_modeTx!="JT65") on_pbTxMode_clicked(); + if((t2.indexOf(":")>0) and m_modeTx!="Q65") on_pbTxMode_clicked(); + + QString t3=t.mid(i1); + int i3=t3.indexOf("\n"); + if(i3<0) i3=t3.length(); + t3=t3.left(i3); + auto const& words = t3.mid(30).split(' ', SkipEmptyParts); + QString grid=words[2]; + if(isGrid4(grid) and hiscall==words[1]) { + ui->dxGridEntry->setText(grid); + } else { + lookup(); + } + + QString rpt=""; + if(ctrl or m_modeTx=="Q65") rpt=t2.mid(25,3); + genStdMsgs(rpt); + if(t2.indexOf(m_myCall)>0) { + m_ntx=2; + ui->txrb2->setChecked(true); + } else { + m_ntx=1; + ui->txrb1->setChecked(true); + } +} + //doubleClickOnMessages +void MainWindow::doubleClickOnMessages(QString hiscall, QString t2, bool ctrl) +{ + if(hiscall.length()<3) return; + if(m_worked[hiscall]) { + msgBox("Possible dupe: " + hiscall + " already in log."); + } + ui->dxCallEntry->setText(hiscall); + int n = 60*t2.mid(13,2).toInt() + t2.mid(15,2).toInt(); + m_txFirst = ((n%2) == 1); + ui->txFirstCheckBox->setChecked(m_txFirst); + + if((t2.indexOf(":")<0) and m_modeTx!="JT65") on_pbTxMode_clicked(); + if((t2.indexOf(":")>0) and m_modeTx!="Q65") on_pbTxMode_clicked(); + + auto const& words = t2.mid(25).split(' ', SkipEmptyParts); + QString grid=words[2]; + if(isGrid4(grid) and hiscall==words[1]) { + ui->dxGridEntry->setText(grid); + } else { + lookup(); + } + + QString rpt=""; + if(ctrl or m_modeTx=="Q65") rpt=t2.mid(20,3); + genStdMsgs(rpt); + + if(t2.indexOf(m_myCall)>0) { + m_ntx=2; + ui->txrb2->setChecked(true); + } else { + m_ntx=1; + ui->txrb1->setChecked(true); + } +} + +void MainWindow::genStdMsgs(QString rpt) //genStdMsgs() +{ + QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); + ui->dxCallEntry->setText(hiscall); + QString t0=hiscall + " " + m_myCall + " "; + QString t=t0; + if(t0.indexOf("/")<0) t=t0 + m_myGrid.mid(0,4); + msgtype(t, ui->tx1); + if(rpt == "" and m_modeTx=="Q65") rpt="-24"; + if(rpt == "" and m_modeTx=="JT65") { + t=t+" OOO"; + msgtype(t, ui->tx2); + msgtype("RO", ui->tx3); + msgtype("RRR", ui->tx4); + msgtype("73", ui->tx5); + } else { + t=t0 + rpt; + msgtype(t, ui->tx2); + t=t0 + "R" + rpt; + msgtype(t, ui->tx3); + t=t0 + "RRR"; + msgtype(t, ui->tx4); + t=t0 + "73"; + msgtype(t, ui->tx5); + } + t="CQ " + m_myCall + " " + m_myGrid.mid(0,4); + msgtype(t, ui->tx6); + m_ntx=1; + ui->txrb1->setChecked(true); +} + +void MainWindow::lookup() //lookup() +{ + QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); + ui->dxCallEntry->setText(hiscall); + QString call3File = m_appDir + "/CALL3.TXT"; + QFile f(call3File); + if(!f.open(QIODevice::ReadOnly | QIODevice::Text)) { + msgBox("Cannot open " + call3File); + return; + } + char c[132]; + qint64 n=0; + for(int i=0; i<999999; i++) { + n=f.readLine(c,sizeof(c)); + if(n <= 0) { + ui->dxGridEntry->setText(""); + break; + } + QString t=QString(c); + if(t.indexOf(hiscall)==0) { + int i1=t.indexOf(","); + QString hisgrid=t.mid(i1+1,6); + i1=hisgrid.indexOf(","); + if(i1>0) { + hisgrid=hisgrid.mid(0,4); + } else { + hisgrid=hisgrid.mid(0,4) + hisgrid.mid(4,2).toLower(); + } + ui->dxGridEntry->setText(hisgrid); + break; + } + } + f.close(); +} + +void MainWindow::on_lookupButton_clicked() //Lookup button +{ + lookup(); +} + +void MainWindow::on_addButton_clicked() //Add button +{ + if(ui->dxGridEntry->text()=="") { + msgBox("Please enter a valid grid locator."); + return; + } + m_call3Modified=false; + QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); + QString hisgrid=ui->dxGridEntry->text().trimmed(); + QString newEntry=hiscall + "," + hisgrid; + + int ret = QMessageBox::warning(this, "Add", + newEntry + "\n" + "Is this station known to be active on EME?", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if(ret==QMessageBox::Yes) { + newEntry += ",EME,,"; + } else { + newEntry += ",,,"; + } + QString call3File = m_appDir + "/CALL3.TXT"; + QFile f1(call3File); + if(!f1.open(QIODevice::ReadWrite | QIODevice::Text)) { + msgBox("Cannot open " + call3File); + return; + } + + if(f1.size()==0) { + QTextStream out(&f1); + out << "ZZZZZZ" +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; + f1.close(); + f1.open(QIODevice::ReadOnly | QIODevice::Text); + } + + QString tmpFile = m_appDir + "/CALL3.TMP"; + QFile f2(tmpFile); + if(!f2.open(QIODevice::WriteOnly | QIODevice::Text)) { + msgBox("Cannot open " + tmpFile); + return; + } + QTextStream in(&f1); + QTextStream out(&f2); + QString hc=hiscall; + QString hc1=""; + QString hc2="000000"; + QString s; + do { + s=in.readLine(); + hc1=hc2; + if(s.mid(0,2)=="//") { + out << s + "\n"; + } else { + int i1=s.indexOf(","); + hc2=s.mid(0,i1); + if(hc>hc1 && hchc1 && !m_call3Modified) out << newEntry + "\n"; + if(m_call3Modified) { + QFile f0(m_appDir + "/CALL3.OLD"); + if(f0.exists()) f0.remove(); + QFile f1(m_appDir + "/CALL3.TXT"); + f1.rename(m_appDir + "/CALL3.OLD"); + f2.rename(m_appDir + "/CALL3.TXT"); + f2.close(); + } +} + +void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype() +{ +// if(t.length()<1) return 0; + char message[23]; + char msgsent[23]; + int len1=22; + int mode65=0; //mode65 ==> check message but don't make wave() + double samfac=1.0; + int nsendingsh=0; + int mwave; + t=t.toUpper(); + int i1=t.indexOf(" OOO"); + QByteArray s=t.toUpper().toLocal8Bit(); + ba2msg(s,message); + gen65_(message,&mode65,&samfac,&nsendingsh,msgsent,iwave, + &mwave,len1,len1); + + QPalette p(tx->palette()); + if(nsendingsh==1) { + p.setColor(QPalette::Base,"#66ffff"); + } else if(nsendingsh==-1) { + p.setColor(QPalette::Base,"#ffccff"); + } else { + p.setColor(QPalette::Base,Qt::white); + } + tx->setPalette(p); + int len=t.length(); + if(nsendingsh==-1) { + len=qMin(len,13); + if(i1>10) { + tx->setText(t.mid(0,len).toUpper() + " OOO"); + } else { + tx->setText(t.mid(0,len).toUpper()); + } + } else { + tx->setText(t); + } +} + +void MainWindow::on_tx1_editingFinished() //tx1 edited +{ + QString t=ui->tx1->text(); + msgtype(t, ui->tx1); +} + +void MainWindow::on_tx2_editingFinished() //tx2 edited +{ + QString t=ui->tx2->text(); + msgtype(t, ui->tx2); +} + +void MainWindow::on_tx3_editingFinished() //tx3 edited +{ + QString t=ui->tx3->text(); + msgtype(t, ui->tx3); +} + +void MainWindow::on_tx4_editingFinished() //tx4 edited +{ + QString t=ui->tx4->text(); + msgtype(t, ui->tx4); +} + +void MainWindow::on_tx5_editingFinished() //tx5 edited +{ + QString t=ui->tx5->text(); + msgtype(t, ui->tx5); +} + +void MainWindow::on_tx6_editingFinished() //tx6 edited +{ + QString t=ui->tx6->text(); + msgtype(t, ui->tx6); +} + +void MainWindow::on_setTxFreqButton_clicked() //Set Tx Freq +{ + m_setftx=1; + m_txFreq=m_wide_graph_window->QSOfreq(); +} + +void MainWindow::on_dxCallEntry_textChanged(const QString &t) //dxCall changed +{ + m_hisCall=t.toUpper().trimmed(); + ui->dxCallEntry->setText(m_hisCall); +} + +void MainWindow::on_dxGridEntry_textChanged(const QString &t) //dxGrid changed +{ + int n=t.length(); + if(n!=4 and n!=6) return; + if(!t[0].isLetter() or !t[1].isLetter()) return; + if(!t[2].isDigit() or !t[3].isDigit()) return; + if(n==4) m_hisGrid=t.mid(0,2).toUpper() + t.mid(2,2); + if(n==6) m_hisGrid=t.mid(0,2).toUpper() + t.mid(2,2) + + t.mid(4,2).toLower(); + ui->dxGridEntry->setText(m_hisGrid); +} + +void MainWindow::on_genStdMsgsPushButton_clicked() //genStdMsgs button +{ + genStdMsgs(""); +} + +void MainWindow::on_logQSOButton_clicked() //Log QSO button +{ + int nMHz=int(datcom_.fcenter); + QDateTime t = QDateTime::currentDateTimeUtc(); + QString qsoMode=lab5->text(); + if(m_modeTx.startsWith("Q65")) qsoMode=lab6->text(); + QString logEntry=t.date().toString("yyyy-MMM-dd,") + + t.time().toString("hh:mm,") + m_hisCall + "," + m_hisGrid + "," + + QString::number(nMHz) + "," + qsoMode + "\r\n"; + + int ret = QMessageBox::warning(this, "Log Entry", + "Please confirm log entry:\n\n" + logEntry + "\n", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if(ret==QMessageBox::No) return; + QFile f("wsjt.log"); + if(!f.open(QFile::Append)) { + msgBox("Cannot open file \"wsjt.log\"."); + return; + } + QTextStream out(&f); + out << logEntry; + f.close(); + m_worked[m_hisCall]=true; +} + +void MainWindow::on_actionErase_map65_rx_log_triggered() //Erase Rx log +{ + int ret = QMessageBox::warning(this, "Confirm Erase", + "Are you sure you want to erase file map65_rx.log ?", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if(ret==QMessageBox::Yes) { + m_map65RxLog |= 2; // Rewind map65_rx.log + } +} + +void MainWindow::on_actionErase_map65_tx_log_triggered() //Erase Tx log +{ + int ret = QMessageBox::warning(this, "Confirm Erase", + "Are you sure you want to erase file map65_tx.log ?", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if(ret==QMessageBox::Yes) { + QFile f("map65_tx.log"); + f.remove(); + } +} + +void MainWindow::on_actionNoJT65_triggered() +{ + m_mode65=0; + m_modeJT65=0; + m_TRperiod=60; + soundInThread.setPeriod(m_TRperiod); + soundOutThread.setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); + lab5->setStyleSheet(""); + lab5->setText(""); +} +void MainWindow::on_actionJT65A_triggered() +{ + m_mode="JT65A"; + m_modeJT65=1; + m_mode65=1; + m_modeJT65=1; + m_TRperiod=60; + soundInThread.setPeriod(m_TRperiod); + soundOutThread.setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); + lab5->setStyleSheet("QLabel{background-color: #ff6666}"); + lab5->setText("JT65A"); + ui->actionJT65A->setChecked(true); +} + +void MainWindow::on_actionJT65B_triggered() +{ + m_mode="JT65B"; + m_modeJT65=2; + m_mode65=2; + m_modeJT65=2; + m_TRperiod=60; + soundInThread.setPeriod(m_TRperiod); + soundOutThread.setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); + lab5->setStyleSheet("QLabel{background-color: #ffff66}"); + lab5->setText("JT65B"); + ui->actionJT65B->setChecked(true); +} + +void MainWindow::on_actionJT65C_triggered() +{ + m_mode="JT65C"; + m_modeJT65=3; + m_mode65=4; + m_TRperiod=60; + soundInThread.setPeriod(m_TRperiod); + soundOutThread.setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); + lab5->setStyleSheet("QLabel{background-color: #66ffb2}"); + lab5->setText("JT65C"); + ui->actionJT65C->setChecked(true); +} + +void MainWindow::on_actionNoQ65_triggered() +{ + m_modeQ65=0; + lab6->setStyleSheet(""); + lab6->setText(""); +} + +void MainWindow::on_actionQ65A_triggered() +{ + m_modeQ65=1; + lab6->setStyleSheet("QLabel{background-color: #ffb266}"); + lab6->setText("Q65A"); +} + +void MainWindow::on_actionQ65B_triggered() +{ + m_modeQ65=2; + lab6->setStyleSheet("QLabel{background-color: #b2ff66}"); + lab6->setText("Q65B"); +} + + +void MainWindow::on_actionQ65C_triggered() +{ + m_modeQ65=3; + lab6->setStyleSheet("QLabel{background-color: #66ffff}"); + lab6->setText("Q65C"); +} + +void MainWindow::on_actionQ65D_triggered() +{ + m_modeQ65=4; + lab6->setStyleSheet("QLabel{background-color: #b266ff}"); + lab6->setText("Q65D"); +} + +void MainWindow::on_actionQ65E_triggered() +{ + m_modeQ65=5; + lab6->setStyleSheet("QLabel{background-color: #ff66ff}"); + lab6->setText("Q65E"); +} + + +void MainWindow::on_NBcheckBox_toggled(bool checked) +{ + m_NB=checked; + ui->NBslider->setEnabled(m_NB); +} + +void MainWindow::on_NBslider_valueChanged(int n) +{ + m_NBslider=n; +} + +void MainWindow::on_actionAdjust_IQ_Calibration_triggered() +{ + m_adjustIQ=1; +} + +void MainWindow::on_actionApply_IQ_Calibration_triggered() +{ + m_applyIQcal= 1-m_applyIQcal; +} + +void MainWindow::on_actionFUNcube_Dongle_triggered() +{ + proc_qthid.start (QDir::toNativeSeparators(m_appDir + "/qthid"), QStringList {}); +} + +void MainWindow::on_actionEdit_wsjt_log_triggered() +{ + proc_editor.start (QDir::toNativeSeparators (m_editorCommand), {QDir::toNativeSeparators (m_appDir + "/wsjt.log"), }); +} + +void MainWindow::on_actionTx_Tune_triggered() +{ + if(g_pTxTune==NULL) { + g_pTxTune = new TxTune(0); + } + g_pTxTune->set_iqAmp(iqAmp); + g_pTxTune->set_iqPhase(iqPhase); + g_pTxTune->set_txPower(txPower); + g_pTxTune->show(); +} + +void MainWindow::on_pbTxMode_clicked() +{ + if(m_modeTx=="Q65") { + m_modeTx="JT65"; + ui->pbTxMode->setText("Tx JT65 #"); + } else { + m_modeTx="Q65"; + ui->pbTxMode->setText("Tx Q65 :"); + } +// m_wideGraph->setModeTx(m_modeTx); +// statusChanged(); +} + +bool MainWindow::isGrid4(QString g) +{ + if(g.length()!=4) return false; + if(g.mid(0,1)<'A' or g.mid(0,1)>'R') return false; + if(g.mid(1,1)<'A' or g.mid(1,1)>'R') return false; + if(g.mid(2,1)<'0' or g.mid(2,1)>'9') return false; + if(g.mid(3,1)<'0' or g.mid(3,1)>'9') return false; + return true; +} diff --git a/map65/mainwindow.h b/map65/mainwindow.h new file mode 100644 index 000000000..7dbe1194c --- /dev/null +++ b/map65/mainwindow.h @@ -0,0 +1,323 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H +#include +#include +#include +#include +#include +#include +#include +#include +#include "getfile.h" +#include "soundin.h" +#include "soundout.h" +#include "signalmeter.h" +#include "commons.h" +#include "sleep.h" +#include + +#define NFFT 32768 +#define NSMAX 5760000 + +//--------------------------------------------------------------- MainWindow +namespace Ui { + class MainWindow; +} + +class QTimer; +class Astro; +class BandMap; +class Messages; +class WideGraph; + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + bool m_network; + +public slots: + void showSoundInError(const QString& errorMsg); + void showStatusMessage(const QString& statusMsg); + void dataSink(int k); + void diskDat(); + void diskWriteFinished(); + void freezeDecode(int n); + void readFromStdout(); + void m65_error (QProcess::ProcessError); + void editor_error(); + void guiUpdate(); + void doubleClickOnCall(QString hiscall, bool ctrl); + void doubleClickOnMessages(QString hiscall, QString t2, bool ctrl); + +private: + virtual void keyPressEvent (QKeyEvent *) override; + virtual bool eventFilter (QObject *, QEvent *) override; + virtual void closeEvent (QCloseEvent *) override; + +private slots: + void on_tx1_editingFinished(); + void on_tx2_editingFinished(); + void on_tx3_editingFinished(); + void on_tx4_editingFinished(); + void on_tx5_editingFinished(); + void on_tx6_editingFinished(); + void on_actionDeviceSetup_triggered(); + void on_monitorButton_clicked(); + void on_actionExit_triggered(); + void on_actionAbout_triggered(); + void on_actionLinrad_triggered(); + void on_actionCuteSDR_triggered(); + void on_autoButton_clicked(); + void on_stopTxButton_clicked(); + void on_tolSpinBox_valueChanged(int arg1); + void on_actionAstro_Data_triggered(); + void on_stopButton_clicked(); + void on_actionOnline_Users_Guide_triggered(); + void on_actionQSG_Q65_triggered(); + void on_actionQSG_MAP65_v3_triggered(); + void on_actionQ65_Sensitivity_in_MAP65_3_0_triggered(); + void on_actionWide_Waterfall_triggered(); + void on_actionBand_Map_triggered(); + void on_actionMessages_triggered(); + void on_actionOpen_triggered(); + void on_actionOpen_next_in_directory_triggered(); + void on_actionDecode_remaining_files_in_directory_triggered(); + void on_actionDelete_all_tf2_files_in_SaveDir_triggered(); + void on_actionErase_Band_Map_and_Messages_triggered(); + void on_actionFind_Delta_Phi_triggered(); + void on_actionF4_sets_Tx6_triggered(); + void on_actionOnly_EME_calls_triggered(); + void on_actionNo_shorthands_if_Tx1_triggered(); + void on_actionNo_Deep_Search_triggered(); + void on_actionNormal_Deep_Search_triggered(); + void on_actionAggressive_Deep_Search_triggered(); + void on_actionNone_triggered(); + void on_actionSave_all_triggered(); + void on_actionKeyboard_shortcuts_triggered(); + void on_actionSpecial_mouse_commands_triggered(); + void on_actionAvailable_suffixes_and_add_on_prefixes_triggered(); + void on_DecodeButton_clicked(); + void decode(); + void decodeBusy(bool b); + void on_EraseButton_clicked(); + void on_txb1_clicked(); + void on_txFirstCheckBox_stateChanged(int arg1); + void set_ntx(int n); + void on_txb2_clicked(); + void on_txb3_clicked(); + void on_txb4_clicked(); + void on_txb5_clicked(); + void on_txb6_clicked(); + void on_lookupButton_clicked(); + void on_addButton_clicked(); + void on_setTxFreqButton_clicked(); + void on_dxCallEntry_textChanged(const QString &arg1); + void on_dxGridEntry_textChanged(const QString &arg1); + void selectCall2(bool ctrl); + void on_genStdMsgsPushButton_clicked(); + void bumpDF(int n); + void on_logQSOButton_clicked(); + void on_actionErase_map65_rx_log_triggered(); + void on_actionErase_map65_tx_log_triggered(); + void on_NBcheckBox_toggled(bool checked); + void on_actionJT65A_triggered(); + void on_actionJT65B_triggered(); + void on_actionJT65C_triggered(); + void on_NBslider_valueChanged(int value); + void on_actionAdjust_IQ_Calibration_triggered(); + void on_actionApply_IQ_Calibration_triggered(); + void on_actionAFMHot_triggered(); + void on_actionBlue_triggered(); + void on_actionFUNcube_Dongle_triggered(); + void on_actionEdit_wsjt_log_triggered(); + void on_actionTx_Tune_triggered(); + void on_actionQ65A_triggered(); + void on_actionQ65B_triggered(); + void on_actionNoJT65_triggered(); + void on_actionNoQ65_triggered(); + void on_actionQ65C_triggered(); + void on_actionQ65D_triggered(); + void on_actionQ65E_triggered(); + + void on_pbTxMode_clicked(); + +private: + Ui::MainWindow *ui; + QString m_appDir; + QString m_settings_filename; + QScopedPointer m_astro_window; + QScopedPointer m_band_map_window; + QScopedPointer m_messages_window; + QScopedPointer m_wide_graph_window; + QPointer m_gui_timer; + qint64 m_msErase; + qint32 m_nDevIn; + qint32 m_nDevOut; + qint32 m_idInt; + qint32 m_waterfallAvg; + qint32 m_DF; + qint32 m_tol; + qint32 m_QSOfreq0; + qint32 m_ntx; + qint32 m_pttPort; + qint32 m_astroFont; + qint32 m_timeout; + qint32 m_dPhi; + qint32 m_fCal; + qint32 m_txFreq; + qint32 m_setftx; + qint32 m_ndepth; + qint32 m_sec0; + qint32 m_map65RxLog; + qint32 m_nutc0; + qint32 m_mode65; + qint32 m_nrx; + qint32 m_hsym0; + qint32 m_paInDevice; + qint32 m_paOutDevice; + qint32 m_udpPort; + qint32 m_NBslider; + qint32 m_adjustIQ; + qint32 m_applyIQcal; + qint32 m_mult570; + qint32 m_mult570Tx; + qint32 m_nsum; + qint32 m_nsave; + qint32 m_TRperiod; + qint32 m_modeJT65; + qint32 m_modeQ65; + + double m_fAdd; + // double m_IQamp; + // double m_IQphase; + double m_cal570; + double m_TxOffset; + + bool m_monitoring; + bool m_transmitting; + bool m_diskData; + bool m_loopall; + bool m_decoderBusy; + bool m_txFirst; + bool m_auto; + bool m_txMute; + bool m_restart; + bool m_xpol; + bool m_xpolx; + bool m_call3Modified; + bool m_startAnother; + bool m_saveAll; + bool m_onlyEME; + bool m_widebandDecode; + bool m_kb8rq; + bool m_NB; + bool m_fs96000; + bool m_IQswap; + bool m_10db; + bool m_initIQplus; + bool m_bIQxt; + + float m_gainx; + float m_gainy; + float m_phasex; + float m_phasey; + float m_pctZap; + + QRect m_wideGraphGeom; + + QLabel* lab1; // labels in status bar + QLabel* lab2; + QLabel* lab3; + QLabel* lab4; + QLabel* lab5; + QLabel* lab6; + QLabel* lab7; + + QMessageBox msgBox0; + + QFuture* future1; + QFuture* future2; + QFutureWatcher* watcher1; + QFutureWatcher* watcher2; + + QProcess proc_m65; + QProcess proc_qthid; + QProcess proc_editor; + + + QString m_path; + QString m_pbdecoding_style1; + QString m_pbmonitor_style; + QString m_pbAutoOn_style; + QString m_messagesText; + QString m_bandmapText; + QString m_myCall; + QString m_myGrid; + QString m_hisCall; + QString m_hisGrid; + QString m_saveDir; + QString m_azelDir; + QString m_dxccPfx; + QString m_palette; + QString m_dateTime; + QString m_mode; + QString m_colors; + QString m_editorCommand; + QString m_modeTx; + + QHash m_worked; + + SignalMeter *xSignalMeter; + SignalMeter *ySignalMeter; + + + SoundInThread soundInThread; //Instantiate the audio threads + SoundOutThread soundOutThread; + + //---------------------------------------------------- private functions + void readSettings(); + void writeSettings(); + void createStatusBar(); + void updateStatusBar(); + void msgBox(QString t); + void genStdMsgs(QString rpt); + void lookup(); + void ba2msg(QByteArray ba, char* message); + void msgtype(QString t, QLineEdit* tx); + void stub(); + bool isGrid4(QString g); + bool subProcessFailed (QProcess *, int exit_code, QProcess::ExitStatus); +}; + +extern void getfile(QString fname, bool xpol, int idInt); +extern void savetf2(QString fname, bool xpol); +extern int killbyname(const char* progName); +extern void getDev(int* numDevices,char hostAPI_DeviceName[][50], + int minChan[], int maxChan[], + int minSpeed[], int maxSpeed[]); + +extern "C" { +//----------------------------------------------------- C and Fortran routines + void symspec_(int* k, int* nxpol, int* ndiskdat, int* nb, + int* m_NBslider, int* idphi, int* nfsample, float* fgreen, + int* iqadjust, int* iqapply, float* gainx, float* gainy, + float* phasex, float* phasey, float* rejectx, float* rejecty, + float* px, float* py, float s[], int* nkhz, int* nhsym, + int* nzap, float* slimit, uchar lstrong[]); + + void gen65_(char* msg, int* mode65, double* samfac, + int* nsendingsh, char* msgsent, short iwave[], int* nwave, + int len1, int len2); + + void gen_q65_wave_(char* msg, int* ntxFreq, int* mode64, + char* msgsent, short iwave[], int* nwave, + int len1, int len2); + + int ptt_(int* nport, int* itx, int* iptt); + } + +#endif // MAINWINDOW_H diff --git a/map65/mainwindow.ui b/map65/mainwindow.ui new file mode 100644 index 000000000..29aac7e39 --- /dev/null +++ b/map65/mainwindow.ui @@ -0,0 +1,1736 @@ + + + MainWindow + + + + 0 + 0 + 635 + 512 + + + + + 0 + 0 + + + + + 635 + 0 + + + + + 2048 + 800 + + + + SpecJT by K1JT + + + + + + + + + + + + + 0 + 0 + + + + + 453 + 170 + + + + + 620 + 16777215 + + + + Freq DF Pol UTC DT dB RC DS TxPol + + + + + + + 0 + 0 + + + + + 421 + 100 + + + + + 610 + 400 + + + + + Courier New + 10 + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAsNeeded + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Courier New'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + false + + + + + + + + + + + + + 50 + 0 + + + + Log &QSO + + + + + + + + 50 + 0 + + + + &Stop + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 16777215 + 16777215 + + + + &Monitor + + + + + + + + 50 + 0 + + + + &Decode + + + + + + + + 50 + 0 + + + + &Erase + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + &Auto is OFF + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + St&op Tx + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + 0 + 0 + + + + + 164 + 40 + + + + + 290 + 16777215 + + + + + + + DX Call DX Grid + + + + + 231 + 13 + 50 + 23 + + + + + 50 + 16777215 + + + + SetMsgs + + + + + + 7 + 13 + 150 + 64 + + + + + + + + + + 0 + 0 + + + + + 0 + 23 + + + + + 70 + 16777215 + + + + + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 23 + + + + + 70 + 16777215 + + + + + + + Qt::AlignCenter + + + + + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 50 + 16777215 + + + + &Lookup + + + + + + + + 70 + 0 + + + + + 50 + 16777215 + + + + Add + + + + + + + + + + + 40 + 80 + 90 + 23 + + + + + 0 + 0 + + + + + 90 + 0 + + + + + 70 + 16777215 + + + + &GenStdMsgs + + + + + + + + + 140 + 0 + + + + + 165 + 60 + + + + + 16 + + + + QFrame::Panel + + + 2014 Dec 02 +01:23:45 + + + Qt::AlignCenter + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 20 + 20 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + 0 + 23 + + + + + 80 + 16777215 + + + + Tx first + + + + + + + + 90 + 0 + + + + + 80 + 16777215 + + + + Tx Q65 $ + + + + + + + + 90 + 0 + + + + + 80 + 16777215 + + + + Set Tx Freq + + + + + + + Maximum drift rate in units of symbol rate per transmissiion. + + + Qt::AlignCenter + + + Max Drift + + + 50 + + + 5 + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + NB + + + + + + + false + + + + 0 + 0 + + + + + 80 + 16777215 + + + + 0 + + + 100 + + + 40 + + + Qt::Horizontal + + + + + + + + + + 0 + 0 + + + + + 42 + 0 + + + + + 42 + 18 + + + + 500 + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 0 + 23 + + + + + 18 + 16777215 + + + + 1 + + + 6 + + + 5 + + + + + + + + 0 + 0 + + + + + 20 + 16777215 + + + + Tol + + + + + + + + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + MS Shell Dlg 2 + + + + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + true + + + buttonGroup + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + buttonGroup + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + buttonGroup + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + buttonGroup + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + buttonGroup + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + buttonGroup + + + + + + + + + + + + 50 + 20 + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx1 + + + + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx2 + + + + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx3 + + + + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx4 + + + + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx5 + + + + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx6 + + + + + + + + + + + + + + + + + 0 + 0 + 635 + 21 + + + + + File + + + + + + + + + + + + + + + + + Setup + + + + + + + + + + + + + + + View + + + + Waterfall palette + + + + + + + + + + + + + + Decode + + + + + + + + + + + + Save + + + + + + + Help + + + + + + + + + + + + + Mode + + + + + + + + + + + + + + + + + + + + + + + + TopToolBarArea + + + false + + + + + + Exit + + + + + Options + + + F2 + + + + + About MAP65 + + + Ctrl+F1 + + + + + Astro Data + + + Shift+F10 + + + + + Band Map + + + + + Messages + + + + + Wide Waterfall + + + + + Open + + + + + Open next in directory + + + F6 + + + + + Decode remaining files in directory + + + Shift+F6 + + + + + Delete all *.tf2 and *.iq files in SaveDir + + + + + Erase Band Map and Messages + + + + + Erase map65_rx.log + + + + + true + + + false + + + Linrad + + + + + true + + + true + + + CuteSDR + + + + + Find Delta Phi + + + + + true + + + F4 sets Tx6 + + + + + true + + + Only EME calls + + + + + true + + + No shorthand decodes if Tx1 + + + + + true + + + true + + + No Deep Search + + + + + true + + + Normal Deep Search + + + + + true + + + Aggressive Deep Search + + + + + true + + + true + + + None + + + + + true + + + Save all + + + + + true + + + 50 + + + + + true + + + true + + + 144 + + + + + true + + + 222 + + + + + true + + + 432 + + + + + true + + + 1296 + + + + + true + + + 2304 + + + + + Online User's Guide + + + F1 + + + + + Keyboard shortcuts + + + + + Special mouse commands + + + + + Available suffixes and add-on-prefixes + + + + + Erase map65_tx.log + + + + + true + + + JT65A + + + + + true + + + true + + + JT65B + + + + + true + + + JT65C + + + + + I/Q Calibration + + + F7 + + + + + Adjust Rx I/Q Calibration + + + + + true + + + Apply Rx I/Q Calibration + + + + + true + + + AFMHot + + + + + true + + + Blue + + + + + FUNcube Dongle Settings + + + + + Edit wsjt.log + + + Alt+Shift+E + + + + + Tx Tune + + + Alt+T + + + + + true + + + Decode Q65 near QSO frequency + + + + + true + + + Q65A + + + + + true + + + Q65B + + + + + true + + + No JT65 + + + + + true + + + true + + + No Q65 + + + + + true + + + Q65C + + + + + true + + + Q65D + + + + + true + + + Q65E + + + + + Quick-Start Guide to Q65 + + + + + Quick-Start Guide to WSJT-X 2.5.0 and MAP65 3.0 + + + + + Q65 Sensitivity in MAP65 3.0 + + + + + + + DisplayText + QTextBrowser +
displaytext.h
+
+
+ + + + monitorButton + toggled(bool) + MainWindow + update() + + + 269 + 255 + + + 126 + 515 + + + + + + + + true + + + +
diff --git a/map65/map65.pro b/map65/map65.pro new file mode 100644 index 000000000..83862ada8 --- /dev/null +++ b/map65/map65.pro @@ -0,0 +1,70 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2011-07-07T08:39:24 +# +#------------------------------------------------- + +QT += core gui network +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +CONFIG += thread +#CONFIG += console + +TARGET = map65 +VERSION = 2.5.0 +TEMPLATE = app +DEFINES = QT5 +DESTDIR = /MAP65_2.9 + +F90 = gfortran +gfortran.output = ${QMAKE_FILE_BASE}.o +gfortran.commands = $$F90 -c -O2 -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} +gfortran.input = F90_SOURCES +QMAKE_EXTRA_COMPILERS += gfortran + +win32 { +DEFINES = WIN32 +} + +unix { +DEFINES = UNIX +} + +SOURCES += main.cpp mainwindow.cpp plotter.cpp about.cpp \ + soundin.cpp soundout.cpp devsetup.cpp \ + widegraph.cpp getfile.cpp messages.cpp bandmap.cpp \ + astro.cpp displaytext.cpp getdev.cpp \ + txtune.cpp meterwidget.cpp signalmeter.cpp + +win32 { +SOURCES += killbyname.cpp set570.cpp +} + +HEADERS += mainwindow.h plotter.h soundin.h soundout.h \ + about.h devsetup.h widegraph.h getfile.h messages.h \ + bandmap.h commons.h sleep.h astro.h displaytext.h \ + txtune.h meterwidget.h signalmeter.h + +FORMS += mainwindow.ui about.ui devsetup.ui widegraph.ui \ + messages.ui bandmap.ui astro.ui \ + txtune.ui + +RC_FILE = map65.rc + +unix { +LIBS += ../map65/libm65/libm65.a +LIBS += -lfftw3f -lportaudio -lgfortran +#LIBS +- -lusb +} + +win32 { +LIBS += ../map65/libm65/libm65.a +LIBS += ../map65/libfftw3f_win.a +LIBS += ../map65/palir-02.dll +LIBS += libwsock32 +#LIBS += C:/MinGW/lib/libf95.a +LIBS += -lgfortran +#LIBS += -lusb +LIBS += ../map65/libusb.a +#LIBS += -lQt5Concurrent +#LIBS += c:\JTSDK-QT\Qt5\Tools\mingw48_32\i686-w64-mingw32\lib\libmingwex.a +} diff --git a/map65/map65.rc b/map65/map65.rc new file mode 100644 index 000000000..96895aada --- /dev/null +++ b/map65/map65.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "wsjt.ico" diff --git a/map65/map65_config.h.in b/map65/map65_config.h.in new file mode 100644 index 000000000..ffb971758 --- /dev/null +++ b/map65/map65_config.h.in @@ -0,0 +1,4 @@ +#include "svnversion.h" + +#define MAP65_VERSION_MAJOR @MAP65_VERSION_MAJOR@ +#define MAP65_VERSION_MINOR @MAP65_VERSION_MINOR@ diff --git a/map65/map65b.iss b/map65/map65b.iss new file mode 100644 index 000000000..e2fbdf495 --- /dev/null +++ b/map65/map65b.iss @@ -0,0 +1,46 @@ +; For Use With JTSDK v2.0.0 +#define MyAppName "MAP65" +#define MyAppVersion "2.7" +#define MyAppPublisher "Joe Taylor, K1JT" +#define MyAppCopyright "Copyright (C) 2001-2017 by Joe Taylor, K1JT" +#define MyAppURL "http://physics.princeton.edu/pulsar/k1jt/map65.html" +#define WsjtGroupURL "https://groups.yahoo.com/neo/groups/wsjtgroup/info" + +[Setup] +AppName={#MyAppName} +AppVersion={#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DisableReadyPage=yes +DefaultDirName=C:\WSJT\MAP65 +DefaultGroupName=WSJT +DisableProgramGroupPage=yes +LicenseFile=C:\JTSDK\common-licenses\GPL-3 +OutputDir=C:\JTSDK\map65\package +OutputBaseFilename={#MyAppName}-{#MyAppVersion}-Win32 +SetupIconFile=C:\JTSDK\icons\wsjt.ico +Compression=lzma +SolidCompression=yes + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Files] +Source: "c:\JTSDK\map65\install\Release\bin\*"; DestDir: "{app}"; Excludes: CALL3.TXT; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "C:\JTSDK\src\map65\resources\*"; DestDir: "{app}"; Flags: ignoreversion onlyifdoesntexist + +[Icons] +Name: "{group}\{#MyAppName}\Documentation\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}" +Name: "{group}\{#MyAppName}\Resources\{cm:ProgramOnTheWeb,WSJT Group}"; Filename: "{#WsjtGroupURL}" +Name: "{group}\{#MyAppName}\Tools\Wisdom-1"; Filename: "{app}\wisdom1.bat"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" +Name: "{group}\{#MyAppName}\Tools\Wisdom-2"; Filename: "{app}\wisdom2.bat"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" +Name: "{group}\{#MyAppName}\Uninstall\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Comment: "Uninstall MAP65"; +Name: "{group}\{#MyAppName}\{#MyAppName}"; Filename: "{app}\map65.exe"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" +Name: "{userdesktop}\{#MyAppName}"; Filename: "{app}\map65.exe"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" + +[Run] +Filename: "{app}\wisdom1.bat"; Description: "Optimize plans for FFTs (takes a few minutes)"; Flags: postinstall +Filename: "{app}\wisdom2.bat"; Description: "Patiently optimize plans for FFTs (up to one hour)"; Flags: postinstall unchecked +Filename: "{app}\map65.exe"; Description: "Launch MAP65"; Flags: postinstall nowait unchecked diff --git a/map65/messages.cpp b/map65/messages.cpp new file mode 100644 index 000000000..3d0b18954 --- /dev/null +++ b/map65/messages.cpp @@ -0,0 +1,113 @@ +#include "messages.h" +#include +#include "SettingsGroup.hpp" +#include "ui_messages.h" +#include "mainwindow.h" +#include "qt_helpers.hpp" + +Messages::Messages (QString const& settings_filename, QWidget * parent) : + QDialog {parent}, + ui {new Ui::Messages}, + m_settings_filename {settings_filename} +{ + ui->setupUi(this); + setWindowTitle("Messages"); + setWindowFlags (Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for + // historical reasons + setGeometry (settings.value ("MessagesGeom", QRect {800, 400, 381, 400}).toRect ()); + ui->messagesTextBrowser->setStyleSheet( \ + "QTextBrowser { background-color : #000066; color : red; }"); + ui->messagesTextBrowser->clear(); + m_cqOnly=false; + m_cqStarOnly=false; + connect (ui->messagesTextBrowser, &DisplayText::selectCallsign, this, &Messages::selectCallsign2); +} + +Messages::~Messages() +{ + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue ("MessagesGeom", geometry ()); + delete ui; +} + +void Messages::setText(QString t, QString t2) +{ + QString cfreq,cfreq0; + m_t=t; + m_t2=t2; + + QString s="QTextBrowser{background-color: "+m_colorBackground+"}"; + ui->messagesTextBrowser->setStyleSheet(s); + + ui->messagesTextBrowser->clear(); + QStringList lines = t.split( "\n", SkipEmptyParts ); + foreach( QString line, lines ) { + QString t1=line.mid(0,50); + int ncq=t1.indexOf(" CQ "); + if((m_cqOnly or m_cqStarOnly) and ncq< 0) continue; + if(m_cqStarOnly) { + QString caller=t1.mid(ncq+4,-1); + int nz=caller.indexOf(" "); + caller=caller.mid(0,nz); + int i=t2.indexOf(caller); + if(t2.mid(i-1,1)==" ") continue; + } + int n=line.mid(50,2).toInt(); +// if(line.indexOf(":")>0) n=-1; +// if(n==-1) ui->messagesTextBrowser->setTextColor("#ffffff"); // white + if(n==0) ui->messagesTextBrowser->setTextColor(m_color0); + if(n==1) ui->messagesTextBrowser->setTextColor(m_color1); + if(n==2) ui->messagesTextBrowser->setTextColor(m_color2); + if(n>=3) ui->messagesTextBrowser->setTextColor(m_color3); + cfreq=t1.mid(0,3); + if(cfreq == cfreq0) { + t1=" " + t1.mid(3,-1); + } + cfreq0=cfreq; + ui->messagesTextBrowser->append(t1); + } +} + +void Messages::selectCallsign2(bool ctrl) +{ + QString t = ui->messagesTextBrowser->toPlainText(); //Full contents + int i=ui->messagesTextBrowser->textCursor().position(); + int i0=t.lastIndexOf(" ",i); + int i1=t.indexOf(" ",i); + QString hiscall=t.mid(i0+1,i1-i0-1); + if(hiscall!="") { + if(hiscall.length() < 13) { + QString t1 = t.mid(0,i); //contents up to text cursor + int i1=t1.lastIndexOf("\n") + 1; + QString t2 = t.mid(i1,-1); //selected line to end + int i2=t2.indexOf("\n"); + t2=t2.left(i2); //selected line + emit click2OnCallsign(hiscall,t2,ctrl); + } + } +} + +void Messages::setColors(QString t) +{ + m_colorBackground = "#"+t.mid(0,6); + m_color0 = "#"+t.mid(6,6); + m_color1 = "#"+t.mid(12,6); + m_color2 = "#"+t.mid(18,6); + m_color3 = "#"+t.mid(24,6); + setText(m_t,m_t2); +} + +void Messages::on_cbCQ_toggled(bool checked) +{ + m_cqOnly = checked; + setText(m_t,m_t2); +} + +void Messages::on_cbCQstar_toggled(bool checked) +{ + m_cqStarOnly = checked; + setText(m_t,m_t2); +} diff --git a/map65/messages.h b/map65/messages.h new file mode 100644 index 000000000..995c3d12f --- /dev/null +++ b/map65/messages.h @@ -0,0 +1,44 @@ +#ifndef MESSAGES_H +#define MESSAGES_H + +#include + +namespace Ui { + class Messages; +} + +class Messages : public QDialog +{ + Q_OBJECT + +public: + explicit Messages (QString const& settings_filename, QWidget * parent = nullptr); + void setText(QString t, QString t2); + void setColors(QString t); + + ~Messages(); + +signals: + void click2OnCallsign(QString hiscall, QString t2, bool ctrl); + +private slots: + void selectCallsign2(bool ctrl); + void on_cbCQ_toggled(bool checked); + void on_cbCQstar_toggled(bool checked); + +private: + Ui::Messages *ui; + QString m_settings_filename; + QString m_t; + QString m_t2; + QString m_colorBackground; + QString m_color0; + QString m_color1; + QString m_color2; + QString m_color3; + + bool m_cqOnly; + bool m_cqStarOnly; +}; + +#endif diff --git a/map65/messages.ui b/map65/messages.ui new file mode 100644 index 000000000..3bf0dc67a --- /dev/null +++ b/map65/messages.ui @@ -0,0 +1,107 @@ + + + Messages + + + + 0 + 0 + 399 + 595 + + + + + 0 + 0 + + + + Dialog + + + + + + QLayout::SetDefaultConstraint + + + + + + + + 0 + 0 + + + + Freq DF Pol UTC dB + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + CQ* Only + + + + + + + CQ Only + + + + + + + + + + 0 + 0 + + + + + 340 + 0 + + + + + Courier New + 9 + + + + + + + + + + + DisplayText + QTextBrowser +
displaytext.h
+
+
+ + +
diff --git a/map65/meterwidget.cpp b/map65/meterwidget.cpp new file mode 100755 index 000000000..8e48ed57d --- /dev/null +++ b/map65/meterwidget.cpp @@ -0,0 +1,49 @@ +// Simple bargraph meter +// Implemented by Edson Pereira PY2SDR + +#include "meterwidget.h" + +MeterWidget::MeterWidget(QWidget *parent) : + QWidget(parent), + m_signal(0) +{ + for ( int i = 0; i < 10; i++ ) { + signalQueue.enqueue(0); + } +} + +void MeterWidget::setValue(int value) +{ + m_signal = value; + signalQueue.enqueue(value); + signalQueue.dequeue(); + + // Get signal peak + int tmp = 0; + for (int i = 0; i < signalQueue.size(); ++i) { + if (signalQueue.at(i) > tmp) + tmp = signalQueue.at(i); + } + m_sigPeak = tmp; + + update(); +} + +void MeterWidget::paintEvent( QPaintEvent * ) +{ + int pos; + QPainter p {this}; + + // Sanitize + m_signal = m_signal < 0 ? 0 : m_signal; + m_signal = m_signal > 60 ? 60 : m_signal; + + pos = m_signal * 2; + QRect r(0, height() - pos, width(), pos ); + p.fillRect(r, QColor( 255, 150, 0 )); + + // Draw peak hold indicator + p.setPen(Qt::black); + pos = m_sigPeak * 2; + p.drawLine(0, height() - pos, 10, height() - pos); +} diff --git a/map65/meterwidget.h b/map65/meterwidget.h new file mode 100755 index 000000000..7b51efb65 --- /dev/null +++ b/map65/meterwidget.h @@ -0,0 +1,30 @@ +#ifndef METERWIDGET_H +#define METERWIDGET_H + +#include +#include +#include + +class MeterWidget : public QWidget +{ + Q_OBJECT +public: + explicit MeterWidget(QWidget *parent = 0); + +signals: + +public slots: + void setValue(int value); + +private: + QQueue signalQueue; + + int m_signal; + int m_sigPeak; + +protected: + void paintEvent( QPaintEvent * ); + +}; + +#endif // METERWIDGET_H diff --git a/map65/paInputDevice.c b/map65/paInputDevice.c new file mode 100644 index 000000000..bad4973f4 --- /dev/null +++ b/map65/paInputDevice.c @@ -0,0 +1,56 @@ +#include +#include +#include + +void paInputDevice(int id, char* hostAPI_DeviceName, int* minChan, + int* maxChan, int* minSpeed, int* maxSpeed) +{ + int i; + char pa_device_name[128]; + char pa_device_hostapi[128]; + double pa_device_max_speed; + double pa_device_min_speed; + int pa_device_max_bytes; + int pa_device_min_bytes; + int pa_device_max_channels; + int pa_device_min_channels; + char p2[256]; + char *p,*p1; + static int iret, valid_dev_cnt; + + iret=pa_get_device_info (id, + &pa_device_name, + &pa_device_hostapi, + &pa_device_max_speed, + &pa_device_min_speed, + &pa_device_max_bytes, + &pa_device_min_bytes, + &pa_device_max_channels, + &pa_device_min_channels); + + if (iret >= 0 ) { + valid_dev_cnt++; + + p1=""; + p=strstr(pa_device_hostapi,"MME"); + if(p!=NULL) p1="MME"; + p=strstr(pa_device_hostapi,"Direct"); + if(p!=NULL) p1="DirectX"; + p=strstr(pa_device_hostapi,"WASAPI"); + if(p!=NULL) p1="WASAPI"; + p=strstr(pa_device_hostapi,"ASIO"); + if(p!=NULL) p1="ASIO"; + p=strstr(pa_device_hostapi,"WDM-KS"); + if(p!=NULL) p1="WDM-KS"; + + sprintf(p2,"%-8s %-39s",p1,pa_device_name); + for(i=0; i<50; i++) { + hostAPI_DeviceName[i]=p2[i]; + if(p2[i]==0) break; + } + *minChan=pa_device_min_channels; + *maxChan=pa_device_max_channels; + *minSpeed=(int)pa_device_min_speed; + *maxSpeed=(int)pa_device_max_speed; + } +} diff --git a/map65/pa_get_device_info.c b/map65/pa_get_device_info.c new file mode 100644 index 000000000..968d3434b --- /dev/null +++ b/map65/pa_get_device_info.c @@ -0,0 +1,173 @@ +#include +#include +#include + +#define MAX_LATENCY 20 + +PaStream *in_stream; +//------------------------------------------------------- pa_get_device_info +int pa_get_device_info (int n, + void *pa_device_name, + void *pa_device_hostapi, + double *pa_device_max_speed, + double *pa_device_min_speed, + int *pa_device_max_bytes, + int *pa_device_min_bytes, + int *pa_device_max_channels, + int *pa_device_min_channels ) +{ + + (void) n ; + (void) pa_device_name; + (void) pa_device_hostapi; + (void) pa_device_max_speed; + (void) pa_device_min_speed; + (void) pa_device_max_bytes; + (void) pa_device_min_bytes; + (void) pa_device_max_channels; + (void) pa_device_min_channels; + const PaDeviceInfo *deviceInfo; + PaError pa_err; + PaStreamParameters inputParameters; + int i,j, speed_warning; + int minBytes, maxBytes; + double maxStandardSampleRate; + double minStandardSampleRate; + int minInputChannels; + int maxInputChannels; + +// negative terminated list + static double standardSampleRates[] = {8000.0, 9600.0, + 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, + 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1}; +// ******************************************************* + + + *pa_device_max_speed=0; + *pa_device_min_speed=0; + *pa_device_max_bytes=0; + *pa_device_min_bytes=0; + *pa_device_max_channels=0; + *pa_device_min_channels=0; + minInputChannels=0; + if(n >= Pa_GetDeviceCount() ) return -1; + deviceInfo = Pa_GetDeviceInfo(n); + if (deviceInfo->maxInputChannels==0) return -1; + sprintf((char*)(pa_device_name),"%s",deviceInfo->name); + sprintf((char*)(pa_device_hostapi),"%s", + Pa_GetHostApiInfo( deviceInfo->hostApi )->name); + speed_warning=0; + +// bypass bug in Juli@ ASIO driver: +// this driver hangs after a Pa_IsFormatSupported call + i = strncmp(deviceInfo->name, "ASIO 2.0 - ESI Juli@", 19); + if (i == 0) { + minStandardSampleRate=44100; + maxStandardSampleRate=192000; + minBytes=1; + maxBytes=4; + maxInputChannels= deviceInfo->maxInputChannels; + minInputChannels= 1; + goto end_pa_get_device_info; + } + +// Investigate device capabilities. +// Check min and max samplerates with 16 bit data. + maxStandardSampleRate=0; + minStandardSampleRate=0; + inputParameters.device = n; + inputParameters.channelCount = deviceInfo->maxInputChannels; + inputParameters.sampleFormat = paInt16; + inputParameters.suggestedLatency = 0; + inputParameters.hostApiSpecificStreamInfo = NULL; + +// ************************************************************************ +//filter for portaudio Windows hostapi's with non experts. +//only allow ASIO or WASAPI or WDM-KS + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, "ASIO", 4); + if (i==0 ) goto end_filter_hostapi; + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, + "Windows WASAPI", 14); + if (i==0 ) goto end_filter_hostapi; + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, + "Windows WDM-KS", 14); + if (i==0 ) goto end_filter_hostapi; + speed_warning=1; +end_filter_hostapi:; + +// ************************************************************************ + i=0; + while(standardSampleRates[i] > 0 && minStandardSampleRate==0) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + standardSampleRates[i] ); + if(pa_err == paDeviceUnavailable) return -1; + if(pa_err == paInvalidDevice) return -1; + if(pa_err == paFormatIsSupported ) { + minStandardSampleRate=standardSampleRates[i]; + } + i++; + } + if(minStandardSampleRate == 0) return -1; + j=i; + while(standardSampleRates[i] > 0 ) i++; + i--; + while(i >= j && maxStandardSampleRate==0) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + standardSampleRates[i] ); + if(pa_err == paDeviceUnavailable) return -1; + if(pa_err == paInvalidDevice) return -1; + if( pa_err == paFormatIsSupported ) { + maxStandardSampleRate=standardSampleRates[i]; + } + i--; + } + +// check if min SampleRate = max SampleRate + if(maxStandardSampleRate==0 && (minStandardSampleRate != 0)) { + maxStandardSampleRate= minStandardSampleRate; + } + +// check min and max bytes + minBytes=2; + maxBytes=2; + inputParameters.sampleFormat = paUInt8; + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + if( pa_err == paFormatIsSupported ) { + minBytes=1; + } + inputParameters.sampleFormat = paInt32; + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + if( pa_err == paFormatIsSupported ) { + maxBytes=4; + } + +// check min channel count + maxInputChannels= deviceInfo->maxInputChannels; + inputParameters.channelCount = 1; + inputParameters.sampleFormat = paInt16; + pa_err=paFormatIsSupported+32000; + while(pa_err != paFormatIsSupported && + ( inputParameters.channelCount < (maxInputChannels+1)) ) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + inputParameters.channelCount++; + } + if( pa_err == paFormatIsSupported ) { + minInputChannels=inputParameters.channelCount-1; + } else { + return -1; + } + +end_pa_get_device_info:; + + *pa_device_max_speed=maxStandardSampleRate; + *pa_device_min_speed=minStandardSampleRate; + *pa_device_max_bytes=maxBytes; + *pa_device_min_bytes=minBytes; + *pa_device_max_channels= maxInputChannels; + *pa_device_min_channels= minInputChannels; + + return speed_warning; +} diff --git a/map65/plotter.cpp b/map65/plotter.cpp new file mode 100644 index 000000000..20b0f81b6 --- /dev/null +++ b/map65/plotter.cpp @@ -0,0 +1,792 @@ +#include "plotter.h" +#include +#include +#include +#include + +#define MAX_SCREENSIZE 2048 + + +CPlotter::CPlotter(QWidget *parent) : //CPlotter Constructor + QFrame(parent) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setFocusPolicy(Qt::StrongFocus); + setAttribute(Qt::WA_PaintOnScreen,false); + setAutoFillBackground(false); + setAttribute(Qt::WA_OpaquePaintEvent, false); + setAttribute(Qt::WA_NoSystemBackground, true); + setMouseTracking(true); + + m_StartFreq = 100; + m_nSpan=65; //Units: kHz + m_fSpan=(float)m_nSpan; + m_hdivs = HORZ_DIVS; + m_FreqUnits = 1; + m_Running = false; + m_paintEventBusy=false; + m_WaterfallPixmap = QPixmap(0,0); + m_ZoomWaterfallPixmap = QPixmap(0,0); + m_2DPixmap = QPixmap(0,0); + m_ScalePixmap = QPixmap(0,0); + m_ZoomScalePixmap = QPixmap(0,0); + m_Size = QSize(0,0); + m_fQSO = 125; + m_TXkHz = m_fQSO; + m_line = 0; + m_fSample = 96000; + m_paintAllZoom = false; + m_TxDF=0; + m_bDecodeFinished=false; +} + +CPlotter::~CPlotter() { } // Destructor + +QSize CPlotter::minimumSizeHint() const +{ + return QSize(50, 50); +} + +QSize CPlotter::sizeHint() const +{ + return QSize(180, 180); +} + +void CPlotter::resizeEvent(QResizeEvent* ) //resizeEvent() +{ + if(!size().isValid()) return; + if( m_Size != size() ) { + //if changed, resize pixmaps to new screensize + m_Size = size(); + int w = m_Size.width(); + int h = (m_Size.height()-60)/2; + m_WaterfallPixmap = QPixmap(w,h); + m_ZoomWaterfallPixmap = QPixmap(w,h); + m_2DPixmap = QPixmap(w,h); + m_WaterfallPixmap.fill(Qt::black); + m_ZoomWaterfallPixmap.fill(Qt::black); + m_2DPixmap.fill(Qt::black); + memset(m_zwf,0,32768*h); + m_ScalePixmap = QPixmap(w,30); + m_ZoomScalePixmap = QPixmap(w,30); //(no change on resize...) + m_ScalePixmap.fill(Qt::white); + m_ZoomScalePixmap.fill(Qt::yellow); + } + SetCenterFreq(-1); + DrawOverlay(); +} + +void CPlotter::paintEvent(QPaintEvent *) // paintEvent() +{ + static int x00=-99; + + if(m_paintEventBusy) return; + m_paintEventBusy=true; + QPainter painter(this); + int w = m_Size.width(); + int h = (m_Size.height()-60)/2; + painter.drawPixmap(0,0,m_ScalePixmap); + painter.drawPixmap(0,30,m_WaterfallPixmap); + if(m_2Dspec) { + painter.drawPixmap(0,h+30,m_ScalePixmap); + painter.drawPixmap(0,h+60,m_2DPixmap); + m_paintEventBusy=false; + return; + } + + painter.drawPixmap(0,h+30,m_ZoomScalePixmap); + painter.drawPixmap(0,h+60,m_ZoomWaterfallPixmap); + + QRect target(0,h+30,w,30); // (x,y,width,height) + QRect source(0,0,w,30); + painter.drawPixmap(target,m_ZoomScalePixmap,source); + + float df=m_fSample/32768.0; + int x0=16384 + (0.001*(m_ZoomStartFreq+m_fCal)+m_fQSO-m_nkhz+1.27046) * \ + 1000.0/df + 0.5; + + QPainter painter1(&m_WaterfallPixmap); + QPainter painter2(&m_ZoomWaterfallPixmap); + for(int i=0; i> freq >> sync; + if(f.eof()) break; + x=(freq - m_ZoomStartFreq)/df; + y=(sync-slimit)*3.0; + if(y>0) { + if(y>15.0) y=15.0; + if(x>=0 and x<=w) painter2.drawLine(x,0,x,y); + x=XfromFreq(float(fQSO()+0.001*freq)); + painter1.setPen(pen0); + painter1.drawLine(x,0,x,y); + } + } + f.close(); + } + */ + m_bDecodeFinished=false; + } + + m_paintAllZoom=false; + x00=x0; + + QRect target2(0,h+60,w,h); // (x,y,width,height) + QRect source2(0,0,w,h); + painter.drawPixmap(target2,m_ZoomWaterfallPixmap,source2); + m_paintEventBusy=false; +} + +void CPlotter::DecodeFinished() +{ + m_bDecodeFinished=true; + update(); //trigger a new paintEvent +} + +void CPlotter::draw(float s[], int i0, float splot[]) //draw() +{ + int i,j,w,h; + float y; + + m_i0=i0; + w = m_WaterfallPixmap.width(); + h = m_WaterfallPixmap.height(); + double gain = pow(10.0,0.05*(m_plotGain+7)); + + //move current data down one line + //(must do this before attaching a QPainter object) + m_WaterfallPixmap.scroll(0,1,0,0,w,h); + m_ZoomWaterfallPixmap.scroll(0,1,0,0, w, h); + memmove(&m_zwf[32768],m_zwf,32768*(h-1)); + QPainter painter1(&m_WaterfallPixmap); + QPainter painter2D(&m_2DPixmap); + + for(i=0; i<256; i++) { //Zero the histograms + m_hist1[i]=0; + m_hist2[i]=0; + } + + painter2D.setPen(Qt::green); + QRect tmp(0,0,w,h); + painter2D.fillRect(tmp,Qt::black); + QPoint LineBuf[MAX_SCREENSIZE]; + j=0; + bool strong0=false; + bool strong=false; + + for(i=0; i254) y1=254; + if (s[i]>1.e29) y1=255; + m_hist1[y1]++; + painter1.setPen(m_ColorTbl[y1]); + painter1.drawPoint(i,0); + if(m_2Dspec) { + int y2 = gain*(y + 34 -m_plotZero); + if (y2<0) y2=0; + if (y2>254) y2=254; + if (s[i]>1.e29) y2=255; + if(strong != strong0 or i==w-1) { + painter2D.drawPolyline(LineBuf,j); + j=0; + strong0=strong; + if(strong0) painter2D.setPen(Qt::red); + if(!strong0) painter2D.setPen(Qt::green); + } + LineBuf[j].setX(i); + LineBuf[j].setY(h-y2); + j++; + } + } + + for(i=0; i<32768; i++) { + y = 10.0*log10(splot[i]); + int y1 = 5.0*gain*(y + 30 - m_plotZero); + if (y1<0) y1=0; + if (y1>254) y1=254; + if (splot[i]>1.e29) y1=255; + m_hist2[y1]++; + m_zwf[i]=y1; + } + + if(s[0]>1.0e29) m_line=0; + m_line++; + if(m_line == 13) { + UTCstr(); + painter1.setPen(m_ColorTbl[255]); + painter1.drawText(5,10,m_sutc); + m_paintAllZoom=true; + } + update(); //trigger a new paintEvent +} + +void CPlotter::UTCstr() +{ + int ihr,imin; + if(datcom_.ndiskdat != 0) { + ihr=datcom_.nutc/100; + imin=(datcom_.nutc) % 100; + } else { + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + imin=ms/60000; + ihr=imin/60; + imin=imin % 60; + } + m_sutc = QString {"%1:%2"}.arg (ihr, 2).arg (imin, 2); +} + +void CPlotter::DrawOverlay() //DrawOverlay() +{ + if(m_WaterfallPixmap.isNull()) return; + int w = m_WaterfallPixmap.width(); + int x,y; + float pixperdiv; + + QRect rect0; + QPainter painter0(&m_ScalePixmap); + + //create Font to use for scales + QFont Font("Arial"); + Font.setPointSize(12); + QFontMetrics metrics(Font); + Font.setWeight(QFont::Normal); + painter0.setFont(Font); + painter0.setPen(Qt::black); + + m_binsPerPixel = m_nSpan * 32768.0/(w*0.001*m_fSample) + 0.5; + double FreqPerDiv=5.0; + double df = m_binsPerPixel*0.001*m_fSample/32768.0; + m_hdivs = w*df/FreqPerDiv + 0.9999; + m_fSpan = w*df; + m_ScalePixmap.fill(Qt::white); + painter0.drawRect(0, 0, w, 30); + + //draw tick marks on wideband (upper) scale + pixperdiv = FreqPerDiv/df; + for( int i=1; i0 and x0 100) { + m_FreqUnits = 1; + FreqPerDiv = 200; + int w = m_WaterfallPixmap.width(); + float df=m_fSample/32768.0; + StartFreq = -w*df/2; + int n=StartFreq/FreqPerDiv; + StartFreq=n*200; + m_ZoomStartFreq = (int)StartFreq; + } + int numfractdigits = (int)log10((double)m_FreqUnits); + + if(1 == m_FreqUnits) { + //if units is Hz then just output integer freq + for(int i=0; i<=m_hdivs; i++) { + freq = StartFreq/(float)m_FreqUnits; + m_HDivText[i].setNum((int)freq); + StartFreq += FreqPerDiv; + } + return; + } + //here if is fractional frequency values + //so create max sized text based on frequency units + for(int i=0; i<=m_hdivs; i++) { + freq = StartFreq/(float)m_FreqUnits; + m_HDivText[i].setNum(freq,'f', numfractdigits); + StartFreq += FreqPerDiv; + } + //now find the division text with the longest non-zero digit + //to the right of the decimal point. + int max = 0; + for(i=0; i<=m_hdivs; i++) { + int dp = m_HDivText[i].indexOf('.'); + int l = m_HDivText[i].length()-1; + for(j=l; j>dp; j--) { + if(m_HDivText[i][j] != '0') + break; + } + if( (j-dp) > max) + max = j-dp; + } + //truncate all strings to maximum fractional length + StartFreq = m_CenterFreq - 0.5*m_fSpan; + for( i=0; i<=m_hdivs; i++) { + freq = (float)StartFreq/(float)m_FreqUnits; + m_HDivText[i].setNum(freq,'f', max); + StartFreq += FreqPerDiv; + } +} + +int CPlotter::XfromFreq(float f) //XfromFreq() +{ + float w = m_WaterfallPixmap.width(); + int x = (int) w * (f - m_StartFreq)/m_fSpan; + if(x<0 ) return 0; + if(x>(int)w) return m_WaterfallPixmap.width(); + return x; +} + +float CPlotter::FreqfromX(int x) //FreqfromX() +{ + float w = m_WaterfallPixmap.width(); + float f =m_CenterFreq - 0.5*m_fSpan + m_fSpan * x/w; + return f; +} + +void CPlotter::SetRunningState(bool running) //SetRunningState() +{ + m_Running = running; +} + +void CPlotter::setPlotZero(int plotZero) //setPlotZero() +{ + m_plotZero=plotZero; +} + +int CPlotter::getPlotZero() //getPlotZero() +{ + return m_plotZero; +} + +void CPlotter::setPlotGain(int plotGain) //setPlotGain() +{ + m_plotGain=plotGain; +} + +int CPlotter::getPlotGain() //getPlotGain() +{ + return m_plotGain; +} + +void CPlotter::SetCenterFreq(int f) //setCenterFreq() +{ +// f is the integer kHz portion of cfreq, from Linrad packets + if(f<0) f=m_nkhz; + int ns = (f+m_FreqOffset-0.5*m_fSpan)/5.0 + 0.5; + double fs = 5*ns; + m_CenterFreq = fs + 0.5*m_fSpan; +} + +qint64 CPlotter::centerFreq() //centerFreq() +{ + return m_CenterFreq; +} + +void CPlotter::SetStartFreq(quint64 f) //SetStartFreq() +{ + m_StartFreq=f; +// resizeEvent(NULL); + DrawOverlay(); +} + +qint64 CPlotter::startFreq() //startFreq() +{ + return m_StartFreq; +} + +void CPlotter::SetFreqOffset(quint64 f) //SetFreqOffset() +{ + m_FreqOffset=f; + DrawOverlay(); +} + +qint64 CPlotter::freqOffset() {return m_FreqOffset;} //freqOffset() +int CPlotter::plotWidth(){return m_WaterfallPixmap.width();} +void CPlotter::UpdateOverlay() {DrawOverlay();} +void CPlotter::setDataFromDisk(bool b) {m_dataFromDisk=b;} + +void CPlotter::setTol(int n) //setTol() +{ + m_tol=n; + DrawOverlay(); +} + +void CPlotter::setBinsPerPixel(int n) {m_binsPerPixel = n;} //set nbpp + +int CPlotter::binsPerPixel(){return m_binsPerPixel;} //get nbpp + +void CPlotter::setFQSO(int x, bool bf) //setFQSO() +{ + if(bf) { + m_fQSO=x; // x is freq in kHz + } else { + if(x<0) x=0; // x is pixel number + if(x>m_Size.width()) x=m_Size.width(); + m_fQSO = int(FreqfromX(x)+0.5); + m_xClick=x; + } + if(m_bLockTxRx) m_TXkHz=m_fQSO; + m_TXfreq = floor(datcom_.fcenter) + 0.001*m_TXkHz; + DrawOverlay(); + update(); +} + +void CPlotter::setFcal(int n) //setFcal() +{ + m_fCal=n; +} + +void CPlotter::setNkhz(int n) //setNkhz() +{ + m_nkhz=n; +} + +int CPlotter::fQSO() {return m_fQSO;} //get fQSO + +int CPlotter::DF() {return m_DF;} // get DF + +void CPlotter::mousePressEvent(QMouseEvent *event) //mousePressEvent +{ + int h = (m_Size.height()-60)/2; + int x=event->x(); + int y=event->y(); + int button=event->button(); + if(y < h+30) { // Wideband waterfall + if(button==1) { + setFQSO(x,false); + } + if(button==2 and !m_bLockTxRx) { + if(x<0) x=0; // x is pixel number + if(x>m_Size.width()) x=m_Size.width(); + m_TXkHz = int(FreqfromX(x)+0.5); + m_TXfreq = floor(datcom_.fcenter) + 0.001*m_TXkHz; + } + } else { // Zoomed waterfall + if(button==1) m_DF=int(m_ZoomStartFreq + x*m_fSample/32768.0); + if(button==2 and !m_bLockTxRx) m_TxDF=int(m_ZoomStartFreq + x*m_fSample/32768.0); + if(m_bLockTxRx) m_TxDF=m_DF; + } + DrawOverlay(); + update(); +} + +void CPlotter::mouseDoubleClickEvent(QMouseEvent *event) //mouse2click +{ + if(event->button()!=1) return; //Act only on left double-click + int h = (m_Size.height()-60)/2; + int x=event->x(); + int y=event->y(); + if(y < h+30) { + m_DF=0; + setFQSO(x,false); + emit freezeDecode1(2); //### ??? + } else { + float f = m_ZoomStartFreq + x*m_fSample/32768.0; + m_DF=int(f); + emit freezeDecode1(1); + DrawOverlay(); + } +} + +int CPlotter::autoZero() //autoZero() +{ + m_z1=0; + m_z2=0; + int sum1=0; + for(int i=0; i<256; i++) { + sum1 += m_hist1[i]; + if(sum1 > m_Size.width()/2) { + m_z1=i; + break; + } + } + int sum2=0; + for(int i=0; i<256; i++) { + sum2 += m_hist2[i]; + if(sum2 > 16384) { + m_z2=i; + break; + } + } + double gain = pow(10.0,0.05*(m_plotGain+7)); +// double dz1 = (m_z1-38)/(5.0*gain); + double dz2 = (m_z2-28)/(5.0*gain); + if(m_z2 < 255) m_plotZero = int(m_plotZero + dz2 + 0.5); + return m_plotZero; +} + +void CPlotter::setNSpan(int n) //setNSpan() +{ + m_nSpan=n; +} + +void CPlotter::setPalette(QString palette) //setPalette() +{ + if(palette=="Linrad") { + float twopi=6.2831853; + float r,g,b,phi,x; + for(int i=0; i<256; i++) { + r=0.0; + if(i>105 and i<=198) { + phi=(twopi/4.0) * (i-105.0)/(198.0-105.0); + r=sin(phi); + } else if(i>=198) { + r=1.0; + } + + g=0.0; + if(i>35 and i<198) { + phi=(twopi/4.0) * (i-35.0)/(122.5-35.0); + g=0.625*sin(phi); + } else if(i>=198) { + x=(i-186.0); + g=-0.014 + 0.0144*x -0.00007*x*x +0.000002*x*x*x; + if(g>1.0) g=1.0; + } + + b=0.0; + if(i<=117) { + phi=(twopi/2.0) * i/117.0; + b=0.4531*sin(phi); + } else if(i>186) { + x=(i-186.0); + b=-0.014 + 0.0144*x -0.00007*x*x +0.000002*x*x*x; + if(b>1.0) b=1.0; + } + m_ColorTbl[i].setRgb(int(255.0*r),int(255.0*g),int(255.0*b)); + } + m_ColorTbl[255].setRgb(255,255,100); + + } + + if(palette=="CuteSDR") { + for( int i=0; i<256; i++) { + if( (i<43) ) + m_ColorTbl[i].setRgb( 0,0, 255*(i)/43); + if( (i>=43) && (i<87) ) + m_ColorTbl[i].setRgb( 0, 255*(i-43)/43, 255 ); + if( (i>=87) && (i<120) ) + m_ColorTbl[i].setRgb( 0,255, 255-(255*(i-87)/32)); + if( (i>=120) && (i<154) ) + m_ColorTbl[i].setRgb( (255*(i-120)/33), 255, 0); + if( (i>=154) && (i<217) ) + m_ColorTbl[i].setRgb( 255, 255 - (255*(i-154)/62), 0); + if( (i>=217) ) + m_ColorTbl[i].setRgb( 255, 0, 128*(i-217)/38); + } + m_ColorTbl[255].setRgb(255,255,100); + } +} + +void CPlotter::setFsample(int n) +{ + m_fSample=n; +} + +void CPlotter::setMode65(int n) +{ + m_mode65=n; + DrawOverlay(); //Redraw scales and ticks + update(); //trigger a new paintEvent +} + +void CPlotter::set2Dspec(bool b) +{ + m_2Dspec=b; + m_paintAllZoom=!b; + DrawOverlay(); //Redraw scales and ticks + update(); //trigger a new paintEvent} +} + +double CPlotter::fGreen() +{ + return m_fGreen; +} + +void CPlotter::setLockTxRx(bool b) +{ + m_bLockTxRx=b; + if(m_bLockTxRx) { + m_TXkHz=m_fQSO; + m_TXfreq=floor(m_TXfreq) + 0.001*m_TXkHz; + m_TxDF=m_DF; + DrawOverlay(); //Redraw scales and ticks + update(); //trigger a new paintEvent} + } +} + +void CPlotter::mouseMoveEvent (QMouseEvent * event) +{ + int h = m_WaterfallPixmap.height(); + int x=event->x(); + int y=event->y(); + bool lower=(y > 30+h); + float freq=FreqfromX(x); + float df=m_fSample/32768.0; + int ndf=x*df + m_ZoomStartFreq; + if(lower) { + QToolTip::showText(event->globalPos(),QString::number(ndf)); + } else { + QToolTip::showText(event->globalPos(),QString::number(freq)); + } + QWidget::mouseMoveEvent(event); +} + +double CPlotter::rxFreq() +{ + return floor(datcom_.fcenter) + 0.001*m_fQSO + 0.000001*m_DF; +} + +double CPlotter::txFreq() +{ + return m_TXfreq + 0.000001*m_TxDF; +} diff --git a/map65/plotter.h b/map65/plotter.h new file mode 100644 index 000000000..6f2922458 --- /dev/null +++ b/map65/plotter.h @@ -0,0 +1,139 @@ +/////////////////////////////////////////////////////////////////////////// +// Some code in this file and accompanying files is based on work by +// Moe Wheatley, AE4Y, released under the "Simplified BSD License". +// For more details see the accompanying file LICENSE_WHEATLEY.TXT +/////////////////////////////////////////////////////////////////////////// + +#ifndef PLOTTER_H +#define PLOTTER_H + +#include +#include +#include +#include +#include +#include "commons.h" + +#define VERT_DIVS 7 //specify grid screen divisions +#define HORZ_DIVS 20 + +class CPlotter : public QFrame +{ + Q_OBJECT +public: + explicit CPlotter(QWidget *parent = 0); + ~CPlotter(); + + QSize minimumSizeHint() const; + QSize sizeHint() const; + QColor m_ColorTbl[256]; + bool m_bDecodeFinished; + int m_plotZero; + int m_plotGain; + float m_fSpan; + qint32 m_nSpan; + qint32 m_binsPerPixel; + qint32 m_fQSO; + qint32 m_DF; + qint32 m_tol; + qint32 m_fCal; + + void draw(float sw[], int i0, float splot[]); //Update the waterfalls + void SetRunningState(bool running); + void setPlotZero(int plotZero); + int getPlotZero(); + void setPlotGain(int plotGain); + int getPlotGain(); + void SetCenterFreq(int f); + qint64 centerFreq(); + void SetStartFreq(quint64 f); + qint64 startFreq(); + void SetFreqOffset(quint64 f); + qint64 freqOffset(); + int plotWidth(); + void setNSpan(int n); + void UpdateOverlay(); + void setDataFromDisk(bool b); + void setTol(int n); + void setBinsPerPixel(int n); + int binsPerPixel(); + void setFQSO(int n, bool bf); + void setFcal(int n); + void setNkhz(int n); + void DecodeFinished(); + void DrawOverlay(); + int fQSO(); + int DF(); + int autoZero(); + void setPalette(QString palette); + void setFsample(int n); + void setMode65(int n); + void set2Dspec(bool b); + double fGreen(); + void setLockTxRx(bool b); + double rxFreq(); + double txFreq(); +// void updateFreqLabel(); + +signals: + void freezeDecode0(int n); + void freezeDecode1(int n); + +protected: + //re-implemented widget event handlers + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent* event); + void mouseMoveEvent(QMouseEvent * event) override; + +private: + + void MakeFrequencyStrs(); + void UTCstr(); + int XfromFreq(float f); + float FreqfromX(int x); + qint64 RoundFreq(qint64 freq, int resolution); + + QPixmap m_WaterfallPixmap; + QPixmap m_ZoomWaterfallPixmap; + QPixmap m_2DPixmap; + unsigned char m_zwf[32768*400]; + QPixmap m_ScalePixmap; + QPixmap m_ZoomScalePixmap; + QSize m_Size; + QString m_Str; + QString m_HDivText[483]; + bool m_Running; + bool m_paintEventBusy; + bool m_2Dspec; + bool m_paintAllZoom; + bool m_bLockTxRx; + double m_CenterFreq; + double m_fGreen; + double m_TXfreq; + qint64 m_StartFreq; + qint64 m_ZoomStartFreq; + qint64 m_FreqOffset; + qint32 m_dBStepSize; + qint32 m_FreqUnits; + qint32 m_hdivs; + bool m_dataFromDisk; + QString m_sutc; + qint32 m_line; + qint32 m_hist1[256]; + qint32 m_hist2[256]; + qint32 m_z1; + qint32 m_z2; + qint32 m_nkhz; + qint32 m_fSample; + qint32 m_mode65; + qint32 m_i0; + qint32 m_xClick; + qint32 m_TXkHz; + qint32 m_TxDF; + +private slots: + void mousePressEvent(QMouseEvent *event); + void mouseDoubleClickEvent(QMouseEvent *event); +}; + +#endif // PLOTTER_H diff --git a/map65/resources/CALL3.TXT b/map65/resources/CALL3.TXT new file mode 100644 index 000000000..d4c2e3532 --- /dev/null +++ b/map65/resources/CALL3.TXT @@ -0,0 +1,5708 @@ +//ms 3.0 2009-07-01 01:15:53 UTC _WSJT_CALL3 > CALL3.txt format for WSJT-PROGRAM by K1JT +//MS-EME-WSJT-Version 2009-07-01 01:15:53 UTC an exerp of VHF-DATABASE on MMMonVHF +//UPDATES welcome: http://www.mmmonvhf.de/dbase.php - 73 the Team of MMMonVHF +2E0ZWW,JO01ED,,,M3ZWW,,ICOM IC-820H FT897D,04/09 +2I0BIW,IO64PF,,,MI3IYA,,Yaesu ft-847,06/07 +2M0EXD,IO88FO,,,,,,04/04 +3B9C,MH10QG,EME,,,,,01/03 +3D2LR,RH92,EME,, +3DA0HL,KG53MS,EME,,EXPEDITION,,,03/07 +3V8BB,JM56ER,EME,,,,,06/02 +3V8SS,JM55GX,EME,,Expedition,,144: 16JXX and 1kw,12/05 +3X5A,IJ39JJ,EME,,EXPEDITION,,144: 2M28XPOLs and a KW,11/07 +3Y0X,EC41RE,EME,,Expedition,,144: 4x 9el 350W,02/06 +4F2KWT,PK06CI,EME,,,,50: 7el 650W,07-06 +4J1FS,KP40,,,Expedition,,,01/90 +4K6D,LN40VK,EME,,,,,01/94 +4N7AX,KN05PC,,,,,144: 200 W 2x10el 9BV,08/00 +4O3T,JN92HJ,EME,,,,144: IC706 Skysar 1kW FM-PA 3x 10 el at 10m abt 700m asl,08/06 +4O4AR,JN94AS,,,= YU4AR,,144: TR9130 250W 10el PA0MS-ant Preamp,11/02 +4O4D,JN94BR,,,,,144: 300W 11el,05/97 +4O9T,JN94XC,,,YU7AAA YT7C,,,11/08 +4S7CCG,MJ96WV,EME,,,,144: 4 x 8el and 300W,07/06 +4U1ITU,JN36BF,EME,,div. Activities,,144: 8el 600W,11/00 +4X1IF,KM72KA,EME,,,,,07/05 +4X4IF,KM72KD,EME,,,,,05/00 +4X6UJ,KM72,EME,,,,,01/00 +4Z5AO,KM72MW,,,ex UA1AKZ,,ft-857 ic-746,07/05 +4Z5BS,KM71JW,,,,,,07/95 +5A7A,JM62MU,EME,,Expedition,,144: 2x 10el 7ZB 1KW - 432: 9wl ant 200W,03/07 +5B4AGY,KM64EV,,,ex G3RSI 5A3CAD VO2AN,,FT-726R plus 1kW Linears and head amplifiers for 6M and 2M and 100w for 70cms,01/05 +5B4AIA,KM65GD,EME,,EXPEDITION,,144: 2MXP32 6WL 500W,09/07 +5B8AD,KM64TV,EME,,,,144: 2x16 el 14.3dB 230w,03/05 +5B8AV,KM64FT,,,ex 5B/G1JJE,,,05/04 +5C8M,IM64PD,EME,,Expedition,,144: IC706 MKIIG PA 1KW preamp. 2x 3WL yagis,10/00 +5F3COM,IM52JJ,EME,,= SV8CS,,,09/06 +5H1HP,KI93RV,EME,,EXPEDITION,,144: 14el XP 1.2KW,05/09 +5H1HP/KI94,KI94,EME,,EXPEDITION,,144: 14el XP 1.2KW,05/09 +5H1MS,KI93RV,EME,,EXPEDITION,,144: 14el XP 1.2KW,05/09 +5H1MS/KI94,KI94,EME,,EXPEDITION,,144: 14el XP 1.2KW,05/09 +5P8Z,JO55RT,EME,,,,144: IC706 GS31b 1KW 4x8el,04/07 +5P9S,JO54TU,EME,,= OU9S OV9S 5Q9S OZ9S,,See www.oz9s.dk (click rig) for actual and updated info,05/07 +5Q2M,JO65AN,EME,,= OZ1PIF,,FT847 50: 100W 4el - 144: 350W 2x 13el Preamp,04/07 +5Q9S,JO54TU,EME,,= 5P9S OU9S OV9S OZ9S,,See www.oz9s.dk (click rig) for actual and updated info,05/07 +5R8EM,LH42WX,EME,,EXPEDITION,,,09/08 +5T5JC,IL30AM,EME,,,,,01/94 +5T5SN,IK28AC,EME,,QRT,,,09/05 +5X1D,KJ60EM,EME,,,,300W- 17el,03/97 +5X1EME,KJ60gh,EME,, +5Z4NU,KI88IP,,,,,144: 25W 9el,09/05 +6F75A,DL81UU,EME,,= XE2AT,,144: IC820 400W 4x 9el,01/07 +6I2AT,DL81UU,EME,,= XE2AT,,144: IC820 400W 4x 9el,01/07 +6V7A,IK14LK,EME,,Expedition,,144: 2 times BQH8B cross yagis 14.5 dBd and 500w SSPA,05/06 +6Y4A,FK18AA,EME,,Expedition,,144: 2x 2MXP28 cross pol ant. 1KW,10/00 +7J0AAD,PM97OS,EME,,,,144: 1KW 4x19el 2x18el MGF1801,01/00 +7J6CCU,PL36VI,EME,,,,50: TS570 or IC821,04/02 +7K1MFR,PM95SP,,,,,,01/03 +7K3LGC,PM95RI,EME,,,,,09/06 +7L1RLL,PM95SO,,,,,,01/03 +7M1QMY,PM95VQ,,,,,,02/09 +7M2PDT,QM05EK,EME,,,,432: 16x14el 1-5KW,11/06 +7Q7JE,KH76DW,EME,,= ZS6JDE,,144: 2x 9el 350W,07/06 +7S2AT,KP03DU,,,= SK2AT,,,03/06 +7W0AD,JM16JR,,,,,,11/04 +7X0AD,JM16JR,,,,,144: 9el 200W,11/04 +7X2VV,JM16WJ,,,,,,07/02 +7Z1SJ,LL25WG,EME,,,,144: 2x 13el,02/07 +8J1AXA,QM05DF,EME,,SPECIALCALL,,,05/08 +8N1EME,QM06IQ,EME,,Expedition,,,03/07 +8S4BX,JO79SD,EME,,,,,10/99 +8S6T,JO68SE,,,ALSO SM6WET & SG6T,,FT650 847 920,11/08 +9A1AAX,JN65TF,,,,,144: 16el 500W,04/01 +9A1CAL,JN86EL,,,,,144: IC271 FT736 FT225RD 4CX1500A 2x17el BF981,11/04 +9A1CBE,JN86BE,,,,,,01/96 +9A1CCB,JN85LN,,,ex YU2CCB- YT2C,,,03/01 +9A1CCY,JN85OO,EME,,ex YU2CCY,,,08/01 +9A1CDD,JN85LW,,,,,,01/91 +9A1CEU,JN75RO,EME,,,,144: 80W 2x18el 5.5wl 4x11el - 432: 10W 38el,01/99 +9A1CHI,JN95JG,,,ex YU2CHI,,,01/94 +9A1CHL,JN83,,,,,,03/98 +9A1CMS,JN86DM,,,,,,05/07 +9A1DFG,JN85EL,,,,,,07/96 +9A1EZA,JN86HG,EME,,ex YU2EZA,,IC271E 144: 2x4CX250b MGF1302 10mM2,11/01 +9A1KDE,JN95FQ,,,,,,01/94 +9A1RGC,JN75XT,,,,,,01/03 +9A1Z,JN86FJ,,,ex YU2SOM YT2SOM 9A3HZ,,IC706 DB6NT 1W ON 3CM,01/05 +9A2AE,JN86HF,,,,,144: 8x24el 1KW,12/08 +9A2AT,JN86LL,,,,,,01/03 +9A2DI,JN95,,,,,,06/95 +9A2EU,JN85JO,,,,,,07/96 +9A2GH,JN75IE,,,,,,01/03 +9A2KK,JN85KV,,,,,,11/01 +9A2KL,JN74OC,,,,,,08/07 +9A2MF,JN65SL,,,YU2SBF YU2MF,,YAESU FT-480 r,05/07 +9A2MK,JN75XU,EME,,,,,01/94 +9A2PT,JN86,EME,,,,,11/01 +9A2RD,JN65TF,,,,,144: 2x16el 1KW,05/04 +9A2SB,JN95GM,,,ex YU2SB,,,06/99 +9A2TE,JN85KK,,,,,144: ft225rd ts690s 100w,03/06 +9A2TK,JN76WA,EME,,YU2SSU YU2TK,,TS2000X FT290RII FT7,07/07 +9A2U,JN75RO,EME,,,,144: 80W 2x18el 5.5wl 4x11el,01/99 +9A2VR,JN95FQ,,,,,,06/07 +9A3DF,JN86HG,,,,,,04/03 +9A3GE,JN75EI,EME,,YU2RNF,,TR7 FT817 FT857 IC703 HOME MADE TRANSV. PA 4CX250B 4x 8el,08/07 +9A3JH,JN75AD,EME,,,,,01/06 +9A3JI,JN86FJ,,,= 9A4K,,50: FT-101ZD+FTV650- IC706mk2g 7ele M2,05/02 +9A3LN,JN95IN,,,,,,06/08 +9A3MR,JN83FM,,,,,,08/00 +9A3PA,JN85EG,EME,,,,FT736r - 50: 10W 5el - 144: 8x13el 800W MGF1302 - 4320: 300W 4x19el MGF1302,08/04 +9A3TF,JN85,,,,,,08/96 +9A3TU,JN95EH,,,YT2TU,,TS 830s + transverter home made 6m/2m 10W,06/08 +9A3W,JN74OC,,,ex 9A1RKV,,IC706,09/02 +9A3ZA,JN75RO,,,,,144: 100W 12el,08/00 +9A4C,JN85LN,,,,,,03/01 +9A4CK,JN86,,,,,,08/96 +9A4EW,JN95KG,EME,,,,144: 200W 10 el. BVOpt,06/08 +9A4FW,JN95JG,EME,,,,144: 600W 4x17el F9FT MGF1302,08/00 +9A4K,JN86FJ,,,= 9A3JI,,50: FT-101ZD+FTV650- IC706mk2g 7ele M2,05/02 +9A4NF,JN73VS,,,,,50: 50W 6el 144: 400W MGF1302 4.5wl,06/08 +9A4VM,JN85FS,,,,,,05/07 +9A4WY,JN74,,,,,144: 50W,08/98 +9A5CW,JN65UF,,,EX 9A5AEI,,,09/07 +9A5D,JN92BP,,,Expedition,,,08/99 +9A5WA,JN85LN,,,,,,06/96 +9A5Y,JN85OO,,,SpecialCall,,144: 800W 16x5el,10/99 +9A6PSM,JN75EJ,,,,,FT817 FT225 IC-7000 IC-202,10/07 +9A6WW,JN86EL,,,,,144: IC271 FT736 FT225RD 4CX1500A 2x17el BF981,09/06 +9A7W,JN85PO,,,ex YU2QS,,,06/06 +9A90CBD,JN85OO,EME,,SpecialCall,,,07/97 +9A9B,JN75XU,EME,,,,144: 4x 16el 1KW,09/06 +9A9PP,JN85IW,,,9A7PSN,,Yaesu FT-857D,05/09 +9H1BN,JM75GU,EME,,,,,09/99 +9H1BT,JM75EU,EME,,,,,01/94 +9H1CD,JM75FV,EME,,NOT qrv MS nw (01/01),,144: TS850 LT2S 1KW 2x4.4lb DJ9BV MGF1302,01/01 +9H1CG,JM75,,,,,144: FT902DM FTV250 100W 17el,11/01 +9H1ES,JM75FV,EME,,,,,09/99 +9H1GB,JM75FU,EME,,,,144: TS780 100W 19el,08/03 +9H1LO,JM75EW,EME,,9H5LO,,IC746 - IC706 - FT817 - TH-F7E,12/08 +9H1PA,JM75FV,EME,,9H5O,,144 Mhz: TS711 4x10el (3wl) crossed yagi GS35b - 50 Mhz - 8el yagi 2wl,09/07 +9H1PI,JM75FU,,,ex 9H5PI,,50: 100W 5el,03/03 +9H1TX,JM75FU,EME,,,,50: 8el yagi 100W - 144: IC7400 GS35 1000 W 2x 15el Xpol LNA145MKII,08/06 +9H1XT,JM75GV,,,,,,08/02 +9H3LF,JM76,,,Expedition,,,01/91 +9H3ZZ,JM76CB,EME,,Expedition,,,01/93 +9J2JD,KH46MM,EME,,Expedition,,144: 2M7 antenna,05/06 +9K2YM,LL48CJ,EME,,,,144: 2M5WL 450 W,06/07 +9K48NLD,LL48CJ,EME,,SPECIALCALL,,144: 4x 13el 300W,02/09 +9M2BV,OJ30UD,EME,,,,,01/94 +9M6YBG,OJ85BW,EME,,,,2x 10el 50w,10/08 +9N7JO,NL27QR,EME,,YU7EF,,,04/07 +9W2QC,OJ03TB,EME,,,,144: 2x 10el Vert 70 W,10/08 +9X4V,PM95RI,EME,,SpecialCall,,,09/06 +A22BW,KG38SU,EME,,,,,01/94 +A35RS,AG28HV,EME,,= ZL1RS,,,12/08 +A43DLH,LL93,EME,,EXPEDITION,,,09/08 +A43EME,LL93,EME,,EXPEDITION,,,11/08 +A61Q,LL75SJ,EME,,,,144: 4x 13el 700W,10/06 +A71AW,LL55RH,EME,,,,144: 2XP20 1KW,07/06 +AA0BR,DN70KN,,,,,,01/03 +AA0BW,EM29PS,,,,,,04/03 +AA0DQ,EN12,,,,,,01/03 +AA0EN,EM29,,,,,,01/03 +AA0P,DM79,,,,,,01/03 +AA1OV,FN43GE,,,,,,04/03 +AA1VL,FN42HN,,,,,,04/03 +AA1YN,FN43GC,EME,,,,144: 4x 16el 100W,10/06 +AA2GF,FN02,,,,,,01/03 +AA2WV,FN12BV,EME,,,,144: 4x 17el 400W,10/06 +AA3NM,FM19JE,,,,,,01/03 +AA4FQ,EM67LQ,EME,,,,1500W,01/05 +AA4SC,EM94MX,EME,,,,,05/08 +AA5C,EM13SE,,,,,FT-990 FT-736R Homebrew Microwave Gear,10/07 +AA5CH,EM35GK,,,,,,01/03 +AA5IB,EM12,,,,,,01/03 +AA5WL,EM32,,,,,,01/03 +AA5WQ,EM26BC,,,,,,01/03 +AA6GS,DM12,,,,,,01/03 +AA6HA,DM43CN,,,,,144: 500W 9el M2,01/01 +AA6IW,CM97VI,,,,,,01/03 +AA6WI,CM97,,,,,,01/03 +AA7A,DM43AO,EME,,,,144: 8877 1.5KW 6x13el (DJ9BV),09/06 +AA8BC,EN90FE,,,,,,01/03 +AA8HS,EN81,,,,,,01/03 +AA9D,EN52,,,,,,01/01 +AA9IL,EN62AI,,,,,,01/03 +AA9MY,EN50FM,EME,,,,144: Yaesu 847 IC910H IC706MKIIG 2x 18XXX M2,11/05 +AB0SD,EN30LL,,,,,,01/03 +AB0TJ,DN60FN,,,,,,01/03 +AB3BK,FN10PD,EME,,,,144: 17el 400W,09/06 +AB4CR,EM77,,,,,,01/03 +AB4OO,EM81,,,,,,01/98 +AB5F,EM46FG,,,KG7CV,,KENWOOD TS-2000--VIKING VALIANT--HQ-170,05/07 +AB5IG,EM12,,,,,,01/03 +AB9FN,EN53,,,,,,01/03 +AC1H,FN33XJ,,,,,144: 300W 13dbD yagi,01/01 +AC1T,FN32,,,,,,01/03 +AC3A,EM28QV,EME,,,,FT847 144: 4x 9el M2 8877 1-5KW,08/05 +AC4TO,EM70,,,,,,02/05 +AC5OG,EM10,EME,,,,,03/05 +AC5TM,EM40LL,EME,,,,144: 2M5 400W,03/05 +AD4EB,EM65NS,,,,,,01/03 +AD4TJ,FM08LE,EME,,,,IC706MKIIG 144: 4x 15el K1FO 700w JT--KW+ CW,10/08 +AD6A,CM97AG,,,,,,01/03 +AD6FP,CM87WI,EME,,,,,01/04 +AD6P,EM18,,,,,,01/03 +AE0G,EN10PS,,,,,,01/03 +AE0W,DM78,,,,,,01/03 +AE4RO,EL97TG,,,,,,09/01 +AE5K,EM36PC,,,,,,01/03 +AE6EQ,CM95OH,EME,,,,432: 16x 14el 700W,09/05 +AF1T,FN43ED,EME,,,,,01705 +AF4IF,EL95US,,,KD4GKO,,Yaesu,08/07 +AF4O,EM55LK,,,,,,01/03 +AF6O,DM14EJ,EME,,ex G3PRM,,144: 4x 2M12 800W - 432: 4x 9wl 1500W,01/06 +AF9R,EN52XB,,,,,,01/03 +AG2A,FN30FR,,,,,,01/03 +AG4QE,FM04KX,,,,,,01/03 +AG4ZE,EM83WM,EME,,,,,07/06 +AG9Y,EN40,,,,,144: 160W 13el,01/01 +AH6EZ,EN51SW,,,,,,12/01 +AH6LE,CN85NK,,,,,,01/03 +AH8A,AH45OP,,,,,,01/03 +AI1K,FN41IL,,,,,,01/03 +AI3W,FM19PW,,,,,,01/04 +AI8Z,DM79,,,,,,01/03 +AJ0E,EM29RD,,,,,,01/03 +AJ6T,CM87XK,,,,,144: 200w 10el 50:100w 6el,05/07 +AM25DXU,JN11CM,EME,,SpecialCall,,,01/92 +AN3JT,JN01UI,EME,,SPECIALCALL,,IC910 + SP2 + 4x13B2 + GS35B,08/07 +AN6SA,JM19IR,EME,,SpecialCall,,144: FT847 2x4CX250 2x17el - 432: 4x33el,01/01 +AO4WT,IN80KN,,,,,,08/08 +AO5TT,IM99SL,,,= EA5TT,,,08/08 +AO6SA,JM19IR,EME,,SPECIALCALL,,,09/07 +AO6VQ,JM19HN,EME,,SPECIALCALL,,144: 2KW MGF1302 8x17el M2 432: 21el 115w 1296: 55el 10w,12/07 +BA4TB,PM01EO,EME,,EXPEDITION,,IC746 + HL250PA (running 250W) 2x 10ele Yagi,03/08 +BD1AX,PL04VQ,EME,,,,144: 2wl Yagi 350W,04/08 +BV6GU,PL03CD,EME,,,,144: 250W 20ele cross yagi,05/06 +BX1AD,PL04VQ,EME,,,,144: 11 Xpol 100W,03/08 +BY1QH,ON80DA,,,,,,01/03 +BY4RRR,OM92JA,EME,,,,144: 2x13 ele 100W 432: 2x 17 ele 70W,02/08 +BY4RSA,OM91,EME,,= DL3OCH,,,05/07 +BY7PP,OL63NA,EME,,EXPEDITION,,50: 2x 6el 100W 144: 2x9el 300W Preamp SP-2000 432: 2x20el 70W,02/08 +BY9AA,OM44LL,EME,,,,144: IC920 2 x 15 XP 350W,03/08 +C31MS,JN02UN,,,Expedition,,144: 2Stn a� 800W 2x17el or 11el,05/97 +C31RC,JN02SK,EME,,Expedition,,,01/89 +C31TLT,JN02TL,EME,,Expedition,,144: 4x24el 2x4CX250 900W,08/01 +C56EME,IK13ql,EME,, +C6AIE,FL16IQ,EME,,= WZ8D,,144: TS2000 250W 13el,03/06 +C91CF,KG64HB,EME,,EXPEDITION,,,04/08 +CN8KD,IM63KX,,,,,144: 10W 11el,06/03 +CN8LI,IM63NX,EME,,,,50: IC746 250W 6el - 144: 2x17elts- 250w- lna- 1/2' lowloss cable- Az+Elevat,10/07 +CN8ST,IM64NA,EME,,QRT (is nw PA....),,,06/98 +CN8TW,IM63EN,EME,,,,144: 4x 13el,01/06 +CO2OJ,EL83TD,,,,,50: 100W 4el - 144: 110W 9el,06/06 +CQ14HZE,IM57NH,,,SpecialCall,,,02/04 +CS0DIZ,IM69,,,SpecialCall,,,01/89 +CS1GDX,IM59IB,,,SpecialCall,,144: IC706MK II G 200W 12el,11/03 +CS6ARC,IM59RX,,,SpecialCall,,,11/01 +CT1ANO,IN51RE,,,,,144: TS2000 4cx250B 1x16JXX2 SP 2000,06/09 +CT1BYM,IM58SM,EME,,,,,05/07 +CT1DHM,IN61CB,EME,,,,,04/07 +CT1DIZ,IM58KP,,,,,,06/03 +CT1DMK,IN50QP,EME,,,,144: 1-5KW 4x11el DL6WU,03/99 +CT1DNF,IN50QP,,,,,144: IC821H 200Watts 2x12ele DL6WU Preamp,12/04 +CT1EKD,IM59IB,EME,,,,144: IC706 MK II G 400W 4 x 17 el 432: 300W + 10wl Yagi,08/08 +CT1EWA,IM59NS,EME,,,,,06/09 +CT1FAK,IN50QO,EME,,,,144: FT1000D FT736R 200W 4x13el DL6WU MGF1302,05/03 +CT1FFU,IM59KJ,EME,,,,,03/05 +CT1FJC,IM57OC,,,= G4MAW,,TS-2000 5el yagi 6 metres. 4el yagi on 4metres,03/07 +CT1FOH,IN50RA,,,,,50: 6el - 144: 200W 4x 12el MGF1302,04/04 +CT1HZE,IM57NH,,,= DL8HCZ,,,12/05 +CT1WW,IN61GE,,,SilentKey,,,11/96 +CT2FEY,IN61OT,,,,,,07/07 +CT2GUR,IM59ML,EME,,,,IC-910H+ 2x17el+LNA+1KW,06/09 +CT2HSN,IN61CB,,,,,,03/07 +CT2HSO,IN61CB,,,,,,06/07 +CT2IET,IN60GD,,,,,FT100D,11/02 +CT2IWG,IN51OJ,,,,,144: IC706 100W 9el,02/05 +CT2JIB,IM58MO,EME,,,,IC-910H + IC-706MKIIG + IC-746,05/08 +CT4KQ,IN60BP,,,,,,03/98 +CU2E,HM77UD,EME,,,,144: 1KW 28 Xpol,06/07 +CU2IJ,HM77ES,,,,,,04/04 +CU3EQ,HM68KP,,,,,KENWOOD TS 2000 - TS 570,04/08 +CX5BBF,GF15WM,EME,,,,432: 3m dish with 4 dipole,08/07 +CX5CJ,GJ15,EME,,,,144: 4x 17el 1KW,02/02 +CX5IC,GF07WQ,EME,,,,,03/08 +CX5UR,GF26TS,,,CX2AAE - CX3UU - CX1JO,,KENWOOD TS430 - IC 241 - FT 2500,02/08 +CX9BT,GF15WK,,,,,,01/03 +CY9SS,FN97WE,EME,,Expedition,,144: 400W single yagi,01/05 +DA0BV,JN58VF,,,SpecialCall,,,01/94 +DA0DD,JO61,EME,,SpecialCall,,,05/06 +DA0HEL,JO34WE,,,EXPEDITION,,,08/08 +DA0NRW,JO41GV,,,SpecialCall,,144: 3CX400A7 4x14el or 17el,12/96 +DA0WAE,JO41GU,,,SpecialCall,,,12/04 +DA0Y,JN48MB,EME,,,,,04/09 +DA0YFD,JN59MO,EME,,,,,05/07 +DA4RG,JO31FG,,,= GW8VHI,,,11/95 +DB1PB,JO30UE,,,,,,12/01 +DB2WD,JN39VV,EME,,,,,04/96 +DB3BW,JO42AC,EME,,,,HF: TS520 - 144/432: FT726r Tube PA 2m 350W 70cm 150W 6m trv8W,06/09 +DB3LA,JO31JK,,,,,,07/02 +DB4ET,JO31,,,,,,11/02 +DB4LL,JO54SM,,,,,144: FT221 20W 4el,08/01 +DB4VQ,JN39MF,,,,,,01/94 +DB5ML,JN58OI,,,,,,09/03 +DB5WC,JN49EJ,,,,,60W 11el Preamp,12/03 +DB6BX,JO32OK,,,SilentKey,,,11/96 +DB6NT,JO50UI,,,,,,01/03 +DB6RO,JN58QB,,,,,,12/03 +DB7OB,JO52IJ,,,,,144: FT221 100W 11el,08/00 +DB8AT,JO51CP,,,,,,05/04 +DB8WK,JO33XN,,,,,144: 200W 2x11El. - 432: 300W 2x23El.,03/06 +DB8YL,JO41EV,,,,,,12/99 +DC0KK,JO41KQ,,,,,,03/08 +DC1ECD,JO31MH,,,,,,10/04 +DC1MUS,JN69EP,,,,,,11/02 +DC1MWB,JN58,,,,,,04/05 +DC2IP,JN49FD,,,,,144: IC706 max. 50W 6el,08/08 +DC2JR,JO64CA,,,,,,11/01 +DC2MW,JN58IV,EME,,,,144: 4x 9el 300W,09/07 +DC3VM,JN39KK,,,,,,12/99 +DC3VW,JN39KJ,,,,,,10/04 +DC3ZR,JN68CV,,,,,,01/03 +DC5JQ,JO31BC,,,,,,10/07 +DC6DY,JO53GO,,,,,,06/09 +DC6GF,JN48OC,,,,,IC 706 MKIIG PreAmp,01/05 +DC6KI,JO30IL,,,NOT qrv MS nw (01/01),,,04/05 +DC6RN,JN59WK,,,,,144: 12el PA GS35,04/09 +DC7OH,JO62OK,,,,,,01/01 +DC7UT,JO31NJ,EME,,,,144: 4x17el 500W,03/01 +DC9UP,JN39QN,EME,,F5VKQ,,,01/09 +DC9YC,JO31QK,,,,,,10/07 +DD0NM,JN59NI,,,,,144: IC 910 100W 2x11 el Yagi,08/07 +DD0VF,JO60UX,EME,,,,144: 550W-CW 250W-digi 4x8el MGF1303 (JO61WA: 100W 5el BF998),06/09 +DD1JN,JO50DJ,,,,,144: 600W 11el Preamp - 432: 21el 200W VV - 1296: 55el 10W VV - 2320: 80el 1W,04/02 +DD1WKS,JN39KK,,,,,,01/01 +DD2KR,JO30FQ,EME,,,,FT1000 144: LT2S 3CX800A7 Preamp 17ele M2 432: LT70S 3CX800A7 Preamp 2x39el M2,10/07 +DD2UJ,JO61WD,,,,,,10/04 +DD3DX,JO31TN,,,,,,07/01 +DD3SP,JO72EN,,,,,50: 5el - 144: FT847 4CX250 17el F9FT MGF1302 - 432: 21el,02/04 +DD5DX,JO61CA,,,,,144: 180Watt 2x17el Preamp,07/04 +DD6UBS,JO41AH,,,,,144: TM255 MGF1302 180W 11El F9FT - 432: TM455 MGF1302 40W,10/04 +DD7PC,JN49AX,EME,,,,,05/07 +DD9SQ,JN59BH,,,,,,07/98 +DF0AK,JN49EA,,,,,,07/97 +DF0AW,JO31MG,EME,,,,FT736 144: 800W 2x 11el 432: 200W 4x 23el 1296: 23el 10W,09/07 +DF0BV,JN68AH,EME,,,,144: 2x17el 750W,04/05 +DF0CI,JO51CH,,,,,,11/03 +DF0CK,JO50AN,EME,,= DK0R,,144: 500Watt 2x11el,09/05 +DF0EME,JO40,,,,,,01/03 +DF0LBO,JO53CT,,,,,,05/02 +DF0MMO,JN49JX,,,,,144: 200W 11el,11/00 +DF0MTL,JO61JF,,,,,,07/05 +DF0SAX,JO61VC,,,,,144: 20W 13el,12/98 +DF0SL,JN59OI,,,,,,08/08 +DF0WD,JO42FD,,,,,144: 8874 250W 2x9el - 432: 3CX800 4x18el,02/08 +DF0WF,JO62VT,,,,,,01/05 +DF1AN,JO63SX,,,ex DL1KUS,,,01/00 +DF1BN,JO31GD,,,,,144: IC821 HLV-300 300Watts MGF 1302 2x17ele F9FT,07/01 +DF1CF,JN57FP,EME,,,,144: CF300 3CX800 4x13el (3lb),12/04 +DF1GL,JN47CO,,,,,144: IC 746 300W 8el,04/07 +DF1HF,JO43WJ,EME,,,,144: 6el 432: 19el 1296: 44el,09/07 +DF1IAZ,JN49LD,,,,,50: 3 el - 144: 150W 2x10el MGF1302,07/01 +DF1OC,JO52,,,,,,01/93 +DF1SO,JN48PO,,,,,144: homemade 200W,08/98 +DF1VB,JO31SK,EME,,,,,03/07 +DF1ZE,JN49,EME,,,,,01/94 +DF2CQ,JN58SE,,,,,,10/04 +DF2NU,JN58XA,,,DL0UMK,,TS-790S + PA + Preamp + 11 ele yagi,10/07 +DF2OOO,JO41RF,,,SpecialCall,,IC820H 144: 250W 2x11el- 432: 130W 2x23el Preamp,09/99 +DF2UJ,JO61QH,,,,,,02/02 +DF2ZC,JO30RN,EME,,,,144: TS2000 LT2S 2xGU74b 750W MGF1302 4x2M18XXX (21 dbd),04/07 +DF3FJ,JO40CC,,,,,,01/93 +DF3RU,JN59UL,EME,,,,,03/05 +DF4IP,JN49HE,,,,,,08/08 +DF4MAA,JN58WH,EME,,,,,05/97 +DF4UE,JN48RR,,,,,432: 4x27el 600W,09/03 +DF4WC,JN49KV,,,DB4PN,,TR9000-IC490,09/08 +DF5BN,JN49GU,,,,,,08/99 +DF5DE,JO40CX,,,,,,12/06 +DF5HC,JN49HT,EME,,,,50: 4 Ele - 144: 4x8Ele 500W - 432: 4x17Ele 500W,05/09 +DF5JJ,JO43XO,,,ex EA6/DF5JJ + ex EA6ADW,,432: 700W 19el - 1296: 500W 26el - 10368: 20W dish,03/04 +DF5KB,JO72CM,,,ex DD6BKR,,FT847 - 144Mhz 750 wtts 14 el Longyagi - 50Mhz 7el by DK7ZB,08/06 +DF5NK,JN59PM,,,DB6NJ,,144: 11el 600W alt. 15el 750W(JN59OP) 432: 19el 500W,06/09 +DF5NK/P,JN59OP,,,DB6NJ,,144: 11el 600W alt. 15el 750W(JN59OP) 432: 19el 500W,06/09 +DF6HT,JO64FG,,,,,,12/06 +DF6LO,JO52CE,,,,,,01/93 +DF6MU,JN58WF,,,DL1ABD,,Elecraft k2 + XV144 + THP PA 160W,09/07 +DF6NA,JN49XS,,,,,432: 2x3CX800 4x30el,10/01 +DF6OB,JO42,,,NOT qrv MS nw (01/01),,,07/97 +DF6VW,JO42KH,,,,,,07/97 +DF6YL,JO31WS,EME,,,,,02/08 +DF7AP,JO51FI,,,,,,04/09 +DF7DJ,JO31UO,,,,,,06/97 +DF7IF,JN48DN,,,,,,01/03 +DF7IT,JN49IN,,,,,,10/04 +DF7KF,JO30GU,EME,,,,144: 16x18el EME Pwr,12/04 +DF7OG,JO52BN,,,,,144: TS770E 4x150 16el,04/04 +DF7RG,JN68HG,EME,,,,,01/05 +DF8AA,JO60XX,,,ex DL2VAA,,144: 100W 17el,12/99 +DF8AE,JO41GX,,,,,,10/04 +DF8IK,JO30JT,,,,,144: 300W 11el 432: 400W 27el,01/05 +DF8LC,JO53GX,EME,,,,,08/99 +DF8PC,JO43RS,EME,,,,144: 100W 16el M2,03/06 +DF9CY,JO54AL,EME,,,,IC820H + 400w + 1x9ele 2.5wl full elevation + MGF1302,10/08 +DF9IJ,JN48CX,,,,,,01/03 +DF9KT,JO30GU,,,,,,11/95 +DF9KX,JO30FQ,EME,,,,FT1000 144: LT2S 3CX800A7 Preamp 17ele M2 432: LT70S 3CX800A7 Preamp 2x39el M2,10/07 +DF9QT,JO30OR,,,,,144: 700W 11Ele,07/08 +DF9QX,JO42HD,EME,,,,,01/94 +DF9RJ,JN68GS,EME,,,,144Mhz: 1.8KW 4x17Ele. - 432Mhz: 1KW 4x21Ele. - 10Ghz: 5W 60cm Spiegel,03/06 +DF9YF,JO42GE,,,,,,12/03 +DG0CAL,JO31,,,,,,06/00 +DG0FE,JO62UN,EME,,,,FT736r 50: 25 watt 1x4el - 144: 500W 4x17el - 432: 25 watt 2x21el - 1296: 10 watt 2x35el,04/08 +DG0KU,JO64AC,,,,,,01/03 +DG0KW,JO64MH,EME,,,,144: 2x 13el,01/05 +DG0OPK,JO50GQ,EME,,,,50MHZ Dipol - 144: 400W 17dBd MGF1302,12/08 +DG0TU,JO61TU,,,,,,08/97 +DG0WJ,JO60CV,,,,,,11/02 +DG1BA,JO43LB,,,,,,01/00 +DG1BHA,JO73DB,,,,,,09/07 +DG1CMZ,JO60DS,,,,,,08/01 +DG1IU,JN49FA,,,,,,08/96 +DG1LY,JO44RK,,,,,,03/04 +DG1TA,JN69GH,,,,,,02/01 +DG1VL,JO61WE,EME,,Y91VL,,144: 150W 9el MGF1302,05/09 +DG1YBO,JO32RG,,,,,144: FT225RD 80W 9el,09/04 +DG2BCP,JO43DC,EME,,,,144: 4x 3.6l DJ9BV+GS35 Pa 432: 4x 11l DJ9BV,03/06 +DG2DAA,JO62GU,,,,,,06/02 +DG2GEP,JN48DL,,,,,144: 200W 9ele Yagi,04/03 +DG2KBC,JN58MI,EME,,,,2x7ele FT847 GS35b LNA,06/09 +DG2NBN,JN59NR,,,,,FT847 144: 200W 2x3wl 9BV MGF1302 - 432: 300W 22el MGF1302,08/01 +DG2NZM,JN59IV,,,,,,06/03 +DG2SRL,JO61HN,EME,,,,144: Transv. LT2S 18el M2 500W,04/06 +DG2TOM,JO62BM,,,,,IC706 50: 4el Yagi - 144: 15el M2 100W,08/05 +DG2VC,JO61VC,,,,,,01/04 +DG3FK,JO41PG,,,,,TS850+TV TS790 144: 17el 150W - 432: 4x17el 200W - 1296: 55el 100W,09/03 +DG3JO,JO31JK,,,,,TR-2000- TM-D700- DSPCOM,04/03 +DG3MDE,JN58EI,,,,,ICOM IC-7400 Inv.V 2x13 5m,09/07 +DG3XA,JO43WJ,,,,,144: 1500 Watt 7 ele M2,02/09 +DG4BH,JO30RX,,,,,,01/03 +DG4EK,JO31NI,,,,,,01/03 +DG4EKE,JO31NI,,,,,144: IC820h- SP2000- 17/11el- QQE06-40,01/97 +DG4NBI,JN59IF,EME,,,,,10/07 +DG5AAG,JO51,,,,,,07/01 +DG5CST,JO60DS,EME,,,,144: FT847 4x12el I0JXX GU74,08/07 +DG5HV,JO43XQ,,,,,,01/99 +DG5NEX,JN49WS,,,,,,01/93 +DG5OAF,JO51EP,,,,,144: FT736 400W 2x17el B2 MGF1302,11/99 +DG5SMY,JN49QA,EME,,,,144: 4x 17ele 432: 4x 23ele,08/04 +DG6JF,JO31,,,,,,10/01 +DG6LS,JO54AK,,,,,144:TS790 8877 4x17el - 432: 8x33el DJ9BV 3CX800A7,12/96 +DG6MBS,JO41AH,,,,,144: TM255 MGF1302 180W 11El-F9FT - 432: TM-455 MGF1302 40W,08/02 +DG6MGP,JN58WH,,,,,,01/95 +DG6SYL,JO53QP,,,,,144: 150W 11el 6WU Preamp - 432: 150W 23el Preamp - 1296: 10W 48el Preamp,03/02 +DG7MHR,JN57DR,,,,,,03/03 +DG7NT,JN47QQ,,,,,144: 2x10 el,02/08 +DG7OV,JO42VX,,,,,,10/04 +DG7RBV,JN59UM,,,,,,01/90 +DG7SF,JN48RR,,,,,144: FT736 300W 2x7el,06/01 +DG7SFL,JN49XF,,,,,144: 300 W + 10El. - 432: 150W + 2*21El.,01/04 +DG7TG,JO43SV,,,,,,06/05 +DG8DP,JN68BI,,,,,Yaesu FT-950 - Elecraft XV144 - VHF PA 4CX250B - 9 Ele. M2,04/09 +DG8NCO,JO50VH,EME,,,,144: 4 x 9 El + BEKO HLV-1500 ICOM IC7400 / 8 x 10 El + BEKO HLV 3000,05/09 +DG8NCY,JO50HA,,,,,,07/02 +DG8UAW,JN48BR,,,,,FT-847: 144MHz: 50W 7el Preamp - 432MHz: 300W 16el Preamp,09/01 +DG8WH,JO43GH,,,DO6BH,,IC271E + FT897D,07/08 +DG8YFM,JO32MF,,,,,,03/06 +DG8YHH,JO32QI,EME,,,,,10/06 +DG9BEM,JO43CD,,,,,144: 350W 17el VV - 432: 300W 4x20el VV - 1296: 150W 1.2m dish VV,01/03 +DG9DAZ,JO31XB,,,,,144: TM255,11/01 +DG9GLA,JO40,,,,,,12/01 +DG9MAQ,JN58LJ,EME,,,,144: HA8UG-PA Gi46b 9 El. Tonna SP-2000,12/07 +DG9NCX,JN59BT,,,,,,11/99 +DG9NFM,JO50QG,,,,,,01/94 +DG9YIH,JO32QI,,,,,144: 500W 17el,12/04 +DH0AAI,JO51AR,,,,,144: FT225rd PA 200W SP2000 4xDL7KM,08/02 +DH0GHU,JN38VN,,,ex DG2GHU,,144: TS850 LT2S HLV300 300W 11el,09/01 +DH0LS,JO61II,,,,,144: 4CX350 500W 2x17el Preamp - 432: 150W 21el - 10W Dish,12/03 +DH0MBH,JN58JD,,,,,,01/02 +DH0OAH,JO42OB,,,,,,01/03 +DH0X,JN49DE,EME,,,,,08/05 +DH0YAZ,JO41GG,,,,,,01/03 +DH1FM,JO61UD,,,,,144: 90W 10el - 1296: 1W 30el,08/02 +DH1HC,JO53FF,,,,,144: 13el 500W,10/05 +DH1KBB,JO20XX,,,,,,01/93 +DH1NAD,JN49,,,,,,01/93 +DH1NSP,JN59JX,,,,,,01/01 +DH1TW,JN48QM,EME,,,,144: 600W 10el,04/01 +DH2FAF,JO40,,,,,,01/93 +DH2OAA,JO42TU,,,,,144: IC275E 4x11el 6WU 500W,03/04 +DH2RS,JN47TT,,,ex DG3GSR,,144: 75W 11el MGF1302,01/98 +DH2UAK,JO71FU,EME,,DG6IBO,,IC910+Preamp - 144: 4x 14el 500W - 432: 2x 29el 50W- 1296: 67el 10Ghz: 1.25m/10W,05/09 +DH3DP,JO31,,,,,,07/96 +DH3NAN,JO50NC,EME,,,,,12/97 +DH3YAK,JO31RS,EME,,DD4QI,,144: 4x 12el M2 750W,02/09 +DH4FAJ,JN49EX,EME,,,,IC910 IC7400 144: 4x 9el 1KW - 432: 4X15 50 watt,12/08 +DH5BS,JO63PX,EME,,EX DB3VE DH3VE,,FT857d IC970h Pa's Yagi's 50-432mc,07/07 +DH5FS,JO61UA,,,,,144: 9el 120W - 432: 4x21el,11/00 +DH5HS,JO31FF,,,,,FT847,11/02 +DH5HV,JO31AS,,,EX DB5VH,,144: IC746 Pro (100W only) with 2M12 Msquare @ 14m,07/08 +DH5LAN,JO44TN,,,,,,05/97 +DH5MK,JO41IV,,,DC3QB,,144: 100W 5ele. DK7ZB MGF1302,05/09 +DH6ICE,JO61XU,,,,,,07/04 +DH6JL,JO31NI,,,EX DG1JL,,50: IC-746 6M5X wid 360 view till Horizont,10/07 +DH7FB,JO62SM,,,ex DD6UFR,,144: FT847 GS35b 2x9el DK7ZB,08/05 +DH8BQA,JO73CE,EME,,,,,05/07 +DH8GV,JO33RL,,,EX DD0BI,,FT-100 300W,02/08 +DH8IAB,JO30NO,EME,,DC5IV,,144: 17el 750W,09/07 +DH8IAT,JN49GC,,,,,,12/07 +DH8WE,JO50TJ,EME,,DG0OLT,,,04/08 +DH8YHR,JO41GV,,,,,,01/03 +DH9FAG,JN49LX,,,,,,01/03 +DH9GCD,JN38VF,,,ex DG9GCD,,144: 11el 100W MGF1302,05/02 +DH9KAE,JO30BW,,,,,,01/93 +DH9NBB,JN49WS,,,ex DG9NBT,,,01/99 +DH9NFM,JO50RF,EME,,,,144: 2X17 M2 - 432: 2X38 M2 - 1296: 4x21 - 2320: 67ele - 10368: 60cm dish,06/05 +DH9OK,JO51AS,,,,,,06/04 +DH9OY,JO51AQ,,,ex DG5OAA,,,05/00 +DJ0QZ,JN49LM,EME,,,,144: IC746 8877 2x18el M2 MGF1302,11/01 +DJ0RU,JO31KM,,,,,,07/02 +DJ1JD,JO52CK,EME,,,,,08/00 +DJ1LP,JO64,,,,,,01/93 +DJ1OJ,JN58SE,,,,,144: 100W 2x11el SP2000,10/00 +DJ1SHF,JO73AM,,,,,144: TS711 120W 2x10el- Preamp,11/96 +DJ1TU,JN48TR,EME,,EX DL2SAD,,FT-897D,10/07 +DJ2GM,JN58SC,,,,,,04/06 +DJ2IA,JO71AO,,,ex DM2BHF,,144: FT736R 100Watt 9-ele-Yagi,08/02 +DJ2IE,JN48HV,,,,,,07/02 +DJ2JA,JO40IM,EME,,,,,04/04 +DJ2JS,JO31SL,,,,,,04/04 +DJ2KQ,JO30BW,,,DC8KQ DH9KAE,,FT736R 2x14elm 144Mhz - 5elm 50Mhz,12/07 +DJ2QV,JN58UA,,,= M0RUN,,,06/09 +DJ2QV/P,JN57XX,,,,,,06/09 +DJ2XS,JO53AK,,,,,,01/95 +DJ3FI,JO31DI,EME,,,,,08/00 +DJ3HW,JO42LH,,,,,144: R2CW 750W 12elM2 MGF1302 432: 750W 28el.M2 1296: 220W 48el.,09/08 +DJ3JJ,JN48JS,EME,,,,TS2000x,01/09 +DJ3LE,JO44TN,,,= OZ7LE,,50: 25WERP 5el - 144: 2x17el 600W - 432: 2x21 100W,02/04 +DJ3MY,JN58QD,EME,,,,144: 600W 4x17el,08/99 +DJ3RU,JN58,,,,,,01/95 +DJ3ST,JN48,,,,,,01/03 +DJ3TF,JN59WK,,,,,,06/00 +DJ3VI,JO43VI,EME,,,,144: FT736r 2x11el 750W,02/06 +DJ4SO,JO44WG,,,,,,11/99 +DJ4TC,JO63PN,EME,,EX Y21TC DL1NTC,,144: 380W 2x 11el - 432: 460W 2x 26el homemade,05/08 +DJ4UF,JO30BR,,,,,144: 300W 2x 8el MGF1302,09/04 +DJ5BV,JO30KI,,,,,144: 600W 11el MGF1302 - 432: 400W 20el - 1296: 500W 4x20el - 10386: 15W 1m dish,07/02 +DJ5CL,JN58WH,,,ex DG1MHY,,,08/00 +DJ5DT,JN49IV,,,,,,05/02 +DJ5HG,JO53IU,,,,,,06/04 +DJ5MN,JN58WH,EME,,,,,06/96 +DJ5MS,JN68KS,,,SilentKey,,,10/99 +DJ5NV,JN59KN,EME,,ex DL9NDD,,,12/01 +DJ5RE,JN59WK,EME,,,,144: GS35b 250W 2x12el M2,03/04 +DJ5SQ,JN37UW,,,,,144: TS870 LT2S 600W 11el,12/97 +DJ6JJ,JO31LG,,,,,,12/01 +DJ6MB,JO30,EME,,,,,01/94 +DJ6OL,JO52AP,,,,,,05/08 +DJ6SN,JO30BU,,,DC6SN DH6SN,,YAESU FT-736R -PA- 2m 2x17Ele -6m 5Ele --IC7000,07/08 +DJ6TN,JO54CF,,,,,,09/96 +DJ6WD,JO40AT,,,SilentKey,,,03/99 +DJ6XV,JO31LQ,,,,,,04/04 +DJ7AL,JO61VC,EME,,,,144: IC910 VLA 200 4el F9FT,04/06 +DJ7FJ,JN48AG,EME,,,,,01/94 +DJ7IL,JO52LD,,,,,IC7400 IC910H HLV120 homemade,04/07 +DJ7OF,JO51HQ,EME,,ex DG5OAE,,144: 6x17el CC 17B2 MGF1302 EME Pwr,04/05 +DJ7OQ,JO42WJ,,,,,144: TS 850 LT2S PA 2x 4CX250 Preamp 0.5 dB M2 5WL,06/09 +DJ7PW,JN48TR,,,,,IC7400 11ele Yagi,12/07 +DJ7RI,JO54CH,,,,,,12/03 +DJ7RST,JN59UK,EME,,,,144: 4 x 2MXP20 1k2 432: 5 x 20el 1k5,09/07 +DJ8ES,JO43SX,,,,,144: 300W 17el - 432: 300W 24el - 1296: 100W 49el - 2320: 10W 44el - 10368: 1.5W 60cm Parabol,08/03 +DJ8MS,JO63CT,EME,,EX DG5TR,,144: 750W 11el 7ZB Preamp 432: 300W 2x13el 7ZB Preamp,02/08 +DJ8OG,JO40MF,,,,,IC 275H 8el DK7ZB,04/04 +DJ8PB,JO44MC,,,SilentKey,,,01/93 +DJ9CS,JO54DG,,,,,FT-847 200W PA 50: 3 el 144: 9el,09/04 +DJ9EV,JN49SC,EME,,,,FT847/17 el yagi,02/09 +DJ9FG,JO52TD,,,ex DM2CFG Y23FG DL9ZFG,,HF: FT757GXII 10m Longwire - 50: 25W IRF610 Dipol - 144: 300W 9el- 432: 150W 12el,10/06 +DJ9JY,JO31JM,,,ex DG1JY,,,01/01 +DJ9KV,JN68OK,,,,,,06/95 +DJ9MG,JO52TC,EME,,EX DM2BQG Y22QG DL8CME,,144: 2x 17el 500W,01/08 +DJ9YE,JO43HV,,,,,144: 400Watt 17el M2 MGF1302,02/08 +DJ9YW,JO42QA,EME,,,,144: 2x10el 500W - 1296: 3.5 and 4.5m dish 360W,02/01 +DK0AK,JO30NQ,,,,,,05/04 +DK0ALK,JN38TD,,,,,,06/96 +DK0BN,JN39VX,EME,,,,144: 700W 3x 9el F9FT + 2x 11elF9FT,09/03 +DK0EP,JO31TS,,,,,,11/04 +DK0IG,JN58SE,,,,,144: 350W 2x11el,12/96 +DK0NHF,JO62JR,EME,,,,,01/94 +DK0OG,JN68GI,EME,,,,144: 700W 8x17el,12/04 +DK0R,JO50AN,EME,,= DF0CK,,144: 500Watt 2x11el,09/05 +DK0TU,JO62PM,EME,,,,144: 4x 12el QRO,05/06 +DK0TX,JO50HK,,,,,,03/02 +DK0UB,JO31PK,,,,,,08/97 +DK0VV,JO61WB,,,,,144: 550W 4x7el MGF1303,03/04 +DK1CM,JO40LG,EME,,ex DL2FDX,,144: FT990 LT2S 700W YL1050 18el MGF1302 - 432: 41el MGF1302 - 1296: 48el MGF1302,04/01 +DK1CO,JO63SX,EME,,EX DL9GKA,,TS2000 TS790 AMPLITEC PA UG2-100-1500 50: 4el 144: 4x17el H 2x17el V LNA 432: 50 W 2x 20el LNA,03/08 +DK1EJP,JO31DD,,,,,,03/03 +DK1KO,JO53CT,EME,,,,144: 8877 4X17el F9FT full elevation MGF1302,11/08 +DK1MAX,JN58SP,EME,,EX DL4MDQ,,144: 11 el F9FT 750W,10/08 +DK1MZ,JO42XP,EME,,ex LZ1KU DL4ABJ,,144: EME Pwr 13el MGF1302,11/03 +DK1PZ,JO41TH,EME,,,,,01/94 +DK1VI,JN49HH,,,,,144: 650W 16 el.- 432: 100W 21 el.- 1296: 120W 1-2m Spiegel,09/08 +DK2AM,JO43AK,,,,,144: 450W 4x14el MGF1302,12/01 +DK2BJ,JO30BS,,,,,IC746 PRO IC706MKIIG Transverters,05/07 +DK2FT,JO42KC,,,,,,01/03 +DK2PH,JO41GV,EME,,CT1DTQ,,IC 746 50: 6M7JHV - 144: 4x 16JXX,07/07 +DK2UO,JO30,,,,,,01/93 +DK2YCT,JO32RG,,,,,,12/03 +DK2ZF,JO43VH,EME,,,,,10/08 +DK3BU,JO33NO,EME,,,,50: 25 W ERP 5el - 144: 749W 4x12el Preamp - 432: 749W 4x34el Preamp (16x11el) - 1296: 749W 0.9m dish,08/08 +DK3DUA,JO61TC,,,ex DG0DU,,144: FT847 1000Watts ERP,04/00 +DK3EE,JO41GU,EME,,= DK3T ex DL9YEY,,144: 8877 4x 24el M2,09/06 +DK3EP,JO31TS,,,,,,06/05 +DK3FB,JO31UC,EME,,,,432: 750W 4x23el - 1296: 150W 37el - 2300: 5W 65el,03/01 +DK3IK,JN39JF,,,,,,04/97 +DK3MU,JO72GK,,,,,,10/04 +DK3NG,JO43VC,EME,,,,,01/09 +DK3QN,JN58LJ,EME,,,,,06/09 +DK3QZ,JO31LP,,,,,,07/02 +DK3RV,JO31,,,,,,07/96 +DK3SE,JN37VP,EME,,,,144: 50W 2x 12JXX,04/05 +DK3SML,JN49SF,,,DO3ML,,IC-910H 100 W 9-elem. Yagi after DK7ZB,05/09 +DK3T,JO41GV,EME,,,,,08/05 +DK3WG,JO72GI,EME,,EX DM2BYE Y22ME DL3BWW,,144: GS35B 6x 14el (5wl) 432: GS23B 8x 27el & 16x27el 1296: 100 W 1x55el,06/08 +DK3WW,JO62NH,,,EX Y54WL Y21EF Y41ZF DL6USB,,,10/07 +DK3XM,JO43XL,,,,,144: 700w 2x2wl 60m asl,09/04 +DK3XT,JN49FE,,,= AB7IY,,,01/07 +DK4JN,JO31,EME,,,,,01/94 +DK4KW,JO60EM,,,EX DG0JWW,,TS-2000X,05/08 +DK4OG,JN68GI,,,,,,01/03 +DK4TG,JO31LB,EME,,,,144: 2X11el. 750W,12/07 +DK4U,JO42FD,,,,,144: 8874 250W 2x9el - 432: 3CX800 4x18el,02/08 +DK4WN,JN49EP,,,ex DC1PN,,,11/03 +DK4XI,JN39NG,,,,,,01/03 +DK5AI,JO51GO,,,,,,10/07 +DK5DC,JO31SL,,,,,,07/02 +DK5DQ,JO31PG,,,,,144: 300W 2x10el,03/04 +DK5DV,JO30XS,,,,,FT-847 TS850SAT,04/09 +DK5E,JO42DC,EME,,,,,07/06 +DK5EW,JN48MB,EME,,EX DG3GAG,,144: IC-7400 ATF54143 HEMT 16x 7el 750Watt,11/08 +DK5IT,JN49FB,,,,,,01/03 +DK5KK,JO63EX,,,ex DG0KK,,,01/01 +DK5KMA,JO50IK,,,ex DO8KB,,,03/06 +DK5LA,JO44TR,EME,,,,144: 100W 20el,08/05 +DK5MV,JN58WH,,,,,,08/97 +DK5OX,JN59MO,EME,,,,TS-2000X 144: 10el DK7ZB 50: Dipole,08/07 +DK5PD,JN39VV,EME,,,,,03/00 +DK5SO,JN58AV,EME,,,,144: TS700 600Wtts 4x3.5WL,12/08 +DK5TE,JN58BG,,,,,144: IC746 HLV600/8877 2x13el 432: IC475H 2x20el GS35b,05/02 +DK5WL,JN39VW,EME,,,,144: 750W 2x 2MXP20 (10 element XPOL),09/07 +DK5WO,JO30AS,,,,,YAESU FT-767GX LT23S,07/05 +DK5YA,JN49NX,EME,,EX DH8NAA,,50: 4el - 144: GS35b 4x9elM2 PHEMT 0.3db - 432: TH338 19el BV,06/07 +DK6AS,JO52,EME,,,,,02/01 +DK7BY,JO33RJ,EME,,,,750W,03/04 +DK7DN,JO40CW,,,,,,05/09 +DK7DR,JN47DP,,,EX DL8GCL DG7GAL 9H3XV,,IC821,07/06 +DK7LH,JO43BB,,,ex DG8BCC,,144: IC271 400W 2x3.6wl 9BV - 432: IC471H 100W 4x11wl 9BV,12/01 +DK7LZ,JO30,,,,,,12/01 +DK7T,JN48XK,,,ex DL0UL,,144: 11el 400W 3CX800,12/05 +DK8EL,JO31LJ,,,ex DH6JT,,144: 100W 9el MGF1302,12/04 +DK8KX,JO30,,,,,,05/04 +DK8VS,JN39NF,EME,,,,,07/01 +DK8ZJ,JO54AG,EME,,,,144: 600W BEKO 4x 12el M2,09/05 +DK9OY,JO52CK,EME,,,,,10/01 +DK9RL,JN69BB,,,,,,01/97 +DK9ZY,JO40BE,EME,,,,144: TS850 Trvt YL1052 MGF1302 4x10el 2.2wl DJ9BV,11/99 +DL0AO,JN59WI,EME,,,,,02/03 +DL0AVH,JO52,EME,,,,144: 700W 2x2M18XXX,07/01 +DL0BWS,JO64EB,,,,,144: IC-910 100W 2x9el 432: IC910 4x19el 75W 1296:IC910 2x35el 10W,04/07 +DL0DAN,JO33OP,,,SPECIALCALL,,,03/98 +DL0DBR,JO54WC,EME,,,,,06/99 +DL0DET,JO52CK,EME,,,,,01/94 +DL0EF,JO30IM,,,,,,01/03 +DL0FTG,JO53FM,,,,,,04/01 +DL0GER,JN49CC,,,,,,08/00 +DL0HES,JO41RF,,,,,IC820H 144: 250W 2x11el - 432: 130W 2x23el Preamp,07/01 +DL0HOF,JO50XG,EME,,,,144: 2x 10el 750W 432: 4x19el 250W 1296 56El 30W,08/07 +DL0LAU,JO61JF,,,,,,05/02 +DL0LN,JO31RS,,,,,,10/04 +DL0LSW,JO61XU,,,,,144: 17el 750W,12/99 +DL0PO,JO43CD,,,,,,08/96 +DL0SHF,JO54BH,,,,,,01/03 +DL0UEM,JO73AR,,,,,,07/05 +DL0UL,JN48XK,,,= DK7T,,144: 11el 400W 3CX800,12/05 +DL0UMK,JN68BC,EME,,,,144: TS790S 4CX1000 4x17el 5WL,01/95 +DL0VV,JO64AD,EME,,,,144: 500W 4x WY209 Preamp 3SK121,09/07 +DL0WAE,JO42DC,EME,,,,750w and lots of aluminium!,05/04 +DL0WH,JN49HN,EME,,,,,01/92 +DL0WX,JO30FQ,,,,,,07/96 +DL1AAH,JO52EF,,,,,IC-756pro3 / TR-144H+40 / TR-432H / 12 and 28 el M� yagi,06/09 +DL1AIW,JO43SX,EME,,,,FT 736 FT 221 FT 290,08/08 +DL1AOQ,JO50IW,,,,,,05/02 +DL1BKY,JO33RL,,,,,,01/03 +DL1DAX,JO31RM,,,,,144: IC251E 100W 11el - 432: FT780R 30W 19el,07/05 +DL1DSB,JO61,,,ex Y28OL,,,01/93 +DL1DUR,JO70KV,EME,,,,144: IC275H 700W 4x11el S3030,08/00 +DL1DWI,JO61TD,EME,,,,144: 2x 8el 750W,06/06 +DL1EAP,JO31IK,,,,,144: 12el 750W,04/07 +DL1EEX,JO31MA,,,,,144: 750W 10db ant.,09/00 +DL1EFJ,JO31GM,,,NOT qrv MS nw (01/01),,,09/01 +DL1EL,JO41RF,,,ex DL3ZBA,,IC820H 144: 250W 2x11el - 432: 130W 2x23el Preamp,09/01 +DL1ELY,JO31IO,,,,,144: FT225rd Mutek 17el 150W,01/01 +DL1GBF,JN48NJ,EME,,,,,02/97 +DL1GBM,JN48FD,,,,,50: 7W - 144: 400W- 432: 100W- 1296: 200W,07/02 +DL1GGT,JN58AO,EME,,,,144: 8877 2x 12el elev. 10368: 5W 60cm,12/04 +DL1GI,JN49FG,,,ex DL1GJO,,,12/03 +DL1GNM,JN38WB,,,,,,10/02 +DL1HTT,JO61FR,,,,,,11/99 +DL1HYZ,JO62,EME,,,,,03/01 +DL1JJ,JO31IA,,,,,,08/02 +DL1KDA,JO30FQ,EME,,EX DG1KDA,,FT1000 144: LT2S 3CX800A7 Preamp 17ele M2 432: LT70S 3CX800A7 Preamp 2x39el M2,10/07 +DL1MAJ,JN68AH,,,= HA1BC,,144: 2x17el 750W,12/99 +DL1NEO,JN59KV,,,,,144: IC275H SP2000 Beko HLV600 (max. 600 W) 2x17el Tonna,09/99 +DL1NFI,JN59KV,,,ex DG5NGC,,144: IC746 100W 12el M2,01/02 +DL1NUX,JO50LE,,,DO2NAK,,KWD TS2000X IC706MK II G,04/07 +DL1OJ,JO42QI,,,,,144: Elecraft K2 LT2S Beko HLV600 9el 300W,04/07 +DL1RNW,JO62GH,EME,,,,144: 300W 4x10 DK7ZB,12/07 +DL1RTL,JO62PH,,,,,144: 13el 100W MGF1302,07/01 +DL1SDN,JN48PP,,,,,144: 2x11el 500W,07/99 +DL1SFK,JN48PR,,,,,,06/02 +DL1SUN,JO53PN,,,ex Y21NB,,,04/00 +DL1SUZ,JO53UN,EME,,EX Y24LB,,TS2000 2m: GS35 2x2.2WL Preamp 3SK121 70cm: 2xEC9000 2x7.7WL Preamp.,01/09 +DL1UU,JO62SP,,,ex DL7VBW,,144: 300W 2x9el,04/06 +DL1VPL,JO61UA,,,EX Y21PL DM2GPL DM3XML,,,05/09 +DL1YDD,JO31OO,,,EX DG8YDJ,,144/432: 4CX250 X-Yagis 3 m 1296: 100 W Yagi 3 m,08/08 +DL1YMK,JO31QX,EME,,EX DB1DI,,,10/07 +DL1ZU,JO40IM,,,,,,06/09 +DL2ALF,JO50IW,,,,,144: 100W 9el,08/02 +DL2ARD,JO60AR,,,,,144: IC275E 350W 4x17el,02/05 +DL2BWH,JO62XR,EME,,,,HF: TS 830+GS35+ Log-Periodic /// 144: 350 W 10 over 10 El. Yagi,08/08 +DL2CJ,JO50,EME,,,,,01/94 +DL2DAO,JO31PH,,,,,144: 600W 24el,11/02 +DL2DBX,JO31OL,,,,,,07/05 +DL2DXA,JO61VC,,,,,144: 150W 11el,01/97 +DL2EAA,JN59PL,EME,,,,,06/09 +DL2FCN,JN49JU,EME,,,,50: 10W 2el BF981 - 144: 400W 11el MGF1302 - 432: 30W 19el CF300,03/06 +DL2FDL,JO40LN,,,,,FT736R 50: 5el - 144: 150W 9el - 432: 19el 25W - 1296: 23el 10W,08/03 +DL2GPS,JN48CD,EME,,DG2GPS,,TS2000 144Mhz:4x9el DK7ZB Yagi 432Mhz 2x20el X-Yagi Maspro,03/09 +DL2IAN,JN49BC,EME,,,,144: 1 KW 2x9el,07/01 +DL2IE,JN48,,,,,,01/93 +DL2JA,JN58,,,,,,02/04 +DL2LAC,JO44MR,EME,,,,144: 18 dBd GS35b 432: 20 dBd GS35b 10368: 4 m dish,03/05 +DL2LAH,JO44QS,EME,,DD0LV,,144: 750W 4x12ele DK7ZB 432: 300W 4x16 ele DK7ZB,02/09 +DL2MF,JO52DP,,,DL4OBI,,,06/08 +DL2MHS,JN58,EME,,,,,03/00 +DL2NFX,JN59IV,,,,,144: IC746 100W,04/01 +DL2NUD,JO63MF,EME,,,,144: 4x 18el QRO,05/06 +DL2NWK,JO63SP,EME,,,,,01/93 +DL2OCB,JN49HR,,,,,TS-2000,06/07 +DL2OM,JO30SN,EME,,,,,08/01 +DL2RDH,JN68HW,,,,,TenTec ORION II + DB6NT-Transverter+PA,05/07 +DL2RMC,JN68GI,,,,,,11/97 +DL2RSX,JO62SH,EME,,,,144: 19 dBd MGF 1302 DSP 1-2KW,12/03 +DL2RUG,JO62,,,,,,01/03 +DL2SDQ,JN49OC,,,,,,08/01 +DL2YDS,JO32,,,,,,08/97 +DL3AAL,JO52,,,,,,01/93 +DL3ANK,JO50NL,,,,,,10/07 +DL3AZI,JO51ME,,,,,,01/97 +DL3BUE,JO72FH,,,,,,08/02 +DL3BWG,JO62TQ,,,ex DM5DD Y26GE DR3R,,FT-847 11-ELE-F9FT,03/06 +DL3DTS,JO61UA,,,,,,01/93 +DL3FBJ,JO40,,,,,,11/01 +DL3HRT,JO61AB,,,ex Y32MH,,144: 10el 2.3wl 100W GaAsFet DSP-NR,07/02 +DL3IAE,JN49DE,EME,,,,50: TS120 trvt 6el - 144: 3CX800 750W 2x10el MGF1302,08/05 +DL3IAS,JN49EJ,,,,,144: 20w 10el DK7ZB 432: 3w 23el DK7ZB 1296: 100w 1.5m 2320: 75w 1.5m 3400: 40w 1.5m 5760: 8w 1.5m 10368: 10w 48cm,07/05 +DL3JAN,JO60KT,,,,,144: 9el 300W,03/01 +DL3JIN,JO60LX,,,Y32IN,,50W 6ele,05/08 +DL3JPN,JO60IS,,,Y56YN - Y23PN,,2m 150W@9ele - HF 500W@3ele (20/15/10) and FD4 - 70cm 100W@10ele,03/07 +DL3LBK,JO54AH,,,,,144: 250Watt 11el,07/96 +DL3LSM,JO61GG,EME,,,,Elecraft K3+TR144H - 300 W - 11 ele. Flexayagi,01/09 +DL3LST,JO61FI,EME,,,,144: 9el,04/05 +DL3MBG,JN68,,,NOT qrv MS nw (01/01),,,12/05 +DL3MGL,JN58QD,,,= EA/DL3MGL,,,12/01 +DL3NAW,JN59KV,,,zzT W3TWX,,144: 500W 2x11el,08/03 +DL3NCR,JN48QX,,,,,50: IC736 3el Yagi - 144: IC275E 11el DL6WU 8874 BF982,08/08 +DL3NUA,JO64XB,EME,,EX Y38ZA,,144: 500W 9el Yagi,02/07 +DL3RBH,JN68HJ,,,,,,05/99 +DL3RU,JN49FG,,,,,,01/03 +DL3SAS,JN48OR,EME,,,,,04/96 +DL3TN,JO31LC,,,,,,12/01 +DL3TW,JO44SK,,,,,144: FT1000 LT2S 6x6el 600W,01/03 +DL3WW,JO60FL,,,,,,08/08 +DL3XT,JN49FT,,,,,,01/93 +DL3YBP,JO42,EME,,,,,01/93 +DL3YEE,JO42GE,EME,,,,50MHz: 5ele 70MHz: 4ele 144MHz: 5el 100W 432MHz: 28ele 400W 1296MHz: 48ele 150W,05/08 +DL3YEL,JO41EV,,,,,144: 9el 3CX800,03/06 +DL4ABJ,JO42XP,,,,,,01/03 +DL4ALI,JO50JW,,,,,,07/99 +DL4ANT,JN49LF,,,,,,09/01 +DL4AO,JO42NX,,,,,144: 150W 11el,05/08 +DL4DD,JO43OT,,,,,TS2000,07/05 +DL4DTU,JO60TS,EME,,,,1296: 200W 3.7m dish 0.4db,08/05 +DL4DWA,JO61QH,EME,,,,144: 600W 13ele 432: 35w 19ele,12/05 +DL4EA,JO31,,,,,,09/96 +DL4EBY,JO62PM,EME,,,,,12/03 +DL4IB,JO64CC,,,ex DL5KVA,,144: 11el 300W,12/98 +DL4JM,JO31ED,EME,,,,144: 4el 100W,05/05 +DL4KG,JN48OU,EME,,,,TS2000 - 50: dipole 30 W 144: 10el DJ9BV 100 W 432: 23el DJ9BV 300 W 1296: 35el 80 W,04/07 +DL4MEA,JN58RI,EME,,,,432: 4.5m dish EME KA0RYT peamp GS35b 1296: TH347 750W 1.5m tropo 4.5m dish EME FHX35 HEMT preamp 2320: 1.5m tropo 4.5m dish EME 2xMRF21120 HEMT preamp,04/07 +DL4MP,JN48NV,,,ex DL8SET,,50: 100W 5el,01/01 +DL4NAA,JO40OC,,,,,144: hm 750W 2x15el,09/07 +DL4SUN,JO63CT,,,,,,10/04 +DL4WO,JO61WC,EME,,,,144: 17el 150W,04/05 +DL4XX,JO43XK,,,,,,07/97 +DL4YAO,JN58,,,,,,05/02 +DL4YBM,JO42DC,,,,,,01/95 +DL5AG,JO63CT,,,,,350W 11el Yagi,06/07 +DL5BAC,JO43LG,,,,,,01/96 +DL5BBW,JO32NH,,,,,,01/01 +DL5CC,JO64AD,,,ex DL5KVD,,144: 17el 600W,12/06 +DL5DAV,JO31,,,,,,06/08 +DL5DTA,JO61SD,EME,,,,144: 4x11el EME Pwr GaasFet DSP59,08/99 +DL5EBS,JO31LH,,,,,144/432MHz: TS790+13 el./20 el. Yagi. 50MHz:Icom+4 el. Yagi,05/09 +DL5FDP,JN49LP,,,,,,11/02 +DL5FN,JO40FB,EME,,,,432 8X28 QRO,04/09 +DL5GAC,JN47UT,EME,,,,144: 400W 11el Flexa CF300,04/08 +DL5IO,JN49NI,,,,,,01/97 +DL5LF,JO54,EME,,,,432: 1KW 4x9el 9BV 8.5lb - 1296: 20W 23el,08/00 +DL5MAE,JN58VF,EME,,,,144: 8x17el 700W,07/05 +DL5MAM,JN58UB,,,,,144: 100W 10el,07/04 +DL5MCG,JN58KH,EME,,,,144: 11el 500W,05/07 +DL5ME,JO52SD,,,ex DL6CIA,,144: 100W 18el,04/04 +DL5MEL,JN58,,,,,144: 600W 11el,03/00 +DL5NEN,JN59MO,,,ex DH5NBE,,144: 12el GS35b MGF1302 - 432: 28el GS35b - 1296: 35el 40W,12/97 +DL5OAU,JO52GW,,,,,,01/03 +DL5QQ,JO32KB,EME,,,,,04/96 +DL5RBW,JN58VF,,,,,,01/03 +DL5RDI,JN58XX,,,DG1RCJ,,,08/08 +DL5RDO,JN59VN,,,,,,01/92 +DL5ROB,JN68HG,,,ex DG5CH,,144: 300W 16el BF981,03/07 +DL5UJ,JN39UJ,,,EX DC8IL,,IC-271E 150watts MGF1302 preamp 5el DK7ZB,05/07 +DL5WG,JO52VK,,,ex Y52WG- DL6CRS,,50: 20W 4el - 144: 300W 2x11el,05/04 +DL5XV,JO53AP,,,,,144: 2x15el 600W,06/06 +DL5YAS,JO31WS,,,,,,12/01 +DL5YET,JO41EV,,,,,144: 750W 13el - 432: 750W,04/02 +DL5ZA,JO51HK,,,,,144: IC706 100W 14el F9FT,08/07 +DL6BF,JO32QI,EME,,,,144: 400W 4x 8el - 432: 150W 4x11el,03/09 +DL6KR,JO30NQ,,,,,,10/05 +DL6LAU,JO53CF,EME,,,,,07/03 +DL6LI,JO53BV,,,,,,06/07 +DL6MFK,JN67JX,EME,,,,,08/07 +DL6NAA,JO50VF,EME,,,,,10/00 +DL6NCI,JO50VI,,,,,,01/93 +DL6NDK,JO53BV,EME,,,,TS790 40W 350W 8El Yagi 12dBd,01/08 +DL6RDR,JN68BM,,,,,,10/95 +DL6UAL,JO61XU,,,,,144: 750W 2x BigWheel,12/00 +DL6WT,JN39VV,EME,,,,,04/96 +DL6WU,JN49HT,EME,,,,,02/04 +DL6YEH,JO32VA,EME,,ex DG3YFB,,144: IC730 LT2S 749W 2x2.2wl 9BV - 432: IC730 LT70 200W 4x8.8wl 9BV,03/02 +DL6YFB,JO31KM,,,ex DH4YAT,,,01/96 +DL6ZAU,JO40JF,EME,,,,FT736+MHP145 144: 600W 1x 12el M2,05/07 +DL6ZBN,JO40ED,,,currently not active 01/04,,144: TS700S 80W 11el MGF1302,05/02 +DL7AKA,JO62QO,EME,,,,144: TR7 Trvt 2x4CX250b 15el DJ9BV,01/01 +DL7APV,JO62JR,EME,,DC7PV,,432: 16x39el. EME 8x21el. Tropo,01/09 +DL7ARM,JO62RJ,,,,,,12/95 +DL7AUK,JO62,,,,,,01/03 +DL7DCU,JO41BC,,,ex DG7DCU,,144: FT767 100W 4x11el MGF1302,03/99 +DL7FF,JO62TJ,EME,,ex DL7UTS,,HF 100W FD4 - 144: 4x11el 1KW,04/05 +DL7HR,JN58PF,EME,,,,IC 7400 - 144: 2x 8el LY hor 800W,02/08 +DL7PP,JO30SE,,,,,FT920-6m Transverter 144: 2x 11el F9FT 50: 6el DK7ZB,08/05 +DL7QY,JN59BD,,,,,,10/08 +DL7TX,JN49IV,,,ex DC7AP,,144: 50W 6el - 432: 17el 100W,11/01 +DL7UAE,JO62PH,EME,,,,FT736R 50: PA Tonna20505 - 144: GS35 4x3wl (13el) 90degElev - 432: GS35 2x6wl(19el),10/06 +DL7UDA,JO62TK,EME,,,,144: IC275H 2xGI7B 17 el F9FT (GS35B 2x10el DK7ZB) 432: IC475H GS35B 21el F9FT (GS23B 4x21el DK7ZB),10/08 +DL7UGB,JO62,,,,,,05/97 +DL7ULE,JO62,,,,,,12/95 +DL7ULM,JO62SN,,,,,,05/01 +DL7UME,JO62SN,,,,,,01/03 +DL7YC,JO62PK,,,,,HF: 400W - 50: 10W - 144: 200W - 432: 750W - 1296: 110W - 2320: 125W - 10368: 33W,09/03 +DL7YW,JO62RK,EME,,ex DC7OL,,,01/02 +DL8AKI,JO51,,,,,,11/95 +DL8AKR,JO51AI,EME,,DM2CGI Y25VI,,144: FT847 150 Watt PA 5 EL-YAGI (10db) next more,02/08 +DL8BBL,JO42,,,,,,04/04 +DL8BDU,JO43AA,,,ex DC9BJ DH5BAG,,144: 750W 15el 432: 250W 2x 20el,01/08 +DL8CMM,JO52VM,,,,,,05/04 +DL8DAT,JO31,EME,,,,,01/93 +DL8DBU,JO30NP,,,ex DG8FCB DH6DAH,,144: TS-2000X single 2M12 600W 0.35dB,07/06 +DL8DUL,JO61,,,,,,08/04 +DL8EBW,JO31NF,EME,,EX DD0EF,,TS-2000 144: 2x 12el M2 full Elv 750W MOSFET LNA144MKII-SSB RX: ONKYO T-4711 PCR1000 7el Crossyagi,01/09 +DL8FBD,JO40,,,,,,01/93 +DL8GAM,JN37,,,,,144: TS870 600W 11el,12/97 +DL8GP,JN39LH,EME,,,,144: SE400 FT847 4cx250b GS35b 90mtr.coax 500watt in 8x 20el.crossyagis,04/05 +DL8HCZ,JO53AP,,,= CT1HZE,,,11/00 +DL8II,JN49,,,,,,07/08 +DL8LAQ,JO43XU,,,,,IC-7400 8874 M2 2M5WL,06/08 +DL8MEM,JN57XX,,,,,,12/06 +DL8NBN,JN58,,,,,,01/93 +DL8OBU,JO42XI,EME,,,,432MHz: 750W 4x33el - 1296MHz: 150W 67el,11/01 +DL8SCL,JN48RM,EME,,,,,03/01 +DL8SCQ,JN48RV,EME,,DG8SAV,,TS711E + 3CX800/GS35b + 2 * 10 DJ9BV( 1990 ) H,06/09 +DL8UCC,JO71EQ,EME,,,,144: 500W 2x11el or 2x17el,07/04 +DL8WKR,JO61CD,,,,,,09/06 +DL8YAU,JO41HS,EME,,,,144: Ant: 12 El 4WL PA: 700W-MOSFET VV: ATF54143,03/09 +DL8YE,JO31MH,,,EX DL8YET,,50: FT847 5el DK7ZB - 144: FT847 10el DK7ZB GS35 - 432: FT847 30w 23el DK7ZB - 10368: FT290 DB6NT Transv 5W 65cm dish,04/08 +DL8YHR,JO41GV,EME,,ex DH8YHR,,50: LT6S 2x9el M2 - 144: 24el M2 750W,11/05 +DL9AN,JO62RE,,,ex DL7UME,,50: 10W 5el - 144: FT736r 750W GS35b 2x12el,08/04 +DL9BDM,JO33RL,,,,,,01/93 +DL9DAK,JO43XO,,,DG5DT DH4DAB,,IC7000,04/07 +DL9DBJ,JO31OK,EME,,DG8DU,,VHF FT897D GS23b 7El UHF FT897D TH308 2x 19El,07/08 +DL9EBF,JO31FH,,,,,,01/03 +DL9EBL,JO31,EME,,,,,01/94 +DL9GBH,JN48RW,,,,,,12/01 +DL9GRE,JO61FH,,,Y66XA,,HLV600 10Eel DK7ZB DEMI Transverter,10/07 +DL9GS,JO31OM,EME,,,,,07/08 +DL9IM,JO31,,,,,,07/04 +DL9KR,JO40DE,EME,,,,,09/02 +DL9LBH,JO30MP,EME,,,,TS-2000 144: 2x 11el 500W - 432: 23el 50W,08/08 +DL9MCC,JN58UA,,,,,144: 4x 2-4wl 700W MGF1302 - 432: 2x 7wl 700W MGF1302,08/03 +DL9MS,JO54WC,EME,,EX DL9GJW,,144: 4x17el GS35b MGF1302,11/05 +DL9NBD,JO50LE,EME,,,,TS790 150w 2x11el,03/07 +DL9NDD,JN59KN,,,,,,01/03 +DL9NDW,JO50XG,,,,,IC7000 2m=400W/17el 70cm=100w 21el,06/09 +DL9OA,JO64EB,,,,,144: IC821 100W 9el/2.5wl CF300,03/02 +DL9OBD,JO42QN,EME,,,,IC7400 144: 4x11el 750W BF981 - 50: 5el 25W,05/08 +DL9RCI,JN68,,,,,,07/95 +DL9USA,JO71EN,,,,,144: 10el DL6WU 300W RXAmpl,09/03 +DL9YEY,JO41GV,,,,,,01/03 +DM1AC,JO30IV,EME,,DC9KZ,,TS2000 - 144 MHz 750W - 2 x 9 ele - 50 MHz 10W - 4 ele,09/08 +DM1CG,JO31IC,,,EX DG1ELE,,50: TS 850 LT6 4el - 144: TS 850 LT2S 600W 12el M2 HF: FT 850,10/08 +DM1HD,JO31GD,,,ex DC1JP,,144: TS850S LT2S HLV600 600Watt 17 EL M2,08/02 +DM2BHG,JO51MW,EME,,EX HZ1AB- Y22HG,,144: 4x 17el XPol 2xGS35b MGF1302,01/08 +DM2DXG,JO51MV,,,,,,06/02 +DM2ECM,JO62GJ,,,Y25CD,,,05/08 +DM2GS,JO42HJ,,,,,,12/04 +DM2HB,JO41EQ,,,,,50: FT950 144: IC-706MK2G 50W 11el F9FT,06/09 +DM2LL,JO62VU,,,DG3BSD,,HF:500 W- Beam 10-15-20 Dipol 2x 31 50 m // 144 : 100 W 11 El,08/08 +DM2PG,JO51,,,,,,04/03 +DM2SR,JO53HR,,,DO4LSR,,144: IC-910 - HA8UG GS31 - 2M18XXX Yagi 50MHz: 4element TenTec 1208 x-verter,05/08 +DM3FG,JN49LT,,,,,,04/03 +DM3FM,JO40MF,,,,,144: IC275H 8el 7ZH,06/02 +DM4KA,JO64II,,,,,,03/03 +DM7RM,JN48HD,,,EX DH3IAJ,,50: 10W 4el 144: 100W 10el 10GHz 5W 48cm dish,04/09 +DM8MM,JO40AQ,,,ex DC9PX DL7AJA,,144: IC-706MKIIG 3CX1500A7 MGF1302 17el. Tonna,11/06 +DN1FC,JO41RF,,,,,IC820H 144: 250W 2x11el- 432: 130W 2x23el Preamp,07/01 +DN1MA,JN58VF,,,,,144: 8x17el 700W,12/00 +DN2MS,JO31OM,,,SpecialCall,,144: C5400 HG51 400W 9el MGF1302,12/98 +DO1CTL,JO60LT,,,,,,08/01 +DO1EDK,JO31RL,,,,,Kenwood TR-751E,08/05 +DO1EL,JO31JL,,,,,,06/02 +DO1NF,JN69,,,,,,08/01 +DO1YDS,JO42HJ,,,,,,04/04 +DO2TC,JO73AO,,,,,,04/05 +DO3ESB,JN59VS,,,,,144: IC275H 17el,07/07 +DO3MT,JN67,,,,,FT817,01/03 +DO5AN,JO31,,,,,,04/02 +DO9ST,JN49VW,,,,,,03/01 +DP5G,JO31IC,,,SpecialCall,,,04/06 +DQ2006R,JO31NF,EME,,SpecialCall,,IC275H or TS2000 144: 2x 12el M2 full elev 750W BIY-ATF-Preamp,06/06 +DR5O,JO31MG,EME,,= DF0AW JO31MG,,FT736 144: 750W 2x 11el 432: 200W 4x 23el 1296: 23el 10W,12/08 +DS1MFC,PM37LM,EME,,,,144: 4x 13el 100W,04/08 +DZ1JP,PK04NC,EME,,,,,03/06 +E51EME,BG08DR,EME,,ZK1EME,,IC-706Mk2g 4x 8el 500W,12/08 +E73DPR,JN92ER,,,YU4DPR,,FT-897 IC-7000,05/09 +E73DU,JN92ER,,,,,,05/09 +E75DX,JN84MX,,,T96C,,TS2000,06/08 +E77AR,JN94AS,,,YU4AR,,Icom IC275 + PA 250W,06/09 +E77GS,JN84OT,EME,,EX T98GTH,,FT897 150 watt 10 el DK7ZB,09/08 +EA1ABZ,IN71QO,EME,,,,144: 4x12el or 11el DL6WU 1500W (4CX250+GS35B) Ga-As FET - 432: 15el 35W,10/02 +EA1AIB,IN82TK,,,,,,08/95 +EA1BBE,IN62BH,EME,,,,,10/05 +EA1BFZ,IN81SS,,,,,,04/04 +EA1BLA,IN53UM,,,,,50: 100W 5el - 144: 1kw 12el MGF1302 - 432(/p): 31el 600W MGF1302 - 1296(/p): 2x55el 80W MGF1302,10/02 +EA1BLX,IN53VK,,,= EB1BXW,,,04/06 +EA1CJ,IN71SW,,,EB1ISN,,IC-7000 Acom 1000,06/09 +EA1CKL,IN82KF,,,,,,08/08 +EA1CRK,IN73DM,,,,,Kenwood ts-790e or Icom 706 MkII 50: 100W 7el - 144: 17el 200W - 432: 19el 130W - 1296: 35el 10W,01/04 +EA1CYE,IN83,,,,,,01/93 +EA1DDO,IN53UI,EME,,,,144: 17B2 100W pHEMT 432: 50W 31el 1296: 10W 55el,09/06 +EA1DDU,IN73EM,,,EX EB1ALC,,144: TS-2000E2+16JXX2+170W 432: TR851E+CC729B 29EL+120W 50: IC706MKIIG+5EL ZX6-5. 1296: TS2000E2+55EL.F9FT+10w.,12/08 +EA1DOD,IN73AN,EME,,,,,01/93 +EA1EBJ,IN73FL,,,,,50: IC729 BV6-1wl - 144: IC275H BV2-4wl - 432: IC475H BVO-8.5wl,03/06 +EA1EW,IM79WS,,,,,,07/95 +EA1FBF,IN73WJ,EME,,,,,04/07 +EA1JK,IN72RA,,,,,,01/01 +EA1KV,IN52PF,,,,,,01/93 +EA1OD,IN73EM,,,,,,01/90 +EA1RX,IN52PF,,,ex EA1BSK,,IC706 MKIIG,06/03 +EA1SH,IN63GA,,,= EB1FIF,,144: 17B2 170W GaAs-Fet - 432: 31el 180W GaAs-Fet,05/04 +EA1YV,IN52OC,EME,,,,50: IC706 2x5el - 144: TS2000 GS35B 1KW 4x 17el M2 full elevation MGF1302,08/06 +EA2AF,IN92,,,,,,01/90 +EA2AGZ,IN91DV,EME,,,,FT1000MP- FT736 144: 4CX1500b 4x17B2CC MGF1402,10/06 +EA2ARD,IN93,,,,,,08/02 +EA2ASB,IN83KF,EME,,EB2DMN EC2BAW,,,11/08 +EA2AVY,IN92DS,,,,,,01/03 +EA2BVD,IN91OO,EME,,EB2ATY,,,11/07 +EA2KP,IN83MG,,,ex EA2AKP,,144: TR751E 2M18XXX 200W Preamp - 432: 100W 21el,04/04 +EA2LU,IN92ET,EME,,,,144: 8x9el 750 W MGF1302,01/06 +EA2LY,IN93AH,,,ex EA4LY,,144: TS790 4CX1500 LNA144 2x18el,08/98 +EA2NN,IN83MG,EME,,ex EA2CHT,,144: 4wl 200W IC706MKIIG,10/06 +EA2RCF,IN82,,,,,,08/02 +EA2RL,IN83MG,,,ex EA2AJX,,50: 10W Dipol - 144: 100W 6el Quad,07/05 +EA3/DL3MGL,JN01ME,EME,,= EA3MS,,144: 1KW 1x17el,04/09 +EA3ADW,JN11CQ,EME,,,,,10/02 +EA3AEL,JN01,,,,,,01/93 +EA3AIR,JN11,,,,,,01/93 +EA3AQJ,JN11BJ,,,,,,01/87 +EA3AXV,JN01TJ,EME,,,,Elecraft K2 IC756II Elecraft trvter. GS35 17el-5WL,05/07 +EA3BB,JN01VS,EME,,EX EA3BBU,,144: 2x 17el 400W MGF1302,09/07 +EA3BEW,JN01SG,,,,,,12/95 +EA3BTZ,JN11BI,EME,,,,144: 100W 16el 0.8db preamp,09/02 +EA3CN,JN11BI,,,ex EA3GAW,,,03/96 +EA3DUY,JN12LD,,,,,144: 4x17el 800W - 50: 6 el 500W - 432: 21el 50W,08/02 +EA3DXU,JN11CM,EME,,SILENTKEY,,,10/07 +EA3ECE,JN01LT,,,,,,11/97 +EA3EDU,JN01WK,,,,,,03/08 +EA3EHQ,JN11HR,EME,,,,,03/96 +EA3ESE,JN01WR,,,,,144: TM-255 VLA200 SHF MVV144-VOX 13 el Yagi,04/06 +EA3FLN,JN11KT,,,,,144: IC275H 450Watts GaAsFET preamp 0.6dB 18ele 18xxxM2,04/04 +EA3FTT,JN01VR,,,,,RIG: IC 275H 120W 13ELE yagui,09/06 +EA3GAW,JN11BI,,,,,,01/03 +EA3GCJ,JN11EM,,,,,Yaesu FT-107M,04/04 +EA3GFB,JN11,,,,,,12/95 +EA3GIQ,JN01ND,,,,,,07/95 +EA3GKU,JN01NJ,,,,,,08/08 +EA3GLJ,JN01UI,,,EC5AKW,,Elecraft K3,03/08 +EA3IH,JN11BJ,,,,,,01/87 +EA3KU,JN00JV,EME,,,,144: IC275H 2x4CX250 16el- preamp,04/05 +EA3MD,JN11,,,,,,01/94 +EA3MM,JN01WH,EME,,,,,01/93 +EA3MS,JN01ME,EME,,DG3MGL,,144: 2x 17el GS35b,10/08 +EA3PL,JN11PL,EME,,,,,01/94 +EA3TI,JN11JT,,,,,144: 17el 5lambda Yagi 400W 110masl,08/06 +EA3UM,JN01,EME,,,,,01/94 +EA3URC,JN11,,,SpecialCall,,YAESU FT-100 ICOM IC-706MKII - 144: 50W 14el,05/03 +EA3WH,JN01,,,,,,01/93 +EA3XU,JN11CK,EME,,,,,12/07 +EA4AMX,IM89AT,,,,,,07/01 +EA4BAS,IN80HL,EME,,,,FT847 144: 17el 180W MGF1302 - 432: 35el 100W MGF1302,09/02 +EA4DB,IN80EJ,,,EA4BPJ,,IC-756ProIII - IC-821H,09/07 +EA4ED,IM79FW,EME,,,,,01/94 +EA4EHI,IM68TV,,,,,144: IC275H 1500W 4x17B2,07/01 +EA4EKH,IN80ND,EME,,,,144: 50Watt 9el,08/05 +EA4LU,IM68TV,,,ex EB4FQP,,144: FT726r 400W 17el (17B2),04/03 +EA4SV,IM68MU,,,ex EA4DQR,,,04/04 +EA5AAJ,IM99SL,,,,,144: IC-706MK2G 100W 9el,04/04 +EA5AEL,IM98RP,EME,,,,ICOM 746-100w ant 14 elemnts VHF-multi-band dipole HF-5 elemts to 6 meters-monoband to 10 meters and others,04/07 +EA5CJ,IM99TL,EME,,,,,07/05 +EA5DWS,IM98SR,,,,,Icom 706-MKII-G YAESU FT-920,08/08 +EA5EF,IM99SM,,,EA5BVK - EC5BD,,144 MHz 70 W + 9 el yagi / 50 MHz 100 W + DK7ZB 5 el yagi,04/07 +EA5EMM,IM99,,,,,,01/93 +EA5GIY,IM98XD,EME,,,,,01/99 +EA5HM,IM99,,,,,,01/93 +EA5IC,IM98,,,,,,01/94 +EA5MT,IM88WV,,,,,,08/08 +EA5NO,IM98FV,,,,,,08/97 +EA5SE,IM98IL,EME,,,,144: 2x 17el 1.5K,04/06 +EA5SR,IM98GF,,,,,,08/08 +EA5ZF,IM99VT,EME,,EX EB5IFI,,144: 600W 2x 17el LNA145 432: 35W 2x 21el F9FT mw432s,05/07 +EA6ADW,JM19LU,EME,,,,50: 20dbd- 144: 40W- 10el- up: div. Spiegel,07/97 +EA6DD,JM19JK,,,,,144: IC706MKIIG 17elB2 100W,05/03 +EA6FB,JM08PV,EME,,,,,08/02 +EA6IB,JM09SB,,,,,144: IC251E 150W 15elYagi,04/02 +EA6NP,JM19MQ,,,,,,01/93 +EA6QB,JM08PV,,,,,144: 2x15el 4CX400,05/03 +EA6SA,JM19LO,EME,,,,TS-2000X: ...@50+9dBd's. 2x4X150@144+15dBd's. 2X4CX250@432+18dBd's. 10W@1296+25dBd's.,05/08 +EA6VQ,JM19HN,EME,,,,144: 2KW MGF1302 8x17el M2 432: 21el 115w 1296: 55el 10w,04/05 +EA7AJ,IM87CS,,,,,144: 300W 2x 19el,08/04 +EA7DBH,IM76GD,,,,,,01/94 +EA7DFH,IM87DD,EME,,,,FT-857 TS2000 17el 200w,05/07 +EA7ERP,IM87EE,,,,,TS 790-E 13 ELE TONNA + PA 4CX350A,06/08 +EA7EYX,IM87CS,,,,,,12/04 +EA7HG,IM87CS,EME,,,,144: 4x 9el 100w mgf1302,12/05 +EA7OC,IM77OV,,,,,144: IC820 250W 17el,03/01 +EA7RM,IM87CS,,,ex EA7GTF,,144: TR9130 240W 17B2 OH5IY,07/02 +EA7TL,IM66VO,,,,,,05/05 +EA7TN,IM66VP,,,EX EA1AK/7,,TS2000 144: 100 W 2 x 2.5 wl - 50: 100 W 0.81wl,05/08 +EA8BEX,IL27GX,,,EB8QC,,IC910H,06/08 +EA8FF,IL28,EME,,,,,02/01 +EA9AI,IM75IV,,,,,144: 100W 9el,06/03 +EA9MH,IM85NG,,,,,,05/00 +EB1BKG,IN62BH,EME,,,,,11/01 +EB1BXW,IN53VK,,,= EA1BLX,,,04/06 +EB1DNK,IN62CL,EME,,,,144: IC706 4x17el 500 Watt MGF1302 - 432: 70W 21el,04/06 +EB1EB,IN83BK,,,ex EB1IQC,,,08/05 +EB1EFC,IN52OF,,,,,,01/93 +EB1EHO,IN73DM,,,,,144: 17el 200W - 432: 21el 50W,07/04 +EB1EUW,IN82TK,,,,,,01/95 +EB1IHY,IN52PM,,,,,144: 17el 160W,07/04 +EB1IVY,IN53SJ,,,,,,07/02 +EB2AYV,IN83MG,,,,,144: 250W 2M18XXX,01/04 +EB2DTP,IN82NS,,,,,FT847 IC746 FT816 17el 1000W,08/03 +EB2DVT,IN91MP,,,,,,03/06 +EB2FJN,IN83QE,EME,,,,50: 1x3 cushcraft 100W - 144: 2x 13b2 Ant MGF1302 1KW - 432: 9el X-Quad BF980 150W,12/08 +EB3BAP,JN11CJ,,,,,144: FT736r 200W 17el,01/01 +EB3CNX,JN11DI,,,,,,01/93 +EB3EPR,JN01ND,,,,,,01/03 +EB3GHU,JN11CJ,,,,,,04/04 +EB3JT,JN01UI,EME,,EB3GEK,,IC910 + SP2 + 4x13B2 + GS35B,08/07 +EB3WH,JN01WN,,,,,,01/93 +EB4DF,IM79QQ,,,,,TS-790 FT-817 144: 500W 17el - 432: 500W 21el,06/04 +EB4EQZ,IN80EK,,,,,Yaesu ft-817 Yaesu FT-897,08/05 +EB4ERS,IN80BH,,,,,FT736 144: 140W 9el GaAs-Fet,01/00 +EB4EUB,IN80DJ,EME,,,,50: 6el 100W - 144: 17el 1KW MGF1302 - 432: 21el 50W MG1302 - 1296: 55el 10W,08/00 +EB4FXD,IM78BX,,,,,144: 150W 17el,02/04 +EB4GIA,IN80CG,,,,,144: IC821 IC706 TS790 240W 17el - 432: 100W 31el SP70,02/98 +EB4TT,IN70XJ,,,ex EB4CXS,,,05/00 +EB5AZO,IM99RA,,,,,,11/04 +EB5EA,IM99TN,EME,,EB5AYG,,144: 4x 11el 500W,05/08 +EB5EEO,IM98PG,EME,,,,144: TS2000 6 x 18 2M18xxx /432 : 4 x 38 13 wl / 1296: 8 X 35 Elm Tonna,08/07 +EB5EHX,IM99,,,,,,01/93 +EB6AOK,JM09RB,,,,,HF 144 432 1296,06/09 +EB7BMV,IM67WI,EME,,,,,05/09 +EB7BQI,IM76SR,,,,,,06/03 +EB7COL,IM77AG,,,,,,05/04 +EB7DBX,IM67LG,,,,,144: 12 ele DK7ZB 350W LNA SHF Electronik,07/07 +EB7EFA,IM67XI,,,,,,01/95 +EB8ANY,IL18,EME,,,,144: 500W 4x 7el,12/04 +EB8BTV,IL18QI,,,,,,05/03 +EC1DMY,IN82SL,,,,,,08/08 +EC3DR,JN01UJ,EME,,EA3GLJ,,,04/09 +ED1GSR,IM79WS,,,Expedition,,,01/94 +ED3DXU,JN01VQ,EME,,SPECIALCALL,,,02/08 +ED4RKF,IM79WS,,,Contestcall,,144: 240W 13el,03/97 +ED5TOR,IN90XP,,,Expedition,,,01/93 +ED6EIG,JM19IM,,,SpecialCall,,,08/99 +EG3TVC,JN11BI,,,SpecialCall,,144: 400W 17el M2,12/99 +EH1RX,IN52IN,,,ex EH1BSK,,IC706 MKIIG,03/02 +EH3AXV,JN01TJ,,,,,50: FT920+trsv GS35b 6elYagi,07/02 +EH5RM,IM98,,,,,,07/02 +EH6SA,JM19LO,,,,,TS-2000X,08/07 +EH7RM,IM76QM,,,,,,01/03 +EH9LS,IM75IV,,,,,,01/03 +EI2CA,IO62,,,,,,01/88 +EI2IP,IO61CX,,,,,,04/07 +EI2VPX,IO53IQ,,,,,,01/91 +EI3GE,IO63XD,,,,,,08/00 +EI4DQ,IO51WU,EME,,,,144: ic910 gs35b MGF1302 4x10el or 10el,03/08 +EI4GHB,IO52QQ,,,,,Icom 910,09/08 +EI4VBE,IO42,,,Expedition,,,01/88 +EI4VBS,IO42,,,Expedition,,,01/90 +EI4VWY,IO54,,,Expedition,,,08/01 +EI4VWZ,IO55,,,Expedition,,,08/01 +EI4VXV,IO43XL,,,G0AFH,,144: 400W 17el Preamp,12/06 +EI5FK,IO51RT,EME,,,,144: FT847 150W 9el,03/05 +EI5HN,IO62,,,Expedition,,,05/06 +EI6CPB,IO63WE,,,,,50: IC706 - 144: IC821,09/06 +EI6GF,IO62RG,,,,,,02/98 +EI6IZ,IO53HU,EME,,,,IC756PRO2,06/07 +EI75RTS,IO51,EME,,SPECIALCALL,,,04/07 +EI7IX,IO53FT,EME,,,,,10/07 +EI7RCG,IO62,,,,,144: 27el,08/96 +EI7RSD,IO62WX,,,,,144: 27el 400Watts,07/96 +EI8JK,IO51DN,EME,,EI2FSB,,FT-726 FT-736 FT-102 FT-897,06/09 +EI9HW,IO63MP,,,,,,10/93 +EJ4VNX,IO43,,,SpecialCall,,,01/93 +EJ6O,IO43MM,,,SpecialCall,,,01/94 +EM1U,FC74US,,,,,,01/03 +EN80AL,KO61WP,,,= UT8AL,,,08/07 +ER1AN,KN46KX,,,ex ER5OIW UO5OIW,,144: FT857 200W 2x10el,12/04 +ER2RM,KN46KA,,,ex ER5OK,,,11/05 +ER5AA,KN45CW,,,ex UO5OB,,,06/00 +ER5AL,KN45CW,,,,,,07/02 +ES0Q,KO17AV,,,SpecialCall,,,06/04 +ES0X,KO18,EME,,Expedition,,,07/99 +ES1CW,KO29HK,,,,,,05/98 +ES1RF,KO29IJ,EME,,ex UR2RGM,,FT1000MP/FT847/FT736/TS2000+Trans.+Preamps 50: 5el 500W - 144: 4x9el 500W - 432: 4x19el 150W - 1296: 4x 35el,04/06 +ES2CM,KO29DJ,EME,,,,ICOM-706 MKIIG 144: 4x 14el 600W,04/06 +ES2NA,KO29JL,,,,,144: IC706MKII 300W 9el,04/02 +ES2QH,KO29LL,,,,,144 : FT847 700Watts 9ele Preamp - 432: IC821 800W,08/01 +ES2WX,KO29JN,,,,,,05/03 +ES3BR,KO28JS,,,,,,05/04 +ES3GZ,KO28,,,,,,01/93 +ES3RF,KO29IF,EME,,EX UR2RGM ES1RF ES1RF/3,,FT1000MP/FT847/FT736/TS2000 50: 5el 500W - 70: 5el 60W - 144: 4x18el 500W - 432: 8x19el 200W - 1296: 4x35el 30W,03/08 +ES4Q,KO39BD,,,Expedition,,,08/05 +ES5KJ,KO38IJ,,,,,,01/05 +ES5MC,KO38JJ,,,,,,12/95 +ES5MG,KO38IJ,,,,,,01/94 +ES5PC,KO38HJ,,,,,1296: remote operated setup: 4.5 m dish 300-350W,10/08 +ES5RE,KO38,,,,,,01/94 +ES5RN,KO38,,,,,,01/94 +ES5RY,KO38JI,,,,,,11/02 +ES5WE,KO38JJ,,,,,,01/94 +ES6DO,KO27WX,,,EX UR1RYY- UR2RDO,,IC756 + IC820H+Preamp ATF54143 + 100/350W 50MHz: 4el - 144MHz: 2M5WL,05/08 +ES6LBN,KO37AW,,,,,144: 170W 11el,07/04 +ES6RQ,KO28WA,EME,,ex UR2RQT UR2RQ,,TS2000 FT736 FT847 144: 2KW 8x17el M2 + 1x 18el,07/05 +ES8AS,KO28FJ,,,,,,04/04 +ES8X,KO18XC,EME,,Expedition,,144: TS790E+PA 300W 2x9 el or FT 847+ PA 300W 9 el Yagi and preamps,07/02 +ET3AA,KJ98JX,EME,,= ZL1RS,,,04/08 +EU1AB,KO33SU,,,EX UC2AAB,,,12/08 +EU6AF,KO35,,,,,,12/07 +EU6MS,KO45IN,,,ex RC2WBH,,144: 16el 700W MGF1302,09/01 +EV2AA,KO33PM,,,,,,01/03 +EV2AAB,KO33ST,,,,,,01/03 +EV2OEU,KO52IK,,,,,,01/03 +EV5M,KO53TP,EME,,Expedition,,144: 4x 9el QRO,08/06 +EV5N,KO42RX,,,Expedition,,,01/94 +EW1CD,KO33SW,,,,,,06/07 +EW1RZ,KO33SV,,,,,,10/01 +EW2ABC,KO33VW,EME,,,,,11/08 +EW6AL,KO46KB,,,Expedition- QSL via EU6MS,,,08/06 +EW6DX,KO45JL,,,,,144: 100W 9el,08/97 +EW6FS,KO35LB,,,,,144: 20W 2x16el F9FT Preamp,01/03 +EW6GB,KO45CN,,,,,144: 200W 10el,08/02 +EW7IM,KO53,,,ex UC2SMM,,,01/92 +EW7IN,KO53,,,,,,01/94 +EW7IW,KO53DR,,,,,,01/03 +EW8DD,KO42QA,,,,,144: 4x16el F9FT- 50W,12/98 +EW8RR,KO41OV,,,,,,09/07 +EY8MM,MM48FI,EME,,,,144: IC706 200W 2x 10el,06/06 +F0DBD,JN08XW,,,,,FT726R 10W 10el Preamp,01/02 +F0DIX,IN93SV,,,,,-,06/07 +F0EJW,IN78VJ,,,,,ICOM 910H Antenne 17 El�ments tonna Pwr:20watts,06/08 +F0FEQ,JN33LN,,,,,,11/06 +F1AFJ,JN06HT,EME,,,,144: 4x11el F9FT 1500 W 0.4dB,11/04 +F1AKK,JN39CC,,,,,,07/01 +F1AOE,IN93RS,,,,,,04/04 +F1CCM,IN93MP,,,,,,01/93 +F1CNE,JN28,EME,,,,,01/94 +F1CXX,JN18AT,,,EX J28EL,,ic910h+11 ele-ft847+dipole+gp 50mhz,05/09 +F1DLZ,JN19FH,,,,,,08/08 +F1DUZ,IN97NJ,EME,,,,144: FT897D 2x 4CX250R 600W 4x 11el LNA 9BV,04/06 +F1DVP,JN12JN,,,,,,08/08 +F1EBK,JN18BW,EME,,,,144: TS790A 300W 4x10el DK7ZB,11/04 +F1EBN,JN18JR,,,,,,08/02 +F1ELL,JN18EX,EME,,,,,01/94 +F1ERG,JN27JJ,,,,,,08/08 +F1FEN,JN25JC,EME,,,,,01/94 +F1FHI,IN97GD,,,,,,01/03 +F1FIH,JN23GS,,,,,,04/03 +F1FLA,JN26KU,EME,,,,144: 4x25el Xpol 7.6lb 1KW MGF1302,10/05 +F1FVP,IN95XA,,,,,,01/03 +F1GHP,IN96LE,,,,,,01/03 +F1GTR,IN96JE,,,,,,01/03 +F1GTU,JN05IF,,,,,144: 160W 13el,05/06 +F1HAR,JN18DT,,,,,,01/93 +F1HQM,JN23LV,,,,,,10/07 +F1IHP,IN88,,,,,,07/02 +F1ISJ,IN97QM,,,,,IC746,10/08 +F1IXQ,JN15MQ,,,,,,12/01 +F1JG,JN23HQ,,,ex FC1JG,,,08/02 +F1JOE,JN05IF,,,,,,01/93 +F1JRD,JN13WO,,,ex FA1JRD,,144: TR751 GS35b 2x11el F9FT,12/04 +F1MBM,JN38CQ,,,,,FT225RD 144: 8877 4CX250 MGF1302 16el F9FT - 432: 100W 21el F9FT,12/02 +F1MOZ,IN93RS,,,,,,11/06 +F1NGP,JN39CC,,,,,,04/97 +F1NNI,IN88,,,,,,04/02 +F1NSR,JN33JK,EME,,,,144: IC275h 2*11EL 2*4CX250,03/07 +F1NWZ,JN17CT,EME,,,,144: FT736R Mutek Front End 4x 10el 7ZB GS35B,03/07 +F1ODA,JN13FO,,,,,144: 400W,10/02 +F1PUX,JN16XL,,,,,TS690S 144: LT2S 200W 20el - 50: 5el,01/99 +F1PYR,JN19DA,,,,,,04/02 +F1PYW,JN38UP,,,,,144: 120W 9el or 2x11el - 432: 17el or Helix,03/99 +F1RAD,JN25WF,,,ex FC1RAD,,50: 5W 1/4wl. - 144: TR751e 25/200W,05/02 +F1RHS,JN03PV,,,,,,11/01 +F1TE,IN94QS,EME,,,,144: 4x 12el 2KW,09/06 +F1VJQ,IN95OL,,,EXPEDITION,,,07/07 +F1VS,JN04FV,,,,,,05/08 +F2TU,JN38LG,EME,,,,,11/01 +F3VS,JN38LF,EME,,,,144: 24x20el (6wl) & 8x20el (6wl) DJ9BVs,03/99 +F4ALP,JO10OP,,,,,,12/01 +F4APX,JN23XL,EME,,,,144: 4*18EL - 432: 4*21EL 2*4CX250,01/04 +F4ARU,IN94VT,,,,,144: 4x3.6wl 1KW 8877,11/01 +F4AZF,JN39GG,EME,,,,144: IC275h 500W 8874 4x 15el,04/06 +F4BKV,IN95PT,,,,,144: TS700 150W 9el - 432: TS440S TRV 70W 21el - 1296: TRV 1W 3x35el,04/02 +F4CIB,JN03,,,,,144: 250W 9el,05/02 +F4CYZ,JN38SF,EME,,,,144: FT897D 400W 2x 9el Yagi,05/05 +F4DDX,JN23QI,,,F0DDX,,FT897 FT817,03/08 +F4DSD,JN23JO,EME,,,,,01/05 +F4DXX,IN97LH,EME,,,,144. 17el 200W,01/06 +F4ERO,JN18JV,,,EX F0ERO,,,12/08 +F4JRC,JN23JW,EME,,,,144: 4x10el,01/01 +F4JVG,JN16UM,,,,,,07/02 +F5ANT,JN24RJ,,,,,,04/96 +F5AQC,JN05PU,,,,,,01/03 +F5BUU,JN03BO,,,,,,01/05 +F5DE,JN05DP,,,,,50: 50W 5el - 144: 100W 16el,08/07 +F5EAN,JN06CP,EME,,,,,01/94 +F5FEN,JN25JC,,,,,,01/03 +F5FHI,IN97GD,EME,,ex F1FHI,,,01/94 +F5FLN,IN94SR,,,,,144: 300W 17el,08/99 +F5FVP,IN95WB,,,,,144: 4x17el 1KW,07/00 +F5GHP,IN96LE,EME,,EX F1GHP FC1GHP FD1GHP FE1GHP,,IC745+transverter 4x14elts DJ9BV 3.6Wl MGF1302B Power 400w,10/07 +F5HRY,JN18EQ,EME,,,,144: 1KW 4x11el,11/02 +F5IF,JN12IL,,,,,,08/08 +F5IVP,JN23QI,,,,,IC706MKIIG 50 W elts F9FT,05/07 +F5JKK,IN87PR,,,= FM5JC,,,08/07 +F5JNX,JN37PV,EME,,,,144: 4x 17el 600W,02/07 +F5JRX,JN25AW,,,,,,01/94 +F5KCR,JN26IX,,,,,,08/96 +F5KDK,JN23VF,,,,,,01/03 +F5KPO,JN24,,,,,,12/01 +F5LEN,JN38BO,,,,,144: IC275A 250W 17elB2,06/05 +F5LKW,JN23SJ,,,,,144: TS700 60W 13el,04/03 +F5LRL,JN26MV,,,,,144: 400W 4x10el,05/02 +F5LUW,JO10MP,EME,,ex F1LUW,,,11/95 +F5MGD,JN07AW,,,,,FT102 + tvtr,05/04 +F5MMX,JN18CN,,,FD1MMX FE1MMX F1MMX SO9MMX SO8MMX,,Home made,11/07 +F5MSL,JN26JS,EME,,ex FC1MSL,,144: 8877 4x11el (or 4x10el) MGF1302,02/99 +F5MZN,IN87BU,EME,,,,,08/96 +F5NWK,IN97EJ,,,ex FD1NWK,,144: 9el 200W,05/04 +F5OIH,JN06,,,,,,08/03 +F5OWL,JN33CC,,,ex FC1OWL,,50w 2x9elts side by side with elevation,08/05 +F5PAU,IN88CB,,,,,144: 4x11el 150W,07/02 +F5RRS,JN36EB,,,,,144: 350W 10el Quad,10/06 +F5RSS,JN36EB,,,,,144: Kenwood TM-255 PA : TE SYSTEMS 1452G (350 Watts) ANT : 10 el. Qubical Quad,10/06 +F5SCL,JN29HP,EME,,,,FT225RD,07/08 +F5SDD,JN23RF,EME,,FD1SDD,,FT901 IC211,01/04 +F5SE,JN29BG,,,,,,06/03 +F5SIB,JN18EB,,,FD1SIB,,,03/09 +F5SJE,JN13,,,,,,12/95 +F5SJP,JN13VQ,,,,,144: TS790 180W 17B2,01/02 +F5VBW,JN03,,,,,,06/95 +F5VHX,JN04FT,EME,,ex F/G8MBI,,,06/03 +F6ANQ,IN94RT,,,,,,07/96 +F6AOI,JN33NQ,,,,,,08/02 +F6APE,IN97QI,EME,,,,144: 17el 200W,11/06 +F6BAZ,JN39EF,,,,,,06/02 +F6BEE,JN08FU,,,,,,01/03 +F6BEG,JN25JS,EME,,,,144: 3wl Antenna 300W,06/08 +F6BKI,IN94,EME,,,,,12/05 +F6CBH,JN19BH,,,,,,12/07 +F6CGJ,IN78RK,EME,,,,144: 4x11el 400W,04/00 +F6CIO,JN26JH,,,,,,09/98 +F6CJG,JN15,EME,,,,,01/93 +F6CKZ,JN09LH,,,,,,01/97 +F6CRP,IN96KE,,,,,50 MHz : 3 el - 100 W 144 MHz : 600 W- 9 el DK7ZB,09/07 +F6CTW,JN18,EME,,,,,01/93 +F6DHI,JN23RK,,,,,144: 200W 9el MGF1302,04/04 +F6DKQ,JN37BI,,,,,,11/08 +F6DKW,JN18CS,,,,,,02/01 +F6DRO,JN03TJ,,,,,2500Watt 18el BF981,03/04 +F6DWG,JN19AJ,,,,,,04/05 +F6DWH,JN19,,,,,,01/95 +F6EAS,IN98,,,,,,08/01 +F6EGV,JN33AQ,,,,,,08/07 +F6EMT,IN98FG,EME,,,,,01/94 +F6EYM,IN99,EME,,,,,12/95 +F6FHP,IN94TR,EME,,ex F1CYO,,144: 1KW 4x6 wl 432: 27el 800W,08/06 +F6FLV,JN18AT,,,,,,02/96 +F6FTN,JN08XS,,,,,TS2000X 144: 4x9el 300W,01/04 +F6GPT,IN94SW,,,,,144: 11el 400W,03/07 +F6GRB,JN25KP,EME,,,,144: 4x 10el 600W,05/06 +F6GUU,JN05CU,,,,,FT857,04/06 +F6HLC,JN26HS,EME,,,,144: gs35b or th308 17elt yagi,09/07 +F6HRO,IN88JQ,,,,,IC910 144: 17el 100W,05/06 +F6HVK,JN27LH,EME,,EX F1AUQ,,144: 4x 17el H or single Yagi 400w / kw,01/08 +F6HYE,JN36DG,EME,,,,,01/94 +F6IFX,JN07CX,,,,,,10/07 +F6ITS,JN33MP,,,,,IC706MK2G 144: 50W quad 8 el 432: 20W quad 2x11el,04/08 +F6IZZ,JN18GR,,,,,,01/03 +F6JXR,IN98HW,,,,,,09/98 +F6KHM,IN78RJ,EME,,,,,06/02 +F6KRK,JN18AS,,,,,144: 17el 120W,08/08 +F6KSX,JN18,,,,,,01/03 +F8BKD,JN38LG,EME,,,,144: TS-2000 4X11 el 1000W,01/03 +F8CS,JN27UR,,,,,,08/98 +F8DNX,IN93FJ,EME,,,,IC-7400. 100 watts. 10 elts (DK7ZB)home made quad(4x10 coming soon),05/08 +F8DO,JN26IF,EME,,,,50: TS680S 5el - 144: FT225 4CX1000 2x11el MGF1302,08/06 +F8DYR,JN07WL,,,F4DYR,,50 / 144 : homebrew,10/08 +F8ENY,JN03RO,,,,,,08/08 +F8IPS,JO00SQ,,,,,,07/00 +F8KFR,JN09RG,,,,,144: 2x9el 1-8KW - 432: 80W 26el doublequad,09/06 +F8OP,JN26MM,EME,,,,50: TS690 100W 6el - 144: FT225RD Mutek 2x4CX350 500W 17B2 Cushcraft,02/05 +F8PKC,JN38MG,EME,,,,144: TS-2000 4x17b2 qro,04/06 +F9HS,JN23AT,EME,,,,144: 4x BVO3WL 8877 MGF1302,10/07 +F9IE,IN86WW,,,,,,05/04 +FA1APX,JN23XL,EME,,,,144: IC970 4 x 22 el DJ9BV 2 x 4CX350F,04/00 +FC1DUZ,IN97NB,,,,,,01/03 +FF6KBF,JN18BW,,,,,,01/03 +FK8HA,RG37FR,,,,,,01/03 +FM5CS,FK94LI,EME,,,,144: 4x 17el B2 1.5KW 8877 LNA 0.5db,05/06 +FO4NK,BH52,EME,,,,,01/94 +FO5RK,BH52,,,,,,01/03 +FR5DN,LG78SS,EME,,,,,12/05 +FS5UQ,FK88LC,,,,,,01/03 +FT5XO,ME40VK,EME,,,,,03/05 +FY5DG,GJ35QD,EME,,,,,01/03 +G0AEI,JO01GO,,,,,,01/91 +G0AFH,JO01EI,,,,,144: 2x17el 400W,01/08 +G0BPU,JO02,EME,,,,,01/94 +G0CHE,IO90PS,,,,,50: 400W 70: 50W,05/07 +G0CUH,IO70LG,EME,,,,144: 500W 10el,04/05 +G0CUZ,IO82WM,,,,,FT726r 50: 50W 2el - 144: MGF1302 2x3CX400A7 5el or 11el - 432: 10W 5el,07/02 +G0DJA,IO93IF,,,EX G6VMQ,,TS2000X SDR1000 FT817,09/08 +G0EVT,IO93GR,,,,,144: IC202S 250Watts 3wl DJ9BV,07/01 +G0FIG,IO90UU,,,,,50: IC575h 6el 400W - 144: IC275h 400W 10el MGF1302 - IC475h 300W 2x19el,05/00 +G0GMB,IO92NB,EME,,,,IC756 PRO II TR144H MGF1302 LNA GS35 PA. Ant: 17 ele F9FT for 2m - 5 ele for 6m - 3 ele for 4m,08/08 +G0GMS,IO82XT,,,,,50: IC746 & IC756pro GS35b pre-amp,04/06 +G0HVQ,IO81UX,,,,,Icom IC7400,04/07 +G0HYP,IO84FN,,,,,FT847 IC1271E 144: 1.5KW 2x17el - 432: 2x21el,09/06 +G0ISW,IO84OQ,,,EX G1MOG,,Kenwood TS-2000 & Create Log Periodic,04/07 +G0JDL,JO02UK,,,,,,01/96 +G0JUR,IO92WT,,,,,,08/99 +G0KAD,IO91VC,,,G1JUZ,,144: FT1000MkV Elecraft XV Transverter 2x 12ele hoembrew GS35,04/07 +G0KAS,IO91UI,,,,,144: IC275h 2x4CX250b 17el Preamp,01/00 +G0KPW,JO02RF,,,,,144: 400W 2x17B2,07/06 +G0KSC,JO01,EME,, +G0KUX,IO91WP,,,,,,11/01 +G0KZG,IO80,,,,,,03/07 +G0LBK,IO93JK,,,,,,01/93 +G0MGA,JO00DT,,,,,,01/93 +G0MJW,IO91JO,,,,,50: 100W 5el - 70: 160W 4el - 144: 2x4CX250b 13el,01/97 +G0NFA,IO91NE,,,,,144: IC271A,04/01 +G0PES,IO83LS,,,,,,11/99 +G0RRJ,IO91FE,,,ex G8OPR,,1296: 100W 55el,04/04 +G0RUZ,IO93FR,EME,,ex G6ZTU,,144: IC746 GS35b 6x 4.6wl. 32JXX X-Pole MGF1801 - 432: 2003 - 1296: 5m Dish TH347,10/02 +G0SAS,IO84OQ,,,,,Kenwood TS-2000,10/07 +G0TPH,IO92IO,,,,,,12/01 +G0UWK,IO83UB,,,ex G1WEM,,FT1000mp 144: TV144/28 GS31b 400W 5WL 432: 2x 6WL GS31b MGF1302,10/06 +G0WUU,IO92SR,,,,,,08/08 +G0XDI,IO91RP,,,,,,11/01 +G1EMJ,IO82WM,,,,,,01/93 +G1GEY,IO94FW,EME,,,,,01/94 +G1KAW,IO91TK,EME,,,,144: 9el 200W,08/06 +G1MOG,IO84OQ,,,,,Kenwood TS-2000,10/07 +G1OGY,JO01GR,,,,,,09/04 +G1SWH,IO83QO,,,,,,10/04 +G1WPF,IO91RP,,,,,144: IC275E Tempo2002 3CX800 9el,08/99 +G1XRL,EN35,,,,,,01/03 +G1YJI,IO91WP,,,,,,11/01 +G1ZJP,IO92WV,,,= M1MHZ,,IC7400 IC1275e IC475H IC202s IC402 TS830s & Tvtrs 4x 12el 400W,11/08 +G3BW,IO84,,,,,,01/93 +G3JHM,IO91LC,,,= F0AKD EI4AW,,50: 100W 5el - 144: 400W 2x13el,05/01 +G3LQR,JO02QF,EME,,,,,01/94 +G3LTF,IO91GG,EME,,,,eme: 6m dish,03/06 +G3NAQ,IO91HL,,,,,50: 400W 3el - 4: 100W 2el - 144: 400W 17el - 70: 250W 21el,08/05 +G3UTS,IO94CU,,,,,144: 400W 9el M2 BF981,02/04 +G3WCS,IO83RH,,,,,144: TS430S HB Transverter HB Amp 2x4CX250B 20el DJ9BV 70: 100W 4el 50: 100W 4el,01/05 +G3WDG,IO92rg,EME,, +G3WZT,IO90UX,EME,,,,IC756PRO 50: 7el 400W - TS2000 144: 2x12el 400W - 432: 1x19el 50W,03/07 +G3YNN,JO00EU,,,,,50: 2-5W 5el - 144: FT736 100W 14el - 432: FT736 25W 11el,05/04 +G3YYD,IO91TR,,,,,FT1000MP Transverter 4CX400 400w to 3wl yagi at 22m AGL,04/05 +G4AEP,IO91NJ,EME,,,,144: 400Watt 17el ATF53045,01/05 +G4AFJ,IO92HO,,,,,144: 150W 10el,09/01 +G4ALY,IO70UL,,,,,,12/03 +G4AOA,IO83TD,,,,,,01/93 +G4APJ,IO83UP,,,G8APJ,,FT736 FT817,10/07 +G4ASR,IO81MX,EME,,,,144: FT221GTi 2x3CX400 17el (4x17el),02/04 +G4BRK,IO91HP,,,,,144: 80W 9el,05/08 +G4CBW,IO83UB,EME,,,,144: TS2000 IC756PROII 4x 9el 800W,01/07 +G4CCH,IO93,EME,,,,5.4m dish. 650W CW or 450W JT,05/07 +G4CJG,IO94CR,,,,,,01/93 +G4CLA,IO92JL,,,,,,09/03 +G4DBL,IO91JJ,,,,,144: IC746PRO 4CX350 300W 17el,11/04 +G4DDK,JO02PA,EME,,,,TS2000X IC275 FT847 FT817 FT290,04/07 +G4DEZ,JO03AE,,,= G4ZDE G9Z,,IC910 and IC7400 various Linears,10/06 +G4DHF,IO92UU,EME,,,,144: K2 txvtr GS35B 8x Yagis 2.2 wl,10/06 +G4DOL,IO80SP,,,,,,04/99 +G4DZU,IO93ES,EME,,,,1296: 800W 3m. Dish,05/07 +G4ERP,IO81XW,,,,,,01/03 +G4FDX,EN60VL,,,,,,01/03 +G4FRE,JO01KK,EME,,,,,01/94 +G4FUF,JO01GN,EME,,,,,04/05 +G4HGI,IO83PL,,,,,144: TS780 GS35b 400W 17el,08/04 +G4HGT,IO83,,,,,,01/93 +G4IGO,IO80NW,EME,,,,50: IC706 300W 6el - 144: IC706 2x 17el 400W,04/05 +G4JCC,IO90MS,,,,,,01/03 +G4JZS,IO91SO,,,G8LZE,,,06/07 +G4KLA,IO92AK,EME,,,,2x11 400w SSB SP-2000 preamp TS790 LinearAMP,12/08 +G4KLX,IO93FB,,,,,,03/04 +G4KUX,IO94BP,EME,,,,,10/07 +G4KWQ,IO92AQ,,,,,144: FT847 400W Preamp 16el Tonna,04/03 +G4LOH,IO70JC,EME,,,,,05/07 +G4ODA,IO92WS,,,,,,01/05 +G4OIG,IO92OG,,,G8CXK,,TS130V - FT736R (50 - 1296) - FT817 - C528,09/07 +G4PBP,IO82WO,,,,,,07/01 +G4PCI,IO91AL,,,,,IC756PRO,01/03 +G4PCS,IO91WV,EME,,,,indoor antennas,10/07 +G4PIQ,JO01MU,EME,,,,144: 2x3CX800 ATF10136 4x15el CueDee,10/04 +G4RGK,IO91ON,,,,,144: 300Watt 17el MGF1302 - 432: 400Watt 8x27el MGF1302,03/01 +G4RKV,JO01OI,,,,,144: IC275E EME Pwr 2x9el MGF1302,01/01 +G4RNL,IO83,EME,,,,,01/94 +G4RRA,IO80BS,,,,,144: 4x10el 400W,08/03 +G4SHC,IO83VO,,,,,,01/93 +G4SSO,IO91TO,,,,,,08/94 +G4SWX,JO02PB,EME,,,,,06/09 +G4VIX,JO01PU,EME,,,,,01/94 +G4VPD,IO92BJ,,,,,,01/90 +G4VXE,IO91QL,,,,,,03/01 +G4WQE,JO01CJ,,,,,,01/03 +G4XBF,IO91QE,,,,,,04/99 +G4XUM,IO83,EME,,,,,10/02 +G4YTL,IO92MB,EME,,,,144: IC275 1KW 4x 5wl DJ9BV,05/05 +G4ZFJ,JO01HO,EME,,,,50: 4Q 400W 70: 4Q 25W 144: 4x 9el KW,01/09 +G4ZTR,JO01KW,EME,,,,144: FT1000MP LT2S 2x4CX250B MGF1302 CC17B2 or 2x9ele OZ5HF,08/05 +G5WQ,IO91DO,EME,,,,ic756pro3 jst-245 ic706mk2g ft100d 4x 11el 500W,10/07 +G6AVK,JO01HO,EME,,,,,10/08 +G6DER,IO93GN,,,,,,01/97 +G6HIE,IO90ST,,,,,,01/09 +G6HKM,JO01FT,,,,,,01/94 +G6RAF,IO92QP,,,,,,10/95 +G6TEL,IO90AR,,,,,,05/04 +G6TUS,JO02AG,,,,,TS-2000 - 100w - 12ele ZL,02/09 +G6UT,JO01BS,,,= M0ITY OK2IT - ex OK2ITY,,,05/06 +G6XRK,IO90RN,,,,,144: IC820H Henry2002 Mutek 15el M2,01/98 +G6XVV,IO93,,,,,,11/95 +G6YAY,IO80EL,,,,,,01/03 +G6YIN,IO93ET,,,,,,01/99 +G6ZTU,IO93HN,EME,,,,,01/93 +G7KQW,IO93,,,,,,01/03 +G7LIJ,JO01GG,,,,,,01/95 +G7NCF,IO81RE,,,,,FT847,05/05 +G7RAU,IO90IR,,,,,144: FT757 Mutek 12el 400W,05/08 +G8APZ,JO01DO,EME,,,,IC-275 or IC475 on every band 144MHz - 24GHz with transverters,10/07 +G8BCG,IO70RK,EME,,= H44PT,,50: IC756POOII 400W 7el,06/06 +G8BHH,IO82WO,,,,,,07/01 +G8CLZ,JO00EU,,,,,50: 2-5W 5el - 144: FT736 25W 9el - 432: FT736 25W 11el,09/01 +G8DKK,IO91VX,,,,,,05/07 +G8DSL,IO90FW,,,,,,01/03 +G8ECI,JO03AK,,,,,50: 5el 300W - 70: 5el 160W - 144: 10el 300W,01/01 +G8GTD,IO93,,,,,,11/01 +G8GXP,IO93FQ,,,,,TS2000X + PAs for 6m 4m 2m 70cms and 23cms (see QRZ.com for details),11/08 +G8IZY,IO91VC,,,,,144: TS700G BF981 4CX250b 250W 9el M2,01/01 +G8LZE,IO91SO,,,G4JZS,,,08/08 +G8LZG,IO93SR,,,,,FT847 or FT100,11/01 +G8MYK,IO92BJ,,,,,IC275H- 100W- 17el,07/02 +G8OPR,IO91FE,,,,,,01/03 +G8PYP,IO90AS,,,,,,01/93 +G8ROU,IO92,,,,,,01/93 +G8RWG,JO01BN,EME,,,,144: FT1000MP DEM144/28 2x8874 MGF1302 9el full elv,05/02 +G8T,IN79JX,,,,,,06/02 +G8TIC,IO82VF,,,,,50: JST245+8877+6el 144: IC7400+1KW+DJ9BV-10el,08/08 +G8TOK,JO01BI,,,,,,04/02 +G8UUR,IO92ET,,,,,144: 80Watts 3ele@10mtrs,07/00 +G8VHI,IO92FM,,,,,50: 100W 4el - 70: 10W 4el - 144: 9el 200W - 432: 2x23el 100W - 1296: 67el 40W,07/04 +G8VR,JO01DJ,,,,,50: 3el 100W,05/03 +G8VYK,JO01FO,EME,,,,144: IC251E MGF1302 180Watts 15 ele Cue Dee 15m,07/05 +G8XVJ,IO83RJ,,,,,144. LT2S 8877 17el M2,08/99 +GB2LBN,IO85,EME,,,,144: 17el 100W,08/00 +GB2LD,IN79JX,,,Expedition,,,08/06 +GB2WQ,IO66,,,Expedition,,,01/92 +GB4IOM,IO74PB,EME,,,,,05/04 +GB4SPT,IO74PB,EME,,,,,05/04 +GB4VR,IO57,,,Expedition,,,01/90 +GB4XS,IO78HA,,,Expedition,,50: IC746 100W 4el - TR9130 - 70: 150W 6el - 144: 2x14el 400W,08/00 +GD0WKX,IO74SD,,,Expedition,,,10/95 +GD4IOM,IO74QD,EME,,,,50: 400W 4x7el - 144: 400W 8x9el - 432: 400W 4x20el,08/01 +GD4UFD,IO74,,,Expedition,,,01/88 +GD7HEJ,IO74SD,,,,,,10/95 +GI0OTC,IO65QE,,,,,,12/00 +GI1JUS,IO74,,,,,,01/93 +GI4KSO,IO64XK,,,,,70: 100W 3el - 144: 300W 8el,07/03 +GI4SNA,IO64XM,EME,,,,144: 4x 12el QRO,02/08 +GI6ATZ,IO74AJ,,,,,144: IC251E Mutek FE 300W 13el,12/06 +GI7UGV,IO74DO,,,= GM7UGV,,FT847 144: 200W 8el,04/06 +GI8YDZ,IO65,,,,,,01/88 +GJ0JSY,IN89XE,,,,,,12/01 +GJ0RUZ,IN89,EME,,Expedition,,,03/02 +GJ4ICD,IN89WE,,,,,,10/98 +GM0BQM,IO85CE,,,,,144: 200W 2x17el,03/02 +GM0EWX,IO67UL,,,,,144: 12el 8874,05/02 +GM0GMD,IO86AE,,,,,,07/00 +GM0HUO,IO86OI,,,,,FT736r 50: 100W 3el - 144: 180W 12el,08/99 +GM0JOL,IO78VM,,,,,,01/93 +GM0ONN,IO87,EME,,,,,03/06 +GM0WDD,IO85JV,,,BECOMING ACTIVE 07/07 -> 6M HOME 2M PORTABLE,,6m - IC756pro2 2m FT-847,05/07 +GM0WDF,IO75PW,,,,,144:TS940 Trsv IC271E 400W 17el,09/01 +GM3POI,IO88OW,,,,,,10/01 +GM3SBC,IO85IX,EME,,,,144: 100W 11el,11/05 +GM3SEK,IO74SR,,,,,,05/07 +GM3UCN,IO85RV,,,,,,04/04 +GM4AFF,IO86ST,,,,,144: 14el Tonna EME-Pwr MGF1302,08/03 +GM4CXM,IO75TW,EME,,,,144: FT736R 3cx800A7 2x9el @ 23m 432: 120w 2x23el Wimo @ 21m 23cm: 150w 4x44el @ 11m,01/09 +GM4ILS,IO87IP,,,,,,07/01 +GM4ISM,IO85AR,EME,,,,FT847,07/05 +GM4JJJ,IO86GB,EME,,,,144: 4x3wl XPOL 8877,05/01 +GM4OGM,IO85,,,,,,01/88 +GM4SIV,IO57RT,,,Expedition,,,07/06 +GM4VVX,IO78TA,,,,,50: TR751E 5W Dipol,04/06 +GM4WJA,IO87MN,EME,,,,,03/07 +GM4YXI,IO87WJ,,,,,,04/00 +GM5RP,IO66,,,QSL via G3SEK,,,08/01 +GM6HGF,IO75QP,,,MM0XPG,,,05/08 +GM6VIU,IO85,,,,,144: TR851E 25W 24el,11/99 +GM6VXB,IO97AQ,EME,,,,6M 400W-7EL 4M 100W-6EL 2M 250W-11EL 70CM 50W-2X19EL 23CM 50W-2X55EL 12CM 10W-80CM DISH 9CM 15W-80CM DISH 3CM 10W-80CM DISH,04/07 +GM7ASN,IO78TA,,,,,,06/95 +GM7LVJ,IO85,,,,,,01/94 +GM8OEG,IO86LL,,,,,,04/06 +GU7DHI,IN89RL,,,,,,12/01 +GU8FBO,IN89QK,,,,,144: 10el 50W,10/06 +GW0KZG,IO82,,,,,,12/98 +GW0PZT,IO72PT,,,,,,01/93 +GW0VWD,IO81EM,,,,,,07/96 +GW3HWR,IO71XN,,,,,FT847 IC910 + Amps - 144: 350W 9el Preamp,08/05 +GW3LEW,IO71PS,,,,,,04/03 +GW3XYW,IO71XR,EME,,,,144: 4x 10el 400W,01/06 +GW4DGU,IO71SV,EME,,,,144: 15.6dBi yagi 750W SSPA 0.4dB HEMT 432: 2x yagi (19.5dBi) 550W SSPA 0.4dB HEMT,05/08 +GW4HDF,IO81JO,,,,,,04/02 +GW4LXO,IO81,,,,,,08/98 +GW4UWR,IO81LP,,,,,,08/99 +GW4VEQ,IO73SG,,,,,,10/02 +GW4VVX,IO81JP,,,,,,06/95 +GW4ZQV,IO81LQ,,,,,,08/97 +GW6TEO,IO71LP,,,,,TS-2000. 50mhz-250W 70mhz-100W 144mhz-300W 432mhz-50W.,05/08 +GW6YAY,IO81LM,,,EX G6YAY,,144: IC821H 300Watts 17ele CC,08/03 +GW7SMV,IO81LN,EME,,,,IC910H 144: 12eleM2 432: 19ele tonna 50: ICOM 746 6ele 1wl yagi,06/08 +GW8ASA,IO81EM,,,,,FT847 IC706 Linears - 144: 220W 9el,02/04 +GW8ASD,IO83LB,,,,,Icom IC756 ProIII with Acom 1000 and 5ele for 6m.Icom IC756 ProII with transverter 100w 4ele 4m. Icom IC910X with linear for 23cm,06/07 +GW8IZR,IO73TI,EME,,EX G8IZR,,144: 2x 9el GS35 .23 dbrx - 432: 4x21Y 350W 1dbrx - 1296: 8W 2m dish,04/06 +GW8KCY,IO71VS,,,,,,04/08 +GW8OQV,IO81QR,,,,,144: FT225-Mutek 2x4CX250b 4x10el DL6WU or 17el,07/98 +GX0SAS,IO84OQ,,,,,Kenwood TS-2000,10/07 +GX4NOK,IO93FR,,,,,,01/03 +GX4WWR,IO91LL,,,,,,01/03 +H40HP,RH29,EME,,EXPEDITION,,144: 18el 1500W Preamp,03/09 +H44HP,QI90,EME,,EXPEDITION,,144: 18el 1500W Preamp,03/09 +H44HP/RI00,RI00,EME,,EXPEDITION,,144: 18el 1500W Preamp,03/09 +H44HP/RI01,RI01,EME,,EXPEDITION,,144: 18el 1500W Preamp,03/09 +H44MS,QI90XN,EME,,= DL2GAC,,144: 18el M2 1 KW,03/08 +HA0DU,KN07VN,EME,,,,,09/07 +HA0HO,KN07SU,EME,,,,144: 6x 10el 3.5KW,12/06 +HA0MS,KN17,,,,,,08/08 +HA1BC,JN87PU,,,= DL1MAJ,,144: 3CX800A7 2x17el,12/00 +HA1FV,JN87JJ,,,HG1KYY,,FT-847 2m: 2x12el 300w 6m: 5el 100w,05/08 +HA1KVM,JN87AL,,,,,,01/03 +HA1KYA,JN87HF,,,,,144: 8x13el DL6WU 200W,11/98 +HA1VHF,JN87GF,EME,,ex HG1W,,,10/98 +HA1W,JN87GF,,,,,,01/03 +HA1YA,JN87GF,EME,,ex HG1YA,,144: 8x13el & 8x14el - 432: 16x32el - 23+13:1.5m dish 6+3: 90cm dish,06/05 +HA2A,JN87,,,,,,12/99 +HA2NP,JN97EO,,,,,,05/01 +HA2RD,JN87WB,,,,,,10/08 +HA2RG,JN86RT,EME,,,,144: FT102 4x 17el DJ9BV 2KW MGF1302,10/06 +HA2RX,JN87,,,,,,12/98 +HA2SX,JN87VC,,,,,144: IC821H 600Watts 11ele,12/98 +HA2VH,JN87WG,,,,,,03/03 +HA3DXC,JN96JO,,,,,144: 5.5WL 2x8877,07/96 +HA3UU,JN96JO,,,,,144: TS711A GS35B 5.5wl 4wl 2wl MGF1100 - 432: FT736R ELH730 3CX800A7 4x10wl MGF1100,09/04 +HA4A,JN96JO,,,ex HA4XT,,144: TS711A GS35B 5.5wl 4wl 2wl MGF1100 - 432: FT736R ELH730 3CX800A7 4x10wl MGF1100,05/04 +HA4KYB,JN97DI,,,ex HG4KYB,,,01/94 +HA4WQ,JN97IF,,,,,,06/03 +HA4XG,JN86GS,EME,,,,144: FT726R 60W 10el Yagi,12/08 +HA4XT,JN96JO,,,,,,01/05 +HA5BSW,JN97JD,,,ex HA3GK,,144: IC706MKII KNW TR751 300w 2x 13ele yagi,07/05 +HA5CAR,JN97,,,,,,07/01 +HA5CBA,JN97OM,,,,,144: HF trsv+conv,04/04 +HA5CRQ,JN97,,,,,,08/02 +HA5CRX,JN97KP,EME,,,,144: IC-7000 GS31 SP2000 3wl DJ9BV-BVO2,12/07 +HA5CW,JN97PM,,,EX HG5CW,,144: FT225RD/Mutech B1016 GS35B 800W 10el MGF1302,11/07 +HA5IW,JN97LN,,,,,,08/01 +HA5KDQ,JN97LN,EME,,,,,07/03 +HA5LV,JN97ML,,,,,144: FT-897 + 300W + 3wl DJ9BV,05/08 +HA5OO,JN97OM,,,,,144: 100w 3wl DJ9BV 50: 5W FD4 HF:100W FD4 HB9CV for 28 MHz,05/07 +HA5OV,JN97NJ,EME,,,,144: FT920+Trnv GS35 1-5KW 4X10 ele. BVO2 MGF1302,06/07 +HA5PT,JN97MK,,,,,FT847,09/08 +HA5RL,JN97PL,,,,,,12/04 +HA5TS,JN97LL,,,,,144: IC-706MKII 8ele,07/04 +HA5UK,JN97OM,,,HA9TE HA5CTA,,144: 300W 10el 3wl,01/08 +HA6NA,JN98VC,,,,,144: 250W F9FT,08/01 +HA6NN,JN98VC,,,,,FT-847 6 ele YU7EF yagi for 2 m 7 ele YU7EF for 70 cm 3 ele DK7ZB for 6 m,01/08 +HA6NQ,JN98WA,,,,,144: 700Watts CF300 DJ9BV 3.2wl,01/05 +HA6NY,JN98WC,,,,,144: 1000W MHP145 17el full el - 432: 40W LNA435 18el full el - 1296: 10W 55el F9FT,12/06 +HA6OQ,JN98JC,,,ex HG6OQ,,,08/98 +HA6VV,JN97WS,,,,,,06/09 +HA6VV/P,JN97WV,,,,,,06/09 +HA6ZB,JN97,,,,,,01/05 +HA6ZV,JN97WH,,,,,,09/04 +HA7JJS,JN97OG,,,,,,10/95 +HA7KPL,JN97OG,,,ex HG7KPL,,,12/95 +HA7MB,KN07BM,,,,,IC-706 Ft200 IC910h Ant.2m-8el Quagi 6m-Moxon HF-Dipole,10/07 +HA7NK,KN07CM,,,,,144: 200W 4x15el 9BV Preamp,06/00 +HA7PL,JN97OG,,,ex HG7PL,,,11/06 +HA7RF,JN97NP,,,,,IC 735 +conv,04/03 +HA7UL,JN97KK,,,,,Yaesu FT847 W3DZZ,05/08 +HA8AR,KN06MQ,,,,,TS790A FT-897D + PA GI7B 3wl DK7ZB,12/07 +HA8CE,KN06EN,EME,,ex HG8CE,,144: GS35b 400W 16 el. DJ9BV CF300,12/05 +HA8CS,KN06BD,,,,,,01/03 +HA8ET,KN06,EME,,ex HG8ET,,,01/93 +HA8KCP,KN08DQ,,,,,,01/03 +HA8V,KN06HT,EME,,,,10w 3el -- 900w 44el -- 75w 92el -- 25w 76el -- 50w 1.2 dish -- 200mw 1.2 dish,10/06 +HA8VF,JN96UW,,,ex HG8VF,,,10/97 +HA9KRL,KN07GT,,,,,,04/05 +HA9MCQ,KN08JC,,,,,144: 150W 14el CF300,06/98 +HA9MDP,KN08DF,,,EX HG9MDP,,FT-736 FT-897,04/07 +HA9OZD,KN08DF,,,ex HG9OZD,,144: TR9130 150W 14el CF300,04/06 +HA9RC,KN08NB,,,ex HG9RC,,,01/94 +HAM3DXC,JN96JO,,,SpecialCall,,144: 5.5WL 2x8877,07/96 +HAM3UU,JN96JO,,,SpecialCall,,144: 5.5WL 2x8877,07/96 +HAM7JJS,JN97OG,,,SpecialCall,,,07/96 +HAM7KPL,JN97OG,,,SpecialCall,,,07/96 +HAM7PL,JN97OG,,,SpecialCall,,,07/96 +HAM8CE,KN06EN,EME,,SpecialCall,,,11/96 +HB2FAP,JN47CE,,,,,144: 16el 1KW,12/00 +HB5OK,JN46LA,,,SpecialCall,,144: FT847 8877 17el MGF 1302,12/98 +HB9ADJ,JN36LH,EME,,,,50: FT-897D + Acom 1000 ant. 3 el 144: FT-857D + PA 200W ant. 4 x 11 Flexa AzEl,04/07 +HB9AOF,JN36LM,,,,,,01/97 +HB9BBD,JN47EE,,,,,,01/03 +HB9BIN,JN37XH,,,HB2BIN HE7BIN,,IC-910/IC-7800,12/08 +HB9BQU,JN37VD,,,,,50: 10W - 144: 200W 17el,08/99 +HB9BZA,JN36BE,,,,,50: FT-847 V-2000 - 144: 3CX800 11Y - 432: 2*8874 19Y,01/04 +HB9CVD,JN36CD,EME,,,,,01/94 +HB9CYN,JN36RX,,,,,144: 30W 7el 10db Gaas,01/99 +HB9DBM,JN47BE,,,qrv at HB9Q,,,03/99 +HB9DDS,JN47IK,,,,,,05/02 +HB9DFG,JN37SM,EME,,,,144: FT100 - 500W - 7el - MGF1302,08/08 +HB9DKM,JN37SL,EME,,,,50: 3el vertical - 144: 150W 2x11el Flexa MGF1302 - 432: 9el X-Quad 100W CF300,03/02 +HB9DLU,JN45LU,,,,,,01/03 +HB9DSU,JN36CG,EME,,ex IK2BHX K2BHX,,,07/05 +HB9DUR,JN46ME,EME,,EX HB9SUL,,NOT QRV FROM HOME,09/07 +HB9EFK,JN46JE,EME,,ALSO CT2JTY AND EX HE9ZLE HB3YIT,,TS-2000X 12el DK7ZB + MGF 1302 / HM GS-31B PA,06/08 +HB9FAP,JN47PH,,,,,144: IC7400 2x18 el Yagi 1KW,07/08 +HB9FMN,JN47CI,,,,,TS-940s TEN-TEC 2m & 6m X-verter FT-897D FT-817ND,08/08 +HB9HLI,JN37JB,EME,,,,,03/07 +HB9HLM,JN36KW,EME,,= CN2DX - EX HB9SAX,,,06/08 +HB9LU,JN46EW,,,,,,06/96 +HB9MM,JN36HP,,,,,,08/02 +HB9MS,JN47PH,EME,,,,144: 8877,12/99 +HB9OCW,JN46LA,EME,,,,50: 4el 10W - 144: 4x13B2 1KW - 432: 2x29el 1KW,10/99 +HB9PJT,JN47FG,,,,,,05/02 +HB9Q,JN47CG,EME,,HB9PMD HB9CRQ,,50: 10W 11el - 144: 15mPb & 8x19el 1KW - 432: 15mPb 1KW - 1296: 15mPb 200W,04/07 +HB9QQ,JN47,EME,,,,50: 2x 5el 144: 17el QRO,10/05 +HB9RUZ,JN47JM,,,,,,12/96 +HB9SJV,JN36BK,,,,,50MHz: 6 el & 2x5/8 vert. 144MHz: 100W 11el,08/07 +HB9SLO,JN36LT,,,,,144: FT736r 1KW 18el LY,04/03 +HB9SNR,JN36MQ,,,,,144: FT736r 800W 12el M2,11/01 +HB9STI,JN47GJ,,,,,,01/93 +HB9STY,JN36IP,,,,,FT690R 50: 150W vert & 5el - 144: 300W 2x15el,07/98 +HB9SUL,JN46LA,,,,,,01/03 +HB9SV,JN45LV,EME,,,,,08/00 +HB9WAH,JN47FD,,,,,50: 10W - 144: 2x 11El 1kW MGF1302 - 432: 2x 18El 1kW MGF1302 - 1296: 4x 24El 10W MGF1302,04/04 +HB9ZGA,JN47CH,,,,,,10/07 +HC5K,FI07NB,,,,,,01/03 +HF75PZK,JO93AC,EME,,SpecialCall,,,01/05 +HG1DLZ,JN87HF,,,,,144: 8x13el 200W MGF1402,12/98 +HG1ZR,JN86KU,,,HA1ZR (1965-1967),,FT 817,01/09 +HG2EAD,JN97,,,,,,01/93 +HG2KNP,JN97,,,,,,01/93 +HG2NP,JN97,,,,,,01/95 +HG3DXC,JN96JO,,,,,144: 5.5WL 2x8877,08/98 +HG3O,JN96JO,,,,,144: 5.5WL 2x8877,08/98 +HG4XG,JN96,,,,,,01/93 +HG5CYT,JN97,,,,,144: FT290r 50W 5el - 432: 25W 11el,01/01 +HG5PT,JN97MT,,,,,,01/93 +HG6KNB,JN98,,,,,,01/93 +HG6KVB,KN07,,,,,,01/93 +HG6NQ,JN98WA,,,,,,01/95 +HG7AJ,JN97,,,,,,01/93 +HG7JAL,JN97KK,,,,,,07/02 +HG7JUV,KN07SP,,,,,,05/09 +HG7P,JN97KW,,,ex HG7B/p,,,04/97 +HG7WJ,JN97MP,,,,,,01/93 +HG9SM,KN08HF,,,,,,07/04 +HG9VHF,KN08EB,,,,,144: TR9130 150W 14el CF300,07/00 +HGM3DXC,JN96JO,,,SpecialCall,,144: 5.5WL 2x8877,07/96 +HGM3O,JN96JO,,,SpecialCall,,144: 5.5WL 2x8877,07/96 +HI3TEJ,FK49EL,EME,,QSL via ON4IQ,,144: 17el 500W,06/05 +HI8ROX,FK58AL,,,,,,01/03 +HK1DX,FJ29EM,EME,,,,144: 200W 17el - 432: 150W 8wl,11/06 +HL4GHT,PM35NU,EME,,,,144: 4x 13el 100W,03/08 +HL5XF,PM45OH,,,,,,01/03 +HP3XUG,EJ88SJ,EME,,EX KG6UH/DU1,,144: 4x 17el 1KW,01/00 +HQ8R,EK87,EME,,EXPEDITION,,,03/08 +HR9BFS,EK66UE,EME,,,,,12/07 +HS0ZIL,OK16bq,EME,,= DL2LAH,,144: QRP 2x10ele DK7ZB,02/09 +HS2CRU,OK03LE,,,,,,01/03 +HV0A,JN61FV,,,,,,01/05 +HV4NAC,JN61,,,Expedition,,,06/99 +I0EMV,JN62BK,,,,,,01/92 +I0FOV,JN62,EME,,,,,11/06 +I0NLK,JN62HB,,,,,FT736 200W 11el F9FT,03/06 +I0UGB,JN62BO,EME,,,,,11/06 +I0UZF,JN63,,,,,,06/00 +I1ANP,JN44VC,EME,,,,IC735+L4B - 144: TS700 4x4cx250b MGF1302 4x16el DJ9BV - 432: IC402+lin 26db horn,03/01 +I1BSN,JN34,,,,,,01/93 +I1CPM,JN34VI,,,,,,01/03 +I1CPN,JN34VH,,,,,,02/04 +I1DMP,JN34XU,,,,,144: 20 el LYagi 17 dBi RX 430K TX 56dbm,03/08 +I1JTQ,JN35UB,EME,,,,144: 2x18el 900W MGF1801,08/01 +I1KTC,JN45HK,EME,,,,,11/96 +I1NDP,JN45AL,EME,,,,,10/08 +I1PIK,JN44TG,EME,,,,FT736R 50: 2x5el- 144: 14+14xpol-el Preamp - 432: 32el HL130 - 1296: 35el,05/07 +I1PSC,JN44MJ,,,,,FT-225rd + 200W-20eI - IC475h-25el - Trsv DB6NT 1296-55el,03/09 +I1TEX,JN35SA,EME,,,,144: 13el 300W,03/08 +I1TXD,JN45,,,,,,01/93 +I2FAK,JN45OB,EME,,,,144: 24x19el LLY YL1056,12/04 +I2FHW,JN45,,,,,,01/93 +I2KBD,JN45PL,EME,,,,,04/07 +I2ODL,JN45KL,EME,,,,144: 4x17el 8877 - 432: 8x21el 3CX800A7 - 1296: 2m dish 2x7289,09/00 +I2OKW,JN45OO,,,,,,08/02 +I2PHD,JN45SL,EME,,,,,12/00 +I2RV,JN45PL,EME,,,,144: 4x 15el KLM,05/06 +I2SVA,JN45,,,,,,01/02 +I2UZV,JN45,,,,,,08/02 +I3DLI,JN65,EME,,,,6x19el 8877 CF379,11/00 +I3LDP,JN55LK,EME,,,,FT-736R + 144 Ampl with 2x4CX250B,04/08 +I3LDS,JN55SR,,,,,,01/90 +I3LGP,JN55WJ,,,,,144: IC746 100W 17el BF960,01/04 +I3LLH,JN65BM,,,,,,04/00 +I3MEK,JN55SJ,EME,,,,,08/07 +I4LCK,JN54RK,,,,,432: FT736 3CX800 Preamp 4x25el LY @ 950m asl (portable: /4 JN54PD),02/08 +I4RHP,JN54QL,,,,,144: TS711+PA500W 17EL,07/04 +I4TTZ,JN54VJ,,,,,,01/03 +I4XCC,JN63GV,EME,,,,144: 4x17el F9FT 3CX800A7 preamp 1db,06/09 +I4YNO,JN54KP,,,,,144: FT-736R MuTek MGF1302 3CX800 20el Shark,08/03 +I5CTE,JN53XG,EME,,,,,02/01 +I5MPK,JN53,EME,,,,,01/94 +I5MXX,JN53JU,,,,,144: 4x4el & 4x9el,10/00 +I5MZY,JN53OT,EME,,,,144: 800W 4x10el BF998,10/04 +I5PPD,JN53PS,EME,,,,10368: 3m Dish 20W,10/00 +I5PPE,JN53NS,,,,,,01/03 +I5TWK,JN53FU,EME,,EX I8TWK,,,02/08 +I5WBE,JN53JR,EME,,,,144: FT736R 4x17el 8877 MGF1302 432: Yeasu FT 847 GS35b 4x26el 1296: LT23S 4x35 el 100W,03/08 +I5YDI,JN54BB,EME,,,,144: FT736 3cx800 2x17el or 4x15el,04/02 +I6BQI,JN72AK,EME,,,,144: 4x16jxx TS2000 8877PA,03/06 +I6PNN,JN72GL,EME,,,,,01/94 +I6QGA,JN63,EME,,,,,01/94 +I6QON,JN63RL,,,,,,01/94 +I6WJB,JN72CK,EME,,,,144: 4x 16el 1 Kw MGF1302,05/05 +I6YPK,JN72,,,,,,01/95 +I7CSB,JN71QQ,,,I2CSB,,TS790-FT847-IC756PROIII,05/08 +I7FNW,JN81GD,EME,,,,,01/94 +I7HCB,JN71VT,,,,,144: 150W 13el,12/01 +I7RNI,JN80,,,,,,01/93 +I8JIT,JN71HN,,,,,,08/08 +I8KPV,JN70KO,EME,,,,,12/06 +I8MPO,JN70FP,,,,,IC746PRO Henry Radio 2002A 13el yagi Landwehr 145MAS 186m asl,09/07 +I8REK,JN70,,,SilentKey,,,01/93 +I8TUS,JM89DE,,,,,,10/04 +I8UZA,JN70AU,,,,,144: FT847 150W 10el BVO3wl,09/02 +I8WES,JN70,,,,,,01/93 +IB0CW,JN60RS,,,EXPEDITION,,144: 250W 12 el Yagi,06/08 +IC8CQF,JN70CN,,,,,50: 100W 4el Yagi - 144: 300W 10el 3wl 9BV,08/05 +IC8EGJ,JN70CN,,,,,,01/89 +IC8FAX,JN70CN,,,ex IW8BZN,,144: FT736r 300W 20el,03/04 +IC8TEM,JN70CN,EME,,,,TS2000 - TS680 - HF VHF - 50mhz 2EL DK7ZB - 144mhz 20el shark - hf vertical gp,07/07 +IH9YMC,JM56XT,,,,,,08/04 +II0W,JN51,,,QSL via IW0BET,,,06/03 +IK0FEC,JN63,,,,,,01/93 +IK0FIY,JN61GW,EME,,,,FT736r 144: 6el 800W MGF1302 - 432: 33el 600W MGF1302,01/00 +IK0FTA,JN61GV,,,,,50: TS680 GaasFet 6el,05/02 +IK0IXI,JN52VB,,,,,Homemade xvtrs for 6m & 4m,06/08 +IK0IXO,JN52WA,EME,,,,,01/93 +IK0OKY,JN61ES,,,,,50: loop quad fractal 100W - 144: 50 w jpole,06/09 +IK0OZK,JN52VC,EME,,,,350W- 2x17el- Preamp,12/99 +IK0PCJ,JN63CL,,,,,,01/03 +IK0RNL,JN61GW,,,,,,01/03 +IK0SMG,JN61ER,EME,,,,,07/06 +IK0SOI,JN62HN,,,,,,06/02 +IK0VKL,JN61GV,,,IW0DRT,,,04/07 +IK0VMO,JN62LH,EME,,,,144: 4x 9el 500W,10/06 +IK0WGF,JN52VC,,,EX IW0DAL,,144: 2x11el 200W,04/07 +IK0XIH,JN61KM,EME,,IW0CQX,,Kenwood TS-2000,06/09 +IK1DPA,JN33VT,,,,,YAESU FT-897D - ant: for 6m 5el F9FT - HF: HyGain DX-88,09/08 +IK1EFM,JN44JK,,,,,,01/93 +IK1EGC,JN35UF,,,,,50: FT650 3-500z 6el 1wl- 144: IC275 16el 4.4wl 4cx250 MGF1302,07/02 +IK1FJI,JN44LL,EME,,,,144: 4x 12el M2 GU78b LNA CA144T PHEMT preamp,08/08 +IK1GYZ,JN35TB,,,,,,11/95 +IK1HJQ,JN33,,,,,,01/90 +IK1HWG,JN44DS,EME,,,,,01/94 +IK1JXY,JN44WC,EME,,,,,08/04 +IK1LBW,JN44VC,,,,,,08/98 +IK1LGV,JN44JK,,,,,144: GS31 MGF1302 15el QD,08/00 +IK1LUT,JN34TW,,,,,,01/93 +IK1MTZ,JN35UB,EME,,,,,08/01 +IK1PAG,JN35SB,,,,,144: IC275h 1KW 2x17el F9FT MGF1302,02/08 +IK1RQT,JN34VP,,,,,,12/01 +IK1SLI,JN35UI,,,,,,01/93 +IK1SPR,JN34TQ,,,,,144: Braun SE400 500W MGF1302 2x 13el,08/05 +IK1UWL,JN33VT,EME,,,,144: 4x 14XPol 700W (1400W in circular pol.),01/08 +IK1YWB,JN34UX,,,,,,04/02 +IK2CDI,JN55GN,EME,,,,144: IC275H 3CX800A7 MGF1302 4x18el,01/00 +IK2CFR,JN54,,,,,,03/01 +IK2DDR,JN55GN,EME,,,,144: IC275H 8877 MGF1302 4x19el LY,01/06 +IK2EAD,JN55EJ,EME,,,,,01/94 +IK2EAE,JN45LL,,,,,144: FT480r 100W 17el,11/01 +IK2FIL,JN45OM,,,,,144: IC275H 9 el. F9FT + SP2000 50W,11/04 +IK2GSO,JN45NP,EME,,ex K2GSO,,IC7400 FT857 50: 1KW 10el 144: 14el DJ9BV,03/05 +IK2JUB,JN45ON,,,,,,03/05 +IK2LHP,JN45SP,,,,,144: TS790 200W 15el - 432: 100W 31el,07/01 +IK2MMB,JN45,EME,,,,,02/05 +IK2OFO,JN45KL,EME,,,,144: 4x17el 8877 - 432: 8x21el 3CX800A7 - 1296: 2m dish 2x7289,09/00 +IK2RTI,JN55AD,,,,,,01/03 +IK2TPX,JN45LL,EME,,,,,01/93 +IK2XRL,JN45NR,,,,,144: FT736r 150W 17el Preamp,01/01 +IK2YXK,JN45OP,,,,,144: IC275h 4CX250 12elM2 DSP59,05/02 +IK3MAC,JN55SH,EME,,,,144: 1100W 24 x 23el LLY + 24x 10el yagi Vert,09/05 +IK3TPP,JN65EP,,,,,,12/04 +IK3VZO,JN55XA,,,,,144: 16el 200W,02/98 +IK4DCO,JN64GB,EME,,,,,01/94 +IK4DCX,JN64GA,EME,,,,144: 4x20el 2.5KW,04/01 +IK4DRY,JN64BL,,,,,,04/01 +IK4FMT,JN54WG,,,,,144: TS790 2M5WL 4CX250 MGF1302 20dB,01/00 +IK4JOC,JN54WN,EME,,,,,01/94 +IK4NMF,JN54SM,EME,,,,,01/94 +IK4PLU,JN64FC,,,EX IW4ASW,,,10/07 +IK4PMB,JN54MM,EME,,IW4CET,,50: X-Verter 10W Dipole - 70: OZ X-VERTER 3el DK7ZB - 144: FT225RD MUTEK or TS850+X-Verter 8877 11el F9FT 14XP WiMo,10/07 +IK4WLV,JN54XK,EME,,,,,02/98 +IK5AMB,JN53FU,,,,,,11/98 +IK5JWQ,JN52NS,EME,,,,,08/98 +IK5OEA,JN53PG,,,,,,12/04 +IK5OIY,JN52NT,,,,,,03/96 +IK5QLO,JN53FU,,,,,,04/08 +IK5WJD,JN53PR,EME,,,,432: 4 x 26 elements Yagi hor Pol. - LNA 0.25 dB NF - 8877 1 KW PA - 1296: Septum Feed Cavity LNA 0.35 dB NF 3 meters solid Dish,07/06 +IK5ZUI,JN53RD,,,,,144: TS700G 11el 250W BF981,07/97 +IK6EIW,JN63RJ,EME,,,,,10/95 +IK6FHF,JN63,,,,,,01/93 +IK6IHM,JN72,,,,,,01/95 +IK6MLI,JN62UT,,,,,144: FT736 4x11el KLM Booster 8930,07/99 +IK6MMJ,JN63RL,,,,,,10/95 +IK6WDY,JN62XK,,,,,kenwood ts 790e ant. 2el quad,05/08 +IK7EZN,JN90DG,EME,,,,144: 4x 16el JXX 1 KW,04/05 +IK7UXY,JN90DC,EME,,IW7BPW,,IC-756PRO2/Xverter h.m./16jxx/8877,06/09 +IK7XLW,JN80FT,EME,,,,144: 16JXX 250W,03/06 +IK8BIZ,JN70GR,,,,,,08/08 +IK8ETN,JM89CH,,,,,144: ic275e 4x150 17f9ft,01/04 +IK8IUQ,JN70MM,,,,,,01/03 +IK8MKK,JN71DC,,,,,,01/95 +IK8TOY,JM89CH,,,,,,08/04 +IK8XLD,JN70VP,EME,,,,144: 11el GaasFet,09/00 +IK8YOQ,JN70GR,,,,,,04/09 +IK0BZY,JN61GW,,,,,07/09 +IK0BZY/MM,JN50AX,,,,,07/09 +IK0BZY/P,JN62GA,,,,,07/09 +IN3AGI,JN56,,,,,,01/03 +IN3ATM,JN56NK,,,,,,01/02 +IN3DOV,JN65WS,,,,,,01/93 +IN3FFN,JN56,EME,, +IN3KLQ,JN56RG,EME,,,,144: 180W 17el,04/00 +IQ2CJ,JN45ON,,,,,IC 275H - GS35 - 2 x 13 DJ9BV,03/05 +IQ3AZ,JN65QQ,EME,,,,144: 4x 8el 800W,10/08 +IQ4DF,JN45,EME,,,,,10/05 +IS0/DF2ZC,JN40TJ,EME,,EXPEDITION,,144: TS2000 2x 9 ele M2 2x GU74b by LZ2US,03/09 +IS0/DH7FB,JN40TJ,EME,,EXPEDITION,,144: TS2000 2x 9 ele M2 2x GU74b by LZ2US,03/09 +IS0AGY,JM49OF,,,,,144: IC211E 4CX350b 17el Gaas,07/05 +IS0BDB,JN40GT,,,,,,05/04 +IS0CAK,JM49,,,,,,01/04 +IS0CBC,JM49NH,,,IW0ULG,,,04/07 +IS0EBO,JN40GR,EME,,ex IW0UEI,,144: Icom gs35 3wl ant,03/06 +IS0GQX,JM49OH,,,,,,05/05 +IS0SWW,JN40GR,,,,,,02/04 +IT9BLB,JM68QE,,,ex IW9AJZ,,144: 2x15el 3CX800 MGF1302,08/06 +IT9CHU,JM76IV,EME,,,,,01/09 +IT9CJC,JM76IW,EME,,,,IC706MKIIG 120W 10EL DK7ZB - EME SETUP 4X10 8877 MGF4919G,06/09 +IT9GSF,JM67SS,,,,,,01/94 +IT9GSV,JM77LH,,,,,,04/01 +IT9IPQ,JM78SG,EME,,,,ic756pro ic275 ic475 transv,04/02 +IT9LCY,JM77NO,,,,,,01/93 +IT9TYR,JM78QF,EME,,IW9CER,,IC 756 pro II - Knw TS790 E - IC 706 MKII,04/09 +IV3BBR,JN65TW,,,,,,04/07 +IV3CYT,JN65TW,,,,,,06/09 +IV3DXW,JN65QQ,,,,,144: 4CX250 - 16JXX2 4.5WL,08/03 +IV3GBO,JN66OA,EME,,,,,01/02 +IV3GTH,JN65RU,EME,,,,50: FT897 5/8 vertical - 144 MHz: FT897 160W 16 el F9FT,06/07 +IV3HWT,JN65ST,EME,,,,144: FT101zd Trvt 8877 4x18el 4x20el,08/04 +IV3KTY,JN65QQ,,,,,,04/07 +IV3MPI,JN65SV,,,EX IW3QMB,,IC746 IC271E Mutek FT736R PHEMT144 PHEMT: 50: 2x 6el 9BV 500W - 144: 4x12el 6WU 500W - 432: 4x21el F9FT,03/06 +IV3NDC,JN65RV,,,,,144: 100W BF981 2x15el 3.3wl,04/07 +IV3SIX,JN65RU,,,EX IW3QYG IW3RI,,50: 6el/HyGain 144: 4x17el 432: 4x21el,05/07 +IV3VFP,JN66HD,EME,,,,,01/93 +IV3ZCX,JN65QS,EME,,,,144: Icom 275 PA 600Watts MGF1302 4x24el,01/90 +IW0AKA,JN61FS,,,,,,01/90 +IW0AYO,JN61IU,,,,,144: 16el,07/96 +IW0BTS,JN61GU,,,,,,01/88 +IW0BZD,JN61FS,,,,,,10/07 +IW0CUT,JN61TP,EME,,,,,01/93 +IW0CVK,JN61GV,,,,,,01/05 +IW0DJB,JN61,,,,,,04/02 +IW0DVG,JN61KK,,,,,,01/93 +IW0FFK,JN61FS,,,,,,04/07 +IW0GDC,JN61HX,,,,,,10/98 +IW0HLE,JN61WK,,,,,,08/08 +IW0QNX,JN62,,,,,,01/97 +IW0QO,JN63EC,,,,,,01/93 +IW0RBS,JN63FD,,,,,,01/93 +IW0RLC,JN63FD,,,,,,06/00 +IW1ARB,JN44CV,EME,,,,144: 4x4.4Wl lt2s 3cx1500,03/01 +IW1AZJ,JN35UB,,,,,144: 200W 3.8wl DJ9BV,06/00 +IW1BCV,JN44FS,EME,,,,144: IC275H 2x18el MGF1302 8877,08/08 +IW1CGB,JN35VG,EME,,,,50: 3el PA - 144: 4x17el 2x4cx250b MGF1302,06/97 +IW1CHX,JN35TH,,,,,144: C58 13el DJ9BV MGF1302 170W,04/02 +IW1DIM,JN35TC,,,,,,07/01 +IW1DJS,JN35SA,,,,,,08/01 +IW1FTY,JN35UA,,,,,,01/03 +IW1GLM,JN34PT,,,,,,08/08 +IW2BNA,JN45ON,,,,,144: IC275H 3CX800 4x11el - 432: IC475H 8930 23ele - 1296: IC1275 2C39 4x23ele,01/04 +IW2BSQ,JN45UJ,,,,,144: IC746 !7el,04/03 +IW2BZY,JN45NN,,,,,144: 500Watts 2x12ele Flexa,08/01 +IW2DAL,JN45NN,,,,,144: TenTec OII - TR144H +40 - 4x19LLY 4CX1000a,06/08 +IW2DMN,JN45KL,,,,,144: 100W 15el,10/02 +IW2DUA,JN45LL,EME,,,,,01/93 +IW2FZR,JN45WE,EME,,,,144: 9el 500W,06/09 +IW2FZR/P,JN56AE,EME,,JN56BE FOR EME,,1296: 4 mt dish VE4MA th308 400 W at feed/ 144 9el 500W,06/09 +IW2HAJ,JN45NO,,,,,50: IC706 6el - 144: IC 275H + GS35B 2X13 EL Preamp,09/08 +IW2HUS,JN45NO,,,,,,04/02 +IW2HWQ,JN55GK,,,,,144: FT736r 80W 21el,10/96 +IW2LLA,JN55AM,,,,,144: 2x17el 100W,08/96 +IW2MYV,JN45JN,,,,,144: TS711E 4CX250 GaAs 4x7el + elv.,01/02 +IW2NEF,JN46QD,,,,,144: FT847 12elXY,11/02 +IW2NOR,JN45ON,,,,,ICOM IC275H KENWOOD TS 2000 144: 100W 2x17el F9FT,06/04 +IW3BKQ,JN56NH,,,,,,07/02 +IW3HRT,JN55TG,,,,,,08/08 +IW3QTG,JN65PT,,,,,144: IC746 2x 17FT,08/04 +IW3SGT,JN65VP,,,,,,05/07 +IW3SNU,JN65OT,,,,,,11/04 +IW4ADT,JN54,EME,,,,,01/94 +IW4AR,JN64FD,,,,,,01/03 +IW4ARD,JN64FD,EME,,,,144: IC756PRO3 TXV-DB6NT 3CPX1500A7 4x8XP pre PHEMT full elevation 432: TS-2000X GS23B 4x18el pre PHEMT full elevation,01/09 +IW4AZY,JN54ML,,,,,IC275 ft817 ic706 hm xverter 2 x 20 yagi many other depending location,04/07 +IW4BET,JN54QL,,,,,,08/02 +IW4BLG,JN54VF,EME,,,,144: 4x10el k5gw 900w,01/04 +IW4BTJ,JN54QL,,,,,,01/03 +IW4CB,JN54XK,,,,,,02/01 +IW4DJE,JN64,,,,,,01/95 +IW4DLA,JN64CE,,,,,,01/94 +IW4DMH,JN64CJ,,,,,,11/98 +IW4DQY,JN64AG,,,,,,03/04 +IW4EHV,JN64AE,EME,,,,IC7400 144: 16el 432: 21el,11/07 +IW4EHZ,JN54ML,EME,,ex IW4BTE,,IC706MKIIG 20EL70CM 12EL2MT 6EL6MT,03/05 +IW4EJK,JN54ML,,,,,ICOM IC910 - 144: 2X CROSS YAGI 10EL - 432. 2X CROSS YAGI 19EL,04/08 +IW5ACZ,JN53HP,,,,,50: TS2000 HB9CV 144: TR751E 4CX250 250 WATT 12el,10/04 +IW5BLG,JN54VF,,,,,,01/03 +IW5BML,JN52JW,EME,,,,,04/99 +IW5BPE,JN52NT,,,,,,01/93 +IW5DHN,JN53GI,EME,,,,TS2000 4x 7el,04/06 +IW5DNZ,JN53,,,,,,05/02 +IW5EJM,JN53HA,,,,,,08/08 +IW5EKJ,JN54AA,EME,,EX IW1CCH,,144: IC-756 PRO2 TRSV GS31 or 3CX800,09/07 +IW6AEG,JN63RO,,,,,,10/93 +IW6BLH,JN63RO,,,,,,12/00 +IW6BNO,JN63RL,,,,,,11/95 +IW7DEC,JN81GF,,,,,144: 12db yagi 100W Preamp,08/04 +IW8QOT,JM88BR,,,,,,01/03 +IW9ELR,JM68PD,,,,,,11/02 +IW9FRA,JM68GA,,,,,,01/05 +IY1GMN,JN33VT,EME,,SPECIALCALL,,,06/09 +IZ0ARL,JN61IU,,,,,144: 200W 16el,10/96 +IZ0AYB,JN52VC,EME,,,,IC-910H 144: 4x12JXX - 432: 2x19 Tonna,05/04 +IZ0CVK,JN61GV,,,ex IW0CVK,,YAESU FT767mod YAESU FT221R mod 2x8el DJ9BV 4CX250 MGF1801,09/06 +IZ0FWE,JN62IQ,,,,,,08/08 +IZ0GYP,JN61GT,EME,,,,144: 9el 250W,11/06 +IZ1ANZ,JN45FH,,,,,,05/07 +IZ1BPN,JN34OT,EME,,ex IW1CGB,,144: 150W 9el dj9bv MGF1801 50: TS680 3el,03/06 +IZ1DBY,JN45FW,,,IW1FRO,,Icom IC706mk2g Yaesu FT847 FT817,06/07 +IZ1DXS,JN35UA,,,ex IW1FTY,,ICOM IC-7400 (746 PRO) - 50: 6el - 144: 14el,11/02 +IZ1EGT,JN44LK,,,ex IW1RDT,,IC910 100W 2.5 Wl ant,02/05 +IZ1ESM,JN45FB,,,ex IW1ESM,,KWD TS850 + LT2S MK2 + 4.4wl BV,09/02 +IZ1MKR,JN44FH,EME,,,,,01/09 +IZ2AAJ,JN45,,,,,,12/99 +IZ2DJP,JN55FO,,,,,,05/04 +IZ2EEQ,JN45,,,,,,07/02 +IZ2FOB,JN45MQ,,,ex IW2DVK,,50:5w dipole 144:150W 2x9ft MGF1302 432:4x21 ft-MGF1302-GS35b 1296:xverter50w-35ft,05/05 +IZ2GOL,JN45OL,,,ex IW2LC,,ICOM IC-761 IC-756 IC-275H YAESU FT-897 FT-847 FT-817 KENWOOD TS-480HX TS-790E,03/05 +IZ3KGJ,JN65IN,EME,,,,144: 2x 19el LLY,01/09 +IZ4AIK,JN63HV,,,ex IW4CYM,,50: 100W 5el - 144: TS790 3CX800A7 TS850 & Trvt MGF1302 17el,07/01 +IZ4BEH,JN54WL,,,,,144: 1KW 2x16el MGF2407 - 432: 2x21el 300W - 1296: 57el loop 60W - 2320: 53el loop 20W,10/02 +IZ4BEJ,JN64CE,,,ex IW4DCT,,144: 2x13el gd Pwr,11/97 +IZ4GWE,JN64BL,,,EX IW4EOQ,,,12/07 +IZ5BXF,JN53GV,EME,,ex IW5DRA,,300W- 4x11el 2.2wl- 0.3dbNF,01/01 +IZ5EME,JN52NS,EME,,ex IW5AVM,,144: 4x20el 8877 - 432: 4x25el 3CX800 - 1296: TH338 4x55ft,04/01 +IZ5GNS,JN53CX,EME,,ex IW5CNS,,144: IC275H 4x10el 2.2wl 9BV 8877 MGF1302,08/05 +IZ5MAO,JN54AA,EME,,IW5EKJ,,Transverters-GS35-2x4cx250r-2x9dk7zb-4x25jxx70,09/07 +IZ8AZB,JN70EP,EME,,ex IW8CVV,,144: 4x11el 8930(400W),01/02 +IZ8DWL,JM88BR,,,ex IW8QOT,,144: IC-746 PA 4CX250 16JXX LY MGF1302,04/04 +IZ8IBB,JN70FP,,,,,,08/08 +IZ8IFV,JN70KO,,,,,,08/08 +J44XG,KM19KE,,,EXPEDITION,,,09/07 +J45M,KM46CF,EME,,Expedition,,144: FT100 FT847 IC706 DSP59/Datong audiofilters 3CX800 4x10ele X-pol 3wl MGF1302 NF 0.3dB,06/01 +J48PL,KN20IN,,,Expedition,,,07/06 +J79MY,FK95,EME,,,,4x Yagi- 1.5KW,06/98 +JA0BBW,PM97LV,EME,,,,144: 4x 13el 150W,10/07 +JA0BLU,PM97OS,EME,,,,144: 1KW 4x19el 2x18el MGF1801,01/00 +JA0VI,PM95,EME,,,,,01/03 +JA1DXA,PM95VU,,,,,,01/03 +JA1RJU,QM06CB,EME,,,,50: 2x 14el 1KW - 144: 2x 14el 50W,12/06 +JA1VZV,PM95QL,,,,,,01/03 +JA2HMO,PM85IH,,,,,,01/03 +JA2JRJ,PM84MW,EME,,,,,01/00 +JA2KRW,PM85NE,EME,,,,,01/03 +JA2TY,PM84GS,EME,,,,,01/03 +JA3BXC,PM74SU,,,,,,01/03 +JA3IAF,PM74,EME,,,,,01/03 +JA3SGR,PM74TU,EME,,,,,01/03 +JA4BLC,PM65NM,EME,,,,2320: 6m dish 300W,04/06 +JA4CMZ,PM65MI,EME,,,,,01/03 +JA4KLX,PM95RI,,,,,,01/03 +JA5NNS,PM63,EME,,,,,01/03 +JA5OVU,PM74FC,EME,,,,,01/03 +JA5YJS,PM63,EME,,,,,01/03 +JA6AHB,PM53CP,EME,,,,432: 7m Dish 1KW,11/05 +JA6CZD,PM53FM,EME,,,,2320: 5m dish 150W,04/06 +JA6DZI,PM53GM,EME,,,,,01/03 +JA6XED,PM53,EME,,,,,01/03 +JA6ZHR,PM53,EME,,,,,01/03 +JA7BJP,QM07GN,,,,,,01/03 +JA7BMB,PM97WM,EME,,,,,01/03 +JA7JJN,PM95RQ,EME,,,,,04/09 +JA8ERE,QN02QX,EME,,,,2320: 6m dish 180W,04/06 +JA8IAD,QN03,EME,,,,2320: 5m dish 180W,04/06 +JA8PL,QN03,EME,,,,,01/03 +JA9BOH,PM86FA,EME,,,,144: 4 x 2.8 mt,04/04 +JD1BLY,QL17CC,EME,,EXPEDITION,,,01/08 +JD1BMP,QL17CC,EME,,EXPEDITION,,,01/08 +JE1KFX,QM06IR,EME,,,,144: 4x 18el 500W,05/05 +JE1TNL,PM95PH,EME,,,,2m IC910D+GU74B 4x13ele 70cm IC910D+3CX800A7 4x20ele,08/08 +JE2XBY,PM84MS,EME,,,,,03/05 +JE5FLM,PM74AH,EME,,,,144: 2x 13el Vert 50W,10/06 +JF3HUC,PM74UX,EME,,,,,01/03 +JF3IPR,PM74,,,,,,01/03 +JG2BRI,PM84LW,EME,,,,,04/05 +JH0ISW,PM97LO,,,,,,01/03 +JH0MHE,PM96HI,EME,,,,144: 4x 18el M2 500W,12/05 +JH0QBI,PM97FF,,,,,,01/03 +JH0WJF,PM86,EME,,,,,12/07 +JH0YSI,PM85VJ,EME,,,,,03/01 +JH1EFA,PM96UB,EME,,,,,01/03 +JH1KRC,QM06AW,EME,,,,PO 500 watts exc. 3cm 300 watts 4.4m dish,03/06 +JH1OFX,PM85SM,EME,,,,,01/03 +JH1OQW,PM95UX,,,,,,01/03 +JH1SWD,QM06HN,,,,,,01/03 +JH1XUJ,PM95UR,EME,,,,,01/03 +JH2COZ,PM49NW,EME,,,,144: IC821 4x14el 3.6wl ITT-4651 tube 3SK129 Preamp,09/06 +JH2OJS,PM85LD,,,,,,01/03 +JH3EAO,PM74KR,EME,,,,,01/03 +JH3VJV,PM74LP,,,,,,01/03 +JH4JLV,PM54LA,EME,,,,,01/03 +JH5FOQ,PM63JS,EME,,,,144: 4x 28 Xpol 1KW,08/06 +JH5LUZ,PM63FK,EME,,,,,01/03 +JH6RTO,PM53FA,,,,,,01/03 +JH7PAV,QM07DI,EME,,,,,01/03 +JH7SIA,QM09EN,,,,,,01/03 +JH8CMZ,QN12MN,EME,,,,144: 2x 13el 500W,11/08 +JH9TJT,PM86HK,EME,,,,144: 2x 11el V 50W,11/06 +JI1FLB,PM95WS,,,,,,01/03 +JI1MNT,PM95QH,,,,,TS-870S,03/09 +JI1NJC,QM06FL,,,,,,01/03 +JI3GER,PM75XA,EME,,,,,01/03 +JI4POR,PM65NK,,,,,,01/03 +JJ1NNJ,QM06GH,EME,,,,,01/03 +JJ1VOM,PM95,,,,,,01/03 +JJ3JHP,PM75XD,EME,,,,144: 2x 11el,11/06 +JK1HIX,PM95WH,EME,,,,4x17el 8877,03/99 +JK1KTY,QM05DK,EME,,,,144: 2x15 2.75wl 200W,01/06 +JK1LYP,PM95,,,,,,01/03 +JK1XDX,PM95,,,,,,01/03 +JK7IKU,QM09BR,,,,,,01/03 +JL1ZCG,PM59UM,EME,,,,TS790 4CX1500A 16x 2.5WL V-POL YAGIS,03/99 +JM1GSH,QM06IS,EME,,,,144: 4x 11el 500w,04/05 +JM1LQW,PM96QA,,,,,,01/03 +JM1MQE,PM95RP,,,,,,01/03 +JM1SZY,PM95SO,EME,,,,,08/05 +JM1WBB,QM05DX,EME,,,,144: IC-910D 2 x GU74B 4 x 2M32XP 432: IC-910D 50W 2X720,08/08 +JN1BMX,QM06FM,,,,,,01/03 +JN1CSO,PM95SW,EME,,,,144: 12x 15el H/V 2000W,01/03 +JN1JFC,QM06AD,EME,,,,,03/08 +JN4FNZ,PM54QD,EME,,,,144: 2x 13el 800W,01/90 +JO1LVZ,PM95RT,EME,,,,144: 4x 9el 50W,05/06 +JO3FUO,PM74RT,,,,,,06/07 +JO3JJN,PM85AC,EME,,,,,01/03 +JO3RNL,PM74TT,EME,,,,,01/03 +JR1EDE,PM95TG,EME,,,,10368: 1.8m Dish 40W,02/01 +JR1EUX,PM95TO,EME,,,,,01/03 +JR1RCH,PM96SI,EME,,,,,01/03 +JR2HCB,PM85NC,EME,,,,50: 2x 10el,04/05 +JR3REX,PM74LQ,,,,,,01/03 +JR4AEP,PM65RH,EME,,,,,01/03 +JR4BRS,PM65,EME,,,,,01/03 +JR5JXV,PM86XG,,,,,,01/03 +JR5UOY,PM64XF,,,,,,01/03 +JR6EXN,PM53FH,EME,,,,50: 4x 8el Yagi.full elev. Homebrew 1000W,01/09 +JR6LDE,PM53FS,,,,,144: 12el 50W,06/06 +JR7VXF,QM09AK,,,,,,01/03 +JR9NWC,PM85BW,EME,,,,,01/03 +JS3CTQ,PM74UN,EME,,,,144: 4x 11el 500W,05/06 +JS3SIM,PM74VW,EME,,,,,01/03 +JW5E,JQ78QF,EME,,,,144: 2 x 10Xpol 800w,02/08 +JX7DFA,IQ50OV,EME,,QSL via LA7DFA,,TS2000,08/00 +K0AWU,EN37ED,EME,,,,144: 800w 1x 4wl 13el Yagi,11/06 +K0AZ,EM37CD,,,,,144: 800Watts 17B2,09/01 +K0BLR,EN25UO,,,,,,01/03 +K0CB,EM27,,,,,,01/03 +K0CIO,EM07,,,,,,01/03 +K0CJ,EN34IS,,,,,,01/03 +K0CQ,EN32EC,,,,,,01/03 +K0CXJ,EN26,,,,,,01/03 +K0DAS,EN42,EME,,,,,01/03 +K0FF,EM49HO,,,,,50: 1-5KW 7el or 4x6el - 144: 1-5KW 2x17el M2 or 4x17el,01/01 +K0FQA,EN35FE,,,,,,01/03 +K0FZG,EN36,,,,,,01/03 +K0GCJ,EN43,,,,,,01/03 +K0GEI,EM49,,,,,,01/03 +K0GRM,DN96OT,,,,,,01/03 +K0GU,DN70MQ,EME,,,,144: FT1000DEM 8877 4x17elB2 SSB Preamp,01/01 +K0HH,EM48,,,,,,01/03 +K0HU,EN10,,,,,,09/99 +K0HWE,EN41BX,,,,,,01/03 +K0IDC,EN12TL,,,,,,01/04 +K0IDT,EN10PS,,,,,,01/03 +K0IK,EN34JR,,,,,,01/04 +K0ILC,EN36,,,,,,01/03 +K0IR,EN25,,,,,,01/03 +K0JO,EN34,,,,,,01/03 +K0KE,DM79,,,,,,01/03 +K0KFC,EN34,,,,,,01/03 +K0KJX,EM48,,,,,,01/03 +K0KP,EN36VW,EME,,,,50M:7 ele 100 144: 5WL 1.5 KW,10/07 +K0KQY,DM98,,,,,,08/00 +K0LGI,EN42,,,,,,01/03 +K0LLS,EM29,,,,,,01/03 +K0MQS,EN31UH,,,,,,01/03 +K0NG,EN10,,,,,,01/03 +K0NL,EM48MK,,,,,,01/03 +K0NY,EN44DB,,,,,,01/03 +K0OG,EM47CW,,,,,FT100D 50: 100W G5RV 144: 50W 3el beam,10/06 +K0PFX,EM48SR,,,,,,01/03 +K0PG,EN61AU,,,,,,01/03 +K0PJ,EN34,,,,,,01/03 +K0PS,DM59VG,,,,,,01/04 +K0PW,EN34CV,EME,,ex NJ0M,,144: 1.5KW 2x17el 5lb MGF1302,09/01 +K0RDF,EM29,,,,,,01/03 +K0RI,DM78PX,EME,,,,144: 1x 17el KW,06/05 +K0RL,EM49HU,,,,,,01/03 +K0RP,DM88AD,,,,,50: 150W - 144: 150W - 222: 110W - 432: 110W - 1296: 10W,01/01 +K0RRY,EN36,,,,,,01/03 +K0RZ,DM79JX,,,,,,01/03 +K0SDH,EN34JS,,,,,,01/03 +K0SE,EN34,,,,,,01/03 +K0SHF,EN34JV,,,,,,01/03 +K0SM,EN10RT,,,,,144: 160W Preamp 13B2,01/01 +K0SQ,EN35,,,,,,01/03 +K0TAR,EN34,,,,,,01/03 +K0VM,EN42,,,,,,01/03 +K0VSV,EN41LK,,,,,50: 8W 5el - 144: 170W 12el,01/98 +K0WLU,EN13XS,,,,,,01/03 +K0XP,FN31,,,ex KO0U/1,,144: 350W 3219 - 222: 450W KLM16,01/02 +K0XXX,EM46FF,,,KD5LUN,,IC-746 FT-736R,05/07 +K0YW,DM67ED,EME,,,,,03/06 +K0ZPO,EM15,,,,,,01/03 +K1ABC,FN42,EME,, +K1DS,FN20JE,EME,,,,144: 10el 120W,07/06 +K1FO,FN31QJ,EME,,,,,01/03 +K1IM,FN31WX,,,,,,01/03 +K1JT,FN20QI,EME,,,,144: 4x 14XP 1KW,01/08 +K1MS,FN42,,,,,144: 1KW 2x M2 5wl,01/01 +K1OR,FN42IR,EME,,,,144: 4x 13el no elevation 1500W - 432: 1500W,02/08 +K1OYB,FN43TP,,,,,,01/03 +K1POP,FN51,,,,,,01/03 +K1RC,FN42HQ,,,,,,01/03 +K1RO,FN31,,,,,,01/03 +K1RQG,FN54LM,EME,,,,,04/05 +K1RS,EN53wb,EME,, +K1RZ,FM19JH,,,,,,01/03 +K1SG,FN42FE,EME,,WA1AYS,,50 MHz: IC756PRO 3-1000Z Terrestrial: 2 x M2 6M2.5WLC EME: 4 x 6M5X w/full elevation.,09/07 +K1TEO,FN31,,,ex WA2TEO,,144: 800W 4x12el - 222: 500W 2x23el,01/01 +K1TR,FN42IU,,,WA1OAM,,,05/07 +K1UHF,FN31FH,EME,,ex KD1DU,,144: 1-5KW 4x12el - 222: 500W,01/01 +K1VOW,DM25VF,,,,,,01/03 +K1ZE,FN41,,,ex WA1HYN,,144: 300W 2x4218 - 222: 60W 220B - 432: 400W 2xK2RIW,01/98 +K2AAX,FN12CS,EME,,ex KA2RDO,,144: 4x 9el 400,11/05 +K2AH,FN20,EME,,,,,01/03 +K2AXX,FN12CS,EME,,,,144: TS-930S Transverters 4x 9el 400W - 432: TS-830S Transverters,11/05 +K2BLA,EL99IA,EME,,,,144: 400W 8x 2.5WL,04/05 +K2DH,FN13FB,EME,,,,,01/08 +K2DRH,EN41VR,EME,,ex KA2DRH,,144: 2x 18el 1KW,03/07 +K2DRM,EN41VR,EME,,,,144: 2x 18el 1KW,06/06 +K2EVW,EM96SS,,,,,,01/03 +K2GAL,FM29PH,EME,,,,,01/98 +K2LME,FN31UI,EME,,,,,10/98 +K2OS,FN13CD,EME,,,,,12/00 +K2OVS,FN30,,,,,50: 250W 6el - 144: 200W single yagi - 432: 60W single yagi,01/01 +K2PGB,FN20,,,,,50: TS680S 10W 3el - 144: IC251A 80W 13B2,01/01 +K2STO,EL88PH,,,,,,01/03 +K2TXB,FM29PT,EME,,,,144: 2x KLM 16LBX 28,04/05 +K2UYH,FN20QG,EME,,,,432: 28 dish 1KW,09/05 +K2VEE,EM79WP,,,,,,01/03 +K2WKA,FN20RF,,,,,,01/03 +K2YAZ,EN74AV,,,,,,01/03 +K2ZD,FN21NR,EME,,,,50: 7el QRO,12/07 +K3ACE,FM29DR,,,,,,01/03 +K3AX,FN20,EME,,,,,01/00 +K3BFA,FN10XI,,,,,144: 1-5KW 4x15el,01/01 +K3CB,FM18VR,EME,,K6LEW,,Orion,02/09 +K3DJC,FM19LL,,,,,,01/03 +K3EAR,FM19HX,,,,,,01/03 +K3EOD,FM29LL,,,,,,09/06 +K3FOR,FM19SB,EME,,,,,01/03 +K3FU,FM18,,,,,,01/03 +K3GNC,FM29KX,,,,,,01/97 +K3HZO,FN20AG,,,,,50: 350W 5el - 144: 350W 17el - 432: 100W 24el,01/98 +K3IB,FM19UU,EME,,,,50: 200W 6M5XX - 144: 1-5KW FO12 - 222: 300W - 432: 300W 2xRIW,12/07 +K3JT,EM99XO,,,,,,01/03 +K3JYD,FM18,EME,,,,432: 4x 19el 400W 144 2 x K1FO-15 1500W,05/07 +K3LFO,FM19,EME,,,,,01/03 +K3LOW,EN91BK,,,,,,01/03 +K3MF,FM19XP,EME,,,,432: 8x 25 K1FO GS23b 1500w,01/08 +K3ROJ,FM19SH,,,,,,01/03 +K3SIW,EN52,,,,,,01/03 +K3TKJ,FM28EM,,,,,,01/03 +K3TUF,FN10WE,,,,,,01/04 +K3TV,FN20EP,,,,,,01/03 +K3UZY,FN20,,,,,,01/03 +K3VLQ,EM92,,,,,,01/03 +K4AL,EM66QF,EME,,,,144: 15el 400W,05/05 +K4AR,EM76,EME,,,,432: 8x28el (9lb) Yagis 1-5KW 0.25db,01/00 +K4BTY,EM66,,,,,TS-870 TS-850 FT-736R,05/09 +K4CSO,EM73,,,,,,01/03 +K4DD,EM60NP,,,,,,01/04 +K4DRF,EM74QA,,,,,,01/03 +K4DXA,EM95pe,,, +K4EJQ,EM86,,,,,,01/03 +K4EME,FM08JF,EME,,,,432: 8x 33el 800W,09/05 +K4FJW,EM86,,, +K4HJE,EM96,,,,,,01/01 +K4JAF,EM70EK,,,,,,01/03 +K4KAE,FM02AT,,,,,,01/03 +K4KO,EM66UD,EME,,,,144: 100W 15el,05/06 +K4MRW,EM64PW,,,ex WB4AXQ,,,01/01 +K4QF,EM64,,,,,,01/03 +K4QI,FM06,EME,,,,,08/05 +K4QXX,EL87RM,,,,,,01/03 +K4RF,EM84DJ,,,ex WS4F,,,01/01 +K4SDI,EM56TQ,,,,,,01/03 +K4SSO,EM48SR,,,,,144: 160W 16el,01/02 +K4SSP,EM47,,,,,,09/99 +K4TAX,EL96WF,,,,,,01/03 +K4VJ,EL96LX,,,,,,01/03 +K4WRI,EL98LM,,,,,,01/03 +K4WY,FM18IS,EME,,,,IC-7000xvcr to 2MPX20 xpol yagis(2) Commander II amp avg 500watts out preamp etc,11/08 +K4XR,EM64NL,EME,,,,144: 2x 18el QRO,09/04 +K4YA,EM25,,,,,,01/03 +K4YNT,EM74KW,EME,,,,,02/05 +K4ZFY,EL18,,,,,,01/03 +K5AIH,EL09TK,EME,,,,,01/98 +K5AM,DM62NI,EME,,,,144: 1x 17el 1500W,11/06 +K5APM,EM10BL,,,,,,01/03 +K5AZU,EM40SN,EME,,,,,01/03 +K5BYS,EM13,,,,,,01/03 +K5CBL,EM15,,,,,,01/03 +K5CFM,EM15,,,,,,01/03 +K5CM,EM25,,, +K5CPZ,EM15,,,,,,01/03 +K5CZD,EM32VN,EME,,,,144: 2x 13el 375W,05/06 +K5DNL,EM15LJ,EME,,,,50: 7el 144: 2x 17el 400W,04/07 +K5EGW,EM30,,,,,,01/03 +K5EWS,EM10,,,,,,01/03 +K5FA,EM44,,,,,,01/03 +K5GE,EL09,,,,,,01/03 +K5GMX,FN31NU,EME,,,,144: 4x 13el 600W,04/05 +K5GNA,EM20,,,,,,01/03 +K5GW,EM13PA,EME,,,,144: 48x10el,04/05 +K5IS,DM96,,,,,,01/03 +K5IUA,EL29CD,,,ex KB5IUA,,,01/01 +K5JL,EM15DQ,EME,,,,,01/05 +K5LLL,EM10KF,,,,,,03/07 +K5LZO,EM20,,,,,,01/03 +K5MAT,DM65,,,,,,01/03 +K5MQ,EM31WQ,EME,,,,144: 17B2 1500W,11/06 +K5OGE,EM20UX,,,,,,01/01 +K5PHD,EM12,,,,,,01/03 +K5PHF,DM61,,,,,,01/03 +K5PJR,EM37KA,EME,,,,1296: 4m dish 300W 0.2db lna,09/06 +K5QE,EM31,EME,,,,144: 8x 18el M2 QRO - 432: 19x 9wl,11/06 +K5QQ,DM65SB,,,,,,01/03 +K5QXJ,EM30XA,,,,,,01/03 +K5RFI,EM16,,,,,,01/03 +K5RHR,DM65UV,,,,,,01/03 +K5RUS,EM32VM,,,,,,01/03 +K5SO,DM66XW,EME,,,,1296: 250W 8.6m dish 0.2db LNA,04/06 +K5SXK,EM12,,,,,,01/03 +K5TN,EM15,,,,,,01/03 +K5TNP,EM32,,,,,,01/03 +K5TTT,EM26CH,,,ex KB5ZUD,,,01/02 +K5UHF,EM10DJ,,,,,,01/03 +K5UJC,EM20VB,,,,,,01/04 +K5VH,EM00XE,,,,,,01/03 +K5WO,EM12,,,,,,01/03 +K5WPN,EM14AL,,,,,144: 100Watt 11el cushcraft 50: omni 432: 50watts 11el M2,05/07 +K5WXN,DM61,EME,,,,,01/03 +K5YPV,EM54MR,,,,,,01/03 +K5YY,EM26,,,,,144: 1KW 13el,01/03 +K5ZMJ,EM12,,,,,,01/03 +K5ZMS,EL09,,,,,,01/03 +K5ZSJ,EM12,,,,,,01/03 +K5ZXE,EM14KL,,,,,,01/03 +K6AAW,CN80TE,EME,,,,144: 4x15el 3wl 1.2KW MGF1302,06/06 +K6ALF,CM97BH,,,,,,01/03 +K6CYS,DM12KT,,,,,,01/03 +K6DV,DM13NI,EME,,,,,01/03 +K6FQ,DM12NL,EME,,,,144: 4x7ele crossed 1.3KW,03/05 +K6HLH,DM14CP,EME,,,,,05/07 +K6IAH,DM12,,,,,,01/03 +K6IBY,DM13,EME,,SILENTKEY,,,10/08 +K6JEY,DM03WT,EME,,,,432: 4x25el K1FOs 500W 0.4db,10/06 +K6KL,CM97,,,,,,01/03 +K6LEW,FM18LT,EME,,,,,11/00 +K6MBY,CN88KD,,,,,Icom 746 144: M2 17 el 3000K ERP,09/07 +K6MXI,CM88QL,,,,,,01/03 +K6MYC,DM07DB,EME,,,,144: 4x 32XP M2 1KW,04/07 +K6PF,DM13AR,,,,,144: FT726r 175W 4xM 2MXP20,01/01 +K6QXY,CM88QL,EME,,,,,10/05 +K6SUE,CM98AK,,,,,144: 650W 2x17el- 222: 120W 7wl- 432: 175W 2x9el,11/99 +K6UCY,FN42HM,EME,,,,4x 25el 1KW,03/07 +K6UIY,DM14,,,,,144: FT726r 1KW 2Yagis,01/97 +K6UM,CM88,,,,,,01/03 +K6ZX,CN82GM,,,,,144: 160W 2x2M9,01/97 +K7AD,DN06ID,EME,,,,144: 4x 14el 1kW,10/05 +K7BV,FN31VI,EME,,,,50: 1000w 4x7el,03/05 +K7CA,DM37,EME,,,,144: 8x 16el 1500W,09/08 +K7CAI,DN27KF,,,,,,01/03 +K7CW,CN87LJ,EME,,,,6m kW 8elem - 2m kW 16elem,04/07 +K7FB,DN17HN,EME,,,,400W 11db ant,05/07 +K7IEY,CN88,,,,,,03/98 +K7JA,DM03XS,,,,,144: 190W 19el,01/98 +K7KX,DN55,,,,,,01/03 +K7LNP,DN30,EME,,,,,09/99 +K7MAC,DN13SN,EME,,,,50: 7el 1000W 144: 4x 15el 1500W,09/05 +K7MDL,CN87XT,EME,,,,144: 2x 3wl 300W,04/05 +K7MI,CN73TC,EME,,,,144: 4x 17el 500W,12/07 +K7ND,CN87QF,,,,,144: 1KW 2x5wl M2,01/01 +K7NEP,DN53NF,,,ex N2NEP,,FT1000MP 144: HM 1KW PA 13el,01/98 +K7OO,DM04,,,,,,01/03 +K7PVT,CN88SA,,,,,,01/03 +K7TRM,DM33VP,,,,,,01/03 +K7UOP,DM33XN,,,,,,01/01 +K7UV,DN31XM,,,,,,01/03 +K7WIA,CN87TR,EME,,,,,03/05 +K7WUP,DM49IG,EME,,,,,01/03 +K7XC,DM09NM,EME,,EX NC7K KD7DH A35WZ,,50: IC746 100W 6el 144: IC746 350W 18xxx 222: xvtr 400W 27el 432: IC706IIG 300W 33el,05/07 +K7XD,CN85,EME,,,,144: 400W 2x23el,01/97 +K7XQ,CM97QI,EME,,ex KO6RD,,50: 2x 7el 1KW - 144: 4x 2MPX18 Xpol 3lb 1.5KW MGF1302 - 432: 4x 9wl 1KW,10/06 +K7XW,CN96XI,EME,,,,50: 1-5KW 5el - 144: 600W 2x3.5wL - 222: 50W 5wl - 432: 200W 4x5.3wl,01/01 +K7YVZ,DN13TL,,,ex KC7YVZ,,144: 1-5KW 4x18XXX 2x13el Quagi Preamp - 432: 350W 4x38el,01/01 +K7ZL,CN84JC,,,,,144: 150W 36foot yagi,01/98 +K8BHZ,EN75DB,,,,,144: 1-5KW 4x17B2,01/98 +K8DGY,EN63WW,,,,,,01/03 +K8EB,EN73CB,EME,,,,144: 1500W 2x 18el,12/05 +K8EME,EN72EH,EME,,ex NP4C,,144: FT847- 4x11el 2.2lb- 8877 (1-5KW),03/00 +K8GUN,FM09WH,EME,,WB8VAZ,,ICOM,04/07 +K8IE,EN52,,,,,,01/03 +K8ISK,FM18DV,EME,,,,,01/03 +K8MD,EN82,,, +K8MM,EN83IB,,,,,,01/04 +K8RAY,EN72XK,EME,,,,144: 4x 9el 400W,10/07 +K8ROX,EN80LO,,,,,,01/03 +K8SD,EN12,,,,,,01/03 +K8TL,EM89CV,EME,,,,144: 360W 2MXP28,12/07 +K8UC,EM99EG,EME,,,,,01/03 +K8UK,EN82LK,EME,,,,,01/03 +K8VEB,EN72NN,,,,,,01/03 +K8VP,EN91,EME,,ex KB8ZW,,,07/01 +K8XK,EN42,,,,,,01/03 +K9AKS,EN41,,,,,,01/03 +K9AM,EN52,,,,,,01/03 +K9BCT,EL96UE,EME,,,,,01/03 +K9BMB,EM69OG,,,,,,01/03 +K9CA,EN61ML,,,,,,01/03 +K9CFA,EN52,,,,,,01/03 +K9CT,EN50BQ,EME,,,,IC7800 IC756 ProII Demi xvtr LunarLink 4x18 XXX Demi LNA,09/07 +K9DMW,EN52UI,,,NT9E,,756PROII(6m) 910H(144/432),09/07 +K9DQ,EN62AS,,,,,,08/06 +K9DRO,EN54fn,,, +K9DTB,EM89,,,,,,01/90 +K9DX,EN52XC,EME,,,,144: 8x 19el Amp. 8877,09/06 +K9EA,EN94CB,,,,,,09/01 +K9EK,EM79BF,,,,,,01/03 +K9FYV,EN41,,,,,,01/03 +K9HJZ,EN50ES,,,,,,01/03 +K9HMB,EN52VI,EME,,,,,12/00 +K9HSK,EN51,,,,,,01/03 +K9IJ,EN52,,,,,,01/03 +K9ILT,EN61AU,,,,,,01/03 +K9IMM,EN52,,,,,,01/03 +K9IMX,EM38,,,,,,01/03 +K9IZV,EN53,,,,,,01/03 +K9JK,EN52XC,,,,,,01/03 +K9KFR,EN71GG,EME,,,,,01/03 +K9KHW,EN63AD,,,,,,01/03 +K9KL,EN64,,,,,,04/06 +K9KNW,EL96EC,EME,,,,,03/05 +K9MB,EM57,,,,,,01/03 +K9MRI,EN70IU,EME,,,,144: 8x m2 yagis and 1.2kw,04/05 +K9MU,EN44HW,EME,,ex KB9UZV,,,01/06 +K9NS,EN52RL,,,,,144: 2M18XXX,05/06 +K9OQN,EN52,,,,,,01/03 +K9PO,EN52VF,,,,,,01/03 +K9PW,EN52,,,,,,01/03 +K9SLQ,EN70KK,EME,,,,432: 16x FO22 1.5 KW,07/07 +K9SM,EM59EE,EME,,,,144: 4x 9el 500W,11/05 +K9SQL,EM69RF,,,,,,01/04 +K9TI,EN51,EME,,,,144: 4x K1FO 12 el PA 8877,02/01 +K9VHF,EN53,EME,,,,144: 17el 400W,05/05 +K9VNM,EN63,,,,,,01/03 +K9VS,EN52,,,,,,01/03 +K9XI,EN61,,,,,,01/03 +K9YR,EN52,,,,,,01/03 +K9ZZH,EN61,EME,,,,,01/03 +KA0EWM,EN30,,,,,,01/03 +KA0KCI,EM17,,,,,,01/03 +KA0KUY,EM07XD,,,,,,01/03 +KA0MOW,EM17,,,,,,01/03 +KA0MR,EM18GE,,,,,,01/03 +KA0MWA,DM79LL,,,,,,01/03 +KA0NNO,EM24TL,,,,,,01/97 +KA0OGU,EM29,,,,,,01/03 +KA0PQW,EN33,,,,,,11/01 +KA0RYT,EN34DW,EME,,,,,01/02 +KA0UZZ,EN34,,,,,,01/03 +KA0Y,EN41,EME,,,,,08/00 +KA0YSQ,EN42,,,,,,01/03 +KA0ZOZ,EN23,,,,,,01/03 +KA1JBG,FN42,,,,,,01/03 +KA1OTP,FN41,EME,,,,,01/03 +KA1R,FN42NE,EME,,,,,05/09 +KA1VHF,EM89LL,EME,,,,144 2x 17el 1KW,10/06 +KA2DRH,EM64KT,,,,,,01/03 +KA2HZO,FM29US,,,,,,01/03 +KA2KQM,EM74QA,,,,,,01/03 +KA3DQD,FM29DO,,,ex N3ZWW,,Ten-Tec 526 ICOM 735,03/06 +KA3HED,FM27,,,,,,01/03 +KA3WSZ,FM29GK,EME,,,,,01/03 +KA4WJA,EL89WE,,,,,,01/03 +KA5AAE,EM06,,,,,,01/03 +KA5AIH,EL29NW,EME,,,,,10/96 +KA5DWI,EM12JU,,,,,Yaesu FT-290R FT-726R and FT 747GX,01/09 +KA5PVB,EM13,,,,,,01/03 +KA5TQY,EM43,,,,,,01/03 +KA5UEL,EM12,,,,,,01/03 +KA5UEV,DM93,,,,,,01/03 +KA5ULI,EM30,,,,,,01/03 +KA5WMJ,DM96,,,,,,01/03 +KA5WRG,EM15,,,,,,01/03 +KA5YJJ,EM44NN,,,,,,01/03 +KA6NBC,CM98,,,,,,01/03 +KA7V,DN14MA,,,,,144: 13B2 1500W,11/03 +KA8EDE,EM79,,,,,,01/03 +KA8HOK,EM89LL,EME,,,,144: 2x 19el 600W,10/06 +KA8HQL,EM89VU,,,,,,01/03 +KA8SFP,EM12,,,,,,01/01 +KA8SSB,EM79,,,,,,01/03 +KA8TER,DN43AL,,,,,,01/03 +KA9CFD,EN40OM,,,,,,08/05 +KA9LDS,EN51,,,,,,01/03 +KA9LLF,EM71,,,,,,01/03 +KA9LNP,DN30,,,,,144: 800W KLM13LBA,01/01 +KA9MGR,EN41,,,,,,01/03 +KA9OIL,EN62,,,,,,01/03 +KA9UVY,EM58NG,,,,,,01/03 +KA9YCB,EM57QQ,,,,,,01/03 +KB0BFI,EM29LL,,,,,,01/03 +KB0BVR,EN26AH,,,,,,01/03 +KB0CY,DM79,,,,,,01/03 +KB0EMR,EN31,,,,,,01/03 +KB0FHP,FN20GE,,,,,,01/03 +KB0FRX,EN10,,,,,,01/03 +KB0G,DM79PA,EME,,,,,09/06 +KB0GL,EN35,,,,,,01/03 +KB0GR,EM29,,,,,,01/03 +KB0GU,EM28TW,,,,,,01/04 +KB0HH,EM07QD,EME,,,,,01/04 +KB0IKP,EN25UQ,,,,,,01/03 +KB0LRI,DM79,,,,,,01/03 +KB0LXX,DN96,,,,,,01/03 +KB0MNK,EN34IW,,,,,,01/03 +KB0NR,EN35OG,,,,,,01/03 +KB0OBT,EN35KB,,,,,,01/03 +KB0OZN,EN34,,,,,,01/03 +KB0PYO,EN24GP,,,,,,01/97 +KB0THN,EN44DB,,,,,,01/03 +KB0TZA,EN35ID,,,,,,01/03 +KB0USF,DM79LR,,,,,,01/03 +KB0VUK,EN34PK,,,,,,09/01 +KB1CJ,FN42JG,,,,,IC746 50: 100W 2el - 144: 100W 13el,09/03 +KB1DFE,FN42ES,,,,,,01/03 +KB1HGB,FN53EU,,,,,,01/03 +KB1LKB,FN31RS,EME,,,,144: 2x 12el 300W,09/06 +KB2AH,FN20,,,,,,01/03 +KB2M,FM29PE,,,,,,01/03 +KB3EDF,FM18RH,,,,,,04/07 +KB3HWO,FN10UB,,,,,,01/03 +KB3PD,FM29,EME,,,,,01/03 +KB3PMR,FN10,EME,, +KB4FQ,FM04GR,,,,,,01/03 +KB4RSM,EM66OG,,,,,,01/03 +KB4WM,EM63,EME,,,,,01/03 +KB4ZGO,FM06BQ,EME,,,,144: 160W 13B2,08/05 +KB5DAK,DM96,,,,,,01/03 +KB5EK,EM15,,,,,,01/03 +KB5MR,EM26,,,,,,01/03 +KB5MY,DM13NC,,,,,,01/03 +KB5UBE,EM12LQ,,,,,,01/03 +KB5ULP,EM15,,,,,,01/03 +KB5VL,DM73RK,,,,,,01/03 +KB5VQQ,EM15,,,,,,01/03 +KB5WII,EM15,,,,,,01/03 +KB5WMY,EM32,,,,,,01/98 +KB5YAJ,EM14,,,,,,01/03 +KB5YUA,EM44,,,,,,01/03 +KB5ZMY,EM12,,,,,,01/03 +KB5ZUD,EM26,,,,,,01/03 +KB6IGC,DM15DO,,,,,,01/03 +KB7FUV,DN44,,,,,,01/93 +KB7XO,DN41AB,,,,,,01/03 +KB8GC,EN74HD,,,,,,01/03 +KB8JVH,EN80,,,,,,01/03 +KB8O,EN82JJ,,,,,,03/00 +KB8RQ,EM79SV,EME,,,,144: 8x 19el M2,03/05 +KB8U,EN71SW,EME,,,,,01/06 +KB8VAO,CM87XW,EME,,,,,02/09 +KB8ZUZ,EN83JL,,,,,,01/03 +KB8ZW,EN91IJ,,,,,,01/03 +KB9GPW,EN61,,,,,,01/03 +KB9II,EN52WA,,,,,,01/03 +KB9KCJ,EN52,,,,,,01/03 +KB9MLA,EN61CX,EME,,,,18el- 160W,10/98 +KB9NKM,EN70NS,EME,,,,144: 4x 13el 1KW,11/06 +KB9NLM,EN53UO,,,,,,01/03 +KB9PCL,EN41,,,,,,01/03 +KB9PJL,EN44DV,EME,,,,144: 400W 18el,11/06 +KB9Q,EN52VV,,,,,,01/03 +KB9RQZ,EM59,EME,,,,144: 13el 100W,07/06 +KB9TLV,EN45MW,,,,,,01/03 +KB9UMT,EN50DP,,,,,,01/03 +KB9VQC,EN53,,,,,,01/03 +KB9VUG,EN52,,,,,,01/03 +KB9YXF,EN61,,,,,,01/03 +KB9ZK,EN62,,,,,,01/03 +KC0AKJ,EN42,,,,,,01/03 +KC0AMG,DM98GK,,,,,,01/03 +KC0BMF,EN31BE,EME,,,,50: 5ele 100W 144: 13el 100W,12/08 +KC0CHW,EN41IN,,,,,,01/03 +KC0CRE,DM28,,,,,,01/03 +KC0FTQ,DM79OB,,,,,,01/03 +KC0FXY,EN34,,,,,,01/03 +KC0HLN,EN32tl,,, +KC0HTB,EN34JT,,,,,,01/03 +KC0LBT,EN35IB,,,,,,01/05 +KC0LMS,EN34IW,,,,,,01/03 +KC0MLS,EM19QU,,,,,,01/03 +KC0OG,EN10,,,,,,01/03 +KC0P,EN34SB,,,,,,01/03 +KC0QR,EN10,,,,,,01/03 +KC0UWS,DN70KE,EME,,,,50: 3el,08/05 +KC0Y,DM79,,,,,,01/03 +KC2TN,FM29NS,,,,,,01/03 +KC3AK,FM19UU,,,,,,01/04 +KC3RE,FM18DP,EME,,ex TF3XUU TA3/KC3RE,,144: 280W 0.5dB 15el can elevate manually to 10 eme from car - 432: 110W 0.5dB 19 el can elevate manually to 30,04/06 +KC4PX,EL98QG,EME,,,,,06/05 +KC4VI,EL88SD,EME,,,,144: 4x 3.5wl 1000W,05/05 +KC5BQS,EL29,,,,,,01/03 +KC5BRO,EM15,,,,,,01/03 +KC5LOW,EM22,,,,,,01/03 +KC5NOA,EL08,,,,,50: 150W 5el - 144: 100W 10el - 432: 20W 19el,01/01 +KC5NOB,EL07,,,,,50: 10W 5el - 144: 170W 8el - 432: 10W 19el,01/01 +KC5UOO,EM26,,,,,,01/03 +KC5WX,EM13LB,,,,,,01/03 +KC5YKX,EL17HS,,,,,Icom 746 w/ DEM 22 and 432 xverters 50: 5el - 144: 13el - 222: 15el - 432: 25el,05/02 +KC5ZXE,EM45AM,,,,,,01/03 +KC6A,DM03,EME,,,,,01/03 +KC6TEU,CM98MQ,,,,,,01/03 +KC6WFS,DM04RK,,,,,50: 100W 5el - 144: 100W 2x12el - 432: 50W 2x18el,08/01 +KC6ZWT,CM98NO,EME,,,,144: 300W 17el M2 - 222: 250W 15el - 432: 150W 19el,10/08 +KC7MRP,CN88,,,,,,01/97 +KC7OTV,CN84KA,,,,,,01/03 +KC7V,DM43AS,EME,,,,Rig Kenwood TS2000 Amp Antenna Works 8877 Ant 4 x 2M5WL,10/06 +KC8CCD,EM79VM,,,,,,01/03 +KC8DLL,EN66,,,,,50: 150W M25 - 144: 200W 2x13B2 - 432: 100W KLM,01/98 +KC8GYW,EM79,,,,,,01/03 +KC8NST,EN91QB,,,,,,01/03 +KC8OIT,EN83,,,,,,07/01 +KC8QVO,EM79VP,,,,,,11/05 +KC9AAX,EN52,,,,,,01/03 +KC9AER,EN52,,,,,,01/03 +KC9AYO,EN52,,,,,,01/03 +KC9BTW,EN52,,,,,,01/03 +KC9CMT,EN63LA,,,,,,01/04 +KC9ELU,EM79hj,,, +KD0BT,EN41,,,,,,01/03 +KD0DW,DN70LF,,,,,,01/03 +KD0HE,EN00,,,,,,01/03 +KD0KUK,EN35dw,,, +KD0LO,EM48,,,,,,01/03 +KD0PY,EN41UX,,,,,144: IC275A 2516g 150W 13el - 432: IC471H 70W 15el,01/01 +KD0SU,DM78,,,,,,01/03 +KD1DU,FN31FH,EME,,,,,01/03 +KD3UY,FM19LG,EME,,,,144: 2x 4WL antenna 1KW,05/05 +KD4ESV,EL87RH,,,,,,01/01 +KD4FNB,FM17TD,,,,,,01/03 +KD4LT,EM81CG,EME,,,,,01/03 +KD4MZM,EL87RG,EME,,,,50: FT107m - 144: FT726r 170W 19el,07/01 +KD4NOQ,EM55BE,,,,,,01/03 +KD4NUD,EM91HB,,,,,,01/03 +KD4TJN,EM55CE,,,,,,01/03 +KD5FFW,EM12,,,,,,01/03 +KD5FZX,EM12MP,EME,,,,,01/03 +KD5HIO,DM65UV,EME,,,,,01/03 +KD5KJD,EL29IR,,,,,,01/04 +KD5LDQ,EM26IH,,,,,,01/03 +KD5LWU,DM66AU,,,,,,01/03 +KD5OMJ,EM04UO,,,,,,01/03 +KD5OUG,EM12,,,,,,01/03 +KD5QQU,EM12QX,,,,,,01/03 +KD5QWO,EM15AJ,,,,,Yaesu ft-847,01/04 +KD5XB,DM84,,,,,,12/06 +KD7ETC,DM54AH,,,,,,01/04 +KD7YZ,EM88,,, +KD9KX,EN42,,,,,,01/03 +KE0MO,EN41,,,,,,01/03 +KE0UQ,EM29,,,,,,01/03 +KE2N,FM18EW,EME,,G0VSN,,432: 16x 28el 1000W,08/07 +KE3PL,FN20PM,,,,,,01/03 +KE4ENX,EM84GM,,,,,,01/03 +KE4IKM,EM73,,,,,,01/03 +KE4KDB,EM55,,,,,,01/03 +KE4MKW,EM84DJ,,,,,,01/03 +KE4VUN,EM67MS,,,,,,01/03 +KE4WBO,FL96VW,EME,,,,222: 4x 16el 120W,10/06 +KE4YH,EL88OA,,,,,,01/01 +KE4YYD,EL97RV,,,,,,09/06 +KE5CO,EL29,,,,,,01/03 +KE5ML,EM15,,,,,,01/03 +KE6NDG,CN90QJ,,,,,,01/03 +KE6PT,CM88UE,,,,,,01/03 +KE7CX,CN85LJ,,,,,,01/03 +KE7NR,DM33WM,EME,,,,144: 4x 13el KW 432: 2x 28el 1KW 50MHZ 5 ele L/B & KW,05/07 +KE7NS,DN41AF,,,,,,01/02 +KE7OI,DN13SU,EME,,,,,01/01 +KE7V,CN88JB,,,,,,01/04 +KF0AU,EN31HI,,,,,,01/03 +KF0CK,EM38JC,,,,,,01/03 +KF0DS,DM41,,,,,,01/03 +KF0FE,EN41,,,,,,01/03 +KF0M,EM17HO,EME,,,,,01/01 +KF0OA,DM79,,,,,,01/03 +KF0Q,EN44EA,,,,,,01/03 +KF4HOU,EM86VE,,,,,,01/03 +KF4JU,EL87,,,,,,01/03 +KF5AL,EM13,,,,,,01/03 +KF5IU,EM31WR,,,,,,01/03 +KF5PE,EM12,,,,,,01/03 +KF6BXH,CM87VQ,,,,,,01/03 +KF6HQC,DM14ED,,,,,,01/03 +KF7CN,DN16LV,,,,,,01/01 +KF7IS,DN41AC,,,,,,01/04 +KF7VY,DN17IQ,,,,,,01/03 +KF8QL,EN72FU,,,N8MXK,,IC-746-Flexradio 1000-DEMI transverters,01/09 +KF9CY,EM59,,,,,,01/03 +KF9YR,EN54,,,,,144: 170W 13B2,01/97 +KG0MW,EN13,,,,,,02/01 +KG0SV,DM79,,,,,,01/03 +KG4BMH,EM76JK,,,,,144: 1000 Watts sp144vdg GasFet 40 Element Collinear Array 7/8Heliax,05/02 +KG4CHX,EM95LL,,,,,,01/03 +KG4FET,EM90FH,,,,,,07/01 +KG4KAK,EL96VG,,,,,,01/05 +KG4MLA,EL88OA,,,,,,01/03 +KG5RK,EM12,,,,,,01/03 +KG5SF,EM44,,,,,,01/03 +KG5UN,EM02,,,,,,01/03 +KG6DX,QK23KL,EME,,,,144: 4x 13el CushCraft 900W,06/05 +KG6ENA,DM04DK,,,,,,01/03 +KG7CN,DN23BF,,,,,50: 5el 1KW,11/06 +KG7FU,CN83KA,,,,,144: 2x11el 1KW,01/01 +KH7K,AL08UJ,,,,,,01/03 +KH7X,BL11CG,EME,,EXPEDITION,,,04/07 +KH7Y,BL11,EME,,W6YM,,,08/07 +KI0LE,EN36US,EME,,KB0PDO,,Kenwood TS-790A Yaesu FT-847,09/07 +KI4BYV,FM15CX,,,,,,01/04 +KI4M,EM95AQ,,,,,144: 800W M2 18XXX,01/01 +KI4TZ,EM95LD,EME,,,,144: 2x 13el 400W,05/08 +KI6FF,DM13AR,,,,,,01/03 +KI7JA,CN85RL,,,,,,01/04 +KI7WB,DN62,,,,,144: 200W 10el,01/01 +KJ5EY,DM65XA,,,,,,01/03 +KJ5Q,EM15,,,,,,01/03 +KJ6HZ,DM13HX,EME,,,,50: 3el 100W - 144: 2x 17el 500W - 222: 10W - 432: 4x 19el 500W - 1296: 10W dish - 10G: 2W dish,09/06 +KJ7A,DM03,EME,,,,432: FT-817 8 x 25 ele,11/00 +KJ7F,DN13VO,EME,,,,,01/04 +KJ7OG,DM42MH,EME,,,,,01/03 +KJ9I,EN53QB,EME,,,,50: 1 Yagi,11/08 +KK4NO,EM92,,,,,,01/03 +KK5WA,EM45,,,,,,01/03 +KK7B,EN57RB,,,,,,01/03 +KK7LK,CN88SS,,,,,,01/03 +KK8O,EN80OR,,,,,,01/04 +KL6M,BP51DC,EME,,ex AL7OB,,9.2m dish,10/06 +KL7FB,BP51HO,EME,,,,,01/03 +KL7FH,BP41BB,EME,,,,432: 16X12 ele polarity rotation FT-847 100 W preamp K0RYT .18db NF,09/05 +KL7HFQ,BP51,EME,,,,,01/03 +KL7IZW,EM13SE,EME,,,,,12/04 +KL7UW,BP40IQ,EME,,ex AL7EB,,FT847 144: 4 Xpol-20el M2 170W MGF1801 432: 16.5dbd Antenne 50W,09/05 +KL7X,BP51AE,EME,,,,,02/01 +KM0A,EM84UT,EME,,,,144: single Yagi,10/06 +KM0T,EN13VB,,,,,,07/01 +KM1H,FN42,,,,,144: 1-5KW 2x4218XL,01/01 +KM4ID,EM93WA,,,,,,01/03 +KM5OL,EM13RB,,,,,,01/03 +KM5PO,EM12KO,EME,,ex KD5BUR,,144: 13KW ERP,04/05 +KM6WC,CM97OP,,,,,FT100,09/02 +KN4SM,FM16QT,,,,,144 : 1.5KW 5wl M2 - 432: 1.5KW 13wl M2 - 222: 300w K1FO 22el,12/07 +KN6DD,DM03,EME,,,,,01/03 +KO0Z,EM48,,,,,,01/03 +KO2R,EN52,,,,,,01/03 +KO4FR,FM16UV,,,,,,01/05 +KO4QR,FM26,,,,,,01/98 +KO7N,CN84IA,EME,,,,,08/01 +KQ0Z,EM37,,,,,,01/03 +KQ4I,FM06JB,EME,,,,144: DISH,01/90 +KQ6JI,CM87UJ,,,,,,01/03 +KQ6MU,DN16WF,EME,,,,144: 17el 100W,07/05 +KQ6UH,DM14BC,,,,,,01/03 +KR5E,EL29JN,,,,,,01/03 +KR5V,EM13,EME,,,,,01/02 +KR5Vex,EM13SD,,,,,,01/03 +KR7O,DM07BA,EME,,ex N7STU,,HTX100 144: Trvt 1KW 2M5wl - 222: Trvt 450W 7wl yagi,10/06 +KR8L,DN43AL,,,,,,01/03 +KS0F,EM48SL,,,,,,01/97 +KT4HA,FM15BH,,,,,,01/03 +KT4KB,EM93,,, +KT8O,EN71KI,,,,,,04/08 +KT8U,EN80OR,,,,,,01/03 +KU0KU,EM28QV,,,,,,01/03 +KU2A,FN42DW,EME,,,,144: 12el 1500W,12/07 +KU3T,FN20,EME,,,,,04/98 +KU4F,EL99AF,EME,,,,,01/03 +KU4R,EM86SK,EME,,,,144: 2x18XXX 200W,01/01 +KU7Z,DN41AF,EME,,,,144: 2x 12el 600W,10/06 +KV4EB,EM66FL,,,,,144: 7el 14el,11/01 +KV6J,BK29AQ,,,,,,01/03 +KW0A,EM48RI,,,,,144: 1KW 24el,08/01 +KW0T,EM19WF,,,,,,01/03 +KW1AM,FN41CT,EME,,,,,05/07 +KX7V,DM42,,,,,,01/03 +KX8XX,EN74HD,,,KB8GC WB8CKZ WN8CKZ,,,01/08 +KX9X,EN60AC,,,ex KF9PL,,IC706MKII - 50: 100W 3el - 144: 100W 11el,09/01 +KY7B,DM43,,,,,,01/03 +KZ2S,FN20XD,,,,,,01/03 +LA0BY,JO59FW,,,EX DF9PY,,144: 180W 9el - /p JO59ix: 144: 180W 2x9el MGF1302 - 432: 120W 2x13el Preamp - 1296: 20W 43el Preamp,01/08 +LA0FX,JP40LM,,,ex SP9CSO,,,11/95 +LA0GE,JO59NJ,EME,,,,Icom IC-7000,03/07 +LA1BEA,JO29XB,,,Expedition,,,01/91 +LA1K,JP53EK,EME,,,,144: 2x4CX250b MGF1402 preamp 4x17el,01/95 +LA1KHA,JO49SE,,,,,,01/93 +LA1TV,JO49TQ,,,,,,01/04 +LA2AB,JO59FV,EME,,,,,07/02 +LA2MOA,JP50HW,,,,,,12/08 +LA2PHA,JO38IB,,,,,144: 100W 10el,07/02 +LA2RZ,JP30AI,,,,,144: 160W 17el,05/02 +LA2YMA,JP32LK,,,,,144: 40W 9el,02/04 +LA2Z,JO59EJ,EME,,,,1296: 4.2m dish 300w f-d=0.5 VE4MA feed NF 0.3dB,10/06 +LA3BO,JO59CD,,,,,,04/04 +LA3EU,JP32BG,,,,,,01/93 +LA3HPA,JP50QM,,,,,Icom IC-746pro Icom IC-706MkIIG,09/08 +LA3WU,JP20QH,EME,,,,,01/93 +LA4DL,JP32EL,,,,,,03/04 +LA4XGA,JP33VC,,,LB7ZC,,144: 10 5m ant 800w,10/07 +LA4YGA,JO48BE,EME,,SP8DXL SP2DXL,,IC910 / IC706 144: 300W 15el - 432: 17el 100W,04/07 +LA5IH,JP20NK,,,,,,01/93 +LA5KJA,JP50IV,,,,,,01/98 +LA5KO,JO38HC,,,,,144: 300W 17el MGF1302,06/06 +LA5NNA,JO38MA,,,,,144: 100W 19el,12/06 +LA5PH,JO49XA,,,,,,01/92 +LA5SAA,JO29SE,,,,,,01/93 +LA5TFA,JP99LQ,,,,,IC751-IC706-FT736r-FT225rd - 50: 2x5el HL166V - 144: 3CX800A7 15el,05/07 +LA6CU,JP20QL,,,,,144: TS790e 150W 16el MGF1302,09/99 +LA6HL,JO28TW,EME,,,,,01/02 +LA6I,JP41,,,Expedition,,,01/93 +LA6K,JP33VC,,,,,,05/03 +LA6LU,JO28,,,,,,07/96 +LA6MV,JO59FJ,,,,,,08/02 +LA6QBA,JP61BJ,,,,,50: 100W 2x5el - 144: 600W 4x11el,07/04 +LA6TPA,JP54RL,,,,,FT-2000 IC-7000,03/08 +LA6VBA,JO48,EME,,,,,01/93 +LA7KK,JP50,EME,,,,,01/93 +LA7SP,JP99MQ,,,,,,07/05 +LA8AE,JO59CC,EME,,,,,01/94 +LA8AJA,JP50HP,,,,,,07/06 +LA8AV,JO59DS,EME,,,,FT-1000MP + transverter,05/07 +LA8G,JP53EJ,,,,,,01/05 +LA8GKA,JO59FS,,,ex LC1PAT,,IC706,08/05 +LA8KV,JP52QQ,EME,,,,144: IC746 - 1Kw (or 1.8Kw) 4x15 el. Fullelv.,06/06 +LA8LF,JO59BS,EME,,,,1500W 4.6M NEC solid Dish Autotracking,05/07 +LA8NK,JO48KM,,,,,Ft-736 Ft-897 5 el yagi on 6 9 el yagi on 144,04/07 +LA8OW,JP50NC,,,,,,05/02 +LA8SMA,JP42GE,,,,,,05/07 +LA9BM,JP40CM,,,,,,03/98 +LA9DFA,JP60AE,,,,,144: IC-706MKIIG + SLA200 250w + 2M5WL 17el / 50: IC-756 PROII 100w 5el,06/09 +LA9DL,JO59KE,EME,,,,,04/04 +LA9FY,JP40,,,,,144: 160W 16el,02/09 +LA9IY,JP53,,,,,,01/03 +LA9NEA,JO59DX,EME,,OP LA2AB,,144: 4x 19el K1FO 1-5KW,02/05 +LA9Z,JO38HC,,,,,50: 100W 5 ele Tonna 144: 150w 15 ele CueDee,07/06 +LB7FA,JO38LM,,,,,144: IC821 9el 180W,03/05 +LM9K75Y,JO48AD,,,SPECIALCALL,,144: 3wl Preamp GS35B,01/09 +LU1C,GF05OM,EME,,,,4 x 3WL and 600 Watts,10/08 +LU1CGB,GF05OM,EME,,,,144: 4x 14 ele 600 W Pre RX - 432: low Pwr,02/09 +LU4HO,FF78RA,,,,,,01/03 +LU5BOJ,FG75HF,EME,,,,FT757GXII 144: 2x 12el 600W,03/07 +LU6DW,GF05SF,EME,,,,,01/03 +LU7DZ,FF78RA,EME,,,,144: 4X16 el 1 KW Pre RX 432: 4X22 el 1KW Pre RX,02/09 +LU7FA,FF96,EME,,,,144: 2x 12el 140W Preamp (maybe 4x 12),02/09 +LU7FIA,FF97PA,EME,,,,144: 2x 12el 300W Preamp - 432: 1x 19el 100W,02/09 +LU8EDR,GF05TF,EME,,,,1296 EME under construction,02/09 +LU9AWH,GF05SJ,,,,,,03/07 +LU9MBK,FF57NR,EME,,,,144: 4el Quad 100W,10/06 +LX1DB,JN39CO,,,,,,10/06 +LX1FX,JN29WT,,,,,,07/08 +LX1GR,JN39,,,,,,01/93 +LX2DX,JN29WO,,,,,,10/02 +LX2SM,JN39,,,,,,07/04 +LX8M,JN29XX,,,EXPEDITION,,,08/08 +LX8X,JN29XX,,,EXPEDITION,,,08/08 +LY2AAM,KO23,,,Expedition QSL via DL3BQA,,,06/06 +LY2BAW,KO25KA,,,,,FT-736R+home made PA - 144: 24el 2M8WL M2 - 432:-30el KLM - 1296: 44 el KLM,05/03 +LY2BIL,KO24PQ,,,ex UP1BWR - not qrv MS nw! (01/01),,144: FT736r 30el 1KW,08/02 +LY2BUU,KO15XH,,,,,IC-706MKII,10/07 +LY2BW,KO24,,,,,,01/95 +LY2CI,KO14WV,,,,,TS-790A- 144: 150W 11el - 432: 25el yagi - 1296: 36el,08/03 +LY2FE,KO05NQ,,,not qrv MS nw! (01/01),,144: FT736r 300W 13el,10/02 +LY2FR,KO15VR,,,,,,07/04 +LY2GC,KO25KA,EME,,,,,10/04 +LY2MW,KO24PS,,,,,IC746 + PAs 50: 100W 6el - 144: 100Watt 13el DJ9BV SP2 - 432: 200w 23el DJ9BV SP70,08/04 +LY2R,KO15VR,EME,,LY2FR,,FT857D 144: 4x 10el 800 W,09/07 +LY2SA,KO14LL,EME,,,,144: IC821H 300W 17el 5wl MGF1502 - 432: 175W 30el,06/07 +LY2WR,KO24FO,EME,,UP1BWR,,144: FT736r 11el 1KW+ - 432: 50W 24el - 1296: 10W loopyagi,03/09 +LY3BF,KO24OR,,,,,,01/96 +LY3GM,KO14LL,,,,,,12/97 +LY3W,KO14XW,EME,,LY3BW,,ICOM 706 mk-2g FT1000mp mark-V,10/07 +LY4U/P,KO24FO,EME,,LY2BIL,,,03/09 +LY8O,KO24OP,,,LY2MW,,IC-275H IC-475H IC-910H,05/08 +LY8X,KO24PQ,,,SpecialCall,,,08/99 +LZ1AG,KN22ID,EME,,,,144: 14el 100W,12/99 +LZ1BB,KN12PQ,EME,,,,,07/09 +LZ1DP,KN22TR,EME,,,,144: 4x5 WL DJ9BV cross+MGF1302 FT-736R PA 1-8 KW 2xGU74B,01/05 +LZ1DX,KN22,,,,,,01/93 +LZ1FG,KN12,,,,,,08/08 +LZ1JH,KN32FR,,,,,,06/99 +LZ1KDP,KN12SP,EME,,,,,01/98 +LZ1KDZ,KN32,EME,,,,,01/93 +LZ1KG,KN31CS,,,,,50: 4el transv. 10W - 144: 2x16 F9FT IC275e - 432: 15el FT790r,09/03 +LZ1KJ,KN31CS,,,,,50: FT987 4el 15W - 144: FT987 250W 2x8el GaAs Fet,09/03 +LZ1KQ,KN22TK,,,,,,12/96 +LZ1KRB,KN32,,,,,,01/93 +LZ1KSN,KN32SL,,,,,,01/93 +LZ1KSW,KN31CS,,,,,,12/95 +LZ1KU,KN32,,,,,,01/93 +LZ1KWT,KN22TK,,,QSL via LZ1DP or LZ1JH,,144: FT736 1KW 2x16el F9FT GaAsFet 3SK129,11/03 +LZ1NO,KN12,,,,,,12/01 +LZ1OA,KN22TK,EME,,,,,06/06 +LZ1QI,KN12,,,,,,11/01 +LZ1QM,KN12,,,,,,01/93 +LZ1R,KN42AA,,,Expedition,,,01/93 +LZ1UB,KN22TK,,,,,,01/94 +LZ1UK,KN22ID,,,,,144: 60W 8el Quagi,06/06 +LZ1V,KN12QQ,,,,,,01/90 +LZ1VPV,KN32AS,,,,,,08/05 +LZ1ZP,KN22ID,,,,,144: 150W 14el DJ9BV,05/03 +LZ1ZX,KN32IO,,,,,,12/99 +LZ2FO,KN13KX,EME,,,,144: 500W 15el 9BV,10/07 +LZ2HM,KN12QP,EME,,,,144: FT847 17el yagi,07/03 +LZ2HV,KN23UB,,,,,144: 600W 12el Quad,12/98 +LZ2JF,KN23,,,,,,01/93 +LZ2KRU,KN33FL,,,,,144: 500W 17el,08/97 +LZ2PP,KN33,,,,,,01/93 +LZ2US,KN13RJ,EME,,,,144: 4x KLM17LBX 2x 4CX800A 2KW FSC11LF,08/00 +LZ2UU,KN12QP,,,,,,08/96 +LZ2ZY,KN13OT,,,,,,05/08 +LZ3BD,KN12QQ,,,,,432: 250W 32el GaasFet,12/99 +LZ3CQ,KN12PQ,,,,,,01/03 +LZ3GM,KN32RL,,,,,144: IC735 20W 3wl 10ele BVO2 MGF1302,05/08 +LZ3YH,KN22,,,,,,12/95 +LZ4KK,KN23XU,,,,,TS-2000 Mirage B2516G 160W 4el DK7ZB,05/08 +LZ5GM,KN32QL,,,,,144: IC-720 50W 13eleFT MGF1302,04/03 +LZ5N,KN21JX,,,,,,01/95 +LZ5UV,KN12PR,,,,,144: FT847 IC271 4cx250 PA 17el DJ9BV,11/02 +LZ5Z,KN12PR,,,,,144: 2x15el 1KW,12/99 +LZ6T,KN22IS,,,,,,12/99 +LZ7A,KN43HL,,,Expedition,,,01/94 +LZ7P,KN22,,,,,,12/96 +LZ7Y,KN41AX,,,,,,08/99 +LZ9M,KN32RL,,,,,,12/03 +LZ9W,KN12MO,,,,,IC-746 FT-847,01/05 +LZ9X,KN32AS,,,= LZ1KWT,,144: 2x 15el 1KW,08/08 +M0AFJ,IO92OB,,,G8GGP,,200W,04/07 +M0BCG,IO91DO,EME,,,,144: ic706mk2g 2x4cx250b 4x9el elvation mgf1302 - 50: jst245 p50vdg 2x3-500z 2x6el,04/05 +M0BPQ,IO91WP,,,EX G7ACQ G5YC,,50: 400W 5el 144: 7el 400W 432: 13el 120W 1296 19el 50w,05/09 +M0CQZ,IN69UW,,,Expedition,,,09/00 +M0CTP,IO93,,,,,,03/02 +M0EME,IO93GF,EME,,,,432: FT847 4x 19el 100W,09/05 +M0IKB,IO94SG,,,,,,11/06 +M0ITY,JO01BS,,,OK2ITY OK2IT G6UT,,2m - 15+2x13+4x4el QRO / 70cm - 200w - 23el / 6m - QRO + 5el,11/07 +M0MIG,IO90WX,,,,,,10/06 +M0VHF,IO82VF,,,,,FT847 JST245 3CX800 8877 - 50: 5el - 144: 10el,10/02 +M1DRK,IO93US,,,,,50: TS60 5el 90W,01/02 +M1GSM,IO94BU,,,,,144: 150W 8el,08/03 +M5FUN,JO00DX,,,ex 2E0ATF+2E1GOM,,144: TR751E 100W 12el,03/04 +M5MUF,IO92JP,,,ex GU6AJE,,IC202 IC706 various transverters,09/03 +MI/DL1YMK,IO74DU,EME,,EXPEDITION,,,06/09 +MI0AYR,IO64VQ,,,,,144: TR9130 150W 19el,04/05 +MI0JST,IO65SE,,,,,144: IC910 100W 10el,06/05 +MI0KAM,IO65PE,,,,,,06/05 +MM0BQI,IO85KX,,,,,50: 100W 5el - 144: 13el,03/00 +MM0CCC,IO85MW,,,,,144: FT1000MP TVVF144A 17el 100W,05/04 +MM0CEZ,IO75XU,,,,,IC910 IC775DSP Transverter,03/04 +MM0DQP,IO88KI,,,,,100W,05/04 +MM0KOS,IO85CR,EME,,EX MM3KOS,,ICOM 290D MK2,07/07 +MM0MMK,IO85EV,,,,,,06/05 +MM1BXF,IO76PA,,,,,,01/03 +MM3ENW,IO85BS,,,,,,03/05 +MM5AJW,IO88KI,,,,,144: 100W 11el Vargaarda,01/08 +MM5DWW,IO89ID,,,ex MM1MVJ,,KENWOOD TR751/TS690 100W 11el,04/04 +MS0FNR,IO88KK,,,,,,12/04 +MW0HMV,IO71XT,,,2W0CDJ,,FT2000 & EXPERT 1K 6M - IC910X 2M 70CM 23CM - TS2000 with TRC410sl & te 0650g,06/09 +N0AB,EM28,,,,,,01/03 +N0AE,EN51,,,,,,01/03 +N0AJU,EN11,,,,,,01/03 +N0AKC,EN44GU,EME,,,,144: 4x 18el 1KW 222: 350W 16el,10/05 +N0ATV,EN34JX,,,,,,01/03 +N0BTN,EN21,,,,,,01/03 +N0CIH,EN42,,,,,,01/03 +N0CKK,EN34,,,,,,01/03 +N0DAG,EM29QF,,,,,,01/03 +N0DQS,EN22GD,,,,,,07/01 +N0DY,EN42FA,,,,,,01/03 +N0EC,DN70LF,,,,,50: 1KW - 144: 1-5KW - 222: 120W - 432: 1KW - 902: 200W - 1296: 100W - 2304: 15W - 3456: 1W - 10G: 1W,01/01 +N0ECI,EM37,,,,,,01/03 +N0EOQ,EM24,,,,,,01/03 +N0FFO,EM17,,,,,,01/03 +N0FQW,EM39,,,,,,01/03 +N0GPH,EM48,,,,,,01/03 +N0GXA,EN13QH,,,,,144: 1KW preamp 18el,01/98 +N0GXN,EM48,,,,,,01/03 +N0HJZ,EN34FV,,,,,144: TS700S 200W preamp 12el,01/01 +N0HKT,EM17,,,,,,01/03 +N0HZ,EN34,,,,,,01/03 +N0ICV,EN52XA,,,,,,01/04 +N0IDT,EN10,,,,,,01/03 +N0IS,EM48,,,,,,01/03 +N0IT,EM48RN,,,,,144: 170W,01/01 +N0JCF,EN35,,,,,,01/03 +N0JEQ,EM27,,,,,,01/03 +N0JK,EM17,,,,,,01/03 +N0KE,DM69,,,,,,01/03 +N0KEV,EM17,,,,,,01/03 +N0KIS,EN10QT,,,,,,01/03 +N0KM,DM67VR,,,,,,01/97 +N0KN,EM28,,,,,,01/03 +N0KQY,DM98GK,EME,,,,144: 15/19dbd antenna 1KW,02/01 +N0LIK,EM48,,,,,,01/03 +N0LL,EM09,,,,,,01/01 +N0LNO,EN42,,,,,,01/03 +N0LRJ,DM78,,,,,,01/03 +N0NAS,EN35,,,,,,01/03 +N0NEG,EM29,,,,,,01/03 +N0NHS,DN70LF,,,,,,01/03 +N0OIB,EN35,,,,,,01/03 +N0OYQ,EN25,,,,,,01/03 +N0PB,EM39WO,,,,,,11/01 +N0PJU,EN41,,,,,,01/03 +N0POH,DM79OP,,,,,,01/01 +N0QBF,EM48SR,,,,,,01/03 +N0REN,EN34,,,,,,01/03 +N0RHL,EN10RT,,,,,,01/03 +N0RQ,EM13RG,,,,,144: Icom IC-746PRO,06/06 +N0SBU,EN35,,,,,,01/03 +N0SHR,EN26,,,,,,01/03 +N0SRQ,EN18,,,,,,01/03 +N0SWV,DM79,,,,,144: 170W 2x16el - 432: 35W 2x18el - 1296: 60W Rhombic Array,05/98 +N0TOU,EM29,,,,,,01/03 +N0TVJ,FM03UW,EME,,,,,10/05 +N0UGY,DM79,,,,,,01/03 +N0UK,EN34JV,,,,,50: 10W KLM661 - 144: TS930/DEM Tvtr 300W K1FO-12 - 222: TS820/HB Tvtr Amp,07/01 +N0US,EN10,,,,,,01/03 +N0UU,EM18,,,,,,01/03 +N0VSB,DM79RJ,,,,,50: 1KW 7el - 144: 1.5KW 18el MGF- 222: 200W 23el MGF- 432: 200W 38el MGF- 902: 25W 4x33el - 1296:50W 2x55el,01/02 +N0WJY,EN10QT,,,,,,01/03 +N0WVU,DM79HV,,,,,,01/03 +N0WX,EN34,,,,,,01/03 +N0XKS,EM29,,,,,,01/03 +N0XPI,EM29,,,,,,01/03 +N0YGM,DM78OV,,,,,,01/03 +N0YK,DM98MG,EME,,,,144: 18xxx with 350W,05/06 +N0YNP,DN81CW,,,,,,01/03 +N0ZEB,DM79,,,,,,01/03 +N0ZKK,EM29,,,,,,01/03 +N1BUG,FN55MF,EME,,,,50: 400W 5el 144: 1500W 20el Yagi 222: 500W 24el 432: 550W 22el,11/04 +N1CPE,FN42QH,,,,,,01/03 +N1EKV,FN42JK,,,,,,01/03 +N1GMV,FM05TU,,,,,,01/04 +N1GOD,FN41VQ,,,,,,01/03 +N1HOQ,FN41TP,EME,,,,144: 12el 400W,11/06 +N1IW,EN75ve,,, +N1JEZ,FN34IM,,,,,FT736 FT847 FT920 FT290 DSP10 ACOM1006,05/07 +N1KI,EM75WX,EME,,WB4KMH,,144: 4x 12el 1500W - 432: 2x 9wl 1000W,04/07 +N1KTM,FN41SR,,,,,144: 1kw- 2x2M9,01/97 +N1LDY,FN41JR,,,,,IC-746 IC-910 DEMI-222 DEMI-903,01/04 +N1LF,EM63NF,,,,,IC-910H 736R Icom 746 Pro,04/08 +N1MIW,FN41EQ,,,,,FT847 FT736,05/08 +N1NCO,FN42GL,,,,,,01/03 +N1OFZ,FN31HL,,,,,FT-847 SDR-1000 FT-726R,03/07 +N1RWY,FN54NO,,,,,50: 100W 3el CC - 144: 800W 18el - 222: 350W FO16 - 432: 350W 2xFO22,01/01 +N1RZ,FN44EI,,,,,,07/01 +N1SZ,FM19NE,,,,,IC 756Pro,10/07 +N1VQR,FN42JJ,,,,,,01/03 +N2CEI,FN20,,,,,,01/03 +N2FKF,FN30BR,,,,,,01/04 +N2HLT,FN12LN,EME,,,,,01/03 +N2IQ,FN13TD,EME,,,,,01/03 +N2IQU,FN13,,,,,,01/03 +N2JDQ,FN20VG,,,KB2GWI,,IC820H,09/07 +N2JMH,FN13AF,,,,,,01/03 +N2JQR,FN13,,,,,50: 500W 5el,01/01 +N2JR,FM18CP,,,,,50: 100W 5el,09/01 +N2KW,FN03XE,,,,,,01/03 +N2MB,FN30CO,,,,,,01/03 +N2MCY,FN30AR,,,,,,01/03 +N2MKT,FN13LK,,,,,,01/03 +N2MSS,FN31AA,,,,,,01/03 +N2NEP,FN13EB,,,,,,01/03 +N2NZI,FN32,,,,,,01/03 +N2OLA,FN12MM,,,,,,01/03 +N2OTO,FN30CR,,,,,144: TS850 LT2SMKII 200W 4el,01/01 +N2PC,DM78QX,,,,,,01/03 +N2UO,FM06BG,EME,,,,All homebrew,09/07 +N2VR,FN12SK,EME,,ex KC2EAL,,144: 4x13B2,08/01 +N2WK,FN03XE,EME,,,,144: 1-5kw 4x2.2 wl full elv. MGF1302,10/00 +N2WLS,FN02RQ,,,,,,01/03 +N2XK,FN20RF,,,K2WKA,,FT1000MP MKV with FTV-1000 6M Icom IC706MKIIG 2M/70CM,11/08 +N3AHF,FN20SF,,,,,,01/03 +N3AJX,EN71KC,,,,,,01/03 +N3FA,FN21,EME,,ex WB3FAA,,144: LT2S 8877 700W 4x12el M2 - 432: FT736 SP7000 3CX800 700W 4x19el,10/99 +N3JNP,EN91,,,,,,01/03 +N3KKM,EM28,,,,,,01/03 +N3LL,EL86,EME,, +N3NDY,DM09CJ,,,,,Kenwood TS-60,03/08 +N3OPM,FM19PH,,,,,,01/01 +N3RN,FN11WH,,,,,144: 500W 16el KLM,07/01 +N3TAD,FM28FH,,,,,TS-480HX FT-847,09/07 +N3WT,FM19EJ,,,,,,01/04 +N3WXW,FN20CE,,,,,,01/03 +N3XI,EN90XJ,,,,,,01/03 +N3YGA,FN20BI,,,,,50: 160W 4el - 144: 170W 14el,01/98 +N4BH,EM95OC,EME,,,,144: 400W 17el,10/08 +N4CAG,EM86PI,,,,,,01/03 +N4EQT,EM77,,,,,,01/03 +N4FRE,EL06LL,,,,,,01/03 +N4GJV,EM95PS,EME,,,,,05/98 +N4GKO,EM65LO,,,,,144: FT736r 350W 2M18XXX,01/01 +N4HN,EM95OE,,,,,TS-2000X,05/09 +N4HY,FN20RG,,,,,,01/04 +N4IP,EM73WV,,,,,,01/03 +N4IPB,EM66,,,,,,01/03 +N4IS,EL96UB,,,ex AB6WC- PY2DP....,,FT1000MP+Trsv 144: 350W 18el M2,06/01 +N4KWX,FM08WF,,,,,,01/97 +N4KZ,EM77GT,,,,,,09/01 +N4LXB,EM83VL,,,,,,01/03 +N4MW,FM17KN,EME,,,,,01/03 +N4OYS,EM65,,,,,,01/03 +N4PZ,EN52,EME,,,,,04/97 +N4SC,EN72,,,,,,11/04 +N4TWX,EL89TW,,,,,50: 5el 75W - 144: 15el 150W Preamp,01/01 +N4UK,EM84XP,EME,,,,144: 1KW 13/13el - 222: 750W 23elM2 - 432: 750W 4x19el,01/97 +N4WI,FM14IL,,,,,,01/04 +N4XD,FM05,,,,,144: TS700SP 160W,01/01 +N4ZKR,EM65,,,,,,01/03 +N4ZRW,EM17KN,,,,,,01/03 +N5AC,EM13QC,,,WD5EMG,,Many,01/08 +N5AF,EM20,,,,,,01/03 +N5AHD,EL17,,,,,,01/03 +N5AMA,EL29,,,,,,01/03 +N5ARS,EM26,,,,,,01/03 +N5AXJ,EM86,,,,,,01/03 +N5BA,EL29FX,,,,,144: 150W 18el,07/05 +N5BHO,EM31,,,,,,01/03 +N5BHX,EL09,,,,,,01/03 +N5BHZ,EM22,,,,,,01/03 +N5BLK,EL29,EME,,,,,02/05 +N5BLZ,EM20AB,EME,,temp. QRT now 10/05,,144: IC746 to homebrew 8877 PA 1 5/8 Andrews 4x 28 Xpol preamp 0.3db,09/06 +N5BO,EM60UR,EME,,,,6M5X/100 2x2m9/400w 70cm 13wl/200w,04/07 +N5DL,EM36,,,,,,01/03 +N5EIL,EM12UR,EME,,,,144: 15el 50W,05/05 +N5EM,EL29,,,,,,01/03 +N5FV,EM03,,,,,,01/03 +N5HHS,EL29,,,,,,01/03 +N5IRM,EM13RC,EME,,,,144: 2x 12el 300W,01/06 +N5IS,DM96,,,,,,01/03 +N5ITO,EM12MR,EME,,ex KA9JLU,,144: 17el 750W - 432: 4x 18el 250W,11/05 +N5JM,EL49,,,,,,01/03 +N5KDA,EM41HM,EME,,,,144: 4 x 17el 1.5 KW,09/07 +N5KWB,EM32QB,,,,,,01/03 +N5MP,EM12,,,,,,01/03 +N5MWS,EM13,,,,,,01/03 +N5MYH,EM32,,,,,,01/03 +N5NDV,EM15,,,,,,01/03 +N5NSH,EM14,,,,,,01/03 +N5OCP,EM15,,,,,,01/03 +N5OSK,EM25FI,EME,,,,144: 26B2 350W,06/05 +N5QGH,EM13QC,,,,,,01/03 +N5QS,EM45,,,,,,01/03 +N5QT,EM45,,,,,,01/03 +N5RZ,DM81XW,,,,,,01/03 +N5SAL,EM28,,,,,,01/03 +N5SIX,EM42XI,EME,,,,144: 500W 9el,06/05 +N5TML,EM14,,,,,,01/03 +N5TQB,EM31PJ,,,,,,01/03 +N5TX,EL09,,,,,,01/03 +N5WS,EL09RU,,,,,,01/01 +N5XCX,EL09,,,,,,01/03 +N5XU,EM10DG,,,,,,01/01 +N5YLS,EM54,,,,,,01/03 +N5YSM,EM15,,,,,,01/03 +N5ZLU,DM95,,,,,,01/03 +N5ZWO,EM32,,,,,,01/03 +N6CL,EM26,,,,,,01/03 +N6CV,DM04UF,,,,,,01/03 +N6CW,DM12JT,EME,,,,50: 7el 1KW 144: 4x 9el 1KW,12/07 +N6DHN,CM98,,,,,50: 150W 4el - 144: 150W 22el - 432: 100W 40el,01/98 +N6ENU,DM04,,,,,144: 270W 13el Yagi - 50: 100W 7el,01/01 +N6HV,DM04,,,,,,01/03 +N6KBX,CM98,,,,,50: 400W 2x5el - 144: 350W 4x17el - 432: 175W 2x33el,01/97 +N6KK,DM03TV,EME,,,,144: 2x 5wl Ant 1500W,10/06 +N6KMR,CM97MO,,,,,,01/03 +N6NB,DM05,,,,,,01/03 +N6OVP,CM87,EME,,,,,01/03 +N6PYI,DM05KJ,,,,,,01/03 +N6RA,CM87SR,,,,,,01/03 +N6RJM,DM14CP,,,,,50: 1KW 9el - 144: 1-5KW 4x18el - 222: 350W 2x7wl - 432: 1KW 2x13wl,01/01 +N6RMJ,DM14CP,EME,,,,IC-910H / IC-756Pro,05/07 +N6RPM,DM04UA,,,,,,01/03 +N6RZ,CM87WB,,,,,144: 1KW 17B2,01/01 +N6SPP,CM97AX,EME,,,,10ele 2m IC746 FT857D Elk,10/07 +N6TQS,CM87UU,,,,,,01/03 +N6TX,FN11LH,EME,,,,,01/03 +N6VHF,DM13,,,,,,01/01 +N6VMO,CM94SP,EME,,,,144: 2x 17el 350W,08/06 +N6YM,CM88XF,,,,,,01/01 +N6ZE,DM04NE,EME,,ex K1FJM,,IC756 PRO II 50: 100W 5el - 144: 8930Amp 2M5wl Preamp - 222: 75W 10el - 432: 75W 21el - 1296: 20W 33el,08/03 +N7AM,CN87QN,EME,,,,,08/03 +N7AMA,DM33,,,,,,01/03 +N7ART,CN87,EME,,,,,01/03 +N7AVK,CN84,,,,,,01/03 +N7BSN,CN87QQ,,,,,,01/03 +N7CZ,DN47HM,,,ex KQ7K,,FT736 IC706,01/02 +N7DMA,DM42NL,,,,,,01/03 +N7EMD,DM26JE,,,,,,01/03 +N7EY,CN96QO,,,,,,01/03 +N7IJ,DN44GB,,,,,,01/03 +N7LQ,DN01FA,EME,,ex WB7TDI,,432: 1.5KW 4 x FO-25's,06/00 +N7MWV,CN87VQ,,,,,144: 250W CC3219,01/01 +N7QJP,DM33VM,,,,,,01/98 +N7SKT,DM33SN,,,,,,01/01 +N7WNX,CN83OW,EME,,,,,12/04 +N7WS,DM42JH,,,,,144: 8877 17el GaAs,01/01 +N7YAG,CN85,,,,,144: FT736r 300W 11el KLM,01/98 +N7YAP,DN07HJ,,,,,,08/01 +N8AIA,EN82KL,,,,,,01/03 +N8ASB,EM89,,,,,,01/03 +N8AXA,EM79UP,EME,,,,,01/03 +N8BSG,EN82,,,,,,01/03 +N8BXP,EN81,,,,,,01/03 +N8CGY,EN74OH,,,,,,01/01 +N8CJG,EN84FG,EME,,,,,03/05 +N8CJK,EN84FG,EME,,,,,11/05 +N8CQ,FM05OT,EME,,,,,01/04 +N8DJB,EN81FJ,EME,,,,,01/03 +N8ITP,EN81XF,,,,,,01/03 +N8JMK,EN90,,,,,,01/03 +N8KWX,EN62AD,,,,,,01/03 +N8LCU,EN72,,,,,,01/03 +N8NPX,EM79XR,,,,,,01/03 +N8OC,EN83AO,EME,,,,50: 100Watts 7el hb - 144: 1500Watts 17ele M2 5wl,08/05 +N8PUM,EN66DL,,,,,144: 200W 2x17B2,01/98 +N8PVT,EN64,,,,,,01/03 +N8QOD,EN79,,,,,,01/03 +N8TDL,EN90BN,,,,,,01/03 +N8VES,EM79VT,,,,,,01/03 +N8ZAT,EM79,EME,,,,,01/00 +N8ZAW,EM79,,,,,,01/03 +N8ZM,EM79,,,,,,01/03 +N9AB,EN52XG,EME,,,,432: 16x 22el 1KW,09/05 +N9AQ,EN51,,,,,,01/03 +N9AU,EN62BX,,,,,,01/03 +N9AZC,EM68,,,,,,01/03 +N9AZZ,EM57MV,,,,,,01/03 +N9BD,EM28,,,,,,01/03 +N9BJG,EM57,,,,,,01/03 +N9BMH,EN62,,,,,,01/03 +N9BX,EN52VL,EME,,,,144: 2x 18el 1KW,01/07 +N9CIQ,EN44,,,,,,01/01 +N9DCA,EN71GG,,,,,,01/03 +N9DG,EN53BJ,,,,,,01/03 +N9EGT,EN70,EME,,,,,02/05 +N9EMC,EN52UI,,,,,,01/03 +N9ESH,EN52XB,,,,,,01/03 +N9FH,EN63,,,,,,01/03 +N9FTC,EL79IX,,,,,IC 756 PRO IC746,10/07 +N9GVF,EN62,,,,,,01/03 +N9HF,EN52,,,,,,01/03 +N9IJ,EN52XI,,,,,,01/03 +N9IW,EN65KF,EME,,,,50: 3 yagi,02/09 +N9JIM,CM87XI,,,ex WB9AJZ,,50: 9el 150W - 144: 16el 700W - 432: 21el 50W - 1296: 55el 30W - 10G: 1M 8W,11/03 +N9KC,EN52,EME,,,,,01/03 +N9LAG,EM57,,,,,,01/03 +N9LHD,EN62BA,,,,,,01/03 +N9LR,EN50DU,EME,,,,144: 4x 8el 1500W,08/05 +N9MEH,EN44,,,,,,01/03 +N9MSG,EN50ES,,,,,,01/03 +N9MYK,EN-53W,,,,,,01/03 +N9NHC,EN61DU,,,,,,01/03 +N9NJY,EM58AM,,,,,,01/03 +N9NOQ,EN51,,,,,,01/03 +N9OO,EN62,,,,,,01/03 +N9PXI,EN61CU,,,,,,01/03 +N9RLA,EM78CQ,,,,,,01/03 +N9SBV,EN61UQ,,,,,,01/03 +N9SS,EN50DP,EME,,,,TS-2000,08/07 +N9SU,EN62BI,EME,,,,2x 3wl 400W,02/09 +N9TZL,EN52SH,,,,,,01/03 +N9UDO,EN53DL,,,,,,01/03 +N9UM,EN52wg,,, +N9UUR,EN63,,,,,,01/03 +N9VSV,EN63,,,,,,01/03 +N9WWR,EN62CS,,,,,,01/03 +N9XG,EN60VL,EME,,W9/G4FDX LX2GB,,144: 4x 18el 1.5KW,03/09 +N9XIX,EN53,,,,,,01/03 +N9YKE,EN62,,,,,,01/03 +NA0IA,EN42FB,,,,,,01/03 +NA2NY,FN23DV,,,NA1VT,,FT-1000 MP MK5 FTV-1000 IC-910,09/07 +NA3T,FM05LW,EME,,,,,10/97 +NA4AL,EM63OF,,,,,IC746 FT817,08/01 +NA4M,EM10DP,,,,,,01/03 +NA4N,FM18,EME,,,,,01/03 +NA6E,CN82,EME,,,,,01/03 +NA6MF,CM87,EME,,,,,04/08 +NA7D,DM43AS,,,,,,01/03 +NB2V,FN30,,,,,,01/03 +NC1I,FN32OB,EME,,,,,01/05 +NC1T,FN32,,,,,,01/03 +ND2X,EL09,,,,,,01/03 +NE0P,EM04,,,,,,09/01 +NE1H,EM84AC,,,,,,01/03 +NE7O,FN53HX,,,,,,01/05 +NE8I,EN82JM,,,,,,06/04 +NF0Q,EM48,,,,,,01/03 +NF2V,FN33KT,EME,,,,144: 4x 17el 350W,09/07 +NF5B,EL29,,,,,,01/03 +NF7P,DM09GH,EME,,,,,01/03 +NG9R,EN40LA,,,KC9OA,,,07/08 +NG9Y,EM78JT,EME,,,,144: 4x 13el 400W,10/08 +NH2CM,QK23KL,EME,,,,144: 4x 13el CushCraft 900W,12/05 +NI4Z,EL98HJ,,,,,,01/03 +NI6G,DM06,,,,,,01/03 +NJ0C,DM78,,,,,,01/03 +NJ0U,EN71IB,EME,,,,144: 2x 18el 500W,05/05 +NJ0X,EM29,,,,,,01/03 +NJ2L,FN13,,,,,,01/03 +NJ7A,DN30XP,,,,,144: 170W 16LBX Preamp - 222: 120W 5wL,01/01 +NK5F,DM65,,,,,,01/03 +NK7J,DM33,,,,,,01/01 +NK8Q,FN20KL,,,,,144: 170W 13el - 50: 7W 5el,01/01 +NL7F,BP64DV,EME,,,,,01/03 +NL7Z,BP51EN,EME,,,,FT920,03/05 +NL997,JO22XU,EME,,,,FT726 + Mutek TH F7E 8el 2wl @2m 10 el @70cm,05/09 +NM1A,EL96UG,,,,,IC-746,02/08 +NM5BB,DM65UV,,,,,,01/03 +NM5X,EM26,,,,,,01/03 +NM9H,EM59CD,,,,,,01/03 +NN5DX,DM80NV,,,,,,01/03 +NN6RF,CM87UW,,,,,,01/03 +NN7J,CN85,,,ex WA7BJU,,,01/05 +NN7K,DM09CN,,,EX K7ZFG,,50 FT847 MK6 7el M2,05/08 +NN9K,EN41,,,,,,01/98 +NO3I,EN90,EME,,KD3CC,,FT-1000 MP FT-920 FT-736R,05/07 +NP4B,FK67,EME,,,,,01/03 +NQ2O,FN13,EME,,EX DL1SM,,,05/01 +NQ7R,DM42DT,EME,,,,144: 120W 2.5wl Ant,10/06 +NR0X,EN42JH,,,ex DL4AT,,144: 12el,07/05 +NR5A,DN84LC,,,,,,01/03 +NR6E,CM88,,,,,,01/03 +NS4W,EM76VC,,,,,500: 1KW - 144: 1kw 2.5wl - 222: 400W - 432: 150W,01/01 +NS7K,DN31XC,,,,,,01/04 +NS7N,CN87,,,,,,01/03 +NT0V,EN08OC,,,,,,01/03 +NT0Z,FN31,,,,,,01/03 +NT4P,EM95KF,,,,,,01/04 +NT9E,EN52VI,,,K9DMW WB9SES,,756ProII (HF+6)-Elecraft XV Series Xvrtrs for 144-220-432,02/09 +NU3E,FN20PB,,,WB3GNB,,TS-2000,09/07 +NU5O,EM55,,,,,,01/03 +NU7Z,CN87RT,,,,,,01/93 +NU8I,DM43AN,,,,,144: IC706 1KW,01/99 +NV3Z,FM15,,,,,,01/03 +NW0X,EM40,,,,,,01/03 +NW7O,DM26,,,,,,01/03 +NX2Q,FN20WV,,,,,,01/03 +NX7U,DM43DI,,,,,,01/03 +NX8M,EM79PE,,,,,,01/01 +NZ1I,FN41AI,,,KA1KOJ,,Yaesu FT-897 Yaesu FT-736R,04/07 +NZ5N,EL96UC,EME,,,,144: 9el 500W,12/07 +NZ5P,DM95,,,,,,01/03 +OA4CVT,FH17KW,EME,,,,144: 15el 160W,04/06 +OA4O,FH17FV,EME,,,,432: 8m dish 400W,07/05 +OD5NJ,KM73TW,,,,,,01/03 +OD5RAK,KM74WH,,,Expedition - QSL via F6FLV,,50: 6el - 144: 17el+ PA,05/98 +OE1ILW/3,JN77XX,EME,,,,,04/09 +OE1MCU/P,JN88HE,,,,,144: 700W 13el,01/09 +OE1MSB,JN88DF,,,,,,10/03 +OE1SMC,JN88DD,,,,,IC7000,03/08 +OE1SOW,JN88FF,EME,,,,6m: 100W 5el - 2m: IC-756 Pro II + DB6NT-Transverter 400W 4x13el SP-2000 or IC-821 130W 13-El. Yagi SP-2000,05/08 +OE1XVC,JN88ED,,,,,144: 2x11el- 432: 2x21el gd Pwr,03/98 +OE3A,JN77XX,EME,,,,,04/09 +OE3CEW,JN88,,,,,,01/88 +OE3FVU,JN78VE,EME,,= PE0WGA,,144: 4x10el XPol 1500W MGF1302 - No 432 MHz - 50: 100W / 6 ele,07/08 +OE3HHB,JN87AQ,,,,,FT847 50: 100W 5el - 144: 50W 17el GaAs - 432: 50W 19el,07/99 +OE3JPC,JN88EW,EME,,2ND QTH,,,06/08 +OE3JTB,JN78QN,,,,,144: 17B2 160W,08/05 +OE3MWS,JN88DC,,,,,50: 100W 7el - 144: TR751 1-2KW 2x17el MGF1302 - 432: TS811 400W,01/05 +OE3NFC,JN88,,,,,,01/93 +OE3OBC,JN88,EME,,,,,01/94 +OE3OKS,JN87AR,,,,,,12/98 +OE3R,JN88FD,,,Contest Call,,,01/96 +OE3SJA,JN88GH,EME,,= OE1SJA SAME OPERATOR,,144: 1x19 250W 432: 4x19 250W LNA 1296: 2mDish H-feed 80W LNA,01/09 +OE3UP,JN87CT,EME,,,,,01/93 +OE3XAC,JN88FD,,,,,,11/96 +OE3XMU,JN78XD,,,,,144: 150W 15el,06/02 +OE4KLU,JN87KS,,,,,,01/96 +OE4WHG,JN87BB,,,ex OE6WHG,,50: F850 100W 6el,05/06 +OE5EFM,JN78,EME,,,,,01/94 +OE5EYM,JN68SK,EME,,,,,08/98 +OE5FD,JN68SC,,,,,,01/03 +OE5FDM,JN68SC,,,,,50: FT-847 5el-Yagi 100W - 144: FT-847 9el 100W,08/02 +OE5JFL,JN68RL,EME,,,,,01/94 +OE5KE,JN78,,,,,,05/02 +OE5MPL,JN78CJ,EME,,,,FT847 - 50: GS35 100W 5el Y 144: 2x 4CX250R 800W 4x 13elY MGF1302 432: 600W 4x 21 el MGF1302,05/07 +OE5VHL,JN68SI,EME,,,,,01/94 +OE5VRL,JN78DK,,,,,,01/97 +OE5WHN,JN67TR,,,,,IC756 IC970 100W,05/09 +OE6AHD,JN76RS,,,,,,12/95 +OE6BMG,JN77JE,,,,,,07/00 +OE6IWG,JN77PK,EME,,,,144: GS35b 4x10el (2-2wl) MGF1302,06/07 +OE6JGD,JN77QC,,,,,,12/95 +OE6KDG,JN77JF,,,,,,07/03 +OE6NLD,JN76SS,,,,,,01/93 +OE6RKE,JN76OT,EME,,,,,03/06 +OE6XHF,JN76RS,EME,,,,,01/94 +OE75SOW,JN88FF,EME,,SpecialCall,,50: IC736 100W 5el - 144: IC821H 300W 2x13el or 2xBW - 432: 120W 2x19el - 1296: 10W 2x26el,03/01 +OE8CIQ,JN76FU,,,,,,08/02 +OE8HBQ,JN76KP,,,,,,05/04 +OE8HWQ,JN76,,,,,,03/00 +OE8OLK,JN76DM,,,,,144: FT817 30W 6el,07/04 +OE9ERC,JN47VL,EME,,,,,02/05 +OE9HHV,JN47,EME,,,,,01/94 +OE9XXI,JN47UL,,,,,,01/03 +OF8UV,KP34VJ,EME,,SpecialCall,,144: Ft225RD 130W 2x14el BF981,11/97 +OG6MAZ,KP21IG,,,SpecialCall,,144: FT767GX 4CX350 200W 15el,01/00 +OG8HDL,KP34VJ,,,SpecialCall,,144: 130W 2x14el BF981,01/00 +OG8UV,KP34VJ,EME,,SpecialCall,,144: FT225RD 130W 2x14el BF981,01/00 +OH0BT,KO09KW,,,Expedition,,,01/92 +OH0JFB,JP90XI,,,,,144: 2x17el 800W,04/04 +OH0JN,KP00BB,,,,,IC706MKIIG,02/09 +OH0LIZ,KO09KW,,,Expedition,,144: 180W 2x23el,05/98 +OH0N,KP00,,,EXPEDITION,,,07/01 +OH0V,KP00,,,Expedition,,,07/01 +OH10TA,KP10DH,,,EXPEDITION,,,04/07 +OH1AK,KP01TE,,,,,,12/03 +OH1AYQ,KP12JB,,,,,,08/98 +OH1BAP,KP12AA,,,Expedition,,,01/91 +OH1CF,KP00TC,,,,,,01/94 +OH1FA,KP10PL,EME,,,,,10/02 +OH1HSC,KP10CM,,,,,144: TR9130 60W MGF1302 17el,01/01 +OH1JCS,KP10AE,EME,,,,144: 2x 10el 20W,03/05 +OH1JJC,KP10DK,,,,,,01/04 +OH1JV,KP10DK,,,,,144: IC7800 TR144J 4x 6el HL500V Preamp 0.35db,02/07 +OH1LEU,KP01UE,,,,,50: 150W 8el,09/03 +OH1LSQ,KP03SD,,,,,144: 100W ant-3WL,01/02 +OH1MDR,KP01VJ,EME,,= OH1TM,,,07/07 +OH1ND,KP00XL,EME,,,,,01/07 +OH1NOR,KP00XL,EME,,,,144: 2x 3.9wl antennas,04/05 +OH1QC,KP10MU,,,,,,01/89 +OH1TM,KP01VJ,EME,,= OH1MDR,,,07/07 +OH1XT,KP01UK,,,,,FT736r 50: 8el 150W - 144: 300W 2x15el MGF1302,11/01 +OH1XTK,KP01UK,,,,,,01/03 +OH1ZAA,KP01,,,,,,01/95 +OH2AUK,KO19TX,,,,,,01/94 +OH2AV,KP20JD,,,ex OH9NLO,,,01/94 +OH2AXH,KP20OK,EME,,,,,08/00 +OH2BAP,KP20PP,EME,,,,,01/93 +OH2BC,KP20,EME,,,,,03/05 +OH2BNH,KP20LG,EME,,,,,05/00 +OH2BYJ,KP10QO,EME,,,,144: ft-897 120 wtts ant 6wl yagi,04/08 +OH2DG,KP30CK,EME,,,,DISH 8m,03/07 +OH2HEJ,KP20ME,,,,,144: 4el 100W,08/05 +OH2JRR,KP20HE,,,,,,10/05 +OH2KKP,KP20MH,,,,,,11/95 +OH2LAK,KP10XL,,,,,50: FT847 FT817,11/01 +OH2LHE,KP11MK,EME,,OH1IT,,IC-910 4x 9el 500W,02/08 +OH2MFE,KP20JE,,,,,IC-575H IC-275E 170W FT-817 100W FT-736,04/02 +OH2MOH,KP30CR,,,,,,05/04 +OH2MPH,KP20KD,,,,,,01/04 +OH2NHP,KP20IF,,,,,144: IC970E 3CX800 MGF1302 preamp 2x15el,01/01 +OH2NY,KP20CM,,,,,144: IC202 RE035XB 320W Preamp 4x9el,04/03 +OH2PO,KP10XH,EME,,,,,11/97 +OH2TI,KP20KE,EME,,,,,01/01 +OH2Z,KP30CR,,,,,,08/04 +OH3AWW,KP11VJ,EME,,2nd QTH,,144: 150W 9el,09/04 +OH3BHL,KP10RR,,,,,IC746+ACOM1000 144: 100W 4x5el - 50: 200W 6el,08/03 +OH3BZY,KP10XP,,,,,,01/92 +OH3EX,KP20JR,,,,,,01/94 +OH3HOV,KP20MQ,EME,,= OH3JP,,144: ft847 sr-200 17b2 Ant,01/07 +OH3JP,KP20MQ,EME,,= OH3HOV,,144: ft847 sr-200 17b2 Ant,01/07 +OH3KLJ,KP21PH,EME,,,,144: 300W 4x 10el,08/08 +OH3KRH,KP21EB,,,,,,12/05 +OH3LPW,KP11WK,EME,,,,,01/94 +OH3NWQ,KP11WL,,,,,50: FT847 + GU74b,10/07 +OH3QN,KP20TX,,,,,FT-897,02/08 +OH3UW,KP21FA,EME,,,,144: 2x 17el 250W,04/06 +OH3VJ,KP21,,,SilentKey,,,01/94 +OH3XR,KP11TH,,,= OH9XX,,IC746,08/04 +OH4EA,KP32MG,EME,,,,144: FT2000D + XV-144 + LNA 0.4 dB ANT 4 x 18 el 5WL,04/08 +OH4GGW,KP31PQ,,,,,,12/04 +OH4HXK,KP21UM,,,,,,05/02 +OH4LA,KP20LG,EME,,,,144: 4x 17el 600W,07/06 +OH4MS,KP31WL,EME,,OH8LRB,,IC-910H 144: 15el X 100W 432: 24el X 75W 1296: 4x32el 10W,12/07 +OH5A,KP53NE,,,,,,09/99 +OH5AG,KP31,,,,,,02/98 +OH5HCJ,KP41EC,EME,,,,144: 4x 11el 600W,10/06 +OH5HMV,KP41EC,EME,,,,,04/05 +OH5IY,KP30HV,EME,,,,144: 1KW 4x15el - 432: 750W 8x21el,12/03 +OH5KJQ,KP41JC,,,,,FT847 144: 19el yagi 160W - 50: 4el 100W,10/98 +OH5KNG,KP30GU,EME,,,,144: 4x 9el yagis 1.2kw,03/06 +OH5LID,KP41KL,EME,,,,,07/09 +OH5LIZ,KP30HW,,,EXPEDITION,,144: 180W- 2x23el,08/01 +OH5LK,KP30ON,EME,,,,144: 1KW 4x15el,04/04 +OH5YW,KP30FU,,,,,,05/98 +OH6AA,KP03SD,,,,,144: 2x12el,12/05 +OH6AAO,KP14,,,Expedition,,,01/93 +OH6AI,KP13MW,,,,,,11/00 +OH6AW,KP03,,,,,,06/02 +OH6DD,KP22,EME,,qrv only at OH2TI,,,01/94 +OH6GDX,KP02QU,,,,,144: 60W 2x12el CueDee,08/03 +OH6HFX,KP14RA,EME,,,,FT847 400W 2x12el,06/07 +OH6JKW,KP02RN,,,,,FT847,12/06 +OH6JW,KP12AJ,EME,,ex OH6MPC,,FT847 IC7400 600W,09/03 +OH6JYW,KP22OR,EME,,,,Yaesu FT-817,01/08 +OH6KTL,KP02OJ,EME,,,,50: 6el 150W - 144: FT847+GI46B 4x15el 100W,05/06 +OH6LRL,KP13,,,,,,11/00 +OH6M,KP12KR,,,,,,06/04 +OH6MAZ,KP21IG,EME,,ex OH2MAZ,,144: FT847 4CX350 250W 2x15el MGF1302,12/04 +OH6MPC,KP12AJ,,,= OH6JW,,FT847 50: 200W - 144: 2KW - 432: 250W,01/02 +OH6MRD,KP12EP,,,,,,12/02 +OH6MSZ,KP21XU,,,,,,08/99 +OH6MW,KP20IM,,,,,144: 200W 11el,08/05 +OH6NDD,KP23VH,,,Expedition,,,01/94 +OH6NVQ,KP13IP,EME,,,,,02/05 +OH6PA,KP02PL,,,,,,08/04 +OH6QU,KP03SD,,,,,FT-1000MP + Kuhne TR 144 H + GU-78B 16 el (4.5 WL) at 44 m agl/50 m,09/05 +OH6UW,KP22WH,EME,,,,,07/07 +OH6ZZ,KP12BO,EME,,,,TS790E 2x 32XPol,02/04 +OH7AXB,KP32WH,,,,,,10/05 +OH7EU,KP33MQ,,,,,,01/95 +OH7HXH,KP53HG,EME,,,,144: 8x 3wl Antenna,08/07 +OH7LIX,KP43JQ,,,,,,09/95 +OH7MA,KP52EL,,,,,144: 4 x 10el,11/99 +OH7PI,KP32XG,EME,,,,,01/05 +OH7RJ,KP32TV,,,,,,08/02 +OH7TE,KP20IE,,,EX OH9NLO,,JUMA TRX2A 50: 200W - 144: 4el 300W - 1296: 10W - 5600: 3W,04/09 +OH7TX,KP32UV,,,,,144: FT847 50W 20el,07/05 +OH7UV,KP33MQ,,,,,50:Yaesu FT950 100W Dipole or 4 el (HB9CV 4),05/09 +OH7X,KP20IE,,,OH7PS,,IC-7700,06/08 +OH8GEJ,KP25QC,,,,,,05/02 +OH8HDL,KP34VJ,,,,,144: 130W 2x14el BF981,08/99 +OH8HTG,KP34DI,,,,,144: 9el 80W 432: 19el 80w,04/07 +OH8LRB,KP24HQ,EME,,OH4MS,,icom ic-910H,10/07 +OH8MFH,KP34UG,,,NO MS Skeds!,,144: TR751A 15el 6WU,01/00 +OH8MGK,KP23PQ,,,,,,03/08 +OH8N,KP34VJ,,,Expedition - QSL via OH8UV,,,12/98 +OH8NW,KP24SX,,,,,,01/85 +OH8NXE,KP25SB,,,,,144: TM255E Preamp 160W 2x14el,01/02 +OH8R,KP24HQ,,,ex OH8LBR,,144: 200W 8el,04/05 +OH8SW,KP22UP,,,,,,11/04 +OH8UV,KP34VJ,,,,,50: Yaesu FT950 100 W 6el (JP6m6) 144: FT225RD 350W 4CX250R 2x14el (QDee) BF981,05/09 +OH8VJ,KP22UN,,,,,,11/04 +OH9AB,KP26,,,not qrv now,,,10/05 +OH9AEM,KN08AJ,,,Expedition,,,01/93 +OH9GDT,KP26VL,,,,,144: 4 Yagis,04/06 +OH9MNO,KP46BI,,,Expedition,,,01/91 +OH9MTY,KP46BI,,,Expedition,,FT847 - 144: 700W 6x9el,06/04 +OH9NDD,KP26UM,,,,,FT847 144: 150W 4x15el preamp,08/03 +OH9NMS,KP36GA,EME,,,,,08/06 +OH9O,KP12BO,EME,,QSL VIA OH8MSM,,IC7400 gd power 15el 16el 37el loop,12/05 +OH9SCL,KP46BI,EME,,Expedition,,TR751/FT847 144: 6x9el LY 700W,06/01 +OI7UV,KP33MQ,,,SpecialCall,,,12/95 +OI8UV,KP34VJ,EME,,SpecialCall,,144: Ft225RD 130W 2x14el BF981,01/97 +OJ0LA,JP90NH,EME,,Expedition,,144: 9el 150W,09/06 +OK1AXH,JO70UR,,,,,,01/97 +OK1CA,JO70GM,EME,,,,,03/08 +OK1CDJ,JO70VA,,,,,144: 250W 17el MGF1302,08/06 +OK1COM,JN79GX,,,,,,01/03 +OK1CT,JN69TR,,,ex OK1URY,,144: 250W 2x16el CF300 - 50: 20W 5el,05/00 +OK1CU,JO80CF,EME,,,,144: 4x 17el 700W,09/06 +OK1DCF,JO80BJ,,,,,,04/02 +OK1DFC,JN79GW,EME,,,,144: 750W 18elM2 10m dish - 432: 750W 38elM2 10m dish - 1296: 100W 10m dish and up,08/06 +OK1DIG,JO60XJ,EME,,,,144: 4x17el M2 GS35 1.5KW MGF1302,04/02 +OK1DKZ,JN69XP,,,,,144: IC275H 100W MGF1302 11el,11/01 +OK1DO,JO60JD,,,ex OK1DDO,,IC7400 144: 150W 7el 50: 100W 5el,03/06 +OK1DQA,JO60TC,,,,,,08/99 +OK1DRY,JN79OW,,,,,,07/02 +OK1DST,JN79EX,EME,,,,,04/07 +OK1DTC,JO60TO,,,,,,08/03 +OK1DUO,JO80CA,,,,,HF: TS120S 500W 3el - 144: IC746 PA0MS ant,08/01 +OK1FAV,JO60CK,,,,,,01/97 +OK1FD,JO60CF,EME,,ex OK1FFD,,50: IC706 5el QUAD - 144: 300W 4CX250 10el 7ZB,08/06 +OK1FF,JN78GR,EME,,,,,01/95 +OK1FM,JN69QQ,,,not qrv MS now! (01/01),,144: 250W 17el MGF1302,11/02 +OK1FXX,JO70WL,,,,,144: TS790E 2xGI7B 3KW 4x17el F9FT 0-4db NF - 432: TS790E GI7B 1-5KW 4x21el 0-9db NF DSP,01/90 +OK1FZA,JO70FC,,,,,,01/92 +OK1HAG,JN79,,,,,,01/97 +OK1IBL,JO60CG,,,,,,01/91 +OK1IN,JO60XA,EME,,ex OK1UND,,TS515 FT221 144: 16el 100W Preamp,02/06 +OK1KEI,JO60JL,,,,,,01/97 +OK1KF,JN79IW,,,OK1DFM,,,01/09 +OK1KHI,JO70ED,,,,,,05/02 +OK1KIR,JN79,EME,,,,,01/94 +OK1KJB,JN79IO,,,,,,08/99 +OK1KKH,JN79,,,,,,01/93 +OK1KRQ,JN69QR,EME,,,,144: 400W 17el M2 CF300,10/99 +OK1KRY,JN69TR,,,,,50: 20W 5el - 144: 250W 2x16el CF300,04/05 +OK1KT,JO70WE,,,,,FT 847 - 50: 20W 5 el - 144: 600 W 15 el CueDee - 432: 50W 21 el F9FT,05/07 +OK1MAC,JN79PQ,,,,,,08/08 +OK1MDK,JN79TO,,,,,,06/08 +OK1MS,JO70SL,EME,,,,,10/08 +OK1MZM,JN69PR,,,,,144: 300W 9el 360m asl,06/04 +OK1NH,JN69UH,,,,,144: 10el 20W,05/04 +OK1RK,JO70KD,EME,,,,144: FT847 250W 10el DK7ZB,08/05 +OK1TEH,JO70FD,EME,,,,144: FT847 1KW 10el - 432: 500W 23el K1FO,12/06 +OK1UGA,JO80DD,,,,,144: Icom 821 + 200W + 5WL,01/07 +OK1UWA,JN69QT,EME,,,,1296: par 2.4m 180W 0-45db NF,08/00 +OK1VAO,JO70EB,EME,,OL1VAO,,,02/09 +OK1VBN,JN78,,,,,,01/97 +OK1VHF,JO70EB,,,,,144: 10ml M2 1200W - 432: 6m Tonna 600W - 1296: 5m Tonna 10W,01/05 +OK1VHH,JO70CK,,,,,144: 20W,04/02 +OK1VKC,JN79OW,,,,,,05/02 +OK1VSC,JN79OW,,,,,144: 100W 7el Quad,03/02 +OK1VT,JN79IX,,,,,,07/01 +OK1VVT,JO60TP,,,OL4VTD,,TS-790,04/07 +OK1WCF,JO80BJ,,,,,144: R2CW PA 100W 2x 16el F9FT,04/04 +OK1WN,JN69LK,,,,,144: 100W 16el CF300,10/01 +OK1XXT,JO70GA,,,,,,04/02 +OK1YA,JO70GC,EME,,,,144: 4x 11el 1500W,03/06 +OK1YK,JN78GX,EME,,ex OK1AYK,,FT 847 144: 750W 4x 17el MGF1302 - 432: 1kW 5m dish MGF 1801,10/06 +OK2AB,JN89TI,,,,,,12/03 +OK2BDS,JN79WF,,,,,144: BMT226 100W 10el.7ZB - 432:IC706MKIIG 100W 2x 23el.7ZB - 1296: FT817+transv. 50W 32el.9BV,04/06 +OK2BMU,JN99BU,,,EX OL7AVX,,TM255E/TM455E + PA 150W 144: 13 el 432: 21el,04/07 +OK2BON,JO70,,,,,,07/02 +OK2BRD,JN99ET,,,,,IC706MKIIG,08/03 +OK2BXE,JN89SJ,,,,,144: FT847 100W 16el MGF1302 - 10368: 1.5W Dish,07/01 +OK2DL,JN89AO,EME,,,,,06/02 +OK2GM,JN99GM,,,ex OK2BZQ,,FT897D+LNA,03/07 +OK2ILA,JN89WW,,,,,,12/08 +OK2IT,JN99BO,,,= M0ITY G6UT - ex OK2ITY,,TRX210 Snezka 750W 2x4el Yagi,07/06 +OK2KET,JN89JN,,,,,,03/01 +OK2KUB,JN89,,,,,,01/93 +OK2KZR,JN89BO,EME,,,,,01/93 +OK2MWR,JN99HQ,,,,,144: IC706 100W 14el PBM,08/00 +OK2PM,JN99AO,,,ex OK2BGQ,,IC706 FT736,08/03 +OK2PMA,JN89HF,,,,,FT-897,10/07 +OK2PMG,JN89SJ,,,,,144: FT847 100W 16el MGF1302 - 10368: 1.5W Dish,07/01 +OK2PMS,JN89WW,,,,,FT847 300W DK7ZB,04/08 +OK2PMX,JN88IW,,,,,IC706,04/04 +OK2POI,JN99AJ,EME,,,,,07/08 +OK2PTC,JN89MM,,,,,,08/04 +OK2PWY,JN89IW,,,,,,05/06 +OK2PZW,JN89HI,,,,,,01/03 +OK2QI,JO80OC,,,,,,01/95 +OK2SBL,JN99HQ,,,,,,08/00 +OK2SGY,JN89SS,,,,,,08/96 +OK2SLC,JN89ED,,,,,,04/05 +OK2TUH,JN89RB,EME,,,,144: 7el 200W,03/06 +OK2UGG,JN89EN,,,,,,12/01 +OK2UZL,JN79UG,EME,,,,144: 4x 9el 50W,12/05 +OK2VMD,JN89HI,,,,,,01/94 +OK2VSO,JN99AJ,EME,,,,,03/06 +OK2WO,JN89IH,,,,,,04/04 +OK2XPJ,JN89,,,,,,04/02 +OK2YT,JN88IW,,,ex OK2PMN,,144: 100W 15el,08/06 +OK2ZAW,JN79XN,EME,,,,144: IC-706 12el ZZ212 300W GI7bt,02/05 +OK2ZC,JN89HI,,,OK2BEE,,ICOM 746-PRO 100W 7EL DK7ZB YAGI,05/08 +OK2ZI,JN89AD,,,EX OK2XTE,,,06/08 +OK2ZW,JN89HI,,,ex OK2PZW,,,08/02 +OK2ZZ,JN89DF,,,,,,08/96 +OK3RM,JN69MS,,,,,,12/07 +OK5ACR,JO60NX,,,,,,05/00 +OK5TK,JO70MB,EME,,OK1UAK,,100W 10el 2.2wl Yagi,05/07 +OK6TW,JN89,,,,,,08/08 +OK8BXF,JO70VA,,,,,,06/04 +OL2O,JN79IO,,,,,,12/01 +OL5MS,JN69MJ,,,,,,08/99 +OM2TW,JN88UG,,,,,144: IC746 17el LY,07/01 +OM3AU,KN08OR,,,SilentKey,,,01/93 +OM3BC,JN98VG,EME,,EX OM3WBC,,144: 1KW 4x 12el 432: 1kW 4x 23el,06/08 +OM3KDX,KN19DB,,,Expedition,,144: IC-746 GS35b 4x6 el. 18el. M2 - 10368: 5W 60cm dish,06/04 +OM3KKF,JN88MD,,,,,144: 700W 13el,07/05 +OM3KMY,JN88MK,,,ex OK3KMY,,,01/94 +OM3LQ,JN88MK,,,ex OK3LQ,,,08/01 +OM3TZZ,JN88TI,,,,,FT847+PA 400W+7el. QUAD,12/08 +OM4EX,JN98HS,,,,,,07/04 +OM5CM,JN98DF,EME,,EX OK3YCM OM3YCM OM7YCM,,IC910H 144 MHz: 100W 9el 432 MHz: 75W 18el 1296 MHz: 10W 55el,10/07 +OM5KM,JN98AH,,,,,,01/02 +OM5UM,JN98EO,,,,,,04/02 +OM7AC,JN98NN,,,EX OM3YIH OK3YIH,,FT225RD FT780 FT897D/2x10el DK7ZB/2m+17el DK7ZB/70cm+crossyagi for satellite,07/08 +OM7AQ,JN98UI,EME,,OL9CQN OK3TEM OM3TEM,,144: FT897D 600W 16el F9FT MGF1302 - 432: 400W 4x18el or 4x21el MGF1302 - 1296/2320: 10W 1m dish,03/07 +OM7CM,JN98NR,EME,,OK3CKJ,,144: FT - 847 50W F9FT - 9el,04/07 +OM7JG,JN98TI,,,,,,01/02 +OM9AAW,JN98EP,,,Expedition,,,07/95 +OM9M,KN18AM,,,,,,08/99 +ON1AEN,JO10UV,,,,,,01/03 +ON1AFN,JO20SW,,,,,144: FT290r 150W,09/98 +ON1ALJ,JO10SS,,,,,144: TS790E 3CX800 MGF1302 10el 9BV - 432: TS790E 400W 2x18el 9BV MGF1302,11/01 +ON1DDC,JO21UD,,,,,144: 16el 800W,08/97 +ON1RR,JO11XA,,,ex ON1AXO,,FT100,09/01 +ON2MRT,JO21MB,,,,,,07/03 +ON3VHF,JO20EM,,,ex ON2VHF,,144: ft290r microset RV45,08/05 +ON4ADC,JO21FA,,,,,,09/03 +ON4AMX,JO20KV,,,= OQ4U,,144: IC910 2x8wl GS35b,05/08 +ON4ARF,JO10MV,,,,,,05/02 +ON4ASL,JO21,,,,,,01/94 +ON4AVJ,JO11UB,,,,,144: IC275HE 3CX800A7 17el MGF1302,10/04 +ON4BBD,JO21NA,,,ex ON1CBT,,FT736 TS440S,01/04 +ON4BG,JO10WM,,,,,,12/01 +ON4CHP,JO21JD,,,,,144: 150W B5016G 11el FX224 SP2000,10/07 +ON4CJU,JO20,,,,,,11/01 +ON4DPX,JO10NT,EME,,ex ON1DPX,,FT736 FT847 144: 4x 3wl 1KW - 432: 2x 26el 9BV - 1296: 4x 44el 6WU,09/06 +ON4FI,JO20IV,,,,,144: 3CX800 600W 13el MGF1302,12/99 +ON4GG,JO20AR,EME,,,,50: 9el MGF1302,04/05 +ON4IMM,JO11UB,,,EX ON1IM,,144: TS440S + LT2S MK2 Preamp PA3BIY design 4x7el 3CX800A7 600W,02/08 +ON4IQ,JO20AR,EME,,ex ON4ANT,,50: 4x 6M9KHW FT1000mpMkV FTV1000 - 144: 8x 2M18XXX TS2000X GS35,05/05 +ON4KEP,JO10WI,,,,,,08/08 +ON4KHG,JO10XO,EME,,EX ON1KHN,,144 : 300W 4 WL MGF1302,10/08 +ON4KNG,JO20DU,EME,,,,,01/04 +ON4KST,JO20HI,,,,,,05/04 +ON4LDP,JO10UM,,,,,50: HM tsvter 2m/6m 30W GP - 144: 150W 13el MGF1302 432: 35W 21el - 1296: tsvter DB6NT 20W FHX35,06/02 +ON4LN,JO20IV,EME,,EX ON4CGP,,144: IC-746/IC-7000 GS35b 17ele M� MGF1302,05/07 +ON4LUC,JO20TM,EME,,,,144: ft1000mp transverter 800w hf max amplifier 13 el Flexa (soon 4x 13el),01/04 +ON4MU,JO20SS,EME,,ex ON1KPW,,Ft847 150W 0.5dB 3wl,08/03 +ON4PS,JO20KQ,,,,,Yaesu Ft 847 + 8874,03/07 +ON4QQ,JO20FS,,,,,,07/95 +ON5AEN,JO10VW,,,EX ON1AEN,,FT225RD TS770e FT690RII,04/08 +ON5GS,JO20SS,,,EX ON1DLL,,144: IC821 600W 15el,08/08 +ON5LGS,JO10OS,,,ex ON1LGS 3X1SG,,,09/03 +ON5UE,JO11LF,,,EX ON1BCD,,TS2000DX,05/07 +ON6AB,JO21EC,,,,,TS930S,03/04 +ON6JY,JO20WP,EME,,,,HF + Transverters,10/05 +ON6NL,JO21UE,,,,,144: IC756PRO 125W 13el DL6WU,04/08 +ON6OD,JO20HW,,,,,,01/93 +ON7EH,JO20FV,EME,,,,,08/04 +ON7KGK,JO20BL,,,ON1KGK,,k3,02/08 +ON7RB,JO11VA,EME,,,,144: 8x13el hor. & 8x12e vert. Full Az/El 1KW,11/03 +ON7UC,JO11ND,EME,,,,144: 3CX800A7 4x16el 4.2wl,05/07 +ON7YK,JO20XL,,,,,TS2000,04/07 +OQ1AEN,JO10VW,,,,,FT225RD TS770E,11/01 +OQ4U,JO20KV,,,= ON4AMX,,144: IC910 2x8wl GS35b,05/08 +OT4G,JO10XO,,,= ON4KHG,,144 : 300W 4 WL MGF1302 - 1296 : 10W 35 el,04/06 +OU9S,JO54TU,EME,,= 5P9S OZ9S OV9S 5Q9S,,See www.oz9s.dk (click rig) for actual and updated info,05/07 +OV9S,JO54TU,EME,,= 5P9S OU9S OZ9S 5Q9S,,See www.oz9s.dk (click rig) for actual and updated info,05/07 +OX2K,GP47TA,EME,,,,144: 4x5wl - 432: 4x28el - 1296: 32m dish,05/00 +OY3JE,IP62OA,EME,,,,,03/08 +OY4TN,IP62NB,,,,,144: 300W 8el,03/08 +OY9JD,IP62OA,,,,,,01/04 +OZ0JX,JO54VU,,,,,IC761 IC756 50: 5el F9FT,01/03 +OZ1ALS,JO45VA,,,,,144: 2x9el 500W,04/07 +OZ1CDE,JO65CO,,,,,50: FT847 6el 850W,02/02 +OZ1CLL,JO65GQ,,,,,,06/05 +OZ1CTZ,JO46OE,,,,,,01/02 +OZ1DJJ,JO65HP,EME,,,,FT847 IC756pro2 transverters,04/07 +OZ1DPR,JO45IG,,,,,50: Yaesu FT-920 GS35b 1000W 5el,08/03 +OZ1FDH,JO65CS,,,,,,07/99 +OZ1FF,JO45BO,,,OZ9KY,,1296: 145W LNA 1 5m dish 2320: 125W LNA 1 5m dish - 5760: 7W 1 5m dish - 10368: 65cm dish 2W- 24048: 65 cm dish 2W,09/07 +OZ1FTU,JO55WW,,,,,,01/93 +OZ1GEH,JO65AL,EME,,,,,01/93 +OZ1HNE,JO57,EME,,,,144: 4x18el crossyagi 8877,12/05 +OZ1HTB,JO75,,,,,,11/96 +OZ1IEP,JO55XU,EME,,,,50: 100W 6el - 144: FT736 1KW 2x11el - 432: 600W 2x23el,03/05 +OZ1IPU,JO57JH,,,,,,01/93 +OZ1JFK,JO47WL,,,,,,10/08 +OZ1JVX,JO46DS,,,,,,01/96 +OZ1LPR,JO44UW,EME,,,,144: IC756PROII LT2SMK2 Transv. 2x M2XP20 Xpol full elevation 1KW YL1050 PA or TH347 PA,04/06 +OZ1MAX,JO57GI,,,,,Kenwood TS-2000,03/05 +OZ1MFP,JO55SK,EME,,,,kenwood ts 790e ts 2000e,08/08 +OZ1PIF,JO65AN,EME,,= 5Q2M,,FT847 50: 100W 4el - 144: 350W 17el Preamp,02/09 +OZ2BZQ,JN99GM,,,,,,05/06 +OZ2EEZ,JO45,,,,,,01/03 +OZ2ELA,JO65,,,,,,01/97 +OZ2M,JO65FR,EME,,,,,07/09 +OZ2TF,JO46PE,EME,,,,144: IC271h 750W 4x9el Preamp,10/02 +OZ3K,JO45TL,,,EX OZ1ELF,,IC746PRO,04/07 +OZ3TT,JO66CB,EME,,ex OZ1IUK,,144: ICOM 275H Amp. CS31 M2 18 el MGF130,12/04 +OZ4MM,JO55GH,EME,,,,10m dish,10/02 +OZ4VV,JO46QU,EME,,,,50:1000w 9el - 144:1000 Watt 15el MGF1302,02/05 +OZ50MHZ,JO55EJ,,,OZ1IZB G0DJJ & OZ7M,,,03/08 +OZ5AGJ,JO47IA,,,,,144: ICOM 706MK2G 160W 9Elem 2.2wl,05/07 +OZ5IQ,JO65AO,EME,,OZ1EME AS WELL STILL OK,,,06/07 +OZ5QF,JO45VB,,,,,,10/95 +OZ6ABA,JO57DJ,EME,,,,144: FT736r Mutek Preamp 1KW 15el DJ9BV,08/08 +OZ6EI,JO45TT,,,,,,08/01 +OZ6OL,JO65DJ,EME,,,,,09/06 +OZ6OM,JO55EJ,,,OZ1IZB G0DJJ & OZ7M,,,03/08 +OZ7LE,JO45,,,= DJ3LE,,144: 9el 400W,03/01 +OZ7U,JO45RL,,,ex OZ1BVW,,TS940S FT847,09/06 +OZ7Z,JO44VW,EME,,OZ1DSK,,144: FT736 500W WX20 Yagi,03/07 +OZ8FR,JO55SK,EME,,,,,03/05 +OZ8ZS,JO55RT,EME,,,,144: IC706 GI7b 400W 17 elm,02/08 +OZ9AAR,JO45TS,EME,,qrt EME,,8x15el Crossyagis- 1KW,12/99 +OZ9FW,JO65CO,,,,,Homebrew 1kW(2m 70cm),04/07 +OZ9S,JO54TU,EME,,= 5P9S OU9S OV9S 5Q9S,,See www.oz9s.dk (click rig) for actual and updated info,05/07 +PA0AVS,JO22,EME,,,,,01/94 +PA0BAT,JO31FX,EME,,,,,01/03 +PA0BWL,JO21SS,,,,,,08/08 +PA0C,JO22FD,EME,,ex PA0CIS,,Ft 847 QBL 5/3500 0.4 dB NF 2x 17 el,02/06 +PA0HIP,JO21JO,,,,,,01/93 +PA0JMV,JO21PM,EME,,,,144: 1x12 and 4x10 el 2x 3CX800A7 0.18dB NF,01/08 +PA0LPE,JO20WW,,,,,50: FT847 7el - 144: IC202 400W 2x11el,01/01 +PA0O,JO33HG,,,ex PA0OOS,,,08/03 +PA0PVW,JO22VA,,,,,144: 18el M2 3CX800,07/02 +PA0RDY,JO22KJ,,,,,144: 500W 15el MGF1302,10/99 +PA0RLS,JO22,,,,,,01/93 +PA0TBR,JO22PI,,,ZS4BU,,,05/07 +PA0V,JO33II,EME,,ex PA0OOM,,144: 6 x DJ9BV 4 WL Xpol 8 BLF278 Mos fet PA MGF 1801 preamp,04/05 +PA0WWM,JO22FE,,,,,144: 160W 9el MGF1302,04/01 +PA0ZH,JO33AB,EME,,,,,01/07 +PA1AW,JO21GU,EME,,EX PA3DMH PC1A PE1JUP PD0LGF,,144: IC7400 + 11el F9FT. 50: IC756Pro+ACOM10000+5 el.,05/09 +PA1BVM,JO21RI,,,ex PE1BVM,,50: IC202 Transv. dipol - 144: FT-225 IC 746 MGF1302 2x17ele,05/03 +PA1GYS,JO22WW,EME,,EX PA3BXH PE1DWI PD0HKC,,144: TS850 TR144H 2 x 2MXP20 700W,03/08 +PA1LA,JO32LS,EME,,EX PE1RWS,,144: FT857d - LNA atf54143 - 9 ele. vargarda - GS35b QRO.,12/08 +PA1T,JO33JF,EME,,EX PA9KT PA3FBN,,144: FT1000MP MV TR144H 8877 4x17el M2- 50: 1y. 70cm: 1y. 23: 1.2dish,08/07 +PA1VW,JO22IN,,,EX PE1OLD AND PA3GNF,,FT-897 100 Watt PA 16JXX2 4.4 wave13 m ASL,12/08 +PA25FMF,JO22XW,EME,,SpecialCall,,144: 4x 12el DK7ZB 600W no preamp,10/06 +PA2CHR,JO32DB,EME,,,,144: 2x 16el XPol,01/08 +PA2DW,JO22GD,EME,,ex PA2DWH- PE0DWH- GM5CJF,,144: TenTec Trvt 400W(2x4CX250b) 10el,09/04 +PA2GER,JO21EW,EME,,,,,09/99 +PA2KW,JO22SB,,,ex PE1FYJ PA3BZL,,144: 1x16el KLM 1.2KW MGF1302,10/04 +PA2M,JO21IP,,,ex PA3DYS,,FT847 144: 2x blf278 9el 432: 16 el,11/04 +PA2MRT,JO32HI,EME,,PD0HP,,144: 4x 7el DK7ZB ME1500V with GS35B 1200 W Icom 910H icom 7400 YAESU FT1000d,08/07 +PA2V,JO22IM,EME,,ex PA2VST,,Homebrew + IC756pro2 & IC706mk2g,03/07 +PA2XHF,JO32HN,,,PA2B,,,04/09 +PA3BGM,JO33CE,,,,,,08/99 +PA3BIY,JO22EB,,,,,144: 400W 2x9el,03/02 +PA3BZO,JO21RS,EME,,,,,08/03 +PA3CEE,JO33JI,EME,,PE1FMG PD0GIK,,144: 600W 2x 5wl M� MGF1302,08/07 +PA3CMC,JO21WI,EME,,ex PA9LB,,144: LT2s mod. MGF1801 PA8877 4x 16el X-pole I0JXX or FT736 Mutek or TS2000 MGF1302 PA 500W 13 el. DJ9BV,04/06 +PA3COB,JO32MF,EME,,,,144Mhz only: FT756proIII - Kuhne TR144H +40 - 4X7el - 1Kw,02/08 +PA3CPI,JO22JW,,,,,FT847,08/08 +PA3CSG,JO21WD,EME,,,,,01/07 +PA3CWI,JO11TK,EME,,,,144: FT736 6x12 el M2 MGF1302 8877-Ampl,10/06 +PA3CWN,JO33AH,EME,,,,144: 600 W 4x 9el 7ZB,03/07 +PA3DOL,JO22MT,EME,,,,144: 17el 3cx800 amplifier abt 700w EME 4x9el DK7ZB abt 700w,09/08 +PA3DRL,JO21PS,,,,,K2 + XV144 Elecraft 4x 7el dk7zb GI7-b preamp 20 dB nf 0.8,05/07 +PA3DUU,JO21IU,,,,,,01/93 +PA3DZL,JO21HM,EME,,,,144: 4x17el 3.6ld MGF1302 EME Pwr - 432: 2x21el EME Pwr - 1296: 2.5m Dish 150W,03/07 +PA3EAQ,JO31CI,,,,,FT767 50MHz: 100 watt 3 el 144MHz: 100 watt 7 el,08/08 +PA3ECU,JO32CF,EME,,PD0NEN PE1JSB,,144: Ft847 8877 2x8Xpol DK7ZB LNA .19Db,12/08 +PA3EON,JO21,,,,,,01/93 +PA3EPX,JO22RC,,,,,,01/93 +PA3EQS,JO22TI,,,,,,01/93 +PA3FOC,JO21FW,EME,,,,144: TenTec Paragon LT2S 17el (2x17el) PA MGF1302,07/05 +PA3FPQ,JO22XE,EME,,PE1GXU PD0JNN,,144: TS850 + TR144H 2x10 elem. DJ9BV H + V pol. 1KW,01/08 +PA3FSA,JO23RF,EME,,,,,10/05 +PA3FVE,JO21WG,,,,,,01/93 +PA3FXB,JO33KC,EME,,PE1CIO,,12 el DK7ZB 350 W,06/08 +PA3FXW,JO22QD,,,,,,01/93 +PA3FYF,JO22DB,,,,,,01/93 +PA3FYG,JO22SI,,,PE1GTE,,TS870,01/08 +PA3GBR,JO32LH,,,,,,01/93 +PA3GCV,JO32LU,EME,,,,50: FT897 7el 9.40 m Boom 21m asl 1kw,02/09 +PA3GVC,JO22MU,,,,,,12/04 +PA3HJG,JO32BG,,,,,TS2000 50: Dipol - 144: 13el,08/03 +PA4EME,JO20WX,EME,,PE1FEY - ON8YA - ON4AUD - PA3GIJ,,144: 0.22 dB 2.5 kW 3.2 wl DJ9BV,12/07 +PA4PS,JO33GH,EME,,PD2PS PE2PS,,144: 4x10 from YU7EF,01/09 +PA4VHF,JO32JE,,,EX PA3FJY,,50: 100W 7elM2 - 144: TS850 LT2S 400W 17B2,12/08 +PA5DD,JO22IC,,,ex PA3HDD OZ1DOQ,,144: GS35b 15ele CUE DEE,01/05 +PA5KM,JO11WL,EME,,,,144: IC 910 H +8877 2x12 EME 1x9 TR MS AU ES,09/07 +PA5M,JO21BS,,,ex PA5MD PA3GST,,,08/03 +PA5MS,JO21RQ,EME,,EX PE1OGF,,144: 11el GS35b 400W MGF1302,05/07 +PA60SHB,JO21OS,,,SpecialCall,,,12/04 +PA6BN,JO13OF,,,Expedition - QSL via PA3BIY,,,07/98 +PA6MS,JO32QF,,,SpecialCall,,,10/96 +PA6T,JO32GF,,,SpecialCall,,,12/98 +PA7AL,JO23VG,,,,,,12/04 +PA7C,JO32GF,,,ex PA2TAB,,50: 100W 6el - 144: R2CW GS31b 400W 14el MGF1302,09/03 +PA7FA,JO21PT,EME,,EX PE1OUC,,IC756-III,04/07 +PA7FE,JO22OC,,,ex PA3BFM,,50: 6el leg pwr,03/99 +PA7FM,JO21,,,ex PE1PZS,,,08/00 +PA7N,JO23WB,EME,,PE1LZX,,IC-910H TS-480HX,01/09 +PA7PYR,JO21UQ,,,ex PD0PYR,,TS450SAT HF: FB33 - 144: 25W 2x17el Tonna - 432: 25W 23el,09/03 +PA7RP,JO22EC,EME,,ex PA3BBA,,144: 400 Watt (GS35b) 17 el F9FT,01/06 +PA7WM,JO23TA,,,ex PA3DWD,,,03/99 +PA9RX,JO32MT,EME,,,,144: FT847 4x17el 200W,04/07 +PA9T,JO22KA,,,PD0TKS,,,06/09 +PB0AHX,JO22,EME,,,,icom 910H for 2-70-23 and icom7400 for 50mhz,04/08 +PB0ALS,JO21RV,,,,,,01/93 +PB1TT,JO22FF,,,ex PA3EFC,,144: 100W 10el CueDee,09/01 +PC7M,JO32GF,EME,,ex PA2TAB PE0TAB,,50 MHz : FT847/120W/6el - 144 MHz : FT847/400W/14el,04/06 +PD0ANQ,JO31EW,,,,,,11/01 +PD0CIF,JO32KT,,,,,FT-847 and FT-817,07/07 +PD0HCV,JO31FW,,,,,IC821 144: 15el QD 50W 432: 18el M2,08/05 +PD0ORT,JO23RE,,,,,,03/06 +PD1AIQ,JO22RM,,,,,144: 25W 4x9el,04/03 +PD1ALD,JO32FI,,,,,Yaesu FT897- Kenwood TR9130- Yaesu FT817,06/03 +PD2GCM,JO21ET,,,,,FT847,11/04 +PD2TW,JO33FI,,,,,,04/09 +PD2VDV,JO23RF,,,,,,08/04 +PD3AHW,JO32LF,,,,,,05/05 +PE1AHX,JO21OS,,,,,,02/05 +PE1BTX,JO22XW,EME,,,,144: 4x 12el DK7ZB 600W no preamp,10/06 +PE1DAB,JO23RD,,,,,144: 2x 8el JXX 100Wh,12/08 +PE1DCD,JO21FU,,,,,,05/03 +PE1GNP,JO31IX,,,,,,05/03 +PE1GUR,JO22TH,,,,,144: 16el 350W,07/05 +PE1HWO,JO21GV,,,,,144: FT101ZD + TRV FT225RD PA 17el MGF1302,04/07 +PE1IKX,JO11TM,,,,,144: 400W 15el Quedee,06/05 +PE1ITR,JO21QK,EME,,,,144: 2x10el 200W 3SK183 432: 2x16el GS35b 0 35db - 70: rx 5el - 222: rx 10el 3SK183 - 1296: 10W 26el,09/07 +PE1L,JO23WF,EME,,EX PE1LCH,,2 x 14 dk7zb,04/07 +PE1LWT,JO22VA,EME,,,,144: 300W 2x3wl-Xpol,07/05 +PE1M,JO23XE,,,ex PE1MCD,,,08/03 +PE1MVJ,JO21FV,,,,,,11/96 +PE1OID,JO33KI,EME,,,,144: TR 751e 160W 10el,10/05 +PE1OPK,JO23UE,,,PD0NXG,,IC821/IC202,12/08 +PE1PQX,JO32LS,,,ex PD0RJH,,,06/06 +PE1RBG,JO21,,,,,,11/01 +PE1RDP,JO21QK,EME,,,,FT847 144: 2x 10el DK7ZB GS35 MGF1801,09/07 +PE1RLF,JO32CG,,,,,144: TS850 LT2S 4CX250F 10el,05/07 +PE1RMN,JO11WR,EME,,,,FT857 FT847,08/07 +PE1RWS,JO32BM,,,,,,01/05 +PE2PE,JO21LU,,,ex PE1BNK,,144: 400W 15el Cue Dee - 50: 20W 6 El Cue Dee - HF: 10W,03/07 +PE2RMI,JO23MH,,,,,,01/02 +PE2S,JO31AU,EME,,EX PE2SVN,,FT1000 LT2s BLF278/3CX800,03/08 +PE9DX,JO33MD,EME,,,,144: TS711 600W 10 elm dk7zb VV atf 54143,10/07 +PE9GG,JO33NA,,,ex PE1PJG,,,04/05 +PE9HNE,JO22FB,EME,,ex PD1ABZ,,TS711,09/03 +PI4NYV,JO32EH,,,,,144: 400W 9el or 17el (/p JO32FI),12/96 +PI9CAM,JO32ET,EME,,,,,01/09 +PJ4CX,FK52UD,EME,,EXPEDITION,,,05/07 +PJ4EME,FK52UD,EME,,EXPEDITION,,,05/07 +PJ4LS,FK52UD,EME,,EXPEDITION,,,05/07 +PP2KR,GH53IG,EME,,,,TR9130,02/05 +PP5XX,GG53QW,EME,,,,144: 150W single yagi,05/08 +PR8ZX,GI64GL,EME,,EX CT1DYX,,144: 13 el dl6wu 150w mgf1312,05/07 +PT7ZAP,HI06RG,EME,,,,TS-2000,05/08 +PT7ZAP,HI06RG,EME,,,,TS-2000,05/08 +PT9FH,GH11EA,EME,,,,144: 4x12el 2x4CX250,04/00 +PT9PA,GG49DF,,,,,,04/08 +PY0FF,HI36TD,EME,,,,144: 4x 12el 100W,05/08 +PY1EPU,GG87KD,EME,,,,144: 6 x 16el 160W FT 1000 Mark V Field + Transvert,02/08 +PY1IAM,GG87,EME,,,,,04/04 +PY1RO,GG87LB,EME,,,,IC706MKIIg 1000W 8 over 8 el,09/06 +PY2ALR,GG66UB,EME,,,,,08/08 +PY2ANE,GG66SH,EME,,,,,05/05 +PY2BL,GG67LE,EME,,ex ZZ2RED,,144: TS2000 IC910 2x 15el 1KW,05706 +PY2BS,GG66PJ,,,,,,09/08 +PY2BVF,GG66TB,EME,,,,144: 4x 10el 1KW - 432: 2x 28el 800W,08/05 +PY2CLL,GG66RF,EME,,,,144: Kachina 505DSP Trvt 4x18el M2 LNA 300W,01/00 +PY2NI,GG66RK,EME,,,,,07/01 +PY2OC,GG66OT,EME,,,,50: 8el 100W - 144: 12el 160W,08/05 +PY2PD,GG66RF,EME,,,,MP1000- LT2S- 4xM2XP28- 3CX800 0-4db,03/99 +PY2PLL,GG66RF,EME,,,,144: 750W 16el or 2x15el - TS790A xverters for 432 and 902 and 1.2,03/01 +PY2SRB,GG48BC,EME,,,,144: 160W 4x 10el,06/06 +PY3CRX,GG66RF,,,,,144: 750W 16el or 2x15el,08/00 +PY3FF,GF49IU,EME,,,,,05/05 +PY4EPU,GG88PO,EME,,,,YAGI FULL SIZE FOR 14 21 28 50 144 220 440 MHZ,04/06 +PY4OG,GG78QQ,EME,,PY4LOG,,4x 12el 1KW,09/07 +PY5EW,GG46IP,EME,,,,144: 15el 100W,05/08 +PY5ZBU,GG54,EME,,,,,01/00 +PY8ELO,GI25AR,,,,,,01/08 +PZ5CY,GJ25JT,EME,,,,50: 1x 6el,03/06 +R1MVA,KP40GP,EME,,Expedition,,144: 150W,07/99 +R1MVW,KP40GP,EME,,EXPEDITION,,144: 2x 9el or 18el 500W - 432: 40el 500W,11/05 +R1MVZ,KP40GP,EME,,,,144: 4x14el 1.2KW,10/99 +R3VHF,LO16XG,,,SpecialCall,,,01/96 +RA0ACM,NO76EB,EME,,,,144: 4x 9el 300W,08/06 +RA0CGT,PN78NL,EME,,,,,10/08 +RA0FCA,QN16IW,EME,,,,144: 4x 15el Xpol 1KW,11/06 +RA0FU,QN16IW,EME,,,,144: 4x 15el Xpol 1KW,04/06 +RA0FW,QN16IW,EME,,,,144: 4x 15el Xpol 1KW,11/05 +RA1ASA,KP50FB,,,,,,01/76 +RA1AY,KP50EA,,,EX UA9KG,,144: 15 el TS2000 GI7B 300 W,04/07 +RA1QA,KO99WF,,,,,144: 300W 2 x10el 9BV,12/06 +RA1QAX,LO09CC,,,,,144: IC706 10el PA,10/04 +RA1QIB,KO99WG,,,,,,11/05 +RA1TBH,KO58PN,EME,,,,TS-2000X 100 W 10 el DK7ZB Pre Amp,03/09 +RA1TC,KO58ON,,,,,,01/92 +RA1TL,KO67,,,,,,05/04 +RA1TM,KO67PX,,,,,IC746,11/04 +RA1WL,KO47EV,,,,,Kenwood-2000X,03/08 +RA1WU,KO47ET,,,,,,05/08 +RA1WZ,KO47EV,,,,,,06/09 +RA1ZC,KP59JK,EME,,ex UA1ZCG,,IC706MK2 144: 2x10el DJ9BV 1KW,11/01 +RA1ZK,KP68MV,,,,,,11/04 +RA3AGS,KO85UU,,,,,,01/90 +RA3AQ,KO85JE,EME,,,,144: 6x 6.3 wl cross yagi 1500W,05/07 +RA3DHK,KO95JH,EME,,,,144: FT-736R Toshiba NB 500W 2x2M12,10/06 +RA3DQ,KO85US,,,,,144: IC746 100W 16el,09/01 +RA3DQT,KO95JH,,,,,144: FT-736R Toshiba NB 170W 1x2M12,07/06 +RA3DRC,KO95AP,,,,,144: FT-847 50Wtts 17el DJ9BV 9.2 m long,03/04 +RA3EC,KO82PT,EME,,,,1296: 3m Dish RA3AQ septum feed 200 W output,10/08 +RA3EL,KO82AX,,,ex UA3EAT,,144: 50W 16el,03/04 +RA3FO,KO86SI,,,,,,01/95 +RA3GES,KO92SO,EME,,,,144: 4x 7el 200W,11/05 +RA3IM,KO56UM,,,,,,06/04 +RA3IS,KO76WU,EME,,EX UA3IFI,,2m: 1 hp 1x19el SM2CEW 5wl crossyagi 70cm: 21F9FT 23cm 2m dish,09/07 +RA3LBK,KO65QA,,,,,144: 200W 17el,01/00 +RA3LE,KO64AR,EME,,ex UA3LBO,,144: 2x LY Xpols 400W,12/06 +RA3LW,KO54MQ,,,UA3LAW,,IC-7000 144:2x7el 432:24el 1296:22el G3JVL and PA,11/08 +RA3MR,KO98JC,,,ex UA3MEP,,IC910,08/05 +RA3QTT,LO01GQ,,,,,144: GS35 0.5KW 4 x 3.3wl 9BV 0.35db,11/03 +RA3TES,LO15WJ,,,,,,11/95 +RA3WDK,KO81BR,,,,,144: 60W 11el,04/04 +RA3XAL,KO84DM,,,,,,08/05 +RA3YCR,KO73DH,EME,,SilentKey,,,01/94 +RA4HCN,LO43SL,EME,,,,144: 1KW 4x13el,09/07 +RA4HGN,LO53BE,,,,,,08/07 +RA4NAK,LO58GH,,,,,,08/08 +RA6AAB,KN94UR,EME,,SilentKey,,,01/92 +RA6AX,KN95,EME,,,,,04/07 +RA6DA,KN96SA,EME,,,,144: 8x 12el 600W,05/06 +RA6HHT,LN04WX,EME,,,,144: 16el 1.2KW,06/07 +RA6HTT,LN05,,,,,,08/08 +RA9CAE,LO97,,,,,,08/08 +RA9FMT,LO87BW,EME,,,,,01/06 +RA9SO,LO71NS,,,,,,08/96 +RA9YDL,MO93HA,EME,,,,,10/08 +RA9YMI,NO13VI,EME,,,,144: 16el 250W,01/90 +RD3BD,KO85UQ,EME,,,,144: 4x 18el 1500W,04/06 +RD3DA,KO85PT,EME,,,,1296: 2m dish 35W,08/06 +RD3WAL,KO71IM,,,,,144: 100w 14el yagi(DK7ZB) Kenwood TS-790a,04/09 +RK1NA,KP71ET,EME,,ex UN1CD - QSL via DK3WG,,144: FT847 100W 14el circular,04/04 +RK1QWA,LO09AC,,,EXPEDITION,,,08/07 +RK2FWA,KO04FT,EME,,ex UZ2FWA,,,04/04 +RK3AF,KO75WO,,,EX UZ3AF- UA3AJK,,144: IC746 2xGI7B 450W ANT - DK7ZB 5WL,09/07 +RK3FG,KO86HP,EME,,,,144: 4x 14el 1200W,03/05 +RK3MWI,KO98JB,,,Expedition,,144: 100W 10el,01/07 +RK3PWJ,KO83XC,,,QSL via UA3PNO,,,05/04 +RK3WKB,KO81BR,,,,,,05/06 +RK3WWF,KO72QI,EME,,,,144: 4x 13el 1KW 432: 4x 26el 300W,09/06 +RK6GC,LN05AU,EME,,,,144: 50W 2x 12el,02/08 +RK6LXN,KN97LE,,,,,,06/06 +RK6MC,KN97LE,EME,,ex UA9XEA,,144: 4x 12el 1KW - 432: 8x23 el GS35B/1.1kW PA MGF1302 preamp,08/06 +RK9CC,MO06RT,EME,,QSL via DK3WG,,6x4lb 9BV GS35b,03/04 +RK9DK,MO09CS,EME,,,,,10/07 +RL1P,KO49VW,,,SpecialCall,,144: TR-751 300w 16el DJ9BV,05/03 +RL1X,KO59EW,,,SpecialCall,,,05/03 +RL3DO,KO85WV,EME,,,,,08/08 +RM3T,LO16XG,,,SpecialCall,,,08/97 +RN3QKG,KO91OM,,,,,,08/08 +RN3QLU,KO91OO,EME,,,,,06/05 +RN3QO,KO91OO,,,,,,07/05 +RN3QQ,LO00BK,,,,,144: 15el DJ9BV 100W,06/99 +RN4AT,LN29LA,EME,,ex RA4AOR,,144: 4x 14elX-Yagi 1.5KW,10/06 +RN4HFE,LO42XX,,,,,,09/07 +RN4NF,LO58GH,,,,,,08/08 +RN6BL,KN95,EME,,,,144: 80W 16el,01/08 +RN6BN,KN95LC,EME,,,,144: FT736 16x17el 1KW,04/05 +RN6DJ,KN96VC,EME,,RV6AHY,,TS-780 11 EL. 3 WL. 100 W.,01/09 +RN6HW,LN05XB,,,,,144: 1KW 13el Yagi,08/07 +RN6MT,KN97LN,EME,,EX RA6LDY,,144: 2.3KW 4xYagis,05/07 +RP3POT,KO93CD,,,,,,05/05 +RP6A,KN95LC,EME,,SpecialCall,,144: FT736 32x15el vertical & 32x15el horizontal 1KW,05/06 +RP9JTT,NO01,EME,,= RV9JD,,,05/06 +RU1A,KP40HK,EME,,QSL via DK3WG,,144: 6x16el 1KW,01/05 +RU1AA,KP40XD,EME,,QSL via DK3WG,,144: >2KW GU93b 4x15el Crossyagi,07/04 +RU1AC,KP50EJ,,,,,,07/04 +RU1AS,KO59,,,,,,05/03 +RU1R,KO82BW,,,Expedition,,,01/93 +RU1U,KO72XW,,,Expedition,,,01/93 +RU2FM,KO04GQ,,,UB5KCW RA1ACW RV1AB RV1AB/MM R750M UE3QRP/2,,home made transverter+ h.m. HF rig TS790,09/08 +RU3ACE,KO85SM,EME,,,,144: 2x 18el Xpole 300W,09/06 +RU3EC,KO82TK,,,EX UA3EEN,,144: IC746 15el 9BV,09/07 +RU3GX,KO92SO,EME,,QSL VIA DIRECT,,144: more than 1KW Gs35b 4x17el Crossyagi GAS-2020,11/07 +RU3ZD,KO81VG,,,ex UW3ZD,,144: 16el 200W,01/96 +RU4HU,LO43OM,,,,,144: FT290R 2x10el 50W,04/04 +RV1AO,KP50,,,,,,08/04 +RV3AO,KO85RR,,,ex RA3AIS,,144: 4x12el 1500W,07/03 +RV3APM,KO85RU,,,,,IC910H,03/04 +RV3IG,KO87OT,EME,,QSL via DK3WG,,144: 500W 4x15el,11/05 +RV3QX,LO00BK,,,,,,08/08 +RV3YM,KO63QQ,,,ex UA3YOZ,,FT 897 144: 5.5wl gs15 bf998 432: 11wl gs15 bf998,05/05 +RV3ZR,KO80CL,,,,,144: 500W YU0B KT939A,11/03 +RV4AQ,LN28GM,EME,,not active,,432: 4x4.2ld BV 2xGI7B 500W,10/99 +RV6YY,LN04AO,,,,,,05/08 +RV9AX,LO93LK,,,,,144: 600W 17el preamp - 50: 100W- 6el,10/96 +RV9JD,MP80GW,EME,,,,144: 4x 16el 1500W,06/05 +RV9PP,NO15LB,,,,,144: ft-847 4x 12el klm 350watts 432: 4x 22el,03/06 +RV9UV,NO34GA,EME,,,,FT857 4x 12el 50W,10/06 +RW1AW,KP50DA,EME,,QSL VIA DK3WG,,144: FT736r 2.4KW 2x19el MGF1302 - 432: 12x15el 1.5KW,11/07 +RW1AY,KO59CU,EME,,,,144: 15el 4wl 1500W,04/06 +RW1Q,KO99WJ,,,Expedition,,,12/95 +RW1ZC,KP69NA,,,,,,08/06 +RW2F,KO04PT,,,Expedition,,,12/97 +RW3AC,KO86SH,EME,,,,144: IC910H 18el 3AQ LNA-RW3AZ and GS35-RZ3BA,05/07 +RW3AZ,KO85TT,,,,,,08/03 +RW3DMQ,KO86RI,,,,,,05/05 +RW3FH,KO86VK,,,,,,08/07 +RW3PF,KO93CD,,,QSL via DK3WG,,144: 1500W 4x10el BVO 3wl Preamp - 432: 700W 4x24el Preamp,08/05 +RW3PX,KO83RJ,EME,,,,144: 8x 16el GS35B,11/05 +RW3TJ,LO16XG,,,ex UW3TJ,,,11/03 +RW3TU,LO25BR,,,UA3TFO UW3TU,,144:100Watts 12el 4wl. MGF1302 - 432: 400Watt 2x23 ele MGF1302,06/09 +RW3WR,KO71IM,,,ex UA3XJ,,,07/04 +RW3XR,KO73FU,,,UA3XFA,,,10/07 +RW4AK,LO20RC,,,ex UW4AK,,,01/96 +RW4HM,LO43RM,EME,,,,ICOM-910H,05/05 +RW4NQ,LO58,,,,,144: 4x 9el GI7B,08/05 +RW4WE,LO66PU,,,,,,04/05 +RW9FT,LO89TD,,,ex UW9FU,,,11/04 +RW9MD,MO64RX,EME,,,,,06/01 +RW9USA,NO33NS,EME,,,,TM255A IC 821H PA 1500W ant 8/6 yagi,05/05 +RX0AZ,NO86OD,EME,,,,700W 3wl Antenna,10/07 +RX1AS,KO59FX,EME,,QSL via DK3WG,,144: 4x21el LY GS35b linear,03/06 +RX1AX,KO59EW,,,,,,12/04 +RX3AGD,KO85UR,,,UV3AGD,,FT897d 50 watt 12 ele 3WL dk7zb,09/07 +RX3DUR,KO85XM,,,ex UV3DUR,,ICOM 706MK2G + PA GI7B,08/05 +RX3PX,KO84SD,EME,,,,144: 2x11el 210W MGF1302 - 432: 2x23el 180W MGF1302,06/99 +RX3QFM,KO91FM,EME,,QSL via DK3WG,,144: 2xBVO4wl yagi 0.4 dB LNA PWR 1.5 KW (2xGS35B),07/05 +RX6AKO,KN84PV,,,ex UV6AKO,,,06/96 +RX9AT,LO93LJ,EME,,,,ts-2000x,07/07 +RX9CHW,MO09CS,EME,,,,144: 4x 8el 100W,03/06 +RX9JP,MP22RD,EME,,,,144: 4x 18el 45W,10/08 +RX9SA,LO71NS,,,,,IC910H,08/04 +RY3E,KN75,,,Expedition,,,01/93 +RY5I,KP51BM,,,Expedition,,,01/92 +RZ1AP,KO49VW,,,,,144: TR-751 300w 16el DJ9BV,05/04 +RZ1AWR,KO59DX,,,,,144: 16el DJ9BV 50Watt,08/98 +RZ1AWT,KP40XD,,,QSL via DK3WG,,144: 20W 9el,06/98 +RZ1QZZ,LO09BC,,,,,,07/04 +RZ1ZZZ,KP76EQ,,,,,,08/04 +RZ2FWA,KO04FT,,,,,,01/03 +RZ3AED,KO86RD,EME,,UW1ZA,,TS2000 144: 4x 3WL F9FT 500W 432: 4x 21el F9FT,09/07 +RZ3AF,KO85CO,,,ex UA3AFA,,144: MGF 1302 2x14 el GI-7B,12/02 +RZ3DNT,KO86LE,,,,,,08/08 +RZ3QD,KO91OO,,,,,144: 4wl 1KW LNA,08/05 +RZ3QS,KO91SS,,,,,144: 2wl 100W LNA,08/02 +RZ3ZZ,KO80GP,,,,,144: IC-910H 100W 4x 10el A144S10 - 432: 1 A430S15,04/06 +RZ4HF,LO43TJ,EME,,,,144: TS-2000 IC-970 4x15el H/V 1500W,11/07 +RZ6BU,KN84PV,,,UV6AKO RX6AKO,,FT847 144: 400W 10el DK7ZB Preamp BF998 432: 50W 14el DK7ZB,12/07 +RZ6BY,KN84PV,,,ex UV6AIL,,,06/97 +RZ6DD,LN04MX,,,RW1ZC,,IC-746,02/09 +S50C,JN76JG,,,,,50: 5el 100W - 144: IC275h 2x15el 700W,08/01 +S50L,JN75ES,,,,,,08/08 +S50TA,JN76HD,,,,,,08/08 +S51AT,JN75GW,,,ex YU3FM,,144: 1KW 16el LY,08/05 +S51BA,JN75IX,,,,,,01/03 +S51DI,JN76VL,,,,,,09/03 +S51DX,JN75CC,,,ex YU3HR,,144: IC275H 100W 2x17el F9FT,11/01 +S51S,JN75GV,,,,,,08/96 +S51SLO,JN76GB,,,,,,03/01 +S51TE,JN76BI,,,,,,11/99 +S51WV,JN76SN,,,,,,01/03 +S51WX,JN75OS,,,,,144: 2x8el dk7zb 1kW,09/08 +S51ZO,JN86DR,EME,,,,144: 1.5KW 4x14el 9BV - 432: 800W 8x33el 9BV,04/06 +S52CW,JN76CI,EME,,,,,01/01 +S52EZ,JN86DT,,,,,,08/01 +S52LM,JN65TX,EME,,EX YU3ULM YT3LM,,144: 4X17M2 5WL- FT 1000MP- JAVORNIK 144/14 dual RX - MGF1801-1500W (GS35B homemade ),05/07 +S53AC,JN76GB,,,,,IC-746 M2-8wl 600W IC-746 17el,08/03 +S53CAB,JN76JG,,,,,,08/97 +S53J,JN75EV,EME,,,,144: FT847 4x5wl GS35 MGF1801 - 432: IC820H ATF43143 GS23B 4X9WL - 1296: FT736R SP23 55el F9FT 80W,03/05 +S53RM,JN76JCB,EME,,ex YT3RM,,432: 8 x 8.5wl BV OPT X yagi YL1055 Ampl.,04/05 +S53T,JN75GV,,,,,,06/01 +S53X,JN65WS,,,,,,11/99 +S54AA,JN76EG,,,NOT ACTIVE VHF,,144: IC275H 2x4CX250b (650W) 18el DJ9BV MGF1302,01/01 +S54M,JN86CL,,,ex 9A4ZM- N1MZ,,FT847 PA,05/02 +S54O,JN75NT,EME,,EX S51MQ,,50: 50W 6el 144: TH328 KW 2x17el MGF1302 432: th328 500W 2x24el,09/07 +S54T,JN75EW,EME,,,,144: 4x 17el M2 GS35B 1KW - 432: FT847 4x 28el M2 GS23B,05/05 +S55AW,JN75DS,,,EX YT3RY,,144: FT1000MP Javornik 14/144 XVRT GS35b 2x15el,05/07 +S55M,JN65VM,,,,,,10/07 +S55OO,JN76HD,,,,,50: IC706mkIIg 100W 5el - 144: IC706mkIIg 140W 15QD,08/07 +S55Z,JN76HB,,,S57TDA,,TS9130,08/08 +S560L,JN75ES,,,SPECIALCALL,,,08/07 +S57A,JN65TW,,,,,,11/99 +S57C,JN76HD,,,,,144: 700W 17el - 432: 400W 8x21,07/96 +S57EA,JN76HE,EME,,YT3QW,,144: FT-897D 50W 4x6 loop (full ele) MGF1302,08/07 +S57JA,JN76GB,,,,,,11/99 +S57LM,JN76HD,,,,,,04/03 +S57M,JN76PO,EME,,EX S51WV,,,04/07 +S57QM,JN76,EME,,,,,01/94 +S57RA,JN75FO,EME,,,,432: 4x 8.5wl dj9bv- 0.3db preamp atf35176- gs35b 800W,08/00 +S57S,JN76JB,,,,,144: TS850SAT h.m. transv MGF1302 preamp 300W 17B2,11/00 +S57SU,JN76EF,,,EX S57MSU,,144: TM255E 30W 2x13el (2.1L) 5�El 15db,02/08 +S57TW,JN75EX,EME,,,,144: IC275H 1500W MGF1302 4x2M28XP,08/07 +S57UUU,JN76EC,,,,,,01/03 +S58J,JN76EG,,,,,50: IC756 5el,11/99 +S58M,JN76ID,,,,,,01/09 +S58P,JN76ID,,,,,,04/09 +S59A,JN76XP,,,ex YU3ZV,,,11/95 +S59AX,JN65UU,,,,,,01/93 +S59DCD,JN76NL,,,,,,01/03 +S59EA,JN75,,,,,,01/95 +S59F,JN65TX,,,ex YU3HNI-YT3ET-S59AM,,50: 350w 6el - 70: 50w 5el - 144: 500w 12el - 432: 50w 23 el,04/03 +S59MA,JN76FD,EME,,,,,02/05 +S59UN,JN76XP,,,,,,01/03 +S79HP,LI75,EME,,Expedition,,,01/06 +S9TX,JJ30,,,,,,01/03 +SA3AJG,JP93IG,EME,,,,144: 15el 100W,01/08 +SA7U,JO65ML,,,,,FT897 144: 50w 2 x 8JXX2 432: 20w 25JXX70,06/07 +SC300VL,JO68SD,,,SPECIALCALL,,,04/07 +SD5D,JO89JT,,,,,TS-790E + LA-22+15el+mastpreamp,05/08 +SF6X,JO67AJ,,,= SM6CEN,,,08/06 +SF7WT,JO65QQ,,,SpecialCall,,144: IC-7400 PA 500 W 15 EL,08/06 +SG6T,JO68SE,,,ALSO 8S6T & SM6WET,,FT650 847 920,11/08 +SK0AR,JO99BT,,,,,,01/93 +SK0CC,JO99BD,,,,,,07/02 +SK0UX,JO99BM,EME,,,,,01/05 +SK2AT,KP03BU,EME,,= 7S2AT,,TS-790E,05/07 +SK3AH,JP82XO,,,,,,10/02 +SK3JR,JP62WK,,,Expedition,,,01/92 +SK3LH,JP93IH,,,,,,01/94 +SK3MF,JP92FW,,,,,144: 6x15el 1KW,07/02 +SK3SN,JP80IO,,,,,,01/94 +SK4BZ,JP61QM,,,,,,01/94 +SK4EA,JO79CO,,,,,,01/93 +SK6HD,JO68SD,,,,,144: 150W 2x15el,05/07 +SK6YH,JO58,,,,,,08/96 +SK7AX,JO77DS,,,,,,07/01 +SK7CY,JO65RJ,,,,,144:TS850 transverter 130 1000W MGF1302,06/06 +SK7JC,JO76KF,,,,,,08/99 +SL4BP,JP70TO,EME,,SPECIALCALL FOR MILITARY,,144: 800W 4x9el MGF1601 432: 100W 2x19el MGF1302,05/08 +SL4ZYX,JP70TO,EME,,SPECIALCALL FOR MILITARY VOLUNTARAY,,144: 800W 4x9el MGF1601 432: 100W 2x19el MGF1302,05/08 +SM0EJY,JO89SC,,,,,144: 500W 10 over 10el Preamp,06/06 +SM0EPO,JO89XM,,,,,144: 50W 2x6el,12/03 +SM0EPX,JO89SJ,,,,,144:1000 Watt 4CX1500 15el X-Y MGF1802,04/04 +SM0FFS,JO99AG,,,,,,01/94 +SM0FZH,JO89TG,,,,,,01/97 +SM0GWX,JO89XG,,,,,FT-920 + FT-847,01/09 +SM0HAX,JO99,EME,,,,144: IC820 6x 12el I0JXX 2x GU74b P-hemt,08/05 +SM0IKR,JO99CC,,,,,FT847,02/05 +SM0KAK,JO89XK,,,,,50: 100W 6el - 144: 180W 17el,08/03 +SM0LQB,JO89XK,,,,,144: 15el 130W - 432: 4W 21el,04/04 +SM0MXR,JO89WE,,,,,,01/03 +SM0NKZ,JO99IQ,,,,,,03/02 +SM0OUG,JO89VG,,,,,,10/96 +SM0PYP,JO89XG,EME,,,,,01/94 +SM0TSC,JO99CF,,,,,IC-7400 IC-703,10/07 +SM1BSA,JO97DP,,,NO SKEDS !!,,144: FT736r 300W 15el,06/06 +SM1HPV,JO97HO,,,,,144: 200Watts 2x15ele,01/02 +SM1SBI,JO97FK,EME,,,,144: 2x17el 800W,09/06 +SM200PAX,KP03BU,,,SPECIAL CALL,,,06/09 +SM2A,KP04NP,EME,,SM2ILF (BOTH CALLS ARE VALID),,IC910H 144: 6x16 el I0JXX 1kw 432: 4x32 el HB 1kw,03/08 +SM2AZG,KP03,,,,,,03/02 +SM2BLY,KP05RJ,,,,,,01/93 +SM2BYA,KP07DU,EME,,,,144: FT1000 4x3.2wl CueDee 3CX1000A7 MGF1100,08/00 +SM2CEW,KP15CR,EME,,,,144: 6x19el 1KW,04/05 +SM2CKR,KP03DQ,EME,,,,1kw 8x15el,10/07 +SM2ECL,KP05RH,,,,,144: 200W 4x15el 60m asl,07/03 +SM2EKM,KP05UW,EME,,,,,04/03 +SM2GCR,JP93TK,,,,,,07/00 +SM2GGF,KP05DV,,,SilentKey,,,01/84 +SM2ILF,KP04NP,EME,,SM2A (BOTH CALLS ARE VALID),,IC910H 144: 6x16 el I0JXX 1kw 432: 4x32 el HB 1kw,03/08 +SM2IUE,JP85,,,,,,01/93 +SM2IZV,JP84,,,,,,01/93 +SM2LKW,KP15BO,,,,,,01/94 +SM2LTA,JP94CW,,,,,,04/98 +SM2ODB,KP03EU,,,not qrv MS nw! (01/01),,144: 100W 15el,03/02 +SM2VBK,KP15BO,,,,,,08/02 +SM3AKW,JP92AO,EME,,,,144: 2x17LB 1KW - 432: 16x21el 1KW - 1296 4x23elLoops/5m dish 1KW- 2320: 6m/5m dish 100W- 10G:0.65/10W,07/07 +SM3AZV,JP83,,,SilentKey,,,01/93 +SM3BEI,JP81NG,,,EX SM5BEI,,144: 500W 432: 500W 1296: 130W 2320: 120W 5G: 15W 10G: 12W,10/07 +SM3BIU,JP73ST,,,,,,01/97 +SM3BYA,JP81NX,EME,,2nd QTH SM2BYA,,432: 450W 8x21el Tonna 750W MGF1412,05/05 +SM3COL,JP82,,,,,,11/96 +SM3GHB,JP72,,,,,,01/93 +SM3GHD,JP62,,,,,,01/93 +SM3IEK,JP73IT,,,,,144: 100Watt 15el,03/06 +SM3JBO,JP93IH,,,,,144: 2x 10el 200W,08/05 +SM3JGG,JP71WJ,,,,,,07/02 +SM3JGG,JP71TJ,,,,,FT-847 250watt 15el,07/07 +SM3JLA,JP93LH,,,,,144: 250W 15el,06/99 +SM3JQU,JP82QM,EME,,,,432: 4x 32el 750W 0.4db,09/05 +SM3KJO,JP92DX,,,,,,08/97 +SM3KYH,JP82NL,,,,,,04/04 +SM3LBN,JP80IO,,,,,,08/03 +SM3LGO,JP83VB,,,,,144: 1KW 80el Colinear,01/99 +SM3MXR,JP80GR,EME,,,,144: 4x17el M2 emepwr,08/01 +SM3PWM,JP81GF,EME,,,,,12/99 +SM3PXO,JP73GI,,,,,144: 400W 17el 5wl - 50: 50W 9el 2wl,04/03 +SM3RLJ,JP93OI,,,,,144: 100W 15el,07/97 +SM3RPQ,JP74BT,,,,,,08/08 +SM3RWZ,JP82MI,,,,,ICOM IC-275H 200W 9 ele,10/04 +SM3TFR,JP93IG,EME,,,,,01/94 +SM3VAC,JP83VA,,,,,144: 2x17el 1KW,08/01 +SM3VEE,JP81VI,,,,,,03/98 +SM3XGV,JP81OF,,,,,TS2000,08/04 +SM3YTF,JP81FI,,,,,,12/06 +SM4ANQ,JP70OC,,,,,,02/02 +SM4DHN,JP60VQ,EME,,,,,01/01 +SM4FXR,JO79OF,,,,,,01/05 +SM4GRP,JO69HF,,,,,IC-756PROIII DB6NT TR144H transverter + 15el @ 10m 45m ASL.,10/07 +SM4IVE,JO79SD,EME,,,,,08/00 +SM4KYN,JO79,,,,,,01/93 +SM4RPQ,JO79HH,,,,,TS2000,08/05 +SM4SJY,JP70OC,EME,,,,IC706MK2G 144: 9el 600W,09/05 +SM4VQP,JO79NB,EME,,,,144: 4x17el eme-pwr,01/02 +SM5BSZ,JO89IJ,EME,,NO SKEDS !!,,,07/99 +SM5CBN,JO78NH,,,,,,08/06 +SM5CFS,JO99IQ,EME,,,,144: 4x19el QBL5/3500 1.5KW 1296: 5.6 mtr solid 100w,09/07 +SM5CUI,JO89WW,EME,,,,144: 8x 10el 800W,07/05 +SM5DCX,JO89OI,,,,,,01/01 +SM5DIC,JO89JT,EME,,,,TS-790E+LA-22+4x15el+Mast preamp MGF1302,11/08 +SM5DRV,JO77MV,,,= SM0DRV,,144: IC-275H 100W 13el yagi,07/04 +SM5FRH,JO88BW,EME,,,,144: 32x19el horz. or 32x10el vert.,10/00 +SM5GEP,JO77IP,,,,,,01/03 +SM5HUA,JP80WA,EME,,SM3HUA,,Icom IC-910H,04/09 +SM5IOT,JO99BX,EME,,,,50: 2x 6el I0JXX - 144: 8x 8el I0JXX 2xGU74B P-hemts - 432: 8x 26 el DJ9BV opt2 GS23B P-hemts,03/06 +SM5LE,JO99BD,EME,,,,,04/06 +SM5TSP,JP90BD,EME,,,,144: 4x18el 750W,08/08 +SM6AEK,JO66,,,,,,01/93 +SM6AFH,JO66LQ,,,,,,01/94 +SM6CEN,JO67AJ,,,= SF6X,,,08/06 +SM6CKU,JO67,EME,,,,,04/05 +SM6CMU,JO57XK,,,,,IC7400 100-400W 50: 6el - 144: 9el,08/05 +SM6CWM,JO67,EME,,,,,01/94 +SM6EAN,JO57WQ,,,,,144: 600W 10el,01/01 +SM6EUP,JO57XQ,EME,,,,,01/94 +SM6FKF,JO68SA,,,,,,05/07 +SM6FUD,JO68JV,,,,,,12/04 +SM6KJX,JO67CK,,,,,FT736,07/04 +SM6MVE,JO67KW,,,,,50: 10W 3el 144: 25W 4x9el SP2 432: 75W 4x13el SP70,03/06 +SM6NET,JO68SD,,,,,144: 300Watt 2x 17el - 432: 50Watt 21el,05/09 +SM6SKH,JO66IT,,,SM7SKH,,,06/09 +SM6TZX,JO67EE,,,,,,05/02 +SM6U,JO67AT,,,SpecialCall,,144: FT290 9el 25W,05/00 +SM6UMO,JO68DH,,,,,144: TR751 170W 2x13el SP2000,01/94 +SM6USS,JO67AT,,,,,144: FT290 9el 25W,07/97 +SM6WET,JO68SE,,,ALSO 8S6T & SG6T,,FT650 847 920,11/08 +SM7AED,JO65NI,,,,,144: 50W 5el,06/07 +SM7DTT,JO65LJ,EME,,,,,05/07 +SM7EAN,JO86,,,,,,07/99 +SM7EOI,JO86FP,,,,,IC7400,01/04 +SM7FJE,JO65ML,EME,,,,4x9 el,07/08 +SM7FMX,JO65KN,,,,,,08/04 +SM7FWZ,JO78,,,,,,03/03 +SM7GVF,JO77GA,EME,,SM4GVF,,144: 8x8 el 1KW MGF1302,11/08 +SM7IWG,JO77IP,,,,,,04/04 +SM7JUQ,JO65WX,,,,,50: 100W 5el - 144: 750W 9el - 432: 50W 19el,08/04 +SM7KNK,JO75,,,,,,01/93 +SM7MRL,JO65NP,,,,,144: TS850 transverter 130 1000W MGF1302,03/03 +SM7MXO,JO77,,,,,,07/04 +SM7OYP,JO66JA,,,,,50: 100W 5el,09/01 +SM7SJR,JO87FB,,,,,,10/08 +SM7THS,JO76WR,,,,,144: 15el 170W MGF1302,11/99 +SM7TJC,JO67SH,EME,,,,144: FT-225RD 2xGi7b (800W) - 432: FT-757GX Trvt 60W,05/02 +SM7TUG,JO65OT,,,,,144: 2x4CX250b 17el MGF1302,08/98 +SM7WSJ,JO67WI,EME,,,,144: 2X16 optimized for EME 1KW - 432mhz 2X19el 2.4ghz RX on satellite,10/05 +SM7WT,JO65QQ,,,,,144: IC-7400 PA 500 W 15 EL,08/06 +SO3Z,JO82KL,,,CONTEST CALLSIGN,,2m: IC-275A - PA 150W - 2x 10el DK7ZB || 70cm: IC-275A + trv MMT432 PWR 10W 16el and 8x10el DK7ZB only contest.,06/09 +SO4DFC,KO13AX,,,Expedition,,,01/92 +SO4TEC,KO13CW,EME,,Expedition QSL via DL3BQA,,,06/02 +SO5AS,KO02JD,EME,,QSL via G4ASL or LOTW,,50: GS31b 5el 144: 150Watts 14el (no ant. elevation),04/06 +SO9AN,JO84NG,,,Expedition,,,05/00 +SO9FB,JO84NG,,,Expedition,,,05/00 +SP1JVG,JO84LL,,,= KG2IS,,,02/01 +SP1NQE,JO84LL,,,,,TS746 TS811E,04/04 +SP2CHY,JO94GO,,,ex SP4CHY,,,02/05 +SP2FAX,JO83VA,,,,,144: 2KW 6x17el,08/03 +SP2HAX,JO83,,,,,,12/5 +SP2HNF,JO94FK,,,,,,10/05 +SP2IQW,JO94GM,,,,,50: IC-746 5el - 144: IC7-46 100W 2M5WL,09/08 +SP2JAN,JO94,,,,,,09/94 +SP2JYR,JO92GP,,,,,144: 2x 14el 1KW,01/08 +SP2MKI,JO93AC,,,,,,03/02 +SP2MKO,JO93CB,,,,,icom706mkIIg tm255a,08/05 +SP2MSL,JO92NM,,,,,,01/97 +SP2NJI,JO92OS,EME,,,,50: IC736 100W 5el - 144: IC271 500 W 4x8 el - 432: IC471 150W 4x25el - 1296: HM 15W 44el - 2320: HM 1W 25el,10/08 +SP2OFW,JO93AC,EME,,,,144: 2xGS35b 2x15el,05/05 +SP2QBQ,JO94FL,,,,,,06/08 +SP2SGZ,JO82UU,,,,,,01/96 +SP3EPX,JO83ID,,,,,,11/01 +SP3FSM,JO81GU,,,,,,08/02 +SP3IYM,JO82KL,,,,,2m: IC-275A - PA 150W - 2x 10el DK7ZB Yagi - LNA || 70cm: IC-275A + trv MMT432 PWR 10W 16el and 8x10el DK7ZB only contest.,06/09 +SP3MFI,JO91,,,,,,01/93 +SP3RNW,JO81GQ,,,,,50: 100W -144: 200W 11el MGF1302 - 432: 100W MGF1302 21el,08/03 +SP3RNZ,JO92DF,EME,,,,IC746 7el TAGI,09/03 +SP3SUX,JO72OR,,,,,144: 80W 14el BF981,12/96 +SP3TYF,JO82FH,,,,,FT857D TR9000,10/08 +SP3VSC,JO92DF,,,,,144: IC746 2X13B2 PA GS35B,01/04 +SP4BY,KO13OD,,,,,,07/04 +SP4DGN,KO13OD,,,,,,01/88 +SP4JCQ,KO13NC,,,,,FT920 IC910H 144: 100W 17el,09/06 +SP4MPB,KO03HT,EME,,,,144: TS2000 GS35b ATF54143 4 x 13el 50MHz: 2 x 7el 1296MHz 100W + 200cm dish,06/09 +SP5CCC,KO02NF,,,,,,01/09 +SP5CJT,KO02OD,EME,,,,,01/94 +SP5EFO,KO02,EME,,SilentKey,,,04/97 +SP5HEJ,KO02,,,,,,01/97 +SP5KVW,KO03SB,,,Expedition,,,01/89 +SP5LJX,KO03,,,,,,08/02 +SP5QWB,KO02NF,,,,,50: 400W 7el - 144: 1KW 17el - 432: 50W 26el,05/04 +SP5XMU,KO02LG,,,,,50: 100W 6el 144: 170W 13el 432: 50W 21el,05/09 +SP6A,JO81NG,EME,,ex SP6AZT,,,11/03 +SP6ARE,JO81IL,,,,,IC202 + 4cx250 to 7 ele quad,10/07 +SP6ASD,JO81LC,,,,,,05/02 +SP6AZT,JO81NG,,,,,,01/03 +SP6CPH,JO81,,,,,,09/01 +SP6GVU,JO81LC,,,,,144: 17el F9FT 200W MGF1302,02/01 +SP6GWB,JO80HK,EME,,,,50: FT847 1 kW 9 el (2 lambda) - 144: FT847 4x16 el DJ9BV 1KW CF300,03/05 +SP6GZZ,JO80FX,,,,,,10/04 +SP6HED,JO80IK,EME,,,,144: 13el 100W,07/05 +SP6IWQ,JO80HK,,,,,TR751e FT757gxII Trnsv 100W Pas,11/04 +SP6JLW,JO80JK,EME,,,,70cm 8x32el 2xGS35 23cm 6.5m dish 16xBLV958,10/08 +SP6NVN,JO81CJ,,,,,IC-910 H,12/08 +SP6OJE,JO90CI,EME,,,,TS-711a IC-735 4x 5el,10/06 +SP6VGJ,JO81HU,EME,,,,144: 4wl Antenna 1KW,10/06 +SP7BUZ,KO00HU,,,ex SQ7IKT,,,04/04 +SP7DCS,JO91RT,EME,,,,144: FT736r DSP GS35vb 16x 8el antennas,10/06 +SP7EBM,JO91QR,,,,,,01/02 +SP7HKK,JO91QI,,,,,IC-746,12/07 +SP7JSG,KO01BW,,,,,,03/02 +SP7OGP,KO01AM,,,,,IC706MKIIG 12el 7ZB 50W,05/08 +SP7SZG,JO91RQ,,,,,144: TS700 + PA 50: TS700+Trsv 10W,12/08 +SP7VC,JO91SS,,,,,,10/04 +SP8AOV,KO11GG,,,,,144: FT480r 100W 2x10el,03/00 +SP8NCJ,KO12NA,,,,,,11/95 +SP8RHP,KO10FF,,,,,144: 200W 10el DJ9BV,02/05 +SP8SN,KO11GG,,,ex SQ8GKQ,,,07/04 +SP8UFT,KO11JI,,,,,,01/02 +SP8WJW,KN09SR,,,,,144: 50W 9el,03/06 +SP9COO,JO90GA,,,,,144: IC251 + PA 100Watt 44el YU0B MGF1302,04/04 +SP9EWO,JN99HW,,,,,,08/06 +SP9HWY,JO90NH,,,,,50: 80W 7el,10/06 +SP9KUR,KO00MA,,,Expedition,,,01/93 +SP9LCV,JO90KF,,,,,IC-756pro IC735 TRC PA GI7 home made,03/06 +SP9PRO,JN99,,,,,,03/97 +SP9PZU,JO90,,,,,,07/96 +SP9QMP,JO90FB,,,,,,08/02 +SP9TCE,JO90,,,,,,08/98 +SP9TTG,JO90NU,EME,,,,144: 4x 5el ZB 1kW,03/08 +SP9UX,KO00XA,,,,,,07/04 +SQ5GVY,KO02MQ,,,,,FT817 IC290 IC490 PA,08/08 +SQ7DQX,JO91RR,,,,,144: 13el 50W,11/04 +SQ8GUP,KN09VQ,,,,,,04/01 +SQ9PM,JN99MT,EME,,EX SQ9HYM,,FT847 50: 6el - 144: 14el - 432: 29el,05/07 +SQ9PV,JO90KF,,,,,,01/03 +SQ9QU,JO90KH,,,ex SP9MRT,,144: TM 255A 40W 15 el yagi LCF 78-50 coax line,07/05 +SQ9W,JO90NH,EME,,ex SP9EWU,,,08/06 +ST2NH,KK65GP,EME,,,,144: IC910 LNA 160W 6el,12/08 +ST2RS,KK65GN,EME,,= ZL1RS,,50: 6el 1KW 144: 4x 8el 140W,01/05 +SV0EC,KN10CJ,EME,,,,144: TS770 700W 20el Gruppe,02/99 +SV1AAF,KM17VX,EME,,,,,01/92 +SV1AWE,KM17VU,EME,,,,432: 4x 21el 1500W,09/05 +SV1BJY,KM18UA,,,,,ft897/ft290r w 4x6el.yagi,06/08 +SV1BTR,KM18NO,EME,,,,144: FT847 16x 6el X-Pol 1.5KW - 432: 8x 26el 1.5KW,04/06 +SV1EEX,KM18UA,,,,,FT897D-FT857D-FT817-IC7400,11/08 +SV1OE,KM17VX,,,,,,08/08 +SV1WE,KM18VA,,,,,144: 500W 17el,07/98 +SV2BFN,KN10LN,EME,,,,ICOM IC-910,09/08 +SV2DCD,KN00LI,,,,,,06/06 +SV2EVS,KN10KP,,,,,,04/02 +SV2JL,KN10LO,,,,,,06/04 +SV2KBS,KN20WU,EME,,SW2KBS,,ICOM IC-7000,04/08 +SV3AAF,KM17KO,EME,,,,144: 4x 8el. and 8877,05/07 +SV3KH,KM07PQ,EME,,,,144: 4x 28el Xpol KW,07/05 +SV5BY,KM46CG,,,,,,01/03 +SV5BYR,KM46CG,EME,,,,144: FT847 2x 13el 600W MGF1302,01/06 +SV6DBL,KM09KO,EME,,,,144: 4x17 el. full elevation 1300W,04/05 +SV6KRW,KM09,EME,, +SV8CS,KM07JS,EME,,= KC2INN,,50: 2x 7el 1KW - 144: IC821 TS2000 4x 16el MGF1302 1KW,04/05 +SV8KOM,KM07KS,EME,,ex SW8KOM,,144: 4x 9el 1KW,05/06 +SV9CVY,KM25KA,EME,,,,144: 4x 8el. H pol. and 2x 12el. V pol and 3cx800,05/07 +SW6IED,KM09KQ,EME,,,,Icom 910H,12/08 +SX1FRE,KM18OE,,,SPECIALCALL,,,04/08 +SX5AS,KM35JV,,,EXPEDITION,,,08/07 +T33C,RI49XC,,,,,,01/03 +T49C,EL72,,,CONTESTCALL,,50: 4el 100W - 144: 9el 120W - 432: 17el 100W,06/07 +T61AA,MM21OE,EME,,= VK1UN,,50: 600W 8el 144: 9el 1KW,04/08 +T77NM,JN63FW,,,,,,04/07 +T77WI,JN63FW,,,Expedition - QSL via DJ2QV,,144: 350W 9el 11el,06/98 +T90M,JN82TW,,,Expedition,,,08/96 +T90N,JN82TW,,,Expedition,,,08/96 +T94KU,JN94JF,,,,,144: FT480r 6el 50W,01/00 +T94ZQ,JN94FP,,,,,,07/99 +T98CHR,JN84AX,EME,,Expedition,,,04/99 +T98LWT,JN84AX,EME,,Expedition,,,04/99 +T9SO,JN94IM,,,SpecialCall,,144: FT480r 8el 150W,08/98 +TA1D,KN41LB,,,,,144: 150W 2x 9el,10/05 +TA2ZAF,KM69KV,,,ex TA2/OK1MU,,144: 700W 11el,09/06 +TF3EJ,HP84,,,,,,10/95 +TF8ITT,HP94CD,,,,,144: 1KW ERP,08/02 +TG9AKH,EK44RP,,,,,TX YAESU FT-857 RX ICOM 756PROII,10/06 +TI9K,EJ65LM,EME,,EXPEDITION,,50: 100W vertical 144: 10el 350W 432: 27el 120W,01/08 +TK1DX,JN42RM,,,,,144: 8el 200W,01/99 +TK5EP,JN41IW,,,,,144: 400W 9el or 16el 900m.asl.,11/01 +TK5JJ,JN41IW,EME,,EX FC6ABP,,144: 700W 3cx 800 a7 2x 12el M2 LNA PA3BIY,05/07 +TM0EME,IN88QM,EME,,Expedition QSL via ON4DPX,,144: 2x 10el 200W,08/05 +TM1E,JN32CX,,,EXPEDITION,,,12/07 +TM6OLW,JN37,,,SpecialCall,,,01/05 +TN5SN,JI75PR,EME,,QSL VIA IZ1BZV,,,10/08 +TO4E,LG07EQ,,,,,,01/03 +TS7N,JM54NQ,,,Expedition,,144: IC275 HLV600 2x7el FX213,11/00 +TV6YGS,IN86,,,Expedition,,,01/87 +TZ5A,IK62,EME,,Expedition,,,09/06 +UA0COO,PN78MK,EME,,,,144: 4x 9el QRO,11/08 +UA0FMU,QN16IW,EME,,,,144: 4x 15el Xpol 1KW,04/06 +UA0SNV,OO17IW,EME,,,,432: 21el 50W,10/05 +UA1AFA,KO59EV,,,,,,08/02 +UA1ALD,KO49KO,,,,,144: 11el 100W,07/06 +UA1ARX,KO48VR,,,Expedition,,,08/04 +UA1C,KO58BR,,,Expedition,,,01/93 +UA1CEA,KO69,,,,,,04/99 +UA1CFM,KO69AK,,,,,,10/07 +UA1MC,KO59DW,,,,,,08/04 +UA1NAN,KP71ES,,,,,IC260,01/03 +UA1OLJ,LP03DC,EME,,,,144: 150W 9el,12/99 +UA1QV,LO08IW,,,,,144: 300W,06/99 +UA1TDZ,KO58UN,EME,,,,144: Kenwood ts2000 100w 10el / ic706mkIIg diamond x510n,08/07 +UA1UM,KO68WJ,,,,,,01/88 +UA1WER,KO47EU,,,,,144: 50W 4x17el QSL via DL9USA,01/02 +UA1ZCG,KP59JK,,,,,,01/03 +UA1ZCL,KP78TX,EME,,not qrv MS nw,,,01/92 +UA2FF,KO04,,,,,,12/04 +UA2FL,KO04FQ,,,,,,06/97 +UA3AGU,KO86OB,,,,,4el Quad,10/07 +UA3AKJ,KO95AO,EME,,,,,08/06 +UA3AOG,KO85SQ,,,,,144: IC706 100W 11el,07/00 +UA3ARC,KO85SO,,,,,144 :IC-275H GS-35B MGF1302 2M18XXX,07/04 +UA3DHC,KO96CB,,,,,,04/04 +UA3DJG,KO95CN,,,,,144: 11el 800W,07/03 +UA3GA,KO92GO,,,,,,11/04 +UA3IAG,KO77FN,,,,,,07/05 +UA3IDQ,KO66JF,,,,,,06/00 +UA3MAS,KO97ST,,,,,,01/94 +UA3MBJ,KO88SA,EME,,QSL via DK3WG,,,12/06 +UA3ME,KO97TS,,,ex UA3MEE,,,07/05 +UA3MHJ,KO87SR,,,,,,01/03 +UA3OG,LO07KS,,,,,,01/92 +UA3PBR,KO93BD,,,,,,01/86 +UA3PBT,KO84UF,,,,,,01/82 +UA3PC,KO84TF,,,,,144: 13el 1KW,08/05 +UA3PI,KO94DA,,,,,,08/08 +UA3PTW,KO93BS,EME,,,,144: 16el DJ9BV 1KW - 432: 8 yagis 200W,04/01 +UA3QHS,KO91QR,,,,,,01/81 +UA3QPA,KO91OO,,,,,,08/06 +UA3QR,KO92KA,,,,,,01/92 +UA3RAW,LO02RR,EME,,,,FT-857D,06/09 +UA3RBO,LO03NG,,,,,,11/03 +UA3RFS,LO02SW,,,,,,01/80 +UA3T,LO16GM,,,,,,07/03 +UA3TCF,LO26IU,EME,,QSL via DK3WG,,144: 300W,03/06 +UA3TDB,LO16,,,,,,01/79 +UA3TIE,LO16,,,,,,01/97 +UA3UBD,LO06GU,,,,,,01/80 +UA3UES,LO07MF,,,,,,01/92 +UA3WM,KO72QI,,,,,,07/04 +UA3WU,KO81BQ,,,,,,11705 +UA3XEH,KO73FU,,,,,,08/98 +UA3XFA,KO73DU,,,,,,01/96 +UA3YCC,KO73EG,,,,,,09/07 +UA3YCV,KO62CS,,,,,50W X-Yagi,08/08 +UA3ZAT,KO80,,,,,,01/91 +UA4AAV,LO21FC,EME,,QSL via DK3WG,,,04/99 +UA4ALU,LN29LA,EME,,,,,01/92 +UA4API,LO20QC,EME,,QSL via DK3WG,,,12/99 +UA4AQL,LO20QB,EME,,QSL via DK3WG,,144: 4x13el DJ9BV Preamp 0.8db 1.2kW(EME) 700W(MS),04/05 +UA4CC,LO21XN,EME,,,,,05/05 +UA4CDT,LO41AX,,,,,,01/83 +UA4FRL,LO23AE,,,,,,10/06 +UA4HAK,LO43NM,EME,,,,144: 4x 8el 800W,11/05 +UA4LCF,LO44EH,EME,,,,144-2x4wl 200w 432-2x11wl 200w IC-706mkiig lna,03/08 +UA4NM,LO48UP,,,,,,03/04 +UA4NX,LO48SO,EME,,UA4NDV,,144: 300Watt 14el DJ9BV IC-910H,01/08 +UA4PCY,LO45NU,EME,,,,144: 4wl Antenna 700W,11/06 +UA4SF,LO36WP,,,,,,01/86 +UA4UK,LO14MA,,,,,,11/03 +UA6LGH,KN97LF,EME,,,,,07/96 +UA9CGP,MO06RT,,,,,,01/03 +UA9CS,MO06GU,EME,,,,,10/06 +UA9FAD,LO88DA,EME,,QSL VIA DK3WG,,144: 1KW 4x16el - 432: 1KW 8x15el,10/07 +UA9FD,LO87DX,,,,,,05/05 +UA9FU,LO87DX,,,,,,08/06 +UA9HK,MO99DF,EME,,,,144: 4x 9el 600W,06/05 +UA9SL,LO71NS,EME,,,,144: 4x 17el 800W,09/06 +UA9UIZ,NO46EC,EME,,,,144: 13el 100W,10/07 +UA9XQ,LP63UM,,,,,,01/97 +UA9YLU,MO92HX,EME,,QSL VIA DK3WG,,,02/08 +UB0QF,KN77NU,,,,,,01/88 +UB2GA,KN77AB,,,,,,01/90 +UE1NLO,KP51IQ,,,Expedition,,,07/06 +UE1TWO,KO67PW,,,Expedition,,,07/04 +UE3RST,LO03,,,SPECIALCALL,,,08/08 +UN6PD,MN69JM,EME,,,,14el 1KW,12/07 +UN7LU,MO13TD,,,,,,01/03 +UN7PV,MN69MV,,,,,144: 80W 10db Antenna,12/06 +UN7TQ,MN52VV,EME,,,,,09/98 +UN8AG,LN53PH,,,ex UL7AAX,,,07/96 +UN8BA,MO51RD,EME,,,,,01/92 +UN9L,MO13tf,EME,, +UP7QP,MN83FD,,,,,,10/08 +UR3CTB,KN59RS,,,,,IC-820H 40W dk7zb 10 el LNA Gafest,09/07 +UR3EE,KN88DC,EME,,,,,11/02 +UR3EP,KN78WR,,,ex RB4EE,,,01/96 +UR3UW,KO50LI,,,,,,08/08 +UR4EWF,KN67OW,,,,,,07/03 +UR4LL,KO70XG,,,,,,10/00 +UR5BAE,KN29SM,,,ex UB5BAE,,,07/01 +UR5LLW,KN89EQ,,,,,,06/03 +UR5LX,KO70WK,EME,,QSL via DK3WG,,144: 4x12el ve7bqh 800W 13el BF981,12/06 +UR5M,KN99FD,,,Expedition,,,01/94 +UR5MID,KN98OO,EME,,,,144: 4x 12el,09/06 +UR5NOY,KN48KV,,,,,,07/05 +UR5RCP,KO51OM,,,,,,01/92 +UR5WET,KN19RG,,,,,144: FT817nd -100W -9el,06/08 +UR5ZPV,KN56SN,,,,,10ele 500W,08/08 +UR7GN,KN66HP,,,,,,06/96 +UR8IDX,KN87TC,,,,,,07/04 +US0WA,KN29XT,,,,,,07/95 +US1VQ,KN58XA,,,,,,08/95 +US5CCO,KN59XG,,,ex RB5CCO,,,05/02 +US5II,KN88WA,,,,,FT847,07/05 +US5LKW,KN89KL,,,,,,08/08 +US5WU,KO20DI,,,,,,06/02 +US8ICM,KN87UB,,,,,,08/08 +US8IGT,KN87SC,EME,,,,144: 4x 7el 400W,08/06 +US8IPB,KN87SD,EME,,,,,08/08 +UT1E,KN57XX,EME,,,,,08/03 +UT1EA,KN68RA,EME,,ex UT1E UB4EWA,,,08/03 +UT1EWA,KN68RA,,,,,,01/03 +UT1PA,KO21FC,EME,,,,,06/98 +UT1Q,KN77,,,Expedition,,,08/95 +UT2CO,KN58CR,,,,,,01/92 +UT2HN,KN79OI,,,ex UR5HAX,,144: 100W 16el,11/03 +UT2UB,KO40UO,,,,,,08/08 +UT2XQ,KO40IG,EME,,,,IC910H 4x 12EL 1.5KW,10/07 +UT3BW,KN29UA,,,ex UB5BDC,,,05/99 +UT3LL,KO80AC,EME,,,,432: 6x 27el 500W,09/05 +UT4EQ,KN78MK,EME,,,,,06/98 +UT4NJ,KN48KQ,,,,,FT-897D,02/09 +UT4NZ,KN49FF,,,,,,01/09 +UT5AO,KO61XQ,EME,,,,,01/94 +UT5BN,KO40,,,,,,01/81 +UT5CO,KN58CQ,,,,,,01/95 +UT5DL,KN18EP,EME,,,,,07/02 +UT5EC,KN78MN,EME,,,,,11/99 +UT5EG,KN78GJ,EME,,,,,01/94 +UT5ER,KN78ER,EME,,UR5EF UB5EFS,,144: 4x4.4L DJ9BV 1KW MGF1302,09/07 +UT5GU,KN68,,,,,,01/94 +UT5JAX,KN64RQ,,,,,,01/94 +UT5JCW,KN64SN,EME,,,,TS-2000X 17b2 M2-9WL 3.7m Dish,04/08 +UT5ST,KN28IW,,,ex UR5SKB,,FT847,05/05 +UT5UBB,KO50,,,,,,01/04 +UT5UCP,KO50DG,,,,,,07/01 +UT5VD,KN68MT,,,ex UB5VEP,,,10/04 +UT6UG,KO50EI,,,,,Icom 910h 144: 4x7el DK7ZB 432: 4x13el DK7ZB,11/05 +UT7GA,KN66HP,,,ex RB5GU,,144: 1KW 16el F9FT,09/99 +UT7VF,KN68MQ,EME,,SilentKey,,,06/96 +UT8AL,KO61WP,EME,,ex RB5AL - QSL via DJ9YE,,,08/99 +UU1AA,KN74BV,,,,,,08/04 +UU1DX,KN74BW,,,,,144: 500W,07/05 +UU5JJ,KN74AV,,,,,,01/03 +UW9AH,LO93KK,,,,,,01/92 +UX0FF,KN45NI,,,,,,07/04 +UX1AS,KO59FX,,,,,,01/03 +UX3LV,KO80EA,EME,,,,,08/05 +UX5UL,KO50FL,EME,,,,144: IC910H 900W 432: IC910 75W,11/07 +UY0LL,KN89CX,EME,,UB5LMJ,,IC-910H GS35,08/07 +UY0UP,KO50FJ,,,,,,10/06 +UY5HF,KN66HP,,,= UT7GA,,,06/96 +UY5OE,KO80AB,,,,,,01/94 +UZ1OVW,KP94VN,,,,,,01/92 +UZ2HZ,KN69RA,,,,,,08/08 +UZ3DD,KO86JH,EME,,SilentKey,,,01/93 +V47YC,FK87,EME,,Expedition,,,07/96 +V5/KT6Q,JG73NI,EME,,EXPEDITION,,,01/09 +VA2CST,FN35BP,,,,,,01/03 +VA2MGL,FN74UQ,,,,,50: 25W 3el,11/01 +VA2PRC,FN46,,,,,50: deltaloop 144: IC706 13el,01/98 +VA3LK,FN14TO,,,,,,01/03 +VA3NFA,FN25BH,,,,,,12/06 +VA3TO,FN03BI,EME,,,,144: 2x 12el 300W,04/06 +VA3VFO,FN04FC,EME,,,,,09/07 +VA5VHF,DO70FJ,,,,,,01/03 +VA6DX,DO33IM,,,ex VE6MK,,144: 1KW 4x 2M9,01/01 +VA6SZ,DO33AP,EME,,EX VE6AQE,,IC910 IC756proII,10/07 +VA7MM,CN89OG,EME,,,,1296: 3m dish 400W 0.4db Rxampl,09/06 +VE1ALQ,FN65VH,EME,,,,,10/02 +VE1GRT,FN84IQ,,,,,,01/03 +VE1JF,FN74cq,EME,, +VE1KG,FN84CM,EME,,ex VE4XP FP4RS F8PZ,,144: 4x17el M2 50W,10/06 +VE1MQ,FN65,,,,,,01/03 +VE1RG,FN65PT,EME,,,,144: 170W longyagi,04/05 +VE1SKY,FN74,,,,,50: FT620B 3el,01/01 +VE1TAY,FN66,,,,,,01/01 +VE1XYL,FN65VH,,,,,,01/03 +VE1ZJ,FN96UC,EME,,,,144: 1.8KW 6x18el,12/01 +VE2BKL,FN48DJ,,,,,50: 1000W 6el - 144: 150W 19el,04/02 +VE2CST,FN35BP,,,,,,01/03 +VE2DIV,FN35BP,,,,,,01/03 +VE2DSB,FN35hs,EME,, +VE2JWH,FN35LM,EME,,,,144: 4 x 18el K1FO 1.5kw,09/07 +VE2PEP,FN46HC,,,,,KENWOOD,09/07 +VE2PIJ,FN36KA,EME,,,,50: 6el 200W 144: 4 x 18el. K1FO 1.5kw 432: 24el 25W,06/09 +VE2PIJ/P,FN35QI,EME,,,,50: 6el 200W 144: 4 x 18el. K1FO 1.5kw 432: 24el 25W,06/09 +VE2UG,FN35,,,,,,01/03 +VE2WHZ,FN08WN,,,,,,01/03 +VE2YAG,FN19ES,,,,,,01/03 +VE2ZAK,FN25BK,EME,,,,4 x 13 el. and 100W,10/08 +VE3AX,FN02CW,,,ex VE3VD,,1.5KW 50-432 multiple Yagi arays,01/02 +VE3BDR,EN98,,,,,,01/03 +VE3BFM,FN04AE,,,,,,01/03 +VE3CF,FN03,,,,,,01/03 +VE3CVG,FN25HM,,,,,,01/03 +VE3DBP,EN94EE,,,,,,01/03 +VE3DEW,FN04,EME,,,,,01/03 +VE3DIR,FN03,,,,,,01/03 +VE3DSS,FN03FQ,EME,,= VE3KU,,,07/06 +VE3DXP,EN92JW,EME,,,,144: 100W 2x 10el,04/06 +VE3FAC,FN03IS,EME,,,,,01/03 +VE3FAL,EN58DF,EME,,,,,03/05 +VE3FGU,FN04GG,EME,,,,50: 1000KW - 144: 600W 19el,10/06 +VE3FOD,EN76,,,,,,01/03 +VE3JJX,EN29SS,,,,,,01/03 +VE3KH,FN03AJ,EME,,EX VE3KDH,,FLEX-5000A & M2 6M5X,06/09 +VE3KRP,EN58IJ,EME,,,,,04/07 +VE3KU,FN03FQ,EME,,= VE3DSS,,,07/06 +VE3NE,FN03FQ,,,,,,01/03 +VE3OQC,FN03,,,,,,01/03 +VE3SCP,EN93WV,,,,,,01/03 +VE3SPW,FN04GG,EME,,,,144: 100W 17el,04/05 +VE3STZ,EN82,,,,,,01/03 +VE3WMD,EN92JN,,,,,,01/03 +VE4AAZ,EN19,,,,,,01/03 +VE4ACX,EN19,,,,,,01/03 +VE4AJB,EO00,,,,,,01/03 +VE4AP,EN19,,,,,,01/03 +VE4AQ,EN19OR,,,,,144: 1KW 4218XL,01/01 +VE4CCW,EN19,,,,,,01/03 +VE4CT,EN19OW,,,,,,01/03 +VE4DK,EN19,,,,,,01/03 +VE4FV,EN19,,,,,,01/03 +VE4GHR,EN19,,,,,,01/03 +VE4GLS,EN19,,,,,,01/03 +VE4HAY,EN19,,,,,,01/03 +VE4JX,EO00,,,,,,01/03 +VE4KQ,EN19,,,,,,01/03 +VE4KU,EN19,,,,,,01/03 +VE4LAR,EN19,,,,,,01/03 +VE4MA,EN19LU,EME,,,,,01/03 +VE4MBQ,EN19,,,,,,01/03 +VE4MHZ,EN19,,,,,,01/03 +VE4MX,EN19,,,,,,01/03 +VE4OV,EN19,,,,,,01/03 +VE4PQ,EN19,,,,,,01/03 +VE4RCJ,EN19,,,,,,01/03 +VE4RE,EN19,,,,,,01/03 +VE4TOM,EN-19,,,,,,01/03 +VE4TV,EN19CX,,,,,,01/03 +VE4UD,EN19,,,,,,01/03 +VE4ZI,EN19,,,,,,01/03 +VE4ZK,EN19,,,,,,01/03 +VE4ZV,EO10IH,,,,,,01/03 +VE5UF,DO61OV,EME,,,,50: 600W 5EL yagi 144: 325W 4 x 2M12,10/08 +VE6AFO,DO21,EME,,,,,01/03 +VE6AT,DO33GS,EME,,,,432: 5.5m dish GS23b,03/06 +VE6BPR,DO32BG,,,,,50: 150W 5el - 144: 250W 16el crossyagi,01/01 +VE6CPP,DN39ER,EME,,,,144: 2x 13el 170W,02/08 +VE6EGN,DO23QE,EME,,,,144: 22el Xpol 150W,06/05 +VE6LR,DO21,,,,,,01/03 +VE6NA,DO20,EME,,,,,01/03 +VE6NTT,DO31,,,,,144: 170W 17el,01/98 +VE6PY,DO20WW,,,,,,01/03 +VE6TA,DO33GS,EME,,,,432: 5m dish 800W,02/05 +VE6XT,DO,,,,,,01/03 +VE7BBG,CN88DT,EME,,,,,04/05 +VE7BEE,DN09HG,,,,,,01/03 +VE7BQH,CN89KI,EME,,,,384el Collininar,10/05 +VE7CFT,CN79ST,,,,,,01/03 +VE7CLD,CN89LD,EME,,,,,01/03 +VE7DUB,CO88RT,EME,,,,,09/06 +VE7DXG,CN88DT,EME,,ex VE3GBA/7,,50: 150W 5el - 144: 150W 15el,02/05 +VE7FYC,CN89,,,,,,01/03 +VE7IRA,CN89MF,EME,,,,144: 13el 200W,10/08 +VE7KPB,DN29CM,,,,,144: 1KW 5wl M2,06/01 +VE7LGF,CO90TQ,EME,,VE5AGJ,,FT100D 144: 17B2 500W,11/06 +VE7MDL,CN89,,,,,,01/98 +VE7RJ,DN09LL,,,,,,01/03 +VE7SKA,CN88GT,,,,,,01/01 +VE7TIL,CN89LG,,,,,144 : 4x 7el 500W,11/06 +VE7US,CN88IG,,,,,,01/03 +VE7VVW,DO00IF,,,,,144: 160W KLM2m22c - 432: 100W MBM88,01/02 +VE7ZD,CN89LG,,,,,,01/03 +VE9AA,FN66NA,,,,,,06/06 +VE9DX,FN75aj,,, +VE9PA,FN65SU,,,,,,01/03 +VK0MT,QD95KM,EME,,,,,03/05 +VK1VP,QF44NR,EME,,,,,03/05 +VK1WJ,QF44MS,,,EX DK3SA,,TS 50S IC 706 MK2 IC 490A 80W 2m PAm 50W 70cm PA,05/07 +VK2ALU,QF55KN,EME,,,,,01/03 +VK2AWD,QF56NG,EME,,,,144: 2x 13el 2.2ld 300W,10/06 +VK2CZ,QF56NH,,,,,,01/03 +VK2DJG,QF59VK,,,,,,01/04 +VK2FLR,QF56OD,,,,,,01/03 +VK2IT,QF56OH,EME,,,,144: FT-847 350W 1x 8el 12el coming soon,04/06 +VK2JKK,QF69LO,,,,,,01/03 +VK2KRR,QF34MR,EME,,,,144: 400W 4x 17el,07/06 +VK2KU,QF55AI,EME,,,,144: 600W 4x 12el horz,10/08 +VK2SN,QF56OC,EME,,,,432: 4x 28el legal pwr,12/05 +VK2XCI,QF27WD,,,,,,01/03 +VK2XDE,QF56MG,EME,,,,,04/05 +VK2ZT,QF57WF,EME,,,,,12/07 +VK2ZZF,QF43JP,EME,,,,144: 8 over 8 100W,10/06 +VK3AMZ,QF22IC,EME,,,,,01/93 +VK3AXH,QF12WI,EME,,,,144: 4x 18el 400W,08/06 +VK3CY,QF13,EME,,,,,04/00 +VK3DDU,QF22LG,EME,,,,144: 2x 10el 200W,02/09 +VK3HY,QF22PD,,,,,,01/03 +VK3HZ,QF22ME,EME,,,,,09/05 +VK3II,QF21RN,EME,,,,144: 14el 300W,12/06 +VK3OT,QF12AG,EME,,,,,01/94 +VK3VHF,QF32SE,EME,,,,IC910 GPS Locked 3WL Horz Antenna,07/08 +VK3ZYC,QF31NT,EME,,,,144: 2x 10el 4wl Yagis 300W,03/05 +VK4/DL2NUD/QG47,QG47WE,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG49,QG49JR,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG53,QG53WL,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG55,QG55WU,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG56,QG56IV,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG64,QG64NC,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG65,QG65FE,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4ABW,QH30GT,EME,,,,144: 4x 17el 300W,10/06 +VK4ADC,QG62MJ,,,,,50 and 144: Icom IC-7400 100w PEP,01/08 +VK4AFL,QG62OG,EME,,,,432: 16x 15el 100W,10/06 +VK4APG,QG62LP,EME,,,,,01/94 +VK4CDI,QG52XH,EME,,,,144: 300W 4 x 12El Yagi - 432: 450W 4 x 22El Yagi,02/08 +VK4EME,QG63KQ,EME,,VK4KAZ,,TS2000,09/07 +VK4JMC,QG62FI,EME,,,,4x 14el 200W,08/08 +VK4JSR,QG62NM,,,,,50: 100W 8el - 144: 400W 12el - 432: 100W 28el,10/00 +VK4KAZ,QG63KQ,EME,,,,,01/03 +VK4KDD,QG62LP,EME,,,,,10/06 +VK4KZR,QG62LO,EME,,,,,08/00 +VK4WS,QG62OK,EME,,,,144: 12el QRP,12/06 +VK5DK,QF02JE,,,,,,01/03 +VK5MC,QF02EJ,EME,,,,,01/03 +VK5OA,QF02JE,,,,,,01/03 +VK5ZLX,PF95MK,EME,,,,,04/07 +VK5ZLX,PF95MK,EME,,,,,04/07 +VK6KDD,OG99HP,EME,,ex VK4KDD PE1OZH,,LT2S LT6S TS850,03/06 +VK6KXW,OF87JR,,,VK6ZDY,,,05/07 +VK7JG,QE38NN,EME,,,,144: 2x 12el 500W,07/06 +VK7MO,QE37PC,EME,,,,144: 4x 10el,03/05 +VK8MS,PH57PK,EME,,EXPEDITION,,,10/08 +VK9CD,NH87JU,,,,,,01/03 +VK9CMO,NH87KT,EME,,Expedititon,,144: 230W 1Yagi 6wl,08/05 +VK9XMO,OH29UN,EME,,Expedititon,,144: 230W 1Yagi 6wl,09/05 +VK9XW,OH29TI,,,,,,01/03 +VP2EC,FK88LD,,,,,,01/03 +VP2EDS,FK88,EME,,= KJ9I,,,05/07 +VP2MIS,FK86UV,EME,,,,,11/00 +VP2MR,FK86VS,,,,,,01/03 +VP5JM,FL31VS,,,,,,01/03 +VP8NO,GD18BH,EME,,EX G3VUI,,50: 5el Acom 1000 Ampl.,03/08 +VQ9LA,MI62,EME,,,,,09/02 +VR2KW,OL72LL,EME,,,,,06/07 +VS6BI,OL72CG,,,,,,01/03 +VT3AT,RJ38UR,,,,,,01/03 +VU2BMS,MK80EA,EME,,,,FT 857,02/08 +VU2KGB,MK80EA,EME,,,,144: 2x 5el 160W,02/09 +VU7RG,MK61JG,EME,,Expedition,,144: 1KW 28XPol Preamp,01/07 +W0AH,EM85WB,EME,,ex W2CRS,,144: 18el 700W,08/06 +W0AUS,EN35KA,,,,,,01/03 +W0BJ,DN91OD,,,,,,01/03 +W0DB,EN11VD,,,,,144: 50W 2x 8el,09/01 +W0DEN,EN41,,,,,,01/03 +W0DFK,EM47LX,,,,,,01/03 +W0DJM,EN25XK,,,,,,01/03 +W0DQY,EM48RS,,,,,144: 350W 4x8el - 432: 175W 2x88el - 1296: 10W 45el,01/01 +W0EKZ,EM17,,,,,,01/03 +W0ETT,DM79,,,,,,01/03 +W0FMS,EN42EB,,,,,,01/03 +W0FY,EM48,,,,,,01/03 +W0GAJ,EN11,,,,,,01/03 +W0GC,EN14SQ,,,,,,01/03 +W0GHZ,EN34LX,EME,,WA0BWE,,FT-736r TS-440 TS-930 TS-700SP 144: 17B2 1KW Xverters on 902Mhz - 10Ghz,12/07 +W0GN,EN42,,,,,,01/03 +W0GR,EM38AX,,,,,,01/03 +W0HHE,DM79,EME,,,,,01/03 +W0HL,EM27,,,,,,01/03 +W0HP,EN34IT,EME,,,,,11/06 +W0HRG,EM39,,,,,,01/03 +W0IC,DM79MR,,,,,,01/03 +W0IOH,DM78OU,,,not qrv MS nw! (02/01),,,01/01 +W0IPL,DN62UU,EME,,,,,01/04 +W0ITB,DM79,,,,,,01/03 +W0IZ,EN41,,,,,,01/03 +W0JRP,EM27RB,,,,,,01/03 +W0KFG,DN96OT,,,,,,09/01 +W0KJY,DN71,EME,,,,,09/01 +W0KRX,EN34LM,,,,,,01/03 +W0KT,EN21,,, +W0LD,DM78,,,,,144: 1KW 2x16el,04/01 +W0LER,EN35IE,,,,,,01/01 +W0LGQ,EN21DJ,,,EX N0EKT,,,05/07 +W0LMD,DM79,,,,,,01/03 +W0MD,EN36,,,,,,01/03 +W0NKN,EN42,,,,,,01/03 +W0OF,EM12,,,,,,01/03 +W0OHP,EN10,,,,,,01/03 +W0OHU,EN34OA,,,,,,01/03 +W0OZI,EN35,,,,,,01/03 +W0OZL,DN60FM,,,,,,01/03 +W0PEC,EN34,,,,,,01/03 +W0PHD,EN18OE,,,,,144: 190W 16lbx,09/01 +W0PPF,EN41,,,,,,01/03 +W0PT,EM28OD,EME,,,,144: 4X 19XXX and 1.2kw,03/06 +W0PW,EM26TW,,,,,,01/03 +W0QIN,EN34,,,,,,01/03 +W0RAP,EN42EB,,,,,,01/03 +W0RGU,EN35,,,,,,01/03 +W0RKP,EN31,,,,,,01/03 +W0RRY,EM26BX,EME,,,,144: 700W 9elM2 0.6db Preamp,01/01 +W0RSJ,FN20JQ,,,,,,01/03 +W0RTZ,DM79,,,,,,01/03 +W0RWH,EM39SX,EME,,,,144: 16x19el,10/98 +W0SD,EN13GQ,EME,,,,,10/98 +W0SII,DN71,,,,,,01/03 +W0TJ,EN10,,,,,,01/03 +W0TUP,DN98IF,,,,,144: 13B2,03/06 +W0UC,EN35,,,,,,01/03 +W0UHF,EN32,,,,,,01/03 +W0UN,EL07FV,,,,,,01/03 +W0UT,EM17,,,,,,01/03 +W0VB,EN34QB,EME,,,,144: 21el 1KW,10/06 +W0VD,EM27UD,EME,,,,144: TS790A 8877 (1-5KW) 18elM2,01/01 +W0VX,EM12,,,,,,01/03 +W0WGZ,EN42,,,,,,01/03 +W0WOI,EN22TA,,,,,,01/08 +W0WTG,EM48,,,,,,01/03 +W0XG,EN34GX,EME,,,,144: 2x 14el 1KW,11/05 +W0YPT,EN43,,,,,,01/03 +W0ZJY,EM28,,,,,,01/03 +W0ZQ,EN34IU,,,,,,01/03 +W0ZZQ,EM26,,,,,,01/03 +W1CDO,CN87XF,,,,,,01/04 +W1COT,FN31ST,,,,,,01/04 +W1CQD,FN34MR,,,,,,01/04 +W1FIG,FN41GV,EME,,ex PE1FIG,,50: 1KW 2x7el - 144: 9el M2 1KW 0.8db - 222: 450W 10el - 432: 450W 18el,01/01 +W1FKF,FN42JK,EME,,WB1FKF,,Kenwood TS 2000 4x6 el 800 watts EME 2 Meter,05/07 +W1FM,FN42,,,,,,01/03 +W1GHZ,FN42,EME,,ex N1BWT,,,11/06 +W1HY,FN41HV,,,,,,01/03 +W1IPL,FN54FC,EME,,,,144: 4x 12el 200W,01/09 +W1JJ,FN41FO,EME,,,,50: 4x 9el 1500W,05/05 +W1JR,FN42HN,EME,,,,,12/00 +W1LP,FN41SR,,,,,144: 1KW 2x2M9,01/01 +W1PWW,FN53DT,EME,,,,144: 2x 18el 1500W,08/05 +W1QA,FN32,EME,,PA3GCQ ZL2GCQ WF1R,,Orion - TS2000,05/07 +W1QC,FN42HU,EME,,,,,01/03 +W1REZ,FN55,,,,,,10/00 +W1RZF,FN42FC,,,,,,01/04 +W1TE,FN42EN,,,,,50: 1KW 7el - 144: 1KW 22el - 432: 44el,08/01 +W1TMZ,FN41GO,EME,,,,144: 4x 12el 1KW,12/08 +W1UHE,FN41,,,,,,01/03 +W1VT,FN33KE,,,,,,01/03 +W1XE,DM79GW,,,,,,01/03 +W1XR,FN42HW,,,,,,01/03 +W1ZC,FN42DR,,,,,144: 1KW - 432: 36el,01/02 +W1ZX,FM18LG,,,,,,01/03 +W2AXU,FN20OG,,,,,,01/03 +W2BZY,EL98HR,,,,,50: 700W 7el - 144: 400W 2X17el - 222: 300W 23el - 432: 500W 2X38el MGF - 903: 60W 47el - 1296: 50W 55el - 2304 15W 76el - 3456 45W 116el - 10368 1W 2'Dish,04/07 +W2CNS,FN13GA,EME,,,,144: 4x 20XP 1KW,07/06 +W2CRS,DM78,,,,,,01/03 +W2DBL,FN20TK,EME,,,,144: 4x 13el 700W,10/08 +W2DRZ,FN02LA,EME,,,,,01/01 +W2ETI,FN21,EME,,,,,01/03 +W2HBA,FN31TC,,,,,,01/03 +W2MPK,FN23BA,EME,,,,,10/99 +W2PU,FN20QI,EME,,,,432: 4x15XP 750W +W2SZ,FN22,,,,,,01/03 +W2TSL,FN41AA,EME,,,,144: 4x 9el 600W,12/07 +W2UHI,EN73AH,EME,,,,,01/03 +W2VU,FN20,,,,,,01/03 +W2WD,FN20TP,EME,,,,432: 9wl 600W,09/05 +W3ARS,FK88LC,,,,,,01/03 +W3BDP,FM29,,,,,,01/03 +W3BW,FN30AS,,,,,,01/03 +W3EME,CN85BE,EME,,ex K3VGX,,144: Icom 746 MGF2430A MGF1302 4x14el X-Pole 8877,01/05 +W3HQT,FN54,,,,,,01/03 +W3IKE,FM18SW,,,,,,01/03 +W3IOA,EM00,,,,,,01/03 +W3IWI,FM19ME,,,,,,10/05 +W3KJ,FN20HG,,,,,,01/03 +W3MRG,FN10UB,,,,,,01/03 +W3RY,FN10LL,,,,,,01/03 +W3SDZ,FN11,,,,,,01/03 +W3SE,DM03WW,,,,,50: 50W 5el - 144: 150W 12el,04/02 +W3SZ,FN20AH,EME,,ex WA3JYM,,144: 1500W 2x 2MXO32 - 432: 100W 9wl. - 1296: 10W 4x22el - 2304: 10W 2x2ft dish,10/06 +W3TMZ,EL88SU,,,,,,01/03 +W3TWO,FM28CA,,,,,144: 400W M2,07/01 +W3TWX,FN33UR,EME,,,,IC275H+8877+LNA145+4x18elM2,02/08 +W3TWX,FN33UR,EME,,,,IC275H+8877+LNA145+4x18elM2,02/08 +W3UR,FM19LG,,,ex WR3E WB3JRU,,FT1000MP FT847 C3I 7el 22ft 1KW,04/05 +W3UUM,EL29PW,EME,,ex WA3UUM,,144: 24el 1000W,08/06 +W3VH,FN32HG,EME,,,,,01/03 +W3WJR,FN20LL,,,,,,01/03 +W3XO,EM00KD,,,,,,01/03 +W3XS,FN10,EME,,,,,01/00 +W3ZZ,FM19JD,,,,,50: 1-5kw 8el 144: 1-5kw 17 el - 432: 1Kw 33el,07/01 +W4ABC,EL87PT,,,,,50: 100W 7el qubical quad,01/01 +W4AD,FM18IP,EME,,ex K4HWG,,,07/01 +W4AME,EM75FG,,,,,,01/03 +W4AS,EL95to,,, +W4CHA,EL88QA,,,ex WA4CHA,,50: 150W 9el M2 - 144: 1-5KW 2M18xxx - 432: 500W 424B - 1296: 110W 45el - 2304: 5W 45el - 10G: 2W 10ft,01/01 +W4CN,EM17JP,,,,,,09/01 +W4DNR,EM64rr,,, +W4ET,EM56TP,,,,,,01/04 +W4FJ,FM17,,,,,,01/03 +W4GHW,EM81EQ,,,,,,01/04 +W4HTB,EM66,,,,,,01/03 +W4KXY,EM84,,,ex WA4KXY,,,01/01 +W4LNG,EM73VK,,,,,,01/03 +W4LSC,DM25XF,,,,,ICOM 910 w/23 cm,04/08 +W4MOP,EM78,,,,,,01/03 +W4OZK,EM73,,,,,,01/03 +W4PJV,EM65SU,,,,,,01/03 +W4PZA,EM66NC,,,,,,01/03 +W4RBO,EL99KF,,,,,,01/03 +W4RDI,EL96BQ,EME,,,,,01/03 +W4REB,EM78,,,,,,01/03 +W4RFR,EM65,,,,,,01/03 +W4SM,FM08QA,EME,,,,,01/04 +W4SW,FM18IW,EME,,,,144: 4x 10el X-Pol 1.5KW Yaesu 767 and 736 to linears through 1296 Yaesu 817 with trvt on 2304 and above,10/05 +W4TJ,FM08,EME,,,,,06/00 +W4TNV,FM05XD,,,,,,01/03 +W4UDH,EM52AG,,,,,,10/07 +W4UDQ,EM55DB,,,,,,01/03 +W4UE,EM90GC,,,,,,12/97 +W4VHF,EM95,,,,,,01/03 +W4WD,DN40AM,,,,,,01/03 +W4WDH,EM83,,,,,,01/03 +W4WHN,EL94HP,,,,,,09/01 +W4WSR,EM85CB,EME,,,,144: 4x 8el 700W,12/05 +W4WTA,EM83XJ,,,,,144: 160W 18el,11/01 +W4XP,FM18EW,EME,,,,FT-2000 FT-847 DEMI 222 DB6NT 1.2 - 10 GHz,09/07 +W4ZPG,EM73WU,,,,,,01/03 +W4ZRZ,EM63SS,,,,,,01/03 +W5AK,EL29,,,,,,01/03 +W5AL,DM95XB,,,,,50: 150W - 144: 1KW 18el M2 - 222: 130W - 432: 100W,01/01 +W5CTV,EL49WU,,,,,,01/03 +W5DBY,EM12,,,,,,01/03 +W5DID,EL29,,,,,,01/03 +W5DKE,EM12LL,,,,,,01/03 +W5DS,EM15,,,,,,01/03 +W5ETG,EM12LS,,,,,,01/03 +W5FR,EM12KX,,,,,,01/03 +W5FYZ,EM32,,,,,,01/03 +W5GDL,EM15GM,,,,,,01/03 +W5GEL,EL17,,,,,,01/03 +W5GG,EM12,,,,,,01/03 +W5GKO,EM35,,,,,,01/03 +W5GNB,DM73VB,,,,,,01/03 +W5GVE,EM01,,,,,,01/03 +W5HES,EM12HQ,,,,,,01/03 +W5HPT,EM12,,,,,,01/03 +W5HTZ,EM16,,,,,,01/03 +W5HUQ,EM35BC,,,,,,07/01 +W5ITI,EM32,,,,,,01/03 +W5IU,EM12HP,,,,,,01/03 +W5IXR,DM76,,,,,,01/03 +W5JBP,EM12,,,,,,01/03 +W5KDA,EM41HM,EME,,,,144: TS790A 4x 17el 500W,08/06 +W5KI,EM36cl,,,,,756ProII Acom 1000,08/05 +W5KLF,EM31PJ,,,,,,01/03 +W5KQJ,EM12BS,,,,,,01/03 +W5LBT,EM40KV,EME,,= WB5LBT,,,08/05 +W5LUA,EM13QC,EME,,,,,01/03 +W5LUU,EL09QO,EME,,,,144: FT736r 1.5KW 4x5wl - 432: 1.5KW 1x5wl,08/01 +W5MRF,EM12,,,,,,01/03 +W5NFC,EM10,,,,,,01/03 +W5PIC,EM16LJ,,,,,,01/03 +W5PLN,EM12,,,,,,01/03 +W5RCI,EM44UF,EME,,,,,01/97 +W5SNX,EM73WT,,,,,50: 150Watts 6M7JHV @65ft - 144MHz : 500Watts 8wl @65ft,01/02 +W5SXD,EM02XS,EME,,,,ic-756 ts2000x commander 1500 w on six,06/09 +W5TCD,EM12,,,,,,01/03 +W5TVG,EM26,,,,,,01/03 +W5UC,EM21PI,EME,,,,144:,11/05 +W5UN,EM23MG,EME,,,,144: 32x 2M5WL,04/07 +W5UPR,EL29,,,,,,01/03 +W5UWB,EL17AX,EME,,,,50: 6el 1000W 144: 21el (8wl) 1500W NO elevation 432: 23el 150W,03/07 +W5VUY,EM40,,,,,,01/03 +W5WJP,EM12HO,,,,,,01/03 +W5YUO,EM12,,,,,,01/03 +W5ZN,EM45DH,EME,,,,,12/00 +W6CAP,DM14,,,,,144: FT726r 1KW 2yagis,01/01 +W6CPL,DM04,,,,,,01/03 +W6FC,DM03,,,,,,01/03 +W6HD,CM98PF,EME,,,,,01/03 +W6IHG,FM09TB,EME,,,,144: 11el 300W,01/06 +W6IZU,CM98NO,,,,,,01/03 +W6KH,CM97,,,,,,01/03 +W6MT,CM87XH,,,,,,01/03 +W6NQ,DM13,,,,,,01/03 +W6OMF,CM98AK,,,ex WB5OMF,,144: 650W 2x17el - 222: 120W 7wl - 432: 175W 2x9el,01/01 +W6OUU,DN22SN,EME,,,,144: 700W 18el MXXX,10/08 +W6OYJ,DM12,,,,,,01/03 +W6QT,CM87,,,,,,01/03 +W6SZ,DM14ED,EME,,,,TS-850 TS-700,02/08 +W6TE,DM06CT,EME,,,,,01/03 +W6US,DM13JA,,,,,,01/03 +W6WE,CM95RD,EME,,,,,11/03 +W6YLZ,DM04RF,,,,,50: 80W 4el - 144: 150W 14el,01/01 +W6YX,CM87WJ,EME,,,,,01/04 +W7ALW,DN36AU,EME,,,,50: 8877 9el - 144: 1KW 2x 18xxx - 432: 1500W 4x13wl,06/06 +W7AMI,DN13VO,EME,,ex KJ7F,,432: 4x 28el 750W,09/05 +W7ANF,DM43AS,,,,,144: 15W Vertical,07/01 +W7AV,CN88MB,EME,,,,144: 4x 20XP 600W,07/06 +W7BBM,DM42MB,EME,,,,,01/03 +W7CE,CN87OA,EME,,,,50: IC-756 PRO III 1500W 1x7MJHV - 144: FT-736R 500W 1x18MXXX Yagi,05/08 +W7CI,DM41UN,EME,,,,,01/03 +W7CNK,EM15FI,EME,,,,144: 2x 9el 400W,10/06 +W7CQ,CN83JX,,,,,,01/03 +W7CS,DM42OO,EME,,ex WA6MGZ,,50: 1.5KW 7el - 144: 500W 4x13el - 432: 500W 2x22el - 1296: 15W,08/01 +W7DHH,DM48LL,,,,,,01/03 +W7DWW,CN87,,,,,,01/03 +W7EME,CN85BE,EME,,,,50: 2x 9el 8877 - 144: FT736r Mutek DSP Preamp GS23B 6x 7wl - 432: 8x 42el Xpol 8877,10/08 +W7EME/CN72,CN72,EME,,EXPEDITION,,,02/09 +W7EME/CN76,CN76,EME,,EXPEDITION,,,02/09 +W7EME/CN86,CN86,EME,,EXPEDITION,,,02/09 +W7EME/DN11,DN11,EME,,EXPEDITION,,,02/09 +W7EME/DN42,DN42WQ,EME,,EXPEDITION,,,03/09 +W7EME/DN53,DN53WV,EME,,EXPEDITION,,,03/09 +W7EME/EN17,EN17,EME,,EXPEDITION,,,03/09 +W7EW,CN84LV,,,ex W7AT N7AVK,,FT1000MP 144: 1-5KW,08/03 +W7FN,CN88SA,EME,,,,,11/03 +W7GJ,DN27UB,EME,,ex WA1JXN,,50: 4x 9el 1.5KW 144: 16x 17el 1.5KW MGF1402,08/05 +W7GTM,CN87VU,,,,,,01/03 +W7GZ,DM42NF,,,,,,01/03 +W7ID,DN13UN,EME,,,,,01/02 +W7IUV,DN07DG,EME,,,,144: 4x 8el 500W 432: 33el 50W,04/06 +W7IXL,DM03US,,,,,,01/03 +W7JF,DN55RS,,,,,,01/03 +W7JW,EN82HJ,,,,,,01/03 +W7KK,DM18,EME,,Expedition,,144: 2 x 18XXX at 40'/50' KW Output FT847,04/01 +W7LD,DM78OV,,,,,,01/03 +W7MEM,DN17NT,EME,,ex N7EIJ,,50: 600W 9el - 144: FT726r 2002A 800W 4x5wl - 432: 800W 4x30lbx,09/01 +W7NS,DM33WP,,,,,,01/03 +W7NTF,CN87TB,,,,,50: 160W 6el - 144: 160W 13el,01/01 +W7OJT,DM26KB,EME,,,,,10/06 +W7PW,DM09JI,,,,,,01/03 +W7QX,DM44AR,EME,,,,1296: 10 1/2Dish 75Watt,03/04 +W7SZ,CN85UO,EME,,,,432: 4x32el X-pol 1.5KW - 1296: 3m dish 500W,01/00 +W7TVF,DM26,EME,,,,,01/03 +W7UPF,DM42MF,EME,,,,,08/05 +W7VQQ,DM19,EME,,,,,01/03 +W7VX,DM03TV,,,,,,01/03 +W7XU,EN13LM,,,,,144: 1-5KW,08/03 +W7ZRC,DN13,EME,,,,,01/03 +W8ATH,EN80,EME,,,,,01/03 +W8BYA,EN70JT,EME,,,,144: 2x 17elB2 650W Preamp,02/05 +W8CM,EM13,,,,,50: IC575H 800W 7el - 144: IC275H 800W 4x9el - 432: IC475H 500W 4x18el,01/02 +W8CRZ,EN80TB,,,,,,01/04 +W8DQ,EM79NC,,,,,,01/04 +W8HOM,EN71LA,,,,,,01/03 +W8IDU,EN83,EME,,,,,01/03 +W8ISS,EN82JG,,,KD4DLA,,,10/08 +W8KSE,EM80,,,,,,01/03 +W8LON,EN73JB,EME,,,,144: 2x 17el 400W,08/05 +W8MGJ,EM79,,,,,,01/03 +W8MM,EM79SD,,,,,,01/03 +W8MQW,EN72UR,EME,,,,,01/03 +W8OUD,EM79RJ,,,,,,01/03 +W8PAT,EN81VG,EME,,,,144: 350 watts 2x12 V or H,04/05 +W8SCA,EM79UN,,,,,,01/04 +W8TAH,EN91CD,,,,,,01/03 +W8TL,FM09BM,,,,,50: FT767 1KW 11el - 144: FT736 1KW 17B2,01/01 +W8TN,EM98AL,,,,,,10/07 +W8VHF,EN64,,,,,,01/03 +W8WN,EM77BQ,EME,,,,50: 600W 4el - 144: 1.2KW 4x16el KLM - 432: 10W,04/05 +W9BLI,EN64DP,EME,,,,144: 14db up 40 200 W 432: 17db up 15 100 W,05/06 +W9BN,EM34TT,,,,,,01/03 +W9CGI,EN60WC,,,,,,01/03 +W9DWP,EN52,,,,,,01/03 +W9EQI,EM49,,,,,,01/03 +W9FF,EN40,,, +W9FX,EM57MX,,,,,144: 1KW 17el,07/01 +W9FY,EN52,,,,,,01/03 +W9FZ,EN43,,,,,,01/03 +W9GIR,EN44OG,,,,,,01/03 +W9GKA,EM58CP,,,WB9GKA,,K1FO's at 65 feet 100W on all 4 bands,05/07 +W9GM,EN43JU,,,,,50: 100W 6el - 144: 100W 13el,05/02 +W9HLY,EN70NT,,,,,,01/03 +W9IIX,EN61DR,,,,,,01/03 +W9IP,FN24KO,,,,,,01/03 +W9JMS,EM69,,,,,,01/03 +W9JN,EN54DN,EME,,,,50: 1KW 9el m29khw- 144: 1KW M218XXX,12/07 +W9KFB,EN60,,,,,,01/03 +W9KHH,EN63AH,,,,,,01/03 +W9LT,EN52XG,,,,,,01/04 +W9NHE,EN53XB,EME,,,,144: 17el M2 400W,06/06 +W9NLP,EN52WN,,,,,,01/03 +W9NTP,EM79,,,,,,01/03 +W9NWR,EN55FW,,,,,,01/04 +W9RM,EN52RB,EME,,,,,10/07 +W9RPM,EN43JT,,,,,,05/07 +W9RVG,EM57RN,EME,,,,IC746 IC910H FT736,06/07 +W9SE,EN90LM,,,,,,03/06 +W9VA,EN62,,,,,,01/03 +W9VNE,EM79,,,,,,01/03 +W9XA,EN51UT,EME,,,,144: 8x 13el 600W,10/06 +W9XT,EN53,,,,,,01/98 +W9ZIH,EN51NV,,,,,,01/03 +WA0AUQ,EN41,,,,,,01/03 +WA0BWE,EN34LX,,,,,,01/98 +WA0CQG,EN34,,,,,,01/03 +WA0DXZ,EN41,,,,,,01/97 +WA0ETH,EM38PH,,,,,,01/03 +WA0JDU,EN34,,,,,,01/03 +WA0JMP,EN34,,,,,,01/03 +WA0JYF,EN42,,,,,,01/03 +WA0KBZ,EM48HB,EME,,,,FT857D 144: 400W 17elB2,03/07 +WA0MWW,EN30VX,,,,,,01/04 +WA0NOK,EM28,,,,,,01/03 +WA0QII,CM97,,,,,,01/03 +WA0RDX,EM17,,,,,,01/03 +WA0RJT,EN41,,,,,,01/03 +WA0SJR,EM56,,,,,,01/03 +WA0TAQ,EN61QU,,,,,,01/04 +WA0VSL,DM79OB,,,,,50W,08/04 +WA0WPJ,EM29,,,,,,01/03 +WA0WQI,EM55AA,,,,,,01/03 +WA0WRI,EN10,,,,,,01/03 +WA1FVJ,FN31QS,,,,,144: 13B2 40W,08/04 +WA1HOG,FN42AS,,,,,144: 100W,01/01 +WA1JOF,FN44XV,EME,,,,,01/03 +WA1JXN,DN27UB,,,,,,01/03 +WA1MBA,FN32SL,,,,,,01/03 +WA1MEK,FN42,,,,,,01/03 +WA1MKE,EN70GH,,,,,,01/03 +WA1OFR,FN42MA,,,,,,01/01 +WA1T,FN43LK,EME,,,,144: 15el 500W,06/06 +WA1TMQ,FN31OJ,,,,,,01/03 +WA2ALV,FN33,,,,,,01/03 +WA2FGK,FN21BF,EME,,,,144: 4x 12el 1KW,12/08 +WA2FUZ,FN22XJ,,,,,,01/03 +WA2GFP,FN20,,,,,,01/03 +WA2JGY,DM79,,,,,,01/03 +WA2LSE,FN20,,,,,,01/03 +WA2LTM,FN20,,,,,,01/03 +WA2ODO,EM94NX,EME,,,,144: 4x 12el 300W,11/07 +WA2VOI,EN35JA,,,,,,01/03 +WA2YJF,FN30FR,,,,,,01/03 +WA3BZT,FM29EP,EME,,,,144: Flex-5000A GU78b 1.5KW 4x2MXP20,03/08 +WA3FFC,FN01,EME,,,,,01/03 +WA3KQA,EM98LL,,,,,,01/03 +WA3LTB,EN92TA,EME,,,,144: 100W 17el,04/07 +WA3RQD,FM19QK,,,,,,01/03 +WA3SIX,FN10UB,,,,,,01/03 +WA3TTS,EN90,,, +WA3USG,FN10LL,,,,,,01/03 +WA4ALJ,EM63,,,,,,01/03 +WA4CHA,EL88QA,,,,,,01/03 +WA4CQG,EM72fo,,, +WA4DFS,EM96,,,,,,01/03 +WA4EWA,EM63LL,,,,,,01/03 +WA4EWV,EM70CE,EME,,,,TS2000 144: 2x 17 element Yagi - QRO,10/08 +WA4HEI,EN65UX,,,,,,01/03 +WA4HFN,EM55AB,EME,,,,,08/05 +WA4JQS,EM77TA,,,,,144: 2x33el 2.5WL,08/01 +WA4LBT,EM95,EME,,,,,01/03 +WA4NJP,EM84DG,EME,,,,,03/05 +WA4PCS,EM78,,,,,,01/03 +WA4PGJ,EM55,,,,,,01/03 +WA4PGM,FM07TI,,,,,144. 170W 17el,01/98 +WA4VWR,EM55,,,,,,01/03 +WA4YRK,EM75WV,,,,,IC910 IC756,05/02 +WA4ZTK,EM85,EME,,,,,01/03 +WA5CJG,EM15,,,,,,01/03 +WA5DJJ,DM62PH,,,,,,01/03 +WA5ETV,EM15,EME,,,,,01/03 +WA5ICW,EM26,EME,,,,,01/03 +WA5IYX,EL09,,,,,,01/03 +WA5JAT,EM12ET,,,,,,01/03 +WA5JCI,EM21,,,,,,01/01 +WA5KBH,EM30HL,,,,,,01/03 +WA5NFC,EM45,,,,,,01/03 +WA5TKU,EM13II,,,,,,01/03 +WA5TNY,EM12,,,,,,01/03 +WA5UAJ,EM32,,,,,,01/03 +WA5UFH,EL19,,,,,,09/01 +WA5VKS,EM13PA,,,,,,01/03 +WA5WCP,EM12,,,,,,01/03 +WA5YOU,EM53EE,,,,,,01/03 +WA5YWC,EM13OB,,,,,,01/03 +WA5ZIB,EL29,,,,,,01/03 +WA6BJE,DM13,EME,,,,,01/03 +WA6BYA,CM86,,,,,,01/03 +WA6EIW,EM15DI,,,,,,01/03 +WA6ERB,DM79,,,,,,01/03 +WA6FXL,CM89OB,,,,,144: 9el 100W,09/06 +WA6GXF,DM06DX,,,,,,01/03 +WA6IJZ,DM44KM,,,,,,01/03 +WA6KBL,CM97AG,EME,,,,,01/03 +WA6KOU,DN17,,,,,,01/03 +WA6LHD,CM88XF,,,,,,01/97 +WA6OWM,DM03TU,,,,,50: 100W Loop - 144: 100W 15el,09/01 +WA6PXO,DM13DO,EME,,,,144: 2x 9el 200W,10/06 +WA6PY,DM13LA,EME,,,,144: 2x20el VE7BQH 700W,11/06 +WA6TTY,DM78,,,,,,01/03 +WA6UCT,DM34,,,,,,01/03 +WA6YGB,DM04WA,,,,,,01/03 +WA6ZKY,CM98,EME,,,,,01/03 +WA7ADK,DN31WD,EME,,,,,01/05 +WA7BJU,CN85,,,,,,01/05 +WA7CJO,DM33XL,EME,,,,,01/03 +WA7EPU,DM62,,,,,,01/03 +WA7GSK,DN13SO,EME,,,,144: 1KW 4x16el K1FO,11/06 +WA7HQD,DN31XA,,,,,,01/98 +WA7KHO,DN47,,,,,,01/03 +WA7SKT,CN86CX,EME,,,,,11/05 +WA7TZY,CN87,EME,,,,,12/00 +WA8CLT,EN80LA,EME,,,,144: 1500W 4x9M2,03/05 +WA8CXI,EM99WK,EME,,PSE QSL direct,,FT847 - 144: 2x 18el CC with max 68deg elevation 8877ampl with 1500W,04/06 +WA8EUU,EN82,,,,,,01/03 +WA8MIL,EN63,,,,,,01/03 +WA8NLC,EM73,,,,,,01/03 +WA8OGS,EM79,,,,,,01/03 +WA8RJF,EN91IQ,EME,,,,144: 17el 250W,03/05 +WA8VPD,EN82,EME,,,,,01/03 +WA8WZG,EN81OM,EME,,,,,01/01 +WA8YTB,EN72JH,,,,,,01/03 +WA9BTT,EN40,,,,,,01/03 +WA9BVS,EM69WV,,,,,,01/03 +WA9ENA,EN42,,,,,,01/03 +WA9FWD,EN53,EME,,,,,01/03 +WA9HCZ,EN43JV,,,,,,01/03 +WA9HIR,EN61CU,,,,,,01/03 +WA9HUV,EN51,,,,,,01/03 +WA9JML,EN51PW,,,,,,01/01 +WA9NBU,DM14JG,,,,,FT736R - Mirage 160W,05/07 +WA9NRB,EM48,,,,,,01/03 +WA9O,EN62BX,,,,,,01/03 +WA9OUU,EM89,EME,,,,,01/03 +WA9PAM,EN44,,,,,,01/03 +WA9PSI,EN51,,,,,,01/03 +WA9PZL,EM32DN,,,,,,01/03 +WB0CLL,EM28,,,,,,01/03 +WB0CQO,EN31,,,,,,01/03 +WB0DBS,EM17,,,,,,01/03 +WB0DGF,EN10PT,,,,,,01/03 +WB0DRL,EM18CT,EME,,,,,01/03 +WB0GAZ,DM79,,,,,,01/03 +WB0GGM,EN34,EME,,,,,01/03 +WB0HXY,EN10,,,,,,01/03 +WB0ITA,EM29,,,,,,01/03 +WB0IUT,EN10,,,,,,01/03 +WB0LJC,EN34JV,,,,,,01/03 +WB0MLL,EN35,,,,,,01/03 +WB0NCR,EN42,,,,,,01/03 +WB0OOL,EM48,,,,,,01/03 +WB0QGH,EM84,,,,,,01/03 +WB0QIY,EN10,,,,,,01/03 +WB0QQS,EN10,,,,,,01/03 +WB0SIP,EN10,,,,,,01/03 +WB0TEM,EN12RT,EME,,,,,10/05 +WB0VGI,EN34LL,,,,,,01/03 +WB0YFL,EN42,,,,,,01/03 +WB0YRQ,EN12,,,,,,01/03 +WB0ZJP,EM48,,,,,,01/03 +WB1FLD,FN42IW,,,,,,01/02 +WB1GQR,FN33KL,,,,,,01/04 +WB2BYP,FN13FF,EME,,,,144: 4x 9el 8877,07/05 +WB2LSP,FM29DP,,,,,,01/03 +WB2OYC,FM29NN,,,,,,01/03 +WB2QLP,EL96DE,,,,,50: 400W- 144: 400W- 432: 170W,01/01 +WB2RVX,FM29MT,EME,,,,144: 4XP20 700w 432: 28el kW,10/08 +WB2SEB,FN31DD,,,,,144: 175W 13el - 222: 100W 10el,03/02 +WB2SIH,FN31DD,EME,,,,144: 13B2 800W FT736R SSB-preamp,09/06 +WB2SZR,FN20LL,,,,,144: 100W 16el,01/07 +WB2VVV,FN21,EME,,,,,01/00 +WB4AXQ,EM64,,,,,,01/03 +WB4BKC,EL96,EME,,,,,01/03 +WB4ECR,EM66QF,,,,,,01/04 +WB4EFZ,EM94,,,,,,01/03 +WB4GTB,EM73VW,,,,,,01/03 +WB4JEM,EL89QU,,,,,50: 6elQuad 500W - 144: 16x10el preamp 1-5KW - 222: 17el 160W - 432: 24el 500W,01/01 +WB4KMH,EM75RV,,,,,,01/01 +WB4LHD,EM55DB,EME,,,,,02/05 +WB4NFS,FM18HP,,,,,144: 400W,01/97 +WB5AFY,EM04ID,EME,,,,,02/05 +WB5APD,EM84AK,,,,,144: 1.5kw 17 el,01/01 +WB5DSH,EM15,,,,,,01/03 +WB5IPM,EM12,,,,,,01/03 +WB5KDC,EM15,,,,,,01/03 +WB5KYK,EM51JQ,,,,,,01/03 +WB5LBT,EM40LK,EME,,= W5LBT,,,01/01 +WB5NIF,EM42AM,,,,,,01/03 +WB5R,DM93PB,,,,,,01/09 +WB5ROR,EM23,,,,,,01/03 +WB5TBL,EM12,,,,,,01/03 +WB5TCO,EN64,,,,,,01/03 +WB5VPC,EM12,,,,,,01/03 +WB6WLR,DM13AT,,,,,144: 8877 2x17B2 - 432: 8938 2xFO33,01/01 +WB7OSE,CN87XT,,,,,,01/03 +WB7UNU,CN85OJ,EME,,,,144: 170W 17el,11/05 +WB8AGV,EN34,,,,,,01/03 +WB8IFM,EM79WS,,,,,,01/03 +WB8NUT,EM79UB,,,,,,01/03 +WB8SKP,EN66UC,,,,,,01/04 +WB8TFV,FM19AL,,,,,,01/03 +WB8TGY,EN72PP,EME,,,,144: 13B2 antenna,03/05 +WB8WTB,EN72,,,,,,01/03 +WB8XX,EM79,,,,,,12/00 +WB9BWP,EN52,,,,,,01/03 +WB9F,EM57QQ,,,,,ICOM 756 PRP III,10/05 +WB9HLM,EN52IW,,,,,,01/03 +WB9IHS,EM69,,,,,,01/03 +WB9IIV,EM69ST,EME,,,,144: 11el 150W,02/06 +WB9OGM,EN61,,,,,,01/03 +WB9OQB,EN44WP,,,,,FT 817,05/08 +WB9OWN,EN52,,,,,,01/03 +WB9PNU,EM48TN,EME,,,,144: Antenna: 4x M2 2M9 Icom 756Pro DEMI Transverter Lunar Link LA22,09/07 +WB9SNR,EN62AC,,,,,,01/03 +WB9SPT,EN71AS,,,,,,01/03 +WB9USX,EM79,,,,,,01/03 +WB9UWA,EN50KK,EME,,,,144: 4x UWA12's 18.5 dbd low temperature MC2K 2x GU74B's MGF1302,10/00 +WB9ZAI,EN61GM,,,,,,01/03 +WC4N,EM86,,, +WC9C,EM69HH,,,,,,01/03 +WD0AAD,DM79,,,,,,01/03 +WD0ALN,EM32,,,,,,01/03 +WD0APF,EN10,,,,,,01/03 +WD0BQM,DN81CW,,,,,,01/03 +WD0CJM,EN25FH,,,,,,01/03 +WD0EDO,EN10TL,,,,,,01/03 +WD0FCH,EM48,,,,,,01/03 +WD0GML,EM48,,,,,,01/03 +WD0HOJ,EN41,,,,,,01/03 +WD0L,EM17IH,,,,,,01/03 +WD0M,DM67KG,,,,,,01/04 +WD4ECK,CN82,,,,,,01/03 +WD4FAB,EL98HP,,,,,,01/03 +WD4KPD,FM15MM,,,,,,05/02 +WD4MUO,DM79GX,,,,,,01/03 +WD4OZN,EM55LK,,,,,,01/03 +WD5AGO,EM26BD,EME,,,,,03/00 +WD5CAN,EM36,,,,,,01/03 +WD5CAP,EM36,,,,,,01/03 +WD5DJT,EM12OO,,,,,,01/03 +WD5EAE,EM22KQ,EME,,,,FT-847,11/07 +WD5EWD,EM22,,,,,,01/03 +WD5G,EM05,,,,,,01/03 +WD6BXE,DM22,,,,,,01/03 +WD6DBM,CM97AI,EME,,,,144: 2x 17el 500W,10/06 +WD8BYA,FM18IP,,,,,,01/03 +WD8SDL,EM79,,,,,,01/03 +WD9BGA,EN53BA,,,,,,01/03 +WD9EGE,EN64,,,,,,01/03 +WD9EXD,EN61,,,,,,01/03 +WD9FBL,EN61BV,,,,,,01/03 +WD9IIX,EN61,,,,,,01/03 +WE2Y,FN02SR,EME,,,,,01/03 +WE4K,EM77BQ,,,,,,01/03 +WE7L,DM41,,,,,,01/03 +WE7P,DN13RP,EME,,,,,01/03 +WE9D,EN52,,,,,,01/03 +WE9V,EN52XN,,,,,,07/08 +WE9Y,EN82EW,EME,,,,IC910H LA22 AM6155 144: 2x 18el 1500W,04/07 +WF1F,FN42,,,,,,01/03 +WF1R,FN32,,,,,,01/03 +WF4R,FM16TS,,,,,,01/03 +WF9M,EM79,,,,,,01/03 +WH6LR,EM04LL,,,,,,01/03 +WI7P,DN40ER,EME,,,,144: 2x 11el 1000W,11/06 +WJ6T,DM05HL,EME,,,,144: 4x 9el 500W and new 7/8,04/07 +WK9E,EN53,,,,,,01/03 +WL7M,BO49IR,,,,,,01/03 +WL7U,BP51,EME,,,,50: 150W 5el - 144: 300W 2x10el - 432: 900W- 6x20el,01/98 +WM2Z,FN31SA,,,,,IC-746PRO TS-850SAT,10/07 +WM5Y,EN31,,,,,,01/03 +WN3CDW,FN11XB,EME,,,,50 MHZ: 1200 Watts 5 Element M2 6M5X Yagi,08/08 +WN4BML,EL89LL,,,,,,01/03 +WN4KKN,EM10,,,,,,01/03 +WN4M,EM66,,,,,100W,01/04 +WO9S,EN61ET,EME,,,,144: 13el 140W,10/06 +WP4G,FK68VG,EME,,,,144: 1KW 2x2MX28P,08/05 +WP4O,FK68,,,,,144: FT736r 400W 18ft langyagi preamp,01/01 +WQ0P,EM19VF,,,,,,09/01 +WQ5S,EM13RC,EME,,EX KA5UIQ KF5FQ,,144: FT847 4x2M12el 1500 432: 1x31 50W,04/07 +WQ5W,EM12FW,EME,,,,TS2000,09/06 +WR0F,EM29TC,,,,,,01/03 +WR0I,EM17,,,,,,01/03 +WR6S,DM14CP,,,,,,01/03 +WR9W,EM68FA,,,,,,01/03 +WS5R,DM95,,,,,,01/03 +WT0W,EN34,,,,,,01/03 +WU8Y,EN82JW,,,KC8DQH,,,07/07 +WV0K,EN13,,,,,,01/03 +WV1K,FN41WR,,,,,,01/05 +WV2C,FN30,,,,,144: IC706 180W 15el,01/98 +WW2R,EM13QD,EME,,,,,04/06 +WW4T,EM83,,,,,,01/03 +WW8M,EN72XF,EME,,,,144: 4x 18 M2XXX 1KW,03/07 +WX9M,EN54FL,,,,,,01/03 +WY0C,EM17IT,,,,,,01/03 +WY0V,EN12,,,,,,01/98 +WY3G,EM55,,,,,,01/03 +WY5R,DM95BE,,,,,TS2000,06/08 +WZ1V,FN31MP,,,,,50: 600W 5el - 144: 1kw 17el - 222: 500W 15el - 432: 500W 24el,05/07 +WZ8D,EM89BI,,,ex WB8IGY,,50: 1.5KW 6el - 144: 1.5KW 2x 17el,03/06 +WZ9D,EN51,,,,,,01/03 +XE1AVM,DK79UA,,,,,,01/03 +XE1GE,EK08,,,,,,01/03 +XE1GRR,DL80IP,EME,,,,50: 4x 6 el - 144: FT736 2x 17el H+V 250W - 432: 4x 33el H+V,09/06 +XE1XA,EK09,EME,,,,,01/03 +XE2AT,DL81UU,EME,,ex XE2YVW,,144: IC820 400W 4x 9el,01/07 +XE2NS,EL05AG,EME,,,,144: 2x 17el 160W,11/08 +XE2OR,DL98OK,,,,,144: 13B2 160W,08/05 +XF4DL,DK48MS,EME,,SpecialCall,,144: 2x 11el 350W,10/06 +YB0US,OI33JU,,,,,,01/03 +YL1A,KO07UN,,,Expedition,,,05/03 +YL27HF,KO27VC,,,SPECIALCALL,,,09/07 +YL2AO,KO16DK,,,,,,08/07 +YL2GJW,KO06MM,,,AS WELL KO06RM,,TS2000x TE-1452g(400W) 2xEF208 (vert stack) 9el Yagi for additional rx,12/08 +YL2GUI,KO06MM,,,,,144: TS-570+FTV-250 9el 30W,03/04 +YL2HA,KO26BV,EME,,,,144: 4x 16el 400W,08/08 +YL2IV,KO06MM,,,UQ2IV,,FT-817D 144: 7el QYAGI 432: 11el QYAGI,04/08 +YL2KA,KO26AX,,,,,,03/02 +YL2LW,KO26CW,,,,,,07/05 +YL2OK,KO37AS,,,,,,11/04 +YL2OW,KO26WL,,,ex UQ2OW,,FT736R IC706MKIIG,01/05 +YL3DW,KO26CW,,,,,,11/02 +YL3GCT,KO26BW,EME,,,,432: 8x9el DK7ZB 180W,11/05 +YL3GDF,KO26XM,EME,,,,144: 8x 13el 1KW,03/07 +YL3GDJ,KO26AX,,,,,,01/05 +YL3GDR,KO26HT,EME,,,,,03/07 +YL3HA,KO26DW,,,,,,12/07 +YL90HA,KO26BV,EME,,SPECIALCALL,,,10/08 +YM3XC,KN30FC,,,Expedition,,,11/02 +YO0IS,KN05PS,,,SpecialCall,,,01/93 +YO2AMU,KN06OC,EME,,,,144: 4x16el MGF1302 1KW 432: 4x 21el 1KW,08/05 +YO2BBT,KN05WG,,,,,144: FT897 300W 10el,12/08 +YO2IS,KN05PS,EME,,,,144: 4CX250B 10el BF981 - 432: 4X150D 17el 3SK97,01/06 +YO2KQT,KN05PS,,,,,FT-847 50W 1xF9FT 3WL,09/07 +YO2LEA,KN06WK,,,,,144: IC-211 lin.Mirage B 215G - 6m and 70 cm transverters,03/01 +YO2NAA,KN05OS,,,YO5QCF,,FT-847 8EL Yagi,05/08 +YO3DMU,KN34BJ,EME,,,,144: TS870 +Trsv 1KW MGF1302 16el,03/07 +YO3FFF,KN34CJ,EME,,,,144: TS450 Trvtr 100W B-310G GaAs Preamp 16el Tonna,04/05 +YO3IZI,KN34BK,EME,,,,TS2000,01/04 +YO3JW,KN34CK,,,,,144: 400W 16el F9FT 3P602A-2,04/00 +YO3KWJ,KN24,,,Expedition,,,01/93 +YO4AUL,KN44HE,EME,,,,144: FT897 200W 1x16el 10m boom,04/07 +YO4BZC,KN45AK,,,,,IC 706 5 el delta loop HM PA 70W,07/05 +YO4FEI,KN45NB,,,,,144: 50W 9el,11/06 +YO4FNG,KN44HD,EME,,,,144:FT847/MGF1302/12 el. DK7ZB/GS35 432:16 el. DL6WU/50W 1296: DB6NT/20W 15 el. DL6WU,05/08 +YO4FYQ,KN44HE,EME,,,,FT-847 50: 100W 5el 7ZB - 70: 25W 5el 7ZB - 144: 10el 7ZB 700W - 432: 50W 13el,05/06 +YO4GJH,KN35XG,,,,,FT 847 MIRAGE B2518G 2xGI7b DK7ZB 14 el.,10/07 +YO4KRB,KN44HE,EME,,,,144: 400 W 10 el 7ZB FT 847 MGF 1302,01/06 +YO4RFV,KN45AK,,,,,,08/02 +YO4RXX,KN45AK,,,,,,07/03 +YO5AVN,KN34,,,,,,01/93 +YO5BIM,KN07XB,,,,,,05/04 +YO5BIN,KN17WW,EME,,,,HM Transverter + TS 140 800W 4x 9el F9FT MGF1302,05/07 +YO5BWD,KN27GD,,,,,,08/00 +YO5CFI,KN16WJ,,,,,FT857D HF PSK: 40W 50 MHz: 100W dipole 144 MHz: 150W 2x9el TONNA,06/09 +YO5CXI,KN16WJ,,,,,144: 50W 2x 9el,10/06 +YO5DJM,KN17,EME,,,,,01/93 +YO5KAI,KN16TE,EME,,,,,06/99 +YO5KAV,KN16TS,EME,,,,,06/99 +YO5KUW,KN17UL,,,Expedition,,,08/06 +YO5OCZ,KN17UL,,,,,TS 2000 X TS 700 S TS 820 + TV 502 QRO GI7B,03/09 +YO5OHY,KN17SP,,,,,,12/06 +YO5TE,KN16TS,EME,,,,144: 1KW 4x10el MGF1302,01/02 +YO5TP,KN16SS,,,,,144: 40W 16el,05/06 +YO7CGS,KN15OA,,,,,,08/97 +YO7CKQ,KN15OA,,,,,,05/01 +YO7HLI,KN25EC,,,,,,08/08 +YO7IV,KN24MT,,,,,144: TS850 + Tcvr 2x4CX250b 800W 15el 9BV,05/03 +YO7NE,KN25EC,EME,,,,FT857 144: 100W 2x17el F9FT,01/08 +YO7VS,KN14VH,,,,,50: 2XQB3/300 2xBF981 5el LY J-Pol crossdipole - 144: 2x4CX250b CF300 Swan/Swan,10/98 +YO7VT,KN25EC,EME,,,,,12/08 +YO8BCF,KN36KN,EME,,,,TS2000X 4x 10el 1KW,04/07 +YO8BSE,KN36EW,,,,,,10/95 +YO8CLN,KN27QG,,,,,,08/08 +YO8CYN,KN36LW,,,,,,08/01 +YO8RHI,KN37TE,,,,,,07/05 +YO8RTS,KN27SM,,,,,144:FT847 11 el f9ft 150 W RF Concepts,01/07 +YO8TNA,KN37EW,,,,,,05/08 +YO8TNB,KN37EW,,,,,,06/09 +YO9FRJ,KN34AW,EME,,EX YO4FRJ,,144: 2 x3CPX800 + 4x17B2 + MGF1801 - 432: 50W 18el. Yagi CPol - SAT - 1296: 4 x 67el + FT736,03/08 +YO9HP,KN35BA,EME,,,,,09/07 +YP0A,KN27GD,,,Expedition,,,01/92 +YP2U,KN05OS,,,,,,05/08 +YR0A,KN16TS,EME,,Expedition,,,06/99 +YR5A,KN16TS,EME,,Expedition,,,06/99 +YR99E,KN34,,,Expedition,,,08/99 +YT1VP,JN94XC,,,,,TS440 FT225,08/08 +YT1VV,JN94US,,,ex YU1VG,,,07/00 +YT1W,JN91,,,Expedition,,,01/90 +YT2ACA,KN03WE,,,,,FT-221r,05/08 +YT3I,KN05HP,EME,,EX YU7EW,,144: 500Watt 4x 9el MGF1302,01/09 +YT4D,JN94CP,,,,,144: 250W 11el,08/00 +YT6A,JN92,,,,,,08/06 +YT7AC,JN95,,,,,,03/97 +YT7C,KN05FJ,,,YU7AAA 4O9T,,144: GS35B 4x10+2x10 el BVO 3WL,11/08 +YT7G,JN94XC,,,= YU7GOL,,144: MGF1302 GS35B 4x10el + 2x10el BVO-3wl,07/06 +YT7W,KN05QD,,,,,,08/08 +YT7WA,KN05EJ,,,SpecialCall,,144: 1KW 4x4el Loop 11el WU MGF1302,12/01 +YU0TESLA,KN03QM,EME,,SpecialCall,,144: 16 x 7el Yagi (by Dual) full elevation 25dBi 1.5Kw MGF1302,04/06 +YU150CF,KN03QM,EME,,SpecialCall,,144: 16 x 7el Yagi (by Dual) full elevation 25dBi 1.5Kw MGF1302,04/06 +YU150FU,KN05DK,,,SPECIALCALL,,,07/06 +YU1ADN,KN03KN,,,,,,06/96 +YU1AFS,KN04FT,,,,,,01/92 +YU1AGP,KN03WE,,,,,FT-221R,07/07 +YU1AZK,KN04,,,,,144: 25W 2x11el,10/98 +YU1BT,KN03KN,,,,,,07/06 +YU1BW,KN04GT,,,,,,04/02 +YU1CF,KN03QM,EME,,ex YU1OYA,,IC746PRO 50: 4x 6el Yagi 1KW preamp 144: 1500W 16x 7el Yagi MGF1302,11/06 +YU1EU,KN04DW,,,,,,08/98 +YU1EV,KN04CN,,,,,,04/06 +YU1EXY,KN04FT,,,,,144: FT225rd 350W 16el F9FT MGF1302,01/02 +YU1HFG,KN02XX,,,,,,12/95 +YU1IO,KN04IQ,,,,,144: 600W 4x17el,11/97 +YU1JB,KN04GT,EME,,EX YU1PTB,,144: 4x 10el 500W,12/07 +YU1L,KN02XX,,,,,,12/95 +YU1LA,KN04FR,,,,,144: IC910 17B2 LY,10/05 +YU1MS,KN04ET,,,,,,11/07 +YU1OO,KN02XX,,,,,,01/93 +YU1OS,KN04FS,,,,,144: FT225rd 100W 2x9el MGF1302,11/99 +YU1S,JN94US,,,,,144: 17el 400W,11/97 +YU1WP,JN94OM,,,,,,07/96 +YU1ZF,KN03IR,,,,,,01/91 +YU3LT,KN05HP,EME,,YZ7RLT YT7RLT,,YAESU FT225RD,01/08 +YU4AR,JN94AS,,,= 4O4AR,,144: TR9130 250W 10el PA0MS-ant Preamp,11/02 +YU6AO,JN92,,,,,,08/06 +YU7AA,JN95NS,EME,,ex YU1NOK,,TS850 - 144: 4x 10el 7ZB 500W - 432: 2x 2x 22el,04/06 +YU7AAA,KN05FJ,,,YT7C 4O9T,,144: GS35B 4x10+2x10 el BVO 3WL,11/08 +YU7ACO,KN05QC,,,,,144: FT221r PA 200W 2x 10el. DJ9BV,08/00 +YU7AJH,JN95WF,,,,,,01/90 +YU7AR,KN05BW,,,ex YU7PXB,,IC745- FT225RD- 144: 4x5wl MGF1412 YL1056,12/01 +YU7AS,KN05DJ,,,,,144: 150W 8x 6el Loop,08/05 +YU7AU,KN04HV,,,,,144: 250W 2x11el,12/01 +YU7AZX,KN04AX,,,,,,08/03 +YU7BCL,KN05FW,,,,,,12/97 +YU7BCX,KN05HP,,,,,,08/96 +YU7CV,JN95WK,,,,,,01/95 +YU7EF,KN04HV,EME,,EX YU7PFR,,FT847,01/09 +YU7FF,KN05EP,,,,,,01/94 +YU7FU,KN04,,,EX YU7MJA,,,05/07 +YU7GOL,JN94XC,,,= YT7G,,144: MGF1302 GS35B 4x10el + 2x10el BVO-3wl,03/06 +YU7KB,JN94XX,,,,,144: IC202 2x11el 800W Preamp (MGF1302),02/04 +YU7MS,KN05EF,,,,,144: 400/1KW 2x11el WU MGF1302,11/08 +YU7ON,KN04AX,,,,,144. TR751 4x11el 25W,08/00 +YU7PAA,KN04AX,,,ex YZ7MON,,MGF1302 GS35B 11el Yagi,12/07 +YU7PS,KN05FJ,,,,,144: 400/1KW 2x11el WU MGF1302,11/08 +YU7VA,KN05EJ,,,,,144: 100Watt 11el BFT 66,05/00 +YU7XL,JN95NT,EME,,YU2JL YU2RTU,,FT897 50: 100W 8el yagi 144: 1000Watt 16x8 yagi my design MGF1802,10/08 +YV5KXE,FK60NM,EME,,,,144: 11el Yagi 150W,06/06 +YV5LIX,FK60NM,EME,,,,IC-275H FT-100D TS-600 200W 18db Antenna,04/05 +YV5ZZ,FK60SM,EME,,,,,01/05 +YZ1DO,KN04ER,,,,,,08/99 +YZ1KU,KN04EU,,,,,144: 10W 9el F9FT,05/03 +YZ7UN,KN05EI,,,,,144: 4x6el Loop 100W,01/01 +Z30B,KN01PA,EME,,,,144: 1-5KW 4xYU0B (17-5db) MGF1302,08/00 +Z31DX,KN11GD,,,ex YT5G,,,06/99 +Z35Z,KN11CR,EME,,EXZ32UC YU5UC - QSLS VIA DL8EBW,,144: IC202 500W 4x4el Loop MGF1302 432: 15W 1296: 10W,11/07 +Z37CEF,KN01QA,,,ex YU5CEF,,,11/99 +Z38C,KN01QX,,,EX HA1CA,,FT847,10/07 +Z38R,KN12AG,,,,,FT847,10/07 +ZA0DXC,KN01,,,Expedition,,,01/91 +ZB0W,IM76HE,,,Expedition,,,01/93 +ZD8B,II22TB,EME,,= W1MRQ,,144: 4x 5el 180W,11/08 +ZK1EME,BG08CT,EME,,EXPEDITION,,144: 2x 3.2wl X-Pol yagis 8877 1.5KW,01/08 +ZL1BT,RF73LC,EME,,,,144: 12el 400W,03/06 +ZL1IU,RF64VR,EME,,,,144: 4x12el 1.2KW,10/05 +ZL1PE,RF74DG,,,,,,01/03 +ZL1RS,RF64VS,EME,,,,,09/08 +ZL1WN,RF73HG,EME,,,,144: 4x 18el 400W,06/06 +ZL2DX,RE78RR,EME,,ZL4OY ZL4OY/A ZL4OY/C ZL7OY ZM8OY ZL8OY,,144: 4x 10el 500W full elevation - 432: 18el 100W,04/07 +ZL3AAD,RE66GR,EME,,,,,01/03 +ZL3AAU,RE66EL,EME,,,,,06/07 +ZL3CU,RE66GL,EME,,,,144: 250W 2 by 12 element,03/07 +ZL3NW,RE66HO,EME,,,,,03/05 +ZL3TY,RE57OM,EME,,,,,05/05 +ZP4KFX,GG15LV,,,,,,03/01 +ZR1ADI,JF95KU,,,,,,01/02 +ZR1AEE,JF96IA,,,,,,01/02 +ZR1EV,JF96IC,,,,,50: FT690r 200W 4el,11/96 +ZR1L,JF96HD,,,,,,10/02 +ZR1TRD,JF96HC,,,,,,01/02 +ZR1WZ,KF05QP,,,,,,01/04 +ZR2DX,KF26,,,,,,02/02 +ZR5ADQ,KG50IA,,,,,,01/02 +ZR6ABU,KG33XV,,,,,,01/03 +ZR6CRW,KG33,,,ex ZR6ABU,,,10/02 +ZR6DXB,KG33XX,,,,,,10/02 +ZR6GE,KG43AR,,,,,,10/02 +ZR6KHJ,KG43CU,,,,,,02/02 +ZS1EK,JF95FU,,,,,,01/02 +ZS1LS,JF96FD,EME,,,,IC-910H,05/09 +ZS2ACP,KF26SA,EME,,,,144: 2x 8el 150W,12/07 +ZS2BWB,KF26TD,,,,,,02/02 +ZS2GK,KF47KT,EME,,S83X,,Icom IC-746Pro Yaesu FT-847,03/09 +ZS4JJ,KG30FV,EME,,,,Kenwood TR900 144: 16el 60W,10/08 +ZS4KB,KG32,,,,,,10/02 +ZS4NS,KG32IA,,,,,50: IC551D 6el 80W - QSL via N7RO,02/01 +ZS4TX,KG30BW,,,,,,01/02 +ZS5AV,KF69GX,,,,,,01/03 +ZS5DJ,KG59AA,,,,,,01/02 +ZS5LEE,KG50JF,EME,,,,IC821 706MKIIG 144: 4x 2m18XXX QRO 432: 2x 27el 100W,04/05 +ZS5Y,KF59JR,EME,,,,1296: 3.7m dish 50W,08/05 +ZS6AVP,KG44OD,,,,,,05/02 +ZS6AXT,KG33VV,EME,,,,,03/05 +ZS6BTE,KG33XV,EME,,,,144: 2x 4wl Yagis 100W,08/05 +ZS6BUN,KG43CU,EME,,,,144: 12el 300W,06/06 +ZS6DTS,KG43AR,,,,,,10/02 +ZS6EGB,KG43BQ,,,,,,10/02 +ZS6GER,KG33,,,,,,02/02 +ZS6GPM,KG33XU,,,,,,10/02 +ZS6HS,KG33XR,,,,,,01/02 +ZS6JDE,KG44DG,EME,,,,144: 2x 9el 400W,08/06 +ZS6JON,KG33VV,,,,,,10/02 +ZS6JR,KG44,EME,,,,,07/05 +ZS6MRK,KG34XH,EME,,,,144: 400W 2M7,03/06 +ZS6NK,KG46RC,EME,,ex ZS6PJS,,144: 2x 13wl 120W,09/05 +ZS6OB,KG44DE,EME,,,,144: 4x 16el 300W,01/07 +ZS6RAD,KG44CA,,,,,,10/02 +ZS6UT,KG44EF,,,,,,01/02 +ZS6WAB,KG46RC,EME,,,,144: 8x 17el 350W,09/06 +ZS6WB,KG44DH,EME,,,,144: 2x9 el 350W,11/06 +ZS6WI,KG46RC,,,,,,01/03 +ZS6Y,KG33WU,,,,,,02/02 +ZZZZZZ,End-Of-Call3-Database 2009-07-01 01:15:53 UTC VHF-DATABASE Export � 2009 by DG2KBC & DL8EBW + + + + + + + + + diff --git a/map65/resources/README.qthid.txt b/map65/resources/README.qthid.txt new file mode 100644 index 000000000..4210d0625 --- /dev/null +++ b/map65/resources/README.qthid.txt @@ -0,0 +1,22 @@ +QTHID INFORMATION + +Qthid is simple cross platform controller application for the Funcube Dongle +Pro and Pro+ software defined radio receivers. + +Author........: OZ9AEC +License.......: GNU General Public License +Site..........: http://www.oz9aec.net/index.php/funcube-dongle/qthid-fcd-controller +Source........: http://sourceforge.net/projects/qthid/files +Yahoo Group ..: https://uk.groups.yahoo.com/neo/groups/FCDevelopment/info + +The qthid folder contains two binaries: + +* qthid-4.0.exe +* qthid-4.1.exe + +QTHID 4.0 is the current stable providing full support for the Funcube Dongle +API available with firmware 18f or later. + +QTHID 4.1 is an updated version that supports the new Funcube Dongle Pro+ +devices. This does not work with the original Funcube Dongle Pro! + diff --git a/map65/resources/fftwf-wisdom.exe b/map65/resources/fftwf-wisdom.exe new file mode 100644 index 000000000..219f6ff45 Binary files /dev/null and b/map65/resources/fftwf-wisdom.exe differ diff --git a/map65/resources/qt.conf b/map65/resources/qt.conf new file mode 100644 index 000000000..e69f24eba --- /dev/null +++ b/map65/resources/qt.conf @@ -0,0 +1,2 @@ +[Paths] +Plugins = . diff --git a/map65/resources/qthid.exe b/map65/resources/qthid.exe new file mode 100644 index 000000000..f2fe240d6 Binary files /dev/null and b/map65/resources/qthid.exe differ diff --git a/map65/resources/qthid/AUTHORS.qthid.4.1.txt b/map65/resources/qthid/AUTHORS.qthid.4.1.txt new file mode 100644 index 000000000..e3f10328c --- /dev/null +++ b/map65/resources/qthid/AUTHORS.qthid.4.1.txt @@ -0,0 +1,16 @@ +Original work by Howard Long, G6LVB. +Current maintainer: Alexandru Csete, OZ9AEC. + +Contributors: +- Mike Willis G0MJW and David Barber +- Mario Lorenz DL5MLO +- Andrew Elwell +- Mike K0ZAP (OSX Lion fix) + +The frequency controller was taken from Cutesdr by Moe Wheatley. + +Application icon by ~DarKobra at Deviantart. +Source: http://commons.wikimedia.org/wiki/File:Radio.svg + +Other icons were taken from the GNOME desktop theme and the Tango theme. + diff --git a/map65/resources/qthid/AUTHORS.qthid4.0.txt b/map65/resources/qthid/AUTHORS.qthid4.0.txt new file mode 100644 index 000000000..e3f10328c --- /dev/null +++ b/map65/resources/qthid/AUTHORS.qthid4.0.txt @@ -0,0 +1,16 @@ +Original work by Howard Long, G6LVB. +Current maintainer: Alexandru Csete, OZ9AEC. + +Contributors: +- Mike Willis G0MJW and David Barber +- Mario Lorenz DL5MLO +- Andrew Elwell +- Mike K0ZAP (OSX Lion fix) + +The frequency controller was taken from Cutesdr by Moe Wheatley. + +Application icon by ~DarKobra at Deviantart. +Source: http://commons.wikimedia.org/wiki/File:Radio.svg + +Other icons were taken from the GNOME desktop theme and the Tango theme. + diff --git a/map65/resources/qthid/LICENSE.txt b/map65/resources/qthid/LICENSE.txt new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/map65/resources/qthid/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/map65/resources/qthid/NEWS.qhid-4.0.txt b/map65/resources/qthid/NEWS.qhid-4.0.txt new file mode 100644 index 000000000..a4637e8e3 --- /dev/null +++ b/map65/resources/qthid/NEWS.qhid-4.0.txt @@ -0,0 +1,64 @@ +Changes in version 4.0: + +- New layout with IF, IQ and firmware controls hidden by default. +- New frequency controller widget. +- Support for up- and downconverters + + +Changes in version 3.2: + +- Switch to using hidraw driver on Linux 2.6.38 or later (fixes crashes + experienced on recent Linux with libusb-1.0.9). +- Update HID API. +- Reduce widow width. + + +Changes in version 3.1: + +- Support for Mac OS X 10.7 Lion +- Support for Bias-T with firmware 18h and later. +- Allow user to force band selection to be different from the one chosen + by the FCD (temporary workaround for a FW 18f bug occurring at 861 MHz). +- Change default value of IQ gain correction from 0.0 to 1.0. +- Use correct FCD command for setting IQ phase correction (GH-5). +- Various fixes for windows build using latest SDK (7.0). +- Removed RSSI indicator since it is unlikely that it will ever work. + + +Changes in version 3.0: + +- Implement full API in firmware 18f (thanks Mario Lorenz, DL5MLO). +- Requires firmware 18f or later (earlier firmwares are not detected). +- Added auto-repeat to tuning buttons (click and hold the button to scan). +- Added new RF chain diagram. +- Show firmware version in status message. + + +Changes in version 2.3: + +- No code changes, just a Mac OS X build. + + +Changes in version 2.2: + +- Use native toolbar and status bar on Mac OS X +- New application icon based on SVG drawing +- Correctly set application and bundle icon on Mac OS X and Windows +- Minor UI tweaks. +- Fix qthid.pro to allow correct build on Ubuntu 9.04 (thanks EA4FVS). +- Correct application name in file headers (thanks Andrew Elwell) + + +Changes in version 2.1: + +- Various fixes and workarounds to prevent crash and freeze when switching + between application and bootloader mode. The application can now run with or + without FCD (hotplug). Upgrade and verify firmware have been tested on Linux + (32 and 64 bit) and OSX 10.6. +- Updated HID API to hidapi/master from 2011-02-17 +- Retrieve libusb configuration on Linux using pkg-config +- Remove local Qt Creator configuration from distribution +- Improvements to the UI layout and widgets +- Added application icon +- Applied GPL V3 license + diff --git a/map65/resources/qthid/NEWS.qthid-4.1.txt b/map65/resources/qthid/NEWS.qthid-4.1.txt new file mode 100644 index 000000000..426dff77b --- /dev/null +++ b/map65/resources/qthid/NEWS.qthid-4.1.txt @@ -0,0 +1,64 @@ +Changes in version 4.1: + +- Special release with Funcube Dongle Pro+ support. + + +Changes in version 4.0: + +- New layout with IF, IQ and firmware controls hidden by default. +- New frequency controller widget. +- Support for up- and downconverters. + + +Changes in version 3.2: + +- Switch to using hidraw driver on Linux 2.6.38 or later (fixes crashes + experienced on recent Linux with libusb-1.0.9). +- Update HID API. +- Reduce widow width. + + +Changes in version 3.1: + +- Support for Mac OS X 10.7 Lion. +- Support for Bias-T with firmware 18h and later. +- Allow user to force band selection to be different from the one chosen by + the FCD (temporary workaround for a FW 18f bug occurring at 861 MHz). +- Change default value of IQ gain correction from 0.0 to 1.0. +- Use correct FCD command for setting IQ phase correction (GH-5). +- Various fixes for windows build using latest SDK (7.0). +- Removed RSSI indicator since it is unlikely that it will ever work. + + +Changes in version 3.0: + +- Implement full API in firmware 18f (thanks Mario Lorenz, DL5MLO). +- Requires firmware 18f or later (earlier firmwares are not detected). +- Added auto-repeat to tuning buttons (click and hold the button to scan). +- Added new RF chain diagram. +- Show firmware version in status message. + + +Changes in version 2.2: + +- Use native toolbar and status bar on Mac OS X +- New application icon based on SVG drawing +- Correctly set application and bundle icon on Mac OS X and Windows +- Minor UI tweaks. +- Fix qthid.pro to allow correct build on Ubuntu 9.04 (thanks EA4FVS). +- Correct application name in file headers (thanks Andrew Elwell) + + +Changes in version 2.1: + +- Various fixes and workarounds to prevent crash and freeze when switching + between application and bootloader mode. The application can now run with or + without FCD (hotplug). Upgrade and verify firmware have been tested on Linux + (32 and 64 bit) and OSX 10.6. +- Updated HID API to hidapi/master from 2011-02-17 +- Retrieve libusb configuration on Linux using pkg-config +- Remove local Qt Creator configuration from distribution +- Improvements to the UI layout and widgets +- Added application icon +- Applied GPL V3 license + diff --git a/map65/resources/qthid/QtCore4.dll b/map65/resources/qthid/QtCore4.dll new file mode 100644 index 000000000..125f93658 Binary files /dev/null and b/map65/resources/qthid/QtCore4.dll differ diff --git a/map65/resources/qthid/QtGui4.dll b/map65/resources/qthid/QtGui4.dll new file mode 100644 index 000000000..26bf5ddee Binary files /dev/null and b/map65/resources/qthid/QtGui4.dll differ diff --git a/map65/resources/qthid/README-qthid-4.1.txt b/map65/resources/qthid/README-qthid-4.1.txt new file mode 100644 index 000000000..a4eb91747 --- /dev/null +++ b/map65/resources/qthid/README-qthid-4.1.txt @@ -0,0 +1,72 @@ +1. INTRODUCTION + +Qthid is a small control application for the Funcube Dongle devices. It is an evolution of the qthid002 package by Howard Long G6LVB. + +This version 4.1 is a special version that adds support for the Funcube Dongle Pro+ (see http://www.funcubedongle.com/?page_id=1073). The original Funcube Dongle Pro is not supported by this version. + +Qthid uses the HIDAPI cross platform library by Signal 11 Software (http://www.signal11.us/oss/hidapi/). All the required files are bundled with qthid and no installation of the library is required. + + +2. INSTALLATION AND USAGE + +2.1 Linux + +Precompiled binaries (32 or 64 bit) are avaialble for download but users are required to install the Qt runtime libraries on their own. All common Linux distrib utions have the Qt libraries packaged and they can be installed using the package manager for the platform. Qt 4.7 and 4.8 has been tested. + +In order to use the Funcube Dongle Pro+ as regular user and udev rule is required. An example funcube-dongle.rules file is included with the package and you can simply copy that file to the /etc/udev/rules.d/ directory (hint: open a terminal and type: "sudo cp funcube-dongle.rules /etc/udev/rules.d/" without the quotes) + +Qthid should now detect your Funcube Dongle Pro+ when you plug it in. No reboot or udev restart is necessary. + + +2.2 Mac OS X (10.6+) + +The Mac OS X bundle contains all the necessary Qt libraries and no additional installation or configuration is required. Unlike Linux, the Funcube Dongle will just work. + + +2.3 Windows + +The windows package is self containing and does not require and Qt libs to be installed separately. This release has been tested on Windows 7. + + +2.4 Building from source + +- Install Qt Creator 2.0.1 or newer and Qt SDK 4.7. On recent linux it is normally sufficient to select Qt Creator and the required Qt libraries will be installed as dependencies. On Mac and Windows you need to download the full Qt SDK. On Windows you also need the MS Windows SDK. +- On linux you also need to install the libudev-dev package using the package manager (the name may be different depending on distribution but it should have libudev and dev int he name). +- Open the qthid.pro file in Qt Creator. It will say something about setting up a target; say OK or Finish or Done (depends on version and OS). +- You can now build and execute the project. + +It is also possible to build in a terminal: + +$ tar xvfz qthid-X.Y.tar.gz +$ cd qthid-X.Y +$ mkdir build +$ cd build +$ qmake ../qthid.pro +$ make + +You should now have a qthid binary. + + +3. License + +Qthid is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see . + + +The frequency controller widget was taken from Cutesdr by Moe Wheatley, released under the following "Simplified BSD License": + +Copyright 2010 Moe Wheatley. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY Moe Wheatley "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Moe Wheatley OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Moe Wheatley. + diff --git a/map65/resources/qthid/README.qthid-4.0.txt b/map65/resources/qthid/README.qthid-4.0.txt new file mode 100644 index 000000000..a5f3761ec --- /dev/null +++ b/map65/resources/qthid/README.qthid-4.0.txt @@ -0,0 +1,85 @@ +1. INTRODUCTION + +Qthid is a Funcube Dongle control application with Qt user interface. It is an evolution of the qthid002 package by Howard Long G6LVB. + +The Funcube Dongle (http://www.funcubedongle.com/) is a small software defined radio receiver for 64 MHz - 1.7 GHz. It fits into a computer's USB port and uses USB audio to transfer complex I/Q data to SDR applications. The control API for setting frequency, gain, filter, etc. uses the USB HID standard, thus the Funcube Dongle does not require any specific hardware drivers as long as the host operating system supports USB audio and HID. + +Qthid uses the HIDAPI cross platform library by Signal 11 Software (http://www.signal11.us/oss/hidapi/). All the required files are bundled with qthid and no installation of the library is required. + +The current version 4.0 implements the full API available with the 18f firmware. It should cover all the functionality provided by the "fully functional windows frontend". Note that the majority of this full API is only available since firmware 18f and qthid 4 will not work with earlier firmware. The application will simply fail to detect the FCD with earlier firmwares. + +You can use qthid 2.x to upgrade your firmware to 18f or later. + + +2. INSTALLATION AND USAGE + +2.1 Linux + +If you are using Debian testing or Ubuntu, you can install the qthid-fcd-controller package. This should set everything up and you can skip the rest of this section. + +Otherwise you can use the precompiled binaries (32 or 64 bit) but you need the Qt runtime libraries installed. On Ubuntu these are called libqtcore4 and libqtgui4 and their dependencies. You can simply install everything Qt version 4 (not version 3!). Qt 4.8 has been tested, Qt 4.7 will probably also work. + +In order to use the Funcube Dongle as regular user, you need to create an udev rule. An example funcube-dongle.rules file is included with the package and you can simply copy that into the /lib/udev/rules.d/ directory. + +(hint: open a terminal and type: sudo cp funcube-dongle.rules /lib/udev/rules.d/funcube-dongle.rules) + +Qthid should now detect your FCD when you plug it in. No need to restart udev. + + +2.2 Mac OS X (10.6+) + +The Mac OS X bundle contains all the necessary Qt libraries and no additional installation or configuration is required. Unlike Linux, the Funcube Dongle will just work. + + +2.3 Windows + +The windows package is self containing and does not require and Qt libs to be installed separately. It is known to work on Windows XP and Windows 7. + + +2.4 Building from source + +- Install Qt Creator 2.0.1 or newer and Qt SDK 4.7. On recent linux it is normally sufficient to select Qt Creator and the required Qt libraries will be installed as dependencies. On Mac and Windows you need to download the full Qt SDK. On Windows you also need the MS Windows SDK. +- On linux you also need to install the libudev-dev package using the package manager (the name may be different depending on distribution but it should have libudev and dev int he name). +- Open the qthid.pro file in Qt Creator. It will say something about setting up a target; say OK or Finish or Done (depends on version and OS). +- You can now build and execute the project. + +If you want to try the latest experimental code you can check it out from Github: https://github.com/csete/qthid + + +3. License + +Qthid is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see . + + +The frequency controller widget was taken from Cutesdr by Moe Wheatley, released under the following "Simplified BSD License": + +Copyright 2010 Moe Wheatley. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY Moe Wheatley ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Moe Wheatley OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the +authors and should not be interpreted as representing official policies, either expressed +or implied, of Moe Wheatley. + diff --git a/map65/resources/qthid/libgcc_s_dw2-1.dll b/map65/resources/qthid/libgcc_s_dw2-1.dll new file mode 100644 index 000000000..9e32dc20e Binary files /dev/null and b/map65/resources/qthid/libgcc_s_dw2-1.dll differ diff --git a/map65/resources/qthid/mingwm10.dll b/map65/resources/qthid/mingwm10.dll new file mode 100644 index 000000000..572f88860 Binary files /dev/null and b/map65/resources/qthid/mingwm10.dll differ diff --git a/map65/resources/qthid/qthid-4.0.exe.exe b/map65/resources/qthid/qthid-4.0.exe.exe new file mode 100644 index 000000000..8ac17f34c Binary files /dev/null and b/map65/resources/qthid/qthid-4.0.exe.exe differ diff --git a/map65/resources/qthid/qthid-4.1.exe.exe b/map65/resources/qthid/qthid-4.1.exe.exe new file mode 100644 index 000000000..33f2fb195 Binary files /dev/null and b/map65/resources/qthid/qthid-4.1.exe.exe differ diff --git a/map65/resources/rigctl-wsjtx.exe b/map65/resources/rigctl-wsjtx.exe new file mode 100644 index 000000000..938848eb1 Binary files /dev/null and b/map65/resources/rigctl-wsjtx.exe differ diff --git a/map65/resources/wisdom1.bat b/map65/resources/wisdom1.bat new file mode 100644 index 000000000..2d5e3519f --- /dev/null +++ b/map65/resources/wisdom1.bat @@ -0,0 +1,7 @@ +fftwf-wisdom -o fftwf_wisdom.dat -t 1 -m cif256 rif512 rib512 cif1024 cib1024 cib32768 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 -m cif77175 cib77175 cib5376000 cif74088 cib74088 cib5120000 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 -m cif37632 cib37632 cib2621440 cif37044 cib37044 cib2560000 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 -m cif24192 cif3456 cif336000 diff --git a/map65/resources/wisdom2.bat b/map65/resources/wisdom2.bat new file mode 100644 index 000000000..6ced98548 --- /dev/null +++ b/map65/resources/wisdom2.bat @@ -0,0 +1,7 @@ +fftwf-wisdom -o fftwf_wisdom.dat -t 1 cif256 rif512 rib512 cif1024 cib1024 cib32768 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 cif77175 cib77175 cib5376000 cif74088 cib74088 cib5120000 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 cif37632 cib37632 cib2621440 cif37044 cib37044 cib2560000 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 cif24192 cif3456 cif336000 diff --git a/map65/set570.cpp b/map65/set570.cpp new file mode 100644 index 000000000..a56832292 --- /dev/null +++ b/map65/set570.cpp @@ -0,0 +1,272 @@ + +/* Linux / Windows program to control the frequency of a si570 synthesizer + ON5GN 6 jan 2012 + Under Linux: + -use the linux version of function void si570_sleep(int us) + -compile with + gcc -Wall -o set_si570_freq set_si570_freq.c -lusb -lm + -run with sudo ./set_si570_freq + Under Windows: + -use the windows version of function void si570_sleep(int us) + -compile with mingw + C:\mingw\bin\mingw32-gcc -Wall -o set_si570_freq set_si570_freq.c -lusb -lm + -run with set_si570_freq.exe +*/ + +#include /* Standard input/output definitions */ +#include /* String function definitions */ +#include /* UNIX standard function definitions */ +#include + +#ifdef WIN32 +#include +#endif + +#include +#include + +#define USB_SUCCESS 0 +#define USB_ERROR_NOTFOUND 1 +#define USB_ERROR_ACCESS 2 +#define USB_ERROR_IO 3 +#define VENDOR_NAME "www.obdev.at" +#define PRODUCT_NAME "DG8SAQ-I2C" +#define USBDEV_SHARED_VENDOR 0x16C0 // VOTI VID +#define USBDEV_SHARED_PRODUCT 0x05DC // OBDEV PID + // Use obdev's generic shared VID/PID pair + // following the rules outlined in + // firmware/usbdrv/USBID-License.txt. +#define REQUEST_SET_FREQ_BY_VALUE 0x32 +#define MAX_USB_ERR_CNT 6 + +double freq_parm; +double delay_average; +int from_freq; +int to_freq; +int increment_freq; +int display_freq = -1; +int delay; +static libusb_device_handle * global_si570usb_handle; + +void si570_sleep(int us) +{ +#if defined (Q_OS_WIN) + ::Sleep (us / 1000); +#else + ::usleep (us); +#endif +} + +double round(double x) +{ + int i=x+0.5; + return (double)i; +} + +double current_time(void) //for delay measurements +{ + struct timeval t; + gettimeofday(&t,NULL); + return 0.000001*t.tv_usec+t.tv_sec; +} + +unsigned char Si570usbOpenDevice(libusb_device_handle **device, char *usbSerialID); +void setLongWord( int value, char * bytes); +int setFreqByValue(libusb_device_handle * handle, double frequency); +void sweepa_freq(void); +void sweepm_freq(void); + +int set570(double freq_MHz) +{ +//### +// qDebug() << "A" << freq_MHz; +// if(freq_MHz != 999.0) return 0; +//### + + char * my_usbSerialID = nullptr; + +// MAIN MENU DIALOG + if (Si570usbOpenDevice(&global_si570usb_handle, my_usbSerialID) != USB_SUCCESS) + { + return -1; + } + +//SET FREQUENCY + if((freq_MHz < 3.45)|(freq_MHz > 866.0)) return -2; + setFreqByValue(global_si570usb_handle,freq_MHz); + return 0; +} + +unsigned char Si570usbOpenDevice (libusb_device_handle * * udh, char * usbSerialID) +{ + if (*udh) return USB_SUCCESS; // only scan USB devices 1st time + + int vendor = USBDEV_SHARED_VENDOR; + char *vendorName = (char *)VENDOR_NAME; + int product = USBDEV_SHARED_PRODUCT; + char *productName = (char *)PRODUCT_NAME; + + libusb_device_handle * handle = nullptr; + unsigned char errorCode = USB_ERROR_NOTFOUND; + char buffer[256]; + int rc; + if ((rc = libusb_init (nullptr)) < 0) // init default context (safe to repeat) + { + printf ("usb initialization error message %s\n", libusb_error_name (rc)); + return errorCode = USB_ERROR_ACCESS; + } + + libusb_device * * device_list; + int device_count = libusb_get_device_list (nullptr, &device_list); + if (device_count < 0) + { + puts ("no usb devices"); + errorCode = USB_ERROR_NOTFOUND; + } + else + { + for (int i = 0; i < device_count; ++i) + { + libusb_device * device = device_list[i]; + libusb_device_descriptor descriptor; + if ((rc = libusb_get_device_descriptor (device, &descriptor)) < 0) + { + printf ("usb get device descriptor error message %s\n", libusb_error_name (rc)); + errorCode = USB_ERROR_ACCESS; + continue; + } + if (vendor == descriptor.idVendor && product == descriptor.idProduct) + { + // now we must open the device to query strings + if ((rc = libusb_open (device, &handle)) < 0) + { + printf ("usb open device error message %s\n", libusb_error_name (rc)); + errorCode = USB_ERROR_ACCESS; + continue; + } + if (!vendorName && !productName) + { + break; // good to go + } + if (libusb_get_string_descriptor_ascii (handle, descriptor.iManufacturer + , reinterpret_cast (buffer), sizeof buffer) < 0) + { + printf ("usb get vendor name error message %s\n", libusb_error_name (rc)); + errorCode = USB_ERROR_IO; + } + else + { + if (!vendorName || !strcmp (buffer, vendorName)) + { + if (libusb_get_string_descriptor_ascii (handle, descriptor.iProduct + , reinterpret_cast (buffer), sizeof buffer) < 0) + { + printf ("usb get product name error message %s\n", libusb_error_name (rc)); + errorCode = USB_ERROR_IO; + } + else + { + if (!productName || !strcmp (buffer, productName)) + { + if (libusb_get_string_descriptor_ascii (handle, descriptor.iSerialNumber + , reinterpret_cast (buffer), sizeof buffer) < 0) + { + printf ("usb get serial number error message %s\n", libusb_error_name (rc)); + errorCode = USB_ERROR_IO; + } + else + { + if (!usbSerialID || !strcmp (buffer, usbSerialID)) + { + break; // good to go + } + } + } + } + } + } + libusb_close (handle); + handle = nullptr; + } + } + libusb_free_device_list (device_list, 1); + } + if (handle) + { + errorCode = USB_SUCCESS; + *udh = handle; + } + return errorCode; +} + +void setLongWord( int value, char * bytes) +{ + bytes[0] = value & 0xff; + bytes[1] = ((value & 0xff00) >> 8) & 0xff; + bytes[2] = ((value & 0xff0000) >> 16) & 0xff; + bytes[3] = ((value & 0xff000000) >> 24) & 0xff; +} + +int setFreqByValue(libusb_device_handle * handle, double frequency) +{ +// Windows Doc from PE0FKO: +// +// Command 0x32: +// ------------- +// Set the oscillator frequency by value. The frequency is formatted in MHz +// as 11.21 bits value. +// The "automatic band pass filter selection", "smooth tune", +// "one side calibration" and the "frequency subtract multiply" are all +// done in this function. (if enabled in the firmware) +// +// Default: None +// +// Parameters: +// requesttype: LIBUSB_ENDPOINT_OUT +// request: 0x32 +// value: 0 +// index: 0 +// bytes: pointer 32 bits integer +// size: 4 +// +// Code sample: +// uint32_t iFreq; +// double dFreq; +// +// dFreq = 30.123456; // MHz +// iFreq = (uint32_t)( dFreq * (1UL << 21) ) +// r = usbCtrlMsgOUT(0x32, 0, 0, (char *)&iFreq, sizeof(iFreq)); +// if (r < 0) Error +// + + char buffer[4]; + int i2cAddress = 0x55; + int request = REQUEST_SET_FREQ_BY_VALUE; + int value = 0x700 + i2cAddress; + int my_index = 0; + int retval; + int err_cnt; + + err_cnt =0; + set_again:; + setLongWord(round(frequency * 2097152.0), buffer); // 2097152=2^21 + retval = libusb_control_transfer ( + handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT, + request, + value, + my_index, + reinterpret_cast (buffer), + sizeof(buffer), + 5000); + if (retval != 4) { + err_cnt ++; + if(err_cnt < MAX_USB_ERR_CNT) { + si570_sleep(1000); // delay 1000 microsec + goto set_again; + } else { + printf("Error when setting frequency, returncode=%i\n",retval); + printf("usb error message: %s\n", libusb_error_name (retval)); + } + } + return retval; +} diff --git a/map65/signalmeter.cpp b/map65/signalmeter.cpp new file mode 100755 index 000000000..c6c27618b --- /dev/null +++ b/map65/signalmeter.cpp @@ -0,0 +1,53 @@ +// Simple bargraph dB meter +// Implemented by Edson Pereira PY2SDR +// +// Limits and geometry are hardcded for now. + +#include "signalmeter.h" + +SignalMeter::SignalMeter(QWidget *parent) : + QWidget(parent) +{ + resize(parent->size()); + + m_meter = new MeterWidget(this); + m_meter->setGeometry(10, 10, 10, 120); + + m_label = new QLabel(this); + m_label->setGeometry(10, 135, 20, 20); + + QLabel *dbLabel = new QLabel(this); + dbLabel->setText("dB"); + dbLabel->setGeometry(30, 135, 20, 20); +} + +SignalMeter::~SignalMeter() +{ + +} + +void SignalMeter::paintEvent( QPaintEvent * ) +{ + QPainter p {this}; + + p.drawLine(22, 10, 22, 130); + + for ( int i = 0; i <= 60; i += 10 ) { + p.drawLine(22, i*2 + 10, 25, i*2 + 10); + } + + for ( int i = 10; i < 60; i += 10 ) { + p.drawText(30, i*2 + 15, QString::number(60 - i)); + } +} + +void SignalMeter::setValue(int value) +{ + m_meter->setValue(value); + m_label->setText(QString::number(value)); +} + +void SignalMeter::resizeEvent(QResizeEvent *s) +{ + resize(s->size()); +} diff --git a/map65/signalmeter.h b/map65/signalmeter.h new file mode 100755 index 000000000..ea1aa6295 --- /dev/null +++ b/map65/signalmeter.h @@ -0,0 +1,32 @@ +#ifndef SIGNALMETER_H +#define SIGNALMETER_H + +#include +#include +#include + +class SignalMeter : public QWidget +{ + Q_OBJECT + +public: + explicit SignalMeter(QWidget *parent = 0); + ~SignalMeter(); + +public slots: + void setValue(int value); + +private: + MeterWidget *m_meter; + + QLabel *m_label; + + int m_signal; + int m_sigPeak; + +protected: + void paintEvent( QPaintEvent * ); + void resizeEvent(QResizeEvent *s); +}; + +#endif // SIGNALMETER_H diff --git a/map65/sleep.h b/map65/sleep.h new file mode 100644 index 000000000..c11188c2a --- /dev/null +++ b/map65/sleep.h @@ -0,0 +1,16 @@ +#ifndef SLEEP_H +#define SLEEP_H +#include + +class Sleep : public QThread +{ +public: + static void msleep(int ms) { + QThread::msleep(ms); + } + static int idealThreadCount() { + return QThread::idealThreadCount(); + } +}; + +#endif // SLEEP_H diff --git a/map65/soundin.cpp b/map65/soundin.cpp new file mode 100644 index 000000000..bca728a4d --- /dev/null +++ b/map65/soundin.cpp @@ -0,0 +1,410 @@ +#include "soundin.h" +#include + +#define NFFT 32768 +#define FRAMES_PER_BUFFER 1024 + +extern "C" { +#include +extern struct { + double d8[2*60*96000]; //This is "common/datcom/..." in fortran + float ss[4*322*NFFT]; + float savg[4*NFFT]; + double fcenter; + int nutc; + int idphi; //Phase correction for Y pol'n, degrees + int mousedf; //User-selected DF + int mousefqso; //User-selected QSO freq (kHz) + int nagain; //1 ==> decode only at fQSO +/- Tol + int ndepth; //How much hinted decoding to do? + int ndiskdat; //1 ==> data read from *.tf2 or *.iq file + int neme; //Hinted decoding tries only for EME calls + int newdat; //1 ==> new data, must do long FFT + int nfa; //Low decode limit (kHz) + int nfb; //High decode limit (kHz) + int nfcal; //Frequency correction, for calibration (Hz) + int nfshift; //Shift of displayed center freq (kHz) + int mcall3; //1 ==> CALL3.TXT has been modified + int ntimeout; //Max for timeouts in Messages and BandMap + int ntol; //+/- decoding range around fQSO (Hz) + int nxant; //1 ==> add 45 deg to measured pol angle + int map65RxLog; //Flags to control log files + int nfsample; //Input sample rate + int nxpol; //1 if using xpol antennas, 0 otherwise + int mode65; //JT65 sub-mode: A=1, B=2, C=4 + int nfast; //1No longer used + int nsave; //Number of s3(64,63) spectra saved + char mycall[12]; + char mygrid[6]; + char hiscall[12]; + char hisgrid[6]; + char datetime[20]; +} datcom_; +} + +typedef struct +{ + int kin; //Parameters sent to/from the portaudio callback function + int nrx; + bool bzero; + bool iqswap; + bool b10db; +} paUserData; + +//--------------------------------------------------------------- a2dCallback +extern "C" int a2dCallback( const void *inputBuffer, void *outputBuffer, + unsigned long framesToProcess, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ) + +// This routine called by the PortAudio engine when samples are available. +// It may be called at interrupt level, so don't do anything +// that could mess up the system like calling malloc() or free(). + +{ + paUserData *udata=(paUserData*)userData; + (void) outputBuffer; //Prevent unused variable warnings. + (void) timeInfo; + (void) userData; + int nbytes,i,j; + float d4[4*FRAMES_PER_BUFFER]; + float d4a[4*FRAMES_PER_BUFFER]; + float tmp; + float fac; + + if( (statusFlags&paInputOverflow) != 0) { + qDebug() << "Input Overflow"; + } + if(udata->bzero) { //Start of a new minute + udata->kin=0; //Reset buffer pointer + udata->bzero=false; + } + + nbytes=udata->nrx*8*framesToProcess; //Bytes per frame + memcpy(d4,inputBuffer,nbytes); //Copy all samples to d4 + + fac=32767.0; + if(udata->b10db) fac=103618.35; + + if(udata->nrx==2) { + for(i=0; i<4*int(framesToProcess); i++) { //Negate odd-numbered frames + d4[i]=fac*d4[i]; + j=i/4; + if((j%2)==1) d4[i]=-d4[i]; + } + if(!udata->iqswap) { + for(i=0; ikin],d4,nbytes); //Copy from d4 to dd() + } else { + int k=0; + for(i=0; i<2*int(framesToProcess); i+=2) { //Negate odd-numbered frames + j=i/2; + if(j%2==0) { + d4a[k++]=fac*d4[i]; + d4a[k++]=fac*d4[i+1]; + } else { + d4a[k++]=-fac*d4[i]; + d4a[k++]=-fac*d4[i+1]; + } + d4a[k++]=0.0; + d4a[k++]=0.0; + } + if(!udata->iqswap) { + for(i=0; ikin],d4a,2*nbytes); //Copy from d4a to dd() + } + udata->kin += framesToProcess; + return paContinue; +} + +void SoundInThread::run() //SoundInThread::run() +{ + quitExecution = false; + + if (m_net) { +// qDebug() << "Start inputUDP()"; + inputUDP(); +// qDebug() << "Finished inputUDP()"; + return; + } + +//---------------------------------------------------- Soundcard Setup +// qDebug() << "Start souncard input"; + + PaError paerr; + PaStreamParameters inParam; + PaStream *inStream; + paUserData udata; + + udata.kin=0; //Buffer pointer + udata.bzero=false; //Flag to request reset of kin + udata.nrx=m_nrx; //Number of polarizations + udata.iqswap=m_IQswap; + udata.b10db=m_10db; + + inParam.device=m_nDevIn; //### Input Device Number ### + inParam.channelCount=2*m_nrx; //Number of analog channels + inParam.sampleFormat=paFloat32; //Get floats from Portaudio + inParam.suggestedLatency=0.05; + inParam.hostApiSpecificStreamInfo=NULL; + + paerr=Pa_IsFormatSupported(&inParam,NULL,96000.0); + if(paerr<0) { + emit error("PortAudio says requested soundcard format not supported."); +// return; + } + paerr=Pa_OpenStream(&inStream, //Input stream + &inParam, //Input parameters + NULL, //No output parameters + 96000.0, //Sample rate + FRAMES_PER_BUFFER, //Frames per buffer +// paClipOff+paDitherOff, //No clipping or dithering + paClipOff, //No clipping + a2dCallback, //Input callbeck routine + &udata); //userdata + + paerr=Pa_StartStream(inStream); + if(paerr<0) { + emit error("Failed to start audio input stream."); + return; + } +// const PaStreamInfo* p=Pa_GetStreamInfo(inStream); + + bool qe = quitExecution; + int ntr0=99; + int k=0; + int nsec; + int ntr; + int nBusy=0; + int nhsym0=0; + +//---------------------------------------------- Soundcard input loop + while (!qe) { + qe = quitExecution; + if (qe) break; + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + nsec = ms/1000; // Time according to this computer + ntr = nsec % m_TRperiod; + +// Reset buffer pointer and symbol number at start of minute + if(ntr < ntr0 or !m_monitoring or m_TRperiod!=m_TRperiod0) { + nhsym0=0; + udata.bzero=true; + m_TRperiod0=m_TRperiod; + } + k=udata.kin; + udata.iqswap=m_IQswap; + udata.b10db=m_10db; + if(m_monitoring) { + if(m_bForceCenterFreq) { + datcom_.fcenter=m_dForceCenterFreq; + } else { + datcom_.fcenter=144.125; + } + m_hsym=(k-2048)*11025.0/(2048.0*m_rate); + if(m_hsym != nhsym0) { + if(m_dataSinkBusy) { + nBusy++; + } else { + m_dataSinkBusy=true; + emit readyForFFT(k); //Signal to compute new FFTs + } + nhsym0=m_hsym; + } + } + msleep(100); + ntr0=ntr; + } + Pa_StopStream(inStream); + Pa_CloseStream(inStream); +} + +void SoundInThread::setSwapIQ(bool b) +{ + m_IQswap=b; +} + +void SoundInThread::set10db(bool b) +{ + m_10db=b; +} +void SoundInThread::setPort(int n) //setPort() +{ + if (isRunning()) return; + this->m_udpPort=n; +} + +void SoundInThread::setInputDevice(int n) //setInputDevice() +{ + if (isRunning()) return; + this->m_nDevIn=n; +} + +void SoundInThread::setRate(double rate) //setRate() +{ + if (isRunning()) return; + this->m_rate = rate; +} + +void SoundInThread::setBufSize(unsigned n) //setBufSize() +{ + if (isRunning()) return; + this->bufSize = n; +} + +void SoundInThread::setFadd(double x) +{ + m_fAdd=x; +} + + +void SoundInThread::quit() //quit() +{ + quitExecution = true; +} + +void SoundInThread::setNetwork(bool b) //setNetwork() +{ + m_net = b; +} + +void SoundInThread::setMonitoring(bool b) //setMonitoring() +{ + m_monitoring = b; +} + +void SoundInThread::setForceCenterFreqBool(bool b) +{ + m_bForceCenterFreq=b; + +} + +void SoundInThread::setForceCenterFreqMHz(double d) +{ + m_dForceCenterFreq=d; +} + +void SoundInThread::setNrx(int n) //setNrx() +{ + m_nrx = n; +} + +int SoundInThread::nrx() +{ + return m_nrx; +} + +int SoundInThread::mhsym() +{ + return m_hsym; +} + +void SoundInThread::setPeriod(int n) +{ + m_TRperiod=n; +} + +//--------------------------------------------------------------- inputUDP() +void SoundInThread::inputUDP() +{ + udpSocket = new QUdpSocket(); + if(!udpSocket->bind(m_udpPort,QUdpSocket::ShareAddress) ) + { + emit error(tr("UDP Socket bind failed.")); + return; + } + + // Set this socket's total buffer space for received UDP packets + udpSocket->setSocketOption (QUdpSocket::ReceiveBufferSizeSocketOption, 141600); + + bool qe = quitExecution; + struct linradBuffer { + double cfreq; + int msec; + float userfreq; + int iptr; + quint16 iblk; + qint8 nrx; + char iusb; + double d8[174]; + } b; + + int ntr0=99; + int k=0; + int nsec; + int ntr; + int nhsym0=0; + int iz=174; + int nBusy=0; + + // Main loop for input of UDP packets over the network: + while (!qe) { + qe = quitExecution; + if (qe) break; + if (!udpSocket->hasPendingDatagrams()) { + msleep(2); // Sleep if no packet available + } else { + int nBytesRead = udpSocket->readDatagram((char *)&b,1416); + if (nBytesRead != 1416) qDebug() << "UDP Read Error:" << nBytesRead; + + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + nsec = ms/1000; // Time according to this computer + ntr = nsec % m_TRperiod; + +// Reset buffer pointer and symbol number at start of minute + if(ntr < ntr0 or !m_monitoring or m_TRperiod!=m_TRperiod0) { + k=0; + nhsym0=0; + m_TRperiod0=m_TRperiod; + } + ntr0=ntr; + + if(m_monitoring) { + m_nrx=b.nrx; + if(m_nrx == +1) iz=348; //One RF channel, i*2 data + if(m_nrx == -1 or m_nrx == +2) iz=174; //One Rf channel, r*4 data + // or 2 RF channels, i*2 data + if(m_nrx == -2) iz=87; // Two RF channels, r*4 data + + // If buffer will not overflow, move data into datcom_ + if ((k+iz) <= 60*96000) { + int nsam=-1; + recvpkt_(&nsam, &b.iblk, &b.nrx, &k, b.d8, b.d8, b.d8); + if(m_bForceCenterFreq) { + datcom_.fcenter=m_dForceCenterFreq; + } else { + datcom_.fcenter=b.cfreq + m_fAdd; + } + } + + m_hsym=(k-2048)*11025.0/(2048.0*m_rate); + if(m_hsym != nhsym0) { + if(m_dataSinkBusy) { + nBusy++; + } else { + m_dataSinkBusy=true; + emit readyForFFT(k); //Signal to compute new FFTs + } + nhsym0=m_hsym; + } + } + } + } + delete udpSocket; +} diff --git a/map65/soundin.h b/map65/soundin.h new file mode 100644 index 000000000..5e53e7ef8 --- /dev/null +++ b/map65/soundin.h @@ -0,0 +1,88 @@ +#ifndef SOUNDIN_H +#define SOUNDIN_H + +#include +#include +#include +#include + +#ifdef Q_OS_WIN32 +#include +#else +#include +#endif //Q_OS_WIN32 + +// Thread gets audio data from soundcard and signals when a buffer of +// specified size is available. +class SoundInThread : public QThread +{ + Q_OBJECT + bool quitExecution; // if true, thread exits gracefully + double m_rate; // sample rate + unsigned bufSize; // user's buffer size + +protected: + virtual void run(); + +public: + bool m_dataSinkBusy; + + SoundInThread(): + quitExecution(false), + m_rate(0), + bufSize(0), + m_dataSinkBusy(false) + { + } + + void setSwapIQ(bool b); + void set10db(bool b); + void setPort(qint32 n); + void setInputDevice(qint32 n); + void setRate(double rate); + void setBufSize(unsigned bufSize); + void setNetwork(bool b); + void setMonitoring(bool b); + void setFadd(double x); + void setNrx(int n); + void setForceCenterFreqBool(bool b); + void setForceCenterFreqMHz(double d); + void setPeriod(int n); + int nrx(); + int mhsym(); + +signals: + void bufferAvailable(std::valarray samples, double rate); + void readyForFFT(int k); + void error(const QString& message); + void status(const QString& message); + +public slots: + void quit(); + +private: + void inputUDP(); + + double m_fAdd; + bool m_net; + bool m_monitoring; + bool m_bForceCenterFreq; + bool m_IQswap; + bool m_10db; + double m_dForceCenterFreq; + qint32 m_nrx; + qint32 m_hsym; + qint32 m_nDevIn; + qint32 m_udpPort; + qint32 m_TRperiod; + qint32 m_TRperiod0; + + QUdpSocket *udpSocket; +}; + +extern "C" { + void recvpkt_(int* nsam, quint16* iblk, qint8* nrx, int* k, double s1[], + double s2[], double s3[]); +} + +#endif // SOUNDIN_H diff --git a/map65/soundout.cpp b/map65/soundout.cpp new file mode 100644 index 000000000..fdc2f745b --- /dev/null +++ b/map65/soundout.cpp @@ -0,0 +1,181 @@ +#include "soundout.h" + +#define FRAMES_PER_BUFFER 256 + +extern "C" { +#include +} + +extern float gran(); //Noise generator (for tests only) + +extern short int iwave[2*60*11025]; //Wave file for Tx audio +extern int nwave; +extern bool btxok; +extern bool bTune; +extern bool bIQxt; +extern int iqAmp; +extern int iqPhase; +extern int txPower; +extern double outputLatency; + +typedef struct //Parameters sent to or received from callback function +{ + int nTRperiod; +} paUserData; + +//--------------------------------------------------------------- d2aCallback +extern "C" int d2aCallback(const void * /*inputBuffer*/, void *outputBuffer, + unsigned long framesToProcess, + const PaStreamCallbackTimeInfo* /*timeInfo*/, + PaStreamCallbackFlags /*statusFlags*/, + void *userData ) +{ + paUserData *udata=(paUserData*)userData; + short *wptr = (short*)outputBuffer; + unsigned int i; + static int n; + static int ic=0; + static bool btxok0=false; + static bool bTune0=false; + static int nStart=0; + static double phi=0.; + double tsec,tstart,dphi; + int nsec; + int nTRperiod=udata->nTRperiod; + + // Get System time + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + tsec = 0.001*ms; + nsec = ms/1000; + qreal dPhase=iqPhase/5729.57795131; + qreal amp=1.0 + 0.0001*iqAmp; + qreal xAmp=txPower*295.00*qSqrt(2.0 - amp*amp); + qreal yAmp=txPower*295.00*amp; + static int nsec0=0; + + if(bTune) { + ic=0; + dphi=6.28318530718*1270.46/11025.0; + } + if(bTune0 and !bTune) btxok=false; + bTune0=bTune; + + if(nsec!=nsec0) { +// qDebug() << txPower << iqAmp << iqPhase << amp << xAmp << yAmp << dPhase << bTune; +// qDebug() << "A" << nsec%60 << bTune << btxok; +// ic=0; + nsec0=nsec; + } + + if(btxok and !btxok0) { //Start (or re-start) a transmission + n=nsec/nTRperiod; + tstart=tsec - n*nTRperiod - 1.0; + + if(tstart<1.0) { + ic=0; //Start of Tx cycle, set starting index to 0 + nStart=n; + } else { + if(n != nStart) { //Late start in new Tx cycle: compute starting index + ic=(int)(tstart*11025.0); + ic=2*ic; + nStart=n; + } + } + } + btxok0=btxok; + + if(btxok) { + for(i=0 ; i nwave) {i2a=0; i2b=0;} +// i2 = 500.0*(i2/32767.0 + 5.0*gran()); //Add noise (tests only!) +// if(bIQxt) { + if(1) { + if(bTune) { + phi += dphi; + } else { + phi=qAtan2(qreal(i2b),qreal(i2a)); + } + i2a=xAmp*qCos(phi); + i2b=yAmp*qSin(phi + dPhase); +// qDebug() << xAmp << yAmp << phi << i2a << i2b; + } +// i2a=0.01*txPower*i2a; +// i2b=0.01*txPower*i2b; + *wptr++ = i2b; //left + *wptr++ = i2a; //right + } + } else { + for(i=0 ; i nwave) { + btxok=0; + ic=0; + } + return 0; +} + +void SoundOutThread::run() +{ + PaError paerr; + PaStreamParameters outParam; + PaStream *outStream; + paUserData udata; + quitExecution = false; + + outParam.device=m_nDevOut; //Output device number + outParam.channelCount=2; //Number of analog channels + outParam.sampleFormat=paInt16; //Send short ints to PortAudio + outParam.suggestedLatency=0.05; + outParam.hostApiSpecificStreamInfo=NULL; + + udata.nTRperiod=m_TRperiod; + paerr=Pa_IsFormatSupported(NULL,&outParam,11025.0); + if(paerr<0) { + qDebug() << "PortAudio says requested output format not supported."; + qDebug() << paerr; + return; + } + paerr=Pa_OpenStream(&outStream, //Output stream + NULL, //No input parameters + &outParam, //Output parameters + 11025.0, //Sample rate + FRAMES_PER_BUFFER, //Frames per buffer + paClipOff, //No clipping + d2aCallback, //output callbeck routine + &udata); //userdata + + paerr=Pa_StartStream(outStream); + if(paerr<0) { + qDebug() << "Failed to start audio output stream."; + return; + } + const PaStreamInfo* p=Pa_GetStreamInfo(outStream); + outputLatency = p->outputLatency; + bool qe = quitExecution; + +//---------------------------------------------- Soundcard output loop + while (!qe) { + qe = quitExecution; + if (qe) break; + msleep(100); + } + Pa_StopStream(outStream); + Pa_CloseStream(outStream); +} + +void SoundOutThread::setOutputDevice(int n) //setOutputDevice() +{ + if (isRunning()) return; + this->m_nDevOut=n; +} + +void SoundOutThread::setPeriod(int n) +{ + m_TRperiod=n; +} diff --git a/map65/soundout.h b/map65/soundout.h new file mode 100644 index 000000000..294c6fa5f --- /dev/null +++ b/map65/soundout.h @@ -0,0 +1,44 @@ +#ifndef SOUNDOUT_H +#define SOUNDOUT_H +#include +#include + +// An instance of this thread sends audio data to a specified soundcard. +// Output can be muted while underway, preserving waveform timing when +// transmission is resumed. + +class SoundOutThread : public QThread +{ + Q_OBJECT + +protected: + virtual void run(); + +public: +// Constructs (but does not start) a SoundOutThread + SoundOutThread() + : quitExecution(false) // Initialize some private members + , m_rate(0) + , m_nwave(48*11025) + , m_txOK(false) + , m_txMute(false) + { + } + +public: + void setOutputDevice(qint32 n); + void setPeriod(int n); + bool quitExecution; //If true, thread exits gracefully + + +// Private members +private: + double m_rate; //Sample rate + qint32 m_nDevOut; //Output device number + qint32 m_nwave; //Length of wave file + qint32 m_TRperiod; //T/R period (30 or 60 s) + bool m_txOK; //Enable Tx audio + bool m_txMute; //Mute temporarily +}; + +#endif diff --git a/map65/ss.bat b/map65/ss.bat new file mode 100644 index 000000000..3ea6cc6dc --- /dev/null +++ b/map65/ss.bat @@ -0,0 +1 @@ +svn status | grep -v "?" diff --git a/map65/sss.bat b/map65/sss.bat new file mode 100644 index 000000000..63b4044f2 --- /dev/null +++ b/map65/sss.bat @@ -0,0 +1 @@ +svn status diff --git a/map65/txtune.cpp b/map65/txtune.cpp new file mode 100644 index 000000000..b1d7fb71d --- /dev/null +++ b/map65/txtune.cpp @@ -0,0 +1,116 @@ +#include "txtune.h" +#include "ui_txtune.h" +#include + +extern int txPower; +extern int iqAmp; +extern int iqPhase; +extern bool bTune; + +TxTune::TxTune(QWidget *parent) : + QDialog(parent), + ui(new Ui::TxTune) +{ + ui->setupUi(this); +} + +TxTune::~TxTune() +{ + delete ui; +} + +void TxTune::accept() +{ + if(bTune) on_pbTune_clicked(); + QDialog::accept(); +} + +void TxTune::reject() +{ + if(bTune) on_pbTune_clicked(); + set_iqAmp(m_saveAmp); + set_iqPhase(m_savePha); + set_txPower(m_saveTxPower); + QDialog::reject(); +} + +void TxTune::on_pwrSlider_valueChanged(int n) +{ + txPower=n; + ui->labPower->setText (QString {"%1 %"}.arg (n)); +} + +void TxTune::on_ampSlider_valueChanged(int n) +{ + m_iqAmp1=n; + iqAmp=10*m_iqAmp1 + m_iqAmp2; + ui->labAmpReal->setText (QString::number (1.0 + 0.0001 * iqAmp, 'f', 4)); +} + +void TxTune::on_fineAmpSlider_valueChanged(int n) +{ + m_iqAmp2=n; + iqAmp=10*m_iqAmp1 + m_iqAmp2; + ui->labAmpReal->setText (QString::number (1.0 + 0.0001*iqAmp, 'f', 4)); +} + +void TxTune::on_phaSlider_valueChanged(int n) +{ + m_iqPha1=n; + iqPhase=10*m_iqPha1 + m_iqPha2; + ui->labPhaReal->setText (QString::number (0.01*iqPhase, 'f', 2)); +} + +void TxTune::on_finePhaSlider_valueChanged(int n) +{ + m_iqPha2=n; + iqPhase=10*m_iqPha1 + m_iqPha2; + ui->labPhaReal->setText (QString::number (0.01*iqPhase, 'f', 2)); +} + +void TxTune::set_iqAmp(int n) +{ + m_saveAmp=n; + m_iqAmp1=n/10; + m_iqAmp2=n%10; + ui->ampSlider->setValue(m_iqAmp1); + ui->fineAmpSlider->setValue(m_iqAmp2); +} + +void TxTune::set_iqPhase(int n) +{ + m_savePha=n; + m_iqPha1=n/10; + m_iqPha2=n%10; + ui->phaSlider->setValue(m_iqPha1); + ui->finePhaSlider->setValue(m_iqPha2); +} + +void TxTune::set_txPower(int n) +{ + m_saveTxPower=n; + ui->pwrSlider->setValue(n); +} + +void TxTune::on_cbTxImage_toggled(bool b) +{ + ui->ampSlider->setEnabled(b); + ui->fineAmpSlider->setEnabled(b); + ui->labAmp->setEnabled(b); + ui->labFineAmp->setEnabled(b); + ui->phaSlider->setEnabled(b); + ui->finePhaSlider->setEnabled(b); + ui->labPha->setEnabled(b); + ui->labFinePha->setEnabled(b); +} + +void TxTune::on_pbTune_clicked() +{ + bTune = !bTune; + if(bTune) { + QString style="QPushButton{background-color: red;}"; + ui->pbTune->setStyleSheet(style); + } else { + ui->pbTune->setStyleSheet(""); + } +} diff --git a/map65/txtune.h b/map65/txtune.h new file mode 100644 index 000000000..e60015726 --- /dev/null +++ b/map65/txtune.h @@ -0,0 +1,48 @@ +#ifndef TXTUNE_H +#define TXTUNE_H + +#include + +namespace Ui { +class TxTune; +} + +class TxTune : public QDialog +{ + Q_OBJECT + +public: + explicit TxTune(QWidget *parent = 0); + ~TxTune(); + +public slots: + void accept(); + void reject(); + +private slots: + void on_pwrSlider_valueChanged(int n); + void on_ampSlider_valueChanged(int n); + void on_phaSlider_valueChanged(int n); + void on_cbTxImage_toggled(bool b); + void on_pbTune_clicked(); + void on_fineAmpSlider_valueChanged(int n); + void on_finePhaSlider_valueChanged(int n); + +public: + void set_iqAmp(int n); + void set_iqPhase(int n); + void set_txPower(int n); + +private: + qint32 m_iqAmp1; + qint32 m_iqAmp2; + qint32 m_iqPha1; + qint32 m_iqPha2; + qint32 m_saveAmp; + qint32 m_savePha; + qint32 m_saveTxPower; + + Ui::TxTune *ui; +}; + +#endif // TXTUNE_H diff --git a/map65/txtune.ui b/map65/txtune.ui new file mode 100644 index 000000000..af78cd418 --- /dev/null +++ b/map65/txtune.ui @@ -0,0 +1,302 @@ + + + TxTune + + + + 0 + 0 + 400 + 300 + + + + Tx Tune + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + false + + + + + + 13 + 38 + 351 + 191 + + + + + + + + 70 + 0 + + + + Tx Power: + + + + + + + 100 + + + 100 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 10 + + + + + + + Enable Tx I/Q Adjustment + + + + + + + false + + + + 70 + 0 + + + + I/Q Amplitude: + + + + + + + false + + + -100 + + + 100 + + + 0 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + + + + + false + + + Fine: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + false + + + -100 + + + 100 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + + + + + false + + + + 70 + 0 + + + + I/Q Phase: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + false + + + -100 + + + 100 + + + 0 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + + + + + false + + + Fine: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + false + + + -100 + + + 100 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + + + + + 1.0000 + + + Qt::AlignCenter + + + + + + + 0.000 + + + Qt::AlignCenter + + + + + + + Tune + + + + + + + 100 % + + + Qt::AlignCenter + + + + + + + + + + buttonBox + accepted() + TxTune + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + TxTune + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/map65/widegraph.cpp b/map65/widegraph.cpp new file mode 100644 index 000000000..265b00fa3 --- /dev/null +++ b/map65/widegraph.cpp @@ -0,0 +1,388 @@ +#include "widegraph.h" +#include +#include +#include "SettingsGroup.hpp" +#include "ui_widegraph.h" + +#define NFFT 32768 + +WideGraph::WideGraph (QString const& settings_filename, QWidget * parent) + : QDialog {parent}, + ui {new Ui::WideGraph}, + m_settings_filename {settings_filename} +{ + ui->setupUi(this); + setWindowTitle("Wide Graph"); + setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + installEventFilter(parent); //Installing the filter + ui->widePlot->setCursor(Qt::CrossCursor); + setMaximumWidth(2048); + setMaximumHeight(880); + ui->widePlot->setMaximumHeight(800); + m_bIQxt=false; + connect(ui->widePlot, SIGNAL(freezeDecode1(int)),this, + SLOT(wideFreezeDecode(int))); + + //Restore user's settings + QSettings settings {m_settings_filename, QSettings::IniFormat}; + { + SettingsGroup g {&settings, "MainWindow"}; // historical reasons + setGeometry (settings.value ("WideGraphGeom", QRect {45,30,1023,340}).toRect ()); + } + SettingsGroup g {&settings, "WideGraph"}; + ui->widePlot->setPlotZero(settings.value("PlotZero", 20).toInt()); + ui->widePlot->setPlotGain(settings.value("PlotGain", 0).toInt()); + ui->zeroSpinBox->setValue(ui->widePlot->getPlotZero()); + ui->gainSpinBox->setValue(ui->widePlot->getPlotGain()); + int n = settings.value("FreqSpan",60).toInt(); + int w = settings.value("PlotWidth",1000).toInt(); + ui->freqSpanSpinBox->setValue(n); + ui->widePlot->setNSpan(n); + int nbpp = n * 32768.0/(w*96.0) + 0.5; + ui->widePlot->setBinsPerPixel(nbpp); + m_waterfallAvg = settings.value("WaterfallAvg",10).toInt(); + ui->waterfallAvgSpinBox->setValue(m_waterfallAvg); + ui->freqOffsetSpinBox->setValue(settings.value("FreqOffset",0).toInt()); + m_bForceCenterFreq=settings.value("ForceCenterFreqBool",false).toBool(); + m_dForceCenterFreq=settings.value("ForceCenterFreqMHz",144.125).toDouble(); + ui->cbFcenter->setChecked(m_bForceCenterFreq); + ui->cbLockTxRx->setChecked(m_bLockTxRx); + ui->fCenterLineEdit->setText(QString::number(m_dForceCenterFreq)); + m_bLockTxRx=settings.value("LockTxRx",false).toBool(); + ui->cbLockTxRx->setChecked(m_bLockTxRx); +} + +WideGraph::~WideGraph() +{ + saveSettings(); + delete ui; +} + +void WideGraph::resizeEvent(QResizeEvent* ) //resizeEvent() +{ + if(!size().isValid()) return; + int w = size().width(); + int h = size().height(); + ui->labFreq->setGeometry(QRect(w-256,h-100,227,41)); +} + +void WideGraph::saveSettings() +{ + //Save user's settings + QSettings settings {m_settings_filename, QSettings::IniFormat}; + { + SettingsGroup g {&settings, "MainWindow"}; // for historical reasons + settings.setValue ("WideGraphGeom", geometry()); + } + SettingsGroup g {&settings, "WideGraph"}; + settings.setValue("PlotZero",ui->widePlot->m_plotZero); + settings.setValue("PlotGain",ui->widePlot->m_plotGain); + settings.setValue("PlotWidth",ui->widePlot->plotWidth()); + settings.setValue("FreqSpan",ui->freqSpanSpinBox->value()); + settings.setValue("WaterfallAvg",ui->waterfallAvgSpinBox->value()); + settings.setValue("FreqOffset",ui->widePlot->freqOffset()); + settings.setValue("ForceCenterFreqBool",m_bForceCenterFreq); + settings.setValue("ForceCenterFreqMHz",m_dForceCenterFreq); + settings.setValue("LockTxRx",m_bLockTxRx); +} + +void WideGraph::dataSink2(float s[], int nkhz, int ihsym, int ndiskdata, + uchar lstrong[]) +{ + static float splot[NFFT]; + float swide[2048]; + float smax; + double df; + int nbpp = ui->widePlot->binsPerPixel(); + static int n=0; + static int nkhz0=-999; + static int ntrz=0; + + df = m_fSample/32768.0; + if(nkhz != nkhz0) { + ui->widePlot->setNkhz(nkhz); //Why do we need both? + ui->widePlot->SetCenterFreq(nkhz); //Why do we need both? + ui->widePlot->setFQSO(nkhz,true); + nkhz0 = nkhz; + } + + //Average spectra over specified number, m_waterfallAvg + if (n==0) { + for (int i=0; i=m_waterfallAvg) { + for (int i=0; iwidePlot->plotWidth(); + qint64 sf = nkhz + ui->widePlot->freqOffset() - 0.5*w*nbpp*df/1000.0; + if(sf != ui->widePlot->startFreq()) ui->widePlot->SetStartFreq(sf); + int i0=16384.0+(ui->widePlot->startFreq()-nkhz+1.27046+0.001*m_fCal) * + 1000.0/df + 0.5; + int i=i0; + for (int j=0; j<2048; j++) { + smax=0; + for (int k=0; ksmax) smax=splot[i]; + } + swide[j]=smax; + if(lstrong[1 + i/32]!=0) swide[j]=-smax; //Tag strong signals + } + +// Time according to this computer + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + int ntr = (ms/1000) % m_TRperiod; + + if((ndiskdata && ihsym <= m_waterfallAvg) || (!ndiskdata && ntrwidePlot->draw(swide,i0,splot); + } +} + +void WideGraph::on_freqOffsetSpinBox_valueChanged(int f) +{ + ui->widePlot->SetFreqOffset(f); +} + +void WideGraph::on_freqSpanSpinBox_valueChanged(int n) +{ + ui->widePlot->setNSpan(n); + int w = ui->widePlot->plotWidth(); + int nbpp = n * 32768.0/(w*96.0) + 0.5; + if(nbpp < 1) nbpp=1; + if(w > 0) { + ui->widePlot->setBinsPerPixel(nbpp); + } +} + +void WideGraph::on_waterfallAvgSpinBox_valueChanged(int n) +{ + m_waterfallAvg = n; +} + +void WideGraph::on_zeroSpinBox_valueChanged(int value) +{ + ui->widePlot->setPlotZero(value); +} + +void WideGraph::on_gainSpinBox_valueChanged(int value) +{ + ui->widePlot->setPlotGain(value); +} + +void WideGraph::keyPressEvent(QKeyEvent *e) +{ + switch(e->key()) + { + case Qt::Key_F11: + emit f11f12(11); + break; + case Qt::Key_F12: + emit f11f12(12); + break; + default: + e->ignore(); + } +} + +int WideGraph::QSOfreq() +{ + return ui->widePlot->fQSO(); +} + +int WideGraph::nSpan() +{ + return ui->widePlot->m_nSpan; +} + +float WideGraph::fSpan() +{ + return ui->widePlot->m_fSpan; +} + +int WideGraph::nStartFreq() +{ + return ui->widePlot->startFreq(); +} + +void WideGraph::wideFreezeDecode(int n) +{ + emit freezeDecode2(n); +} + +void WideGraph::setTol(int n) +{ + ui->widePlot->m_tol=n; + ui->widePlot->DrawOverlay(); + ui->widePlot->update(); +} + +int WideGraph::Tol() +{ + return ui->widePlot->m_tol; +} + +void WideGraph::setDF(int n) +{ + ui->widePlot->m_DF=n; + ui->widePlot->DrawOverlay(); + ui->widePlot->update(); +} + +void WideGraph::setFcal(int n) +{ + m_fCal=n; + ui->widePlot->setFcal(n); +} + +void WideGraph::setDecodeFinished() +{ + ui->widePlot->DecodeFinished(); +} + +int WideGraph::DF() +{ + return ui->widePlot->m_DF; +} + +void WideGraph::on_autoZeroPushButton_clicked() +{ + int nzero=ui->widePlot->autoZero(); + ui->zeroSpinBox->setValue(nzero); +} + +void WideGraph::setPalette(QString palette) +{ + ui->widePlot->setPalette(palette); +} +void WideGraph::setFsample(int n) +{ + m_fSample=n; + ui->widePlot->setFsample(n); +} + +void WideGraph::setMode65(int n) +{ + m_mode65=n; + ui->widePlot->setMode65(n); +} + +void WideGraph::on_cbFcenter_stateChanged(int n) +{ + m_bForceCenterFreq = (n!=0); + if(m_bForceCenterFreq) { + ui->fCenterLineEdit->setEnabled(true); + ui->pbSetRxHardware->setEnabled(true); + } else { + ui->fCenterLineEdit->setDisabled(true); + ui->pbSetRxHardware->setDisabled(true); + } +} + +void WideGraph::on_fCenterLineEdit_editingFinished() +{ + m_dForceCenterFreq=ui->fCenterLineEdit->text().toDouble(); +} + +void WideGraph::on_pbSetRxHardware_clicked() +{ + int iret=set570(m_mult570*(1.0+0.000001*m_cal570)*m_dForceCenterFreq); + if(iret != 0) { + QMessageBox mb; + if(iret==-1) mb.setText("Failed to open Si570."); + if(iret==-2) mb.setText("Frequency out of permitted range."); + mb.exec(); + } +} + +void WideGraph::initIQplus() +{ + int iret=set570(288.0); + if(iret != 0) { + QMessageBox mb; + if(iret==-1) mb.setText("Failed to open Si570."); + if(iret==-2) mb.setText("Frequency out of permitted range."); + mb.exec(); + } else { + on_pbSetRxHardware_clicked(); + } +} + +void WideGraph::on_cbSpec2d_toggled(bool b) +{ + ui->widePlot->set2Dspec(b); +} + +double WideGraph::fGreen() +{ + return ui->widePlot->fGreen(); +} + +void WideGraph::setPeriod(int n) +{ + m_TRperiod=n; +} + +void WideGraph::on_cbLockTxRx_stateChanged(int n) +{ + m_bLockTxRx = (n!=0); + ui->widePlot->setLockTxRx(m_bLockTxRx); +} + +void WideGraph::rx570() +{ + double f=m_mult570*(1.0+0.000001*m_cal570)*m_dForceCenterFreq; + int iret=set570(f); + if(iret != 0) { + QMessageBox mb; + if(iret==-1) mb.setText("Failed to open Si570."); + if(iret==-2) mb.setText("Frequency out of permitted range."); + mb.exec(); + } +} + +void WideGraph::tx570() +{ + if(m_bForceCenterFreq) datcom_.fcenter=m_dForceCenterFreq; + m_bIQxt=true; + double f=ui->widePlot->txFreq(); +// double f1=m_mult570Tx*(1.0+0.000001*m_cal570) * f; + double f1=m_mult570Tx*(1.0+0.000001*m_cal570) * (f - m_TxOffset); + + int iret=set570(f1); + if(iret != 0) { + QMessageBox mb; + if(iret==-1) mb.setText("Failed to open Si570."); + if(iret==-2) mb.setText("Frequency out of permitted range."); + mb.exec(); + } +} + +void WideGraph::updateFreqLabel() +{ + auto rxFreq = QString {"%1"}.arg (ui->widePlot->rxFreq (), 10, 'f', 6); + auto txFreq = QString {"%1"}.arg (ui->widePlot->txFreq (), 10, 'f', 6); + rxFreq.insert (rxFreq.size () - 3, '.'); + txFreq.insert (txFreq.size () - 3, '.'); + ui->labFreq->setText (QString {"Rx: %1\nTx: %2"}.arg (rxFreq, txFreq)); +} + +void WideGraph::enableSetRxHardware(bool b) +{ + ui->pbSetRxHardware->setEnabled(b); +} diff --git a/map65/widegraph.h b/map65/widegraph.h new file mode 100644 index 000000000..1e330cfde --- /dev/null +++ b/map65/widegraph.h @@ -0,0 +1,92 @@ +#ifndef WIDEGRAPH_H +#define WIDEGRAPH_H + +#include + +namespace Ui { + class WideGraph; +} + +class WideGraph : public QDialog +{ + Q_OBJECT + +public: + explicit WideGraph (QString const& settings_filename, QWidget * parent = nullptr); + ~WideGraph(); + + void dataSink2(float s[], int nkhz, int ihsym, int ndiskdata, + uchar lstrong[]); + int QSOfreq(); + int nSpan(); + int nStartFreq(); + float fSpan(); + void saveSettings(); + void setDF(int n); + int DF(); + int Tol(); + void setTol(int n); + void setFcal(int n); + void setPalette(QString palette); + void setFsample(int n); + void setMode65(int n); + void setPeriod(int n); + void setDecodeFinished(); + double fGreen(); + void rx570(); + void tx570(); + void updateFreqLabel(); + void enableSetRxHardware(bool b); + + qint32 m_qsoFreq; + +signals: + void freezeDecode2(int n); + void f11f12(int n); + +public slots: + void wideFreezeDecode(int n); + void initIQplus(); + +protected: + virtual void keyPressEvent( QKeyEvent *e ); + void resizeEvent(QResizeEvent* event); + +private slots: + void on_waterfallAvgSpinBox_valueChanged(int arg1); + void on_freqSpanSpinBox_valueChanged(int arg1); + void on_freqOffsetSpinBox_valueChanged(int arg1); + void on_zeroSpinBox_valueChanged(int arg1); + void on_gainSpinBox_valueChanged(int arg1); + void on_autoZeroPushButton_clicked(); + void on_cbFcenter_stateChanged(int arg1); + void on_fCenterLineEdit_editingFinished(); + void on_pbSetRxHardware_clicked(); + void on_cbSpec2d_toggled(bool checked); + void on_cbLockTxRx_stateChanged(int arg1); + +private: + Ui::WideGraph * ui; + QString m_settings_filename; +public: + bool m_bForceCenterFreq; +private: + bool m_bLockTxRx; +public: + qint32 m_mult570; + qint32 m_mult570Tx; + double m_dForceCenterFreq; + double m_cal570; + double m_TxOffset; +private: + bool m_bIQxt; + qint32 m_waterfallAvg; + qint32 m_fCal; + qint32 m_fSample; + qint32 m_mode65; + qint32 m_TRperiod=60; +}; + +extern int set570(double freq_MHz); + +#endif // WIDEGRAPH_H diff --git a/map65/widegraph.ui b/map65/widegraph.ui new file mode 100644 index 000000000..38f90d47d --- /dev/null +++ b/map65/widegraph.ui @@ -0,0 +1,340 @@ + + + WideGraph + + + + 0 + 0 + 1178 + 326 + + + + Dialog + + + + + + true + + + + 0 + 0 + + + + + 400 + 200 + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + 1 + + + + + 940 + 230 + 211 + 41 + + + + + 12 + + + + QLabel { + background-color: rgba(0, 0, 0, 0); + color: yellow; +} + + + Rx: 144.118.200 +Tx: 144.127.317 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + kHz + + + Offset + + + -24 + + + 24 + + + 1 + + + 0 + + + + + + + + 0 + 0 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + kHz + + + Span + + + 5 + + + 90 + + + 5 + + + 60 + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + N Avg + + + 1 + + + 20 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Gain + + + -20 + + + 20 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Zero + + + -100 + + + 100 + + + + + + + Auto Zero + + + + + + + 2D Spectrum + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Lock Tx=Rx Freq + + + + + + + Force Center Freq (MHz) + + + + + + + false + + + + 0 + 0 + + + + + 65 + 16777215 + + + + 1296.065 + + + + + + + false + + + Set Rx Freq + + + + + + + + + + + + CPlotter + QFrame +
plotter.h
+ 1 +
+
+ + +
diff --git a/map65/wsjt.ico b/map65/wsjt.ico new file mode 100644 index 000000000..8a55550f5 Binary files /dev/null and b/map65/wsjt.ico differ diff --git a/widgets/about.cpp b/widgets/about.cpp index 5ba2003ab..7fc555447 100644 --- a/widgets/about.cpp +++ b/widgets/about.cpp @@ -19,7 +19,7 @@ CAboutDlg::CAboutDlg(QWidget *parent) : "WSJT-X implements a number of digital modes designed for
" "weak-signal Amateur Radio communication.

" "© 2001-2021 by Joe Taylor, K1JT, Bill Somerville, G4WJS,
" - "and Steve Franke, K9AN.

" + "Steve Franke, K9AN, and Nico Palermo, IV3NWV.

" "We gratefully acknowledge contributions from AC6SL, AE4JY,
" "DF2ET, DJ0OT, G3WDG, G4KLA, IW3RAB, K3WYC, KA1GT,
" "KA6MAL, KA9Q, KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR,
" diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 8fd7fabba..f8c1f2e0c 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -212,7 +212,7 @@ namespace // 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"}; auto quint32_max = std::numeric_limits::max (); - constexpr int N_WIDGETS {37}; + constexpr int N_WIDGETS {38}; constexpr int default_rx_audio_buffer_frames {-1}; // lets Qt decide constexpr int default_tx_audio_buffer_frames {-1}; // lets Qt decide @@ -1032,11 +1032,11 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, void MainWindow::not_GA_warning_message () { MessageBox::critical_message (this, - "This is a pre-release version of WSJT-X 2.4.0 made\n" + "This is a pre-release version of WSJT-X 2.5.0 made\n" "available for testing purposes. By design it will\n" - "be nonfunctional after May 30, 2021."); + "be nonfunctional after Aug 31, 2021."); auto now = QDateTime::currentDateTimeUtc (); - if (now >= QDateTime {{2021, 5, 30}, {23, 59, 59, 999}, Qt::UTC}) { + if (now >= QDateTime {{2021, 8, 31}, {23, 59, 59, 999}, Qt::UTC}) { Q_EMIT finished (); } } @@ -1174,6 +1174,7 @@ void MainWindow::writeSettings() m_settings->setValue("NoOwnCall",ui->cbNoOwnCall->isChecked()); m_settings->setValue ("BandHopping", ui->band_hopping_group_box->isChecked ()); m_settings->setValue ("TRPeriod", ui->sbTR->value ()); + m_settings->setValue ("MaxDrift", ui->sbMaxDrift->value()); m_settings->setValue ("TRPeriod_FST4W", ui->sbTR_FST4W->value ()); m_settings->setValue("FastMode",m_bFastMode); m_settings->setValue("Fast9",m_bFast9); @@ -1260,6 +1261,7 @@ void MainWindow::readSettings() m_bFast9=m_settings->value("Fast9",false).toBool(); m_bFastMode=m_settings->value("FastMode",false).toBool(); ui->sbTR->setValue (m_settings->value ("TRPeriod", 15).toInt()); + ui->sbMaxDrift->setValue (m_settings->value ("MaxDrift",0).toInt()); ui->sbTR_FST4W->setValue (m_settings->value ("TRPeriod_FST4W", 15).toInt()); m_lastMonitoredFrequency = m_settings->value ("DialFreq", QVariant::fromValue (default_frequency)).value (); @@ -1473,7 +1475,6 @@ void MainWindow::dataSink(qint64 frames) if(m_mode.startsWith("FST4")) npct=ui->sbNB->value(); symspec_(&dec_data,&k,&m_TRperiod,&nsps,&m_inGain,&bLowSidelobes,&nsmo,&m_px,s, &m_df3,&m_ihsym,&m_npts8,&m_pxmax,&npct); - chk_samples_(&m_ihsym,&k,&m_hsymStop); if(m_mode=="WSPR" or m_mode=="FST4W") wspr_downsample_(dec_data.d2,&k); if(m_ihsym <=0) return; if(ui) ui->signal_meter_widget->setValue(m_px,m_pxmax); // Update thermometer @@ -1585,7 +1586,7 @@ void MainWindow::dataSink(qint64 frames) { Q_EMIT reset_audio_input_stream (true); // reports dropped samples } - if(!m_diskData and (m_saveAll or m_saveDecoded or m_mode=="WSPR" or m_mode=="FST4W")) { + if(!m_diskData and (m_saveAll or m_saveDecoded or m_mode=="WSPR")) { //Always save unless "Save None"; may delete later if(m_TRperiod < 60) { int n=fmod(double(now.time().second()),m_TRperiod); @@ -2514,6 +2515,11 @@ void MainWindow::on_actionQSG_Q65_triggered() QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/Q65_Quick_Start.pdf"}); } +void MainWindow::on_actionQSG_X250_M3_triggered() +{ + QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/WSJTX_2.5.0_MAP65_3.0_Quick_Start.pdf"}); +} + void MainWindow::on_actionOnline_User_Guide_triggered() //Display manual { #if defined (CMAKE_BUILD) @@ -3173,6 +3179,7 @@ void MainWindow::decode() //decode() if(m_config.single_decode()) dec_data.params.nexp_decode += 32; if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64; if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*(ui->sbNB->value()+3); + dec_data.params.max_drift=ui->sbMaxDrift->value(); ::memcpy(dec_data.params.datetime, m_dateTime.toLatin1()+" ", sizeof dec_data.params.datetime); ::memcpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(), sizeof dec_data.params.mycall); @@ -6059,6 +6066,7 @@ void MainWindow::displayWidgets(qint64 n) } if(i==35) ui->sbF_High->setVisible(b); if(i==36) ui->actionAuto_Clear_Avg->setVisible (b); + if(i==37) ui->sbMaxDrift->setVisible(b); j=j>>1; } ui->pbBestSP->setVisible(m_mode=="FT4"); @@ -6092,11 +6100,11 @@ void MainWindow::on_actionFST4_triggered() ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); WSPR_config(false); if(m_config.single_decode()) { -// 0123456789012345678901234567890123456 - displayWidgets(nWidgets("1111110001001110000100000001000000000")); +// 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11111100010011100001000000010000000000")); m_wideGraph->setSingleDecode(true); } else { - displayWidgets(nWidgets("1110110001001110000100000001000000110")); + displayWidgets(nWidgets("11101100010011100001000000010000001100")); m_wideGraph->setSingleDecode(false); ui->sbFtol->setValue(20); } @@ -6132,8 +6140,8 @@ void MainWindow::on_actionFST4W_triggered() m_FFTSize = m_nsps / 2; Q_EMIT FFTSize(m_FFTSize); WSPR_config(true); -// 0123456789012345678901234567890123456 - displayWidgets(nWidgets("0000000000000000010100000000000001000")); +// 01234567890123456789012345678901234567 + displayWidgets(nWidgets("00000000000000000101000000000000010000")); setup_status_bar(false); ui->band_hopping_group_box->setChecked(false); ui->band_hopping_group_box->setVisible(false); @@ -6181,7 +6189,8 @@ void MainWindow::on_actionFT4_triggered() ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); ui->lh_decodes_title_label->setText(tr ("Band Activity")); ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message")); - displayWidgets(nWidgets("1110100001001110000100000001100010000")); +// 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11101000010011100001000000011000100000")); ui->txrb2->setEnabled(true); ui->txrb4->setEnabled(true); ui->txrb5->setEnabled(true); @@ -6230,7 +6239,8 @@ void MainWindow::on_actionFT8_triggered() ui->lh_decodes_title_label->setText(tr ("Band Activity")); ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message")); } - displayWidgets(nWidgets("1110100001001110000100001001100010000")); +// 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11101000010011100001000010011000100000")); ui->txrb2->setEnabled(true); ui->txrb4->setEnabled(true); ui->txrb5->setEnabled(true); @@ -6248,7 +6258,8 @@ void MainWindow::on_actionFT8_triggered() ui->cbAutoSeq->setEnabled(false); ui->tabWidget->setCurrentIndex(1); ui->TxFreqSpinBox->setValue(300); - displayWidgets(nWidgets("1110100001001110000100000000001000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11101000010011100001000000000010000000")); ui->labDXped->setText(tr ("Fox")); on_fox_log_action_triggered(); } @@ -6258,7 +6269,8 @@ void MainWindow::on_actionFT8_triggered() ui->cbAutoSeq->setEnabled(false); ui->tabWidget->setCurrentIndex(0); ui->cbHoldTxFreq->setChecked(true); - displayWidgets(nWidgets("1110100001001100000100000000001100000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11101000010011000001000000000011000000")); ui->labDXped->setText(tr ("Hound")); ui->txrb1->setChecked(true); ui->txrb2->setEnabled(false); @@ -6333,9 +6345,10 @@ void MainWindow::on_actionJT4_triggered() ui->sbSubmode->setValue(0); } if(bVHF) { - displayWidgets(nWidgets("1111100100101101101111000000000000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11111001001011011011110000000000000000")); } else { - displayWidgets(nWidgets("1110100000001100001100000000000000000")); + displayWidgets(nWidgets("11101000000011000011000000000000000000")); } fast_config(false); statusChanged(); @@ -6392,9 +6405,10 @@ void MainWindow::on_actionJT9_triggered() ui->lh_decodes_title_label->setText(tr ("Band Activity")); ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); if(bVHF) { - displayWidgets(nWidgets("1111101010001111100100000000000000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11111010100011111001000000000000000000")); } else { - displayWidgets(nWidgets("1110100000001110000100000000000010000")); + displayWidgets(nWidgets("11101000000011100001000000000000100000")); } fast_config(m_bFastMode); ui->cbAutoSeq->setVisible(m_bFast9); @@ -6440,9 +6454,10 @@ void MainWindow::on_actionJT65_triggered() ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); } if(bVHF) { - displayWidgets(nWidgets("1111100100001101101011000100000000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11111001000011011010110001000000000000")); } else { - displayWidgets(nWidgets("1110100000001110000100000000000010000")); + displayWidgets(nWidgets("11101000000011100001000000000000100000")); } fast_config(false); if(ui->cbShMsgs->isChecked()) { @@ -6477,8 +6492,8 @@ void MainWindow::on_actionQ65_triggered() m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value()); m_wideGraph->setTxFreq(ui->TxFreqSpinBox->value()); switch_mode (Modes::Q65); -// 0123456789012345678901234567890123456 - displayWidgets(nWidgets("1111110101101101001110000001000000001")); +// 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11111101011011010011100000010000000011")); ui->labDXped->setText(""); ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes")); ui->rh_decodes_title_label->setText(tr ("Average Decodes")); @@ -6549,7 +6564,8 @@ void MainWindow::on_actionMSK144_triggered() ui->rptSpinBox->setValue(0); ui->rptSpinBox->setSingleStep(1); ui->sbFtol->values ({20, 50, 100, 200}); - displayWidgets(nWidgets("1011111101000000000100010000100000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("10111111010000000001000100001000000000")); fast_config(m_bFastMode); statusChanged(); @@ -6590,7 +6606,8 @@ void MainWindow::on_actionWSPR_triggered() m_bFastMode=false; m_bFast9=false; ui->TxFreqSpinBox->setValue(ui->WSPRfreqSpinBox->value()); - displayWidgets(nWidgets("0000000000000000010100000000000000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("00000000000000000101000000000000000000")); fast_config(false); statusChanged(); } @@ -6623,7 +6640,8 @@ void MainWindow::on_actionEcho_triggered() m_bFast9=false; WSPR_config(true); ui->lh_decodes_headings_label->setText(" UTC N Level Sig DF Width Q"); - displayWidgets(nWidgets("0000000000000000000000100000000000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("00000000000000000000001000000000000000")); fast_config(false); statusChanged(); } @@ -6649,7 +6667,8 @@ void MainWindow::on_actionFreqCal_triggered() // 18:15:47 0 1 1500 1550.349 0.100 3.5 10.2 ui->lh_decodes_headings_label->setText(" UTC Freq CAL Offset fMeas DF Level S/N"); ui->measure_check_box->setChecked (false); - displayWidgets(nWidgets("0011010000000000000000000000010000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("00110100000000000000000000000100000000")); statusChanged(); } @@ -8579,6 +8598,7 @@ void MainWindow::on_sbNlist_valueChanged(int n) void MainWindow::on_sbNslots_valueChanged(int n) { m_Nslots=n; + if(m_config.special_op_id()!=SpecOp::FOX) return; QString t; t = t.asprintf(" NSlots %d",m_Nslots); writeFoxQSO(t); @@ -8587,6 +8607,7 @@ void MainWindow::on_sbNslots_valueChanged(int n) void MainWindow::on_sbMax_dB_valueChanged(int n) { m_max_dB=n; + if(m_config.special_op_id()!=SpecOp::FOX) return; QString t; t = t.asprintf(" Max_dB %d",m_max_dB); writeFoxQSO(t); @@ -8594,6 +8615,7 @@ void MainWindow::on_sbMax_dB_valueChanged(int n) void MainWindow::on_pbFoxReset_clicked() { + if(m_config.special_op_id()!=SpecOp::FOX) return; auto button = MessageBox::query_message (this, tr ("Confirm Reset"), tr ("Are you sure you want to clear the QSO queues?")); if(button == MessageBox::Yes) { diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index cdd67da70..0185d75d7 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -157,6 +157,7 @@ private slots: void on_actionFT8_DXpedition_Mode_User_Guide_triggered(); void on_actionQSG_FST4_triggered(); void on_actionQSG_Q65_triggered(); + void on_actionQSG_X250_M3_triggered(); void on_actionOnline_User_Guide_triggered(); void on_actionLocal_User_Guide_triggered(); void on_actionWide_Waterfall_triggered(); diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index 35f64d91b..8f787d5ae 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -1677,6 +1677,22 @@ When not checked you can view the calibration results. + + + + Maximum drift rate in units of symbol rate per transmission. + + + Max Drift + + + 50 + + + 5 + + + @@ -2876,6 +2892,7 @@ Double-click to reset to the standard 73 message + @@ -3407,6 +3424,11 @@ Double-click to reset to the standard 73 message Auto Clear Avg after decode + + + Quick-Start Guide to WSJT-X 2.5.0 and MAP65 3.0 + + diff --git a/wsjtx_config.h.in b/wsjtx_config.h.in index c54819ea4..592d9b6b7 100644 --- a/wsjtx_config.h.in +++ b/wsjtx_config.h.in @@ -32,6 +32,16 @@ extern "C" { #cmakedefine01 HAVE_HAMLIB_OLD_CACHING #cmakedefine01 HAVE_HAMLIB_CACHING +#cmakedefine HAVE_STDIO_H 1 +#cmakedefine STDC_HEADERS 1 +#cmakedefine HAVE_STDLIB_H 1 +#cmakedefine HAVE_UNISTD_H 1 +#cmakedefine HAVE_SYS_IOCTL_H 1 +#cmakedefine HAVE_FCNTL_H 1 +#cmakedefine HAVE_SYS_STAT_H 1 +#cmakedefine HAVE_LINUX_PPDEV_H 1 +#cmakedefine HAVE_DEV_PPBUS_PPI_H 1 + #cmakedefine01 WSJT_SHARED_RUNTIME #cmakedefine01 WSJT_SOFT_KEYING #cmakedefine01 WSJT_ENABLE_EXPERIMENTAL_FEATURES