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 (int)(8*sizeof(DTYPE))) +======= + if(symsize > 8*sizeof(DTYPE)) +>>>>>>> 280c8344cd80339491e9bad1dcc4ac9a1e5f684e:map65/libm65/init_rs.c 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/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..7cc4693d4 --- /dev/null +++ b/map65/CMakeLists.txt @@ -0,0 +1,165 @@ +cmake_minimum_required (VERSION 2.8.9) + +project (map65 C CXX Fortran) + +set (MAP65_VERSION_MAJOR 1) +set (MAP65_VERSION_MINOR 3) + +if (POLICY CMP0020) + cmake_policy (SET CMP0020 NEW) # link to Qt winmain on Windows +endif (POLICY CMP0020) + +# make sure that the default is a RELEASE +if (NOT CMAKE_BUILD_TYPE) + set (CMAKE_BUILD_TYPE RELEASE CACHE STRING + "Choose the type of build, options are: None Debug Release." + FORCE) +endif (NOT CMAKE_BUILD_TYPE) + +# C++ setup + +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") + +set (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 (CXXSRCS ${CXXSRCS} killbyname.cpp) +endif (WIN32) + +set (CSRCS + paInputDevice.c + pa_get_device_info.c +) + +set_property (SOURCE ${CXXSRCS} ${CSRCS} APPEND PROPERTY COMPILE_FLAGS "-include map65_config.h") + +set (UISRCS + about.ui + astro.ui + bandmap.ui + devsetup.ui + mainwindow.ui + messages.ui + txtune.ui + widegraph.ui +) + +# sort out pre-requisites + +# libfftw3 setup + +find_path (fftw3f_INCLUDES fftw3.f) +find_library (fftw3f_LIBRARIES NAMES fftw3f fftw3f-3) +include_directories (${fftw3f_INCLUDES}) + +if (WIN32) + find_library (usb_RUNTIME NAMES usb0 PATH_SUFFIXES bin) + set (CMAKE_INSTALL_PREFIX C:/MAP65) +endif (WIN32) + +# Qt5 setup + +# Widgets finds its own dependencies. +find_package (Qt5Widgets REQUIRED) +find_package (Qt5Multimedia REQUIRED) + +# Tell CMake to run moc when necessary +set (CMAKE_AUTOMOC ON) + +# don't use Qt "keywords" signal, slot, emit in generated files to +# avoid compatability issue with other libraries +#ADD_DEFINITIONS (-DQT_NO_KEYWORDS) + +# As moc files are generated in the binary dir, tell CMake to always +# look for includes there: +set (CMAKE_INCLUDE_CURRENT_DIR ON) + +# project definitions +add_definitions (-DQT5) +if (CMAKE_HOST_UNIX) + add_definitions (-DUNIX) +elseif (CMAKE_HOST_WIN32) + add_definitions (-DWIN32) +endif () + +#set_property (DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELEASE QT_NO_DEBUG_OUTPUT QT_NO_WARNING_OUTPUT) +set_property (DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELEASE QT_NO_WARNING_OUTPUT) + +# build the subdirectories +add_subdirectory (libm65) + +# UI generation +qt5_wrap_ui (GENUISRCS ${UISRCS}) + +add_executable (map65 ${CXXSRCS} ${CSRCS} ${GENUISRCS} map65.rc) +target_link_libraries (map65 m65impl ${fftw3f_LIBRARIES} ${CMAKE_CURRENT_SOURCE_DIR}/palir-02.dll ${CMAKE_CURRENT_SOURCE_DIR}/libusb0.dll ${CMAKE_CURRENT_SOURCE_DIR}/libwsock32.a) + +if (WIN32) + target_link_libraries (map65) +# set_target_properties (map65 PROPERTIES LINK_FLAGS_RELEASE "${LINKER_FLAGS_RELEASE} ") + set_target_properties (map65 PROPERTIES LINK_FLAGS_RELEASE "${LINKER_FLAGS_RELEASE} -mwindows") +endif (WIN32) +qt5_use_modules (map65 Widgets Multimedia OpenGL) + + +install ( + TARGETS map65 + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ) + +# install (DIRECTORY Palettes DESTINATION bin PATTERN *.pal) +# install (DIRECTORY samples DESTINATION bin/save) + +install (FILES +# CALL3.TXT +# prefixes.txt + DESTINATION bin + ) + +if (WIN32) + install ( + FILES ${fftw3f_LIBRARIES} ${usb_RUNTIME} + DESTINATION bin COMPONENT Runtime + ) +endif (WIN32) + +# a custom target that is always built +ADD_CUSTOM_TARGET (revisiontag ALL) + +# creates svnversion.h using cmake script +ADD_CUSTOM_COMMAND (TARGET revisiontag COMMAND ${CMAKE_COMMAND} + -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} + -P ${CMAKE_CURRENT_SOURCE_DIR}/getsvn.cmake) + +# explicitly say that the executable depends on custom target +add_dependencies(map65 revisiontag) + +# versioning + +configure_file ( + "${PROJECT_SOURCE_DIR}/map65_config.h.in" + "${PROJECT_BINARY_DIR}/map65_config.h" + ) + +include_directories ("${PROJECT_BINARY_DIR}") 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..79b03168a --- /dev/null +++ b/map65/about.cpp @@ -0,0 +1,23 @@ +#include "about.h" +#include "ui_about.h" + +CAboutDlg::CAboutDlg(QWidget *parent, QString Revision) : + QDialog(parent), + m_Revision(Revision), + ui(new Ui::CAboutDlg) +{ + ui->setupUi(this); + ui->labelTxt->clear(); + m_Str = "

" + m_Revision + "

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

"; + m_Str += "Copyright 2001-2021 by Joe Taylor, K1JT. Additional
"; + m_Str += "acknowledgments are contained in the source code.
"; + ui->labelTxt->setText(m_Str); +} + +CAboutDlg::~CAboutDlg() +{ + delete ui; +} diff --git a/map65/about.h b/map65/about.h new file mode 100644 index 000000000..ca45d1996 --- /dev/null +++ b/map65/about.h @@ -0,0 +1,24 @@ +#ifndef ABOUTDLG_H +#define ABOUTDLG_H + +#include + +namespace Ui { + class CAboutDlg; +} + +class CAboutDlg : public QDialog +{ + Q_OBJECT + +public: + explicit CAboutDlg(QWidget *parent=0, QString Revision=""); + ~CAboutDlg(); + +private: + QString m_Revision; + 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..d2ed43771 --- /dev/null +++ b/map65/about.ui @@ -0,0 +1,41 @@ + + + CAboutDlg + + + Qt::NonModal + + + + 0 + 0 + 374 + 164 + + + + + 0 + 0 + + + + About MAP65 + + + + + 20 + 10 + 331 + 131 + + + + + + + + + + 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..b8c22fa52 --- /dev/null +++ b/map65/astro.cpp @@ -0,0 +1,106 @@ +#include "astro.h" +#include "ui_astro.h" +#include +#include +#include +#include +#include "commons.h" + +Astro::Astro(QWidget *parent) : + QWidget(parent), + ui(new Ui::Astro) +{ + ui->setupUi(this); + ui->astroTextBrowser->setStyleSheet( + "QTextBrowser { background-color : cyan; color : black; }"); + ui->astroTextBrowser->clear(); + m_AzElDir0=""; +} + +Astro::~Astro() +{ + delete ui; +} + +void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, + int fQSO, int nsetftx, int ntxFreq, QString azelDir) +{ + static int ntxFreq0=-99; + static bool astroBusy=false; + 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; + + if(!astroBusy) { + astroBusy=true; + 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); + astroBusy=false; + } + + 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..0568a878f --- /dev/null +++ b/map65/astro.h @@ -0,0 +1,36 @@ +#ifndef ASTRO_H +#define ASTRO_H + +#include +#include + +namespace Ui { + class Astro; +} + +class Astro : public QWidget +{ + Q_OBJECT + +public: + explicit Astro(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_AzElDir0; +}; + +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); +} + +#endif // ASTRO_H 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..49b681259 --- /dev/null +++ b/map65/bandmap.cpp @@ -0,0 +1,89 @@ +#include "bandmap.h" +#include "ui_bandmap.h" +#include + +BandMap::BandMap(QWidget *parent) : + QWidget(parent), + ui(new Ui::BandMap) +{ + ui->setupUi(this); + ui->bmTextBrowser->setStyleSheet( + "QTextBrowser { background-color : #000066; color : red; }"); + m_bandMapText=""; + ui->bmTextBrowser->clear(); +} + +BandMap::~BandMap() +{ + 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", QString::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..2c3f8a21e --- /dev/null +++ b/map65/bandmap.h @@ -0,0 +1,34 @@ +#ifndef BANDMAP_H +#define BANDMAP_H + +#include + +namespace Ui { + class BandMap; +} + +class BandMap : public QWidget +{ + Q_OBJECT + +public: + explicit BandMap(QWidget *parent = 0); + void setText(QString t); + void setColors(QString t); + + ~BandMap(); + +protected: + void resizeEvent(QResizeEvent* event); + +private: + Ui::BandMap *ui; + QString m_bandMapText; + QString m_colorBackground; + QString m_color0; + QString m_color1; + QString m_color2; + QString m_color3; +}; + +#endif // BANDMAP_H 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..c94050d55 --- /dev/null +++ b/map65/commons.h @@ -0,0 +1,44 @@ +#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 + 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..e4617c5bd --- /dev/null +++ b/map65/devsetup.cpp @@ -0,0 +1,354 @@ +#include "devsetup.h" +#include "mainwindow.h" +#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[60]; + 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[50]; + 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(); + + t.sprintf("QLabel{background-color: #%2.2x%2.2x%2.2x;" + "color: #%2.2x%2.2x%2.2x}",r,g,b,r0,g0,b0); + ui.lab0->setStyleSheet(t); + t.sprintf("QLabel{background-color: #%2.2x%2.2x%2.2x;" + "color: #%2.2x%2.2x%2.2x}",r,g,b,r1,g1,b1); + ui.lab1->setStyleSheet(t); + t.sprintf("QLabel{background-color: #%2.2x%2.2x%2.2x;" + "color: #%2.2x%2.2x%2.2x}",r,g,b,r2,g2,b2); + ui.lab2->setStyleSheet(t); + t.sprintf("QLabel{background-color: #%2.2x%2.2x%2.2x;" + "color: #%2.2x%2.2x%2.2x}",r,g,b,r3,g3,b3); + ui.lab3->setStyleSheet(t); + + m_colors.sprintf("%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x" + "%2.2x%2.2x%2.2x",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/fftw3.f b/map65/fftw3.f new file mode 100644 index 000000000..3410184ca --- /dev/null +++ b/map65/fftw3.f @@ -0,0 +1,64 @@ + INTEGER FFTW_R2HC + PARAMETER (FFTW_R2HC=0) + INTEGER FFTW_HC2R + PARAMETER (FFTW_HC2R=1) + INTEGER FFTW_DHT + PARAMETER (FFTW_DHT=2) + INTEGER FFTW_REDFT00 + PARAMETER (FFTW_REDFT00=3) + INTEGER FFTW_REDFT01 + PARAMETER (FFTW_REDFT01=4) + INTEGER FFTW_REDFT10 + PARAMETER (FFTW_REDFT10=5) + INTEGER FFTW_REDFT11 + PARAMETER (FFTW_REDFT11=6) + INTEGER FFTW_RODFT00 + PARAMETER (FFTW_RODFT00=7) + INTEGER FFTW_RODFT01 + PARAMETER (FFTW_RODFT01=8) + INTEGER FFTW_RODFT10 + PARAMETER (FFTW_RODFT10=9) + INTEGER FFTW_RODFT11 + PARAMETER (FFTW_RODFT11=10) + INTEGER FFTW_FORWARD + PARAMETER (FFTW_FORWARD=-1) + INTEGER FFTW_BACKWARD + PARAMETER (FFTW_BACKWARD=+1) + INTEGER FFTW_MEASURE + PARAMETER (FFTW_MEASURE=0) + INTEGER FFTW_DESTROY_INPUT + PARAMETER (FFTW_DESTROY_INPUT=1) + INTEGER FFTW_UNALIGNED + PARAMETER (FFTW_UNALIGNED=2) + INTEGER FFTW_CONSERVE_MEMORY + PARAMETER (FFTW_CONSERVE_MEMORY=4) + INTEGER FFTW_EXHAUSTIVE + PARAMETER (FFTW_EXHAUSTIVE=8) + INTEGER FFTW_PRESERVE_INPUT + PARAMETER (FFTW_PRESERVE_INPUT=16) + INTEGER FFTW_PATIENT + PARAMETER (FFTW_PATIENT=32) + INTEGER FFTW_ESTIMATE + PARAMETER (FFTW_ESTIMATE=64) + INTEGER FFTW_ESTIMATE_PATIENT + PARAMETER (FFTW_ESTIMATE_PATIENT=128) + INTEGER FFTW_BELIEVE_PCOST + PARAMETER (FFTW_BELIEVE_PCOST=256) + INTEGER FFTW_DFT_R2HC_ICKY + PARAMETER (FFTW_DFT_R2HC_ICKY=512) + INTEGER FFTW_NONTHREADED_ICKY + PARAMETER (FFTW_NONTHREADED_ICKY=1024) + INTEGER FFTW_NO_BUFFERING + PARAMETER (FFTW_NO_BUFFERING=2048) + INTEGER FFTW_NO_INDIRECT_OP + PARAMETER (FFTW_NO_INDIRECT_OP=4096) + INTEGER FFTW_ALLOW_LARGE_GENERIC + PARAMETER (FFTW_ALLOW_LARGE_GENERIC=8192) + INTEGER FFTW_NO_RANK_SPLITS + PARAMETER (FFTW_NO_RANK_SPLITS=16384) + INTEGER FFTW_NO_VRANK_SPLITS + PARAMETER (FFTW_NO_VRANK_SPLITS=32768) + INTEGER FFTW_NO_VRECURSE + PARAMETER (FFTW_NO_VRECURSE=65536) + INTEGER FFTW_NO_SIMD + PARAMETER (FFTW_NO_SIMD=131072) 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..751c87fe8 --- /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[50]; + 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) { + fread(&datcom_.fcenter,sizeof(datcom_.fcenter),1,fp); + fread(id,2,npts,fp); + 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..e615f2347 --- /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 iLen,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..acc5bc228 --- /dev/null +++ b/map65/libm65/decode0.f90 @@ -0,0 +1,67 @@ +subroutine decode0(dd,ss,savg,nstandalone) + + parameter (NSMAX=60*96000) + parameter (NFFT=32768) + + 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,mycall,mygrid,hiscall,hisgrid,datetime + common/tracer/ limtrace,lu + 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,ndiskdat,nfshift,ndphi, & + nfcal,nkeep,mcall3b,nsum,nsave,nxant,rmsdd,mycall,mygrid, & + neme,ndepth,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..6675c2ceb --- /dev/null +++ b/map65/libm65/decode1a.f90 @@ -0,0 +1,154 @@ +subroutine decode1a(dd,newdat,f0,nflip,mode65,nfsample,xpol, & + mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi,ndphi,iloop, & + nutc,nkhz,ndf,ipol,ntol,bq65,sync2,a,dt,pol,nkv,nhist,nsum,nsave, & + qual,decoded) + +! Apply AFC corrections to a candidate JT65 signal, then decode it. + + 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,bq65 + 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(nqd.eq.2) 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 + call timer('fil6521 ',0) +! 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 + call timer('fil6521 ',1) + + 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. + call timer('afc65b ',0) +! Best fit for DF, f1, f2, pol + call afc65b(c5x(i0),c5y(i0),nz,fsample,nflip,ipol,xpol, & + ndphi,iloop,a,ccfbest,dtbest) + call timer('afc65b ',1) + + 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 timer('twkfreq_',0) + call twkfreq_xy(cx,cy,n5,a) + call timer('twkfreq_',1) + +! 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 + + call timer('sh_ffts ',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=j+1 + 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 + + call timer('sh_ffts ',1) + + 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..29c76dc4a --- /dev/null +++ b/map65/libm65/display.f90 @@ -0,0 +1,170 @@ +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(utc2,kz,indx2) + k3=0 + do k=1,kz + k3=min(k3+1,400) + line3(k3)=line2(indx2(k)) + enddo + nstart=0 + else + call indexx(utc2,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(utc2,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) + if(iw.lt.MAXLINES-1) iw=iw+1 + 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..152d69349 --- /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,fnamedate*6 + 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]=1000.0*pp2/pp1; + 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_wave.f90 b/map65/libm65/gen_q65_wave.f90 new file mode 100644 index 000000000..e84ec2641 --- /dev/null +++ b/map65/libm65/gen_q65_wave.f90 @@ -0,0 +1,77 @@ +subroutine gen_q65_wave(msg,ichk,ntxfreq,mode65,itype,msgsent,iwave,nwave) + +! Encodes a QRA64 message to yield complex iwave() at fsample = 11025 Hz + + use packjt + parameter (NMAX=2*60*11025) + character*22 msg + character*22 msgsent !Message as it will be received + character*120 cmnd + character*80 wsjtx_dir + character*16 cjunk + real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,tsym + integer itone(85) + integer dgen(13) + integer sent(63) + integer*2 iwave(NMAX) + integer icos7(0:6) + logical first + data icos7/2,5,6,0,4,1,3/ !Defines a 7x7 Costas array + data twopi/6.283185307179586476d0/,first/.true./ + save + + if(first) then + open(9,file='wsjtx_dir.txt',status='old') + read(9,*) wsjtx_dir + close(9) + first=.false. + endif + + msgsent=msg +! 1 2 3 4 5 +! 12345678901234567890123456789012345678901234567890123456789012345 + cmnd='q65sim "K1ABC W9XYZ EN37 " A 1500 0 0 0 0 60 0 99 >itone.txt' + cmnd(9:30)=msg + write(cmnd(35:38),'(i4)') ntxfreq + cmnd=trim(wsjtx_dir)//cmnd + call execute_command_line(cmnd) + open(9,file='itone.txt',status='old') + do i=1,99 + read(9,1000,end=999) cjunk +1000 format(a16) + if(cjunk.eq.'Channel symbols:') exit + enddo + read(9,1002) itone +1002 format(20i3) + +! 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/genqra64a.f90 b/map65/libm65/genqra64a.f90 new file mode 100644 index 000000000..c32279dfd --- /dev/null +++ b/map65/libm65/genqra64a.f90 @@ -0,0 +1,87 @@ +subroutine genqra64a(msg0,ichk,ntxfreq,mode64,itype,msgsent,iwave,nwave) + +! Encodes a QRA64 message to yield itone(1:84) + + use packjt + parameter (NMAX=2*60*11025) + character*22 msg0 + character*22 message !Message to be generated + character*22 msgsent !Message as it will be received + integer itone(84) + character*3 cok !' ' or 'OOO' + real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,samfac,tsym + integer dgen(13) + integer sent(63) + 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 + + if(msg0(1:1).eq.'@') then + read(msg0(2:5),*,end=1,err=1) nfreq + go to 2 +1 nfreq=1000 +2 itone(1)=nfreq + write(msgsent,1000) nfreq +1000 format(i5,' Hz') + else + message=msg0 + do i=1,22 + if(ichar(message(i:i)).eq.0) then + message(i:)=' ' + exit + endif + enddo + + do i=1,22 !Strip leading blanks + if(message(1:1).ne.' ') exit + message=message(i+1:) + enddo + + call chkmsg(message,cok,nspecial,flip) + call packmsg(message,dgen,itype) !Pack message into 72 bits + call unpackmsg(dgen,msgsent) !Unpack to get message sent + if(ichk.ne.0) go to 999 !Return if checking only + call qra64_enc(dgen,sent) !Encode using QRA64 + + nsync=10 + itone(1:7)=nsync*icos7 !Insert 7x7 Costas array in 3 places + itone(8:39)=sent(1:32) + itone(40:46)=nsync*icos7 + itone(47:77)=sent(33:63) + itone(78:84)=nsync*icos7 + endif + +! Set up necessary constants + nsym=84 + tsym=6912.d0/12000.d0 + samfac=1.d0 + dt=1.d0/(samfac*11025.d0) + f0=ntxfreq + ndf=2**(mode64-1) + dfgen=ndf*12000.d0/6912.d0 + phi=0.d0 + dphi=twopi*dt*f0 + i=0 + iz=84*6912*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 genqra64a 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..b9e0522f5 --- /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 + 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 + 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..3ecd91121 --- /dev/null +++ b/map65/libm65/init_rs.c @@ -0,0 +1,124 @@ +/* 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; + +<<<<<<< HEAD:lib/init_rs.c + /* Check parameter ranges */ + if(symsize < 0 || symsize > (int)(8*sizeof(DTYPE))) +======= + if(symsize > 8*sizeof(DTYPE)) +>>>>>>> 280c8344cd80339491e9bad1dcc4ac9a1e5f684e:map65/libm65/init_rs.c + 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..336f7928a --- /dev/null +++ b/map65/libm65/iqfix.f90 @@ -0,0 +1,29 @@ +subroutine iqfix(c,nfft,gain,phase) + + complex c(0:nfft-1) + complex z,h,u,v + real*8 sq1,sq2 + + 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..920818a6f --- /dev/null +++ b/map65/libm65/m65.f90 @@ -0,0 +1,134 @@ +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. + + parameter (NSMAX=60*96000) + parameter (NFFT=32768) + integer*2 i2(4,87) + real*8 hsym + real*4 ssz5a(NFFT) + logical*1 lstrong(0:1023) + common/tracer/limtrace,lu + 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(36) + 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,mycall,mygrid,hiscall,hisgrid,datetime + + nargs=iargc() + if(nargs.lt.1 .or. nargs.eq.2) then + print*,'Usage: m65 <95238|96000> file1 [file2 ...]' + print*,' (Reads data from *.tf2 files.)' + 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 + call ftnquit + go to 999 + endif +!### These need fixing: + if(arg(1:1).eq.'A') nmode=1 + if(arg(1:1).eq.'B') nmode=2 + if(arg(1:1).eq.'C') nmode=3 +!### + nfsample=96000 + call getarg(2,arg) + if(arg.eq.'95238') then + nfsample=95238 + call getarg(3,arg) + endif + + nxpol=1 + ifile1=3 + limtrace=0 + lu=12 + nfa=100 + nfb=162 + nfshift=6 + ndepth=2 + nfcal=344 + idphi=-50 + ntol=500 + nkeep=10 + + call ftninit('.') + + do ifile=ifile1,nargs + call getarg(ifile,infile) + open(10,file=infile,access='stream',status='old',err=998) + i1=index(infile,'.tf2') + 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 + nhsym0=-999 + k=0 + fcenter=144.125d0 + mousedf=0 + mousefqso=125 + newdat=1 + mycall='K1JT' + + if(ifile.eq.ifile1) call timer('m65 ',0) + do irec=1,9999999 + call timer('read_tf2',0) + read(10) i2 + call timer('read_tf2',1) + + call timer('float ',0) + do i=1,87 + k=k+1 + dd(1,k)=i2(1,i) + dd(2,k)=i2(2,i) + dd(3,k)=i2(3,i) + dd(4,k)=i2(4,i) + enddo + call timer('float ',1) + nhsym=(k-2048)/hsym + if(nhsym.ge.1 .and. nhsym.ne.nhsym0) then + ndiskdat=1 + nb=0 +! Emit signal readyForFFT + call timer('symspec ',0) + fgreen=-13.0 + iqadjust=0 + iqapply=0 + nbslider=100 + gainx=0.9962 + gainy=1.0265 + phasex=0.01426 + phasey=-0.01195 + 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 + if(ihsym.ge.278) go to 10 + endif + enddo + +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,nfsample) + enddo + + call timer('m65 ',1) + call timer('m65 ',101) + call ftnquit + go to 999 + +998 print*,'Cannot open file:' + print*,infile + +999 end program m65 diff --git a/map65/libm65/m65a.F90 b/map65/libm65/m65a.F90 new file mode 100644 index 000000000..21ea4019d --- /dev/null +++ b/map65/libm65/m65a.F90 @@ -0,0 +1,90 @@ +subroutine m65a + + interface + function address_m65() + integer*1, pointer :: address_m65 + end function address_m65 + end interface + + integer*1 attach_m65,lock_m65,unlock_m65 + integer size_m65 + integer*1, pointer :: p_m65 + character*80 cwd + logical fileExists + common/tracer/limtrace,lu + + call getcwd(cwd) + call ftninit(trim(cwd)) + 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) + call ftnquit + i=detach_m65() + 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) + +100 inquire(file=trim(cwd)//'/.lock',exist=fileExists) + if(fileExists) go to 10 + call sleep_msec(100) + go to 100 + +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) + integer*1 detach_m65 + 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,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..fd28fab3c --- /dev/null +++ b/map65/libm65/map65a.f90 @@ -0,0 +1,483 @@ +subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & + mousedf,mousefqso,nagain,ndecdone,ndiskdat,nfshift,ndphi, & + nfcal,nkeep,mcall3b,nsum,nsave,nxant,rmsdd,mycall,mygrid, & + neme,ndepth,hiscall,hisgrid,nhsym,nfsample,nxpol,nmode) + +! Processes timf2 data from Linrad to find and decode JT65 signals. + + parameter (MAXMSG=1000) !Size of decoded message list + parameter (NSMAX=60*96000) + parameter (NFFT=32768) + 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 + character decoded*22,blank*22,cmode*2 + real short(3,NFFT) !SNR dt ipol for potential shorthands + real qphi(12) + 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 + + mode65=mod(nmode,10) + if(mode65.eq.3) mode65=4 + mode64=nmode/10 + nwrite_q65=0 + bq65=mode64.gt.0 + mcall3a=mcall3b + mousefqso0=mousefqso + xpol=(nxpol.ne.0) + if(.not.xpol) ndphi=0 + nsum=0 + +!### Should use AppDir! ### +! open(23,file='release/CALL3.TXT',status='unknown') + 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 + + nqdz=1 + if(bq65 .and. nutc0.ge.0) nqdz=2 + if(nutc.ne.nutc0) nfile=nfile+1 + nutc0=nutc + + do nqd=nqdz,0,-1 + if(nqd.eq.2) then + fa=1000.0*fqso + fb=1000.0*fqso + else 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 999 + 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 + if(nqd.lt.2) then +! Look for JT65 sync patterns and shorthand square-wave patterns. + call timer('ccf65 ',0) + ssmax=smax + call ccf65(ss(1,1,i),nhsym,ssmax,sync1,ipol,jpz,dt, & + flipk,syncshort,snr2,ipol2,dt2) + call timer('ccf65 ',1) + +! ########################### 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 + 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(nqd.eq.2) 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 999 + 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,iloop,nutc,ikHz,idf,ipol,ntol,bq65,sync2, & + a,dt,pol,nkv,nhist,nsum,nsave,qual,decoded) + call timer('decode1a',1) + if(nqd.eq.2) then + call timer('q65 ',0) + call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz, & + mousedf,ntol,xpol,mycall,hiscall,hisgrid, & + mode64) + call timer('q65 ',1) + cycle + endif + + 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 + enddo + + 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 + + if(nwrite.eq.0 .and. nwrite_q65.eq.0) then + write(*,1012) mousefqso,nutc +1012 format('!',i3,9x,i6.4,' ') + endif + + endif + 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.ge.1) then + write(*,1013) nsum,nsave +1013 format('',2i4) + flush(6) + endif + if(nqd.eq.2 .and. mode65.eq.0) go to 999 + if(nagain.eq.1 .and. nqd.eq.1) go to 999 + enddo + +! 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 + write(26,1015) nutc +1015 format(37x,i6.4,' ') + call flush(21) + call flush(26) + call display(nkeep,ftol) + ndecdone=2 + +999 close(23) + ndphi=0 + nagain=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..5142584ab --- /dev/null +++ b/map65/libm65/mapsim.f90 @@ -0,0 +1,135 @@ +program mapsim + +! Generate simulated data for testing of MAP65 + + parameter (NMAX=96000*60) + 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 + character msg0*22,message*22,msgsent*22,arg*8,fname*13,mode*2 + + nargs=iargc() + if(nargs.ne.9) then + print*,'Usage: mapsim DT "message" mode f1 f2 nsigs pol SNR nfiles' + print*,'Example: 2.5 "CQ K1ABC FN42" B -22 33 20 45 -20 1' + print*,' ' + print*,'Enter message = "" to use entries in msgs.txt.' + print*,'Enter pol = -1 to generate a range of polarization angles.' + print*,'Enter SNR = 0 to generate a range of SNRs.' + go to 999 + endif + + call getarg(1,arg) + read(arg,*) dt0 !Time delay + call getarg(2,msg0) + message=msg0 !Transmitted message + call getarg(3,mode) !JT65 sub-mode (A B C B2 C2) + call getarg(4,arg) + read(arg,*) f1 !Lowest freq (kHz, relative to fcenter) + call getarg(5,arg) + read(arg,*) f2 !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 + call getarg(8,arg) + read(arg,*) snrdb !S/N + pol=npol + call getarg(9,arg) + read(arg,*) nfiles !Number of files + + 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 + mode65=1 + if(mode(1:1).eq.'B') mode65=2 + if(mode(1:1).eq.'C') mode65=4 + nfast=1 + if(mode(2:2).eq.'2') nfast=2 + npts=NMAX/nfast + open(12,file='msgs.txt',status='old') + + write(*,1000) +1000 format('File N freq S/N pol Message'/ & + '---------------------------------------------------') + + 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,'00') + 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.ne.' ') then + call cgen65(message,mode65,nfast,samfac,nsendingsh,msgsent,cwave,nwave) + endif + + rewind 12 + do isig=1,nsigs + + if(msg0.eq.' ') then + read(12,1004) message +1004 format(a22) + call cgen65(message,mode65,nfast,samfac,nsendingsh,msgsent, & + cwave,nwave) + endif + + if(npol.lt.0) pol=(isig-1)*180.0/nsigs + a=cos(pol/rad) + b=sin(pol/rad) + f=1000.0*(f1+f2)/2.0 + if(nsigs.gt.1) f=1000.0*(f1 + (isig-1)*(f2-f1)/(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,0.001*f,snrdbx,nint(pol),msgsent +1020 format(i3,i4,f8.3,f7.1,i5,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 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..4808949f4 --- /dev/null +++ b/map65/libm65/moondop.f90 @@ -0,0 +1,73 @@ +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 pvsun(6) + real*8 rme0(6) + logical km,bary + + 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/pctile.f90 b/map65/libm65/pctile.f90 new file mode 100644 index 000000000..92253cddf --- /dev/null +++ b/map65/libm65/pctile.f90 @@ -0,0 +1,22 @@ +subroutine pctile(x,npts,npct,xpct) + + parameter (NMAX=100000) + real*4 x(npts) + real*4 tmp(NMAX) + + if(npts.le.0) then + xpct=1.0 + go to 900 + endif + if(npts.gt.NMAX) stop + + tmp(1:npts)=x + call shell(npts,tmp) + j=nint(npts*0.01*npct) + if(j.lt.1) j=1 + if(j.gt.npts) j=npts + xpct=tmp(j) + +900 continue + return +end subroutine pctile 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..1c8c85606 --- /dev/null +++ b/map65/libm65/ptt_unix.c @@ -0,0 +1,391 @@ +/* + * 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_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(*ntx) { + ioctl(fd, TIOCMBIS, &control); /* Set DTR and RTS */ + *iptt = 1; + } else { + ioctl(fd, TIOCMBIC, &control); + *iptt = 0; + } + 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..0ab383f2a --- /dev/null +++ b/map65/libm65/q65b.f90 @@ -0,0 +1,146 @@ +subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & + mycall0,hiscall0,hisgrid,mode64) + + use wavhdr + 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-1) + logical xpol,first + real*8 fcenter + character*12 mycall0,hiscall0 + character*12 mycall,hiscall + character*6 hisgrid + character*4 grid4 + character*125 cmnd + character*62 line + character*80 line2 + character*40 msg40 + character*15 fname + character*80 wsjtx_dir + common/cacb/ca,cb + data first/.true./ + save + + if(first) then + open(9,file='wsjtx_dir.txt',status='old') + read(9,*) wsjtx_dir + close(9) + first=.false. + endif + + mycall='K1JT' + hiscall='IV3NWV' + grid4='AA00' + if(mycall0(1:1).ne.' ') mycall=mycall0 + if(hiscall0(1:1).ne.' ') hiscall=hiscall0 + if(hisgrid(1:4).ne.' ') grid4=hisgrid(1:4) + + 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 + ikhz0=nint(1000.0*(fcenter-int(fcenter))) + k0=((ikhz-ikhz0+48.0+0.27)*1000.0+nfcal+mousedf)/df + if(k0.lt.nh .or. k0.gt.nfft1-nh) go to 900 + + fac=1.0/nfft2 + cx(0:nh)=ca(k0:k0+nh) + cx(nh+1:nfft2-1)=ca(k0-nh+1:k0-1) + cx=fac*cx + if(xpol) then + cy(0:nh)=cb(k0:k0+nh) + cy(nh+1:nfft2-1)=cb(k0-nh+1:k0-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 + +! write(77,*) nutc,ikhz,mousedf,ntol + +! 1 2 3 4 5 6 7 8 9 10 +! 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901' + cmnd='jt9 -3 -X 32 -f 1079 -F 1000 -c MyCall -x HisCall -g FN42 000000_0001.wav > q65_decodes.txt' + write(cmnd(17:20),'(i4)') 1000 + write(cmnd(25:28),'(i4)') ntol + write(cmnd(33:44),'(a12)') mycall + write(cmnd(48:59),'(a12)') hiscall + write(cmnd(63:66),'(a4)') grid4 + fname='000000_0001.wav' + npol=1 + if(xpol) npol=4 + do ipol=1,npol + if(ipol.eq.1) cz=cx + if(ipol.eq.2) cz=0.707*(cx+cy) + if(ipol.eq.3) cz=cy + if(ipol.eq.4) cz=0.707*(cx-cy) + call four2a(cz,2*nfft2,1,1,-1) !Transform to time domain (real), fsample=12000 Hz + do i=0,nfft2-1 + j=nfft2-1-i + iwave(2*i+1)=nint(real(cz(j))) + iwave(2*i+2)=nint(aimag(cz(j))) + enddo + iwave(2*nfft2+1:)=0 + h=default_header(12000,NMAX) + write(fname(11:11),'(i1)') ipol + open(25,file=fname,access='stream',status='unknown') + write(25) h,iwave + close(25) + write(cmnd(78:78),'(i1)') ipol + if(ipol.eq.2) cmnd(84:84)='>' + call execute_command_line(trim(trim(wsjtx_dir)//cmnd)) + enddo + + open(24,file='q65_decodes.txt',status='unknown') +! 1 2 3 4 5 6 +! 1234567890123456789012345678901234567890123456789012345678901234567 +! 0001 -22 2.9 1081 : EA2AGZ IK4WLV -16 q0 +! 110 101 2 1814 2.9 -11 # QRZ HB9Q JN47 1 0 30 H + nsnr0=-99 + line2=' ' + do i=1,8 + read(24,1002,end=100) line +1002 format(a62) + if(line(1:4).eq.'. + +----------------------------------------------------------------------------- + +The code used by the QRA64 mode is the code: QRA13_64_64_IRR_E: K=13 +N=64 Q=64 irregular QRA code (defined in qra13_64_64_irr_e.{h,c}). + +This code has been designed to include a CRC as the 13th information +symbol and improve the code UER (Undetected Error Rate). The CRC +symbol is not sent along the channel (the codes are punctured) and the +resulting code is still a (12,63) code with an effective code rate of +R = 12/63. +*/ + +// OS dependent defines and includes ------------------------------------------ + +#if _WIN32 // note the underscore: without it, it's not msdn official! +// Windows (x64 and x86) +#include // required only for GetTickCount(...) +#include // _beginthread +#endif + +#if __linux__ +#include +#include + +unsigned GetTickCount(void) { + struct timespec ts; + unsigned theTick = 0U; + clock_gettime( CLOCK_REALTIME, &ts ); + theTick = ts.tv_nsec / 1000000; + theTick += ts.tv_sec * 1000; + return theTick; +} +#endif + +#if __APPLE__ +#endif + +#include +#include +#include + +#include "qra64.h" +#include "../qracodes/normrnd.h" // gaussian numbers generator + +// ---------------------------------------------------------------------------- + +// channel types +#define CHANNEL_AWGN 0 +#define CHANNEL_RAYLEIGH 1 +#define CHANNEL_FASTFADE 2 + +#define JT65_SNR_EBNO_OFFSET 29.1f // with the synch used in JT65 +#define QRA64_SNR_EBNO_OFFSET 31.0f // with the costas array synch + +void printwordd(char *msg, int *x, int size) +{ + int k; + printf("\n%s ",msg); + for (k=0;k-15) + if (channel_type == CHANNEL_AWGN) + for (k=0;k=0) { // decoded + printf("K1JT rx: received with apcode=%d %s\n",rc, decode_type[rc]); + +// Step 2a: K1JT replies to IV3NWV (with no grid) + printf("K1JT tx: IV3NWV K1JT\n"); + encodemsg_jt65(x,CALL_IV3NWV,CALL_K1JT, GRID_BLANK); + qra64_encode(codec_k1jt, y, x); + rx = mfskchannel(y,channel_type,EbNodB); + +// Step 2b: IV3NWV attempts to decode [? ? ?], [IV3NWV ? ?] or [IV3NWV ?] + rc = qra64_decode(codec_iv3nwv, 0, xdec,rx); + if (rc>=0) { // decoded + printf("IV3NWV rx: received with apcode=%d %s\n",rc, decode_type[rc]); + +// Step 3a: IV3NWV replies to K1JT with a 73 + printf("IV3NWV tx: K1JT IV3NWV 73\n"); + encodemsg_jt65(x,CALL_K1JT,CALL_IV3NWV, GRID_73); + qra64_encode(codec_iv3nwv, y, x); + rx = mfskchannel(y,channel_type,EbNodB); + +// Step 3b: K1JT attempts to decode [? ? ?] or [K1JT IV3NWV ?] + rc = qra64_decode(codec_k1jt, 0, xdec,rx); + if (rc>=0) { // decoded + printf("K1JT rx: received with apcode=%d %s\n",rc, decode_type[rc]); + +// Step 4a: K1JT replies to IV3NWV with a 73 + printf("K1JT tx: IV3NWV K1JT 73\n"); + encodemsg_jt65(x,CALL_IV3NWV,CALL_K1JT, GRID_73); + qra64_encode(codec_k1jt, y, x); + rx = mfskchannel(y,channel_type,EbNodB); + +// Step 4b: IV3NWV attempts to decode [? ? ?], [IV3NWV ? ?], or [IV3NWV ?] + rc = qra64_decode(codec_iv3nwv, 0, xdec,rx); + if (rc>=0) { // decoded + printf("IV3NWV rx: received with apcode=%d %s\n",rc, decode_type[rc]); + return 0; + } + } + } + } + printf("no decode\n"); + return -1; +} + +int test_proc_2(int channel_type, float EbNodB, int mode) +{ +/* +Here we simulate the decoder of K1JT after K1JT has sent a msg [IV3NWV K1JT] +and IV3NWV sends him the msg [K1JT IV3NWV JN66]. + +If mode=QRA_NOAP, K1JT decoder attempts to decode only msgs of type [? ? ?]. + +If mode=QRA_AUTOP, K1JT decoder will attempt to decode also the msgs +[K1JT IV3NWV] and [K1JT IV3NWV ?]. + +In the case a decode is successful the return code of the qra64_decode function +indicates the amount of a-priori information required to decode the received +message according to this table: + + rc=0 [? ? ?] AP0 + rc=1 [CQ ? ?] AP27 + rc=2 [CQ ? ] AP42 + rc=3 [CALL ? ?] AP29 + rc=4 [CALL ? ] AP44 + rc=5 [CALL CALL ?] AP57 + rc=6 [? CALL ?] AP29 + rc=7 [? CALL ] AP44 + rc=8 [CALL CALL GRID] AP72 + rc=9 [CQ CALL ?] AP55 + rc=10 [CQ CALL ] AP70 + rc=11 [CQ CALL GRID] AP70 + +The return code is <0 when decoding is unsuccessful + +This test simulates the situation ntx times and reports how many times +a particular type decode among the above 6 cases succeded. +*/ + + int x[QRA64_K], xdec[QRA64_K]; + int y[QRA64_N]; + float *rx; + float ebnodbest, ebnodbavg=0; + int rc,k; + + int ndecok[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + int nundet = 0; + int ntx = 200,ndec=0; + + qra64codec *codec_iv3nwv = qra64_init(mode); // codec for IV3NWV + qra64codec *codec_k1jt = qra64_init(mode); // codec for K1JT + + printf("\nQRA64 Test #2 - Decoding with AP knowledge (SNR-Eb/No offset = %.1f dB)\n\n", + QRA64_SNR_EBNO_OFFSET); + +// This will enable K1JT's decoder to look for calls directed to him [K1JT ? ?/b] +// printf("K1JT decoder enabled for [K1JT ? ?/blank]\n"); +// qra64_apset(codec_k1jt, CALL_K1JT,0,0,APTYPE_MYCALL); + +// This will enable K1JT's decoder to look for IV3NWV calls directed to him [K1JT IV3NWV ?/b] +// printf("K1JT decoder enabled for [K1JT IV3NWV ?]\n"); +// qra64_apset(codec_k1jt, CALL_CQ,CALL_IV3NWV,0,APTYPE_BOTHCALLS); + +// This will enable K1JT's decoder to look for msges sent by IV3NWV [? IV3NWV ?] +// printf("K1JT decoder enabled for [? IV3NWV ?/blank]\n"); +// qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_BLANK,APTYPE_HISCALL); + +// This will enable K1JT's decoder to look for full-knowledge [K1JT IV3NWV JN66] msgs + printf("K1JT decoder enabled for [K1JT IV3NWV JN66]\n"); + qra64_apset(codec_k1jt, CALL_K1JT,CALL_IV3NWV,GRID_JN66,APTYPE_FULL); + +// This will enable K1JT's decoder to look for calls from IV3NWV [CQ IV3NWV ?/b] msgs + printf("K1JT decoder enabled for [CQ IV3NWV ?/b/JN66]\n"); + qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_JN66,APTYPE_CQHISCALL); + + + // Dx station IV3NWV calls + printf("\nIV3NWV encoder sends msg: [K1JT IV3NWV JN66]\n\n"); + encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_JN66); + +// printf("\nIV3NWV encoder sends msg: [CQ IV3NWV JN66]\n\n"); +// encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_JN66); + +// printf("\nIV3NWV encoder sends msg: [CQ IV3NWV]\n\n"); +// encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_BLANK); + qra64_encode(codec_iv3nwv, y, x); + + printf("Simulating K1JT decoder up to AP72\n"); + + for (k=0;k=0) { + ebnodbavg +=ebnodbest; + if (memcmp(xdec,x,12*sizeof(int))==0) + ndecok[rc]++; + else + nundet++; + } + } + printf("\n\n"); + + + printf("Transimtted msgs:%d\nDecoded msgs:\n\n",ntx); + for (k=0;k<12;k++) { + printf("%3d with %s\n",ndecok[k],decode_type[k]); + ndec += ndecok[k]; + } + printf("\nTotal: %d/%d (%d undetected errors)\n\n",ndec,ntx,nundet); + printf(""); + + ebnodbavg/=(ndec+nundet); + printf("Estimated SNR (average in dB) = %.2f dB\n\n",ebnodbavg-QRA64_SNR_EBNO_OFFSET); + + return 0; +} + +int test_fastfading(float EbNodB, float B90, int fadingModel, int submode, int apmode, int olddec, int channel_type, int ntx) +{ + int x[QRA64_K], xdec[QRA64_K]; + int y[QRA64_N]; + float *rx; + float ebnodbest, ebnodbavg=0; + int rc,k; + float rxolddec[QRA64_N*QRA64_M]; // holds the energies at nominal tone freqs + + int ndecok[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + int nundet = 0; + int ndec=0; + + qra64codec *codec_iv3nwv; + qra64codec *codec_k1jt; + + codec_iv3nwv=qra64_init(QRA_NOAP); + codec_k1jt =qra64_init(apmode); + + if (channel_type==2) { // fast-fading case + printf("Simulating the fast-fading channel\n"); + printf("B90=%.2f Hz - Fading Model=%s - Submode=QRA64%c\n",B90,fadingModel?"Lorentz":"Gauss",submode+'A'); + printf("Decoder metric = %s\n",olddec?"AWGN":"Matched to fast-fading signal"); + } + else { + printf("Simulating the %s channel\n",channel_type?"Rayleigh block fading":"AWGN"); + printf("Decoder metric = AWGN\n"); + } + + + printf("\nEncoding msg [K1JT IV3NWV JN66]\n"); + encodemsg_jt65(x,CALL_K1JT,CALL_IV3NWV,GRID_JN66); +// printf("["); +// for (k=0;k<11;k++) printf("%02hX ",x[k]); printf("%02hX]\n",x[11]); + + qra64_encode(codec_iv3nwv, y, x); + printf("%d transmissions will be simulated\n\n",ntx); + + if (apmode==QRA_USERAP) { + // This will enable K1JT's decoder to look for cq/qrz calls [CQ/QRZ ? ?/b] + printf("K1JT decoder enabled for [CQ ? ?/blank]\n"); + qra64_apset(codec_k1jt, CALL_K1JT,0,0,APTYPE_CQQRZ); + + // This will enable K1JT's decoder to look for calls directed to him [K1JT ? ?/b] + printf("K1JT decoder enabled for [K1JT ? ?/blank]\n"); + qra64_apset(codec_k1jt, CALL_K1JT,0,0,APTYPE_MYCALL); + + // This will enable K1JT's decoder to look for msges sent by IV3NWV [? IV3NWV ?] + printf("K1JT decoder enabled for [? IV3NWV ?/blank]\n"); + qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_BLANK,APTYPE_HISCALL); + + // This will enable K1JT's decoder to look for IV3NWV calls directed to him [K1JT IV3NWV ?/b] + printf("K1JT decoder enabled for [K1JT IV3NWV ?]\n"); + qra64_apset(codec_k1jt, CALL_K1JT,CALL_IV3NWV,0,APTYPE_BOTHCALLS); + + // This will enable K1JT's decoder to look for full-knowledge [K1JT IV3NWV JN66] msgs + printf("K1JT decoder enabled for [K1JT IV3NWV JN66]\n"); + qra64_apset(codec_k1jt, CALL_K1JT,CALL_IV3NWV,GRID_JN66,APTYPE_FULL); + + // This will enable K1JT's decoder to look for calls from IV3NWV [CQ IV3NWV ?/b] msgs + printf("K1JT decoder enabled for [CQ IV3NWV ?/b/JN66]\n"); + qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_JN66,APTYPE_CQHISCALL); + + } + + printf("\nNow decoding with K1JT's decoder...\n"); +/* + if (channel_type==2) // simulate a fast-faded signal + printf("Simulating a fast-fading channel with given B90 and spread type\n"); + else + printf("Simulating a %s channel\n",channel_type?"Rayleigh block fading":"AWGN"); +*/ + for (k=0;k=0) { + ebnodbavg +=ebnodbest; + if (memcmp(xdec,x,12*sizeof(int))==0) + ndecok[rc]++; + else { + fprintf(stderr,"\nUndetected error with rc=%d\n",rc); + nundet++; + } + } + + } + printf(" %5.1f %%\r",100.0*k/ntx); + + printf("\n\n"); + + printf("Msgs transmitted:%d\nMsg decoded:\n\n",ntx); + for (k=0;k<12;k++) { + printf("rc=%2d %3d with %s\n",k,ndecok[k],decode_type[k]); + ndec += ndecok[k]; + } + printf("\nTotal: %d/%d (%d undetected errors)\n\n",ndec,ntx,nundet); + printf(""); + + if (ndec>0) { + ebnodbavg/=(ndec+nundet); + printf("Estimated SNR (average in dB) = %.2f dB\n\n",ebnodbavg-QRA64_SNR_EBNO_OFFSET); + } + + return 0; +} + + + +void syntax(void) +{ + + printf("\nQRA64 Mode Tests\n"); + printf("2016, Nico Palermo - IV3NWV\n\n"); + printf("---------------------------\n\n"); + printf("Syntax: qra64 [-s] [-c] [-a] [-t] [-h]\n"); + printf("Options: \n"); + printf(" -s : set simulation SNR in 2500 Hz BW (default:-27.5 dB)\n"); + printf(" -c : set channel type 0=AWGN (default) 1=Rayleigh 2=Fast-fading\n"); + printf(" -a : set decode type 0=NOAP 1=AUTOAP (default) 2=USERAP\n"); + printf(" -t: 0=simulate seq of msgs between IV3NWV and K1JT (default)\n"); + printf(" 1=simulate K1JT receiving K1JT IV3NWV JN66\n"); + printf(" 2=simulate fast-fading/awgn/rayliegh decoders performance\n"); + printf(" -n : simulate the transmission of ntx codewords (default=100)\n"); + + printf("Options used only for fast-fading simulations (-c2):\n"); + printf(" -b : 90%% fading bandwidth in Hz [1..230 Hz] (default = 2.5 Hz)\n"); + printf(" -m : fading model. 0=Gauss, 1=Lorentz (default = Lorentz)\n"); + printf(" -q : qra64 submode. 0=QRA64A,... 4=QRA64E (default = QRA64A)\n"); + printf(" -d : use the old awgn decoder\n"); + printf(" -h: this help\n"); + printf("Example:\n"); + printf(" qra64 -t2 -c2 -a2 -b50 -m1 -q2 -n10000 -s-26\n"); + printf(" runs the error performance test (-t2)\n"); + printf(" with USER_AP (-a2)\n"); + printf(" simulating a fast fading channel (-c2)\n"); + printf(" with B90 = 50 Hz (-b50), Lorentz Doppler (-m1), mode QRA64C (-q2)\n"); + printf(" ntx = 10000 codewords (-n10000) and SNR = -26 dB (-s-26)\n"); + +} + +int main(int argc, char* argv[]) +{ + int k, rc, nok=0; + float SNRdB = -27.5f; + unsigned int channel = CHANNEL_AWGN; + unsigned int mode = QRA_AUTOAP; + unsigned int testtype=0; + int nqso = 100; + float EbNodB; + float B90 = 2.5; + int fadingModel = 1; + int submode = 0; + int olddec = 0; + int ntx = 100; + +// Parse the command line + while(--argc) { + argv++; + + if (strncmp(*argv,"-h",2)==0) { + syntax(); + return 0; + } + else + if (strncmp(*argv,"-n",2)==0) { + ntx = ( int)atoi((*argv)+2); + if (ntx<100 || ntx>1000000) { + printf("Invalid -n option. ntx must be in the range [100..1000000]\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-a",2)==0) { + mode = ( int)atoi((*argv)+2); + if (mode>2) { + printf("Invalid decoding mode\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-s",2)==0) { + SNRdB = (float)atof((*argv)+2); + if (SNRdB>20 || SNRdB<-50) { + printf("SNR should be in the range [-50..20]\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-t",2)==0) { + testtype = ( int)atoi((*argv)+2); + if (testtype>2) { + printf("Invalid test type\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-c",2)==0) { + channel = ( int)atoi((*argv)+2); + if (channel>CHANNEL_FASTFADE) { + printf("Invalid channel type\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-b",2)==0) { + B90 = (float)atof((*argv)+2); + if (B90<1 || B90>230) { + printf("Invalid B90\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-m",2)==0) { + fadingModel = (int)atoi((*argv)+2); + if (fadingModel<0 || fadingModel>1) { + printf("Invalid fading model\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-q",2)==0) { + submode = (int)atoi((*argv)+2); + if (submode<0 || submode>4) { + printf("Invalid submode\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-d",2)==0) { + olddec = 1; + } + else { + printf("Invalid option\n"); + syntax(); + return -1; + } + } + + if (testtype<2) // old tests + if (channel==CHANNEL_FASTFADE) { + printf("Invalid Option. Test type 0 and 1 supports only AWGN or Rayleigh Channel model\n"); + return -1; + } + + EbNodB = SNRdB+QRA64_SNR_EBNO_OFFSET; + +#if defined(__linux__) || defined(__unix__) + srand48(GetTickCount()); +#endif + + if (testtype==0) { + for (k=0;k. + +----------------------------------------------------------------------------- + +QRA code used in this sowftware release: + +QRA13_64_64_IRR_E: K=13 N=64 Q=64 irregular QRA code (defined in +qra13_64_64_irr_e.h /.c) + +Codes with K=13 are designed to include a CRC as the 13th information symbol +and improve the code UER (Undetected Error Rate). +The CRC symbol is not sent along the channel (the codes are punctured) and the +resulting code is a (12,63) code +*/ +//---------------------------------------------------------------------------- + +#include +#include + +#include "qra64.h" +#include "../qracodes/qracodes.h" +#include "../qracodes/qra13_64_64_irr_e.h" +#include "../qracodes/pdmath.h" +#include "../qracodes/normrnd.h" + +// Code parameters of the QRA64 mode +#define QRA64_CODE qra_13_64_64_irr_e +#define QRA64_NMSG 218 // Must much value indicated in QRA64_CODE.NMSG + +#define QRA64_KC (QRA64_K+1) // Information symbols (crc included) +#define QRA64_NC (QRA64_N+1) // Codeword length (as defined in the code) +#define QRA64_NITER 100 // max number of iterations per decode + +// static functions declarations ---------------------------------------------- +static int calc_crc6(const int *x, int sz); +static void ix_mask(float *dst, const float *src, const int *mask, + const int *x); +static int qra64_decode_attempts(qra64codec *pcodec, int *xdec, const float *ix); +static int qra64_do_decode(int *x, const float *pix, const int *ap_mask, + const int *ap_x); +static float qra64_fastfading_estim_noise_std( + const float *rxen, + const float esnometric, + const int submode); + +static void qra64_fastfading_intrinsics( + float *pix, + const float *rxen, + const float *hptr, + const int hlen, + const float sigma, + const float EsNoMetric, + const int submode); + +static float qra64_fastfading_msg_esno( + const int *ydec, + const float *rxen, + const float sigma, + const float EsNoMetric, + const int hlen, + const int submode); + + +// a-priori information masks for fields in JT65-like msgs -------------------- + +// when defined limits the AP masks to reduce the false decode rate +#define LIMIT_AP_MASKS + +#ifdef LIMIT_AP_MASKS +#define MASK_CQQRZ 0xFFFFFFC +#define MASK_CALL1 0xFFFFFFC +#define MASK_CALL2 0xFFFFFFC +#define MASK_GRIDFULL 0x3FFC +#define MASK_GRIDFULL12 0x3FFC +#define MASK_GRIDBIT 0x8000 +#else +#define MASK_CQQRZ 0xFFFFFFC +#define MASK_CALL1 0xFFFFFFF +#define MASK_CALL2 0xFFFFFFF +#define MASK_GRIDFULL 0xFFFF +#define MASK_GRIDFULL12 0x3FFC +#define MASK_GRIDBIT 0x8000 // b[15] is 1 for free text, 0 otherwise +#endif + +// ---------------------------------------------------------------------------- + + + + +qra64codec *qra64_init(int flags) +{ + + // Eb/No value for which we optimize the decoder metric + const float EbNodBMetric = 2.8f; + const float EbNoMetric = (float)pow(10,EbNodBMetric/10); + const float R = 1.0f*(QRA64_KC)/(QRA64_NC); + + qra64codec *pcodec = (qra64codec*)malloc(sizeof(qra64codec)); + + if (!pcodec) + return 0; // can't allocate memory + + pcodec->decEsNoMetric = 1.0f*QRA64_m*R*EbNoMetric; + pcodec->apflags = flags; + + memset(pcodec->apmsg_set,0,APTYPE_SIZE*sizeof(int)); + + if (flags==QRA_NOAP) + return pcodec; + + // for QRA_USERAP and QRA_AUTOAP modes we always enable [CQ/QRZ ? ?] mgs look-up. + // encode CQ/QRZ AP messages + // NOTE: Here we handle only CQ and QRZ msgs. + // 'CQ nnn', 'CQ DX' and 'DE' msgs will be handled by the decoder + // as messages with no a-priori knowledge + qra64_apset(pcodec, CALL_CQ, 0, GRID_BLANK, APTYPE_CQQRZ); + + // initialize masks for decoding with a-priori information + encodemsg_jt65(pcodec->apmask_cqqrz, MASK_CQQRZ, 0, MASK_GRIDBIT); + encodemsg_jt65(pcodec->apmask_cqqrz_ooo, MASK_CQQRZ, 0, MASK_GRIDFULL); + encodemsg_jt65(pcodec->apmask_call1, MASK_CALL1, 0, MASK_GRIDBIT); + encodemsg_jt65(pcodec->apmask_call1_ooo, MASK_CALL1, 0, MASK_GRIDFULL); + encodemsg_jt65(pcodec->apmask_call2, 0, MASK_CALL2, MASK_GRIDBIT); + encodemsg_jt65(pcodec->apmask_call2_ooo, 0, MASK_CALL2, MASK_GRIDFULL); + encodemsg_jt65(pcodec->apmask_call1_call2, MASK_CALL1,MASK_CALL2, MASK_GRIDBIT); + encodemsg_jt65(pcodec->apmask_call1_call2_grid,MASK_CALL1,MASK_CALL2, MASK_GRIDFULL12); + encodemsg_jt65(pcodec->apmask_cq_call2, MASK_CQQRZ, MASK_CALL2, MASK_GRIDBIT); + encodemsg_jt65(pcodec->apmask_cq_call2_ooo, MASK_CQQRZ, MASK_CALL2, MASK_GRIDFULL12); + + return pcodec; +} + +void qra64_close(qra64codec *pcodec) +{ + free(pcodec); +} + +int qra64_apset(qra64codec *pcodec, const int mycall, const int hiscall, const int grid, const int aptype) +{ +// Set decoder a-priori knowledge accordingly to the type of the message to look up for +// arguments: +// pcodec = pointer to a qra64codec data structure as returned by qra64_init +// mycall = mycall to look for +// hiscall = hiscall to look for +// grid = grid to look for +// aptype = define and masks the type of AP to be set accordingly to the following: +// APTYPE_CQQRZ set [cq/qrz ? ?/blank] +// APTYPE_MYCALL set [mycall ? ?/blank] +// APTYPE_HISCALL set [? hiscall ?/blank] +// APTYPE_BOTHCALLS set [mycall hiscall ?] +// APTYPE_FULL set [mycall hiscall grid] +// APTYPE_CQHISCALL set [cq/qrz hiscall ?/blank] and [cq/qrz hiscall grid] +// returns: +// 0 on success +// -1 when qra64_init was called with the QRA_NOAP flag +// -2 invalid apytpe + + if (pcodec->apflags==QRA_NOAP) + return -1; + + switch (aptype) { + case APTYPE_CQQRZ: + encodemsg_jt65(pcodec->apmsg_cqqrz, CALL_CQ, 0, GRID_BLANK); + break; + case APTYPE_MYCALL: + encodemsg_jt65(pcodec->apmsg_call1, mycall, 0, GRID_BLANK); + break; + case APTYPE_HISCALL: + encodemsg_jt65(pcodec->apmsg_call2, 0, hiscall, GRID_BLANK); + break; + case APTYPE_BOTHCALLS: + encodemsg_jt65(pcodec->apmsg_call1_call2, mycall, hiscall, GRID_BLANK); + break; + case APTYPE_FULL: + encodemsg_jt65(pcodec->apmsg_call1_call2_grid, mycall, hiscall, grid); + break; + case APTYPE_CQHISCALL: + encodemsg_jt65(pcodec->apmsg_cq_call2, CALL_CQ, hiscall, GRID_BLANK); + encodemsg_jt65(pcodec->apmsg_cq_call2_grid, CALL_CQ, hiscall, grid); + break; + default: + return -2; // invalid ap type + } + + pcodec->apmsg_set[aptype]=1; // signal the decoder to look-up for the specified type + + + return 0; +} +void qra64_apdisable(qra64codec *pcodec, const int aptype) +{ + if (pcodec->apflags==QRA_NOAP) + return; + + if (aptype=APTYPE_SIZE) + return; + + pcodec->apmsg_set[aptype] = 0; // signal the decoder not to look-up to the specified type +} + +void qra64_encode(qra64codec *pcodec, int *y, const int *x) +{ + int encx[QRA64_KC]; // encoder input buffer + int ency[QRA64_NC]; // encoder output buffer + + int hiscall,mycall,grid; + + memcpy(encx,x,QRA64_K*sizeof(int)); // Copy input to encoder buffer + encx[QRA64_K]=calc_crc6(encx,QRA64_K); // Compute and add crc symbol + qra_encode(&QRA64_CODE, ency, encx); // encode msg+crc using given QRA code + + // copy codeword to output puncturing the crc symbol + memcpy(y,ency,QRA64_K*sizeof(int)); // copy information symbols + memcpy(y+QRA64_K,ency+QRA64_KC,QRA64_C*sizeof(int)); // copy parity symbols + + if (pcodec->apflags!=QRA_AUTOAP) + return; + + // Here we handle the QRA_AUTOAP mode -------------------------------------------- + + // When a [hiscall mycall ?] msg is detected we instruct the decoder + // to look for [mycall hiscall ?] msgs + // otherwise when a [cq mycall ?] msg is sent we reset the APTYPE_BOTHCALLS + + // look if the msg sent is a std type message (bit15 of grid field = 0) + if ((x[9]&0x80)==1) + return; // no, it's a text message, nothing to do + + // It's a [hiscall mycall grid] message + + // We assume that mycall is our call (but we don't check it) + // hiscall the station we are calling or a general call (CQ/QRZ/etc..) + decodemsg_jt65(&hiscall,&mycall,&grid,x); + + + if ((hiscall>=CALL_CQ && hiscall<=CALL_CQ999) || hiscall==CALL_CQDX || + hiscall==CALL_DE) { + // tell the decoder to look for msgs directed to us + qra64_apset(pcodec,mycall,0,0,APTYPE_MYCALL); + // We are making a general call and don't know who might reply + // Reset APTYPE_BOTHCALLS so decoder won't look for [mycall hiscall ?] msgs + qra64_apdisable(pcodec,APTYPE_BOTHCALLS); + } else { + // We are replying to someone named hiscall + // Set APTYPE_BOTHCALLS so decoder will try for [mycall hiscall ?] msgs + qra64_apset(pcodec,mycall, hiscall, GRID_BLANK, APTYPE_BOTHCALLS); + } + +} + +#define EBNO_MIN -10.0f // minimum Eb/No value returned by the decoder (in dB) +// AWGN metric decoder +int qra64_decode(qra64codec *pcodec, float *ebno, int *x, const float *rxen) +{ + int k; + float *srctmp, *dsttmp; + float ix[QRA64_NC*QRA64_M]; // (depunctured) intrisic information + int xdec[QRA64_KC]; // decoded message (with crc) + int ydec[QRA64_NC]; // re-encoded message (for snr calculations) + float noisestd; // estimated noise variance + float msge; // estimated message energy + float ebnoval; // estimated Eb/No + int rc; + + if (QRA64_NMSG!=QRA64_CODE.NMSG) // sanity check + return -16; // QRA64_NMSG define is wrong + + // compute symbols intrinsic probabilities from received energy observations + noisestd = qra_mfskbesselmetric(ix, rxen, QRA64_m, QRA64_N,pcodec->decEsNoMetric); + + // de-puncture observations adding a uniform distribution for the crc symbol + + // move check symbols distributions one symbol towards the end + dsttmp = PD_ROWADDR(ix,QRA64_M, QRA64_NC-1); //Point to last symbol prob dist + srctmp = dsttmp-QRA64_M; // source is the previous pd + for (k=0;k57.004f) + ebnoval=57.004f; + ebnoval = ebnoval*57.03f/(57.03f-ebnoval); + + // compute value in dB + if (ebnoval<=0) { + ebnoval = EBNO_MIN; // assume a minimum, positive value + } + else { + ebnoval = 10.0f*(float)log10(ebnoval); + if (ebnoval4) + return -17; // invalid submode + + if (B90<1.0f || B90>238.0f) + return -18; // B90 out of range + + // compute index to most appropriate amplitude weighting function coefficients + hidx = (int)(log((float)B90)/log(1.09f) - 0.499f); + + if (hidx<0 || hidx > 64) + return -19; // index of weighting function out of range + + if (fadingModel==0) { // gaussian fading model + // point to gaussian energy weighting taps + hlen = glen_tab_gauss[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) + hptr = gptr_tab_gauss[hidx]; // pointer to the first (L+1)/2 coefficients of w fun + } + else if (fadingModel==1) { + // point to lorentzian energy weighting taps + hlen = glen_tab_lorentz[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) + hptr = gptr_tab_lorentz[hidx]; // pointer to the first (L+1)/2 coefficients of w fun + } + else + return -20; // invalid fading model index + + + // compute (euristically) the optimal decoder metric accordingly the given spread amount + // We assume that the decoder threshold is: + // Es/No(dB) = Es/No(AWGN)(dB) + 8*log(B90)/log(240)(dB) + // that's to say, at the maximum Doppler spread bandwidth (240 Hz) there's a ~8 dB Es/No degradation + // over the AWGN case + tempf = 8.0f*(float)log((float)B90)/(float)log(240.0f); + EsNoMetric = pcodec->decEsNoMetric*(float)pow(10.0f,tempf/10.0f); + + + + // Step 1 ----------------------------------------------------------------------------------- + // Evaluate the noise stdev from the received energies at nominal tone frequencies + noisestd = qra64_fastfading_estim_noise_std(rxen, EsNoMetric, submode); + + // Step 2 ----------------------------------------------------------------------------------- + // Compute message symbols probability distributions + qra64_fastfading_intrinsics(ix, rxen, hptr, hlen, noisestd, EsNoMetric, submode); + + // Step 3 --------------------------------------------------------------------------- + // De-puncture observations adding a uniform distribution for the crc symbol + // Move check symbols distributions one symbol towards the end + dsttmp = PD_ROWADDR(ix,QRA64_M, QRA64_NC-1); //Point to last symbol prob dist + srctmp = dsttmp-QRA64_M; // source is the previous pd + for (k=0;k Eb/N0 conversion + ebnoval = 1.0f/(1.0f*QRA64_K/QRA64_N*QRA64_m)*esno; + + // compute value in dB + if (ebnoval<=0) { + ebnoval = EBNO_MIN; // assume a minimum, positive value + } + else { + ebnoval = 10.0f*(float)log10(ebnoval); + if (ebnoval238.0f) + return -18; // B90 out of range + + // compute index to most appropriate energy weighting function coefficients + hidx = (int)(log((float)B90)/log(1.09f) - 0.499f); + + if (hidx<0 || hidx > 64) + return -19; // index of weighting function out of range + + if (fadingModel==0) { // gaussian fading model + // point to gaussian weighting taps + hlen = glen_tab_gauss[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) + hptr = gptr_tab_gauss[hidx]; // pointer to the first (L+1)/2 coefficients of w fun + } + else if (fadingModel==1) { + // point to lorentzian weighting taps + hlen = glen_tab_lorentz[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) + hptr = gptr_tab_lorentz[hidx]; // pointer to the first (L+1)/2 coefficients of w fun + } + else + return -20; // invalid fading model index + + + // Compute the unfaded tone amplitudes from the Eb/No value passed to the call + N0 = 1.0f; // assume unitary noise PSD + sigmanoise = (float)sqrt(N0/2); + EsN0 = (float)pow(10.0f,EbN0dB/10.0f)*QRA64_m*QRA64_K/QRA64_N; // Es/No = m*R*Eb/No + Es = EsN0*N0; + + // compute signal bin sigmas + for (n=0;n=0;j--) { + normrnd_s(iq, 2, 0 , sigmasig[j]); + *curi++ += iq[0]; + *curq++ += iq[1]; + } + + } + + // compute total bin energies (S+N) and store in first half of buffer + curi = channel_out; + curq = channel_out+bpm; + for (n=0;nmaxloglh) // keep track of the max loglikelihood + maxloglh = loglh; + curix[k]=loglh; + } + + // scale to likelihoods + sumix = 0.f; + for (k=0;k1 + if (u<1) + return 0.f; + + // check u(bps/tothlen)) + return 10000.f; + + // solve for Es/No + esno = (u-1.0f)/(1.0f/tothlen-u/bps); + + return esno; + + +} + +#ifdef LIMIT_AP_MASKS + +static int call1_match(const int *papmsg, const int *pdec) +{ + // assumes MASK_CALL1 = 0xFFFFFFC + int u = papmsg[4]^pdec[4]; + return (u&0x3C)==0; +} +static int call2_match(const int *papmsg, const int *pdec) +{ + // assumes MASK_CALL2 = 0xFFFFFFC + int u = papmsg[9]^pdec[9]; + return (u&0x30)==0; +} +static int grid_match(const int *papmsg, const int *pdec) +{ + // assumes MASK_GRIDFULL = 0x3FFC + int u = papmsg[11]^pdec[11]; + int rc = (u&0x03)==0; + + u = papmsg[9]^pdec[9]; + + return (u&0x0C)==0 && rc; +} + +#else +#define call1_match(a,b) (1) +#define call2_match(a,b) (1) +#define grid_match(a,b) (1) +#endif + + + + +// Attempt to decode given intrisic information +static int qra64_decode_attempts(qra64codec *pcodec, int *xdec, const float *ix) +{ + int rc; + + // Attempt to decode without a-priori info -------------------------------- + rc = qra64_do_decode(xdec, ix, NULL, NULL); + if (rc>=0) + return 0; // successfull decode with AP0 + else + if (pcodec->apflags==QRA_NOAP) + // nothing more to do + return rc; // rc<0 = unsuccessful decode + + // Here we handle decoding with AP knowledge + + + // Attempt to decode CQ calls + rc = qra64_do_decode(xdec,ix,pcodec->apmask_cqqrz, pcodec->apmsg_cqqrz); + if (rc>=0) + return 1; // decoded [cq/qrz ? ?] + + rc = qra64_do_decode(xdec, ix, pcodec->apmask_cqqrz_ooo, + pcodec->apmsg_cqqrz); + if (rc>=0) + // check that ooo really matches + if (grid_match(pcodec->apmsg_cqqrz,xdec)) + return 2; // decoded [cq/qrz ? ooo] + + // attempt to decode calls directed to us + if (pcodec->apmsg_set[APTYPE_MYCALL]) { + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1, + pcodec->apmsg_call1); + if (rc>=0) + // check that mycall really matches + if (call1_match(pcodec->apmsg_call1,xdec)) + return 3; // decoded [mycall ? ?] + + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_ooo, + pcodec->apmsg_call1); + if (rc>=0) + // check that mycall and ooo really match + if (call1_match(pcodec->apmsg_call1,xdec) && + grid_match(pcodec->apmsg_call1,xdec)) + return 4; // decoded [mycall ? ooo] + } + + // attempt to decode [mycall hiscall ?] msgs + if (pcodec->apmsg_set[APTYPE_BOTHCALLS]) { + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_call2, + pcodec->apmsg_call1_call2); + if (rc>=0) + // check that mycall and hiscall really match + if (call1_match(pcodec->apmsg_call1_call2,xdec) && + call2_match(pcodec->apmsg_call1_call2,xdec)) + return 5; // decoded [mycall srccall ?] + } + + // attempt to decode [? hiscall ?/b] msgs + if (pcodec->apmsg_set[APTYPE_HISCALL]) { + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call2, + pcodec->apmsg_call2); + if (rc>=0) + // check that hiscall really match + if (call2_match(pcodec->apmsg_call2,xdec)) + return 6; // decoded [? hiscall ?] + + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call2_ooo, + pcodec->apmsg_call2); + if (rc>=0) + // check that hiscall and ooo match + if (call2_match(pcodec->apmsg_call2,xdec) && + grid_match(pcodec->apmsg_call2,xdec)) + return 7; // decoded [? hiscall ooo] + } + + // attempt to decode [cq/qrz hiscall ?/b/grid] msgs + if (pcodec->apmsg_set[APTYPE_CQHISCALL]) { + + rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2, + pcodec->apmsg_cq_call2); + if (rc>=0) + // check that hiscall matches + if (call2_match(pcodec->apmsg_call2,xdec)) + return 9; // decoded [cq/qrz hiscall ?] + + rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2_ooo, + pcodec->apmsg_cq_call2_grid); + if (rc>=0) { + // Full AP mask need special handling + // To minimize false decodes we check the decoded message + // with what passed in the ap_set call + if (memcmp(pcodec->apmsg_cq_call2_grid,xdec, QRA64_K*sizeof(int))==0) + return 11; // decoded [cq/qrz hiscall grid] + } + + rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2_ooo, + pcodec->apmsg_cq_call2); + if (rc>=0) { + // Full AP mask need special handling + // To minimize false decodes we check the decoded message + // with what passed in the ap_set call + if (memcmp(pcodec->apmsg_cq_call2,xdec, QRA64_K*sizeof(int))==0) + return 10; // decoded [cq/qrz hiscall ] + } + } + + // attempt to decode [mycall hiscall grid] + if (pcodec->apmsg_set[APTYPE_FULL]) { + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_call2_grid, + pcodec->apmsg_call1_call2_grid); + if (rc>=0) { + // Full AP mask need special handling + // All the three msg fields were given. + // To minimize false decodes we check the decoded message + // with what passed in the ap_set call + if (memcmp(pcodec->apmsg_call1_call2_grid,xdec, QRA64_K*sizeof(int))==0) + return 8; // decoded [mycall hiscall grid] + } + } + + // all decoding attempts failed + return -1; +} + + + +// Decode with given a-priori information +static int qra64_do_decode(int *xdec, const float *pix, const int *ap_mask, + const int *ap_x) +{ + int rc; + const float *ixsrc; + float ix_masked[QRA64_NC*QRA64_M]; // Masked intrinsic information + float ex[QRA64_NC*QRA64_M]; // Extrinsic information from the decoder + + float v2cmsg[QRA64_NMSG*QRA64_M]; // buffers for the decoder messages + float c2vmsg[QRA64_NMSG*QRA64_M]; + + if (ap_mask==NULL) { // no a-priori information + ixsrc = pix; // intrinsic source is what passed as argument + } else { + // a-priori information provided + // mask channel observations with a-priori + ix_mask(ix_masked,pix,ap_mask,ap_x); + ixsrc = ix_masked; // intrinsic source is the masked version + } + + // run the decoding algorithm + rc = qra_extrinsic(&QRA64_CODE,ex,ixsrc,QRA64_NITER,v2cmsg,c2vmsg); + if (rc<0) + return -1; // no convergence in given iterations + + // decode + qra_mapdecode(&QRA64_CODE,xdec,ex,ixsrc); + + // verify crc + if (calc_crc6(xdec,QRA64_K)!=xdec[QRA64_K]) // crc doesn't match (detected error) + return -2; // decoding was succesfull but crc doesn't match + + return 0; +} + + +// crc functions -------------------------------------------------------------- +// crc-6 generator polynomial +// g(x) = x^6 + a5*x^5 + ... + a1*x + a0 + +// g(x) = x^6 + x + 1 +#define CRC6_GEN_POL 0x30 // MSB=a0 LSB=a5 + +// g(x) = x^6 + x^2 + x + 1 (See: https://users.ece.cmu.edu/~koopman/crc/) +// #define CRC6_GEN_POL 0x38 // MSB=a0 LSB=a5. Simulation results are similar + +static int calc_crc6(const int *x, int sz) +{ + // todo: compute it faster using a look up table + int k,j,t,sr = 0; + for (k=0;k>1) ^ CRC6_GEN_POL; + else + sr = (sr>>1); + t>>=1; + } + } + return sr; +} + +static void ix_mask(float *dst, const float *src, const int *mask, + const int *x) +{ + // mask intrinsic information (channel observations) with a priori knowledge + + int k,kk, smask; + float *row; + + memcpy(dst,src,(QRA64_NC*QRA64_M)*sizeof(float)); + + for (k=0;k>22)&0x3F; + y[1]= (call1>>16)&0x3F; + y[2]= (call1>>10)&0x3F; + y[3]= (call1>>4)&0x3F; + y[4]= (call1<<2)&0x3F; + + y[4] |= (call2>>26)&0x3F; + y[5]= (call2>>20)&0x3F; + y[6]= (call2>>14)&0x3F; + y[7]= (call2>>8)&0x3F; + y[8]= (call2>>2)&0x3F; + y[9]= (call2<<4)&0x3F; + + y[9] |= (grid>>12)&0x3F; + y[10]= (grid>>6)&0x3F; + y[11]= (grid)&0x3F; + +} +void decodemsg_jt65(int *call1, int *call2, int *grid, const int *x) +{ + int nc1, nc2, ng; + + nc1 = x[4]>>2; + nc1 |= x[3]<<4; + nc1 |= x[2]<<10; + nc1 |= x[1]<<16; + nc1 |= x[0]<<22; + + nc2 = x[9]>>4; + nc2 |= x[8]<<2; + nc2 |= x[7]<<8; + nc2 |= x[6]<<14; + nc2 |= x[5]<<20; + nc2 |= (x[4]&0x03)<<26; + + ng = x[11]; + ng |= x[10]<<6; + ng |= (x[9]&0x0F)<<12; + + *call1 = nc1; + *call2 = nc2; + *grid = ng; +} diff --git a/map65/libm65/qra64/qra64.h b/map65/libm65/qra64/qra64.h new file mode 100644 index 000000000..3b2b5bd3d --- /dev/null +++ b/map65/libm65/qra64/qra64.h @@ -0,0 +1,269 @@ +// qra64.h +// Encoding/decoding functions for the QRA64 mode +// +// (c) 2016 - Nico Palermo, IV3NWV +// ------------------------------------------------------------------------------ +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +#ifndef _qra64_h_ +#define _qra64_h_ + +// qra64_init(...) initialization flags +#define QRA_NOAP 0 // don't use a-priori knowledge +#define QRA_AUTOAP 1 // use auto a-priori knowledge +#define QRA_USERAP 2 // a-priori knowledge messages provided by the user + +// QRA code parameters +#define QRA64_K 12 // information symbols +#define QRA64_N 63 // codeword length +#define QRA64_C 51 // (number of parity checks C=(N-K)) +#define QRA64_M 64 // code alphabet size +#define QRA64_m 6 // bits per symbol + +// packed predefined callsigns and fields as defined in JT65 +#define CALL_CQ 0xFA08319 +#define CALL_QRZ 0xFA0831A +#define CALL_CQ000 0xFA0831B +#define CALL_CQ999 0xFA08702 +#define CALL_CQDX 0x5624C39 +#define CALL_DE 0xFF641D1 +#define GRID_BLANK 0x7E91 + +// Types of a-priori knowledge messages +#define APTYPE_CQQRZ 0 // [cq/qrz ? ?/blank] +#define APTYPE_MYCALL 1 // [mycall ? ?/blank] +#define APTYPE_HISCALL 2 // [? hiscall ?/blank] +#define APTYPE_BOTHCALLS 3 // [mycall hiscall ?] +#define APTYPE_FULL 4 // [mycall hiscall grid] +#define APTYPE_CQHISCALL 5 // [cq/qrz hiscall ?/blank] +#define APTYPE_SIZE (APTYPE_CQHISCALL+1) + +typedef struct { + float decEsNoMetric; + int apflags; + int apmsg_set[APTYPE_SIZE]; // indicate which ap type knowledge has + // been set by the user +// ap messages buffers + int apmsg_cqqrz[12]; // [cq/qrz ? ?/blank] + int apmsg_call1[12]; // [mycall ? ?/blank] + int apmsg_call2[12]; // [? hiscall ?/blank] + int apmsg_call1_call2[12]; // [mycall hiscall ?] + int apmsg_call1_call2_grid[12]; // [mycall hiscall grid] + int apmsg_cq_call2[12]; // [cq hiscall ?/blank] + int apmsg_cq_call2_grid[12]; // [cq hiscall grid] + +// ap messages masks + int apmask_cqqrz[12]; + int apmask_cqqrz_ooo[12]; + int apmask_call1[12]; + int apmask_call1_ooo[12]; + int apmask_call2[12]; + int apmask_call2_ooo[12]; + int apmask_call1_call2[12]; + int apmask_call1_call2_grid[12]; + int apmask_cq_call2[12]; + int apmask_cq_call2_ooo[12]; +} qra64codec; + +#ifdef __cplusplus +extern "C" { +#endif + +qra64codec *qra64_init(int flags); +// QRA64 mode initialization function +// arguments: +// flags: set the decoder mode +// QRA_NOAP use no a-priori information +// QRA_AUTOAP use any relevant previous decodes +// QRA_USERAP use a-priori information provided via qra64_apset(...) +// returns: +// Pointer to initialized qra64codec data structure +// this pointer should be passed to the encoding/decoding functions +// +// 0 if unsuccessful (can't allocate memory) +// ---------------------------------------------------------------------------- + +void qra64_encode(qra64codec *pcodec, int *y, const int *x); +// QRA64 encoder +// arguments: +// pcodec = pointer to a qra64codec data structure as returned by qra64_init +// x = pointer to the message to be encoded, int x[12] +// x must point to an array of integers (i.e. defined as int x[12]) +// y = pointer to encoded message, int y[63]= +// ---------------------------------------------------------------------------- + +int qra64_decode(qra64codec *pcodec, float *ebno, int *x, const float *r); +// QRA64 mode decoder +// arguments: +// pcodec = pointer to a qra64codec data structure as returned by qra64_init +// ebno = pointer to a float where the avg Eb/No (in dB) will be stored +// in case of successfull decoding +// (pass a null pointer if not interested) +// x = pointer to decoded message, int x[12] +// r = pointer to received symbol energies (squared amplitudes) +// r must point to an array of length QRA64_M*QRA64_N (=64*63=4032) +// The first QRA_M entries should be the energies of the first +// symbol in the codeword; the last QRA_M entries should be the +// energies of the last symbol in the codeword +// +// return code: +// +// The return code is <0 when decoding is unsuccessful +// -16 indicates that the definition of QRA64_NMSG does not match what required by the code +// If the decoding process is successfull the return code is accordingly to the following table +// rc=0 [? ? ?] AP0 (decoding with no a-priori) +// rc=1 [CQ ? ?] AP27 +// rc=2 [CQ ? ] AP44 +// rc=3 [CALL ? ?] AP29 +// rc=4 [CALL ? ] AP45 +// rc=5 [CALL CALL ?] AP57 +// rc=6 [? CALL ?] AP29 +// rc=7 [? CALL ] AP45 +// rc=8 [CALL CALL GRID] AP72 (actually a AP68 mask to reduce false decodes) +// rc=9 [CQ CALL ?] AP55 +// rc=10 [CQ CALL ] AP70 (actaully a AP68 mask to reduce false decodes) + +// return codes in the range 1-10 indicate the amount and the type of a-priori +// information was required to decode the received message. + + +// Decode a QRA64 msg using a fast-fading metric +int qra64_decode_fastfading( + qra64codec *pcodec, // ptr to the codec structure + float *ebno, // ptr to where the estimated Eb/No value will be saved + int *x, // ptr to decoded message + const float *rxen, // ptr to received symbol energies array + const int submode, // submode idx (0=QRA64A ... 4=QRA64E) + const float B90, // spread bandwidth (90% fractional energy) + const int fadingModel); // 0=Gaussian 1=Lorentzian fade model +// +// rxen: The array of the received bin energies +// Bins must be spaced by integer multiples of the symbol rate (1/Ts Hz) +// The array must be an array of total length U = L x N where: +// L: is the number of frequency bins per message symbol (see after) +// N: is the number of symbols in a QRA64 msg (63) +// +// The number of bins/symbol L depends on the selected submode accordingly to +// the following rule: +// L = (64+64*2^submode+64) = 64*(2+2^submode) +// Tone 0 is always supposed to be at offset 64 in the array. +// The m-th tone nominal frequency is located at offset 64 + m*2^submode (m=0..63) +// +// Submode A: (2^submode = 1) +// L = 64*3 = 196 bins/symbol +// Total length of the energies array: U = 192*63 = 12096 floats +// +// Submode B: (2^submode = 2) +// L = 64*4 = 256 bins/symbol +// Total length of the energies array: U = 256*63 = 16128 floats +// +// Submode C: (2^submode = 4) +// L = 64*6 = 384 bins/symbol +// Total length of the energies array: U = 384*63 = 24192 floats +// +// Submode D: (2^submode = 8) +// L = 64*10 = 640 bins/symbol +// Total length of the energies array: U = 640*63 = 40320 floats +// +// Submode E: (2^submode = 16) +// L = 64*18 = 1152 bins/symbol +// Total length of the energies array: U = 1152*63 = 72576 floats +// +// Note: The rxen array is modified and reused for internal calculations. +// +// +// B90: spread fading bandwidth in Hz (90% fractional average energy) +// +// B90 should be in the range 1 Hz ... 238 Hz +// The value passed to the call is rounded to the closest value among the +// 64 available values: +// B = 1.09^k Hz, with k=0,1,...,63 +// +// I.e. B90=27 Hz will be approximated in this way: +// k = rnd(log(27)/log(1.09)) = 38 +// B90 = 1.09^k = 1.09^38 = 26.4 Hz +// +// For any input value the maximum rounding error is not larger than +/- 5% +// +// return codes: same return codes of qra64_decode (+some additional error codes) + + +// Simulate the fast-fading channel (to be used with qra64_decode_fastfading) +int qra64_fastfading_channel( + float **rxen, + const int *xmsg, + const int submode, + const float EbN0dB, + const float B90, + const int fadingModel); +// Simulate transmission over a fading channel with given B90, fading model and submode +// and non coherent detection. +// Sets rxen to point to an array of bin energies formatted as required +// by the (fast-fading) decoding routine. +// returns 0 on success or negative values on error conditions + + +int qra64_apset(qra64codec *pcodec, const int mycall, const int hiscall, const int grid, const int aptype); +// Set decoder a-priori knowledge accordingly to the type of the message to +// look up for +// arguments: +// pcodec = pointer to a qra64codec data structure as returned by qra64_init +// mycall = mycall to look for +// hiscall = hiscall to look for +// grid = grid to look for +// aptype = define the type of AP to be set: +// APTYPE_CQQRZ set [cq/qrz ? ?/blank] +// APTYPE_MYCALL set [mycall ? ?/blank] +// APTYPE_HISCALL set [? hiscall ?/blank] +// APTYPE_BOTHCALLS set [mycall hiscall ?] +// APTYPE_FULL set [mycall hiscall grid] +// APTYPE_CQHISCALL set [cq/qrz hiscall ?/blank] + +// returns: +// 0 on success +// -1 when qra64_init was called with the QRA_NOAP flag +// -2 invalid apytpe (valid range [APTYPE_CQQRZ..APTYPE_CQHISCALL] +// (APTYPE_CQQRZ [cq/qrz ? ?] is set by default ) + +void qra64_apdisable(qra64codec *pcodec, const int aptype); +// disable specific AP type +// arguments: +// pcodec = pointer to a qra64codec data structure as returned by qra64_init +// aptype = define the type of AP to be disabled +// APTYPE_CQQRZ disable [cq/qrz ? ?/blank] +// APTYPE_MYCALL disable [mycall ? ?/blank] +// APTYPE_HISCALL disable [ ? hiscall ?/blank] +// APTYPE_BOTHCALLS disable [mycall hiscall ? ] +// APTYPE_FULL disable [mycall hiscall grid] +// APTYPE_CQHISCALL set [cq/qrz hiscall ?/blank] + +void qra64_close(qra64codec *pcodec); +// Free memory allocated by qra64_init +// arguments: +// pcodec = pointer to a qra64codec data structure as returned by qra64_init + +// ---------------------------------------------------------------------------- + +// encode/decode std msgs in 12 symbols as done in jt65 +void encodemsg_jt65(int *y, const int call1, const int call2, const int grid); +void decodemsg_jt65(int *call1, int *call2, int *grid, const int *x); + +#ifdef __cplusplus +} +#endif + +#endif // _qra64_h_ diff --git a/map65/libm65/qra64/qra64_all.c b/map65/libm65/qra64/qra64_all.c new file mode 100644 index 000000000..3951c031b --- /dev/null +++ b/map65/libm65/qra64/qra64_all.c @@ -0,0 +1,1050 @@ +/* +qra64.c +Encoding/decoding functions for the QRA64 mode + +(c) 2016 - Nico Palermo, IV3NWV + +------------------------------------------------------------------------------- + + qracodes 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. + qracodes 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 qracodes source distribution. + If not, see . + +----------------------------------------------------------------------------- + +QRA code used in this sowftware release: + +QRA13_64_64_IRR_E: K=13 N=64 Q=64 irregular QRA code (defined in +qra13_64_64_irr_e.h /.c) + +Codes with K=13 are designed to include a CRC as the 13th information symbol +and improve the code UER (Undetected Error Rate). +The CRC symbol is not sent along the channel (the codes are punctured) and the +resulting code is a (12,63) code +*/ +//---------------------------------------------------------------------------- + +#include +#include + +#include "qra64.h" +#include "../qracodes/qracodes.h" +#include "../qracodes/qra13_64_64_irr_e.h" +#include "../qracodes/pdmath.h" +#include "../qracodes/normrnd.h" + +// Code parameters of the QRA64 mode +#define QRA64_CODE qra_13_64_64_irr_e +#define QRA64_NMSG 218 // Must much value indicated in QRA64_CODE.NMSG + +#define QRA64_KC (QRA64_K+1) // Information symbols (crc included) +#define QRA64_NC (QRA64_N+1) // Codeword length (as defined in the code) +#define QRA64_NITER 100 // max number of iterations per decode + +// static functions declarations ---------------------------------------------- +static int calc_crc6(const int *x, int sz); +static void ix_mask(float *dst, const float *src, const int *mask, + const int *x); +static int qra64_decode_attempts(qra64codec *pcodec, int *xdec, const float *ix); +static int qra64_do_decode(int *x, const float *pix, const int *ap_mask, + const int *ap_x); +static float qra64_fastfading_estim_noise_std( + float *rxen, + const float esnometric, + const int submode); +static void qra64_fastfading_intrinsics( + float *pix, + const float *rxamp, + const float *hptr, + const int hlen, + const float cmetric, + const int submode); +static float qra64_fastfading_msg_esno( + const int *ydec, + const float *rxamp, + const float sigma, + const float EsNoMetric, + const int hlen, + const int submode); + + +// a-priori information masks for fields in JT65-like msgs -------------------- +#define MASK_CQQRZ 0xFFFFFFC // CQ/QRZ calls common bits +#define MASK_CALL1 0xFFFFFFF +#define MASK_CALL2 0xFFFFFFF +#define MASK_GRIDFULL 0xFFFF +#define MASK_GRIDFULL12 0x3FFC // less aggressive mask (to be used with full AP decoding) +#define MASK_GRIDBIT 0x8000 // b[15] is 1 for free text, 0 otherwise +// ---------------------------------------------------------------------------- + +qra64codec *qra64_init(int flags) +{ + + // Eb/No value for which we optimize the decoder metric + const float EbNodBMetric = 2.8f; + const float EbNoMetric = (float)pow(10,EbNodBMetric/10); + const float R = 1.0f*(QRA64_KC)/(QRA64_NC); + + qra64codec *pcodec = (qra64codec*)malloc(sizeof(qra64codec)); + + if (!pcodec) + return 0; // can't allocate memory + + pcodec->decEsNoMetric = 1.0f*QRA64_m*R*EbNoMetric; + pcodec->apflags = flags; + + memset(pcodec->apmsg_set,0,APTYPE_SIZE*sizeof(int)); + + if (flags==QRA_NOAP) + return pcodec; + + // for QRA_USERAP and QRA_AUTOAP modes we always enable [CQ/QRZ ? ?] mgs look-up. + // encode CQ/QRZ AP messages + // NOTE: Here we handle only CQ and QRZ msgs. + // 'CQ nnn', 'CQ DX' and 'DE' msgs will be handled by the decoder + // as messages with no a-priori knowledge + qra64_apset(pcodec, CALL_CQ, 0, GRID_BLANK, APTYPE_CQQRZ); + + // initialize masks for decoding with a-priori information + encodemsg_jt65(pcodec->apmask_cqqrz, MASK_CQQRZ, 0, MASK_GRIDBIT); + encodemsg_jt65(pcodec->apmask_cqqrz_ooo, MASK_CQQRZ, 0, MASK_GRIDFULL); + encodemsg_jt65(pcodec->apmask_call1, MASK_CALL1, 0, MASK_GRIDBIT); + encodemsg_jt65(pcodec->apmask_call1_ooo, MASK_CALL1, 0, MASK_GRIDFULL); + encodemsg_jt65(pcodec->apmask_call2, 0, MASK_CALL2, MASK_GRIDBIT); + encodemsg_jt65(pcodec->apmask_call2_ooo, 0, MASK_CALL2, MASK_GRIDFULL); + encodemsg_jt65(pcodec->apmask_call1_call2, MASK_CALL1,MASK_CALL2, MASK_GRIDBIT); + encodemsg_jt65(pcodec->apmask_call1_call2_grid,MASK_CALL1,MASK_CALL2, MASK_GRIDFULL12); + encodemsg_jt65(pcodec->apmask_cq_call2, MASK_CQQRZ, MASK_CALL2, MASK_GRIDBIT); + encodemsg_jt65(pcodec->apmask_cq_call2_ooo, MASK_CQQRZ, MASK_CALL2, MASK_GRIDFULL12); + + return pcodec; +} + +void qra64_close(qra64codec *pcodec) +{ + free(pcodec); +} + +int qra64_apset(qra64codec *pcodec, const int mycall, const int hiscall, const int grid, const int aptype) +{ +// Set decoder a-priori knowledge accordingly to the type of the message to look up for +// arguments: +// pcodec = pointer to a qra64codec data structure as returned by qra64_init +// mycall = mycall to look for +// hiscall = hiscall to look for +// grid = grid to look for +// aptype = define and masks the type of AP to be set accordingly to the following: +// APTYPE_CQQRZ set [cq/qrz ? ?/blank] +// APTYPE_MYCALL set [mycall ? ?/blank] +// APTYPE_HISCALL set [? hiscall ?/blank] +// APTYPE_BOTHCALLS set [mycall hiscall ?] +// APTYPE_FULL set [mycall hiscall grid] +// APTYPE_CQHISCALL set [cq/qrz hiscall ?/blank] and [cq/qrz hiscall grid] +// returns: +// 0 on success +// -1 when qra64_init was called with the QRA_NOAP flag +// -2 invalid apytpe + + if (pcodec->apflags==QRA_NOAP) + return -1; + + switch (aptype) { + case APTYPE_CQQRZ: + encodemsg_jt65(pcodec->apmsg_cqqrz, CALL_CQ, 0, GRID_BLANK); + break; + case APTYPE_MYCALL: + encodemsg_jt65(pcodec->apmsg_call1, mycall, 0, GRID_BLANK); + break; + case APTYPE_HISCALL: + encodemsg_jt65(pcodec->apmsg_call2, 0, hiscall, GRID_BLANK); + break; + case APTYPE_BOTHCALLS: + encodemsg_jt65(pcodec->apmsg_call1_call2, mycall, hiscall, GRID_BLANK); + break; + case APTYPE_FULL: + encodemsg_jt65(pcodec->apmsg_call1_call2_grid, mycall, hiscall, grid); + break; + case APTYPE_CQHISCALL: + encodemsg_jt65(pcodec->apmsg_cq_call2, CALL_CQ, hiscall, GRID_BLANK); + encodemsg_jt65(pcodec->apmsg_cq_call2_grid, CALL_CQ, hiscall, grid); + break; + default: + return -2; // invalid ap type + } + + pcodec->apmsg_set[aptype]=1; // signal the decoder to look-up for the specified type + + + return 0; +} +void qra64_apdisable(qra64codec *pcodec, const int aptype) +{ + if (pcodec->apflags==QRA_NOAP) + return; + + if (aptype=APTYPE_SIZE) + return; + + pcodec->apmsg_set[aptype] = 0; // signal the decoder not to look-up to the specified type +} + +void qra64_encode(qra64codec *pcodec, int *y, const int *x) +{ + int encx[QRA64_KC]; // encoder input buffer + int ency[QRA64_NC]; // encoder output buffer + + int hiscall,mycall,grid; + + memcpy(encx,x,QRA64_K*sizeof(int)); // Copy input to encoder buffer + encx[QRA64_K]=calc_crc6(encx,QRA64_K); // Compute and add crc symbol + qra_encode(&QRA64_CODE, ency, encx); // encode msg+crc using given QRA code + + // copy codeword to output puncturing the crc symbol + memcpy(y,ency,QRA64_K*sizeof(int)); // copy information symbols + memcpy(y+QRA64_K,ency+QRA64_KC,QRA64_C*sizeof(int)); // copy parity symbols + + if (pcodec->apflags!=QRA_AUTOAP) + return; + + // Here we handle the QRA_AUTOAP mode -------------------------------------------- + + // When a [hiscall mycall ?] msg is detected we instruct the decoder + // to look for [mycall hiscall ?] msgs + // otherwise when a [cq mycall ?] msg is sent we reset the APTYPE_BOTHCALLS + + // look if the msg sent is a std type message (bit15 of grid field = 0) + if ((x[9]&0x80)==1) + return; // no, it's a text message, nothing to do + + // It's a [hiscall mycall grid] message + + // We assume that mycall is our call (but we don't check it) + // hiscall the station we are calling or a general call (CQ/QRZ/etc..) + decodemsg_jt65(&hiscall,&mycall,&grid,x); + + + if ((hiscall>=CALL_CQ && hiscall<=CALL_CQ999) || hiscall==CALL_CQDX || + hiscall==CALL_DE) { + // tell the decoder to look for msgs directed to us + qra64_apset(pcodec,mycall,0,0,APTYPE_MYCALL); + // We are making a general call and don't know who might reply + // Reset APTYPE_BOTHCALLS so decoder won't look for [mycall hiscall ?] msgs + qra64_apdisable(pcodec,APTYPE_BOTHCALLS); + } else { + // We are replying to someone named hiscall + // Set APTYPE_BOTHCALLS so decoder will try for [mycall hiscall ?] msgs + qra64_apset(pcodec,mycall, hiscall, GRID_BLANK, APTYPE_BOTHCALLS); + } + +} + +#define EBNO_MIN -10.0f // minimum Eb/No value returned by the decoder (in dB) +int qra64_decode(qra64codec *pcodec, float *ebno, int *x, const float *rxen) +{ + int k; + float *srctmp, *dsttmp; + float ix[QRA64_NC*QRA64_M]; // (depunctured) intrisic information + int xdec[QRA64_KC]; // decoded message (with crc) + int ydec[QRA64_NC]; // re-encoded message (for snr calculations) + float noisestd; // estimated noise variance + float msge; // estimated message energy + float ebnoval; // estimated Eb/No + int rc; + + if (QRA64_NMSG!=QRA64_CODE.NMSG) // sanity check + return -16; // QRA64_NMSG define is wrong + + // compute symbols intrinsic probabilities from received energy observations + noisestd = qra_mfskbesselmetric(ix, rxen, QRA64_m, QRA64_N,pcodec->decEsNoMetric); + + // de-puncture observations adding a uniform distribution for the crc symbol + + // move check symbols distributions one symbol towards the end + dsttmp = PD_ROWADDR(ix,QRA64_M, QRA64_NC-1); //Point to last symbol prob dist + srctmp = dsttmp-QRA64_M; // source is the previous pd + for (k=0;k57.004f) + ebnoval=57.004f; + ebnoval = ebnoval*57.03f/(57.03f-ebnoval); + + // compute value in dB + if (ebnoval<=0) + ebnoval = EBNO_MIN; // assume a minimum, positive value + else + ebnoval = 10.0f*(float)log10(ebnoval); + if (ebnoval4) + return -17; // invalid submode + + if (B90<1.0f || B90>238.0f) + return -18; // B90 out of range + + // compute index to most appropriate amplitude weighting function coefficients + hidx = (int)(log((float)B90)/log(1.09f) - 0.499f); + + if (hidx<0 || hidx > 64) + return -19; // index of weighting function out of range + + if (fadingModel==0) { // gaussian fading model + // point to gaussian weighting taps + hlen = hlen_tab_gauss[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) + hptr = hptr_tab_gauss[hidx]; // pointer to the first (L+1)/2 coefficients of w fun + } + else if (fadingModel==1) { + // point to lorentzian weighting taps + hlen = hlen_tab_lorentz[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) + hptr = hptr_tab_lorentz[hidx]; // pointer to the first (L+1)/2 coefficients of w fun + } + else + return -20; // invalid fading model index + + + // compute (euristically) the optimal decoder metric accordingly the given spread amount + // We assume that the decoder threshold is: + // Es/No(dB) = Es/No(AWGN)(dB) + 8*log(B90)/log(240)(dB) + // that's to say, at the maximum Doppler spread bandwidth (240 Hz) there's a ~8 dB Es/No degradation + // over the AWGN case + tempf = 8.0f*(float)log((float)B90)/(float)log(240.0f); + EsNoMetric = pcodec->decEsNoMetric*(float)pow(10.0f,tempf/10.0f); + + // Step 1 ----------------------------------------------------------------------------------- + // Evaluate the noise stdev from the received energies at nominal tone frequencies + // and transform energies to amplitudes + tempf = hptr[hlen-1]; // amplitude weigth at nominal freq; + tempf = tempf*tempf; // fractional energy at nominal freq. bin + + noisestd = qra64_fastfading_estim_noise_std(rxen, EsNoMetric, submode); + cmetric = (float)sqrt(M_PI_2*EsNoMetric)/noisestd; + + // Step 2 ----------------------------------------------------------------------------------- + // Compute message symbols probability distributions + qra64_fastfading_intrinsics(ix, rxen, hptr, hlen, cmetric, submode); + + // Step 3 --------------------------------------------------------------------------- + // De-puncture observations adding a uniform distribution for the crc symbol + // Move check symbols distributions one symbol towards the end + dsttmp = PD_ROWADDR(ix,QRA64_M, QRA64_NC-1); //Point to last symbol prob dist + srctmp = dsttmp-QRA64_M; // source is the previous pd + for (k=0;k238.0f) + return -18; // B90 out of range + + // compute index to most appropriate amplitude weighting function coefficients + hidx = (int)(log((float)B90)/log(1.09f) - 0.499f); + + if (hidx<0 || hidx > 64) + return -19; // index of weighting function out of range + + if (fadingModel==0) { // gaussian fading model + // point to gaussian weighting taps + hlen = hlen_tab_gauss[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) + hptr = hptr_tab_gauss[hidx]; // pointer to the first (L+1)/2 coefficients of w fun + } + else if (fadingModel==1) { + // point to lorentzian weighting taps + hlen = hlen_tab_lorentz[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) + hptr = hptr_tab_lorentz[hidx]; // pointer to the first (L+1)/2 coefficients of w fun + } + else + return -20; // invalid fading model index + + + // Compute the unfaded tone amplitudes from the Eb/No value passed to the call + N0 = 1.0f; // assume unitary noise PSD + sigmanoise = (float)sqrt(N0/2); + EsN0 = (float)pow(10.0f,EbN0dB/10.0f)*QRA64_m*QRA64_K/QRA64_N; // Es/No = m*R*Eb/No + Es = EsN0*N0; + A = (float)sqrt(Es/2.0f); // unfaded tone amplitude (i^2+q^2 = Es/2+Es/2 = Es) + + + // Generate gaussian noise iq components + normrnd_s(channel_out, bpm*2, 0 , sigmanoise); + + // Add message symbols energies + for (n=0;n=0;j--) { + sigmasig = A*hptr[j]; + normrnd_s(iq, 2, 0 , sigmasig); +// iq[0]=sigmasig*sqrt(2); iq[1]=0; debug: used to verify Eb/No + *curi++ += iq[0]; + *curq++ += iq[1]; +// tote +=iq[0]*iq[0]+iq[1]*iq[1]; // debug + } + + } + +// tote = tote/QRA64_N; // debug + + // compute total bin energies (S+N) and store in first half of buffer + curi = channel_out; + curq = channel_out+bpm; + for (n=0;n=0;j--) { + u = *curbin++ * hptr[j]*cmetric; + u = u*u/(u+(float)M_E); // log(I0(u)) approx. + loglh = loglh + u; + } + if (loglh>maxloglh) // keep track of the max loglikelihood + maxloglh = loglh; + curix[k]=loglh; + } + // scale to likelihoods + sumix = 0.f; + for (k=0;k=0;j--) { + u = *curbin++; + msgsn += u*u; + } + + } + + msgsn = msgsn/(QRA64_N*tothlen); // avg msg energy per bin (noise included) + + // as sigma is overestimated (sigmatrue = sigma*sqrt((1+EsNoMetric/bps)/(1+EsNo/bps)) + // we have: msgsn = (1+x/hlen)/(1+x/bps)*2*sigma^2*(1+EsnoMetric/bps), where x = Es/N0(true) + // + // we can then write: + // u = msgsn/2.0f/(sigma*sigma)/(1.0f+EsNoMetric/bps); + // (1+x/hlen)/(1+x/bps) = u + + u = msgsn/(2.0f*sigma*sigma)/(1.0f+EsNoMetric/bps); + + // check u>1 + if (u<1) + return 0.f; + + // check u(bps/tothlen)) + return 10000.f; + + // solve for Es/No + esno = (u-1.0f)/(1.0f/tothlen-u/bps); + + return esno; + + +} + + +// Attempt to decode given intrisic information +static int qra64_decode_attempts(qra64codec *pcodec, int *xdec, const float *ix) +{ + int rc; + + // Attempt to decode without a-priori info -------------------------------- + rc = qra64_do_decode(xdec, ix, NULL, NULL); + if (rc>=0) + return 0; // successfull decode with AP0 + else + if (pcodec->apflags==QRA_NOAP) + // nothing more to do + return rc; // rc<0 = unsuccessful decode + + // Here we handle decoding with AP knowledge + + // Attempt to decode CQ calls + rc = qra64_do_decode(xdec,ix,pcodec->apmask_cqqrz, pcodec->apmsg_cqqrz); + if (rc>=0) return 1; // decoded [cq/qrz ? ?] + + rc = qra64_do_decode(xdec, ix, pcodec->apmask_cqqrz_ooo, + pcodec->apmsg_cqqrz); + if (rc>=0) return 2; // decoded [cq ? ooo] + + // attempt to decode calls directed to us + if (pcodec->apmsg_set[APTYPE_MYCALL]) { + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1, + pcodec->apmsg_call1); + if (rc>=0) return 3; // decoded [mycall ? ?] + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_ooo, + pcodec->apmsg_call1); + if (rc>=0) return 4; // decoded [mycall ? ooo] + } + + // attempt to decode [mycall srccall ?] msgs + if (pcodec->apmsg_set[APTYPE_BOTHCALLS]) { + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_call2, + pcodec->apmsg_call1_call2); + if (rc>=0) return 5; // decoded [mycall srccall ?] + } + + // attempt to decode [? hiscall ?/b] msgs + if (pcodec->apmsg_set[APTYPE_HISCALL]) { + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call2, + pcodec->apmsg_call2); + if (rc>=0) return 6; // decoded [? hiscall ?] + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call2_ooo, + pcodec->apmsg_call2); + if (rc>=0) return 7; // decoded [? hiscall ooo] + } + + // attempt to decode [cq/qrz hiscall ?/b/grid] msgs + if (pcodec->apmsg_set[APTYPE_CQHISCALL]) { + + rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2, + pcodec->apmsg_cq_call2); + if (rc>=0) return 9; // decoded [cq/qrz hiscall ?] + + rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2_ooo, + pcodec->apmsg_cq_call2_grid); + if (rc>=0) { + // Full AP mask need special handling + // To minimize false decodes we check the decoded message + // with what passed in the ap_set call + if (memcmp(pcodec->apmsg_cq_call2_grid,xdec, QRA64_K*sizeof(int))!=0) + return -1; + else + return 11; // decoded [cq/qrz hiscall grid] + }; + + rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2_ooo, + pcodec->apmsg_cq_call2); + if (rc>=0) { + // Full AP mask need special handling + // To minimize false decodes we check the decoded message + // with what passed in the ap_set call + if (memcmp(pcodec->apmsg_cq_call2,xdec, QRA64_K*sizeof(int))!=0) + return -1; + else + return 10; // decoded [cq/qrz hiscall ] + } + } + + // attempt to decode [mycall hiscall grid] + if (pcodec->apmsg_set[APTYPE_FULL]) { + rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_call2_grid, + pcodec->apmsg_call1_call2_grid); + if (rc>=0) { + // Full AP mask need special handling + // All the three msg fields were given. + // To minimize false decodes we check the decoded message + // with what passed in the ap_set call + if (memcmp(pcodec->apmsg_call1_call2_grid,xdec, QRA64_K*sizeof(int))!=0) + return -1; + else + return 8; // decoded [mycall hiscall grid] + } + } + + // all decoding attempts failed + return rc; +} + + + +// Decode with given a-priori information +static int qra64_do_decode(int *xdec, const float *pix, const int *ap_mask, + const int *ap_x) +{ + int rc; + const float *ixsrc; + float ix_masked[QRA64_NC*QRA64_M]; // Masked intrinsic information + float ex[QRA64_NC*QRA64_M]; // Extrinsic information from the decoder + + float v2cmsg[QRA64_NMSG*QRA64_M]; // buffers for the decoder messages + float c2vmsg[QRA64_NMSG*QRA64_M]; + + if (ap_mask==NULL) { // no a-priori information + ixsrc = pix; // intrinsic source is what passed as argument + } else { + // a-priori information provided + // mask channel observations with a-priori + ix_mask(ix_masked,pix,ap_mask,ap_x); + ixsrc = ix_masked; // intrinsic source is the masked version + } + + // run the decoding algorithm + rc = qra_extrinsic(&QRA64_CODE,ex,ixsrc,QRA64_NITER,v2cmsg,c2vmsg); + if (rc<0) + return -1; // no convergence in given iterations + + // decode + qra_mapdecode(&QRA64_CODE,xdec,ex,ixsrc); + + // verify crc + if (calc_crc6(xdec,QRA64_K)!=xdec[QRA64_K]) // crc doesn't match (detected error) + return -2; // decoding was succesfull but crc doesn't match + + return 0; +} + + +// crc functions -------------------------------------------------------------- +// crc-6 generator polynomial +// g(x) = x^6 + a5*x^5 + ... + a1*x + a0 + +// g(x) = x^6 + x + 1 +#define CRC6_GEN_POL 0x30 // MSB=a0 LSB=a5 + +// g(x) = x^6 + x^2 + x + 1 (See: https://users.ece.cmu.edu/~koopman/crc/) +// #define CRC6_GEN_POL 0x38 // MSB=a0 LSB=a5. Simulation results are similar + +static int calc_crc6(const int *x, int sz) +{ + // todo: compute it faster using a look up table + int k,j,t,sr = 0; + for (k=0;k>1) ^ CRC6_GEN_POL; + else + sr = (sr>>1); + t>>=1; + } + } + return sr; +} + +static void ix_mask(float *dst, const float *src, const int *mask, + const int *x) +{ + // mask intrinsic information (channel observations) with a priori knowledge + + int k,kk, smask; + float *row; + + memcpy(dst,src,(QRA64_NC*QRA64_M)*sizeof(float)); + + for (k=0;k>22)&0x3F; + y[1]= (call1>>16)&0x3F; + y[2]= (call1>>10)&0x3F; + y[3]= (call1>>4)&0x3F; + y[4]= (call1<<2)&0x3F; + + y[4] |= (call2>>26)&0x3F; + y[5]= (call2>>20)&0x3F; + y[6]= (call2>>14)&0x3F; + y[7]= (call2>>8)&0x3F; + y[8]= (call2>>2)&0x3F; + y[9]= (call2<<4)&0x3F; + + y[9] |= (grid>>12)&0x3F; + y[10]= (grid>>6)&0x3F; + y[11]= (grid)&0x3F; + +} +void decodemsg_jt65(int *call1, int *call2, int *grid, const int *x) +{ + int nc1, nc2, ng; + + nc1 = x[4]>>2; + nc1 |= x[3]<<4; + nc1 |= x[2]<<10; + nc1 |= x[1]<<16; + nc1 |= x[0]<<22; + + nc2 = x[9]>>4; + nc2 |= x[8]<<2; + nc2 |= x[7]<<8; + nc2 |= x[6]<<14; + nc2 |= x[5]<<20; + nc2 |= (x[4]&0x03)<<26; + + ng = x[11]; + ng |= x[10]<<6; + ng |= (x[9]&0x0F)<<12; + + *call1 = nc1; + *call2 = nc2; + *grid = ng; +} diff --git a/map65/libm65/qra64/qra64_subs.c b/map65/libm65/qra64/qra64_subs.c new file mode 100644 index 000000000..b60f9fafa --- /dev/null +++ b/map65/libm65/qra64/qra64_subs.c @@ -0,0 +1,65 @@ +// qra64_subs.c +// Fortran interface routines for QRA64 + +#include "qra64.h" +#include + +static qra64codec *pqra64codec = NULL; + +void qra64_enc_(int x[], int y[]) +{ + if (pqra64codec==NULL) pqra64codec = qra64_init(QRA_USERAP); + qra64_encode(pqra64codec, y, x); +} + +void qra64_dec_(float r[], int* nc1, int* nc2, int* ng2, int* APtype, + int* iset, int* ns0, float* b0, int* nf0, + int xdec[], float* snr, int* rc) +{ +/* + APtype: AP +----------------------------------------------------------------------- + -1 0 (no AP information) + 0 [CQ/QRZ ? ? ] 25/37 + 1 [MyCall ? ? ] 25/37 + 2 [ ? HisCall ? ] 25/37 + 3 [MyCall HisCall ? ] 49/68 + 4 [MyCall HisCall grid] 68 + 5 [CQ/QRZ HisCall ? ] 49/68 + + rc Message format AP APTYPE Comments +------------------------------------------------------------------------ + -16 Failed sanity check + -2 Decoded but CRC failed + -1 No decode + 0 [ ? ? ? ] 0 -1 Decode with no AP info + 1 [CQ/QRZ ? ? ] 25 0 + 2 [CQ/QRZ ? _ ] 37 0 + 3 [MyCall ? ? ] 25 1 + 4 [MyCall ? _ ] 37 1 + 5 [MyCall HisCall ? ] 49 3 + 6 [ ? HisCall ? ] 25 2 Optional + 7 [ ? HisCall _ ] 37 2 Optional + 8 [MyCall HisCall Grid] 68 4 + 9 [CQ/QRZ HisCall ? ] 49 5 Optional (not needed?) + 10 [CQ/QRZ HisCall _ ] 68 5 Optional + 11 [CQ/QRZ HisCall Grid] 68 ? Optional +*/ + + float EbNodBEstimated; + int err=0; + int nSubmode=*ns0; + float b90=*b0; + int nFadingModel=*nf0; + + if(pqra64codec==NULL) pqra64codec = qra64_init(QRA_USERAP); + err=qra64_apset(pqra64codec,*nc1,*nc2,*ng2,*APtype); + if(err<0) printf("ERROR: qra64_apset returned %d\n",err); + + if(*iset==0) { + *rc = qra64_decode_fastfading(pqra64codec,&EbNodBEstimated,xdec,r, + nSubmode,b90,nFadingModel); + *snr = EbNodBEstimated - 31.0; + } +} + diff --git a/map65/libm65/qra64/qra64example.txt b/map65/libm65/qra64/qra64example.txt new file mode 100644 index 000000000..3add33d36 --- /dev/null +++ b/map65/libm65/qra64/qra64example.txt @@ -0,0 +1,88 @@ +$ qra64_nico -h + +QRA64 Mode Tests +2016, Nico Palermo - IV3NWV + +--------------------------- + +Syntax: qra64 [-s] [-c] [-a] [-t] [-h] +Options: + -s : set simulation SNR in 2500 Hz BW (default:-27.5 dB) + -c : set channel type 0=AWGN (default) 1=Rayleigh + -a : set decode type 0=NOAP 1=AUTOAP (default) 2=USERAP + -t: 0=simulate seq of msgs between IV3NWV and K1JT (default) + 1=simulate K1JT receiving K1JT IV3NWV JN66 + 2=simulate fast-fading routines (option -c ignored) +Options used only for fast-fading simulations: + -b : 90% fading bandwidth in Hz [1..230 Hz] (default = 2.5 Hz) + -m : fading model. 0=Gauss, 1=Lorentz (default = Lorentz) + -q : qra64 submode. 0=QRA64A,... 4=QRA64E (default = QRA64A) + -h: this help + + +############################################################################# +Usage example: + +qra64 -c2 -t2 -a2 -b50 -m1 -q2 -s-26.0 -n50000 + +Simulate a fast-fading channel (-c2) +Evaluate decoder performance (-t2) with +USER_AP (-a2) +B90 = 50 Hz (-b50) +Lorentz model (-m1) +submode QRA64C (-q2) +Input SNR = -26.0 dB (-s-26.0) +Simulate 50000 transmissions (-n50000) + +(type qra64 -h for command syntax) + +Command Output: + +Input SNR = -26.0dB ap-mode=USER AP + +Simulating the fast-fading channel +B90=50.00 Hz - Fading Model=Lorentz - Submode=QRA64C +Decoder metric = Matched to fast-fading signal + +Encoding msg [K1JT IV3NWV JN66] +50000 transmissions will be simulated + +K1JT decoder enabled for [CQ ? ?/blank] +K1JT decoder enabled for [K1JT ? ?/blank] +K1JT decoder enabled for [? IV3NWV ?/blank] +K1JT decoder enabled for [K1JT IV3NWV ?] +K1JT decoder enabled for [K1JT IV3NWV JN66] +K1JT decoder enabled for [CQ IV3NWV ?/b/JN66] + +Now decoding with K1JT's decoder... + 5.5 % +Undetected error with rc=6 + 13.1 % +Undetected error with rc=7 + 70.8 % +Undetected error with rc=1 + 75.8 % +Undetected error with rc=9 + 88.9 % +Undetected error with rc=6 + 100.0 % + +Msgs transmitted:50000 +Msg decoded: + +rc= 0 0 with [? ? ?] AP0 +rc= 1 0 with [CQ ? ?] AP27 +rc= 2 0 with [CQ ? ] AP42 +rc= 3 145 with [CALL ? ?] AP29 +rc= 4 0 with [CALL ? ] AP44 +rc= 5 12085 with [CALL CALL ?] AP57 +rc= 6 0 with [? CALL ?] AP29 +rc= 7 0 with [? CALL ] AP44 +rc= 8 24307 with [CALL CALL G] AP72 +rc= 9 0 with [CQ CALL ?] AP55 +rc=10 0 with [CQ CALL ] AP70 +rc=11 0 with [CQ CALL G] AP70 + +Total: 36537/50000 (5 undetected errors) + +Estimated SNR (average in dB) = -26.26 dB diff --git a/map65/libm65/qra64/qra64sim.f90 b/map65/libm65/qra64/qra64sim.f90 new file mode 100644 index 000000000..b7ca2e130 --- /dev/null +++ b/map65/libm65/qra64/qra64sim.f90 @@ -0,0 +1,170 @@ +program qra64sim + +! Generate simulated QRA64 data for testing the decoder. + + use wavhdr + use packjt + parameter (NMAX=54*12000) ! = 648,000 + parameter (NFFT=10*65536,NH=NFFT/2) + type(hdr) h !Header for .wav file + integer*2 iwave(NMAX) !Generated waveform + integer*4 itone(84) !Channel symbols (values 0-63) + real*4 xnoise(NMAX) !Generated random noise + real*4 dat(NMAX) !Generated real data + complex cdat(NMAX) !Generated complex waveform + complex cspread(0:NFFT-1) !Complex amplitude for Rayleigh fading + complex z + real*8 f0,dt,twopi,phi,dphi,baud,fsample,freq + character msg*22,fname*11,csubmode*1,arg*12 + character msgsent*22 + + nargs=iargc() + if(nargs.ne. 7) then + print *, 'Usage: qra64sim "msg" A-E Nsigs fDop DT Nfiles SNR' + print *, 'Example qra64sim "K1ABC W9XYZ EN37" A 10 0.2 0.0 1 0' + go to 999 + endif + call getarg(1,msg) + call getarg(2,csubmode) + mode64=2**(ichar(csubmode)-ichar('A')) + call getarg(3,arg) + read(arg,*) nsigs + call getarg(4,arg) + read(arg,*) fspread + call getarg(5,arg) + read(arg,*) xdt + call getarg(6,arg) + read(arg,*) nfiles + call getarg(7,arg) + read(arg,*) snrdb + + if(mode64.ge.8) nsigs=1 + rms=100. + fsample=12000.d0 !Sample rate (Hz) + dt=1.d0/fsample !Sample interval (s) + twopi=8.d0*atan(1.d0) + npts=54*12000 !Total samples in .wav file + nsps=6912 + baud=12000.d0/nsps !Keying rate = 1.7361111111 + nsym=84 !Number of channel symbols + h=default_header(12000,npts) + dfsig=2000.0/nsigs !Freq spacing between sigs in file (Hz) + ichk=0 + + write(*,1000) +1000 format('File Sig Freq A-E S/N DT Dop Message'/60('-')) + + do ifile=1,nfiles !Loop over requested number of files + write(fname,1002) ifile !Output filename +1002 format('000000_',i4.4) + open(10,file=fname//'.wav',access='stream',status='unknown') + xnoise=0. + cdat=0. + if(snrdb.lt.90) then + do i=1,npts + xnoise(i)=gran() !Generate gaussian noise + enddo + endif + + do isig=1,nsigs !Generate requested number of sigs + if(mod(nsigs,2).eq.0) f0=1500.0 + dfsig*(isig-0.5-nsigs/2) + if(mod(nsigs,2).eq.1) f0=1500.0 + dfsig*(isig-(nsigs+1)/2) + if(nsigs.eq.1) f0=1000.0 + xsnr=snrdb + if(snrdb.eq.0.0) xsnr=-20 - isig + + call genqra64(msg,ichk,msgsent,itone,itype) + + bandwidth_ratio=2500.0/6000.0 + sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*xsnr) + if(xsnr.gt.90.0) sig=1.0 + write(*,1020) ifile,isig,f0,csubmode,xsnr,xdt,fspread,msg +1020 format(i4,i4,f10.3,2x,a1,2x,f5.1,f6.2,f6.1,1x,a22) + + phi=0.d0 + dphi=0.d0 + k=(xdt+1.0)*12000 !Start audio at t = xdt + 1.0 s + isym0=-99 + do i=1,npts !Add this signal into cdat() + isym=i/nsps + 1 + if(isym.gt.nsym) exit + if(isym.ne.isym0) then + freq=f0 + itone(isym)*baud*mode64 + dphi=twopi*freq*dt + isym0=isym + endif + phi=phi + dphi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + z=cmplx(cos(xphi),sin(xphi)) + k=k+1 + if(k.ge.1) cdat(k)=cdat(k) + sig*z + enddo + enddo + + if(fspread.ne.0) then !Apply specified Doppler spread + df=12000.0/nfft + twopi=8*atan(1.0) + cspread(0)=1.0 + cspread(NH)=0. + b=6.0 !Lorenzian 3/28 onward + 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 + call random_number(r1) + phi1=twopi*r1 + z=a*cmplx(cos(phi1),sin(phi1)) + endif + cspread(i)=z + z=0. + if(x.lt.50.0) then + call random_number(r2) + phi2=twopi*r2 + z=a*cmplx(cos(phi2),sin(phi2)) + endif + cspread(NFFT-i)=z + enddo + + do i=0,NFFT-1 + f=i*df + if(i.gt.NH) f=(i-nfft)*df + s=real(cspread(i))**2 + aimag(cspread(i))**2 +! write(13,3000) i,f,s,cspread(i) +!3000 format(i5,f10.3,3f12.6) + enddo +! s=real(cspread(0))**2 + aimag(cspread(0))**2 +! write(13,3000) 1024,0.0,s,cspread(0) + + 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 + cdat=cspread(1:npts)*cdat !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 + + endif + + dat=aimag(cdat) + xnoise !Add the generated noise + fac=32767.0/nsigs + if(snrdb.ge.90.0) iwave(1:npts)=nint(fac*dat(1:npts)) + if(snrdb.lt.90.0) iwave(1:npts)=nint(rms*dat(1:npts)) + write(10) h,iwave(1:npts) !Save the .wav file + close(10) + enddo + +999 end program qra64sim diff --git a/map65/libm65/qra64b.f90 b/map65/libm65/qra64b.f90 new file mode 100644 index 000000000..71b7300e8 --- /dev/null +++ b/map65/libm65/qra64b.f90 @@ -0,0 +1,65 @@ +subroutine qra64b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & + mycall_12,hiscall_12,hisgrid_6,mode64,nwrite_qra64) + + parameter (MAXFFT1=5376000) !56*96000 + parameter (MAXFFT2=336000) !56*6000 (downsampled by 1/16) + complex ca(MAXFFT1),cb(MAXFFT1) !FFTs of raw x,y data + complex cx(0:MAXFFT2-1),cy(0:MAXFFT2-1) + logical xpol + real*8 fcenter + character*12 mycall_12,hiscall_12 + character*6 hisgrid_6 + common/cacb/ca,cb + data nzap/3/ + + open(17,file='red.dat',status='unknown') + + 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 + ikhz0=nint(1000.0*(fcenter-int(fcenter))) + k0=((ikhz-ikhz0+48.0+1.27)*1000.0+nfcal)/df + if(k0.lt.nh .or. k0.gt.nfft1-nh) go to 900 + + fac=1.0/nfft2 + cx(0:nh)=ca(k0:k0+nh) + cx(nh+1:nfft2-1)=ca(k0-nh+1:k0-1) + cx=fac*cx + if(xpol) then + cy(0:nh)=cb(k0:k0+nh) + cy(nh+1:nfft2-1)=cb(k0-nh+1:k0-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 + +! write(60) cx,cy,nutc,nqd,ikhz,mousedf,ntol,xpol,mycall_12, & +! hiscall_12,hisgrid_6 + + if(nzap.gt.0) call qra64zap(cx,cy,xpol,nzap) + +! Transform back to time domain with sample rate 6000 Hz. + call four2a(cx,nfft2,1,-1,1) + call four2a(cy,nfft2,1,-1,1) + + call qra64c(cx,cy,nutc,nqd,ikhz,mousedf,ntol,xpol,mycall_12, & + hiscall_12,hisgrid_6,mode64,nwrite_qra64) + close(17) + +900 return +end subroutine qra64b diff --git a/map65/libm65/qra64c.f90 b/map65/libm65/qra64c.f90 new file mode 100644 index 000000000..fab651059 --- /dev/null +++ b/map65/libm65/qra64c.f90 @@ -0,0 +1,221 @@ +subroutine qra64c(cx,cy,nutc,nqd,ikhz,nfqso,ntol,xpol,mycall_12, & + hiscall_12,hisgrid_6,mode64,nwrite_qra64) + + use packjt + parameter (NFFT2=336000) !56*6000 (downsampled by 1/16) + parameter (NMAX=60*12000,LN=1152*63) + + character decoded*22 + character*12 mycall_12,hiscall_12 + character*6 mycall,hiscall,hisgrid_6,grid + character*4 hisgrid + character cp*1,cmode*2 + logical xpol,ltext + complex cx(0:NFFT2-1),cy(0:NFFT2-1) + complex c00(0:720000) !Complex spectrum of dd() + complex c0(0:720000) !Complex data for dd() + real a(3) + real s3(LN) !Symbol spectra + real s3a(LN) !Symbol spectra + integer dat4(12) !Decoded message (as 12 integers) + integer dat4x(12) + integer nap(0:11) + data nap/0,2,3,2,3,4,2,3,6,4,6,6/,cmode/'$'/ + data nc1z/-1/,nc2z/-1/,ng2z/-1/,maxaptypez/-1/ + save + +! For now: + nf1=-3000 + nf2=3000 + ! mode64=1 + minsync=-1 + ndepth=3 + emedelay=2.5 + + irc=-1 + nwrite_qra64=0 + decoded=' ' + nft=99 + mycall=mycall_12(1:6) + hiscall=hiscall_12(1:6) + hisgrid=hisgrid_6(1:4) + call packcall(mycall,nc1,ltext) + call packcall(hiscall,nc2,ltext) + call packgrid(hisgrid,ng2,ltext) + nSubmode=0 + if(mode64.eq.2) nSubmode=1 + if(mode64.eq.4) nSubmode=2 + if(mode64.eq.8) nSubmode=3 + if(mode64.eq.16) nSubmode=4 + cmode(2:2)=char(ichar('A')+nSubmode) + b90=1.0 + nFadingModel=1 + maxaptype=4 + if(iand(ndepth,64).ne.0) maxaptype=5 + if(nc1.ne.nc1z .or. nc2.ne.nc2z .or. ng2.ne.ng2z .or. & + maxaptype.ne.maxaptypez) then + do naptype=0,maxaptype + if(naptype.eq.2 .and. maxaptype.eq.4) cycle + call qra64_dec(s3,nc1,nc2,ng2,naptype,1,nSubmode,b90, & + nFadingModel,dat4,snr2,irc) + enddo + nc1z=nc1 + nc2z=nc2 + ng2z=ng2 + maxaptypez=maxaptype + endif + naptype=maxaptype + npts2=NFFT2 + + ipz=0 + if(xpol) ipz=3 + do ip=0,ipz + if(ip.eq.0) c00(0:NFFT2-1)=conjg(cx) + if(ip.eq.1) c00(0:NFFT2-1)=0.707*conjg(cx+cy) + if(ip.eq.2) c00(0:NFFT2-1)=conjg(cy) + if(ip.eq.3) c00(0:NFFT2-1)=0.707*conjg(cx-cy) + + call sync64(c00,nf1,nf2,nfqso,ntol,mode64,emedelay,dtx,f0,jpk0,sync, & + sync2,width) + + nfreq=nint(f0) + if(mode64.eq.1 .and. minsync.ge.0 .and. (sync-7.0).lt.minsync) go to 900 + a=0. + a(1)=-f0 + call twkfreq(c00,c0,npts2,6000.0,a) + + irc=-99 + s3lim=20. + itryz=5 + itz=11 + if(mode64.eq.4) itz=9 + if(mode64.eq.2) itz=7 + if(mode64.eq.1) itz=5 + + if(mode64.eq.1) then + itz=0 + itryz=1 + endif + + LL=64*(mode64+2) + NN=63 + napmin=99 + do itry0=1,itryz + idt=itry0/2 + if(mod(itry0,2).eq.0) idt=-idt + jpk=jpk0 + 750*idt + call spec64(c0,npts2,mode64,jpk,s3a,LL,NN) + call pctile(s3a,LL*NN,40,base) + s3a=s3a/base + where(s3a(1:LL*NN)>s3lim) s3a(1:LL*NN)=s3lim + do iter=itz,0,-2 + b90=1.728**iter + if(b90.gt.230.0) cycle + if(b90.lt.0.15*width) exit + s3(1:LL*NN)=s3a(1:LL*NN) + call timer('qra64_de',0) + call qra64_dec(s3,nc1,nc2,ng2,naptype,0,nSubmode,b90, & + nFadingModel,dat4,snr2,irc) + call timer('qra64_de',1) + if(irc.eq.0) go to 10 + if(irc.gt.0) call badmsg(irc,dat4,nc1,nc2,ng2) + iirc=max(0,min(irc,11)) + if(irc.gt.0 .and. nap(iirc).lt.napmin) then + dat4x=dat4 + b90x=b90 + snr2x=snr2 + napmin=nap(iirc) + irckeep=irc + dtxkeep=jpk/6000.0 - 1.0 + itry0keep=itry0 + iterkeep=iter + npolkeep=ip*45 + endif + enddo + if(irc.eq.0) goto 5 + enddo + enddo + +5 if(napmin.ne.99) then + dat4=dat4x + b90=b90x + snr2=snr2x + irc=irckeep + dtx=dtxkeep + itry0=itry0keep + iter=iterkeep + npol=npolkeep + endif +10 decoded=' ' + + if(irc.ge.0) then + if(irc.eq.0) npol=ip*45 + call unpackmsg(dat4,decoded) !Unpack the user message + call fmtmsg(decoded,iz) + if(index(decoded,"000AAA ").ge.1) then + ! Suppress a certain type of garbage decode. + decoded=' ' + irc=-1 + endif + nft=100 + irc + nsnr=nint(snr2) + else + snr2=0. + endif + +900 if(irc.lt.0) then + sy=max(1.0,sync) + if(nSubmode.eq.0) nsnr=nint(10.0*log10(sy)-35.0) !A + if(nSubmode.eq.1) nsnr=nint(10.0*log10(sy)-34.0) !B + if(nSubmode.eq.2) nsnr=nint(10.0*log10(sy)-29.0) !C + if(nSubmode.eq.3) nsnr=nint(10.0*log10(sy)-29.0) !D + if(nSubmode.eq.4) nsnr=nint(10.0*log10(sy)-24.0) !E + 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(irc.ge.0) then + write(*,1010) ikHz,nfreq,npol,nutc,dtx,nsnr,cmode(1:1),decoded, & + irc,ntxpol,cp +1010 format('!',i3,i5,i4,i6.4,f5.1,i5,1x,a1,1x,a22,i2,5x,i5,1x,a1) + nwrite_qra64=nwrite_qra64+1 + freq=144.0 + 0.001*ikhz + write(21,1014) freq,nfreq,dtx,npol,nsnr,nutc,decoded,cp, & + cmode(1:1),cmode(2:2) +1014 format(f8.3,i5,f5.1,2i4,i5.4,2x,a22,2x,a1,3x,a1,1x,a1) + + if(index(decoded,'CQ ').gt.0 .or. index(decoded,'QRZ ').gt.0 .or. & + index(decoded,'QRT ').gt.0 .or. index(decoded,'CQV ').gt.0 .or. & + index(decoded,'CQH ').gt.0) then + write(19,1016) ikhz,nfreq,npol,nutc,dtx,nsnr,decoded,0,cmode +1016 format(i3,i5,i4,i5.4,f7.1,i4,2x,a22,i3,1x,a2) + flush(19) + endif + else + write(*,1010) ikHz,nfreq,npol,nutc,dtx,nsnr + nwrite_qra64=nwrite_qra64+1 + endif + + return +end subroutine qra64c diff --git a/map65/libm65/qra64d.f90 b/map65/libm65/qra64d.f90 new file mode 100644 index 000000000..a310557b6 --- /dev/null +++ b/map65/libm65/qra64d.f90 @@ -0,0 +1,48 @@ +program qra64d + + use packjt + parameter (NFFT2=336000) !56*6000 (downsampled by 1/16) + parameter (NMAX=60*12000,LN=1152*63) + + character decoded*22 + character*12 mycall_12,hiscall_12 + character*6 mycall,hiscall,hisgrid_6 + character*4 hisgrid + character*1 cp + logical ltext + complex cx(0:NFFT2-1),cy(0:NFFT2-1) + complex c00(0:720000) !Complex spectrum of dd() + complex c0(0:720000) !Complex data for dd() + real a(3) + real s3(LN) !Symbol spectra + real s3a(LN) !Symbol spectra + integer dat4(12) !Decoded message (as 12 integers) + integer dat4x(12) + integer nap(0:11) + data nap/0,2,3,2,3,4,2,3,6,4,6,6/ + data nc1z/-1/,nc2z/-1/,ng2z/-1/,maxaptypez/-1/ + common/tracer/ limtrace,lu + + limtrace=0 + lu=12 + open(12,file='timer.out',status='unknown') + call timer('qra64d ',0) + nzap=1 + +1 read(60,end=900) cx,cy,nutc,nqd,ikhz,mousedf,ntol,xpol,mycall_12, & + hiscall_12,hisgrid_6 + +! Eliminate birdies: + if(nzap.gt.0) call qra64zap(cx,cy,nzap) + +! Transform back to time domain with sample rate 6000 Hz. + call four2a(cx,NFFT2,1,-1,1) + call four2a(cy,NFFT2,1,-1,1) + + call qra64c(cx,cy,nutc,nqd,ikhz,mousedf,ntol,xpol,mycall_12, & + hiscall_12,hisgrid_6,nwrite_qra64) + goto 1 +900 call timer('qra64d ',1) + call timer('qra64d ',101) + +end program qra64d diff --git a/map65/libm65/qra64zap.f90 b/map65/libm65/qra64zap.f90 new file mode 100644 index 000000000..b73bd60d0 --- /dev/null +++ b/map65/libm65/qra64zap.f90 @@ -0,0 +1,62 @@ +subroutine qra64zap(cx,cy,xpol,nzap) + + parameter (NFFT1=5376000) !56*96000 + parameter (NFFT2=336000) !56*6000 (downsampled by 1/16) + complex cx(0:NFFT2-1),cy(0:NFFT2-1) + real s(-1312:1312) + integer iloc(1) + logical xpol + + slimit=3.0 + sbottom=1.5 + nadd=128 + nblks=NFFT2/nadd + nbh=nblks/2 + k=-1 + s=0. + df=nadd*96000.0/NFFT1 + do i=1,nblks + j=i + if(j.gt.nblks/2) j=j-nblks + do n=1,nadd + k=k+1 + s(j)=s(j) + real(cx(k))**2 + aimag(cx(k))**2 + if(xpol) s(j)=s(j) + real(cy(k))**2 + aimag(cy(k))**2 + enddo + enddo + call pctile(s,nblks,45,base) + s=s/base + do nzap=1,3 + iloc=maxloc(s) + ipk=iloc(1)-1313 + smax=s(ipk) + nw=3 + do n=1,3 + nw=2*nw + if(ipk-2*nw.lt.-1312) cycle + if(ipk+2*nw.gt. 1312) cycle + s1=maxval(s(ipk-2*nw:ipk-nw)) + s2=maxval(s(ipk+nw:ipk+2*nw)) + if(smax.gt.slimit .and. s1.lt.sbottom .and. s2.lt.sbottom) then + s(ipk-nw:ipk+nw)=1.0 + i0=ipk + if(i0.lt.0) i0=i0+2625 + ia=(i0-nw)*nadd + ib=(i0+nw)*nadd + cx(ia:ib)=0. + cy(ia:ib)=0. + exit + endif + enddo + enddo + +! rewind 75 +! do i=-nbh,nbh +! freq=i*df +! write(75,3001) freq,s(i) +!3001 format(2f12.3) +! enddo +! flush(75) + + return +end subroutine qra64zap diff --git a/map65/libm65/qracodes/Makefile.Win b/map65/libm65/qracodes/Makefile.Win new file mode 100644 index 000000000..fb30504e7 --- /dev/null +++ b/map65/libm65/qracodes/Makefile.Win @@ -0,0 +1,33 @@ +CC = gcc +CFLAGS = -O2 -Wall -I. -D_WIN32 + +# Default rules +%.o: %.c + ${CC} ${CFLAGS} -c $< +%.o: %.f + ${FC} ${FFLAGS} -c $< +%.o: %.F + ${FC} ${FFLAGS} -c $< +%.o: %.f90 + ${FC} ${FFLAGS} -c $< +%.o: %.F90 + ${FC} ${FFLAGS} -c $< + +all: libqra64.a qracodes.exe + +OBJS1 = normrnd.o npfwht.o pdmath.o qra12_63_64_irr_b.o \ + qra13_64_64_irr_e.o qracodes.o + +libqra64.a: $(OBJS1) + ar cr libqra64.a $(OBJS1) + ranlib libqra64.a + +OBJS2 = main.o + +qracodes.exe: $(OBJS2) + ${CC} -o qracodes.exe $(OBJS2) libqra64.a -lm + +.PHONY : clean + +clean: + $(RM) *.o libqra64.a qracodes.exe diff --git a/map65/libm65/qracodes/ebno10000.txt b/map65/libm65/qracodes/ebno10000.txt new file mode 100644 index 000000000..c41174b93 --- /dev/null +++ b/map65/libm65/qracodes/ebno10000.txt @@ -0,0 +1,7 @@ +# Eb/No Values to be used during the code simulation +# Each line of this file indicates the Eb/No value to be simulated (in dB) +# and the number of errors to be detected by the decoder +0.6 10000 +1.1 10000 +1.6 10000 +2.1 10000 diff --git a/map65/libm65/qracodes/ebnovalues.txt b/map65/libm65/qracodes/ebnovalues.txt new file mode 100644 index 000000000..7dba138f0 --- /dev/null +++ b/map65/libm65/qracodes/ebnovalues.txt @@ -0,0 +1,15 @@ +# Eb/No Values to be used during the code simulation +# Each line of this file indicates the Eb/No value to be simulated (in dB) +# and the number of errors to be detected by the decoder +1.1 1000 +1.6 1000 +2.1 1000 +2.6 1000 +3.1 1000 +3.6 1000 +4.1 1000 +4.6 1000 +5.1 500 +5.6 200 +6.1 100 +6.6 50 \ No newline at end of file diff --git a/map65/libm65/qracodes/ebnovaluesfast.txt b/map65/libm65/qracodes/ebnovaluesfast.txt new file mode 100644 index 000000000..b057b312d --- /dev/null +++ b/map65/libm65/qracodes/ebnovaluesfast.txt @@ -0,0 +1,11 @@ +# Eb/No Values to be used during the code simulation +# Each line of this file indicates the Eb/No value to be simulated (in dB) +# and the number of errors to be detected by the decoder +1.1 500 +1.6 500 +2.1 500 +2.6 500 +3.1 500 +3.6 500 +4.1 200 +4.6 50 diff --git a/map65/libm65/qracodes/main.c b/map65/libm65/qracodes/main.c new file mode 100644 index 000000000..5f9f067d4 --- /dev/null +++ b/map65/libm65/qracodes/main.c @@ -0,0 +1,737 @@ +// main.c +// Word Error Rate test example for Q-ary RA codes over GF(64) +// +// (c) 2016 - Nico Palermo, IV3NWV +// +// Thanks to Andrea Montefusco IW0HDV for his help on adapting the sources +// to OSs other than MS Windows +// +// ------------------------------------------------------------------------------ +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. +// +// Files in this package: +// main.c - this file +// normrnd.c/.h - random gaussian number generator +// npfwht.c/.h - Fast Walsh-Hadamard Transforms +// pdmath.c/.h - Elementary math on probability distributions +// qra12_63_64_irr_b.c/.h - Tables for a QRA(12,63) irregular RA code over GF(64) +// qra13_64_64_irr_e.c/.h - Tables for a QRA(13,64) irregular RA code " " +// qracodes.c/.h - QRA codes encoding/decoding functions +// +// ------------------------------------------------------------------------------- +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +// ----------------------------------------------------------------------------- + +// Two codes are available for simulations in this sowftware release: + +// QRA12_63_64_IRR_B: K=12 N=63 Q=64 irregular QRA code (defined in qra12_63_64_irr_b.h /.c) +// QRA13_64_64_IRR_E: K=13 N=64 Q=64 irregular QRA code (defined in qra13_64_64_irr_b.h /.c) + +// Codes with K=13 are designed to include a CRC as the 13th information symbol +// and improve the code UER (Undetected Error Rate). +// The CRC symbol is not sent along the channel (the codes are punctured) and the +// resulting code is still a (12,63) code with an effective code rate of R = 12/63. + +// ------------------------------------------------------------------------------ + +// OS dependent defines and includes -------------------------------------------- + +#if _WIN32 // note the underscore: without it, it's not msdn official! + // Windows (x64 and x86) + #include // required only for GetTickCount(...) + #include // _beginthread +#endif + +#if defined(__linux__) + +// remove unwanted macros +#define __cdecl + +// implements Windows API +#include + + unsigned int GetTickCount(void) { + struct timespec ts; + unsigned int theTick = 0U; + clock_gettime( CLOCK_REALTIME, &ts ); + theTick = ts.tv_nsec / 1000000; + theTick += ts.tv_sec * 1000; + return theTick; +} + +// Convert Windows millisecond sleep +// +// VOID WINAPI Sleep(_In_ DWORD dwMilliseconds); +// +// to Posix usleep (in microseconds) +// +// int usleep(useconds_t usec); +// +#include +#define Sleep(x) usleep(x*1000) + +#endif + +#if defined(__linux__) || ( defined(__MINGW32__) || defined (__MIGW64__) ) +#include +#endif + +#if __APPLE__ +#endif + +#include +#include + +#include "qracodes.h" +#include "normrnd.h" // gaussian numbers generator +#include "pdmath.h" // operations on probability distributions + +// defined codes +#include "qra12_63_64_irr_b.h" +#include "qra13_64_64_irr_e.h" + +// ----------------------------------------------------------------------------------- + +#define NTHREADS_MAX 160 + +// channel types +#define CHANNEL_AWGN 0 +#define CHANNEL_RAYLEIGH 1 + +// amount of a-priori information provided to the decoder +#define AP_NONE 0 +#define AP_28 1 +#define AP_44 2 +#define AP_56 3 + +const char ap_str[4][16] = { + "None", + "28 bit", + "44 bit", + "56 bit" +}; + +const char fnameout_pfx[2][64] = { + "wer-awgn-", + "wer-rayleigh-" +}; +const char fnameout_sfx[4][64] = { + "-ap00.txt", + "-ap28.txt", + "-ap44.txt", + "-ap56.txt" +}; + +const int ap_masks_jt65[4][13] = { +// Each row must be 13 entries long (to handle puntc. codes 13,64) +// The mask of 13th symbol (crc) is alway initializated to 0 + // AP0 - no a-priori knowledge + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + // AP28 - 1st field known [cq ? ?] or [dst ? ?] + {0x3F,0x3F,0x3F,0x3F,0x3C, 0, 0, 0, 0, 0, 0, 0}, + // AP44 - 1st and 3rd fields known [cq ? 0] or [dst ? 0] + {0x3F,0x3F,0x3F,0x3F,0x3C, 0, 0, 0, 0,0x0F,0x3F,0x3F}, + // AP56 - 1st and 2nd fields known [dst src ?] + {0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x30, 0, 0} +}; + +void ix_mask(const qracode *pcode, float *r, const int *mask, const int *x); + +void printword(char *msg, int *x, int size) +{ + int k; + printf("\n%s ",msg); + for (k=0;kc msg buffer + float *qra_c2vmsg; //[qra_NMSG*qra_M]; MP decoder c->v msg buffer + float *rp; // [qra_N*qra_M]; received samples (real component) buffer + float *rq; // [qra_N*qra_M]; received samples (imag component) buffer + float *chp; //[qra_N]; channel gains (real component) buffer + float *chq; //[qra_N]; channel gains (imag component) buffer + float *r; //[qra_N*qra_M]; received samples (amplitude) buffer + float *ix; // [qra_N*qra_M]; // intrinsic information to the MP algorithm + float *ex; // [qra_N*qra_M]; // extrinsic information from the MP algorithm + +} wer_test_ds; + +typedef void( __cdecl *pwer_test_thread)(wer_test_ds*); + +// crc-6 generator polynomial +// g(x) = x^6 + a5*x^5 + ... + a1*x + a0 + +// g(x) = x^6 + x + 1 +#define CRC6_GEN_POL 0x30 // MSB=a0 LSB=a5 + +// g(x) = x^6 + x^2 + x + 1 (as suggested by Joe. See: https://users.ece.cmu.edu/~koopman/crc/) +// #define CRC6_GEN_POL 0x38 // MSB=a0 LSB=a5. Simulation results are similar + +int calc_crc6(int *x, int sz) +{ + int k,j,t,sr = 0; + for (k=0;k>1) ^ CRC6_GEN_POL; + else + sr = (sr>>1); + t>>=1; + } + } + return sr; +} + +void wer_test_thread(wer_test_ds *pdata) +{ + const qracode *pcode=pdata->pcode; + const int qra_K = pcode->K; + const int qra_N = pcode->N; + const int qra_M = pcode->M; + const int qra_m = pcode->m; + const int NSAMPLES = pcode->N*pcode->M; + + const float No = 1.0f; // noise spectral density + const float sigma = (float)sqrt(No/2.0f); // std dev of noise I/Q components + const float sigmach = (float)sqrt(1/2.0f); // std dev of channel I/Q gains + + // Eb/No value for which we optimize the bessel metric + const float EbNodBMetric = 2.8f; + const float EbNoMetric = (float)pow(10,EbNodBMetric/10); + + int k,t,j,diff; + float R; + float EsNoMetric; + float EbNo, EsNo, Es, A; + int channel_type, code_type; + int nt=0; // transmitted codewords + int nerrs = 0; // total number of errors + int nerrsu = 0; // number of undetected errors + int rc; + + + // inizialize pointer to required buffers + int *x=pdata->x; // message buffer + int *y=pdata->y, *ydec=pdata->ydec; // encoded/decoded codeword buffers + float *qra_v2cmsg=pdata->qra_v2cmsg; // table of the v->c messages + float *qra_c2vmsg=pdata->qra_c2vmsg; // table of the c->v messages + float *rp=pdata->rp; // received samples (real component) + float *rq=pdata->rq; // received samples (imag component) + float *chp=pdata->chp; // channel gains (real component) + float *chq=pdata->chq; // channel gains (imag component) + float *r=pdata->r; // received samples amplitudes + float *ix=pdata->ix; // intrinsic information to the MP algorithm + float *ex=pdata->ex; // extrinsic information from the MP algorithm + + channel_type = pdata->channel_type; + code_type = pcode->type; + + // define the (true) code rate accordingly to the code type + switch(code_type) { + case QRATYPE_CRC: + R = 1.0f*(qra_K-1)/qra_N; + break; + case QRATYPE_CRCPUNCTURED: + R = 1.0f*(qra_K-1)/(qra_N-1); + break; + case QRATYPE_NORMAL: + default: + R = 1.0f*(qra_K)/(qra_N); + } + + EsNoMetric = 1.0f*qra_m*R*EbNoMetric; + + EbNo = (float)pow(10,pdata->EbNodB/10); + EsNo = 1.0f*qra_m*R*EbNo; + Es = EsNo*No; + A = (float)sqrt(Es); + + + // encode the input + if (code_type==QRATYPE_CRC || code_type==QRATYPE_CRCPUNCTURED) { + // compute the information message symbol check as the (negated) xor of all the + // information message symbols + for (k=0;k<(qra_K-1);k++) + x[k]=k%qra_M; + x[k]=calc_crc6(x,qra_K-1); + } + else + for (k=0;kstop==0) { + + // simulate the channel + // NOTE: in the case that the code is punctured, for simplicity + // we compute the channel outputs and the metric also for the crc symbol + // then we ignore its observation. + normrnd_s(rp,NSAMPLES,0,sigma); + normrnd_s(rq,NSAMPLES,0,sigma); + + if (channel_type == CHANNEL_AWGN) { + for (k=0;kdone = 1; + return; // unknown channel type + } + + // compute the squares of the amplitudes of the received samples + for (k=0;km,pcode->N,EsNoMetric); + + if (code_type==QRATYPE_CRCPUNCTURED) { + // ignore observations of the CRC symbol as it is not actually sent + // over the channel + pd_init(PD_ROWADDR(ix,qra_M,qra_K),pd_uniform(qra_m),qra_M); + } + + + if (pdata->ap_index!=0) + // mask channel observations with a priori knowledge + ix_mask(pcode,ix,ap_masks_jt65[pdata->ap_index],x); + + + // compute the extrinsic symbols probabilities with the message-passing algorithm + // stop if extrinsic information does not converges to 1 within the given number of iterations + rc = qra_extrinsic(pcode,ex,ix,100,qra_v2cmsg,qra_c2vmsg); + + if (rc>=0) { // the MP algorithm converged to Iex~1 in rc iterations + + // decode the codeword + qra_mapdecode(pcode,ydec,ex,ix); + + // look for undetected errors + if (code_type==QRATYPE_CRC || code_type==QRATYPE_CRCPUNCTURED) { + + j = 0; diff = 0; + for (k=0;k<(qra_K-1);k++) + diff |= (ydec[k]!=x[k]); + t = calc_crc6(ydec,qra_K-1); + if (t!=ydec[k]) // error detected - crc doesn't matches + nerrs += 1; + else + if (diff) { // decoded message is not equal to the transmitted one but + // the crc test passed + // add as undetected error + nerrsu += 1; + nerrs += 1; + // uncomment to see what the undetected error pattern looks like + //printword("U", ydec); + } + } + else + for (k=0;knt=nt; + pdata->nerrs=nerrs; + pdata->nerrsu=nerrsu; + + } + + pdata->done=1; + + #if _WIN32 + _endthread(); + #endif +} + +#if defined(__linux__) || ( defined(__MINGW32__) || defined (__MIGW64__) ) + +void *wer_test_pthread(void *p) +{ + wer_test_thread ((wer_test_ds *)p); + return 0; +} + +#endif + +void ix_mask(const qracode *pcode, float *r, const int *mask, const int *x) +{ + // mask intrinsic information (channel observations) with a priori knowledge + + int k,kk, smask; + const int qra_K=pcode->K; + const int qra_M=pcode->M; + const int qra_m=pcode->m; + + for (k=0;kNTHREADS_MAX) { + printf("Error: nthreads should be <=%d\n",NTHREADS_MAX); + return -1; + } + + sprintf(fnameout,"%s%s%s", + fnameout_pfx[chtype], + pcode->name, + fnameout_sfx[ap_index]); + + fout = fopen(fnameout,"w"); + fprintf(fout,"# Channel (0=AWGN,1=Rayleigh), Eb/No (dB), Transmitted codewords, Errors, Undetected Errors, Avg dec. time (ms), WER\n"); + + printf("\nTesting the code %s over the %s channel\nSimulation data will be saved to %s\n", + pcode->name, + chtype==CHANNEL_AWGN?"AWGN":"Rayleigh", + fnameout); + fflush (stdout); + + // init fixed thread parameters and preallocate buffers + for (j=0;jK*sizeof(int)); + wt[j].y = (int*)malloc(pcode->N*sizeof(int)); + wt[j].ydec = (int*)malloc(pcode->N*sizeof(int)); + wt[j].qra_v2cmsg = (float*)malloc(pcode->NMSG*pcode->M*sizeof(float)); + wt[j].qra_c2vmsg = (float*)malloc(pcode->NMSG*pcode->M*sizeof(float)); + wt[j].rp = (float*)malloc(pcode->N*pcode->M*sizeof(float)); + wt[j].rq = (float*)malloc(pcode->N*pcode->M*sizeof(float)); + wt[j].chp = (float*)malloc(pcode->N*sizeof(float)); + wt[j].chq = (float*)malloc(pcode->N*sizeof(float)); + wt[j].r = (float*)malloc(pcode->N*pcode->M*sizeof(float)); + wt[j].ix = (float*)malloc(pcode->N*pcode->M*sizeof(float)); + wt[j].ex = (float*)malloc(pcode->N*pcode->M*sizeof(float)); + } + + + for (k=0;k=nerrstgt[k]) { + for (j=0;j] [-t] [-c] [-a] [-f[-h]\n"); + printf("Options: \n"); + printf(" -q: code to simulate. 0=qra_12_63_64_irr_b\n"); + printf(" 1=qra_13_64_64_irr_e (default)\n"); + printf(" -t : number of threads to be used for the simulation [1..24]\n"); + printf(" (default=8)\n"); + printf(" -c : channel_type. 0=AWGN 1=Rayleigh \n"); + printf(" (default=AWGN)\n"); + printf(" -a : amount of a-priori information provided to decoder. \n"); + printf(" 0= No a-priori (default)\n"); + printf(" 1= 28 bit \n"); + printf(" 2= 44 bit \n"); + printf(" 3= 56 bit \n"); + printf(" -f : name of the file containing the Eb/No values to be simulated\n"); + printf(" (default=ebnovalues.txt)\n"); + printf(" This file should contain lines in this format:\n"); + printf(" # Eb/No(dB) Target Errors\n"); + printf(" 0.1 5000\n"); + printf(" 0.6 5000\n"); + printf(" 1.1 1000\n"); + printf(" 1.6 1000\n"); + printf(" ...\n"); + printf(" (lines beginning with a # are treated as comments\n\n"); +} + +#define SIM_POINTS_MAX 20 + +int main(int argc, char* argv[]) +{ + + float EbNodB[SIM_POINTS_MAX]; + int nerrstgt[SIM_POINTS_MAX]; + FILE *fin; + + char fnamein[128]= "ebnovalues.txt"; + char buf[128]; + + int nitems = 0; + int code_idx = 1; + int nthreads = 8; + int ch_type = CHANNEL_AWGN; + int ap_index = AP_NONE; + + // parse command line + while(--argc) { + argv++; + if (strncmp(*argv,"-h",2)==0) { + syntax(); + return 0; + } + else + if (strncmp(*argv,"-q",2)==0) { + code_idx = (int)atoi((*argv)+2); + if (code_idx>1) { + printf("Invalid code index\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-t",2)==0) { + nthreads = (int)atoi((*argv)+2); + printf("nthreads = %d\n",nthreads); + if (nthreads>NTHREADS_MAX) { + printf("Invalid number of threads\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-c",2)==0) { + ch_type = (int)atoi((*argv)+2); + if (ch_type>CHANNEL_RAYLEIGH) { + printf("Invalid channel type\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-a",2)==0) { + ap_index = (int)atoi((*argv)+2); + if (ap_index>AP_56) { + printf("Invalid a-priori information index\n"); + syntax(); + return -1; + } + } + else + if (strncmp(*argv,"-f",2)==0) { + strncpy(fnamein,(*argv)+2,127); + } + else + if (strncmp(*argv,"-h",2)==0) { + syntax(); + return -1; + } + else { + printf("Invalid option\n"); + syntax(); + return -1; + } + } + + // parse points to be simulated from the input file + fin = fopen(fnamein,"r"); + if (!fin) { + printf("Can't open file: %s\n",fnamein); + syntax(); + } + + while (fgets(buf,128,fin)!=0) + if (*buf=='#' || *buf=='\n' ) + continue; + else + if (nitems==SIM_POINTS_MAX) + break; + else + if (sscanf(buf,"%f %u",&EbNodB[nitems],&nerrstgt[nitems])!=2) { + printf("Invalid input file format\n"); + syntax(); + return -1; + } + else + nitems++; + + fclose(fin); + + if (nitems==0) { + printf("No Eb/No point specified in file %s\n",fnamein); + syntax(); + return -1; + } + + printf("\nQ-ary Repeat-Accumulate Code Word Error Rate Simulator\n"); + printf("2016, Nico Palermo - IV3NWV\n\n"); + + printf("Nthreads = %d\n",nthreads); + printf("Channel = %s\n",ch_type==CHANNEL_AWGN?"AWGN":"Rayleigh"); + printf("Codename = %s\n",codetotest[code_idx]->name); + printf("A-priori = %s\n",ap_str[ap_index]); + printf("Eb/No input file = %s\n\n",fnamein); + + wer_test_proc(codetotest[code_idx], nthreads, ch_type, ap_index, EbNodB, nerrstgt, nitems); + + return 0; +} + diff --git a/map65/libm65/qracodes/normrnd.c b/map65/libm65/qracodes/normrnd.c new file mode 100644 index 000000000..90abfa425 --- /dev/null +++ b/map65/libm65/qracodes/normrnd.c @@ -0,0 +1,82 @@ +// normrnd.c +// functions to generate gaussian distributed numbers +// +// (c) 2016 - Nico Palermo, IV3NWV - Microtelecom Srl, Italy +// +// Credits to Andrea Montefusco - IW0HDV for his help on adapting the sources +// to OSs other than MS Windows +// +// ------------------------------------------------------------------------------ +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + + +#include "normrnd.h" + +#if _WIN32 // note the underscore: without it, it's not msdn official! + // Windows (x64 and x86) + #include // required only for GetTickCount(...) + #define K_RAND_MAX UINT_MAX +#elif _SVID_SOURCE || _XOPEN_SOURCE || __unix__ || (defined (__APPLE__) && defined(__MACH__)) /* POSIX or Unix or Apple */ + #include + #define rand_s(x) (*x)=(unsigned int)lrand48() // returns unsigned integers in the range 0..0x7FFFFFFF + #define K_RAND_MAX 0x7FFFFFFF // that's the max number + // generated by lrand48 +#else + #error "No good quality PRNG found" +#endif + + +// use MS rand_s(...) function +void normrnd_s(float *dst, int nitems, float mean, float stdev) +{ + unsigned int r; + float phi=0, u=0; + int set = 0; + + while (nitems--) + if (set==1) { + *dst++ = (float)sin(phi)*u*stdev+mean; + set = 0; + } + else { + rand_s((unsigned int*)&r); phi = (M_2PI/(1.0f+K_RAND_MAX))*r; + rand_s((unsigned int*)&r); u = (float)sqrt(-2.0f* log( (1.0f/(1.0f+K_RAND_MAX))*(1.0f+r) ) ); + *dst++ = (float)cos(phi)*u*stdev+mean; + set=1; + } +} + +/* NOT USED +// use MS rand() function +void normrnd(float *dst, int nitems, float mean, float stdev) +{ + float phi=0, u=0; + int set = 0; + + while (nitems--) + if (set==1) { + *dst++ = (float)sin(phi)*u*stdev+mean; + set = 0; + } + else { + phi = (M_2PI/(1.0f+RAND_MAX))*rand(); + u = (float)sqrt(-2.0f* log( (1.0f/(1.0f+RAND_MAX))*(1.0f+rand()) ) ); + *dst++ = (float)cos(phi)*u*stdev+mean; + set=1; + } +} +*/ diff --git a/map65/libm65/qracodes/normrnd.h b/map65/libm65/qracodes/normrnd.h new file mode 100644 index 000000000..dd4b65bbe --- /dev/null +++ b/map65/libm65/qracodes/normrnd.h @@ -0,0 +1,51 @@ +// normrnd.h +// Functions to generate gaussian distributed numbers +// +// (c) 2016 - Nico Palermo, IV3NWV - Microtelecom Srl, Italy +// ------------------------------------------------------------------------------ +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +#ifndef _normrnd_h_ +#define _normrnd_h_ + +#define _CRT_RAND_S +#include + +#define _USE_MATH_DEFINES +#include +#define M_2PI (2.0f*(float)M_PI) + +#ifdef __cplusplus +extern "C" { +#endif + +void normrnd_s(float *dst, int nitems, float mean, float stdev); +// generate a random array of numbers with a gaussian distribution of given mean and stdev +// use MS rand_s(...) function + +/* not used +void normrnd(float *dst, int nitems, float mean, float stdev); +// generate a random array of numbers with a gaussian distribution of given mean and stdev +// use MS rand() function +*/ + +#ifdef __cplusplus +} +#endif + +#endif // _normrnd_h_ + diff --git a/map65/libm65/qracodes/npfwht.c b/map65/libm65/qracodes/npfwht.c new file mode 100644 index 000000000..5732ce913 --- /dev/null +++ b/map65/libm65/qracodes/npfwht.c @@ -0,0 +1,216 @@ +// npfwht.c +// Basic implementation of the Fast Walsh-Hadamard Transforms +// +// (c) 2016 - Nico Palermo, IV3NWV - Microtelecom Srl, Italy +// ------------------------------------------------------------------------------ +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (repeat and accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +#include "npfwht.h" + +#define WHBFY(dst,src,base,offs,dist) { dst[base+offs]=src[base+offs]+src[base+offs+dist]; dst[base+offs+dist]=src[base+offs]-src[base+offs+dist]; } + +typedef void (*pnp_fwht)(float*,float*); + +static void np_fwht2(float *dst, float *src); + +static void np_fwht1(float *dst, float *src); +static void np_fwht2(float *dst, float *src); +static void np_fwht4(float *dst, float *src); +static void np_fwht8(float *dst, float *src); +static void np_fwht16(float *dst, float *src); +static void np_fwht32(float *dst, float *src); +static void np_fwht64(float *dst, float *src); + +static pnp_fwht np_fwht_tab[7] = { + np_fwht1, + np_fwht2, + np_fwht4, + np_fwht8, + np_fwht16, + np_fwht32, + np_fwht64 +}; + +void np_fwht(int nlogdim, float *dst, float *src) +{ + np_fwht_tab[nlogdim](dst,src); +} + +static void np_fwht1(float *dst, float *src) +{ + dst[0] = src[0]; +} + + +static void np_fwht2(float *dst, float *src) +{ + float t[2]; + + WHBFY(t,src,0,0,1); + dst[0]= t[0]; + dst[1]= t[1]; +} + +static void np_fwht4(float *dst, float *src) +{ + float t[4]; + + // group 1 + WHBFY(t,src,0,0,2); WHBFY(t,src,0,1,2); + // group 2 + WHBFY(dst,t,0,0,1); WHBFY(dst,t,2,0,1); +}; + + +static void np_fwht8(float *dst, float *src) +{ + float t[16]; + float *t1=t, *t2=t+8; + + // group 1 + WHBFY(t1,src,0,0,4); WHBFY(t1,src,0,1,4); WHBFY(t1,src,0,2,4); WHBFY(t1,src,0,3,4); + // group 2 + WHBFY(t2,t1,0,0,2); WHBFY(t2,t1,0,1,2); WHBFY(t2,t1,4,0,2); WHBFY(t2,t1,4,1,2); + // group 3 + WHBFY(dst,t2,0,0,1); WHBFY(dst,t2,2,0,1); WHBFY(dst,t2,4,0,1); WHBFY(dst,t2,6,0,1); +}; + + +static void np_fwht16(float *dst, float *src) +{ + float t[32]; + float *t1=t, *t2=t+16; + + // group 1 + WHBFY(t1,src,0,0,8); WHBFY(t1,src,0,1,8); WHBFY(t1,src,0,2,8); WHBFY(t1,src,0,3,8); + WHBFY(t1,src,0,4,8); WHBFY(t1,src,0,5,8); WHBFY(t1,src,0,6,8); WHBFY(t1,src,0,7,8); + // group 2 + WHBFY(t2,t1,0,0,4); WHBFY(t2,t1,0,1,4); WHBFY(t2,t1,0,2,4); WHBFY(t2,t1,0,3,4); + WHBFY(t2,t1,8,0,4); WHBFY(t2,t1,8,1,4); WHBFY(t2,t1,8,2,4); WHBFY(t2,t1,8,3,4); + // group 3 + WHBFY(t1,t2,0,0,2); WHBFY(t1,t2,0,1,2); WHBFY(t1,t2,4,0,2); WHBFY(t1,t2,4,1,2); + WHBFY(t1,t2,8,0,2); WHBFY(t1,t2,8,1,2); WHBFY(t1,t2,12,0,2); WHBFY(t1,t2,12,1,2); + // group 4 + WHBFY(dst,t1,0,0,1); WHBFY(dst,t1,2,0,1); WHBFY(dst,t1,4,0,1); WHBFY(dst,t1,6,0,1); + WHBFY(dst,t1,8,0,1); WHBFY(dst,t1,10,0,1); WHBFY(dst,t1,12,0,1); WHBFY(dst,t1,14,0,1); + +} + +static void np_fwht32(float *dst, float *src) +{ + float t[64]; + float *t1=t, *t2=t+32; + + // group 1 + WHBFY(t1,src,0,0,16); WHBFY(t1,src,0,1,16); WHBFY(t1,src,0,2,16); WHBFY(t1,src,0,3,16); + WHBFY(t1,src,0,4,16); WHBFY(t1,src,0,5,16); WHBFY(t1,src,0,6,16); WHBFY(t1,src,0,7,16); + WHBFY(t1,src,0,8,16); WHBFY(t1,src,0,9,16); WHBFY(t1,src,0,10,16); WHBFY(t1,src,0,11,16); + WHBFY(t1,src,0,12,16); WHBFY(t1,src,0,13,16); WHBFY(t1,src,0,14,16); WHBFY(t1,src,0,15,16); + + // group 2 + WHBFY(t2,t1,0,0,8); WHBFY(t2,t1,0,1,8); WHBFY(t2,t1,0,2,8); WHBFY(t2,t1,0,3,8); + WHBFY(t2,t1,0,4,8); WHBFY(t2,t1,0,5,8); WHBFY(t2,t1,0,6,8); WHBFY(t2,t1,0,7,8); + WHBFY(t2,t1,16,0,8); WHBFY(t2,t1,16,1,8); WHBFY(t2,t1,16,2,8); WHBFY(t2,t1,16,3,8); + WHBFY(t2,t1,16,4,8); WHBFY(t2,t1,16,5,8); WHBFY(t2,t1,16,6,8); WHBFY(t2,t1,16,7,8); + + // group 3 + WHBFY(t1,t2,0,0,4); WHBFY(t1,t2,0,1,4); WHBFY(t1,t2,0,2,4); WHBFY(t1,t2,0,3,4); + WHBFY(t1,t2,8,0,4); WHBFY(t1,t2,8,1,4); WHBFY(t1,t2,8,2,4); WHBFY(t1,t2,8,3,4); + WHBFY(t1,t2,16,0,4); WHBFY(t1,t2,16,1,4); WHBFY(t1,t2,16,2,4); WHBFY(t1,t2,16,3,4); + WHBFY(t1,t2,24,0,4); WHBFY(t1,t2,24,1,4); WHBFY(t1,t2,24,2,4); WHBFY(t1,t2,24,3,4); + + // group 4 + WHBFY(t2,t1,0,0,2); WHBFY(t2,t1,0,1,2); WHBFY(t2,t1,4,0,2); WHBFY(t2,t1,4,1,2); + WHBFY(t2,t1,8,0,2); WHBFY(t2,t1,8,1,2); WHBFY(t2,t1,12,0,2); WHBFY(t2,t1,12,1,2); + WHBFY(t2,t1,16,0,2); WHBFY(t2,t1,16,1,2); WHBFY(t2,t1,20,0,2); WHBFY(t2,t1,20,1,2); + WHBFY(t2,t1,24,0,2); WHBFY(t2,t1,24,1,2); WHBFY(t2,t1,28,0,2); WHBFY(t2,t1,28,1,2); + + // group 5 + WHBFY(dst,t2,0,0,1); WHBFY(dst,t2,2,0,1); WHBFY(dst,t2,4,0,1); WHBFY(dst,t2,6,0,1); + WHBFY(dst,t2,8,0,1); WHBFY(dst,t2,10,0,1); WHBFY(dst,t2,12,0,1); WHBFY(dst,t2,14,0,1); + WHBFY(dst,t2,16,0,1); WHBFY(dst,t2,18,0,1); WHBFY(dst,t2,20,0,1); WHBFY(dst,t2,22,0,1); + WHBFY(dst,t2,24,0,1); WHBFY(dst,t2,26,0,1); WHBFY(dst,t2,28,0,1); WHBFY(dst,t2,30,0,1); + +} + +static void np_fwht64(float *dst, float *src) +{ + float t[128]; + float *t1=t, *t2=t+64; + + + // group 1 + WHBFY(t1,src,0,0,32); WHBFY(t1,src,0,1,32); WHBFY(t1,src,0,2,32); WHBFY(t1,src,0,3,32); + WHBFY(t1,src,0,4,32); WHBFY(t1,src,0,5,32); WHBFY(t1,src,0,6,32); WHBFY(t1,src,0,7,32); + WHBFY(t1,src,0,8,32); WHBFY(t1,src,0,9,32); WHBFY(t1,src,0,10,32); WHBFY(t1,src,0,11,32); + WHBFY(t1,src,0,12,32); WHBFY(t1,src,0,13,32); WHBFY(t1,src,0,14,32); WHBFY(t1,src,0,15,32); + WHBFY(t1,src,0,16,32); WHBFY(t1,src,0,17,32); WHBFY(t1,src,0,18,32); WHBFY(t1,src,0,19,32); + WHBFY(t1,src,0,20,32); WHBFY(t1,src,0,21,32); WHBFY(t1,src,0,22,32); WHBFY(t1,src,0,23,32); + WHBFY(t1,src,0,24,32); WHBFY(t1,src,0,25,32); WHBFY(t1,src,0,26,32); WHBFY(t1,src,0,27,32); + WHBFY(t1,src,0,28,32); WHBFY(t1,src,0,29,32); WHBFY(t1,src,0,30,32); WHBFY(t1,src,0,31,32); + + // group 2 + WHBFY(t2,t1,0,0,16); WHBFY(t2,t1,0,1,16); WHBFY(t2,t1,0,2,16); WHBFY(t2,t1,0,3,16); + WHBFY(t2,t1,0,4,16); WHBFY(t2,t1,0,5,16); WHBFY(t2,t1,0,6,16); WHBFY(t2,t1,0,7,16); + WHBFY(t2,t1,0,8,16); WHBFY(t2,t1,0,9,16); WHBFY(t2,t1,0,10,16); WHBFY(t2,t1,0,11,16); + WHBFY(t2,t1,0,12,16); WHBFY(t2,t1,0,13,16); WHBFY(t2,t1,0,14,16); WHBFY(t2,t1,0,15,16); + + WHBFY(t2,t1,32,0,16); WHBFY(t2,t1,32,1,16); WHBFY(t2,t1,32,2,16); WHBFY(t2,t1,32,3,16); + WHBFY(t2,t1,32,4,16); WHBFY(t2,t1,32,5,16); WHBFY(t2,t1,32,6,16); WHBFY(t2,t1,32,7,16); + WHBFY(t2,t1,32,8,16); WHBFY(t2,t1,32,9,16); WHBFY(t2,t1,32,10,16); WHBFY(t2,t1,32,11,16); + WHBFY(t2,t1,32,12,16); WHBFY(t2,t1,32,13,16); WHBFY(t2,t1,32,14,16); WHBFY(t2,t1,32,15,16); + + // group 3 + WHBFY(t1,t2,0,0,8); WHBFY(t1,t2,0,1,8); WHBFY(t1,t2,0,2,8); WHBFY(t1,t2,0,3,8); + WHBFY(t1,t2,0,4,8); WHBFY(t1,t2,0,5,8); WHBFY(t1,t2,0,6,8); WHBFY(t1,t2,0,7,8); + WHBFY(t1,t2,16,0,8); WHBFY(t1,t2,16,1,8); WHBFY(t1,t2,16,2,8); WHBFY(t1,t2,16,3,8); + WHBFY(t1,t2,16,4,8); WHBFY(t1,t2,16,5,8); WHBFY(t1,t2,16,6,8); WHBFY(t1,t2,16,7,8); + WHBFY(t1,t2,32,0,8); WHBFY(t1,t2,32,1,8); WHBFY(t1,t2,32,2,8); WHBFY(t1,t2,32,3,8); + WHBFY(t1,t2,32,4,8); WHBFY(t1,t2,32,5,8); WHBFY(t1,t2,32,6,8); WHBFY(t1,t2,32,7,8); + WHBFY(t1,t2,48,0,8); WHBFY(t1,t2,48,1,8); WHBFY(t1,t2,48,2,8); WHBFY(t1,t2,48,3,8); + WHBFY(t1,t2,48,4,8); WHBFY(t1,t2,48,5,8); WHBFY(t1,t2,48,6,8); WHBFY(t1,t2,48,7,8); + + // group 4 + WHBFY(t2,t1,0,0,4); WHBFY(t2,t1,0,1,4); WHBFY(t2,t1,0,2,4); WHBFY(t2,t1,0,3,4); + WHBFY(t2,t1,8,0,4); WHBFY(t2,t1,8,1,4); WHBFY(t2,t1,8,2,4); WHBFY(t2,t1,8,3,4); + WHBFY(t2,t1,16,0,4); WHBFY(t2,t1,16,1,4); WHBFY(t2,t1,16,2,4); WHBFY(t2,t1,16,3,4); + WHBFY(t2,t1,24,0,4); WHBFY(t2,t1,24,1,4); WHBFY(t2,t1,24,2,4); WHBFY(t2,t1,24,3,4); + WHBFY(t2,t1,32,0,4); WHBFY(t2,t1,32,1,4); WHBFY(t2,t1,32,2,4); WHBFY(t2,t1,32,3,4); + WHBFY(t2,t1,40,0,4); WHBFY(t2,t1,40,1,4); WHBFY(t2,t1,40,2,4); WHBFY(t2,t1,40,3,4); + WHBFY(t2,t1,48,0,4); WHBFY(t2,t1,48,1,4); WHBFY(t2,t1,48,2,4); WHBFY(t2,t1,48,3,4); + WHBFY(t2,t1,56,0,4); WHBFY(t2,t1,56,1,4); WHBFY(t2,t1,56,2,4); WHBFY(t2,t1,56,3,4); + + // group 5 + WHBFY(t1,t2,0,0,2); WHBFY(t1,t2,0,1,2); WHBFY(t1,t2,4,0,2); WHBFY(t1,t2,4,1,2); + WHBFY(t1,t2,8,0,2); WHBFY(t1,t2,8,1,2); WHBFY(t1,t2,12,0,2); WHBFY(t1,t2,12,1,2); + WHBFY(t1,t2,16,0,2); WHBFY(t1,t2,16,1,2); WHBFY(t1,t2,20,0,2); WHBFY(t1,t2,20,1,2); + WHBFY(t1,t2,24,0,2); WHBFY(t1,t2,24,1,2); WHBFY(t1,t2,28,0,2); WHBFY(t1,t2,28,1,2); + WHBFY(t1,t2,32,0,2); WHBFY(t1,t2,32,1,2); WHBFY(t1,t2,36,0,2); WHBFY(t1,t2,36,1,2); + WHBFY(t1,t2,40,0,2); WHBFY(t1,t2,40,1,2); WHBFY(t1,t2,44,0,2); WHBFY(t1,t2,44,1,2); + WHBFY(t1,t2,48,0,2); WHBFY(t1,t2,48,1,2); WHBFY(t1,t2,52,0,2); WHBFY(t1,t2,52,1,2); + WHBFY(t1,t2,56,0,2); WHBFY(t1,t2,56,1,2); WHBFY(t1,t2,60,0,2); WHBFY(t1,t2,60,1,2); + + // group 6 + WHBFY(dst,t1,0,0,1); WHBFY(dst,t1,2,0,1); WHBFY(dst,t1,4,0,1); WHBFY(dst,t1,6,0,1); + WHBFY(dst,t1,8,0,1); WHBFY(dst,t1,10,0,1); WHBFY(dst,t1,12,0,1); WHBFY(dst,t1,14,0,1); + WHBFY(dst,t1,16,0,1); WHBFY(dst,t1,18,0,1); WHBFY(dst,t1,20,0,1); WHBFY(dst,t1,22,0,1); + WHBFY(dst,t1,24,0,1); WHBFY(dst,t1,26,0,1); WHBFY(dst,t1,28,0,1); WHBFY(dst,t1,30,0,1); + WHBFY(dst,t1,32,0,1); WHBFY(dst,t1,34,0,1); WHBFY(dst,t1,36,0,1); WHBFY(dst,t1,38,0,1); + WHBFY(dst,t1,40,0,1); WHBFY(dst,t1,42,0,1); WHBFY(dst,t1,44,0,1); WHBFY(dst,t1,46,0,1); + WHBFY(dst,t1,48,0,1); WHBFY(dst,t1,50,0,1); WHBFY(dst,t1,52,0,1); WHBFY(dst,t1,54,0,1); + WHBFY(dst,t1,56,0,1); WHBFY(dst,t1,58,0,1); WHBFY(dst,t1,60,0,1); WHBFY(dst,t1,62,0,1); +} \ No newline at end of file diff --git a/map65/libm65/qracodes/npfwht.h b/map65/libm65/qracodes/npfwht.h new file mode 100644 index 000000000..9452e2077 --- /dev/null +++ b/map65/libm65/qracodes/npfwht.h @@ -0,0 +1,45 @@ +// np_fwht.h +// Basic implementation of the Fast Walsh-Hadamard Transforms +// +// (c) 2016 - Nico Palermo, IV3NWV - Microtelecom Srl, Italy +// ------------------------------------------------------------------------------ +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (repeat and accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +#ifndef _npfwht_h_ +#define _npfwht_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +void np_fwht(int nlogdim, float *dst, float *src); +// Compute the Walsh-Hadamard transform of the given data up to a +// 64-dimensional transform +// +// Input parameters: +// nlogdim: log2 of the transform size. Must be in the range [0..6] +// src : pointer to the input data buffer. +// dst : pointer to the output data buffer. +// +// src and dst must point to preallocated data buffers of size 2^nlogdim*sizeof(float) +// src and dst buffers can overlap + +#ifdef __cplusplus +} +#endif + +#endif // _npfwht_ diff --git a/map65/libm65/qracodes/pdmath.c b/map65/libm65/qracodes/pdmath.c new file mode 100644 index 000000000..47ecab917 --- /dev/null +++ b/map65/libm65/qracodes/pdmath.c @@ -0,0 +1,385 @@ +// pdmath.c +// Elementary math on probability distributions +// +// (c) 2016 - Nico Palermo, IV3NWV - Microtelecom Srl, Italy +// ------------------------------------------------------------------------------ +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +#include "pdmath.h" + +typedef const float *ppd_uniform; +typedef void (*ppd_imul)(float*,const float*); +typedef float (*ppd_norm)(float*); + +// define vector size in function of its logarithm in base 2 +static const int pd_log2dim[7] = { + 1,2,4,8,16,32,64 +}; + +// define uniform distributions of given size +static const float pd_uniform1[1] = { + 1. +}; +static const float pd_uniform2[2] = { + 1./2., 1./2. +}; +static const float pd_uniform4[4] = { + 1./4., 1./4.,1./4., 1./4. +}; +static const float pd_uniform8[8] = { + 1./8., 1./8.,1./8., 1./8.,1./8., 1./8.,1./8., 1./8. +}; +static const float pd_uniform16[16] = { + 1./16., 1./16., 1./16., 1./16.,1./16., 1./16.,1./16., 1./16., + 1./16., 1./16., 1./16., 1./16.,1./16., 1./16.,1./16., 1./16. +}; +static const float pd_uniform32[32] = { + 1./32., 1./32., 1./32., 1./32.,1./32., 1./32.,1./32., 1./32., + 1./32., 1./32., 1./32., 1./32.,1./32., 1./32.,1./32., 1./32., + 1./32., 1./32., 1./32., 1./32.,1./32., 1./32.,1./32., 1./32., + 1./32., 1./32., 1./32., 1./32.,1./32., 1./32.,1./32., 1./32. +}; +static const float pd_uniform64[64] = { + 1./64., 1./64., 1./64., 1./64.,1./64., 1./64.,1./64., 1./64., + 1./64., 1./64., 1./64., 1./64.,1./64., 1./64.,1./64., 1./64., + 1./64., 1./64., 1./64., 1./64.,1./64., 1./64.,1./64., 1./64., + 1./64., 1./64., 1./64., 1./64.,1./64., 1./64.,1./64., 1./64., + 1./64., 1./64., 1./64., 1./64.,1./64., 1./64.,1./64., 1./64., + 1./64., 1./64., 1./64., 1./64.,1./64., 1./64.,1./64., 1./64., + 1./64., 1./64., 1./64., 1./64.,1./64., 1./64.,1./64., 1./64., + 1./64., 1./64., 1./64., 1./64.,1./64., 1./64.,1./64., 1./64. + +}; + +static const ppd_uniform pd_uniform_tab[7] = { + pd_uniform1, + pd_uniform2, + pd_uniform4, + pd_uniform8, + pd_uniform16, + pd_uniform32, + pd_uniform64 +}; + +// returns a pointer to the uniform distribution of the given logsize +const float *pd_uniform(int nlogdim) +{ + return pd_uniform_tab[nlogdim]; +} + +// in-place multiplication functions +// compute dst = dst*src for any element of the distrib + +static void pd_imul1(float *dst, const float *src) +{ + dst[0] *= src[0]; +} + +static void pd_imul2(float *dst, const float *src) +{ + dst[0] *= src[0]; dst[1] *= src[1]; +} +static void pd_imul4(float *dst, const float *src) +{ + dst[0] *= src[0]; dst[1] *= src[1]; + dst[2] *= src[2]; dst[3] *= src[3]; +} +static void pd_imul8(float *dst, const float *src) +{ + dst[0] *= src[0]; dst[1] *= src[1]; dst[2] *= src[2]; dst[3] *= src[3]; + dst[4] *= src[4]; dst[5] *= src[5]; dst[6] *= src[6]; dst[7] *= src[7]; +} +static void pd_imul16(float *dst, const float *src) +{ + dst[0] *= src[0]; dst[1] *= src[1]; dst[2] *= src[2]; dst[3] *= src[3]; + dst[4] *= src[4]; dst[5] *= src[5]; dst[6] *= src[6]; dst[7] *= src[7]; + dst[8] *= src[8]; dst[9] *= src[9]; dst[10]*= src[10]; dst[11]*= src[11]; + dst[12]*= src[12]; dst[13]*= src[13]; dst[14]*= src[14]; dst[15]*= src[15]; +} +static void pd_imul32(float *dst, const float *src) +{ + pd_imul16(dst,src); + pd_imul16(dst+16,src+16); +} +static void pd_imul64(float *dst, const float *src) +{ + pd_imul16(dst, src); + pd_imul16(dst+16, src+16); + pd_imul16(dst+32, src+32); + pd_imul16(dst+48, src+48); +} + +static const ppd_imul pd_imul_tab[7] = { + pd_imul1, + pd_imul2, + pd_imul4, + pd_imul8, + pd_imul16, + pd_imul32, + pd_imul64 +}; + +// in place multiplication +// compute dst = dst*src for any element of the distrib give their log2 size +// arguments must be pointers to array of floats of the given size +void pd_imul(float *dst, const float *src, int nlogdim) +{ + pd_imul_tab[nlogdim](dst,src); +} + +static float pd_norm1(float *ppd) +{ + float t = ppd[0]; + ppd[0] = 1.f; + return t; +} + +static float pd_norm2(float *ppd) +{ + float t,to; + + t =ppd[0]; t +=ppd[1]; + + if (t<=0) { + pd_init(ppd,pd_uniform(1),pd_log2dim[1]); + return t; + } + + to = t; + t = 1.f/t; + ppd[0] *=t; ppd[1] *=t; + return to; + +} + +static float pd_norm4(float *ppd) +{ + float t,to; + + t =ppd[0]; t +=ppd[1]; t +=ppd[2]; t +=ppd[3]; + + if (t<=0) { + pd_init(ppd,pd_uniform(2),pd_log2dim[2]); + return t; + } + + to = t; + t = 1.f/t; + ppd[0] *=t; ppd[1] *=t; ppd[2] *=t; ppd[3] *=t; + return to; +} + +static float pd_norm8(float *ppd) +{ + float t,to; + + t =ppd[0]; t +=ppd[1]; t +=ppd[2]; t +=ppd[3]; + t +=ppd[4]; t +=ppd[5]; t +=ppd[6]; t +=ppd[7]; + + if (t<=0) { + pd_init(ppd,pd_uniform(3),pd_log2dim[3]); + return t; + } + + to = t; + t = 1.f/t; + ppd[0] *=t; ppd[1] *=t; ppd[2] *=t; ppd[3] *=t; + ppd[4] *=t; ppd[5] *=t; ppd[6] *=t; ppd[7] *=t; + return to; +} +static float pd_norm16(float *ppd) +{ + float t,to; + + t =ppd[0]; t +=ppd[1]; t +=ppd[2]; t +=ppd[3]; + t +=ppd[4]; t +=ppd[5]; t +=ppd[6]; t +=ppd[7]; + t +=ppd[8]; t +=ppd[9]; t +=ppd[10]; t +=ppd[11]; + t +=ppd[12]; t +=ppd[13]; t +=ppd[14]; t +=ppd[15]; + + if (t<=0) { + pd_init(ppd,pd_uniform(4),pd_log2dim[4]); + return t; + } + + to = t; + t = 1.f/t; + ppd[0] *=t; ppd[1] *=t; ppd[2] *=t; ppd[3] *=t; + ppd[4] *=t; ppd[5] *=t; ppd[6] *=t; ppd[7] *=t; + ppd[8] *=t; ppd[9] *=t; ppd[10] *=t; ppd[11] *=t; + ppd[12] *=t; ppd[13] *=t; ppd[14] *=t; ppd[15] *=t; + + return to; +} +static float pd_norm32(float *ppd) +{ + float t,to; + + t =ppd[0]; t +=ppd[1]; t +=ppd[2]; t +=ppd[3]; + t +=ppd[4]; t +=ppd[5]; t +=ppd[6]; t +=ppd[7]; + t +=ppd[8]; t +=ppd[9]; t +=ppd[10]; t +=ppd[11]; + t +=ppd[12]; t +=ppd[13]; t +=ppd[14]; t +=ppd[15]; + t +=ppd[16]; t +=ppd[17]; t +=ppd[18]; t +=ppd[19]; + t +=ppd[20]; t +=ppd[21]; t +=ppd[22]; t +=ppd[23]; + t +=ppd[24]; t +=ppd[25]; t +=ppd[26]; t +=ppd[27]; + t +=ppd[28]; t +=ppd[29]; t +=ppd[30]; t +=ppd[31]; + + if (t<=0) { + pd_init(ppd,pd_uniform(5),pd_log2dim[5]); + return t; + } + + to = t; + t = 1.f/t; + ppd[0] *=t; ppd[1] *=t; ppd[2] *=t; ppd[3] *=t; + ppd[4] *=t; ppd[5] *=t; ppd[6] *=t; ppd[7] *=t; + ppd[8] *=t; ppd[9] *=t; ppd[10] *=t; ppd[11] *=t; + ppd[12] *=t; ppd[13] *=t; ppd[14] *=t; ppd[15] *=t; + ppd[16] *=t; ppd[17] *=t; ppd[18] *=t; ppd[19] *=t; + ppd[20] *=t; ppd[21] *=t; ppd[22] *=t; ppd[23] *=t; + ppd[24] *=t; ppd[25] *=t; ppd[26] *=t; ppd[27] *=t; + ppd[28] *=t; ppd[29] *=t; ppd[30] *=t; ppd[31] *=t; + + return to; +} + +static float pd_norm64(float *ppd) +{ + float t,to; + + t =ppd[0]; t +=ppd[1]; t +=ppd[2]; t +=ppd[3]; + t +=ppd[4]; t +=ppd[5]; t +=ppd[6]; t +=ppd[7]; + t +=ppd[8]; t +=ppd[9]; t +=ppd[10]; t +=ppd[11]; + t +=ppd[12]; t +=ppd[13]; t +=ppd[14]; t +=ppd[15]; + t +=ppd[16]; t +=ppd[17]; t +=ppd[18]; t +=ppd[19]; + t +=ppd[20]; t +=ppd[21]; t +=ppd[22]; t +=ppd[23]; + t +=ppd[24]; t +=ppd[25]; t +=ppd[26]; t +=ppd[27]; + t +=ppd[28]; t +=ppd[29]; t +=ppd[30]; t +=ppd[31]; + + t +=ppd[32]; t +=ppd[33]; t +=ppd[34]; t +=ppd[35]; + t +=ppd[36]; t +=ppd[37]; t +=ppd[38]; t +=ppd[39]; + t +=ppd[40]; t +=ppd[41]; t +=ppd[42]; t +=ppd[43]; + t +=ppd[44]; t +=ppd[45]; t +=ppd[46]; t +=ppd[47]; + t +=ppd[48]; t +=ppd[49]; t +=ppd[50]; t +=ppd[51]; + t +=ppd[52]; t +=ppd[53]; t +=ppd[54]; t +=ppd[55]; + t +=ppd[56]; t +=ppd[57]; t +=ppd[58]; t +=ppd[59]; + t +=ppd[60]; t +=ppd[61]; t +=ppd[62]; t +=ppd[63]; + + if (t<=0) { + pd_init(ppd,pd_uniform(6),pd_log2dim[6]); + return t; + } + + to = t; + t = 1.0f/t; + ppd[0] *=t; ppd[1] *=t; ppd[2] *=t; ppd[3] *=t; + ppd[4] *=t; ppd[5] *=t; ppd[6] *=t; ppd[7] *=t; + ppd[8] *=t; ppd[9] *=t; ppd[10] *=t; ppd[11] *=t; + ppd[12] *=t; ppd[13] *=t; ppd[14] *=t; ppd[15] *=t; + ppd[16] *=t; ppd[17] *=t; ppd[18] *=t; ppd[19] *=t; + ppd[20] *=t; ppd[21] *=t; ppd[22] *=t; ppd[23] *=t; + ppd[24] *=t; ppd[25] *=t; ppd[26] *=t; ppd[27] *=t; + ppd[28] *=t; ppd[29] *=t; ppd[30] *=t; ppd[31] *=t; + + ppd[32] *=t; ppd[33] *=t; ppd[34] *=t; ppd[35] *=t; + ppd[36] *=t; ppd[37] *=t; ppd[38] *=t; ppd[39] *=t; + ppd[40] *=t; ppd[41] *=t; ppd[42] *=t; ppd[43] *=t; + ppd[44] *=t; ppd[45] *=t; ppd[46] *=t; ppd[47] *=t; + ppd[48] *=t; ppd[49] *=t; ppd[50] *=t; ppd[51] *=t; + ppd[52] *=t; ppd[53] *=t; ppd[54] *=t; ppd[55] *=t; + ppd[56] *=t; ppd[57] *=t; ppd[58] *=t; ppd[59] *=t; + ppd[60] *=t; ppd[61] *=t; ppd[62] *=t; ppd[63] *=t; + + return to; +} + + +static const ppd_norm pd_norm_tab[7] = { + pd_norm1, + pd_norm2, + pd_norm4, + pd_norm8, + pd_norm16, + pd_norm32, + pd_norm64 +}; + +float pd_norm(float *pd, int nlogdim) +{ + return pd_norm_tab[nlogdim](pd); +} + +void pd_memset(float *dst, const float *src, int ndim, int nitems) +{ + int size = PD_SIZE(ndim); + while(nitems--) { + memcpy(dst,src,size); + dst +=ndim; + } +} + +void pd_fwdperm(float *dst, float *src, const int *perm, int ndim) +{ + // TODO: non-loop implementation + while (ndim--) + dst[ndim] = src[perm[ndim]]; +} + +void pd_bwdperm(float *dst, float *src, const int *perm, int ndim) +{ + // TODO: non-loop implementation + while (ndim--) + dst[perm[ndim]] = src[ndim]; +} + +float pd_max(float *src, int ndim) +{ + // TODO: faster implementation + + float cmax=0; // we assume that prob distributions are always positive + float cval; + + while (ndim--) { + cval = src[ndim]; + if (cval>=cmax) { + cmax = cval; + } + } + + return cmax; +} + +int pd_argmax(float *pmax, float *src, int ndim) +{ + // TODO: faster implementation + + float cmax=0; // we assume that prob distributions are always positive + float cval; + int idxmax=-1; // indicates that all pd elements are <0 + + while (ndim--) { + cval = src[ndim]; + if (cval>=cmax) { + cmax = cval; + idxmax = ndim; + } + } + + if (pmax) + *pmax = cmax; + + return idxmax; +} diff --git a/map65/libm65/qracodes/pdmath.h b/map65/libm65/qracodes/pdmath.h new file mode 100644 index 000000000..bbd1210c4 --- /dev/null +++ b/map65/libm65/qracodes/pdmath.h @@ -0,0 +1,85 @@ +// pdmath.h +// Elementary math on probability distributions +// +// (c) 2016 - Nico Palermo, IV3NWV - Microtelecom Srl, Italy +// ------------------------------------------------------------------------------ +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (repeat and accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + + +#ifndef _pdmath_h_ +#define _pdmath_h_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define PD_NDIM(nlogdim) ((1<<(nlogdim)) +#define PD_SIZE(ndim) ((ndim)*sizeof(float)) +#define PD_ROWADDR(fp,ndim,idx) (fp+((ndim)*(idx))) + +const float *pd_uniform(int nlogdim); +// Returns a pointer to a (constant) uniform distribution of the given log2 size + +#define pd_init(dst,src,ndim) memcpy(dst,src,PD_SIZE(ndim)) +// Distribution copy + +void pd_memset(float *dst, const float *src, int ndim, int nitems); +// Copy the distribution pointed by src to the array of distributions dst +// src is a pointer to the input distribution (a vector of size ndim) +// dst is a pointer to a linear array of distributions (a vector of size ndim*nitems) + +void pd_imul(float *dst, const float *src, int nlogdim); +// In place multiplication +// Compute dst = dst*src for any element of the distrib give their log2 size +// src and dst arguments must be pointers to array of floats of the given size + +float pd_norm(float *pd, int nlogdim); +// In place normalizazion +// Normalizes the input vector so that the sum of its components are one +// pd must be a pointer to an array of floats of the given size. +// If the norm of the input vector is non-positive the vector components +// are replaced with a uniform distribution +// Returns the norm of the distribution prior to the normalization + +void pd_fwdperm(float *dst, float *src, const int *perm, int ndim); +// Forward permutation of a distribution +// Computes dst[k] = src[perm[k]] for every element in the distribution +// perm must be a pointer to an array of integers of length ndim + +void pd_bwdperm(float *dst, float *src, const int *perm, int ndim); +// Backward permutation of a distribution +// Computes dst[perm[k]] = src[k] for every element in the distribution +// perm must be a pointer to an array of integers of length ndim + +float pd_max(float *src, int ndim); +// Return the maximum of the elements of the given distribution +// Assumes that the input vector is a probability distribution and that each element in the +// distribution is non negative + +int pd_argmax(float *pmax, float *src, int ndim); +// Return the index of the maximum element of the given distribution +// The maximum is stored in the variable pointed by pmax if pmax is not null +// Same note of pd_max applies. +// Return -1 if all the elements in the distribution are negative + +#ifdef __cplusplus +} +#endif + +#endif // _pdmath_h_ diff --git a/map65/libm65/qracodes/qra12_63_64_irr_b.c b/map65/libm65/qracodes/qra12_63_64_irr_b.c new file mode 100644 index 000000000..d69443b89 --- /dev/null +++ b/map65/libm65/qracodes/qra12_63_64_irr_b.c @@ -0,0 +1,534 @@ +// qra12_63_64_irr_b.c +// Encoding/Decoding tables for Q-ary RA code (12,63) over GF(64) +// Code Name: qra12_63_64_irr_b +// (12,63) RA Code over GF(64) - RF=333344455567 + +// (c) 2016 - Nico Palermo - IV3NWV - Microtelecom Srl, Italy + +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +#include "qra12_63_64_irr_b.h" + +#define qra_K 12 // number of information symbols +#define qra_N 63 // codeword length in symbols +#define qra_m 6 // bits/symbol +#define qra_M 64 // Symbol alphabet cardinality +#define qra_a 1 // grouping factor +#define qra_NC 51 // number of check symbols (N-K) + +// Defines used by the message passing decoder -------- + +#define qra_V 63 // number of variables in the code graph (N) +#define qra_C 115 // number of factors in the code graph (N +(N-K)+1) +#define qra_NMSG 217 // number of msgs in the code graph +#define qra_MAXVDEG 8 // maximum variable degree +#define qra_MAXCDEG 3 // maximum factor degree +#define qra_R 0.19048f // code rate (K/N) +#define CODE_NAME "qra_12_63_64_irr_b" + + +// table of the systematic symbols indexes in the accumulator chain +static const int qra_acc_input_idx[qra_NC+1] = { + 3, 11, 0, 1, 7, 8, 6, 5, 10, 4, + 11, 9, 0, 2, 6, 7, 8, 4, 11, 5, + 10, 2, 1, 9, 3, 8, 4, 11, 5, 7, + 10, 9, 6, 3, 11, 5, 8, 10, 0, 7, + 9, 11, 4, 2, 10, 6, 8, 1, 9, 7, + 11, 10 +}; + +// table of the systematic symbols weight logarithms over GF(M) +static const int qra_acc_input_wlog[qra_NC+1] = { + 39, 0, 34, 16, 25, 0, 34, 48, 19, 13, + 29, 56, 0, 5, 39, 42, 31, 0, 10, 0, + 57, 62, 33, 43, 0, 14, 22, 48, 28, 20, + 5, 45, 16, 43, 17, 4, 32, 0, 31, 0, + 0, 28, 57, 0, 18, 0, 60, 0, 10, 31, + 57, 27 +}; + +// table of the logarithms of the elements of GF(M) (log(0) never used) +static const int qra_log[qra_M] = { + -1, 0, 1, 6, 2, 12, 7, 26, 3, 32, + 13, 35, 8, 48, 27, 18, 4, 24, 33, 16, + 14, 52, 36, 54, 9, 45, 49, 38, 28, 41, + 19, 56, 5, 62, 25, 11, 34, 31, 17, 47, + 15, 23, 53, 51, 37, 44, 55, 40, 10, 61, + 46, 30, 50, 22, 39, 43, 29, 60, 42, 21, + 20, 59, 57, 58 +}; + +// table of GF(M) elements given their logarithm +static const int qra_exp[qra_M-1] = { + 1, 2, 4, 8, 16, 32, 3, 6, 12, 24, + 48, 35, 5, 10, 20, 40, 19, 38, 15, 30, + 60, 59, 53, 41, 17, 34, 7, 14, 28, 56, + 51, 37, 9, 18, 36, 11, 22, 44, 27, 54, + 47, 29, 58, 55, 45, 25, 50, 39, 13, 26, + 52, 43, 21, 42, 23, 46, 31, 62, 63, 61, + 57, 49, 33 +}; + +// table of the messages weight logarithms over GF(M) +static const int qra_msgw[qra_NMSG] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 39, 0, 34, 16, 25, 0, 34, + 48, 19, 13, 29, 56, 0, 5, 39, 42, 31, + 0, 10, 0, 57, 62, 33, 43, 0, 14, 22, + 48, 28, 20, 5, 45, 16, 43, 17, 4, 32, + 0, 31, 0, 0, 28, 57, 0, 18, 0, 60, + 0, 10, 31, 57, 27, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 +}; + +// table of the degrees of the variable nodes +static const int qra_vdeg[qra_V] = { + 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, + 7, 8, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3 +}; + +// table of the degrees of the factor nodes +static const int qra_cdeg[qra_C] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2 +}; + +// table (uncompressed) of the v->c message indexes (-1=unused entry) +static const int qra_v2cmidx[qra_V*qra_MAXVDEG] = { + 0, 65, 75, 101, -1, -1, -1, -1, + 1, 66, 85, 110, -1, -1, -1, -1, + 2, 76, 84, 106, -1, -1, -1, -1, + 3, 63, 87, 96, -1, -1, -1, -1, + 4, 72, 80, 89, 105, -1, -1, -1, + 5, 70, 82, 91, 98, -1, -1, -1, + 6, 69, 77, 95, 108, -1, -1, -1, + 7, 67, 78, 92, 102, 112, -1, -1, + 8, 68, 79, 88, 99, 109, -1, -1, + 9, 74, 86, 94, 103, 111, -1, -1, + 10, 71, 83, 93, 100, 107, 114, -1, + 11, 64, 73, 81, 90, 97, 104, 113, + 12, 115, 116, -1, -1, -1, -1, -1, + 13, 117, 118, -1, -1, -1, -1, -1, + 14, 119, 120, -1, -1, -1, -1, -1, + 15, 121, 122, -1, -1, -1, -1, -1, + 16, 123, 124, -1, -1, -1, -1, -1, + 17, 125, 126, -1, -1, -1, -1, -1, + 18, 127, 128, -1, -1, -1, -1, -1, + 19, 129, 130, -1, -1, -1, -1, -1, + 20, 131, 132, -1, -1, -1, -1, -1, + 21, 133, 134, -1, -1, -1, -1, -1, + 22, 135, 136, -1, -1, -1, -1, -1, + 23, 137, 138, -1, -1, -1, -1, -1, + 24, 139, 140, -1, -1, -1, -1, -1, + 25, 141, 142, -1, -1, -1, -1, -1, + 26, 143, 144, -1, -1, -1, -1, -1, + 27, 145, 146, -1, -1, -1, -1, -1, + 28, 147, 148, -1, -1, -1, -1, -1, + 29, 149, 150, -1, -1, -1, -1, -1, + 30, 151, 152, -1, -1, -1, -1, -1, + 31, 153, 154, -1, -1, -1, -1, -1, + 32, 155, 156, -1, -1, -1, -1, -1, + 33, 157, 158, -1, -1, -1, -1, -1, + 34, 159, 160, -1, -1, -1, -1, -1, + 35, 161, 162, -1, -1, -1, -1, -1, + 36, 163, 164, -1, -1, -1, -1, -1, + 37, 165, 166, -1, -1, -1, -1, -1, + 38, 167, 168, -1, -1, -1, -1, -1, + 39, 169, 170, -1, -1, -1, -1, -1, + 40, 171, 172, -1, -1, -1, -1, -1, + 41, 173, 174, -1, -1, -1, -1, -1, + 42, 175, 176, -1, -1, -1, -1, -1, + 43, 177, 178, -1, -1, -1, -1, -1, + 44, 179, 180, -1, -1, -1, -1, -1, + 45, 181, 182, -1, -1, -1, -1, -1, + 46, 183, 184, -1, -1, -1, -1, -1, + 47, 185, 186, -1, -1, -1, -1, -1, + 48, 187, 188, -1, -1, -1, -1, -1, + 49, 189, 190, -1, -1, -1, -1, -1, + 50, 191, 192, -1, -1, -1, -1, -1, + 51, 193, 194, -1, -1, -1, -1, -1, + 52, 195, 196, -1, -1, -1, -1, -1, + 53, 197, 198, -1, -1, -1, -1, -1, + 54, 199, 200, -1, -1, -1, -1, -1, + 55, 201, 202, -1, -1, -1, -1, -1, + 56, 203, 204, -1, -1, -1, -1, -1, + 57, 205, 206, -1, -1, -1, -1, -1, + 58, 207, 208, -1, -1, -1, -1, -1, + 59, 209, 210, -1, -1, -1, -1, -1, + 60, 211, 212, -1, -1, -1, -1, -1, + 61, 213, 214, -1, -1, -1, -1, -1, + 62, 215, 216, -1, -1, -1, -1, -1 +}; + +// table (uncompressed) of the c->v message indexes (-1=unused entry) +static const int qra_c2vmidx[qra_C*qra_MAXCDEG] = { + 0, -1, -1, 1, -1, -1, 2, -1, -1, 3, -1, -1, + 4, -1, -1, 5, -1, -1, 6, -1, -1, 7, -1, -1, + 8, -1, -1, 9, -1, -1, 10, -1, -1, 11, -1, -1, + 12, -1, -1, 13, -1, -1, 14, -1, -1, 15, -1, -1, + 16, -1, -1, 17, -1, -1, 18, -1, -1, 19, -1, -1, + 20, -1, -1, 21, -1, -1, 22, -1, -1, 23, -1, -1, + 24, -1, -1, 25, -1, -1, 26, -1, -1, 27, -1, -1, + 28, -1, -1, 29, -1, -1, 30, -1, -1, 31, -1, -1, + 32, -1, -1, 33, -1, -1, 34, -1, -1, 35, -1, -1, + 36, -1, -1, 37, -1, -1, 38, -1, -1, 39, -1, -1, + 40, -1, -1, 41, -1, -1, 42, -1, -1, 43, -1, -1, + 44, -1, -1, 45, -1, -1, 46, -1, -1, 47, -1, -1, + 48, -1, -1, 49, -1, -1, 50, -1, -1, 51, -1, -1, + 52, -1, -1, 53, -1, -1, 54, -1, -1, 55, -1, -1, + 56, -1, -1, 57, -1, -1, 58, -1, -1, 59, -1, -1, + 60, -1, -1, 61, -1, -1, 62, -1, -1, 63, 115, -1, + 64, 116, 117, 65, 118, 119, 66, 120, 121, 67, 122, 123, + 68, 124, 125, 69, 126, 127, 70, 128, 129, 71, 130, 131, + 72, 132, 133, 73, 134, 135, 74, 136, 137, 75, 138, 139, + 76, 140, 141, 77, 142, 143, 78, 144, 145, 79, 146, 147, + 80, 148, 149, 81, 150, 151, 82, 152, 153, 83, 154, 155, + 84, 156, 157, 85, 158, 159, 86, 160, 161, 87, 162, 163, + 88, 164, 165, 89, 166, 167, 90, 168, 169, 91, 170, 171, + 92, 172, 173, 93, 174, 175, 94, 176, 177, 95, 178, 179, + 96, 180, 181, 97, 182, 183, 98, 184, 185, 99, 186, 187, +100, 188, 189, 101, 190, 191, 102, 192, 193, 103, 194, 195, +104, 196, 197, 105, 198, 199, 106, 200, 201, 107, 202, 203, +108, 204, 205, 109, 206, 207, 110, 208, 209, 111, 210, 211, +112, 212, 213, 113, 214, 215, 114, 216, -1 +}; + +// permutation matrix to compute Prob(x*alfa^logw) +static const int qra_pmat[qra_M*qra_M] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 0, 33, 1, 32, 2, 35, 3, 34, 4, 37, 5, 36, 6, 39, 7, 38, + 8, 41, 9, 40, 10, 43, 11, 42, 12, 45, 13, 44, 14, 47, 15, 46, + 16, 49, 17, 48, 18, 51, 19, 50, 20, 53, 21, 52, 22, 55, 23, 54, + 24, 57, 25, 56, 26, 59, 27, 58, 28, 61, 29, 60, 30, 63, 31, 62, + 0, 49, 33, 16, 1, 48, 32, 17, 2, 51, 35, 18, 3, 50, 34, 19, + 4, 53, 37, 20, 5, 52, 36, 21, 6, 55, 39, 22, 7, 54, 38, 23, + 8, 57, 41, 24, 9, 56, 40, 25, 10, 59, 43, 26, 11, 58, 42, 27, + 12, 61, 45, 28, 13, 60, 44, 29, 14, 63, 47, 30, 15, 62, 46, 31, + 0, 57, 49, 8, 33, 24, 16, 41, 1, 56, 48, 9, 32, 25, 17, 40, + 2, 59, 51, 10, 35, 26, 18, 43, 3, 58, 50, 11, 34, 27, 19, 42, + 4, 61, 53, 12, 37, 28, 20, 45, 5, 60, 52, 13, 36, 29, 21, 44, + 6, 63, 55, 14, 39, 30, 22, 47, 7, 62, 54, 15, 38, 31, 23, 46, + 0, 61, 57, 4, 49, 12, 8, 53, 33, 28, 24, 37, 16, 45, 41, 20, + 1, 60, 56, 5, 48, 13, 9, 52, 32, 29, 25, 36, 17, 44, 40, 21, + 2, 63, 59, 6, 51, 14, 10, 55, 35, 30, 26, 39, 18, 47, 43, 22, + 3, 62, 58, 7, 50, 15, 11, 54, 34, 31, 27, 38, 19, 46, 42, 23, + 0, 63, 61, 2, 57, 6, 4, 59, 49, 14, 12, 51, 8, 55, 53, 10, + 33, 30, 28, 35, 24, 39, 37, 26, 16, 47, 45, 18, 41, 22, 20, 43, + 1, 62, 60, 3, 56, 7, 5, 58, 48, 15, 13, 50, 9, 54, 52, 11, + 32, 31, 29, 34, 25, 38, 36, 27, 17, 46, 44, 19, 40, 23, 21, 42, + 0, 62, 63, 1, 61, 3, 2, 60, 57, 7, 6, 56, 4, 58, 59, 5, + 49, 15, 14, 48, 12, 50, 51, 13, 8, 54, 55, 9, 53, 11, 10, 52, + 33, 31, 30, 32, 28, 34, 35, 29, 24, 38, 39, 25, 37, 27, 26, 36, + 16, 46, 47, 17, 45, 19, 18, 44, 41, 23, 22, 40, 20, 42, 43, 21, + 0, 31, 62, 33, 63, 32, 1, 30, 61, 34, 3, 28, 2, 29, 60, 35, + 57, 38, 7, 24, 6, 25, 56, 39, 4, 27, 58, 37, 59, 36, 5, 26, + 49, 46, 15, 16, 14, 17, 48, 47, 12, 19, 50, 45, 51, 44, 13, 18, + 8, 23, 54, 41, 55, 40, 9, 22, 53, 42, 11, 20, 10, 21, 52, 43, + 0, 46, 31, 49, 62, 16, 33, 15, 63, 17, 32, 14, 1, 47, 30, 48, + 61, 19, 34, 12, 3, 45, 28, 50, 2, 44, 29, 51, 60, 18, 35, 13, + 57, 23, 38, 8, 7, 41, 24, 54, 6, 40, 25, 55, 56, 22, 39, 9, + 4, 42, 27, 53, 58, 20, 37, 11, 59, 21, 36, 10, 5, 43, 26, 52, + 0, 23, 46, 57, 31, 8, 49, 38, 62, 41, 16, 7, 33, 54, 15, 24, + 63, 40, 17, 6, 32, 55, 14, 25, 1, 22, 47, 56, 30, 9, 48, 39, + 61, 42, 19, 4, 34, 53, 12, 27, 3, 20, 45, 58, 28, 11, 50, 37, + 2, 21, 44, 59, 29, 10, 51, 36, 60, 43, 18, 5, 35, 52, 13, 26, + 0, 42, 23, 61, 46, 4, 57, 19, 31, 53, 8, 34, 49, 27, 38, 12, + 62, 20, 41, 3, 16, 58, 7, 45, 33, 11, 54, 28, 15, 37, 24, 50, + 63, 21, 40, 2, 17, 59, 6, 44, 32, 10, 55, 29, 14, 36, 25, 51, + 1, 43, 22, 60, 47, 5, 56, 18, 30, 52, 9, 35, 48, 26, 39, 13, + 0, 21, 42, 63, 23, 2, 61, 40, 46, 59, 4, 17, 57, 44, 19, 6, + 31, 10, 53, 32, 8, 29, 34, 55, 49, 36, 27, 14, 38, 51, 12, 25, + 62, 43, 20, 1, 41, 60, 3, 22, 16, 5, 58, 47, 7, 18, 45, 56, + 33, 52, 11, 30, 54, 35, 28, 9, 15, 26, 37, 48, 24, 13, 50, 39, + 0, 43, 21, 62, 42, 1, 63, 20, 23, 60, 2, 41, 61, 22, 40, 3, + 46, 5, 59, 16, 4, 47, 17, 58, 57, 18, 44, 7, 19, 56, 6, 45, + 31, 52, 10, 33, 53, 30, 32, 11, 8, 35, 29, 54, 34, 9, 55, 28, + 49, 26, 36, 15, 27, 48, 14, 37, 38, 13, 51, 24, 12, 39, 25, 50, + 0, 52, 43, 31, 21, 33, 62, 10, 42, 30, 1, 53, 63, 11, 20, 32, + 23, 35, 60, 8, 2, 54, 41, 29, 61, 9, 22, 34, 40, 28, 3, 55, + 46, 26, 5, 49, 59, 15, 16, 36, 4, 48, 47, 27, 17, 37, 58, 14, + 57, 13, 18, 38, 44, 24, 7, 51, 19, 39, 56, 12, 6, 50, 45, 25, + 0, 26, 52, 46, 43, 49, 31, 5, 21, 15, 33, 59, 62, 36, 10, 16, + 42, 48, 30, 4, 1, 27, 53, 47, 63, 37, 11, 17, 20, 14, 32, 58, + 23, 13, 35, 57, 60, 38, 8, 18, 2, 24, 54, 44, 41, 51, 29, 7, + 61, 39, 9, 19, 22, 12, 34, 56, 40, 50, 28, 6, 3, 25, 55, 45, + 0, 13, 26, 23, 52, 57, 46, 35, 43, 38, 49, 60, 31, 18, 5, 8, + 21, 24, 15, 2, 33, 44, 59, 54, 62, 51, 36, 41, 10, 7, 16, 29, + 42, 39, 48, 61, 30, 19, 4, 9, 1, 12, 27, 22, 53, 56, 47, 34, + 63, 50, 37, 40, 11, 6, 17, 28, 20, 25, 14, 3, 32, 45, 58, 55, + 0, 39, 13, 42, 26, 61, 23, 48, 52, 19, 57, 30, 46, 9, 35, 4, + 43, 12, 38, 1, 49, 22, 60, 27, 31, 56, 18, 53, 5, 34, 8, 47, + 21, 50, 24, 63, 15, 40, 2, 37, 33, 6, 44, 11, 59, 28, 54, 17, + 62, 25, 51, 20, 36, 3, 41, 14, 10, 45, 7, 32, 16, 55, 29, 58, + 0, 50, 39, 21, 13, 63, 42, 24, 26, 40, 61, 15, 23, 37, 48, 2, + 52, 6, 19, 33, 57, 11, 30, 44, 46, 28, 9, 59, 35, 17, 4, 54, + 43, 25, 12, 62, 38, 20, 1, 51, 49, 3, 22, 36, 60, 14, 27, 41, + 31, 45, 56, 10, 18, 32, 53, 7, 5, 55, 34, 16, 8, 58, 47, 29, + 0, 25, 50, 43, 39, 62, 21, 12, 13, 20, 63, 38, 42, 51, 24, 1, + 26, 3, 40, 49, 61, 36, 15, 22, 23, 14, 37, 60, 48, 41, 2, 27, + 52, 45, 6, 31, 19, 10, 33, 56, 57, 32, 11, 18, 30, 7, 44, 53, + 46, 55, 28, 5, 9, 16, 59, 34, 35, 58, 17, 8, 4, 29, 54, 47, + 0, 45, 25, 52, 50, 31, 43, 6, 39, 10, 62, 19, 21, 56, 12, 33, + 13, 32, 20, 57, 63, 18, 38, 11, 42, 7, 51, 30, 24, 53, 1, 44, + 26, 55, 3, 46, 40, 5, 49, 28, 61, 16, 36, 9, 15, 34, 22, 59, + 23, 58, 14, 35, 37, 8, 60, 17, 48, 29, 41, 4, 2, 47, 27, 54, + 0, 55, 45, 26, 25, 46, 52, 3, 50, 5, 31, 40, 43, 28, 6, 49, + 39, 16, 10, 61, 62, 9, 19, 36, 21, 34, 56, 15, 12, 59, 33, 22, + 13, 58, 32, 23, 20, 35, 57, 14, 63, 8, 18, 37, 38, 17, 11, 60, + 42, 29, 7, 48, 51, 4, 30, 41, 24, 47, 53, 2, 1, 54, 44, 27, + 0, 58, 55, 13, 45, 23, 26, 32, 25, 35, 46, 20, 52, 14, 3, 57, + 50, 8, 5, 63, 31, 37, 40, 18, 43, 17, 28, 38, 6, 60, 49, 11, + 39, 29, 16, 42, 10, 48, 61, 7, 62, 4, 9, 51, 19, 41, 36, 30, + 21, 47, 34, 24, 56, 2, 15, 53, 12, 54, 59, 1, 33, 27, 22, 44, + 0, 29, 58, 39, 55, 42, 13, 16, 45, 48, 23, 10, 26, 7, 32, 61, + 25, 4, 35, 62, 46, 51, 20, 9, 52, 41, 14, 19, 3, 30, 57, 36, + 50, 47, 8, 21, 5, 24, 63, 34, 31, 2, 37, 56, 40, 53, 18, 15, + 43, 54, 17, 12, 28, 1, 38, 59, 6, 27, 60, 33, 49, 44, 11, 22, + 0, 47, 29, 50, 58, 21, 39, 8, 55, 24, 42, 5, 13, 34, 16, 63, + 45, 2, 48, 31, 23, 56, 10, 37, 26, 53, 7, 40, 32, 15, 61, 18, + 25, 54, 4, 43, 35, 12, 62, 17, 46, 1, 51, 28, 20, 59, 9, 38, + 52, 27, 41, 6, 14, 33, 19, 60, 3, 44, 30, 49, 57, 22, 36, 11, + 0, 54, 47, 25, 29, 43, 50, 4, 58, 12, 21, 35, 39, 17, 8, 62, + 55, 1, 24, 46, 42, 28, 5, 51, 13, 59, 34, 20, 16, 38, 63, 9, + 45, 27, 2, 52, 48, 6, 31, 41, 23, 33, 56, 14, 10, 60, 37, 19, + 26, 44, 53, 3, 7, 49, 40, 30, 32, 22, 15, 57, 61, 11, 18, 36, + 0, 27, 54, 45, 47, 52, 25, 2, 29, 6, 43, 48, 50, 41, 4, 31, + 58, 33, 12, 23, 21, 14, 35, 56, 39, 60, 17, 10, 8, 19, 62, 37, + 55, 44, 1, 26, 24, 3, 46, 53, 42, 49, 28, 7, 5, 30, 51, 40, + 13, 22, 59, 32, 34, 57, 20, 15, 16, 11, 38, 61, 63, 36, 9, 18, + 0, 44, 27, 55, 54, 26, 45, 1, 47, 3, 52, 24, 25, 53, 2, 46, + 29, 49, 6, 42, 43, 7, 48, 28, 50, 30, 41, 5, 4, 40, 31, 51, + 58, 22, 33, 13, 12, 32, 23, 59, 21, 57, 14, 34, 35, 15, 56, 20, + 39, 11, 60, 16, 17, 61, 10, 38, 8, 36, 19, 63, 62, 18, 37, 9, + 0, 22, 44, 58, 27, 13, 55, 33, 54, 32, 26, 12, 45, 59, 1, 23, + 47, 57, 3, 21, 52, 34, 24, 14, 25, 15, 53, 35, 2, 20, 46, 56, + 29, 11, 49, 39, 6, 16, 42, 60, 43, 61, 7, 17, 48, 38, 28, 10, + 50, 36, 30, 8, 41, 63, 5, 19, 4, 18, 40, 62, 31, 9, 51, 37, + 0, 11, 22, 29, 44, 39, 58, 49, 27, 16, 13, 6, 55, 60, 33, 42, + 54, 61, 32, 43, 26, 17, 12, 7, 45, 38, 59, 48, 1, 10, 23, 28, + 47, 36, 57, 50, 3, 8, 21, 30, 52, 63, 34, 41, 24, 19, 14, 5, + 25, 18, 15, 4, 53, 62, 35, 40, 2, 9, 20, 31, 46, 37, 56, 51, + 0, 36, 11, 47, 22, 50, 29, 57, 44, 8, 39, 3, 58, 30, 49, 21, + 27, 63, 16, 52, 13, 41, 6, 34, 55, 19, 60, 24, 33, 5, 42, 14, + 54, 18, 61, 25, 32, 4, 43, 15, 26, 62, 17, 53, 12, 40, 7, 35, + 45, 9, 38, 2, 59, 31, 48, 20, 1, 37, 10, 46, 23, 51, 28, 56, + 0, 18, 36, 54, 11, 25, 47, 61, 22, 4, 50, 32, 29, 15, 57, 43, + 44, 62, 8, 26, 39, 53, 3, 17, 58, 40, 30, 12, 49, 35, 21, 7, + 27, 9, 63, 45, 16, 2, 52, 38, 13, 31, 41, 59, 6, 20, 34, 48, + 55, 37, 19, 1, 60, 46, 24, 10, 33, 51, 5, 23, 42, 56, 14, 28, + 0, 9, 18, 27, 36, 45, 54, 63, 11, 2, 25, 16, 47, 38, 61, 52, + 22, 31, 4, 13, 50, 59, 32, 41, 29, 20, 15, 6, 57, 48, 43, 34, + 44, 37, 62, 55, 8, 1, 26, 19, 39, 46, 53, 60, 3, 10, 17, 24, + 58, 51, 40, 33, 30, 23, 12, 5, 49, 56, 35, 42, 21, 28, 7, 14, + 0, 37, 9, 44, 18, 55, 27, 62, 36, 1, 45, 8, 54, 19, 63, 26, + 11, 46, 2, 39, 25, 60, 16, 53, 47, 10, 38, 3, 61, 24, 52, 17, + 22, 51, 31, 58, 4, 33, 13, 40, 50, 23, 59, 30, 32, 5, 41, 12, + 29, 56, 20, 49, 15, 42, 6, 35, 57, 28, 48, 21, 43, 14, 34, 7, + 0, 51, 37, 22, 9, 58, 44, 31, 18, 33, 55, 4, 27, 40, 62, 13, + 36, 23, 1, 50, 45, 30, 8, 59, 54, 5, 19, 32, 63, 12, 26, 41, + 11, 56, 46, 29, 2, 49, 39, 20, 25, 42, 60, 15, 16, 35, 53, 6, + 47, 28, 10, 57, 38, 21, 3, 48, 61, 14, 24, 43, 52, 7, 17, 34, + 0, 56, 51, 11, 37, 29, 22, 46, 9, 49, 58, 2, 44, 20, 31, 39, + 18, 42, 33, 25, 55, 15, 4, 60, 27, 35, 40, 16, 62, 6, 13, 53, + 36, 28, 23, 47, 1, 57, 50, 10, 45, 21, 30, 38, 8, 48, 59, 3, + 54, 14, 5, 61, 19, 43, 32, 24, 63, 7, 12, 52, 26, 34, 41, 17, + 0, 28, 56, 36, 51, 47, 11, 23, 37, 57, 29, 1, 22, 10, 46, 50, + 9, 21, 49, 45, 58, 38, 2, 30, 44, 48, 20, 8, 31, 3, 39, 59, + 18, 14, 42, 54, 33, 61, 25, 5, 55, 43, 15, 19, 4, 24, 60, 32, + 27, 7, 35, 63, 40, 52, 16, 12, 62, 34, 6, 26, 13, 17, 53, 41, + 0, 14, 28, 18, 56, 54, 36, 42, 51, 61, 47, 33, 11, 5, 23, 25, + 37, 43, 57, 55, 29, 19, 1, 15, 22, 24, 10, 4, 46, 32, 50, 60, + 9, 7, 21, 27, 49, 63, 45, 35, 58, 52, 38, 40, 2, 12, 30, 16, + 44, 34, 48, 62, 20, 26, 8, 6, 31, 17, 3, 13, 39, 41, 59, 53, + 0, 7, 14, 9, 28, 27, 18, 21, 56, 63, 54, 49, 36, 35, 42, 45, + 51, 52, 61, 58, 47, 40, 33, 38, 11, 12, 5, 2, 23, 16, 25, 30, + 37, 34, 43, 44, 57, 62, 55, 48, 29, 26, 19, 20, 1, 6, 15, 8, + 22, 17, 24, 31, 10, 13, 4, 3, 46, 41, 32, 39, 50, 53, 60, 59, + 0, 34, 7, 37, 14, 44, 9, 43, 28, 62, 27, 57, 18, 48, 21, 55, + 56, 26, 63, 29, 54, 20, 49, 19, 36, 6, 35, 1, 42, 8, 45, 15, + 51, 17, 52, 22, 61, 31, 58, 24, 47, 13, 40, 10, 33, 3, 38, 4, + 11, 41, 12, 46, 5, 39, 2, 32, 23, 53, 16, 50, 25, 59, 30, 60, + 0, 17, 34, 51, 7, 22, 37, 52, 14, 31, 44, 61, 9, 24, 43, 58, + 28, 13, 62, 47, 27, 10, 57, 40, 18, 3, 48, 33, 21, 4, 55, 38, + 56, 41, 26, 11, 63, 46, 29, 12, 54, 39, 20, 5, 49, 32, 19, 2, + 36, 53, 6, 23, 35, 50, 1, 16, 42, 59, 8, 25, 45, 60, 15, 30, + 0, 41, 17, 56, 34, 11, 51, 26, 7, 46, 22, 63, 37, 12, 52, 29, + 14, 39, 31, 54, 44, 5, 61, 20, 9, 32, 24, 49, 43, 2, 58, 19, + 28, 53, 13, 36, 62, 23, 47, 6, 27, 50, 10, 35, 57, 16, 40, 1, + 18, 59, 3, 42, 48, 25, 33, 8, 21, 60, 4, 45, 55, 30, 38, 15, + 0, 53, 41, 28, 17, 36, 56, 13, 34, 23, 11, 62, 51, 6, 26, 47, + 7, 50, 46, 27, 22, 35, 63, 10, 37, 16, 12, 57, 52, 1, 29, 40, + 14, 59, 39, 18, 31, 42, 54, 3, 44, 25, 5, 48, 61, 8, 20, 33, + 9, 60, 32, 21, 24, 45, 49, 4, 43, 30, 2, 55, 58, 15, 19, 38, + 0, 59, 53, 14, 41, 18, 28, 39, 17, 42, 36, 31, 56, 3, 13, 54, + 34, 25, 23, 44, 11, 48, 62, 5, 51, 8, 6, 61, 26, 33, 47, 20, + 7, 60, 50, 9, 46, 21, 27, 32, 22, 45, 35, 24, 63, 4, 10, 49, + 37, 30, 16, 43, 12, 55, 57, 2, 52, 15, 1, 58, 29, 38, 40, 19, + 0, 60, 59, 7, 53, 9, 14, 50, 41, 21, 18, 46, 28, 32, 39, 27, + 17, 45, 42, 22, 36, 24, 31, 35, 56, 4, 3, 63, 13, 49, 54, 10, + 34, 30, 25, 37, 23, 43, 44, 16, 11, 55, 48, 12, 62, 2, 5, 57, + 51, 15, 8, 52, 6, 58, 61, 1, 26, 38, 33, 29, 47, 19, 20, 40, + 0, 30, 60, 34, 59, 37, 7, 25, 53, 43, 9, 23, 14, 16, 50, 44, + 41, 55, 21, 11, 18, 12, 46, 48, 28, 2, 32, 62, 39, 57, 27, 5, + 17, 15, 45, 51, 42, 52, 22, 8, 36, 58, 24, 6, 31, 1, 35, 61, + 56, 38, 4, 26, 3, 29, 63, 33, 13, 19, 49, 47, 54, 40, 10, 20, + 0, 15, 30, 17, 60, 51, 34, 45, 59, 52, 37, 42, 7, 8, 25, 22, + 53, 58, 43, 36, 9, 6, 23, 24, 14, 1, 16, 31, 50, 61, 44, 35, + 41, 38, 55, 56, 21, 26, 11, 4, 18, 29, 12, 3, 46, 33, 48, 63, + 28, 19, 2, 13, 32, 47, 62, 49, 39, 40, 57, 54, 27, 20, 5, 10, + 0, 38, 15, 41, 30, 56, 17, 55, 60, 26, 51, 21, 34, 4, 45, 11, + 59, 29, 52, 18, 37, 3, 42, 12, 7, 33, 8, 46, 25, 63, 22, 48, + 53, 19, 58, 28, 43, 13, 36, 2, 9, 47, 6, 32, 23, 49, 24, 62, + 14, 40, 1, 39, 16, 54, 31, 57, 50, 20, 61, 27, 44, 10, 35, 5, + 0, 19, 38, 53, 15, 28, 41, 58, 30, 13, 56, 43, 17, 2, 55, 36, + 60, 47, 26, 9, 51, 32, 21, 6, 34, 49, 4, 23, 45, 62, 11, 24, + 59, 40, 29, 14, 52, 39, 18, 1, 37, 54, 3, 16, 42, 57, 12, 31, + 7, 20, 33, 50, 8, 27, 46, 61, 25, 10, 63, 44, 22, 5, 48, 35, + 0, 40, 19, 59, 38, 14, 53, 29, 15, 39, 28, 52, 41, 1, 58, 18, + 30, 54, 13, 37, 56, 16, 43, 3, 17, 57, 2, 42, 55, 31, 36, 12, + 60, 20, 47, 7, 26, 50, 9, 33, 51, 27, 32, 8, 21, 61, 6, 46, + 34, 10, 49, 25, 4, 44, 23, 63, 45, 5, 62, 22, 11, 35, 24, 48, + 0, 20, 40, 60, 19, 7, 59, 47, 38, 50, 14, 26, 53, 33, 29, 9, + 15, 27, 39, 51, 28, 8, 52, 32, 41, 61, 1, 21, 58, 46, 18, 6, + 30, 10, 54, 34, 13, 25, 37, 49, 56, 44, 16, 4, 43, 63, 3, 23, + 17, 5, 57, 45, 2, 22, 42, 62, 55, 35, 31, 11, 36, 48, 12, 24, + 0, 10, 20, 30, 40, 34, 60, 54, 19, 25, 7, 13, 59, 49, 47, 37, + 38, 44, 50, 56, 14, 4, 26, 16, 53, 63, 33, 43, 29, 23, 9, 3, + 15, 5, 27, 17, 39, 45, 51, 57, 28, 22, 8, 2, 52, 62, 32, 42, + 41, 35, 61, 55, 1, 11, 21, 31, 58, 48, 46, 36, 18, 24, 6, 12, + 0, 5, 10, 15, 20, 17, 30, 27, 40, 45, 34, 39, 60, 57, 54, 51, + 19, 22, 25, 28, 7, 2, 13, 8, 59, 62, 49, 52, 47, 42, 37, 32, + 38, 35, 44, 41, 50, 55, 56, 61, 14, 11, 4, 1, 26, 31, 16, 21, + 53, 48, 63, 58, 33, 36, 43, 46, 29, 24, 23, 18, 9, 12, 3, 6, + 0, 35, 5, 38, 10, 41, 15, 44, 20, 55, 17, 50, 30, 61, 27, 56, + 40, 11, 45, 14, 34, 1, 39, 4, 60, 31, 57, 26, 54, 21, 51, 16, + 19, 48, 22, 53, 25, 58, 28, 63, 7, 36, 2, 33, 13, 46, 8, 43, + 59, 24, 62, 29, 49, 18, 52, 23, 47, 12, 42, 9, 37, 6, 32, 3, + 0, 48, 35, 19, 5, 53, 38, 22, 10, 58, 41, 25, 15, 63, 44, 28, + 20, 36, 55, 7, 17, 33, 50, 2, 30, 46, 61, 13, 27, 43, 56, 8, + 40, 24, 11, 59, 45, 29, 14, 62, 34, 18, 1, 49, 39, 23, 4, 52, + 60, 12, 31, 47, 57, 9, 26, 42, 54, 6, 21, 37, 51, 3, 16, 32, + 0, 24, 48, 40, 35, 59, 19, 11, 5, 29, 53, 45, 38, 62, 22, 14, + 10, 18, 58, 34, 41, 49, 25, 1, 15, 23, 63, 39, 44, 52, 28, 4, + 20, 12, 36, 60, 55, 47, 7, 31, 17, 9, 33, 57, 50, 42, 2, 26, + 30, 6, 46, 54, 61, 37, 13, 21, 27, 3, 43, 51, 56, 32, 8, 16, + 0, 12, 24, 20, 48, 60, 40, 36, 35, 47, 59, 55, 19, 31, 11, 7, + 5, 9, 29, 17, 53, 57, 45, 33, 38, 42, 62, 50, 22, 26, 14, 2, + 10, 6, 18, 30, 58, 54, 34, 46, 41, 37, 49, 61, 25, 21, 1, 13, + 15, 3, 23, 27, 63, 51, 39, 43, 44, 32, 52, 56, 28, 16, 4, 8, + 0, 6, 12, 10, 24, 30, 20, 18, 48, 54, 60, 58, 40, 46, 36, 34, + 35, 37, 47, 41, 59, 61, 55, 49, 19, 21, 31, 25, 11, 13, 7, 1, + 5, 3, 9, 15, 29, 27, 17, 23, 53, 51, 57, 63, 45, 43, 33, 39, + 38, 32, 42, 44, 62, 56, 50, 52, 22, 16, 26, 28, 14, 8, 2, 4, + 0, 3, 6, 5, 12, 15, 10, 9, 24, 27, 30, 29, 20, 23, 18, 17, + 48, 51, 54, 53, 60, 63, 58, 57, 40, 43, 46, 45, 36, 39, 34, 33, + 35, 32, 37, 38, 47, 44, 41, 42, 59, 56, 61, 62, 55, 52, 49, 50, + 19, 16, 21, 22, 31, 28, 25, 26, 11, 8, 13, 14, 7, 4, 1, 2, + 0, 32, 3, 35, 6, 38, 5, 37, 12, 44, 15, 47, 10, 42, 9, 41, + 24, 56, 27, 59, 30, 62, 29, 61, 20, 52, 23, 55, 18, 50, 17, 49, + 48, 16, 51, 19, 54, 22, 53, 21, 60, 28, 63, 31, 58, 26, 57, 25, + 40, 8, 43, 11, 46, 14, 45, 13, 36, 4, 39, 7, 34, 2, 33, 1, + 0, 16, 32, 48, 3, 19, 35, 51, 6, 22, 38, 54, 5, 21, 37, 53, + 12, 28, 44, 60, 15, 31, 47, 63, 10, 26, 42, 58, 9, 25, 41, 57, + 24, 8, 56, 40, 27, 11, 59, 43, 30, 14, 62, 46, 29, 13, 61, 45, + 20, 4, 52, 36, 23, 7, 55, 39, 18, 2, 50, 34, 17, 1, 49, 33, + 0, 8, 16, 24, 32, 40, 48, 56, 3, 11, 19, 27, 35, 43, 51, 59, + 6, 14, 22, 30, 38, 46, 54, 62, 5, 13, 21, 29, 37, 45, 53, 61, + 12, 4, 28, 20, 44, 36, 60, 52, 15, 7, 31, 23, 47, 39, 63, 55, + 10, 2, 26, 18, 42, 34, 58, 50, 9, 1, 25, 17, 41, 33, 57, 49, + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, + 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, + 6, 2, 14, 10, 22, 18, 30, 26, 38, 34, 46, 42, 54, 50, 62, 58, + 5, 1, 13, 9, 21, 17, 29, 25, 37, 33, 45, 41, 53, 49, 61, 57, + 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, + 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, + 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 +}; + +const qracode qra_12_63_64_irr_b = { + qra_K, + qra_N, + qra_m, + qra_M, + qra_a, + qra_NC, + qra_V, + qra_C, + qra_NMSG, + qra_MAXVDEG, + qra_MAXCDEG, + QRATYPE_NORMAL, + qra_R, + CODE_NAME, + qra_acc_input_idx, + qra_acc_input_wlog, + qra_log, + qra_exp, + qra_msgw, + qra_vdeg, + qra_cdeg, + qra_v2cmidx, + qra_c2vmidx, + qra_pmat +}; + +#undef qra_K +#undef qra_N +#undef qra_m +#undef qra_M +#undef qra_a +#undef qra_NC +#undef qra_V +#undef qra_C +#undef qra_NMSG +#undef qra_MAXVDEG +#undef qra_MAXCDEG +#undef qra_R +#undef CODE_NAME \ No newline at end of file diff --git a/map65/libm65/qracodes/qra12_63_64_irr_b.h b/map65/libm65/qracodes/qra12_63_64_irr_b.h new file mode 100644 index 000000000..bf70b3605 --- /dev/null +++ b/map65/libm65/qracodes/qra12_63_64_irr_b.h @@ -0,0 +1,39 @@ +// qra12_63_64_irr_b.h +// Code tables and defines for Q-ary RA code (12,63) over GF(64) +// Code Name: qra12_63_64_irr_b +// (12,63) RA Code over GF(64) - RF=333344455567 + +// (c) 2016 - Nico Palermo - IV3NWV - Microtelecom Srl, Italy + +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +#ifndef _qra12_63_64_irr_b_h +#define _qra12_63_64_irr_b_h + +#include "qracodes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern const qracode qra_12_63_64_irr_b; + +#ifdef __cplusplus +} +#endif + +#endif // _qra12_63_64_irr_b_h diff --git a/map65/libm65/qracodes/qra13_64_64_irr_e.c b/map65/libm65/qracodes/qra13_64_64_irr_e.c new file mode 100644 index 000000000..7adf22fea --- /dev/null +++ b/map65/libm65/qracodes/qra13_64_64_irr_e.c @@ -0,0 +1,534 @@ +// qra13_64_64_irr_e.c +// Encoding/Decoding tables for Q-ary RA code (13,64) over GF(64) +// Code Name: qra13_64_64_irr_e +// (13,64) RA Code over GF(64) RF=[3x4 4x4 6x1 3x2 5x1 7x1]/18 + +// (c) 2016 - Nico Palermo - IV3NWV - Microtelecom Srl, Italy + +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +#include "qra13_64_64_irr_e.h" + +#define qra_K 13 // number of information symbols +#define qra_N 64 // codeword length in symbols +#define qra_m 6 // bits/symbol +#define qra_M 64 // Symbol alphabet cardinality +#define qra_a 1 // grouping factor +#define qra_NC 51 // number of check symbols (N-K) + +// Defines used by the message passing decoder -------- + +#define qra_V 64 // number of variables in the code graph (N) +#define qra_C 116 // number of factors in the code graph (N +(N-K)+1) +#define qra_NMSG 218 // number of msgs in the code graph +#define qra_MAXVDEG 8 // maximum variable degree +#define qra_MAXCDEG 3 // maximum factor degree +#define qra_R 0.20313f // code rate (K/N) +#define CODE_NAME "qra_13_64_64_irr_e" + +// table of the systematic symbols indexes in the accumulator chain +static const int qra_acc_input_idx[qra_NC+1] = { + 12, 4, 3, 9, 0, 11, 6, 8, 12, 1, + 2, 7, 4, 11, 3, 5, 9, 8, 12, 7, + 2, 4, 10, 3, 5, 11, 12, 8, 9, 6, + 7, 2, 5, 4, 12, 8, 11, 1, 6, 7, + 0, 10, 12, 8, 11, 5, 6, 1, 0, 10, + 12, 8 +}; + +// table of the systematic symbols weight logarithms over GF(M) +static const int qra_acc_input_wlog[qra_NC+1] = { + 0, 27, 0, 0, 0, 31, 28, 61, 31, 0, + 0, 52, 22, 7, 19, 47, 44, 62, 32, 50, + 52, 42, 48, 56, 40, 50, 51, 37, 37, 0, + 5, 14, 0, 0, 18, 2, 0, 45, 21, 0, + 62, 8, 11, 60, 36, 32, 17, 9, 5, 0, + 53, 0 +}; + +// table of the logarithms of the elements of GF(M) (log(0) never used) +static const int qra_log[qra_M] = { + -1, 0, 1, 6, 2, 12, 7, 26, 3, 32, + 13, 35, 8, 48, 27, 18, 4, 24, 33, 16, + 14, 52, 36, 54, 9, 45, 49, 38, 28, 41, + 19, 56, 5, 62, 25, 11, 34, 31, 17, 47, + 15, 23, 53, 51, 37, 44, 55, 40, 10, 61, + 46, 30, 50, 22, 39, 43, 29, 60, 42, 21, + 20, 59, 57, 58 +}; + +// table of GF(M) elements given their logarithm +static const int qra_exp[qra_M-1] = { + 1, 2, 4, 8, 16, 32, 3, 6, 12, 24, + 48, 35, 5, 10, 20, 40, 19, 38, 15, 30, + 60, 59, 53, 41, 17, 34, 7, 14, 28, 56, + 51, 37, 9, 18, 36, 11, 22, 44, 27, 54, + 47, 29, 58, 55, 45, 25, 50, 39, 13, 26, + 52, 43, 21, 42, 23, 46, 31, 62, 63, 61, + 57, 49, 33 +}; + +// table of the messages weight logarithms over GF(M) +static const int qra_msgw[qra_NMSG] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 0, 0, 0, 31, + 28, 61, 31, 0, 0, 52, 22, 7, 19, 47, + 44, 62, 32, 50, 52, 42, 48, 56, 40, 50, + 51, 37, 37, 0, 5, 14, 0, 0, 18, 2, + 0, 45, 21, 0, 62, 8, 11, 60, 36, 32, + 17, 9, 5, 0, 53, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +// table of the degrees of the variable nodes +static const int qra_vdeg[qra_V] = { + 4, 4, 4, 4, 5, 5, 5, 5, 7, 4, + 4, 6, 8, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3 +}; + +// table of the degrees of the factor nodes +static const int qra_cdeg[qra_C] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 2 +}; + +// table (uncompressed) of the v->c message indexes (-1=unused entry) +static const int qra_v2cmidx[qra_V*qra_MAXVDEG] = { + 0, 68, 104, 112, -1, -1, -1, -1, + 1, 73, 101, 111, -1, -1, -1, -1, + 2, 74, 84, 95, -1, -1, -1, -1, + 3, 66, 78, 87, -1, -1, -1, -1, + 4, 65, 76, 85, 97, -1, -1, -1, + 5, 79, 88, 96, 109, -1, -1, -1, + 6, 70, 93, 102, 110, -1, -1, -1, + 7, 75, 83, 94, 103, -1, -1, -1, + 8, 71, 81, 91, 99, 107, 115, -1, + 9, 67, 80, 92, -1, -1, -1, -1, + 10, 86, 105, 113, -1, -1, -1, -1, + 11, 69, 77, 89, 100, 108, -1, -1, + 12, 64, 72, 82, 90, 98, 106, 114, + 13, 116, 117, -1, -1, -1, -1, -1, + 14, 118, 119, -1, -1, -1, -1, -1, + 15, 120, 121, -1, -1, -1, -1, -1, + 16, 122, 123, -1, -1, -1, -1, -1, + 17, 124, 125, -1, -1, -1, -1, -1, + 18, 126, 127, -1, -1, -1, -1, -1, + 19, 128, 129, -1, -1, -1, -1, -1, + 20, 130, 131, -1, -1, -1, -1, -1, + 21, 132, 133, -1, -1, -1, -1, -1, + 22, 134, 135, -1, -1, -1, -1, -1, + 23, 136, 137, -1, -1, -1, -1, -1, + 24, 138, 139, -1, -1, -1, -1, -1, + 25, 140, 141, -1, -1, -1, -1, -1, + 26, 142, 143, -1, -1, -1, -1, -1, + 27, 144, 145, -1, -1, -1, -1, -1, + 28, 146, 147, -1, -1, -1, -1, -1, + 29, 148, 149, -1, -1, -1, -1, -1, + 30, 150, 151, -1, -1, -1, -1, -1, + 31, 152, 153, -1, -1, -1, -1, -1, + 32, 154, 155, -1, -1, -1, -1, -1, + 33, 156, 157, -1, -1, -1, -1, -1, + 34, 158, 159, -1, -1, -1, -1, -1, + 35, 160, 161, -1, -1, -1, -1, -1, + 36, 162, 163, -1, -1, -1, -1, -1, + 37, 164, 165, -1, -1, -1, -1, -1, + 38, 166, 167, -1, -1, -1, -1, -1, + 39, 168, 169, -1, -1, -1, -1, -1, + 40, 170, 171, -1, -1, -1, -1, -1, + 41, 172, 173, -1, -1, -1, -1, -1, + 42, 174, 175, -1, -1, -1, -1, -1, + 43, 176, 177, -1, -1, -1, -1, -1, + 44, 178, 179, -1, -1, -1, -1, -1, + 45, 180, 181, -1, -1, -1, -1, -1, + 46, 182, 183, -1, -1, -1, -1, -1, + 47, 184, 185, -1, -1, -1, -1, -1, + 48, 186, 187, -1, -1, -1, -1, -1, + 49, 188, 189, -1, -1, -1, -1, -1, + 50, 190, 191, -1, -1, -1, -1, -1, + 51, 192, 193, -1, -1, -1, -1, -1, + 52, 194, 195, -1, -1, -1, -1, -1, + 53, 196, 197, -1, -1, -1, -1, -1, + 54, 198, 199, -1, -1, -1, -1, -1, + 55, 200, 201, -1, -1, -1, -1, -1, + 56, 202, 203, -1, -1, -1, -1, -1, + 57, 204, 205, -1, -1, -1, -1, -1, + 58, 206, 207, -1, -1, -1, -1, -1, + 59, 208, 209, -1, -1, -1, -1, -1, + 60, 210, 211, -1, -1, -1, -1, -1, + 61, 212, 213, -1, -1, -1, -1, -1, + 62, 214, 215, -1, -1, -1, -1, -1, + 63, 216, 217, -1, -1, -1, -1, -1 +}; + +// table (uncompressed) of the c->v message indexes (-1=unused entry) +static const int qra_c2vmidx[qra_C*qra_MAXCDEG] = { + 0, -1, -1, 1, -1, -1, 2, -1, -1, 3, -1, -1, + 4, -1, -1, 5, -1, -1, 6, -1, -1, 7, -1, -1, + 8, -1, -1, 9, -1, -1, 10, -1, -1, 11, -1, -1, + 12, -1, -1, 13, -1, -1, 14, -1, -1, 15, -1, -1, + 16, -1, -1, 17, -1, -1, 18, -1, -1, 19, -1, -1, + 20, -1, -1, 21, -1, -1, 22, -1, -1, 23, -1, -1, + 24, -1, -1, 25, -1, -1, 26, -1, -1, 27, -1, -1, + 28, -1, -1, 29, -1, -1, 30, -1, -1, 31, -1, -1, + 32, -1, -1, 33, -1, -1, 34, -1, -1, 35, -1, -1, + 36, -1, -1, 37, -1, -1, 38, -1, -1, 39, -1, -1, + 40, -1, -1, 41, -1, -1, 42, -1, -1, 43, -1, -1, + 44, -1, -1, 45, -1, -1, 46, -1, -1, 47, -1, -1, + 48, -1, -1, 49, -1, -1, 50, -1, -1, 51, -1, -1, + 52, -1, -1, 53, -1, -1, 54, -1, -1, 55, -1, -1, + 56, -1, -1, 57, -1, -1, 58, -1, -1, 59, -1, -1, + 60, -1, -1, 61, -1, -1, 62, -1, -1, 63, -1, -1, + 64, 116, -1, 65, 117, 118, 66, 119, 120, 67, 121, 122, + 68, 123, 124, 69, 125, 126, 70, 127, 128, 71, 129, 130, + 72, 131, 132, 73, 133, 134, 74, 135, 136, 75, 137, 138, + 76, 139, 140, 77, 141, 142, 78, 143, 144, 79, 145, 146, + 80, 147, 148, 81, 149, 150, 82, 151, 152, 83, 153, 154, + 84, 155, 156, 85, 157, 158, 86, 159, 160, 87, 161, 162, + 88, 163, 164, 89, 165, 166, 90, 167, 168, 91, 169, 170, + 92, 171, 172, 93, 173, 174, 94, 175, 176, 95, 177, 178, + 96, 179, 180, 97, 181, 182, 98, 183, 184, 99, 185, 186, +100, 187, 188, 101, 189, 190, 102, 191, 192, 103, 193, 194, +104, 195, 196, 105, 197, 198, 106, 199, 200, 107, 201, 202, +108, 203, 204, 109, 205, 206, 110, 207, 208, 111, 209, 210, +112, 211, 212, 113, 213, 214, 114, 215, 216, 115, 217, -1 +}; + +// permutation matrix to compute Prob(x*alfa^logw) +static const int qra_pmat[qra_M*qra_M] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 0, 33, 1, 32, 2, 35, 3, 34, 4, 37, 5, 36, 6, 39, 7, 38, + 8, 41, 9, 40, 10, 43, 11, 42, 12, 45, 13, 44, 14, 47, 15, 46, + 16, 49, 17, 48, 18, 51, 19, 50, 20, 53, 21, 52, 22, 55, 23, 54, + 24, 57, 25, 56, 26, 59, 27, 58, 28, 61, 29, 60, 30, 63, 31, 62, + 0, 49, 33, 16, 1, 48, 32, 17, 2, 51, 35, 18, 3, 50, 34, 19, + 4, 53, 37, 20, 5, 52, 36, 21, 6, 55, 39, 22, 7, 54, 38, 23, + 8, 57, 41, 24, 9, 56, 40, 25, 10, 59, 43, 26, 11, 58, 42, 27, + 12, 61, 45, 28, 13, 60, 44, 29, 14, 63, 47, 30, 15, 62, 46, 31, + 0, 57, 49, 8, 33, 24, 16, 41, 1, 56, 48, 9, 32, 25, 17, 40, + 2, 59, 51, 10, 35, 26, 18, 43, 3, 58, 50, 11, 34, 27, 19, 42, + 4, 61, 53, 12, 37, 28, 20, 45, 5, 60, 52, 13, 36, 29, 21, 44, + 6, 63, 55, 14, 39, 30, 22, 47, 7, 62, 54, 15, 38, 31, 23, 46, + 0, 61, 57, 4, 49, 12, 8, 53, 33, 28, 24, 37, 16, 45, 41, 20, + 1, 60, 56, 5, 48, 13, 9, 52, 32, 29, 25, 36, 17, 44, 40, 21, + 2, 63, 59, 6, 51, 14, 10, 55, 35, 30, 26, 39, 18, 47, 43, 22, + 3, 62, 58, 7, 50, 15, 11, 54, 34, 31, 27, 38, 19, 46, 42, 23, + 0, 63, 61, 2, 57, 6, 4, 59, 49, 14, 12, 51, 8, 55, 53, 10, + 33, 30, 28, 35, 24, 39, 37, 26, 16, 47, 45, 18, 41, 22, 20, 43, + 1, 62, 60, 3, 56, 7, 5, 58, 48, 15, 13, 50, 9, 54, 52, 11, + 32, 31, 29, 34, 25, 38, 36, 27, 17, 46, 44, 19, 40, 23, 21, 42, + 0, 62, 63, 1, 61, 3, 2, 60, 57, 7, 6, 56, 4, 58, 59, 5, + 49, 15, 14, 48, 12, 50, 51, 13, 8, 54, 55, 9, 53, 11, 10, 52, + 33, 31, 30, 32, 28, 34, 35, 29, 24, 38, 39, 25, 37, 27, 26, 36, + 16, 46, 47, 17, 45, 19, 18, 44, 41, 23, 22, 40, 20, 42, 43, 21, + 0, 31, 62, 33, 63, 32, 1, 30, 61, 34, 3, 28, 2, 29, 60, 35, + 57, 38, 7, 24, 6, 25, 56, 39, 4, 27, 58, 37, 59, 36, 5, 26, + 49, 46, 15, 16, 14, 17, 48, 47, 12, 19, 50, 45, 51, 44, 13, 18, + 8, 23, 54, 41, 55, 40, 9, 22, 53, 42, 11, 20, 10, 21, 52, 43, + 0, 46, 31, 49, 62, 16, 33, 15, 63, 17, 32, 14, 1, 47, 30, 48, + 61, 19, 34, 12, 3, 45, 28, 50, 2, 44, 29, 51, 60, 18, 35, 13, + 57, 23, 38, 8, 7, 41, 24, 54, 6, 40, 25, 55, 56, 22, 39, 9, + 4, 42, 27, 53, 58, 20, 37, 11, 59, 21, 36, 10, 5, 43, 26, 52, + 0, 23, 46, 57, 31, 8, 49, 38, 62, 41, 16, 7, 33, 54, 15, 24, + 63, 40, 17, 6, 32, 55, 14, 25, 1, 22, 47, 56, 30, 9, 48, 39, + 61, 42, 19, 4, 34, 53, 12, 27, 3, 20, 45, 58, 28, 11, 50, 37, + 2, 21, 44, 59, 29, 10, 51, 36, 60, 43, 18, 5, 35, 52, 13, 26, + 0, 42, 23, 61, 46, 4, 57, 19, 31, 53, 8, 34, 49, 27, 38, 12, + 62, 20, 41, 3, 16, 58, 7, 45, 33, 11, 54, 28, 15, 37, 24, 50, + 63, 21, 40, 2, 17, 59, 6, 44, 32, 10, 55, 29, 14, 36, 25, 51, + 1, 43, 22, 60, 47, 5, 56, 18, 30, 52, 9, 35, 48, 26, 39, 13, + 0, 21, 42, 63, 23, 2, 61, 40, 46, 59, 4, 17, 57, 44, 19, 6, + 31, 10, 53, 32, 8, 29, 34, 55, 49, 36, 27, 14, 38, 51, 12, 25, + 62, 43, 20, 1, 41, 60, 3, 22, 16, 5, 58, 47, 7, 18, 45, 56, + 33, 52, 11, 30, 54, 35, 28, 9, 15, 26, 37, 48, 24, 13, 50, 39, + 0, 43, 21, 62, 42, 1, 63, 20, 23, 60, 2, 41, 61, 22, 40, 3, + 46, 5, 59, 16, 4, 47, 17, 58, 57, 18, 44, 7, 19, 56, 6, 45, + 31, 52, 10, 33, 53, 30, 32, 11, 8, 35, 29, 54, 34, 9, 55, 28, + 49, 26, 36, 15, 27, 48, 14, 37, 38, 13, 51, 24, 12, 39, 25, 50, + 0, 52, 43, 31, 21, 33, 62, 10, 42, 30, 1, 53, 63, 11, 20, 32, + 23, 35, 60, 8, 2, 54, 41, 29, 61, 9, 22, 34, 40, 28, 3, 55, + 46, 26, 5, 49, 59, 15, 16, 36, 4, 48, 47, 27, 17, 37, 58, 14, + 57, 13, 18, 38, 44, 24, 7, 51, 19, 39, 56, 12, 6, 50, 45, 25, + 0, 26, 52, 46, 43, 49, 31, 5, 21, 15, 33, 59, 62, 36, 10, 16, + 42, 48, 30, 4, 1, 27, 53, 47, 63, 37, 11, 17, 20, 14, 32, 58, + 23, 13, 35, 57, 60, 38, 8, 18, 2, 24, 54, 44, 41, 51, 29, 7, + 61, 39, 9, 19, 22, 12, 34, 56, 40, 50, 28, 6, 3, 25, 55, 45, + 0, 13, 26, 23, 52, 57, 46, 35, 43, 38, 49, 60, 31, 18, 5, 8, + 21, 24, 15, 2, 33, 44, 59, 54, 62, 51, 36, 41, 10, 7, 16, 29, + 42, 39, 48, 61, 30, 19, 4, 9, 1, 12, 27, 22, 53, 56, 47, 34, + 63, 50, 37, 40, 11, 6, 17, 28, 20, 25, 14, 3, 32, 45, 58, 55, + 0, 39, 13, 42, 26, 61, 23, 48, 52, 19, 57, 30, 46, 9, 35, 4, + 43, 12, 38, 1, 49, 22, 60, 27, 31, 56, 18, 53, 5, 34, 8, 47, + 21, 50, 24, 63, 15, 40, 2, 37, 33, 6, 44, 11, 59, 28, 54, 17, + 62, 25, 51, 20, 36, 3, 41, 14, 10, 45, 7, 32, 16, 55, 29, 58, + 0, 50, 39, 21, 13, 63, 42, 24, 26, 40, 61, 15, 23, 37, 48, 2, + 52, 6, 19, 33, 57, 11, 30, 44, 46, 28, 9, 59, 35, 17, 4, 54, + 43, 25, 12, 62, 38, 20, 1, 51, 49, 3, 22, 36, 60, 14, 27, 41, + 31, 45, 56, 10, 18, 32, 53, 7, 5, 55, 34, 16, 8, 58, 47, 29, + 0, 25, 50, 43, 39, 62, 21, 12, 13, 20, 63, 38, 42, 51, 24, 1, + 26, 3, 40, 49, 61, 36, 15, 22, 23, 14, 37, 60, 48, 41, 2, 27, + 52, 45, 6, 31, 19, 10, 33, 56, 57, 32, 11, 18, 30, 7, 44, 53, + 46, 55, 28, 5, 9, 16, 59, 34, 35, 58, 17, 8, 4, 29, 54, 47, + 0, 45, 25, 52, 50, 31, 43, 6, 39, 10, 62, 19, 21, 56, 12, 33, + 13, 32, 20, 57, 63, 18, 38, 11, 42, 7, 51, 30, 24, 53, 1, 44, + 26, 55, 3, 46, 40, 5, 49, 28, 61, 16, 36, 9, 15, 34, 22, 59, + 23, 58, 14, 35, 37, 8, 60, 17, 48, 29, 41, 4, 2, 47, 27, 54, + 0, 55, 45, 26, 25, 46, 52, 3, 50, 5, 31, 40, 43, 28, 6, 49, + 39, 16, 10, 61, 62, 9, 19, 36, 21, 34, 56, 15, 12, 59, 33, 22, + 13, 58, 32, 23, 20, 35, 57, 14, 63, 8, 18, 37, 38, 17, 11, 60, + 42, 29, 7, 48, 51, 4, 30, 41, 24, 47, 53, 2, 1, 54, 44, 27, + 0, 58, 55, 13, 45, 23, 26, 32, 25, 35, 46, 20, 52, 14, 3, 57, + 50, 8, 5, 63, 31, 37, 40, 18, 43, 17, 28, 38, 6, 60, 49, 11, + 39, 29, 16, 42, 10, 48, 61, 7, 62, 4, 9, 51, 19, 41, 36, 30, + 21, 47, 34, 24, 56, 2, 15, 53, 12, 54, 59, 1, 33, 27, 22, 44, + 0, 29, 58, 39, 55, 42, 13, 16, 45, 48, 23, 10, 26, 7, 32, 61, + 25, 4, 35, 62, 46, 51, 20, 9, 52, 41, 14, 19, 3, 30, 57, 36, + 50, 47, 8, 21, 5, 24, 63, 34, 31, 2, 37, 56, 40, 53, 18, 15, + 43, 54, 17, 12, 28, 1, 38, 59, 6, 27, 60, 33, 49, 44, 11, 22, + 0, 47, 29, 50, 58, 21, 39, 8, 55, 24, 42, 5, 13, 34, 16, 63, + 45, 2, 48, 31, 23, 56, 10, 37, 26, 53, 7, 40, 32, 15, 61, 18, + 25, 54, 4, 43, 35, 12, 62, 17, 46, 1, 51, 28, 20, 59, 9, 38, + 52, 27, 41, 6, 14, 33, 19, 60, 3, 44, 30, 49, 57, 22, 36, 11, + 0, 54, 47, 25, 29, 43, 50, 4, 58, 12, 21, 35, 39, 17, 8, 62, + 55, 1, 24, 46, 42, 28, 5, 51, 13, 59, 34, 20, 16, 38, 63, 9, + 45, 27, 2, 52, 48, 6, 31, 41, 23, 33, 56, 14, 10, 60, 37, 19, + 26, 44, 53, 3, 7, 49, 40, 30, 32, 22, 15, 57, 61, 11, 18, 36, + 0, 27, 54, 45, 47, 52, 25, 2, 29, 6, 43, 48, 50, 41, 4, 31, + 58, 33, 12, 23, 21, 14, 35, 56, 39, 60, 17, 10, 8, 19, 62, 37, + 55, 44, 1, 26, 24, 3, 46, 53, 42, 49, 28, 7, 5, 30, 51, 40, + 13, 22, 59, 32, 34, 57, 20, 15, 16, 11, 38, 61, 63, 36, 9, 18, + 0, 44, 27, 55, 54, 26, 45, 1, 47, 3, 52, 24, 25, 53, 2, 46, + 29, 49, 6, 42, 43, 7, 48, 28, 50, 30, 41, 5, 4, 40, 31, 51, + 58, 22, 33, 13, 12, 32, 23, 59, 21, 57, 14, 34, 35, 15, 56, 20, + 39, 11, 60, 16, 17, 61, 10, 38, 8, 36, 19, 63, 62, 18, 37, 9, + 0, 22, 44, 58, 27, 13, 55, 33, 54, 32, 26, 12, 45, 59, 1, 23, + 47, 57, 3, 21, 52, 34, 24, 14, 25, 15, 53, 35, 2, 20, 46, 56, + 29, 11, 49, 39, 6, 16, 42, 60, 43, 61, 7, 17, 48, 38, 28, 10, + 50, 36, 30, 8, 41, 63, 5, 19, 4, 18, 40, 62, 31, 9, 51, 37, + 0, 11, 22, 29, 44, 39, 58, 49, 27, 16, 13, 6, 55, 60, 33, 42, + 54, 61, 32, 43, 26, 17, 12, 7, 45, 38, 59, 48, 1, 10, 23, 28, + 47, 36, 57, 50, 3, 8, 21, 30, 52, 63, 34, 41, 24, 19, 14, 5, + 25, 18, 15, 4, 53, 62, 35, 40, 2, 9, 20, 31, 46, 37, 56, 51, + 0, 36, 11, 47, 22, 50, 29, 57, 44, 8, 39, 3, 58, 30, 49, 21, + 27, 63, 16, 52, 13, 41, 6, 34, 55, 19, 60, 24, 33, 5, 42, 14, + 54, 18, 61, 25, 32, 4, 43, 15, 26, 62, 17, 53, 12, 40, 7, 35, + 45, 9, 38, 2, 59, 31, 48, 20, 1, 37, 10, 46, 23, 51, 28, 56, + 0, 18, 36, 54, 11, 25, 47, 61, 22, 4, 50, 32, 29, 15, 57, 43, + 44, 62, 8, 26, 39, 53, 3, 17, 58, 40, 30, 12, 49, 35, 21, 7, + 27, 9, 63, 45, 16, 2, 52, 38, 13, 31, 41, 59, 6, 20, 34, 48, + 55, 37, 19, 1, 60, 46, 24, 10, 33, 51, 5, 23, 42, 56, 14, 28, + 0, 9, 18, 27, 36, 45, 54, 63, 11, 2, 25, 16, 47, 38, 61, 52, + 22, 31, 4, 13, 50, 59, 32, 41, 29, 20, 15, 6, 57, 48, 43, 34, + 44, 37, 62, 55, 8, 1, 26, 19, 39, 46, 53, 60, 3, 10, 17, 24, + 58, 51, 40, 33, 30, 23, 12, 5, 49, 56, 35, 42, 21, 28, 7, 14, + 0, 37, 9, 44, 18, 55, 27, 62, 36, 1, 45, 8, 54, 19, 63, 26, + 11, 46, 2, 39, 25, 60, 16, 53, 47, 10, 38, 3, 61, 24, 52, 17, + 22, 51, 31, 58, 4, 33, 13, 40, 50, 23, 59, 30, 32, 5, 41, 12, + 29, 56, 20, 49, 15, 42, 6, 35, 57, 28, 48, 21, 43, 14, 34, 7, + 0, 51, 37, 22, 9, 58, 44, 31, 18, 33, 55, 4, 27, 40, 62, 13, + 36, 23, 1, 50, 45, 30, 8, 59, 54, 5, 19, 32, 63, 12, 26, 41, + 11, 56, 46, 29, 2, 49, 39, 20, 25, 42, 60, 15, 16, 35, 53, 6, + 47, 28, 10, 57, 38, 21, 3, 48, 61, 14, 24, 43, 52, 7, 17, 34, + 0, 56, 51, 11, 37, 29, 22, 46, 9, 49, 58, 2, 44, 20, 31, 39, + 18, 42, 33, 25, 55, 15, 4, 60, 27, 35, 40, 16, 62, 6, 13, 53, + 36, 28, 23, 47, 1, 57, 50, 10, 45, 21, 30, 38, 8, 48, 59, 3, + 54, 14, 5, 61, 19, 43, 32, 24, 63, 7, 12, 52, 26, 34, 41, 17, + 0, 28, 56, 36, 51, 47, 11, 23, 37, 57, 29, 1, 22, 10, 46, 50, + 9, 21, 49, 45, 58, 38, 2, 30, 44, 48, 20, 8, 31, 3, 39, 59, + 18, 14, 42, 54, 33, 61, 25, 5, 55, 43, 15, 19, 4, 24, 60, 32, + 27, 7, 35, 63, 40, 52, 16, 12, 62, 34, 6, 26, 13, 17, 53, 41, + 0, 14, 28, 18, 56, 54, 36, 42, 51, 61, 47, 33, 11, 5, 23, 25, + 37, 43, 57, 55, 29, 19, 1, 15, 22, 24, 10, 4, 46, 32, 50, 60, + 9, 7, 21, 27, 49, 63, 45, 35, 58, 52, 38, 40, 2, 12, 30, 16, + 44, 34, 48, 62, 20, 26, 8, 6, 31, 17, 3, 13, 39, 41, 59, 53, + 0, 7, 14, 9, 28, 27, 18, 21, 56, 63, 54, 49, 36, 35, 42, 45, + 51, 52, 61, 58, 47, 40, 33, 38, 11, 12, 5, 2, 23, 16, 25, 30, + 37, 34, 43, 44, 57, 62, 55, 48, 29, 26, 19, 20, 1, 6, 15, 8, + 22, 17, 24, 31, 10, 13, 4, 3, 46, 41, 32, 39, 50, 53, 60, 59, + 0, 34, 7, 37, 14, 44, 9, 43, 28, 62, 27, 57, 18, 48, 21, 55, + 56, 26, 63, 29, 54, 20, 49, 19, 36, 6, 35, 1, 42, 8, 45, 15, + 51, 17, 52, 22, 61, 31, 58, 24, 47, 13, 40, 10, 33, 3, 38, 4, + 11, 41, 12, 46, 5, 39, 2, 32, 23, 53, 16, 50, 25, 59, 30, 60, + 0, 17, 34, 51, 7, 22, 37, 52, 14, 31, 44, 61, 9, 24, 43, 58, + 28, 13, 62, 47, 27, 10, 57, 40, 18, 3, 48, 33, 21, 4, 55, 38, + 56, 41, 26, 11, 63, 46, 29, 12, 54, 39, 20, 5, 49, 32, 19, 2, + 36, 53, 6, 23, 35, 50, 1, 16, 42, 59, 8, 25, 45, 60, 15, 30, + 0, 41, 17, 56, 34, 11, 51, 26, 7, 46, 22, 63, 37, 12, 52, 29, + 14, 39, 31, 54, 44, 5, 61, 20, 9, 32, 24, 49, 43, 2, 58, 19, + 28, 53, 13, 36, 62, 23, 47, 6, 27, 50, 10, 35, 57, 16, 40, 1, + 18, 59, 3, 42, 48, 25, 33, 8, 21, 60, 4, 45, 55, 30, 38, 15, + 0, 53, 41, 28, 17, 36, 56, 13, 34, 23, 11, 62, 51, 6, 26, 47, + 7, 50, 46, 27, 22, 35, 63, 10, 37, 16, 12, 57, 52, 1, 29, 40, + 14, 59, 39, 18, 31, 42, 54, 3, 44, 25, 5, 48, 61, 8, 20, 33, + 9, 60, 32, 21, 24, 45, 49, 4, 43, 30, 2, 55, 58, 15, 19, 38, + 0, 59, 53, 14, 41, 18, 28, 39, 17, 42, 36, 31, 56, 3, 13, 54, + 34, 25, 23, 44, 11, 48, 62, 5, 51, 8, 6, 61, 26, 33, 47, 20, + 7, 60, 50, 9, 46, 21, 27, 32, 22, 45, 35, 24, 63, 4, 10, 49, + 37, 30, 16, 43, 12, 55, 57, 2, 52, 15, 1, 58, 29, 38, 40, 19, + 0, 60, 59, 7, 53, 9, 14, 50, 41, 21, 18, 46, 28, 32, 39, 27, + 17, 45, 42, 22, 36, 24, 31, 35, 56, 4, 3, 63, 13, 49, 54, 10, + 34, 30, 25, 37, 23, 43, 44, 16, 11, 55, 48, 12, 62, 2, 5, 57, + 51, 15, 8, 52, 6, 58, 61, 1, 26, 38, 33, 29, 47, 19, 20, 40, + 0, 30, 60, 34, 59, 37, 7, 25, 53, 43, 9, 23, 14, 16, 50, 44, + 41, 55, 21, 11, 18, 12, 46, 48, 28, 2, 32, 62, 39, 57, 27, 5, + 17, 15, 45, 51, 42, 52, 22, 8, 36, 58, 24, 6, 31, 1, 35, 61, + 56, 38, 4, 26, 3, 29, 63, 33, 13, 19, 49, 47, 54, 40, 10, 20, + 0, 15, 30, 17, 60, 51, 34, 45, 59, 52, 37, 42, 7, 8, 25, 22, + 53, 58, 43, 36, 9, 6, 23, 24, 14, 1, 16, 31, 50, 61, 44, 35, + 41, 38, 55, 56, 21, 26, 11, 4, 18, 29, 12, 3, 46, 33, 48, 63, + 28, 19, 2, 13, 32, 47, 62, 49, 39, 40, 57, 54, 27, 20, 5, 10, + 0, 38, 15, 41, 30, 56, 17, 55, 60, 26, 51, 21, 34, 4, 45, 11, + 59, 29, 52, 18, 37, 3, 42, 12, 7, 33, 8, 46, 25, 63, 22, 48, + 53, 19, 58, 28, 43, 13, 36, 2, 9, 47, 6, 32, 23, 49, 24, 62, + 14, 40, 1, 39, 16, 54, 31, 57, 50, 20, 61, 27, 44, 10, 35, 5, + 0, 19, 38, 53, 15, 28, 41, 58, 30, 13, 56, 43, 17, 2, 55, 36, + 60, 47, 26, 9, 51, 32, 21, 6, 34, 49, 4, 23, 45, 62, 11, 24, + 59, 40, 29, 14, 52, 39, 18, 1, 37, 54, 3, 16, 42, 57, 12, 31, + 7, 20, 33, 50, 8, 27, 46, 61, 25, 10, 63, 44, 22, 5, 48, 35, + 0, 40, 19, 59, 38, 14, 53, 29, 15, 39, 28, 52, 41, 1, 58, 18, + 30, 54, 13, 37, 56, 16, 43, 3, 17, 57, 2, 42, 55, 31, 36, 12, + 60, 20, 47, 7, 26, 50, 9, 33, 51, 27, 32, 8, 21, 61, 6, 46, + 34, 10, 49, 25, 4, 44, 23, 63, 45, 5, 62, 22, 11, 35, 24, 48, + 0, 20, 40, 60, 19, 7, 59, 47, 38, 50, 14, 26, 53, 33, 29, 9, + 15, 27, 39, 51, 28, 8, 52, 32, 41, 61, 1, 21, 58, 46, 18, 6, + 30, 10, 54, 34, 13, 25, 37, 49, 56, 44, 16, 4, 43, 63, 3, 23, + 17, 5, 57, 45, 2, 22, 42, 62, 55, 35, 31, 11, 36, 48, 12, 24, + 0, 10, 20, 30, 40, 34, 60, 54, 19, 25, 7, 13, 59, 49, 47, 37, + 38, 44, 50, 56, 14, 4, 26, 16, 53, 63, 33, 43, 29, 23, 9, 3, + 15, 5, 27, 17, 39, 45, 51, 57, 28, 22, 8, 2, 52, 62, 32, 42, + 41, 35, 61, 55, 1, 11, 21, 31, 58, 48, 46, 36, 18, 24, 6, 12, + 0, 5, 10, 15, 20, 17, 30, 27, 40, 45, 34, 39, 60, 57, 54, 51, + 19, 22, 25, 28, 7, 2, 13, 8, 59, 62, 49, 52, 47, 42, 37, 32, + 38, 35, 44, 41, 50, 55, 56, 61, 14, 11, 4, 1, 26, 31, 16, 21, + 53, 48, 63, 58, 33, 36, 43, 46, 29, 24, 23, 18, 9, 12, 3, 6, + 0, 35, 5, 38, 10, 41, 15, 44, 20, 55, 17, 50, 30, 61, 27, 56, + 40, 11, 45, 14, 34, 1, 39, 4, 60, 31, 57, 26, 54, 21, 51, 16, + 19, 48, 22, 53, 25, 58, 28, 63, 7, 36, 2, 33, 13, 46, 8, 43, + 59, 24, 62, 29, 49, 18, 52, 23, 47, 12, 42, 9, 37, 6, 32, 3, + 0, 48, 35, 19, 5, 53, 38, 22, 10, 58, 41, 25, 15, 63, 44, 28, + 20, 36, 55, 7, 17, 33, 50, 2, 30, 46, 61, 13, 27, 43, 56, 8, + 40, 24, 11, 59, 45, 29, 14, 62, 34, 18, 1, 49, 39, 23, 4, 52, + 60, 12, 31, 47, 57, 9, 26, 42, 54, 6, 21, 37, 51, 3, 16, 32, + 0, 24, 48, 40, 35, 59, 19, 11, 5, 29, 53, 45, 38, 62, 22, 14, + 10, 18, 58, 34, 41, 49, 25, 1, 15, 23, 63, 39, 44, 52, 28, 4, + 20, 12, 36, 60, 55, 47, 7, 31, 17, 9, 33, 57, 50, 42, 2, 26, + 30, 6, 46, 54, 61, 37, 13, 21, 27, 3, 43, 51, 56, 32, 8, 16, + 0, 12, 24, 20, 48, 60, 40, 36, 35, 47, 59, 55, 19, 31, 11, 7, + 5, 9, 29, 17, 53, 57, 45, 33, 38, 42, 62, 50, 22, 26, 14, 2, + 10, 6, 18, 30, 58, 54, 34, 46, 41, 37, 49, 61, 25, 21, 1, 13, + 15, 3, 23, 27, 63, 51, 39, 43, 44, 32, 52, 56, 28, 16, 4, 8, + 0, 6, 12, 10, 24, 30, 20, 18, 48, 54, 60, 58, 40, 46, 36, 34, + 35, 37, 47, 41, 59, 61, 55, 49, 19, 21, 31, 25, 11, 13, 7, 1, + 5, 3, 9, 15, 29, 27, 17, 23, 53, 51, 57, 63, 45, 43, 33, 39, + 38, 32, 42, 44, 62, 56, 50, 52, 22, 16, 26, 28, 14, 8, 2, 4, + 0, 3, 6, 5, 12, 15, 10, 9, 24, 27, 30, 29, 20, 23, 18, 17, + 48, 51, 54, 53, 60, 63, 58, 57, 40, 43, 46, 45, 36, 39, 34, 33, + 35, 32, 37, 38, 47, 44, 41, 42, 59, 56, 61, 62, 55, 52, 49, 50, + 19, 16, 21, 22, 31, 28, 25, 26, 11, 8, 13, 14, 7, 4, 1, 2, + 0, 32, 3, 35, 6, 38, 5, 37, 12, 44, 15, 47, 10, 42, 9, 41, + 24, 56, 27, 59, 30, 62, 29, 61, 20, 52, 23, 55, 18, 50, 17, 49, + 48, 16, 51, 19, 54, 22, 53, 21, 60, 28, 63, 31, 58, 26, 57, 25, + 40, 8, 43, 11, 46, 14, 45, 13, 36, 4, 39, 7, 34, 2, 33, 1, + 0, 16, 32, 48, 3, 19, 35, 51, 6, 22, 38, 54, 5, 21, 37, 53, + 12, 28, 44, 60, 15, 31, 47, 63, 10, 26, 42, 58, 9, 25, 41, 57, + 24, 8, 56, 40, 27, 11, 59, 43, 30, 14, 62, 46, 29, 13, 61, 45, + 20, 4, 52, 36, 23, 7, 55, 39, 18, 2, 50, 34, 17, 1, 49, 33, + 0, 8, 16, 24, 32, 40, 48, 56, 3, 11, 19, 27, 35, 43, 51, 59, + 6, 14, 22, 30, 38, 46, 54, 62, 5, 13, 21, 29, 37, 45, 53, 61, + 12, 4, 28, 20, 44, 36, 60, 52, 15, 7, 31, 23, 47, 39, 63, 55, + 10, 2, 26, 18, 42, 34, 58, 50, 9, 1, 25, 17, 41, 33, 57, 49, + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, + 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, + 6, 2, 14, 10, 22, 18, 30, 26, 38, 34, 46, 42, 54, 50, 62, 58, + 5, 1, 13, 9, 21, 17, 29, 25, 37, 33, 45, 41, 53, 49, 61, 57, + 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, + 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, + 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 +}; + +const qracode qra_13_64_64_irr_e = { + qra_K, + qra_N, + qra_m, + qra_M, + qra_a, + qra_NC, + qra_V, + qra_C, + qra_NMSG, + qra_MAXVDEG, + qra_MAXCDEG, + QRATYPE_CRCPUNCTURED, + qra_R, + CODE_NAME, + qra_acc_input_idx, + qra_acc_input_wlog, + qra_log, + qra_exp, + qra_msgw, + qra_vdeg, + qra_cdeg, + qra_v2cmidx, + qra_c2vmidx, + qra_pmat +}; + +#undef qra_K +#undef qra_N +#undef qra_m +#undef qra_M +#undef qra_a +#undef qra_NC +#undef qra_V +#undef qra_C +#undef qra_NMSG +#undef qra_MAXVDEG +#undef qra_MAXCDEG +#undef qra_R +#undef CODE_NAME \ No newline at end of file diff --git a/map65/libm65/qracodes/qra13_64_64_irr_e.h b/map65/libm65/qracodes/qra13_64_64_irr_e.h new file mode 100644 index 000000000..d24421d2f --- /dev/null +++ b/map65/libm65/qracodes/qra13_64_64_irr_e.h @@ -0,0 +1,39 @@ +// qra13_64_64_irr_e.h +// Code tables and defines for Q-ary RA code (13,64) over GF(64) +// Code Name: qra13_64_64_irr_e +// (13,64) RA Code over GF(64) RF=[3x4 4x4 6x1 3x2 5x1 7x1]/18 + +// (c) 2016 - Nico Palermo - IV3NWV - Microtelecom Srl, Italy + +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +#ifndef _qra13_64_64_irr_e_h +#define _qra13_64_64_irr_e_h + +#include "qracodes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern const qracode qra_13_64_64_irr_e; + +#ifdef __cplusplus +} +#endif + +#endif // _qra13_64_64_irr_e_h diff --git a/map65/libm65/qracodes/qracodes.c b/map65/libm65/qracodes/qracodes.c new file mode 100644 index 000000000..748a9c9cd --- /dev/null +++ b/map65/libm65/qracodes/qracodes.c @@ -0,0 +1,474 @@ +// qracodes.c +// Q-ary RA codes encoding/decoding functions +// +// (c) 2016 - Nico Palermo, IV3NWV - Microtelecom Srl, Italy +// ------------------------------------------------------------------------------ +// This file is part of the qracodes project, a Forward Error Control +// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. +// +// qracodes 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. +// qracodes 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 qracodes source distribution. +// If not, see . + +#include +#include + +#include "npfwht.h" +#include "pdmath.h" + +#include "qracodes.h" + +int qra_encode(const qracode *pcode, int *y, const int *x) +{ + int k,j,kk,jj; + int t, chk = 0; + + const int K = pcode->K; + const int M = pcode->M; + const int NC= pcode->NC; + const int a = pcode->a; + const int *acc_input_idx = pcode->acc_input_idx; + const int *acc_input_wlog = pcode->acc_input_wlog; + const int *gflog = pcode->gflog; + const int *gfexp = pcode->gfexp; + + // copy the systematic symbols to destination + memcpy(y,x,K*sizeof(int)); + + y = y+K; // point to check symbols + + // compute the code check symbols as a weighted accumulation of a permutated + // sequence of the (repeated) systematic input symbols: + // chk(k+1) = x(idx(k))*alfa^(logw(k)) + chk(k) + // (all operations performed over GF(M)) + + if (a==1) { // grouping factor = 1 + for (k=0;k 1 + for (k=0;k80.f) // avoid floating point exp() overflows + v=80.f; + + src[nitems] = (float)exp(v); + } +} + + +float qra_mfskbesselmetric(float *pix, const float *rsq, const int m, const int N, float EsNoMetric) +{ + // Computes the codeword symbols intrinsic probabilities + // given the square of the received input amplitudes. + + // The input vector rqs must be a linear array of size M*N, where M=2^m, + // containing the squared amplitudes (rp*rp+rq*rq) of the input samples + + // First symbol amplitudes should be stored in the first M positions, + // second symbol amplitudes stored at positions [M ... 2*M-1], and so on. + + // Output vector is the intrinsic symbol metric (the probability distribution) + // assuming that symbols are transmitted using a M-FSK modulation + // and incoherent demodulation. + + // As the input Es/No is generally unknown (as it cannot be exstimated accurately + // when the codeword length is few tens symbols) but an exact metric requires it + // we simply fix it to a predefined EsNoMetric value so that the metric is what + // expected at that specific value. + // The metric computed in this way is optimal only at this predefined Es/No value, + // nevertheless it is usually better than a generic parameter-free metric which + // makes no assumptions on the input Es/No. + + // returns the estimated noise standard deviation + + int k; + float rsum = 0.f; + float sigmaest, cmetric; + + const int M = 1<M; + const int qra_m = pcode->m; + const int qra_V = pcode->V; + const int qra_MAXVDEG = pcode->MAXVDEG; + const int *qra_vdeg = pcode->vdeg; + const int qra_C = pcode->C; + const int qra_MAXCDEG = pcode->MAXCDEG; + const int *qra_cdeg = pcode->cdeg; + const int *qra_v2cmidx = pcode->v2cmidx; + const int *qra_c2vmidx = pcode->c2vmidx; + const int *qra_pmat = pcode->gfpmat; + const int *qra_msgw = pcode->msgw; + +// float msgout[qra_M]; // buffer to store temporary results + float msgout[QRACODE_MAX_M]; // we use a fixed size in order to avoid mallocs + + float totex; // total extrinsic information + int nit; // current iteration + int nv; // current variable + int nc; // current check + int k,kk; // loop indexes + + int ndeg; // current node degree + int msgbase; // current offset in the table of msg indexes + int imsg; // current message index + int wmsg; // current message weight + + int rc = -1; // rc>=0 extrinsic converged to 1 at iteration rc (rc=0..maxiter-1) + // rc=-1 no convergence in the given number of iterations + // rc=-2 error in the code tables (code checks degrees must be >1) + // rc=-3 M is larger than QRACODE_MAX_M + + + + if (qra_M>QRACODE_MAX_M) + return -3; + + // message initialization ------------------------------------------------------- + + // init c->v variable intrinsic msgs + pd_init(C2VMSG(0),pix,qra_M*qra_V); + + // init the v->c messages directed to code factors (k=1..ndeg) with the intrinsic info + for (nv=0;nvc + for (k=1;kv step ----------------------------------------------------- + // Computes messages from code checks to code variables. + // As the first qra_V checks are associated with intrinsic information + // (the code tables have been constructed in this way) + // we need to do this step only for code checks in the range [qra_V..qra_C) + + // The convolutions of probability distributions over the alphabet of a finite field GF(qra_M) + // are performed with a fast convolution algorithm over the given field. + // + // I.e. given the code check x1+x2+x3 = 0 (with x1,x2,x3 in GF(2^m)) + // and given Prob(x2) and Prob(x3), we have that: + // Prob(x1=X1) = Prob((x2+x3)=X1) = sum((Prob(x2=X2)*Prob(x3=(X1+X2))) for all the X2s in the field + // This translates to Prob(x1) = IWHT(WHT(Prob(x2))*WHT(Prob(x3))) + // where WHT and IWHT are the direct and inverse Walsh-Hadamard transforms of the argument. + // Note that the WHT and the IWHF differs only by a multiplicative coefficent and since in this step + // we don't need that the output distribution is normalized we use the relationship + // Prob(x1) =(proportional to) WH(WH(Prob(x2))*WH(Prob(x3))) + + // In general given the check code x1+x2+x3+..+xm = 0 + // the output distribution of a variable given the distributions of the other m-1 variables + // is the inverse WHT of the product of the WHTs of the distribution of the other m-1 variables + // The complexity of this algorithm scales with M*log2(M) instead of the M^2 complexity of + // the brute force approach (M=size of the alphabet) + + for (nc=qra_V;nc1) + return -2; // bad code tables + + msgbase = nc*qra_MAXCDEG; // base to msg index row for the current node + + // transforms inputs in the Walsh-Hadamard "frequency" domain + // v->c -> fwht(v->c) + for (k=0;kv = prod(fwht(v->c)) + // TODO: we assume that checks degrees are not larger than three but + // if they are larger the products can be computed more efficiently + for (kk=0;kkc steps when multipling + // small fp numbers + msgout[0]+=1E-7f; // TODO: define the bias accordingly to the field size + + np_fwht(qra_m,msgout,msgout); + + // inverse weight and output + imsg = qra_c2vmidx[msgbase+k]; // current output msg index + wmsg = qra_msgw[imsg]; // current msg weight + + if (wmsg==0) + pd_init(C2VMSG(imsg),msgout,qra_M); + else + // output p(alfa^(-w)*x) + pd_bwdperm(C2VMSG(imsg),msgout, MSGPERM(wmsg), qra_M); + + } // for (k=0;kc step ----------------------------------------------------- + for (nv=0;nvc msg = prod(c->v) + // TODO: factor factors to reduce the number of computations for high degree nodes + for (kk=0;kkc are null + // normalize output to a probability distribution + if (pd_norm(msgout,qra_m)<=0) { + // dump msgin; + printf("warning: v->c pd with invalid norm. nit=%d nv=%d k=%d\n",nit,nv,k); + for (kk=0;kk(1.*(qra_V)-0.01)) { + // the total maximum extrinsic information of each symbol in the codeword + // is very close to one. This means that we have reached the (1,1) point in the + // code EXIT chart(s) and we have successfully decoded the input. + rc = nit; + break; // remove the break to evaluate the decoder speed performance as a function of the max iterations number) + } + + } // for (nit=0;nitM; + const int qra_m = pcode->m; + const int qra_K = pcode->K; + + int k; + + for (k=0;k. + +#ifndef _qracodes_h_ +#define _qracodes_h_ + +// type of codes +#define QRATYPE_NORMAL 0x00 // normal code +#define QRATYPE_CRC 0x01 // code with crc - last information symbol is a CRC +#define QRATYPE_CRCPUNCTURED 0x02 // the CRC symbol is punctured (not sent along the channel) + + +typedef struct { + // code parameters + const int K; // number of information symbols + const int N; // codeword length in symbols + const int m; // bits/symbol + const int M; // Symbol alphabet cardinality (2^m) + const int a; // code grouping factor + const int NC; // number of check symbols (N-K) + const int V; // number of variables in the code graph (N) + const int C; // number of factors in the code graph (N +(N-K)+1) + const int NMSG; // number of msgs in the code graph + const int MAXVDEG; // maximum variable degree + const int MAXCDEG; // maximum factor degree + const int type; // see QRATYPE_xx defines + const float R; // code rate (K/N) + const char name[64]; // code name + // tables used by the encoder + const int *acc_input_idx; + const int *acc_input_wlog; + const int *gflog; + const int *gfexp; + // tables used by the decoder ------------------------- + const int *msgw; + const int *vdeg; + const int *cdeg; + const int *v2cmidx; + const int *c2vmidx; + const int *gfpmat; +} qracode; +// Uncomment the header file of the code which needs to be tested + +//#include "qra12_63_64_irr_b.h" // irregular code (12,63) over GF(64) +//#include "qra13_64_64_irr_e.h" // irregular code with good performance and best UER protection at AP56 +//#include "qra13_64_64_reg_a.h" // regular code with good UER but perf. inferior to that of code qra12_63_64_irr_b + +#ifdef __cplusplus +extern "C" { +#endif + +int qra_encode(const qracode *pcode, int *y, const int *x); +float qra_mfskbesselmetric(float *pix, const float *rsq, const int m, const int N, float EsNoMetric); +int qra_extrinsic(const qracode *pcode, float *pex, const float *pix, int maxiter,float *qra_v2cmsg,float *qra_c2vmsg); +void qra_mapdecode(const qracode *pcode, int *xdec, float *pex, const float *pix); + +#ifdef __cplusplus +} +#endif + +#endif // _qracodes_h_ diff --git a/map65/libm65/recvpkt.f90 b/map65/libm65/recvpkt.f90 new file mode 100644 index 000000000..e46252c66 --- /dev/null +++ b/map65/libm65/recvpkt.f90 @@ -0,0 +1,70 @@ +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(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..66841b895 --- /dev/null +++ b/map65/libm65/sleep_msec.f90 @@ -0,0 +1,3 @@ +subroutine sleep_msec(n) + 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/spec64.f90 b/map65/libm65/spec64.f90 new file mode 100644 index 000000000..a0c0a04c7 --- /dev/null +++ b/map65/libm65/spec64.f90 @@ -0,0 +1,42 @@ +subroutine spec64(c0,npts2,mode64,jpk,s3,LL,NN) + + parameter (NSPS=3456) !Samples per symbol at 6000 Hz + complex c0(0:360000) !Complex spectrum of dd() + complex cs(0:NSPS-1) !Complex symbol spectrum + real s3(LL,NN) !Synchronized symbol spectra + real xbase0(LL),xbase(LL) + + nfft=nsps + fac=1.0/nfft + do j=1,NN + jj=j+7 !Skip first Costas array + if(j.ge.33) jj=j+14 !Skip middle Costas array + ja=jpk + (jj-1)*nfft + jb=ja+nfft-1 + cs(0:nfft-1)=fac*c0(ja:jb) + call four2a(cs,nfft,1,-1,1) + do ii=1,LL + i=ii-65 + if(i.lt.0) i=i+nfft + s3(ii,j)=real(cs(i))**2 + aimag(cs(i))**2 + enddo + enddo + + df=6000.0/nfft + do i=1,LL + call pctile(s3(i,1:NN),NN,45,xbase0(i)) !Get baseline for passband shape + enddo + + nh=25 + xbase(1:nh-1)=sum(xbase0(1:nh-1))/(nh-1.0) + xbase(LL-nh+1:LL)=sum(xbase0(LL-nh+1:LL))/(nh-1.0) + do i=nh,LL-nh + xbase(i)=sum(xbase0(i-nh+1:i+nh))/(2*nh+1) !Smoothed passband shape + enddo + + do i=1,LL + s3(i,1:NN)=s3(i,1:NN)/(xbase(i)+0.001) !Apply frequency equalization + enddo + + return +end subroutine spec64 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/sync64.f90 b/map65/libm65/sync64.f90 new file mode 100644 index 000000000..789d316d7 --- /dev/null +++ b/map65/libm65/sync64.f90 @@ -0,0 +1,169 @@ +subroutine sync64(c0,nf1,nf2,nfqso,ntol,mode64,emedelay,dtx,f0,jpk,sync, & + sync2,width) + +! use timer_module, only: timer + + parameter (NMAX=60*12000) !Max size of raw data at 12000 Hz + parameter (NSPS=3456) !Samples per symbol at 6000 Hz + parameter (NSPC=7*NSPS) !Samples per Costas array + real s1(0:NSPC-1) !Power spectrum of Costas 1 + real s2(0:NSPC-1) !Power spectrum of Costas 2 + real s3(0:NSPC-1) !Power spectrum of Costas 3 + real s0(0:NSPC-1) !Sum of s1+s2+s3 + real s0a(0:NSPC-1) !Best synchromized spectrum (saved) + real s0b(0:NSPC-1) !tmp + real a(5) + integer icos7(0:6) !Costas 7x7 tones + integer ipk0(1) + complex cc(0:NSPC-1) !Costas waveform + complex c0(0:720000) !Complex spectrum of dd() + complex c1(0:NSPC-1) !Complex spectrum of Costas 1 + complex c2(0:NSPC-1) !Complex spectrum of Costas 2 + complex c3(0:NSPC-1) !Complex spectrum of Costas 3 + data icos7/2,5,6,0,4,1,3/ !Costas 7x7 tone pattern + data mode64z/-1/ + save + + if(mode64.ne.mode64z) then + twopi=8.0*atan(1.0) + dfgen=mode64*12000.0/6912.0 + k=-1 + phi=0. + do j=0,6 !Compute complex Costas waveform + dphi=twopi*10.0*icos7(j)*dfgen/6000.0 + do i=1,NSPS + phi=phi + dphi + if(phi.gt.twopi) phi=phi-twopi + k=k+1 + cc(k)=cmplx(cos(phi),sin(phi)) + enddo + enddo + mode64z=mode64 + endif + + nfft3=NSPC + nh3=nfft3/2 + df3=6000.0/nfft3 + + faa=nfqso-ntol + fbb=nfqso+ntol + iaa=max(0,nint(faa/df3)+nh3) + ibb=min(NSPC-1,nint(fbb/df3)+nh3) + + fa=-3000.0 + fb=3000.0 + ia=max(0,nint(fa/df3)+nh3) + ib=min(NSPC-1,nint(fb/df3)+nh3) + + id=0.1*(ib-ia) + iz=ib-ia+1 + sync=-1.e30 + smaxall=0. + jpk=0 + ja=0 + jb=(5.0+emedelay)*6000 +! jstep=100 + jstep=200 + ipk=0 + kpk=0 + nadd=10*mode64 + if(mod(nadd,2).eq.0) nadd=nadd+1 !Make nadd odd + nskip=max(49,nadd) + + do j1=ja,jb,jstep + call timer('sync64_1',0) + j2=j1 + 39*NSPS + j3=j1 + 77*NSPS + c1=1.e-4*c0(j1:j1+NSPC-1) * conjg(cc) + c2=1.e-4*c0(j2:j2+NSPC-1) * conjg(cc) + c3=1.e-4*c0(j3:j3+NSPC-1) * conjg(cc) + call four2a(c1,nfft3,1,-1,1) + call four2a(c2,nfft3,1,-1,1) + call four2a(c3,nfft3,1,-1,1) + c1=cshift(c1,nh3) + c2=cshift(c2,nh3) + c3=cshift(c3,nh3) + s1=0. + s2=0. + s3=0. + s0b=0. + do i=ia,ib + s1(i)=real(c1(i))**2 + aimag(c1(i))**2 + s2(i)=real(c2(i))**2 + aimag(c2(i))**2 + s3(i)=real(c3(i))**2 + aimag(c3(i))**2 + enddo + call timer('sync64_1',1) + + call timer('sync64_2',0) + s0(ia:ib)=s1(ia:ib) + s2(ia:ib) + s3(ia:ib) + s0(:ia-1)=0. + s0(ib+1:)=0. + if(nadd.ge.3) then + do ii=1,3 + s0b(ia:ib)=s0(ia:ib) + call smo(s0b(ia:ib),iz,s0(ia:ib),nadd) + enddo + endif + call averms(s0(ia+id:ib-id),iz-2*id,nskip,ave,rms) + s=(maxval(s0(iaa:ibb))-ave)/rms + ipk0=maxloc(s0(iaa:ibb)) + ip=ipk0(1) + iaa - 1 + if(s.gt.sync) then + jpk=j1 + s0a=(s0-ave)/rms + sync=s + dtx=jpk/6000.0 - 1.0 + ipk=ip + f0=ip*df3 - 3000.0 +! rewind 61 +! do i=iaa,ibb +! write(61,3301) i*df3-3000.0,s0(i),s1(i),s2(i),s3(i) +!3301 format(5f12.3) +! enddo +! flush(61) + endif + call timer('sync64_2',1) + enddo + + nskip=50 + call lorentzian(s0a(ia+nskip:ib-nskip),iz-2*nskip,a) + f0a=(a(3)+ia+49)*df3 + w1=df3*a(4) + w2=2*nadd*df3 + width=w1 + if(w1.gt.1.2*w2) width=sqrt(w1**2 - w2**2) + + sq=0. + do i=1,20 + j=ia+nskip+1 + k=ib-nskip-21+i + sq=sq + (s0a(j)-a(1))**2 + (s0a(k)-a(1))**2 + enddo + rms2=sqrt(sq/40.0) + sync2=10.0*log10(a(2)/rms2) + + slimit=6.0 + rewind 17 + write(17,1110) 0.0,0.0 + rewind 17 +! rewind 76 + do i=2,iz-2*nskip-1,3 + x=i + z=(x-a(3))/(0.5*a(4)) + yfit=a(1) + if(abs(z).lt.3.0) then + d=1.0 + z*z + yfit=a(1) + a(2)*(1.0/d - 0.1) + endif + j=i+ia+49 + freq=j*df3-3000.0 + ss=(s0a(j-1)+s0a(j)+s0a(j+1))/3.0 + if(ss.gt.slimit) write(17,1110) freq,ss +1110 format(3f10.3) +! write(76,1110) freq,ss,yfit + enddo + flush(17) +! flush(76) + + return +end subroutine sync64 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/timer.f90 b/map65/libm65/timer.f90 new file mode 100644 index 000000000..c09fae12e --- /dev/null +++ b/map65/libm65/timer.f90 @@ -0,0 +1,111 @@ +subroutine timer(dname,k) + +! Times procedure number n between a call with k=0 (tstart) and with +! k=1 (tstop). Accumulates sums of these times in array ut (user time). +! Also traces all calls (for debugging purposes) if limtrace.gt.0 + + character*8 dname,name(50),space,ename + character*16 sname + logical on(50) + real ut(50),ut0(50),dut(50),tt(2) + integer ncall(50),nlevel(50),nparent(50) + integer onlevel(0:10) + common/tracer/ limtrace,lu + data eps/0.000001/,ntrace/0/ + data level/0/,nmax/0/,space/' '/ + data limtrace/0/,lu/-1/ + save + + if(limtrace.lt.0) go to 999 + if(lu.lt.1) lu=6 + if(k.gt.1) go to 40 !Check for "all done" (k>1) + onlevel(0)=0 + + do n=1,nmax !Check for existing name + if(name(n).eq.dname) go to 20 + enddo + + nmax=nmax+1 !This is a new one + n=nmax + ncall(n)=0 + on(n)=.false. + ut(n)=eps + name(n)=dname + +20 if(k.eq.0) then !Get start times (k=0) + if(on(n)) print*,'Error in timer: ',dname,' already on.' + level=level+1 !Increment the level + on(n)=.true. + ut0(n)=etime(tt) + ncall(n)=ncall(n)+1 + if(ncall(n).gt.1.and.nlevel(n).ne.level) then + nlevel(n)=-1 + else + nlevel(n)=level + endif + nparent(n)=onlevel(level-1) + onlevel(level)=n + + else if(k.eq.1) then !Get stop times and accumulate sums. (k=1) + if(on(n)) then + on(n)=.false. + ut1=etime(tt) + ut(n)=ut(n)+ut1-ut0(n) + endif + level=level-1 + endif + + ntrace=ntrace+1 + if(ntrace.lt.limtrace) write(lu,1020) ntrace,dname,k,level,nparent(n) +1020 format(i8,': ',a8,3i5) + go to 998 + +! Write out the timer statistics + +40 write(lu,1040) +1040 format(/' name time frac dtime', & + ' dfrac calls level parent'/75('-')) + + if(k.gt.100) then + ndiv=k-100 + do i=1,nmax + ncall(i)=ncall(i)/ndiv + ut(i)=ut(i)/ndiv + enddo + endif + + total=ut(1) + sum=0. + sumf=0. + do i=1,nmax + dut(i)=ut(i) + do j=i,nmax + if(nparent(j).eq.i) dut(i)=dut(i)-ut(j) + enddo + utf=ut(i)/total + dutf=dut(i)/total + sum=sum+dut(i) + sumf=sumf+dutf + kk=min(nlevel(i),8) + if(kk.lt.1) sname=name(i)//space + if(kk.ge.1) sname=space(1:kk)//name(i)//space(1:8-kk) + ename=space + if(i.ge.2) ename=name(nparent(i)) + write(lu,1060) float(i),sname,ut(i),utf,dut(i),dutf, & + ncall(i),nlevel(i),ename +1060 format(f4.0,a16,2(f10.2,f6.2),i7,i5,2x,a8) + enddo + + write(lu,1070) sum,sumf +1070 format(75('-')/36x,f10.2,f6.2) + nmax=0 + eps=0.000001 + ntrace=0 + level=0 + space=' ' + onlevel(0)=0 + +998 flush(lu) + +999 return +end subroutine timer 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..1e27ee455 --- /dev/null +++ b/map65/libm65/timf2.f90 @@ -0,0 +1,214 @@ +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(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..bd8361187 --- /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 day4,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/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 +#else +#include +#endif +#include + +#include "mainwindow.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/map65/mainwindow.cpp b/map65/mainwindow.cpp new file mode 100644 index 000000000..4480c9abc --- /dev/null +++ b/map65/mainwindow.cpp @@ -0,0 +1,2226 @@ +//------------------------------------------------------------------ MainWindow +#include "mainwindow.h" +#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 "portaudio.h" + +#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]; + +Astro* g_pAstro = NULL; +WideGraph* g_pWideGraph = NULL; +Messages* g_pMessages = NULL; +BandMap* g_pBandMap = NULL; +TxTune* g_pTxTune = NULL; +QSharedMemory mem_m65("mem_m65"); + +QString rev="$Rev$"; //Must update by hand ???? +QString Program_Title_Version=" MAP65 2.9.0-devel by K1JT"; + +extern const int RxDataFrequency = 96000; +extern const int TxDataFrequency = 11025; + +//-------------------------------------------------- MainWindow constructor +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + 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_Version); + + 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, SIGNAL(error(QProcess::ProcessError)), + this, SLOT(m65_error())); + + connect(&proc_m65, SIGNAL(readyReadStandardError()), + this, SLOT(readFromStderr())); + + connect(&proc_editor, SIGNAL(error(QProcess::ProcessError)), + this, SLOT(editor_error())); + + QTimer *guiTimer = new QTimer(this); + connect(guiTimer, SIGNAL(timeout()), this, SLOT(guiUpdate())); + guiTimer->start(100); //Don't change the 100 ms! + + m_auto=false; + m_waterfallAvg = 1; + m_network = true; + m_txFirst=false; + m_txMute=false; + btxok=false; + m_restart=false; + m_transmitting=false; + m_killAll=false; + m_widebandDecode=false; + m_ntx=1; + m_myCall="K1JT"; + m_myGrid="FN20qi"; + m_appDir = QApplication::applicationDirPath(); + 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_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 + + 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 + "/.lock"); + 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(); + g_pMessages->setColors(m_colors); + g_pBandMap->setColors(m_colors); + g_pAstro->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; + g_pWideGraph->setTol(m_tol); + g_pWideGraph->setFcal(m_fCal); + if(m_fs96000) g_pWideGraph->setFsample(96000); + if(!m_fs96000) g_pWideGraph->setFsample(95238); + g_pWideGraph->m_mult570=m_mult570; + g_pWideGraph->m_mult570Tx=m_mult570Tx; + g_pWideGraph->m_cal570=m_cal570; + g_pWideGraph->m_TxOffset=m_TxOffset; + if(m_initIQplus) g_pWideGraph->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(); + // End of MainWindow constructor +} + + //--------------------------------------------------- MainWindow destructor +MainWindow::~MainWindow() +{ + writeSettings(); + if (soundInThread.isRunning()) { + soundInThread.quit(); + soundInThread.wait(3000); + } + if (soundOutThread.isRunning()) { + soundOutThread.quitExecution=true; + soundOutThread.wait(3000); + } + if(!m_decoderBusy) { + QFile lockFile(m_appDir + "/.lock"); + lockFile.remove(); + } + delete ui; +} + +//-------------------------------------------------------- writeSettings() +void MainWindow::writeSettings() +{ + QString inifile = m_appDir + "/map65.ini"; + QSettings settings(inifile, QSettings::IniFormat); + + settings.beginGroup("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()); + + if(g_pAstro->isVisible()) { + m_astroGeom = g_pAstro->geometry(); + settings.setValue("AstroGeom",m_astroGeom); + } + + if(g_pWideGraph->isVisible()) { + m_wideGraphGeom = g_pWideGraph->geometry(); + settings.setValue("WideGraphGeom",m_wideGraphGeom); + } + if(g_pMessages->isVisible()) { + m_messagesGeom = g_pMessages->geometry(); + settings.setValue("MessagesGeom",m_messagesGeom); + } + if(g_pBandMap->isVisible()) { + m_bandMapGeom = g_pBandMap->geometry(); + settings.setValue("BandMapGeom",m_bandMapGeom); + } + settings.endGroup(); + + settings.beginGroup("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.endGroup(); +} + +//---------------------------------------------------------- readSettings() +void MainWindow::readSettings() +{ + QString inifile = m_appDir + "/map65.ini"; + QSettings settings(inifile, QSettings::IniFormat); + settings.beginGroup("MainWindow"); + restoreGeometry(settings.value("geometry").toByteArray()); + ui->dxCallEntry->setText(settings.value("DXcall","").toString()); + ui->dxGridEntry->setText(settings.value("DXgrid","").toString()); + + m_astroGeom = settings.value("AstroGeom", QRect(71,390,227,403)).toRect(); + + m_wideGraphGeom = settings.value("WideGraphGeom", \ + QRect(45,30,1023,340)).toRect(); + m_messagesGeom = settings.value("MessagesGeom", \ + QRect(800,400,381,400)).toRect(); + m_bandMapGeom = settings.value("BandMapGeom", \ + QRect(280,400,142,400)).toRect(); + m_path = settings.value("MRUdir", m_appDir + "/save").toString(); + m_txFirst = settings.value("TxFirst",false).toBool(); + ui->txFirstCheckBox->setChecked(m_txFirst); + settings.endGroup(); + + settings.beginGroup("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); + 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(); + settings.endGroup(); + + 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=(float)g_pWideGraph->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) t.sprintf(" Rx noise: %5.1f %5.1f %5.1f %% ",px,py,m_pctZap); + if(!m_xpol) t.sprintf(" Rx noise: %5.1f %5.1f %% ",px,m_pctZap); + lab4->setText(t); + xSignalMeter->setValue(px); // Update the signal meters + ySignalMeter->setValue(py); + if(m_monitoring || m_diskData) { + g_pWideGraph->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); + } + + if(nadj == 10) { + if(m_xpol) { + t.sprintf("Amp: %6.4f %6.4f Phase: %6.4f %6.4f", + m_gainx,m_gainy,m_phasex,m_phasey); + } else { + t.sprintf("Amp: %6.4f Phase: %6.4f",m_gainx,m_phasex); + } + 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(g_pAstro->isVisible()) g_pAstro->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; + g_pWideGraph->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; + g_pMessages->setColors(m_colors); + g_pBandMap->setColors(m_colors); + m_cal570=dlg.m_cal570; + m_TxOffset=dlg.m_TxOffset; + m_mult570Tx=dlg.m_mult570Tx; + g_pWideGraph->m_mult570=m_mult570; + g_pWideGraph->m_mult570Tx=m_mult570Tx; + g_pWideGraph->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(g_pWideGraph != NULL) g_pWideGraph->setPalette("Linrad"); +} + +void MainWindow::on_actionCuteSDR_triggered() //CuteSDR palette +{ + if(g_pWideGraph != NULL) g_pWideGraph->setPalette("CuteSDR"); +} + +void MainWindow::on_actionAFMHot_triggered() +{ + if(g_pWideGraph != NULL) g_pWideGraph->setPalette("AFMHot"); +} + +void MainWindow::on_actionBlue_triggered() +{ + if(g_pWideGraph != NULL) g_pWideGraph->setPalette("Blue"); +} + +void MainWindow::on_actionAbout_triggered() //Display "About" +{ + CAboutDlg dlg(this,Program_Title_Version); + 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); + } + 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=g_pWideGraph->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + g_pWideGraph->setDF(n0-n); + } + break; + case Qt::Key_F12: + if(e->modifiers() & Qt::ShiftModifier) { + } else { + int n0=g_pWideGraph->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + g_pWideGraph->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=g_pWideGraph->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + g_pWideGraph->setDF(n0-n); + } + if(n==12) { + int n0=g_pWideGraph->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + g_pWideGraph->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]; + g_pWideGraph->setTol(m_tol); + ui->labTol1->setText(QString::number(ntol[i])); +} + +void MainWindow::on_actionExit_triggered() //Exit() +{ + OnExit(); +} + +void MainWindow::closeEvent(QCloseEvent*) +{ + OnExit(); +} + +void MainWindow::OnExit() +{ + g_pWideGraph->saveSettings(); + m_killAll=true; + mem_m65.detach(); + QFile quitFile(m_appDir + "/.quit"); + quitFile.open(QIODevice::ReadWrite); + QFile lockFile(m_appDir + "/.lock"); + lockFile.remove(); // Allow m65 to terminate + bool b=proc_m65.waitForFinished(1000); + if(!b) proc_m65.kill(); + quitFile.remove(); + qApp->exit(0); // Exit the event loop +} + +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( + "http://www.physics.princeton.edu/pulsar/K1JT/MAP65_Users_Guide.pdf", + QUrl::TolerantMode)); +} + +void MainWindow::on_actionAstro_Data_triggered() //Display Astro +{ + if(g_pAstro==NULL) { + g_pAstro = new Astro(0); + g_pAstro->setWindowTitle("Astronomical Data"); + Qt::WindowFlags flags = Qt::Dialog | Qt::WindowCloseButtonHint | + Qt::WindowMinimizeButtonHint; + g_pAstro->setWindowFlags(flags); + g_pAstro->setGeometry(m_astroGeom); + } + g_pAstro->show(); +} + +void MainWindow::on_actionWide_Waterfall_triggered() //Display Waterfalls +{ + if(g_pWideGraph==NULL) { + g_pWideGraph = new WideGraph(0); + g_pWideGraph->setWindowTitle("Wide Graph"); + g_pWideGraph->setGeometry(m_wideGraphGeom); + Qt::WindowFlags flags = Qt::WindowCloseButtonHint | + Qt::WindowMinimizeButtonHint; + g_pWideGraph->setWindowFlags(flags); + connect(g_pWideGraph, SIGNAL(freezeDecode2(int)),this, + SLOT(freezeDecode(int))); + connect(g_pWideGraph, SIGNAL(f11f12(int)),this, + SLOT(bumpDF(int))); + } + g_pWideGraph->show(); +} + +void MainWindow::on_actionBand_Map_triggered() //Display BandMap +{ + if(g_pBandMap==NULL) { + g_pBandMap = new BandMap(0); + g_pBandMap->setWindowTitle("Band Map"); + Qt::WindowFlags flags = Qt::Dialog | Qt::WindowCloseButtonHint | + Qt::WindowMinimizeButtonHint; + g_pBandMap->setWindowFlags(flags); + g_pBandMap->setGeometry(m_bandMapGeom); + } + g_pBandMap->show(); +} + +void MainWindow::on_actionMessages_triggered() //Display Messages +{ + if(g_pMessages==NULL) { + g_pMessages = new Messages(0); + g_pMessages->setWindowTitle("Messages"); + Qt::WindowFlags flags = Qt::Dialog | Qt::WindowCloseButtonHint | + Qt::WindowMinimizeButtonHint; + g_pMessages->setWindowFlags(flags); + g_pMessages->setGeometry(m_messagesGeom); + connect(g_pMessages, SIGNAL(click2OnCallsign(QString, QString)),this, + SLOT(doubleClickOnMessages(QString, QString))); + } + g_pMessages->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(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<284; 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() +{ + g_pBandMap->setText(""); + g_pMessages->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=g_pWideGraph->DF(); + datcom_.mousefqso=g_pWideGraph->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(g_pWideGraph->fSpan()); + if(ispan%2 == 1) ispan++; + int ifc=int(1000.0*(datcom_.fcenter - int(datcom_.fcenter))+0.5); + int nfa=g_pWideGraph->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; + + 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); + + strncpy(datcom_.mycall, mcall.toLatin1(), 12); + strncpy(datcom_.mygrid, mgrid.toLatin1(), 6); + strncpy(datcom_.hiscall, hcall.toLatin1(), 12); + strncpy(datcom_.hisgrid, hgrid.toLatin1(), 6); + strncpy(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); +} + +void MainWindow::m65_error() //m65_error +{ + if(!m_killAll) { + msgBox("Error starting or running\n" + m_appDir + "/m65 -s"); + exit(1); + } +} + +void MainWindow::editor_error() //editor_error +{ + if(!m_killAll) { + msgBox("Error starting or running\n" + m_appDir + "/" + m_editorCommand); + } +} + +void MainWindow::readFromStderr() //readFromStderr +{ + QByteArray t=proc_m65.readAllStandardError(); + msgBox(t); +} + +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(); + QString t2; + t2.sprintf("Avg: %d",m_nsum); + lab7->setText(t2); + if(m_modeQ65>0) g_pWideGraph->setDecodeFinished(); + } + if(t.indexOf("") >= 0) { + if(m_widebandDecode) { + g_pMessages->setText(m_messagesText,m_bandmapText); + g_pBandMap->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(); + if(n>=30) ui->decodedTextBrowser->append(t.mid(1,n-3)); + if(n<30) ui->decodedTextBrowser->append(t.mid(1,n-3)); + 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; + } + } + } +} + +void MainWindow::on_EraseButton_clicked() //Erase +{ + ui->decodedTextBrowser->clear(); +} + +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=84.0*6912.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) g_pWideGraph->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 ichk=0; + int ntxFreq=1000; + int itype=0; + 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,&ichk,&ntxFreq,&m_modeQ65,&itype,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) << endl; + 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; + g_pWideGraph->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) << endl; + 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) g_pWideGraph->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; + g_pWideGraph->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(g_pWideGraph->QSOfreq())); + lab3->setText("QSO DF: " + QString::number(g_pWideGraph->DF())); + + g_pWideGraph->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(g_pWideGraph->m_dForceCenterFreq); + soundInThread.setForceCenterFreqBool(g_pWideGraph->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=g_pWideGraph->QSOfreq(); + g_pAstro->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((int)ba[i] == 0) eom=true; + if(eom) { + message[i]=32; + } 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 rpt=""; + if(ctrl or m_modeTx=="Q65") rpt=t2.mid(25,3); + lookup(); + 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) +{ + 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); + lookup(); + genStdMsgs(""); + 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" << endl; + 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=g_pWideGraph->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 logEntry=t.date().toString("yyyy-MMM-dd,") + + t.time().toString("hh:mm,") + m_hisCall + "," + m_hisGrid + "," + + QString::number(nMHz) + "," + m_mode + "\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; + 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); + g_pWideGraph->setMode65(m_mode65); + g_pWideGraph->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); + g_pWideGraph->setMode65(m_mode65); + g_pWideGraph->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); + g_pWideGraph->setMode65(m_mode65); + g_pWideGraph->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")); +} + +void MainWindow::on_actionEdit_wsjt_log_triggered() +{ + QString cmnd=m_editorCommand + " " + m_appDir + "/wsjt.log"; + proc_editor.start(QDir::toNativeSeparators(cmnd)); +} + +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(); +} diff --git a/map65/mainwindow.h b/map65/mainwindow.h new file mode 100644 index 000000000..90a38811f --- /dev/null +++ b/map65/mainwindow.h @@ -0,0 +1,309 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H +#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 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 readFromStderr(); + void m65_error(); + void editor_error(); + void guiUpdate(); + void doubleClickOnCall(QString hiscall, bool ctrl); + void doubleClickOnMessages(QString hiscall, QString t2); + +protected: + virtual void keyPressEvent( QKeyEvent *e ); + void closeEvent(QCloseEvent*); + virtual bool eventFilter(QObject *object, QEvent *event); + +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 OnExit(); + 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_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; + 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_killAll; + 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_astroGeom; + QRect m_wideGraphGeom; + QRect m_messagesGeom; + QRect m_bandMapGeom; + + 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_appDir; + 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(); +}; + +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* ichk, int* ntxFreq, int* mode64, + int* itype, 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..3d171db90 --- /dev/null +++ b/map65/mainwindow.ui @@ -0,0 +1,1700 @@ + + + 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 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 + + + + + + + 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 + + + + 0 + + + 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 + + + + + + + DisplayText + QTextBrowser +
displaytext.h
+
+
+ + + + monitorButton + toggled(bool) + MainWindow + update() + + + 264 + 275 + + + 126 + 515 + + + + + + + + true + + + +
diff --git a/map65/map65.pro b/map65/map65.pro new file mode 100644 index 000000000..6bf3e8a96 --- /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_install + +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..86a221812 --- /dev/null +++ b/map65/messages.cpp @@ -0,0 +1,97 @@ +#include "messages.h" +#include "ui_messages.h" +#include "mainwindow.h" + +Messages::Messages(QWidget *parent) : + QDialog(parent), + ui(new Ui::Messages) +{ + ui->setupUi(this); + ui->messagesTextBrowser->setStyleSheet( \ + "QTextBrowser { background-color : #000066; color : red; }"); + ui->messagesTextBrowser->clear(); + m_cqOnly=false; + m_cqStarOnly=false; + connect(ui->messagesTextBrowser,SIGNAL(selectCallsign(bool)),this, + SLOT(selectCallsign2(bool))); +} + +Messages::~Messages() +{ + 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", QString::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(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 = t1.mid(i1,i-i1); //selected line + emit click2OnCallsign(hiscall,t2); + } + } +} + +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..de9073904 --- /dev/null +++ b/map65/messages.h @@ -0,0 +1,43 @@ +#ifndef MESSAGES_H +#define MESSAGES_H + +#include + +namespace Ui { + class Messages; +} + +class Messages : public QDialog +{ + Q_OBJECT + +public: + explicit Messages(QWidget *parent = 0); + void setText(QString t, QString t2); + void setColors(QString t); + + ~Messages(); + +signals: + void click2OnCallsign(QString hiscall, QString t2); + +private slots: + void selectCallsign2(bool ctrl); + void on_cbCQ_toggled(bool checked); + void on_cbCQstar_toggled(bool checked); + +private: + Ui::Messages *ui; + 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 // MESSAGES_H 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..b48aa65d0 --- /dev/null +++ b/map65/meterwidget.cpp @@ -0,0 +1,51 @@ +// 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; + + p.begin(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..7cf305134 --- /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[50]; + 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..ac6bc9ffc --- /dev/null +++ b/map65/pa_get_device_info.c @@ -0,0 +1,172 @@ +#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/palir-02.dll b/map65/palir-02.dll new file mode 100644 index 000000000..925939d3d Binary files /dev/null and b/map65/palir-02.dll differ diff --git a/map65/plotter.cpp b/map65/plotter.cpp new file mode 100644 index 000000000..9846cfacf --- /dev/null +++ b/map65/plotter.cpp @@ -0,0 +1,776 @@ +#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); + + 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; + } + sprintf(m_sutc,"%2.2d:%2.2d",ihr,imin); +} + +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); + painter0.initFrom(this); + + //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} + } +} + +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..7169236c9 --- /dev/null +++ b/map65/plotter.h @@ -0,0 +1,137 @@ +/////////////////////////////////////////////////////////////////////////// +// 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 "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); + +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; + char m_sutc[5]; + 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/portaudio.h b/map65/portaudio.h new file mode 100755 index 000000000..250fba021 --- /dev/null +++ b/map65/portaudio.h @@ -0,0 +1,1123 @@ + +#ifndef PORTAUDIO_H +#define PORTAUDIO_H +/* + * $Id: portaudio.h,v 1.1 2005/11/29 21:27:24 joe Exp $ + * PortAudio Portable Real-Time Audio Library + * PortAudio API Header File + * Latest version available at: http://www.portaudio.com/ + * + * Copyright (c) 1999-2002 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** @file + @brief The PortAudio API. +*/ + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +/** Retrieve the release number of the currently running PortAudio build, + eg 1900. +*/ +int Pa_GetVersion( void ); + + +/** Retrieve a textual description of the current PortAudio build, + eg "PortAudio V19-devel 13 October 2002". +*/ +const char* Pa_GetVersionText( void ); + + +/** Error codes returned by PortAudio functions. + Note that with the exception of paNoError, all PaErrorCodes are negative. +*/ + +typedef int PaError; +typedef enum PaErrorCode +{ + paNoError = 0, + + paNotInitialized = -10000, + paUnanticipatedHostError, + paInvalidChannelCount, + paInvalidSampleRate, + paInvalidDevice, + paInvalidFlag, + paSampleFormatNotSupported, + paBadIODeviceCombination, + paInsufficientMemory, + paBufferTooBig, + paBufferTooSmall, + paNullCallback, + paBadStreamPtr, + paTimedOut, + paInternalError, + paDeviceUnavailable, + paIncompatibleHostApiSpecificStreamInfo, + paStreamIsStopped, + paStreamIsNotStopped, + paInputOverflowed, + paOutputUnderflowed, + paHostApiNotFound, + paInvalidHostApi, + paCanNotReadFromACallbackStream, /**< @todo review error code name */ + paCanNotWriteToACallbackStream, /**< @todo review error code name */ + paCanNotReadFromAnOutputOnlyStream, /**< @todo review error code name */ + paCanNotWriteToAnInputOnlyStream, /**< @todo review error code name */ + paIncompatibleStreamHostApi +} PaErrorCode; + + +/** Translate the supplied PortAudio error code into a human readable + message. +*/ +const char *Pa_GetErrorText( PaError errorCode ); + + +/** Library initialization function - call this before using PortAudio. + This function initialises internal data structures and prepares underlying + host APIs for use. This function MUST be called before using any other + PortAudio API functions. + + If Pa_Initialize() is called multiple times, each successful + call must be matched with a corresponding call to Pa_Terminate(). + Pairs of calls to Pa_Initialize()/Pa_Terminate() may overlap, and are not + required to be fully nested. + + Note that if Pa_Initialize() returns an error code, Pa_Terminate() should + NOT be called. + + @return paNoError if successful, otherwise an error code indicating the cause + of failure. + + @see Pa_Terminate +*/ +PaError Pa_Initialize( void ); + + +/** Library termination function - call this when finished using PortAudio. + This function deallocates all resources allocated by PortAudio since it was + initializied by a call to Pa_Initialize(). In cases where Pa_Initialise() has + been called multiple times, each call must be matched with a corresponding call + to Pa_Terminate(). The final matching call to Pa_Terminate() will automatically + close any PortAudio streams that are still open. + + Pa_Terminate() MUST be called before exiting a program which uses PortAudio. + Failure to do so may result in serious resource leaks, such as audio devices + not being available until the next reboot. + + @return paNoError if successful, otherwise an error code indicating the cause + of failure. + + @see Pa_Initialize +*/ +PaError Pa_Terminate( void ); + + + +/** The type used to refer to audio devices. Values of this type usually + range from 0 to (Pa_DeviceCount-1), and may also take on the PaNoDevice + and paUseHostApiSpecificDeviceSpecification values. + + @see Pa_DeviceCount, paNoDevice, paUseHostApiSpecificDeviceSpecification +*/ +typedef int PaDeviceIndex; + + +/** A special PaDeviceIndex value indicating that no device is available, + or should be used. + + @see PaDeviceIndex +*/ +#define paNoDevice ((PaDeviceIndex)-1) + + +/** A special PaDeviceIndex value indicating that the device(s) to be used + are specified in the host api specific stream info structure. + + @see PaDeviceIndex +*/ +#define paUseHostApiSpecificDeviceSpecification ((PaDeviceIndex)-2) + + +/* Host API enumeration mechanism */ + +/** The type used to enumerate to host APIs at runtime. Values of this type + range from 0 to (Pa_GetHostApiCount()-1). + + @see Pa_GetHostApiCount +*/ +typedef int PaHostApiIndex; + + +/** Retrieve the number of available host APIs. Even if a host API is + available it may have no devices available. + + @return A non-negative value indicating the number of available host APIs + or, a PaErrorCode (which are always negative) if PortAudio is not initialized + or an error is encountered. + + @see PaHostApiIndex +*/ +PaHostApiIndex Pa_GetHostApiCount( void ); + + +/** Retrieve the index of the default host API. The default host API will be + the lowest common denominator host API on the current platform and is + unlikely to provide the best performance. + + @return A non-negative value ranging from 0 to (Pa_GetHostApiCount()-1) + indicating the default host API index or, a PaErrorCode (which are always + negative) if PortAudio is not initialized or an error is encountered. +*/ +PaHostApiIndex Pa_GetDefaultHostApi( void ); + + +/** Unchanging unique identifiers for each supported host API. This type + is used in the PaHostApiInfo structure. The values are guaranteed to be + unique and to never change, thus allowing code to be written that + conditionally uses host API specific extensions. + + New type ids will be allocated when support for a host API reaches + "public alpha" status, prior to that developers should use the + paInDevelopment type id. + + @see PaHostApiInfo +*/ +typedef enum PaHostApiTypeId +{ + paInDevelopment=0, /* use while developing support for a new host API */ + paDirectSound=1, + paMME=2, + paASIO=3, + paSoundManager=4, + paCoreAudio=5, + paOSS=7, + paALSA=8, + paAL=9, + paBeOS=10, + paWDMKS=11, + paJACK=12 +} PaHostApiTypeId; + + +/** A structure containing information about a particular host API. */ + +typedef struct PaHostApiInfo +{ + /** this is struct version 1 */ + int structVersion; + /** The well known unique identifier of this host API @see PaHostApiTypeId */ + PaHostApiTypeId type; + /** A textual description of the host API for display on user interfaces. */ + const char *name; + + /** The number of devices belonging to this host API. This field may be + used in conjunction with Pa_HostApiDeviceIndexToDeviceIndex() to enumerate + all devices for this host API. + @see Pa_HostApiDeviceIndexToDeviceIndex + */ + int deviceCount; + + /** The the default input device for this host API. The value will be a + device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice + if no default input device is available. + */ + PaDeviceIndex defaultInputDevice; + + /** The the default output device for this host API. The value will be a + device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice + if no default output device is available. + */ + PaDeviceIndex defaultOutputDevice; + +} PaHostApiInfo; + + +/** Retrieve a pointer to a structure containing information about a specific + host Api. + + @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1) + + @return A pointer to an immutable PaHostApiInfo structure describing + a specific host API. If the hostApi parameter is out of range or an error + is encountered, the function returns NULL. + + The returned structure is owned by the PortAudio implementation and must not + be manipulated or freed. The pointer is only guaranteed to be valid between + calls to Pa_Initialize() and Pa_Terminate(). +*/ +const PaHostApiInfo * Pa_GetHostApiInfo( PaHostApiIndex hostApi ); + + +/** Convert a static host API unique identifier, into a runtime + host API index. + + @param type A unique host API identifier belonging to the PaHostApiTypeId + enumeration. + + @return A valid PaHostApiIndex ranging from 0 to (Pa_GetHostApiCount()-1) or, + a PaErrorCode (which are always negative) if PortAudio is not initialized + or an error is encountered. + + The paHostApiNotFound error code indicates that the host API specified by the + type parameter is not available. + + @see PaHostApiTypeId +*/ +PaHostApiIndex Pa_HostApiTypeIdToHostApiIndex( PaHostApiTypeId type ); + + +/** Convert a host-API-specific device index to standard PortAudio device index. + This function may be used in conjunction with the deviceCount field of + PaHostApiInfo to enumerate all devices for the specified host API. + + @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1) + + @param hostApiDeviceIndex A valid per-host device index in the range + 0 to (Pa_GetHostApiInfo(hostApi)->deviceCount-1) + + @return A non-negative PaDeviceIndex ranging from 0 to (Pa_GetDeviceCount()-1) + or, a PaErrorCode (which are always negative) if PortAudio is not initialized + or an error is encountered. + + A paInvalidHostApi error code indicates that the host API index specified by + the hostApi parameter is out of range. + + A paInvalidDevice error code indicates that the hostApiDeviceIndex parameter + is out of range. + + @see PaHostApiInfo +*/ +PaDeviceIndex Pa_HostApiDeviceIndexToDeviceIndex( PaHostApiIndex hostApi, + int hostApiDeviceIndex ); + + + +/** Structure used to return information about a host error condition. +*/ +typedef struct PaHostErrorInfo{ + PaHostApiTypeId hostApiType; /**< the host API which returned the error code */ + long errorCode; /**< the error code returned */ + const char *errorText; /**< a textual description of the error if available, otherwise a zero-length string */ +}PaHostErrorInfo; + + +/** Return information about the last host error encountered. The error + information returned by Pa_GetLastHostErrorInfo() will never be modified + asyncronously by errors occurring in other PortAudio owned threads + (such as the thread that manages the stream callback.) + + This function is provided as a last resort, primarily to enhance debugging + by providing clients with access to all available error information. + + @return A pointer to an immutable structure constaining information about + the host error. The values in this structure will only be valid if a + PortAudio function has previously returned the paUnanticipatedHostError + error code. +*/ +const PaHostErrorInfo* Pa_GetLastHostErrorInfo( void ); + + + +/* Device enumeration and capabilities */ + +/** Retrieve the number of available devices. The number of available devices + may be zero. + + @return A non-negative value indicating the number of available devices or, + a PaErrorCode (which are always negative) if PortAudio is not initialized + or an error is encountered. +*/ +PaDeviceIndex Pa_GetDeviceCount( void ); + + +/** Retrieve the index of the default input device. The result can be + used in the inputDevice parameter to Pa_OpenStream(). + + @return The default input device index for the default host API, or paNoDevice + if no default input device is available or an error was encountered. +*/ +PaDeviceIndex Pa_GetDefaultInputDevice( void ); + + +/** Retrieve the index of the default output device. The result can be + used in the outputDevice parameter to Pa_OpenStream(). + + @return The default output device index for the defualt host API, or paNoDevice + if no default output device is available or an error was encountered. + + @note + On the PC, the user can specify a default device by + setting an environment variable. For example, to use device #1. +
+ set PA_RECOMMENDED_OUTPUT_DEVICE=1
+
+ The user should first determine the available device ids by using + the supplied application "pa_devs". +*/ +PaDeviceIndex Pa_GetDefaultOutputDevice( void ); + + +/** The type used to represent monotonic time in seconds that can be used + for syncronisation. The type is used for the outTime argument to the + PaStreamCallback and as the result of Pa_GetStreamTime(). + + @see PaStreamCallback, Pa_GetStreamTime +*/ +typedef double PaTime; + + +/** A type used to specify one or more sample formats. Each value indicates + a possible format for sound data passed to and from the stream callback, + Pa_ReadStream and Pa_WriteStream. + + The standard formats paFloat32, paInt16, paInt32, paInt24, paInt8 + and aUInt8 are usually implemented by all implementations. + + The floating point representation (paFloat32) uses +1.0 and -1.0 as the + maximum and minimum respectively. + + paUInt8 is an unsigned 8 bit format where 128 is considered "ground" + + The paNonInterleaved flag indicates that a multichannel buffer is passed + as a set of non-interleaved pointers. + + @see Pa_OpenStream, Pa_OpenDefaultStream, PaDeviceInfo + @see paFloat32, paInt16, paInt32, paInt24, paInt8 + @see paUInt8, paCustomFormat, paNonInterleaved +*/ +typedef unsigned long PaSampleFormat; + + +#define paFloat32 ((PaSampleFormat) 0x00000001) /**< @see PaSampleFormat */ +#define paInt32 ((PaSampleFormat) 0x00000002) /**< @see PaSampleFormat */ +#define paInt24 ((PaSampleFormat) 0x00000004) /**< Packed 24 bit format. @see PaSampleFormat */ +#define paInt16 ((PaSampleFormat) 0x00000008) /**< @see PaSampleFormat */ +#define paInt8 ((PaSampleFormat) 0x00000010) /**< @see PaSampleFormat */ +#define paUInt8 ((PaSampleFormat) 0x00000020) /**< @see PaSampleFormat */ +#define paCustomFormat ((PaSampleFormat) 0x00010000)/**< @see PaSampleFormat */ + +#define paNonInterleaved ((PaSampleFormat) 0x80000000) + +/** A structure providing information and capabilities of PortAudio devices. + Devices may support input, output or both input and output. +*/ +typedef struct PaDeviceInfo +{ + int structVersion; /* this is struct version 2 */ + const char *name; + PaHostApiIndex hostApi; /* note this is a host API index, not a type id*/ + + int maxInputChannels; + int maxOutputChannels; + + /* Default latency values for interactive performance. */ + PaTime defaultLowInputLatency; + PaTime defaultLowOutputLatency; + /* Default latency values for robust non-interactive applications (eg. playing sound files). */ + PaTime defaultHighInputLatency; + PaTime defaultHighOutputLatency; + + double defaultSampleRate; +} PaDeviceInfo; + + +/** Retrieve a pointer to a PaDeviceInfo structure containing information + about the specified device. + @return A pointer to an immutable PaDeviceInfo structure. If the device + parameter is out of range the function returns NULL. + + @param device A valid device index in the range 0 to (Pa_GetDeviceCount()-1) + + @note PortAudio manages the memory referenced by the returned pointer, + the client must not manipulate or free the memory. The pointer is only + guaranteed to be valid between calls to Pa_Initialize() and Pa_Terminate(). + + @see PaDeviceInfo, PaDeviceIndex +*/ +const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceIndex device ); + + +/** Parameters for one direction (input or output) of a stream. +*/ +typedef struct PaStreamParameters +{ + /** A valid device index in the range 0 to (Pa_GetDeviceCount()-1) + specifying the device to be used or the special constant + paUseHostApiSpecificDeviceSpecification which indicates that the actual + device(s) to use are specified in hostApiSpecificStreamInfo. + This field must not be set to paNoDevice. + */ + PaDeviceIndex device; + + /** The number of channels of sound to be delivered to the + stream callback or accessed by Pa_ReadStream() or Pa_WriteStream(). + It can range from 1 to the value of maxInputChannels in the + PaDeviceInfo record for the device specified by the device parameter. + */ + int channelCount; + + /** The sample format of the buffer provided to the stream callback, + a_ReadStream() or Pa_WriteStream(). It may be any of the formats described + by the PaSampleFormat enumeration. + */ + PaSampleFormat sampleFormat; + + /** The desired latency in seconds. Where practical, implementations should + configure their latency based on these parameters, otherwise they may + choose the closest viable latency instead. Unless the suggested latency + is greater than the absolute upper limit for the device implementations + shouldround the suggestedLatency up to the next practial value - ie to + provide an equal or higher latency than suggestedLatency whereever possibe. + Actual latency values for an open stream may be retrieved using the + inputLatency and outputLatency fields of the PaStreamInfo structure + returned by Pa_GetStreamInfo(). + @see default*Latency in PaDeviceInfo, *Latency in PaStreamInfo + */ + PaTime suggestedLatency; + + /** An optional pointer to a host api specific data structure + containing additional information for device setup and/or stream processing. + hostApiSpecificStreamInfo is never required for correct operation, + if not used it should be set to NULL. + */ + void *hostApiSpecificStreamInfo; + +} PaStreamParameters; + + +/** Return code for Pa_IsFormatSupported indicating success. */ +#define paFormatIsSupported (0) + +/** Determine whether it would be possible to open a stream with the specified + parameters. + + @param inputParameters A structure that describes the input parameters used to + open a stream. The suggestedLatency field is ignored. See PaStreamParameters + for a description of these parameters. inputParameters must be NULL for + output-only streams. + + @param outputParameters A structure that describes the output parameters used + to open a stream. The suggestedLatency field is ignored. See PaStreamParameters + for a description of these parameters. outputParameters must be NULL for + input-only streams. + + @param sampleRate The required sampleRate. For full-duplex streams it is the + sample rate for both input and output + + @return Returns 0 if the format is supported, and an error code indicating why + the format is not supported otherwise. The constant paFormatIsSupported is + provided to compare with the return value for success. + + @see paFormatIsSupported, PaStreamParameters +*/ +PaError Pa_IsFormatSupported( const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); + + + +/* Streaming types and functions */ + + +/** + A single PaStream can provide multiple channels of real-time + streaming audio input and output to a client application. A stream + provides access to audio hardware represented by one or more + PaDevices. Depending on the underlying Host API, it may be possible + to open multiple streams using the same device, however this behavior + is implementation defined. Portable applications should assume that + a PaDevice may be simultaneously used by at most one PaStream. + + Pointers to PaStream objects are passed between PortAudio functions that + operate on streams. + + @see Pa_OpenStream, Pa_OpenDefaultStream, Pa_OpenDefaultStream, Pa_CloseStream, + Pa_StartStream, Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive, + Pa_GetStreamTime, Pa_GetStreamCpuLoad + +*/ +typedef void PaStream; + + +/** Can be passed as the framesPerBuffer parameter to Pa_OpenStream() + or Pa_OpenDefaultStream() to indicate that the stream callback will + accept buffers of any size. +*/ +#define paFramesPerBufferUnspecified (0) + + +/** Flags used to control the behavior of a stream. They are passed as + parameters to Pa_OpenStream or Pa_OpenDefaultStream. Multiple flags may be + ORed together. + + @see Pa_OpenStream, Pa_OpenDefaultStream + @see paNoFlag, paClipOff, paDitherOff, paNeverDropInput, + paPrimeOutputBuffersUsingStreamCallback, paPlatformSpecificFlags +*/ +typedef unsigned long PaStreamFlags; + +/** @see PaStreamFlags */ +#define paNoFlag ((PaStreamFlags) 0) + +/** Disable default clipping of out of range samples. + @see PaStreamFlags +*/ +#define paClipOff ((PaStreamFlags) 0x00000001) + +/** Disable default dithering. + @see PaStreamFlags +*/ +#define paDitherOff ((PaStreamFlags) 0x00000002) + +/** Flag requests that where possible a full duplex stream will not discard + overflowed input samples without calling the stream callback. This flag is + only valid for full duplex callback streams and only when used in combination + with the paFramesPerBufferUnspecified (0) framesPerBuffer parameter. Using + this flag incorrectly results in a paInvalidFlag error being returned from + Pa_OpenStream and Pa_OpenDefaultStream. + + @see PaStreamFlags, paFramesPerBufferUnspecified +*/ +#define paNeverDropInput ((PaStreamFlags) 0x00000004) + +/** Call the stream callback to fill initial output buffers, rather than the + default behavior of priming the buffers with zeros (silence). This flag has + no effect for input-only and blocking read/write streams. + + @see PaStreamFlags +*/ +#define paPrimeOutputBuffersUsingStreamCallback ((PaStreamFlags) 0x00000008) + +/** A mask specifying the platform specific bits. + @see PaStreamFlags +*/ +#define paPlatformSpecificFlags ((PaStreamFlags)0xFFFF0000) + +/** + Timing information for the buffers passed to the stream callback. +*/ +typedef struct PaStreamCallbackTimeInfo{ + PaTime inputBufferAdcTime; + PaTime currentTime; + PaTime outputBufferDacTime; +} PaStreamCallbackTimeInfo; + + +/** + Flag bit constants for the statusFlags to PaStreamCallback. + + @see paInputUnderflow, paInputOverflow, paOutputUnderflow, paOutputOverflow, + paPrimingOutput +*/ +typedef unsigned long PaStreamCallbackFlags; + +/** In a stream opened with paFramesPerBufferUnspecified, indicates that + input data is all silence (zeros) because no real data is available. In a + stream opened without paFramesPerBufferUnspecified, it indicates that one or + more zero samples have been inserted into the input buffer to compensate + for an input underflow. + @see PaStreamCallbackFlags +*/ +#define paInputUnderflow ((PaStreamCallbackFlags) 0x00000001) + +/** In a stream opened with paFramesPerBufferUnspecified, indicates that data + prior to the first sample of the input buffer was discarded due to an + overflow, possibly because the stream callback is using too much CPU time. + Otherwise indicates that data prior to one or more samples in the + input buffer was discarded. + @see PaStreamCallbackFlags +*/ +#define paInputOverflow ((PaStreamCallbackFlags) 0x00000002) + +/** Indicates that output data (or a gap) was inserted, possibly because the + stream callback is using too much CPU time. + @see PaStreamCallbackFlags +*/ +#define paOutputUnderflow ((PaStreamCallbackFlags) 0x00000004) + +/** Indicates that output data will be discarded because no room is available. + @see PaStreamCallbackFlags +*/ +#define paOutputOverflow ((PaStreamCallbackFlags) 0x00000008) + +/** Some of all of the output data will be used to prime the stream, input + data may be zero. + @see PaStreamCallbackFlags +*/ +#define paPrimingOutput ((PaStreamCallbackFlags) 0x00000010) + +/** + Allowable return values for the PaStreamCallback. + @see PaStreamCallback +*/ +typedef enum PaStreamCallbackResult +{ + paContinue=0, + paComplete=1, + paAbort=2 +} PaStreamCallbackResult; + + +/** + Functions of type PaStreamCallback are implemented by PortAudio clients. + They consume, process or generate audio in response to requests from an + active PortAudio stream. + + @param input and @param output are arrays of interleaved samples, + the format, packing and number of channels used by the buffers are + determined by parameters to Pa_OpenStream(). + + @param frameCount The number of sample frames to be processed by + the stream callback. + + @param timeInfo The time in seconds when the first sample of the input + buffer was received at the audio input, the time in seconds when the first + sample of the output buffer will begin being played at the audio output, and + the time in seconds when the stream callback was called. + See also Pa_GetStreamTime() + + @param statusFlags Flags indicating whether input and/or output buffers + have been inserted or will be dropped to overcome underflow or overflow + conditions. + + @param userData The value of a user supplied pointer passed to + Pa_OpenStream() intended for storing synthesis data etc. + + @return + The stream callback should return one of the values in the + PaStreamCallbackResult enumeration. To ensure that the callback continues + to be called, it should return paContinue (0). Either paComplete or paAbort + can be returned to finish stream processing, after either of these values is + returned the callback will not be called again. If paAbort is returned the + stream will finish as soon as possible. If paComplete is returned, the stream + will continue until all buffers generated by the callback have been played. + This may be useful in applications such as soundfile players where a specific + duration of output is required. However, it is not necessary to utilise this + mechanism as Pa_StopStream(), Pa_AbortStream() or Pa_CloseStream() can also + be used to stop the stream. The callback must always fill the entire output + buffer irrespective of its return value. + + @see Pa_OpenStream, Pa_OpenDefaultStream + + @note With the exception of Pa_GetStreamCpuLoad() it is not permissable to call + PortAudio API functions from within the stream callback. +*/ +typedef int PaStreamCallback( + const void *input, void *output, + unsigned long frameCount, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ); + + +/** Opens a stream for either input, output or both. + + @param stream The address of a PaStream pointer which will receive + a pointer to the newly opened stream. + + @param inputParameters A structure that describes the input parameters used by + the opened stream. See PaStreamParameters for a description of these parameters. + inputParameters must be NULL for output-only streams. + + @param outputParameters A structure that describes the output parameters used by + the opened stream. See PaStreamParameters for a description of these parameters. + outputParameters must be NULL for input-only streams. + + @param sampleRate The desired sampleRate. For full-duplex streams it is the + sample rate for both input and output + + @param framesPerBuffer The number of frames passed to the stream callback + function, or the preferred block granularity for a blocking read/write stream. + The special value paFramesPerBufferUnspecified (0) may be used to request that + the stream callback will recieve an optimal (and possibly varying) number of + frames based on host requirements and the requested latency settings. + Note: With some host APIs, the use of non-zero framesPerBuffer for a callback + stream may introduce an additional layer of buffering which could introduce + additional latency. PortAudio guarantees that the additional latency + will be kept to the theoretical minimum however, it is strongly recommended + that a non-zero framesPerBuffer value only be used when your algorithm + requires a fixed number of frames per stream callback. + + @param streamFlags Flags which modify the behaviour of the streaming process. + This parameter may contain a combination of flags ORed together. Some flags may + only be relevant to certain buffer formats. + + @param streamCallback A pointer to a client supplied function that is responsible + for processing and filling input and output buffers. If this parameter is NULL + the stream will be opened in 'blocking read/write' mode. In blocking mode, + the client can receive sample data using Pa_ReadStream and write sample data + using Pa_WriteStream, the number of samples that may be read or written + without blocking is returned by Pa_GetStreamReadAvailable and + Pa_GetStreamWriteAvailable respectively. + + @param userData A client supplied pointer which is passed to the stream callback + function. It could for example, contain a pointer to instance data necessary + for processing the audio buffers. This parameter is ignored if streamCallback + is NULL. + + @return + Upon success Pa_OpenStream() returns paNoError and places a pointer to a + valid PaStream in the stream argument. The stream is inactive (stopped). + If a call to Pa_OpenStream() fails, a non-zero error code is returned (see + PaError for possible error codes) and the value of stream is invalid. + + @see PaStreamParameters, PaStreamCallback, Pa_ReadStream, Pa_WriteStream, + Pa_GetStreamReadAvailable, Pa_GetStreamWriteAvailable +*/ +PaError Pa_OpenStream( PaStream** stream, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); + + +/** A simplified version of Pa_OpenStream() that opens the default input + and/or output devices. + + @param stream The address of a PaStream pointer which will receive + a pointer to the newly opened stream. + + @param numInputChannels The number of channels of sound that will be supplied + to the stream callback or returned by Pa_ReadStream. It can range from 1 to + the value of maxInputChannels in the PaDeviceInfo record for the default input + device. If 0 the stream is opened as an output-only stream. + + @param numOutputChannels The number of channels of sound to be delivered to the + stream callback or passed to Pa_WriteStream. It can range from 1 to the value + of maxOutputChannels in the PaDeviceInfo record for the default output dvice. + If 0 the stream is opened as an output-only stream. + + @param sampleFormat The sample format of both the input and output buffers + provided to the callback or passed to and from Pa_ReadStream and Pa_WriteStream. + sampleFormat may be any of the formats described by the PaSampleFormat + enumeration. + + @param sampleRate Same as Pa_OpenStream parameter of the same name. + @param framesPerBuffer Same as Pa_OpenStream parameter of the same name. + @param streamCallback Same as Pa_OpenStream parameter of the same name. + @param userData Same as Pa_OpenStream parameter of the same name. + + @return As for Pa_OpenStream + + @see Pa_OpenStream, PaStreamCallback +*/ +PaError Pa_OpenDefaultStream( PaStream** stream, + int numInputChannels, + int numOutputChannels, + PaSampleFormat sampleFormat, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamCallback *streamCallback, + void *userData ); + + +/** Closes an audio stream. If the audio stream is active it + discards any pending buffers as if Pa_AbortStream() had been called. +*/ +PaError Pa_CloseStream( PaStream *stream ); + + +/** Functions of type PaStreamFinishedCallback are implemented by PortAudio + clients. They can be registered with a stream using the Pa_SetStreamFinishedCallback + function. Once registered they are called when the stream becomes inactive + (ie once a call to Pa_StopStream() will not block). + A stream will become inactive after the stream callback returns non-zero, + or when Pa_StopStream or Pa_AbortStream is called. For a stream providing audio + output, if the stream callback returns paComplete, or Pa_StopStream is called, + the stream finished callback will not be called until all generated sample data + has been played. + + @param userData The userData parameter supplied to Pa_OpenStream() + + @see Pa_SetStreamFinishedCallback +*/ +typedef void PaStreamFinishedCallback( void *userData ); + + +/** Register a stream finished callback function which will be called when the + stream becomes inactive. See the description of PaStreamFinishedCallback for + further details about when the callback will be called. + + @param stream a pointer to a PaStream that is in the stopped state - if the + stream is not stopped, the stream's finished callback will remain unchanged + and an error code will be returned. + + @param streamFinishedCallback a pointer to a function with the same signature + as PaStreamFinishedCallback, that will be called when the stream becomes + inactive. Passing NULL for this parameter will un-register a previously + registered stream finished callback function. + + @return on success returns paNoError, otherwise an error code indicating the cause + of the error. + + @see PaStreamFinishedCallback +*/ +PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback ); + + +/** Commences audio processing. +*/ +PaError Pa_StartStream( PaStream *stream ); + + +/** Terminates audio processing. It waits until all pending + audio buffers have been played before it returns. +*/ +PaError Pa_StopStream( PaStream *stream ); + + +/** Terminates audio processing immediately without waiting for pending + buffers to complete. +*/ +PaError Pa_AbortStream( PaStream *stream ); + + +/** Determine whether the stream is stopped. + A stream is considered to be stopped prior to a successful call to + Pa_StartStream and after a successful call to Pa_StopStream or Pa_AbortStream. + If a stream callback returns a value other than paContinue the stream is NOT + considered to be stopped. + + @return Returns one (1) when the stream is stopped, zero (0) when + the stream is running or, a PaErrorCode (which are always negative) if + PortAudio is not initialized or an error is encountered. + + @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive +*/ +PaError Pa_IsStreamStopped( PaStream *stream ); + + +/** Determine whether the stream is active. + A stream is active after a successful call to Pa_StartStream(), until it + becomes inactive either as a result of a call to Pa_StopStream() or + Pa_AbortStream(), or as a result of a return value other than paContinue from + the stream callback. In the latter case, the stream is considered inactive + after the last buffer has finished playing. + + @return Returns one (1) when the stream is active (ie playing or recording + audio), zero (0) when not playing or, a PaErrorCode (which are always negative) + if PortAudio is not initialized or an error is encountered. + + @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamStopped +*/ +PaError Pa_IsStreamActive( PaStream *stream ); + + + +/** A structure containing unchanging information about an open stream. + @see Pa_GetStreamInfo +*/ + +typedef struct PaStreamInfo +{ + /** this is struct version 1 */ + int structVersion; + + /** The input latency of the stream in seconds. This value provides the most + accurate estimate of input latency available to the implementation. It may + differ significantly from the suggestedLatency value passed to Pa_OpenStream(). + The value of this field will be zero (0.) for output-only streams. + @see PaTime + */ + PaTime inputLatency; + + /** The output latency of the stream in seconds. This value provides the most + accurate estimate of output latency available to the implementation. It may + differ significantly from the suggestedLatency value passed to Pa_OpenStream(). + The value of this field will be zero (0.) for input-only streams. + @see PaTime + */ + PaTime outputLatency; + + /** The sample rate of the stream in Hertz (samples per second). In cases + where the hardware sample rate is inaccurate and PortAudio is aware of it, + the value of this field may be different from the sampleRate parameter + passed to Pa_OpenStream(). If information about the actual hardware sample + rate is not available, this field will have the same value as the sampleRate + parameter passed to Pa_OpenStream(). + */ + double sampleRate; + +} PaStreamInfo; + + +/** Retrieve a pointer to a PaStreamInfo structure containing information + about the specified stream. + @return A pointer to an immutable PaStreamInfo structure. If the stream + parameter invalid, or an error is encountered, the function returns NULL. + + @param stream A pointer to an open stream previously created with Pa_OpenStream. + + @note PortAudio manages the memory referenced by the returned pointer, + the client must not manipulate or free the memory. The pointer is only + guaranteed to be valid until the specified stream is closed. + + @see PaStreamInfo +*/ +const PaStreamInfo* Pa_GetStreamInfo( PaStream *stream ); + + +/** Determine the current time for the stream according to the same clock used + to generate buffer timestamps. This time may be used for syncronising other + events to the audio stream, for example synchronizing audio to MIDI. + + @return The stream's current time in seconds, or 0 if an error occurred. + + @see PaTime, PaStreamCallback +*/ +PaTime Pa_GetStreamTime( PaStream *stream ); + + +/** Retrieve CPU usage information for the specified stream. + The "CPU Load" is a fraction of total CPU time consumed by a callback stream's + audio processing routines including, but not limited to the client supplied + stream callback. This function does not work with blocking read/write streams. + + This function may be called from the stream callback function or the + application. + + @return + A floating point value, typically between 0.0 and 1.0, where 1.0 indicates + that the stream callback is consuming the maximum number of CPU cycles possible + to maintain real-time operation. A value of 0.5 would imply that PortAudio and + the stream callback was consuming roughly 50% of the available CPU time. The + return value may exceed 1.0. A value of 0.0 will always be returned for a + blocking read/write stream, or if an error occurrs. +*/ +double Pa_GetStreamCpuLoad( PaStream* stream ); + + +/** Read samples from an input stream. The function doesn't return until + the entire buffer has been filled - this may involve waiting for the operating + system to supply the data. + + @param stream A pointer to an open stream previously created with Pa_OpenStream. + + @param buffer A pointer to a buffer of sample frames. The buffer contains + samples in the format specified by the inputParameters->sampleFormat field + used to open the stream, and the number of channels specified by + inputParameters->numChannels. If non-interleaved samples were requested, + buffer is a pointer to the first element of an array of non-interleaved + buffer pointers, one for each channel. + + @param frames The number of frames to be read into buffer. This parameter + is not constrained to a specific range, however high performance applications + will want to match this parameter to the framesPerBuffer parameter used + when opening the stream. + + @return On success PaNoError will be returned, or PaInputOverflowed if input + data was discarded by PortAudio after the previous call and before this call. +*/ +PaError Pa_ReadStream( PaStream* stream, + void *buffer, + unsigned long frames ); + + +/** Write samples to an output stream. This function doesn't return until the + entire buffer has been consumed - this may involve waiting for the operating + system to consume the data. + + @param stream A pointer to an open stream previously created with Pa_OpenStream. + + @param buffer A pointer to a buffer of sample frames. The buffer contains + samples in the format specified by the outputParameters->sampleFormat field + used to open the stream, and the number of channels specified by + outputParameters->numChannels. If non-interleaved samples were requested, + buffer is a pointer to the first element of an array of non-interleaved + buffer pointers, one for each channel. + + @param frames The number of frames to be written from buffer. This parameter + is not constrained to a specific range, however high performance applications + will want to match this parameter to the framesPerBuffer parameter used + when opening the stream. + + @return On success PaNoError will be returned, or paOutputUnderflowed if + additional output data was inserted after the previous call and before this + call. +*/ +PaError Pa_WriteStream( PaStream* stream, + const void *buffer, + unsigned long frames ); + + +/** Retrieve the number of frames that can be read from the stream without + waiting. + + @return Returns a non-negative value representing the maximum number of frames + that can be read from the stream without blocking or busy waiting or, a + PaErrorCode (which are always negative) if PortAudio is not initialized or an + error is encountered. +*/ +signed long Pa_GetStreamReadAvailable( PaStream* stream ); + + +/** Retrieve the number of frames that can be written to the stream without + waiting. + + @return Returns a non-negative value representing the maximum number of frames + that can be written to the stream without blocking or busy waiting or, a + PaErrorCode (which are always negative) if PortAudio is not initialized or an + error is encountered. +*/ +signed long Pa_GetStreamWriteAvailable( PaStream* stream ); + + +/* Miscellaneous utilities */ + + +/** Retrieve the size of a given sample format in bytes. + + @return The size in bytes of a single sample in the specified format, + or paSampleFormatNotSupported if the format is not supported. +*/ +PaError Pa_GetSampleSize( PaSampleFormat format ); + + +/** Put the caller to sleep for at least 'msec' milliseconds. This function is + provided only as a convenience for authors of portable code (such as the tests + and examples in the PortAudio distribution.) + + The function may sleep longer than requested so don't rely on this for accurate + musical timing. +*/ +void Pa_Sleep( long msec ); + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PORTAUDIO_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..ca9b4ef9e --- /dev/null +++ b/map65/set570.cpp @@ -0,0 +1,286 @@ + +/* 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 "/users/joe/linrad/3.37/usb.h" +#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 retval = -1; +int display_freq = -1; +int delay; +usb_dev_handle *global_si570usb_handle = NULL; + +// ********sleep functions*************** +//use this function under LINUX +/* +void si570_sleep(int us) +{ +usleep(us); +} +*/ + +//use this function under WINDOWS +void si570_sleep(int us) +{ + Sleep(us/1000); +} + +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; +} + +int usbGetStringAscii(usb_dev_handle *dev, int my_index, + int langid, char *buf, int buflen); +unsigned char Si570usbOpenDevice(usb_dev_handle **device, char *usbSerialID); +void setLongWord( int value, char * bytes); +int setFreqByValue(usb_dev_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 = NULL; + +// MAIN MENU DIALOG + retval=Si570usbOpenDevice(&global_si570usb_handle, my_usbSerialID); + if (retval != 0) return -1; + +//SET FREQUENCY + if((freq_MHz < 3.45)|(freq_MHz > 866.0)) return -2; + retval=setFreqByValue(global_si570usb_handle,freq_MHz); + return 0; +} + +int usbGetStringAscii(usb_dev_handle *dev, int my_index, + int langid, char *buf, int buflen) +{ + char buffer[256]; + int rval, i; + if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, + (USB_DT_STRING << 8) + my_index, langid, buffer, + sizeof(buffer), 1000)) < 0) return rval; + if(buffer[1] != USB_DT_STRING) return 0; + if((unsigned char)buffer[0] < rval) rval = (unsigned char)buffer[0]; + rval /= 2; +// lossy conversion to ISO Latin1 + for(i=1;i buflen) break; // destination buffer overflow + buf[i-1] = buffer[2 * i]; + if(buffer[2 * i + 1] != 0) buf[i-1] = '?'; // outside of ISO Latin1 range + } + buf[i-1] = 0; + return i-1; +} + +unsigned char Si570usbOpenDevice(usb_dev_handle **device, char *usbSerialID) +{ + struct usb_bus *bus; + struct usb_device *dev; + usb_dev_handle *handle = NULL; + unsigned char errorCode = USB_ERROR_NOTFOUND; + char string[256]; + int len; + int vendor = USBDEV_SHARED_VENDOR; + char *vendorName = (char *)VENDOR_NAME; + int product = USBDEV_SHARED_PRODUCT; + char *productName = (char *)PRODUCT_NAME; + char serialNumberString[20]; + static int didUsbInit = 0; + + if(!didUsbInit) { + didUsbInit = 1; + usb_init(); + } + usb_find_busses(); + usb_find_devices(); + for(bus=usb_get_busses(); bus; bus=bus->next) { + for(dev=bus->devices; dev; dev=dev->next) { + if(dev->descriptor.idVendor == vendor && + dev->descriptor.idProduct == product) { + handle = usb_open(dev); // open the device in order to query strings + if(!handle) { + errorCode = USB_ERROR_ACCESS; + printf("si570.c: Warning: cannot open Si570-USB device:\n"); + printf("usb error message: %s\n",usb_strerror()); + continue; + } + if(vendorName == NULL && productName == NULL) { //name does not matter + break; + } + // now check whether the names match + len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, 0x0409, string, sizeof(string)); + if(len < 0) { + errorCode = USB_ERROR_IO; + printf("si570.c: Warning: cannot query manufacturer for Si570-USB device:\n"); + printf("usb error message: %s\n",usb_strerror()); + } else { + errorCode = USB_ERROR_NOTFOUND; + //fprintf(stderr, "seen device from vendor ->%s<-\n", string); + if(strcmp(string, vendorName) == 0){ + len = usbGetStringAscii(handle, dev->descriptor.iProduct, + 0x0409, string, sizeof(string)); + if(len < 0) { + errorCode = USB_ERROR_IO; + printf("si570.c: Warning: cannot query product for Si570-USB device: \n"); + printf("usb error message: %s\n",usb_strerror()); + } else { + errorCode = USB_ERROR_NOTFOUND; + // fprintf(stderr, "seen product ->%s<-\n", string); + if(strcmp(string, productName) == 0) { + len = usbGetStringAscii(handle, dev->descriptor.iSerialNumber, + 0x0409, serialNumberString, sizeof(serialNumberString)); + if (len < 0) { + errorCode = USB_ERROR_IO; + printf("si570.c: Warning: cannot query serial number for Si570-USB device: \n"); + printf("usb error message: %s\n",usb_strerror()); + } else { + errorCode = USB_ERROR_NOTFOUND; + if ((usbSerialID == NULL) || + (strcmp(serialNumberString, usbSerialID) == 0)) { +// printf("\nOpen Si570 USB device: OK\n"); +// printf("usbSerialID : %s\n",serialNumberString); + break; + } + } + } + } + } + } + usb_close(handle); + handle = NULL; + } + } + if(handle) break; + } + if(handle != NULL) { + errorCode = USB_SUCCESS; + *device = 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(usb_dev_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: USB_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=usb_control_msg( + handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, + request, + value, + my_index, + 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", usb_strerror()); + } + } + return retval; +} diff --git a/map65/signalmeter.cpp b/map65/signalmeter.cpp new file mode 100755 index 000000000..537b900f8 --- /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; + p.begin(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..77480cff8 --- /dev/null +++ b/map65/soundin.cpp @@ -0,0 +1,412 @@ +#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 + int v=141600; + ::setsockopt(udpSocket->socketDescriptor(), SOL_SOCKET, SO_RCVBUF, + (char *)&v, sizeof(v)); + + 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..736193d2a --- /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..420be9533 --- /dev/null +++ b/map65/txtune.cpp @@ -0,0 +1,125 @@ +#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; + QString t; + t.sprintf("%d %%",n); + ui->labPower->setText(t); +} + +void TxTune::on_ampSlider_valueChanged(int n) +{ + m_iqAmp1=n; + iqAmp=10*m_iqAmp1 + m_iqAmp2; + QString t; + t.sprintf("%.4f",1.0 + 0.0001*iqAmp); + ui->labAmpReal->setText(t); +} + +void TxTune::on_fineAmpSlider_valueChanged(int n) +{ + m_iqAmp2=n; + iqAmp=10*m_iqAmp1 + m_iqAmp2; + QString t; + t.sprintf("%.4f",1.0 + 0.0001*iqAmp); + ui->labAmpReal->setText(t);} + +void TxTune::on_phaSlider_valueChanged(int n) +{ + m_iqPha1=n; + iqPhase=10*m_iqPha1 + m_iqPha2; + QString t; + t.sprintf("%.2f",0.01*iqPhase); + ui->labPhaReal->setText(t); +} + +void TxTune::on_finePhaSlider_valueChanged(int n) +{ + m_iqPha2=n; + iqPhase=10*m_iqPha1 + m_iqPha2; + QString t; + t.sprintf("%.2f",0.01*iqPhase); + ui->labPhaReal->setText(t); +} + +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/usb.h b/map65/usb.h new file mode 100644 index 000000000..51c6a6556 --- /dev/null +++ b/map65/usb.h @@ -0,0 +1,409 @@ +#ifndef __USB_H__ +#define __USB_H__ + +#include +#include + +/* + * 'interface' is defined somewhere in the Windows header files. This macro + * is deleted here to avoid conflicts and compile errors. + */ + +#ifdef interface +#undef interface +#endif + +/* + * PATH_MAX from limits.h can't be used on Windows if the dll and + * import libraries are build/used by different compilers + */ + +#define LIBUSB_PATH_MAX 512 + + +/* + * USB spec information + * + * This is all stuff grabbed from various USB specs and is pretty much + * not subject to change + */ + +/* + * Device and/or Interface Class codes + */ +#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ +#define USB_CLASS_AUDIO 1 +#define USB_CLASS_COMM 2 +#define USB_CLASS_HID 3 +#define USB_CLASS_PRINTER 7 +#define USB_CLASS_MASS_STORAGE 8 +#define USB_CLASS_HUB 9 +#define USB_CLASS_DATA 10 +#define USB_CLASS_VENDOR_SPEC 0xff + +/* + * Descriptor types + */ +#define USB_DT_DEVICE 0x01 +#define USB_DT_CONFIG 0x02 +#define USB_DT_STRING 0x03 +#define USB_DT_INTERFACE 0x04 +#define USB_DT_ENDPOINT 0x05 + +#define USB_DT_HID 0x21 +#define USB_DT_REPORT 0x22 +#define USB_DT_PHYSICAL 0x23 +#define USB_DT_HUB 0x29 + +/* + * Descriptor sizes per descriptor type + */ +#define USB_DT_DEVICE_SIZE 18 +#define USB_DT_CONFIG_SIZE 9 +#define USB_DT_INTERFACE_SIZE 9 +#define USB_DT_ENDPOINT_SIZE 7 +#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ +#define USB_DT_HUB_NONVAR_SIZE 7 + + +/* ensure byte-packed structures */ +#include + + +/* All standard descriptors have these 2 fields in common */ +struct usb_descriptor_header +{ + unsigned char bLength; + unsigned char bDescriptorType; +}; + +/* String descriptor */ +struct usb_string_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short wData[1]; +}; + +/* HID descriptor */ +struct usb_hid_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short bcdHID; + unsigned char bCountryCode; + unsigned char bNumDescriptors; +}; + +/* Endpoint descriptor */ +#define USB_MAXENDPOINTS 32 +struct usb_endpoint_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bEndpointAddress; + unsigned char bmAttributes; + unsigned short wMaxPacketSize; + unsigned char bInterval; + unsigned char bRefresh; + unsigned char bSynchAddress; + + unsigned char *extra; /* Extra descriptors */ + int extralen; +}; + +#define USB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ +#define USB_ENDPOINT_DIR_MASK 0x80 + +#define USB_ENDPOINT_TYPE_MASK 0x03 /* in bmAttributes */ +#define USB_ENDPOINT_TYPE_CONTROL 0 +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 1 +#define USB_ENDPOINT_TYPE_BULK 2 +#define USB_ENDPOINT_TYPE_INTERRUPT 3 + +/* Interface descriptor */ +#define USB_MAXINTERFACES 32 +struct usb_interface_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bInterfaceNumber; + unsigned char bAlternateSetting; + unsigned char bNumEndpoints; + unsigned char bInterfaceClass; + unsigned char bInterfaceSubClass; + unsigned char bInterfaceProtocol; + unsigned char iInterface; + + struct usb_endpoint_descriptor *endpoint; + + unsigned char *extra; /* Extra descriptors */ + int extralen; +}; + +#define USB_MAXALTSETTING 128 /* Hard limit */ + +struct usb_interface +{ + struct usb_interface_descriptor *altsetting; + + int num_altsetting; +}; + +/* Configuration descriptor information.. */ +#define USB_MAXCONFIG 8 +struct usb_config_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short wTotalLength; + unsigned char bNumInterfaces; + unsigned char bConfigurationValue; + unsigned char iConfiguration; + unsigned char bmAttributes; + unsigned char MaxPower; + + struct usb_interface *interface; + + unsigned char *extra; /* Extra descriptors */ + int extralen; +}; + +/* Device descriptor */ +struct usb_device_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short bcdUSB; + unsigned char bDeviceClass; + unsigned char bDeviceSubClass; + unsigned char bDeviceProtocol; + unsigned char bMaxPacketSize0; + unsigned short idVendor; + unsigned short idProduct; + unsigned short bcdDevice; + unsigned char iManufacturer; + unsigned char iProduct; + unsigned char iSerialNumber; + unsigned char bNumConfigurations; +}; + +struct usb_ctrl_setup +{ + unsigned char bRequestType; + unsigned char bRequest; + unsigned short wValue; + unsigned short wIndex; + unsigned short wLength; +}; + +/* + * Standard requests + */ +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +/* 0x02 is reserved */ +#define USB_REQ_SET_FEATURE 0x03 +/* 0x04 is reserved */ +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +#define USB_TYPE_STANDARD (0x00 << 5) +#define USB_TYPE_CLASS (0x01 << 5) +#define USB_TYPE_VENDOR (0x02 << 5) +#define USB_TYPE_RESERVED (0x03 << 5) + +#define USB_RECIP_DEVICE 0x00 +#define USB_RECIP_INTERFACE 0x01 +#define USB_RECIP_ENDPOINT 0x02 +#define USB_RECIP_OTHER 0x03 + +/* + * Various libusb API related stuff + */ + +#define USB_ENDPOINT_IN 0x80 +#define USB_ENDPOINT_OUT 0x00 + +/* Error codes */ +#define USB_ERROR_BEGIN 500000 + +/* + * This is supposed to look weird. This file is generated from autoconf + * and I didn't want to make this too complicated. + */ +#define USB_LE16_TO_CPU(x) + +/* Data types */ +/* struct usb_device; */ +/* struct usb_bus; */ + +struct usb_device +{ + struct usb_device *next, *prev; + + char filename[LIBUSB_PATH_MAX]; + + struct usb_bus *bus; + + struct usb_device_descriptor descriptor; + struct usb_config_descriptor *config; + + void *dev; /* Darwin support */ + + unsigned char devnum; + + unsigned char num_children; + struct usb_device **children; +}; + +struct usb_bus +{ + struct usb_bus *next, *prev; + + char dirname[LIBUSB_PATH_MAX]; + + struct usb_device *devices; + unsigned long location; + + struct usb_device *root_dev; +}; + +/* Version information, Windows specific */ +struct usb_version +{ + struct + { + int major; + int minor; + int micro; + int nano; + } dll; + struct + { + int major; + int minor; + int micro; + int nano; + } driver; +}; + + +struct usb_dev_handle; +typedef struct usb_dev_handle usb_dev_handle; + +/* Variables */ +#ifndef __USB_C__ +#define usb_busses usb_get_busses() +#endif + + + +#include + + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Function prototypes */ + + /* usb.c */ + usb_dev_handle *usb_open(struct usb_device *dev); + int usb_close(usb_dev_handle *dev); + int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, + size_t buflen); + int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, + size_t buflen); + + /* descriptors.c */ + int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep, + unsigned char type, unsigned char index, + void *buf, int size); + int usb_get_descriptor(usb_dev_handle *udev, unsigned char type, + unsigned char index, void *buf, int size); + + /* .c */ + int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout); + int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout); + int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout); + int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout); + int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, + int value, int index, char *bytes, int size, + int timeout); + int usb_set_configuration(usb_dev_handle *dev, int configuration); + int usb_claim_interface(usb_dev_handle *dev, int interface); + int usb_release_interface(usb_dev_handle *dev, int interface); + int usb_set_altinterface(usb_dev_handle *dev, int alternate); + int usb_resetep(usb_dev_handle *dev, unsigned int ep); + int usb_clear_halt(usb_dev_handle *dev, unsigned int ep); + int usb_reset(usb_dev_handle *dev); + + char *usb_strerror(void); + + void usb_init(void); + void usb_set_debug(int level); + int usb_find_busses(void); + int usb_find_devices(void); + struct usb_device *usb_device(usb_dev_handle *dev); + struct usb_bus *usb_get_busses(void); + + + /* Windows specific functions */ + +#define LIBUSB_HAS_INSTALL_SERVICE_NP 1 + int usb_install_service_np(void); + void CALLBACK usb_install_service_np_rundll(HWND wnd, HINSTANCE instance, + LPSTR cmd_line, int cmd_show); + +#define LIBUSB_HAS_UNINSTALL_SERVICE_NP 1 + int usb_uninstall_service_np(void); + void CALLBACK usb_uninstall_service_np_rundll(HWND wnd, HINSTANCE instance, + LPSTR cmd_line, int cmd_show); + +#define LIBUSB_HAS_INSTALL_DRIVER_NP 1 + int usb_install_driver_np(const char *inf_file); + void CALLBACK usb_install_driver_np_rundll(HWND wnd, HINSTANCE instance, + LPSTR cmd_line, int cmd_show); + +#define LIBUSB_HAS_TOUCH_INF_FILE_NP 1 + int usb_touch_inf_file_np(const char *inf_file); + void CALLBACK usb_touch_inf_file_np_rundll(HWND wnd, HINSTANCE instance, + LPSTR cmd_line, int cmd_show); + +#define LIBUSB_HAS_INSTALL_NEEDS_RESTART_NP 1 + int usb_install_needs_restart_np(void); + + const struct usb_version *usb_get_version(void); + + int usb_isochronous_setup_async(usb_dev_handle *dev, void **context, + unsigned char ep, int pktsize); + int usb_bulk_setup_async(usb_dev_handle *dev, void **context, + unsigned char ep); + int usb_interrupt_setup_async(usb_dev_handle *dev, void **context, + unsigned char ep); + + int usb_submit_async(void *context, char *bytes, int size); + int usb_reap_async(void *context, int timeout); + int usb_reap_async_nocancel(void *context, int timeout); + int usb_cancel_async(void *context); + int usb_free_async(void **context); + + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_H__ */ + diff --git a/map65/widegraph.cpp b/map65/widegraph.cpp new file mode 100644 index 000000000..a038aa8bb --- /dev/null +++ b/map65/widegraph.cpp @@ -0,0 +1,396 @@ +#include "widegraph.h" +#include "ui_widegraph.h" + +#define NFFT 32768 + +WideGraph::WideGraph(QWidget *parent) : + QDialog(parent), + ui(new Ui::WideGraph) +{ + ui->setupUi(this); + this->setWindowFlags(Qt::Dialog); + this->installEventFilter(parent); //Installing the filter + ui->widePlot->setCursor(Qt::CrossCursor); + this->setMaximumWidth(2048); + this->setMaximumHeight(880); + ui->widePlot->setMaximumHeight(800); + m_bIQxt=false; + ui->labFreq->setStyleSheet( \ + "QLabel { background-color : black; color : yellow; }"); + connect(ui->widePlot, SIGNAL(freezeDecode1(int)),this, + SLOT(wideFreezeDecode(int))); + + //Restore user's settings + QString inifile(QApplication::applicationDirPath()); + inifile += "/map65.ini"; + QSettings settings(inifile, QSettings::IniFormat); + + settings.beginGroup("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); + settings.endGroup(); +} + +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-160,h-100,131,41)); +} + +void WideGraph::saveSettings() +{ + //Save user's settings + QString inifile(QApplication::applicationDirPath()); + inifile += "/map65.ini"; + QSettings settings(inifile, QSettings::IniFormat); + + settings.beginGroup("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); + settings.endGroup(); +} + +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() +{ +#ifdef WIN32 + 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(); + } +#endif +} + +void WideGraph::initIQplus() +{ +#ifdef WIN32 + 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(); + } +#endif +} + +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; +#ifdef WIN32 + 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(); + } +#endif +} + +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); + +#ifdef WIN32 + 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(); + } +#endif +} + +void WideGraph::updateFreqLabel() +{ + double rxFreq=ui->widePlot->rxFreq(); + double txFreq=ui->widePlot->txFreq(); + QString t; + t.sprintf("Rx: %10.6f",rxFreq); + QString t1=t.mid(0,12) + "." + t.mid(12,3); + t.sprintf("Tx: %10.6f",txFreq); + QString t2=t.mid(0,12) + "." + t.mid(12,3); + ui->labFreq->setText(t1 + "\n" + t2); +} + +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..3fdcc6448 --- /dev/null +++ b/map65/widegraph.h @@ -0,0 +1,91 @@ +#ifndef WIDEGRAPH_H +#define WIDEGRAPH_H +#include +#include + +namespace Ui { + class WideGraph; +} + +class WideGraph : public QDialog +{ + Q_OBJECT + +public: + explicit WideGraph(QWidget *parent = 0); + ~WideGraph(); + + bool m_bForceCenterFreq; + bool m_bLockTxRx; + qint32 m_mult570; + qint32 m_mult570Tx; + double m_dForceCenterFreq; + double m_cal570; + double m_TxOffset; + + 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: + bool m_bIQxt; + qint32 m_waterfallAvg; + qint32 m_fCal; + qint32 m_fSample; + qint32 m_mode65; + qint32 m_TRperiod=60; + + Ui::WideGraph *ui; +}; + +#ifdef WIN32 +extern int set570(double freq_MHz); +#endif + +#endif // WIDEGRAPH_H diff --git a/map65/widegraph.ui b/map65/widegraph.ui new file mode 100644 index 000000000..5ac043a91 --- /dev/null +++ b/map65/widegraph.ui @@ -0,0 +1,463 @@ + + + WideGraph + + + + 0 + 0 + 1178 + 326 + + + + Dialog + + + + + + + + true + + + + 0 + 0 + + + + + 400 + 200 + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + 1 + + + + + 1015 + 230 + 131 + 41 + + + + + 12 + + + + Rx: 144.118.200 +Tx: 144.127.317 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + + 0 + 0 + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + kHz + + + -24 + + + 24 + + + 1 + + + 0 + + + + + + + + 50 + 0 + + + + Freq Offset + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + + 0 + 0 + + + + + 60 + 0 + + + + + 60 + 16777215 + + + + kHz + + + 5 + + + 90 + + + 5 + + + 60 + + + + + + + Freq Span + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 40 + 16777215 + + + + 1 + + + 20 + + + + + + + N Avg + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + + 40 + 16777215 + + + + -20 + + + 20 + + + + + + + Gain + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + + 40 + 16777215 + + + + -100 + + + 100 + + + + + + + Zero + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + Auto Zero + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + 2D Spectrum + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + Lock Tx=Rx Freq + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + 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