mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-15 08:31:57 -05:00
Major changes to the MAP65 branch. This branch is now a copy of
MAP65 v2.3.0, r631, as checked out from the SVN repository on pulsar.princeton.edu. If all goes well with this commit, subsequent MAP65 development will use the Berlios repository. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/map65@2461 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
58ec81d9b5
commit
04dcf0a528
87
DFINC.MAK
87
DFINC.MAK
@ -1,87 +0,0 @@
|
||||
#+
|
||||
# DFINC.MAK - Visual Fortran application master NMAKE definitions file
|
||||
#
|
||||
# This software DFINC.MAK is part of the Visual Fortran kit.
|
||||
#
|
||||
# This file should be included at the top of all MAKEFILEs as follows:
|
||||
# !include <dfinc.mak>
|
||||
#
|
||||
# NMAKE Options:
|
||||
#
|
||||
# Use the table below to determine the additional options for NMAKE
|
||||
# Application Information Type Invoke NMAKE
|
||||
# ---------------------------- ------------
|
||||
# For Debugging Info nmake debug=1
|
||||
# For linker map nmake linkmap=1
|
||||
# For linking with the DLLs nmake linkdll=1
|
||||
#-
|
||||
|
||||
# Set the defaults for all the MSVCxx versions
|
||||
|
||||
crtimplib=msvcrt.lib
|
||||
|
||||
!IFNDEF link
|
||||
link = link
|
||||
!ENDIF
|
||||
!IFNDEF libr
|
||||
libr = lib
|
||||
!ENDIF
|
||||
|
||||
# Define the compiler verbs.
|
||||
FOR = df
|
||||
|
||||
# Macros for the compiler
|
||||
!IFDEF DEBUG
|
||||
df_debug = /debug:full
|
||||
lnk_debug = /debug:full /debugtype:both
|
||||
!ELSE
|
||||
df_debug =
|
||||
lnk_debug = /debug:none
|
||||
!ENDIF
|
||||
|
||||
!IFDEF LINKDLL
|
||||
df_dll = /call_dll
|
||||
dflibs = dfordll.lib $(crtimplib) kernel32.lib
|
||||
!ELSE
|
||||
df_dll =
|
||||
dflibs = dfor.lib libc.lib kernel32.lib
|
||||
!ENDIF
|
||||
|
||||
fflags = $(df_debug) $(df_dll)
|
||||
|
||||
# Macros for the FPP Preprocesor
|
||||
fppflags =
|
||||
fpp = $(FOR) $(fflags) /fpp="$(fppflags)"
|
||||
|
||||
# Macros for the linker.
|
||||
!IFDEF LINKMAP
|
||||
lflags = /map:$(*B).map $(lflags)
|
||||
!ELSE
|
||||
lflags = $(lflags)
|
||||
!ENDIF
|
||||
|
||||
# SUFFIXES list
|
||||
.SUFFIXES: .exe .obj .asm .c .bas .cbl .fpp .for .f90 .pas .res .rc
|
||||
|
||||
# Define the inference rules
|
||||
.obj.exe:
|
||||
$(FOR) $(df_dll) $(df_debug) /link $(lflags) $(lnk_debug) $*.obj
|
||||
|
||||
.for.exe:
|
||||
$(FOR) $(fflags) $*.for /link $(lflags)
|
||||
|
||||
.f90.exe:
|
||||
$(FOR) $(fflags) $*.f90 /link $(lflags)
|
||||
|
||||
.fpp.exe:
|
||||
$(fpp) $*.fpp /link $(lflags)
|
||||
|
||||
.for.obj:
|
||||
$(FOR) $(df_debug) $*.for /nolink /object:$@
|
||||
|
||||
.f90.obj:
|
||||
$(FOR) $(df_debug) $*.f90 /nolink /object:$@
|
||||
|
||||
.fpp.obj:
|
||||
$(FOR) $(df_debug) /nolink /object:$@ /fpp:"$(fppflags)" $*.fpp
|
||||
|
102
GeoDist.f
102
GeoDist.f
@ -1,102 +0,0 @@
|
||||
subroutine geodist(Eplat, Eplon, Stlat, Stlon,
|
||||
+ Az, Baz, Dist)
|
||||
implicit none
|
||||
real eplat, eplon, stlat, stlon, az, baz, dist
|
||||
|
||||
C JHT: In actual fact, I use the first two arguments for "My Location",
|
||||
C the second two for "His location"; West longitude is positive.
|
||||
|
||||
c
|
||||
c
|
||||
c Taken directly from:
|
||||
c Thomas, P.D., 1970, Spheroidal geodesics, reference systems,
|
||||
c & local geometry, U.S. Naval Oceanographic Office SP-138,
|
||||
c 165 pp.
|
||||
c
|
||||
c assumes North Latitude and East Longitude are positive
|
||||
c
|
||||
c EpLat, EpLon = End point Lat/Long
|
||||
c Stlat, Stlon = Start point lat/long
|
||||
c Az, BAz = direct & reverse azimuith
|
||||
c Dist = Dist (km); Deg = central angle, discarded
|
||||
c
|
||||
|
||||
real BOA, F, P1R, P2R, L1R, L2R, DLR, T1R, T2R, TM,
|
||||
+ DTM, STM, CTM, SDTM,CDTM, KL, KK, SDLMR, L,
|
||||
+ CD, DL, SD, T, U, V, D, X, E, Y, A, FF64, TDLPM,
|
||||
+ HAPBR, HAMBR, A1M2, A2M1
|
||||
|
||||
real AL,BL,D2R,Pi2
|
||||
|
||||
data AL/6378206.4/ ! Clarke 1866 ellipsoid
|
||||
data BL/6356583.8/
|
||||
c real pi /3.14159265359/
|
||||
data D2R/0.01745329251994/ ! degrees to radians conversion factor
|
||||
data Pi2/6.28318530718/
|
||||
|
||||
BOA = BL/AL
|
||||
F = 1.0 - BOA
|
||||
c convert st/end pts to radians
|
||||
P1R = Eplat * D2R
|
||||
P2R = Stlat * D2R
|
||||
L1R = Eplon * D2R
|
||||
L2R = StLon * D2R
|
||||
DLR = L2R - L1R ! DLR = Delta Long in Rads
|
||||
T1R = ATan(BOA * Tan(P1R))
|
||||
T2R = ATan(BOA * Tan(P2R))
|
||||
TM = (T1R + T2R) / 2.0
|
||||
DTM = (T2R - T1R) / 2.0
|
||||
STM = Sin(TM)
|
||||
CTM = Cos(TM)
|
||||
SDTM = Sin(DTM)
|
||||
CDTM = Cos(DTM)
|
||||
KL = STM * CDTM
|
||||
KK = SDTM * CTM
|
||||
SDLMR = Sin(DLR/2.0)
|
||||
L = SDTM * SDTM + SDLMR * SDLMR * (CDTM * CDTM - STM * STM)
|
||||
CD = 1.0 - 2.0 * L
|
||||
DL = ACos(CD)
|
||||
SD = Sin(DL)
|
||||
T = DL/SD
|
||||
U = 2.0 * KL * KL / (1.0 - L)
|
||||
V = 2.0 * KK * KK / L
|
||||
D = 4.0 * T * T
|
||||
X = U + V
|
||||
E = -2.0 * CD
|
||||
Y = U - V
|
||||
A = -D * E
|
||||
FF64 = F * F / 64.0
|
||||
Dist = AL*SD*(T -(F/4.0)*(T*X-Y)+FF64*(X*(A+(T-(A+E)
|
||||
+ /2.0)*X)+Y*(-2.0*D+E*Y)+D*X*Y))/1000.0
|
||||
TDLPM = Tan((DLR+(-((E*(4.0-X)+2.0*Y)*((F/2.0)*T+FF64*
|
||||
+ (32.0*T+(A-20.0*T)*X-2.0*(D+2.0)*Y))/4.0)*Tan(DLR)))/2.0)
|
||||
HAPBR = ATan2(SDTM,(CTM*TDLPM))
|
||||
HAMBR = Atan2(CDTM,(STM*TDLPM))
|
||||
A1M2 = Pi2 + HAMBR - HAPBR
|
||||
A2M1 = Pi2 - HAMBR - HAPBR
|
||||
|
||||
1 If ((A1M2 .ge. 0.0) .AND. (A1M2 .lt. Pi2)) GOTO 5
|
||||
If (A1M2 .lt. Pi2) GOTO 4
|
||||
A1M2 = A1M2 - Pi2
|
||||
GOTO 1
|
||||
4 A1M2 = A1M2 + Pi2
|
||||
GOTO 1
|
||||
c
|
||||
c all of this gens the proper az, baz (forward and back azimuth)
|
||||
c
|
||||
|
||||
5 If ((A2M1 .ge. 0.0) .AND. (A2M1 .lt. Pi2)) GOTO 9
|
||||
If (A2M1 .lt. Pi2) GOTO 8
|
||||
A2M1 = A2M1 - Pi2
|
||||
GOTO 5
|
||||
8 A2M1 = A2M1 + Pi2
|
||||
GOTO 5
|
||||
|
||||
9 Az = A1M2 / D2R
|
||||
BAZ = A2M1 / D2R
|
||||
c
|
||||
c Fix the mirrored coords here.
|
||||
c
|
||||
az = 360.0 - az
|
||||
baz = 360.0 - baz
|
||||
end
|
BIN
KVASD_g95.EXE
BIN
KVASD_g95.EXE
Binary file not shown.
344
LICENSE.TXT
344
LICENSE.TXT
@ -1,344 +0,0 @@
|
||||
The source code for WSJT is made available under the GNU General
|
||||
Public License.
|
||||
|
||||
#####################################################################
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) 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
|
||||
this service 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 make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. 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.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
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
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the 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 a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE 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.
|
||||
|
||||
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
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision 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, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This 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 Library General
|
||||
Public License instead of this License.
|
30
LICENSE_WHEATLEY.TXT
Normal file
30
LICENSE_WHEATLEY.TXT
Normal file
@ -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.
|
BIN
MAP65_Beta_Release.docx
Normal file
BIN
MAP65_Beta_Release.docx
Normal file
Binary file not shown.
96
Makefile.CVF
96
Makefile.CVF
@ -1,96 +0,0 @@
|
||||
#Makefile for Windows
|
||||
!include <dfinc.mak> #Some definitions for Compaq Visual Fortran
|
||||
gcc = cl
|
||||
FC = df
|
||||
#To do bounds checking (with useless reports) put "/check:all" in the
|
||||
# --opt= line below (line 56, more or less ...)
|
||||
#FFLAGS = /traceback /check:all
|
||||
FFLAGS = /traceback /fast /nologo /check:all
|
||||
|
||||
all: MAP65.EXE plrs.exe
|
||||
|
||||
OBJS2C = init_rs.o encode_rs.o decode_rs.o jtaudio.o plrr_subs.o
|
||||
|
||||
F2PYONLY = ftn_init ftn_quit audio_init getfile azdist0 astro0 spec
|
||||
|
||||
SRCS2F90 = a2d.f90 astro0.f90 audio_init.f90 azdist0.f90 \
|
||||
decode1.f90 ftn_init.f90 ftn_quit.f90 wsjtgen.f90 \
|
||||
runqqq.f90 fivehz.f90 flushqqq.f90 \
|
||||
rfile.f90 rfile3a.f90 spec.f90 map65a.F90 display.F90 \
|
||||
getfile.f90 getfile2.f90 recvpkt.f90 savetf2.F90 \
|
||||
symspec.f90 sec_midn.F90 getdphi.f90 thcvf.f90
|
||||
|
||||
SRCSCOM = datcom.f90 gcom1.f90 gcom2.f90 gcom3.f90 gcom4.f90 spcom.f90
|
||||
|
||||
SRCS2F77 = indexx.f gen65.f chkmsg.f \
|
||||
gentone.f gencwid.f set.f db.f pctile.f sort.f ssort.f \
|
||||
avemsg65.f demod64a.f encode65.f extract.f four2a.f getpfx1.f \
|
||||
getpfx2.f graycode.f grid2k.f interleave63.f k2grid.f \
|
||||
deep65.f morse.f nchar.f packcall.f packgrid.f \
|
||||
packmsg.f packtext.f setup65.f unpackcall.f unpackgrid.f \
|
||||
unpackmsg.f unpacktext.f astro.f azdist.f coord.f dcoord.f \
|
||||
deg2grid.f dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f \
|
||||
moon2.f MoonDop.f sun.f toxyz.f pfxdump.f \
|
||||
ccf65.f trimlist.f chkhist.f decode1a.f \
|
||||
filbig.f fil6521.f twkfreq.f decode65b.f \
|
||||
afc65b.f fchisq.f ccf2.f
|
||||
|
||||
SRCS2C = ptt.c igray.c wrapkarn.c rfile3.c
|
||||
|
||||
MAP65.EXE: Audio.pyd map65.spec
|
||||
python c:\python23\installer\Build.py map65.spec
|
||||
|
||||
plrs.exe: plrs.f90 sec_midn.F90 plrs_subs_win.c
|
||||
cl /c /Foplrs_subs.obj plrs_subs_win.c
|
||||
df /fpp /define:CVF plrs.f90 sec_midn.F90 plrs_subs.obj \
|
||||
/link ws2_32.lib
|
||||
|
||||
Audio.pyd: $(OBJS2C) $(SRCS2F90) $(SRCS2F77) $(SRCS2C) $(SRCSCOM)
|
||||
python f2py.py -c \
|
||||
--quiet --"fcompiler=compaqv" \
|
||||
--opt="/nologo /traceback /warn:errors /fast /fpp /define:CVF \
|
||||
/define:USE_PORTAUDIO" \
|
||||
$(OBJS2C) \
|
||||
-lwinmm -lws2_32 -lpa -lfftw3single \
|
||||
-m Audio \
|
||||
only: $(F2PYONLY) : \
|
||||
$(SRCS2F90) $(SRCS2F77) $(SRCS2C)
|
||||
|
||||
map65.spec: map65.py astro.py g.py options.py palettes.py smeter.py specjt.py
|
||||
python c:\python23\installer\makespec.py --icon wsjt.ico \
|
||||
--tk --onefile map65.py
|
||||
|
||||
jtaudio.o: jtaudio.c
|
||||
$(CC) /nologo /c /DWin32 /Fojtaudio.o jtaudio.c
|
||||
|
||||
init_rs.obj: init_rs.c
|
||||
$(CC) /nologo /c /DBIGSYM=1 init_rs.c
|
||||
|
||||
init_rs.o: init_rs.c
|
||||
$(CC) /nologo /c /DBIGSYM=1 /Foinit_rs.o init_rs.c
|
||||
|
||||
encode_rs.obj: encode_rs.c
|
||||
$(CC) /nologo /c /DBIGSYM=1 encode_rs.c
|
||||
|
||||
encode_rs.o: encode_rs.c
|
||||
$(CC) /nologo /c /DBIGSYM=1 /Foencode_rs.o encode_rs.c
|
||||
|
||||
decode_rs.obj: decode_rs.c
|
||||
$(CC) /nologo /c /DBIGSYM=1 decode_rs.c
|
||||
|
||||
decode_rs.o: decode_rs.c
|
||||
$(CC) /nologo /c /DBIGSYM=1 /Ox /Zd /Fodecode_rs.o decode_rs.c
|
||||
|
||||
wrapkarn.obj: wrapkarn.c
|
||||
$(CC) /nologo /c /DCVF=1 wrapkarn.c
|
||||
|
||||
igray.obj: igray.c
|
||||
$(CC) /nologo /c /DCVF=1 igray.c
|
||||
|
||||
plrr_subs.o: plrr_subs_win.c
|
||||
$(CC) /nologo /c plrr_subs_win.c /Foplrr_subs.o
|
||||
|
||||
.PHONY : clean
|
||||
|
||||
clean:
|
||||
-del *.o *.obj MAP65.EXE Audio.pyd map65.spec
|
100
Makefile.MinGW
100
Makefile.MinGW
@ -1,100 +0,0 @@
|
||||
#Makefile to compile MAP65.EXE for Windows.
|
||||
#!include <dfinc.mak> #Some definitions for Compaq Visual Fortran
|
||||
CC = /mingw/bin/gcc
|
||||
FC = g95
|
||||
CFLAGS = -I. -fPIC
|
||||
FFLAGS = -Wall -Wno-precision-loss -fbounds-check -fPIC -fno-second-underscore
|
||||
|
||||
.f.o:
|
||||
${FC} ${CPPFLAGS} ${FFLAGS} -c -o ${<:.f=.o} $<
|
||||
|
||||
all: MAP65.EXE
|
||||
|
||||
OBJC1 = init_rs.o encode_rs.o decode_rs.o jtaudio.o plrr_subs.o deep65.o
|
||||
|
||||
F2PYONLY = ftn_init ftn_quit audio_init getfile azdist0 astro0 spec
|
||||
|
||||
SRCF90 = a2d.f90 astro0.f90 audio_init.f90 azdist0.f90 \
|
||||
decode1.f90 ftn_init.f90 ftn_quit.f90 wsjtgen.f90 \
|
||||
runqqq.f90 fivehz.f90 flushqqq.f90 \
|
||||
rfile.f90 rfile3a.f90 spec.f90 map65a.f90 display.f90 \
|
||||
getfile.f90 getfile2.f90 recvpkt.f90 savetf2.f90 \
|
||||
symspec.f90 sec_midn.f90 getdphi.f90 thnix.f90 msgtrim.f90
|
||||
|
||||
SRCCOM = datcom.f90 gcom1.f90 gcom2.f90 gcom3.f90 gcom4.f90 spcom.f90
|
||||
|
||||
SRCF77 = indexx.f gen65.f chkmsg.f \
|
||||
gentone.f gencwid.f set.f db.f pctile.f sort.f ssort.f \
|
||||
avemsg65.f demod64a.f encode65.f extract.f getpfx1.f \
|
||||
getpfx2.f graycode.f grid2k.f interleave63.f k2grid.f \
|
||||
morse.f nchar.f packcall.f packgrid.f \
|
||||
packmsg.f packtext.f setup65.f unpackcall.f unpackgrid.f \
|
||||
unpackmsg.f unpacktext.f astro.f azdist.f coord.f dcoord.f \
|
||||
deg2grid.f dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f \
|
||||
moon2.f MoonDop.f sun.f toxyz.f pfxdump.f \
|
||||
ccf65.f trimlist.f chkhist.f decode1a.f f77_wisdom.f \
|
||||
fil6521.f twkfreq.f decode65b.f afc65b.f fchisq.f ccf2.f
|
||||
|
||||
SRC2F77 = four2a.f filbig.f
|
||||
|
||||
SRCS2C = ptt.c igray.c wrapkarn.c cutil.c start_portaudio.c fthread.c
|
||||
|
||||
OBJF77 = ${SRCF77:.f=.o}
|
||||
|
||||
MAP65.EXE: Audio.pyd map65.spec
|
||||
c:/python25/python c:/python25/pyinstaller-1.3/Build.py map65.spec
|
||||
|
||||
Audio.pyd: $(OBJC1) $(OBJF77) $(SRCF90) $(SRC2F77) $(SRCS2C) $(SRCCOM) Makefile
|
||||
c:/Python25/python C:/python25/scripts/f2py.py -c -I. \
|
||||
--quiet --fcompiler=g95 \
|
||||
--opt="-fbounds-check -O0 -cpp" \
|
||||
--compiler=mingw32 \
|
||||
$(OBJC1) $(OBJF77) libfftw3f_win.a \
|
||||
libportaudio.a libpthreadGC2.a -lwinmm -lws2_32 \
|
||||
-m Audio \
|
||||
only: $(F2PYONLY) : \
|
||||
$(SRCF90) $(SRC2F77) $(SRCS2C)
|
||||
|
||||
map65.spec: map65.py astro.py g.py options.py palettes.py smeter.py specjt.py
|
||||
C:/Python25/python C:/Python25/pyinstaller-1.3/makespec.py \
|
||||
--icon wsjt.ico --tk --onefile map65.py
|
||||
|
||||
deep65.o: deep65.f
|
||||
$(FC) -c -O0 -Wall -fPIC -fno-second-underscore deep65.f
|
||||
|
||||
jtaudio.o: jtaudio.c
|
||||
$(CC) -c -DWin32 -o jtaudio.o jtaudio.c
|
||||
|
||||
init_rs.obj: init_rs.c
|
||||
$(CC) -c -DBIGSYM=1 init_rs.c
|
||||
|
||||
init_rs.o: init_rs.c
|
||||
$(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c
|
||||
|
||||
encode_rs.obj: encode_rs.c
|
||||
$(CC) -c -DBIGSYM=1 encode_rs.c
|
||||
|
||||
encode_rs.o: encode_rs.c
|
||||
$(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c
|
||||
|
||||
decode_rs.obj: decode_rs.c
|
||||
$(CC) -c -DBIGSYM=1 decode_rs.c
|
||||
|
||||
decode_rs.o: decode_rs.c
|
||||
$(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c
|
||||
|
||||
wrapkarn.obj: wrapkarn.c
|
||||
$(CC) -c -DWin32=1 wrapkarn.c
|
||||
|
||||
igray.obj: igray.c
|
||||
$(CC) -c -DWin32=1 igray.c
|
||||
|
||||
plrr_subs.o: plrr_subs_win.c
|
||||
$(CC) -c plrr_subs_win.c -o plrr_subs.o
|
||||
|
||||
.PHONY : clean
|
||||
|
||||
clean:
|
||||
rm -f *.o Audio.pyd map65.spec MAP65.EXE
|
||||
|
||||
|
112
Makefile.ifort
112
Makefile.ifort
@ -1,112 +0,0 @@
|
||||
MV ?= mv
|
||||
CC ?= gcc
|
||||
MKDIR ?= mkdir
|
||||
INSTALL= install
|
||||
FFLAGS = -O2 -C -threads -reentrancy threaded -traceback -static
|
||||
LDFLAGS = -L/usr/lib -L/usr/local/lib
|
||||
LIBS = -lpthread -lportaudio -lsamplerate -lfftw3f
|
||||
CPPFLAGS = -I/usr/include -I/usr/local/include
|
||||
CFLAGS = -Wall -O0 -g
|
||||
PREFIX = /usr/local/
|
||||
# Map65 specific C flags
|
||||
CFLAGS += -DBIGSYM=1 -fPIC
|
||||
DEFS = -DPACKAGE_NAME=\"map65\" -DPACKAGE_TARNAME=\"map65\" -DPACKAGE_VERSION=\"0.9\" -DPACKAGE_STRING=\"map65\ 0.9\" -DPACKAGE_BUGREPORT=\"\" -DFC_LIB_PATH=\"/opt/g95-install/bin/../lib/gcc-lib/i686-pc-linux-gnu/4.1.3//\" -DFC=\"g95\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_RESOURCE_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_ERRNO_H=1 -DHAVE_SYS_SYSLOG_H=1 -DHAVE_STDDEF_H=1 -DHAVE_LIBGEN_H=1 -DHAVE_SYS_WAIT_H=1 -DHAVE_WAIT_H=1 -DHAVE_STDIO_H=1 -DHAVE_TERMIOS_H=1 -DHAVE_SYS_RESOURCE_H=1 -DHAVE_LINUX_PPDEV_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_FCNTL_H=1 -DHAVE_SYS_IOCTL_H=1 -DTIME_WITH_SYS_TIME=1 -DSTRING_WITH_STRINGS=1 -DNDEBUG=1 -DHAS_SAMPLERATE_H=1 -DHAS_PORTAUDIO=1 -DHAS_PORTAUDIO_H=1 -DHAS_PORTAUDIO_LIB=1 -DHAS_FFTW3_H=1 -DHAS_FFTW3FLIBS=1
|
||||
CFLAGS += ${DEFS}
|
||||
CPPFLAGS += ${DEFS} -I.
|
||||
|
||||
# MAP65 specific Fortran flags
|
||||
# gfortran has no -Wno-precission-loss
|
||||
#FFLAGS += -Wall -fbounds-check -fno-second-underscore -fPIC#FFLAGS += -Wall -Wno-precision-loss -fbounds-check -fno-second-underscore -fPIC
|
||||
#FFLAGS += -Wall -fbounds-check -fno-second-underscore -ffixed-line-length-none -fPIC
|
||||
#FFLAGS += -Wall -fbounds-check -fno-second-underscore -fPIC
|
||||
#FFLAGS += -cpp -fno-second-underscore
|
||||
|
||||
all: Audio.so plrs plrr
|
||||
|
||||
# The default rules
|
||||
.c.o:
|
||||
${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${<:.c=.o} $<
|
||||
|
||||
.f.o:
|
||||
${FC} ${CPPFLAGS} ${FFLAGS} -c -o ${<:.f=.o} $<
|
||||
|
||||
.F90.o:
|
||||
${FC} ${CPPFLAGS} ${FFLAGS} -c -o ${<:.F90=.o} $<
|
||||
|
||||
OS=Linux
|
||||
FC=ifort
|
||||
FCV=intel
|
||||
COMPILER += /opt/g95-install/bin/../lib/gcc-lib/i686-pc-linux-gnu/4.1.3//
|
||||
|
||||
LDFLAGS += -L${COMPILER}
|
||||
|
||||
PYTHON ?= /usr/bin/python
|
||||
RM ?= /bin/rm
|
||||
F2PY = /usr/bin/f2py
|
||||
|
||||
###
|
||||
|
||||
OBJS2C = init_rs.o encode_rs.o decode_rs.o plrr_subs.o loc.o deep65.o
|
||||
|
||||
F2PYONLY = ftn_init ftn_quit audio_init getfile azdist0 astro0 spec
|
||||
|
||||
SRCS2F90 = astro0.F90 audio_init.F90 azdist0.f90 \
|
||||
decode1.F90 ftn_init.F90 ftn_quit.f90 wsjtgen.F90 \
|
||||
runqqq.F90 fivehz.F90 flushqqq.F90 \
|
||||
rfile.f90 rfile3a.F90 spec.f90 map65a.F90 display.F90 \
|
||||
getfile.F90 getfile2.F90 recvpkt.F90 savetf2.F90 \
|
||||
symspec.f90 sec_midn.F90 getdphi.f90 thnix.f90
|
||||
|
||||
SRCS2F77 = indexx.f gen65.f chkmsg.f \
|
||||
gentone.f gencwid.f set.f db.f pctile.f sort.f ssort.f \
|
||||
avemsg65.f demod64a.f encode65.f extract.f four2a.f getpfx1.f \
|
||||
getpfx2.f graycode.f grid2k.f interleave63.f k2grid.f \
|
||||
morse.f nchar.f packcall.f packgrid.f \
|
||||
packmsg.f packtext.f setup65.f unpackcall.f unpackgrid.f \
|
||||
unpackmsg.f unpacktext.f astro.f azdist.f coord.f dcoord.f \
|
||||
deg2grid.f dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f \
|
||||
moon2.f MoonDop.f sun.f toxyz.f pfxdump.f \
|
||||
ccf65.f trimlist.f chkhist.f decode1a.f \
|
||||
filbig.f fil6521.f twkfreq.f decode65b.f \
|
||||
afc65b.f fchisq.f ccf2.f rfile2.f
|
||||
|
||||
OBJS2F77 = ${SRCS2F77:.f=.o}
|
||||
|
||||
SRCS3C = ptt_unix.c igray.c wrapkarn.c cutil.c fthread.c
|
||||
OBJS3C = ${SRCS3C:.c=.o}
|
||||
|
||||
AUDIOSRCS = a2d.f90 jtaudio.c start_portaudio.c
|
||||
|
||||
deep65.o: deep65.F
|
||||
$(FC) -c -O0 -Wall -fno-second-underscore -fPIC deep65.F
|
||||
|
||||
Audio.so: $(OBJS2C) $(OBJS3C) $(OBJS2F77) $(SRCS2F90) $(AUDIOSRCS)
|
||||
${F2PY} -c --quiet --opt="-O ${CFLAGS} \
|
||||
${FFLAGS}" $(OBJS2C) $(OBJS2F77) -m Audio \
|
||||
--f77exec=${FC} --f90exec=${FC} ${CPPFLAGS} ${LDFLAGS} ${LIBS} \
|
||||
only: $(F2PYONLY) \
|
||||
: $(SRCS2F90) \
|
||||
${SRCS3C} ${AUDIOSRCS}
|
||||
|
||||
|
||||
init_rs_int.o: init_rs.c
|
||||
$(CC) $(CFLAGS) -c -DBIGSYM=1 -o init_rs_int.o init_rs.c
|
||||
encode_rs_int.o: encode_rs.c
|
||||
$(CC) $(CFLAGS) -c -DBIGSYM=1 -o encode_rs_int.o encode_rs.c
|
||||
decode_rs_int.o: decode_rs.c
|
||||
$(CC) $(CFLAGS) -c -DBIGSYM=1 -o decode_rs_int.o decode_rs.c
|
||||
|
||||
plrr: plrr.F90 sec_midn.F90 plrr_subs.c cutil.c
|
||||
$(CC) -c plrs_subs.c cutil.c
|
||||
$(FC) -o plrr -fno-second-underscore plrr.F90 sec_midn.F90 plrr_subs.o cutil.o
|
||||
|
||||
plrs: plrs.F90 sec_midn.F90 plrs_subs.c cutil.c
|
||||
$(CC) -c plrs_subs.c cutil.c
|
||||
$(FC) -o plrs -fno-second-underscore plrs.F90 sec_midn.F90 plrs_subs.o cutil.o
|
||||
|
||||
.PHONY : clean
|
||||
clean:
|
||||
${RM} -f *.o *.pyc *.so *~ map65 map65.spec
|
||||
|
||||
distclean: clean
|
||||
${RM} -f config.log config.status Makefile
|
112
Makefile.in
112
Makefile.in
@ -1,112 +0,0 @@
|
||||
MV ?= mv
|
||||
CC ?= @CC@
|
||||
MKDIR ?= mkdir
|
||||
INSTALL= install
|
||||
FFLAGS = @FFLAGS@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBS = @LIBS@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CFLAGS = @CFLAGS@
|
||||
PREFIX = @PREFIX@
|
||||
# Map65 specific C flags
|
||||
CFLAGS += -DBIGSYM=1 -fPIC
|
||||
DEFS = @DEFS@
|
||||
CFLAGS += ${DEFS}
|
||||
CPPFLAGS += ${DEFS} -I.
|
||||
|
||||
# MAP65 specific Fortran flags
|
||||
# gfortran has no -Wno-precission-loss
|
||||
#FFLAGS += -Wall -fbounds-check -fno-second-underscore -fPIC#FFLAGS += -Wall -Wno-precision-loss -fbounds-check -fno-second-underscore -fPIC
|
||||
#FFLAGS += -Wall -fbounds-check -fno-second-underscore -ffixed-line-length-none -fPIC
|
||||
#FFLAGS += -Wall -fbounds-check -fno-second-underscore -fPIC
|
||||
#FFLAGS += -cpp -fno-second-underscore
|
||||
|
||||
all: Audio.so plrs plrr
|
||||
|
||||
# The default rules
|
||||
.c.o:
|
||||
${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${<:.c=.o} $<
|
||||
|
||||
.f.o:
|
||||
${FC} ${CPPFLAGS} ${FFLAGS} -c -o ${<:.f=.o} $<
|
||||
|
||||
.F90.o:
|
||||
${FC} ${CPPFLAGS} ${FFLAGS} -c -o ${<:.F90=.o} $<
|
||||
|
||||
OS=@OS@
|
||||
FC=@FC@
|
||||
FCV=@FCV@
|
||||
COMPILER += @FC_LIB_PATH@
|
||||
|
||||
LDFLAGS += -L${COMPILER}
|
||||
|
||||
PYTHON ?= @PYTHON@
|
||||
RM ?= @RM@
|
||||
F2PY = @F2PY@
|
||||
|
||||
###
|
||||
|
||||
OBJS2C = init_rs.o encode_rs.o decode_rs.o plrr_subs.o loc.o deep65.o
|
||||
|
||||
F2PYONLY = ftn_init ftn_quit audio_init getfile azdist0 astro0 spec
|
||||
|
||||
SRCS2F90 = astro0.F90 audio_init.F90 azdist0.f90 \
|
||||
decode1.F90 ftn_init.F90 ftn_quit.f90 wsjtgen.F90 \
|
||||
runqqq.F90 fivehz.F90 flushqqq.F90 \
|
||||
rfile.f90 rfile3a.F90 spec.f90 map65a.F90 display.F90 \
|
||||
getfile.F90 getfile2.F90 recvpkt.F90 savetf2.F90 \
|
||||
symspec.f90 sec_midn.F90 getdphi.f90 thnix.f90
|
||||
|
||||
SRCS2F77 = indexx.f gen65.f chkmsg.f \
|
||||
gentone.f gencwid.f set.f db.f pctile.f sort.f ssort.f \
|
||||
avemsg65.f demod64a.f encode65.f extract.f four2a.f getpfx1.f \
|
||||
getpfx2.f graycode.f grid2k.f interleave63.f k2grid.f \
|
||||
morse.f nchar.f packcall.f packgrid.f \
|
||||
packmsg.f packtext.f setup65.f unpackcall.f unpackgrid.f \
|
||||
unpackmsg.f unpacktext.f astro.f azdist.f coord.f dcoord.f \
|
||||
deg2grid.f dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f \
|
||||
moon2.f MoonDop.f sun.f toxyz.f pfxdump.f f77_wisdom.f \
|
||||
ccf65.f trimlist.f chkhist.f decode1a.f \
|
||||
filbig.f fil6521.f twkfreq.f decode65b.f \
|
||||
afc65b.f fchisq.f ccf2.f rfile2.f
|
||||
|
||||
OBJS2F77 = ${SRCS2F77:.f=.o}
|
||||
|
||||
SRCS3C = ptt_unix.c igray.c wrapkarn.c cutil.c fthread.c
|
||||
OBJS3C = ${SRCS3C:.c=.o}
|
||||
|
||||
AUDIOSRCS = a2d.f90 jtaudio.c start_portaudio.c
|
||||
|
||||
deep65.o: deep65.F
|
||||
$(FC) -c -O0 -Wall -fno-second-underscore -fPIC deep65.F
|
||||
|
||||
Audio.so: $(OBJS2C) $(OBJS3C) $(OBJS2F77) $(SRCS2F90) $(AUDIOSRCS)
|
||||
${F2PY} -c --quiet --noopt --debug \
|
||||
--f77flags="${FFLAGS}" --f90flags="${FFLAGS}" \
|
||||
$(OBJS2C) $(OBJS2F77) -m Audio \
|
||||
--fcompiler=${FCV} --f77exec=${FC} --f90exec=${FC} \
|
||||
${CPPFLAGS} ${LDFLAGS} ${LIBS} \
|
||||
only: $(F2PYONLY) : $(SRCS2F90) \
|
||||
${SRCS3C} ${AUDIOSRCS}
|
||||
|
||||
init_rs_int.o: init_rs.c
|
||||
$(CC) $(CFLAGS) -c -DBIGSYM=1 -o init_rs_int.o init_rs.c
|
||||
encode_rs_int.o: encode_rs.c
|
||||
$(CC) $(CFLAGS) -c -DBIGSYM=1 -o encode_rs_int.o encode_rs.c
|
||||
decode_rs_int.o: decode_rs.c
|
||||
$(CC) $(CFLAGS) -c -DBIGSYM=1 -o decode_rs_int.o decode_rs.c
|
||||
|
||||
plrr: plrr.F90 sec_midn.F90 plrr_subs.c cutil.c
|
||||
$(CC) -c plrs_subs.c cutil.c
|
||||
$(FC) -o plrr -fno-second-underscore plrr.F90 sec_midn.F90 plrr_subs.o cutil.o
|
||||
|
||||
plrs: plrs.F90 sec_midn.F90 plrs_subs.c cutil.c
|
||||
$(CC) -c plrs_subs.c cutil.c
|
||||
$(FC) -o plrs -fno-second-underscore plrs.F90 sec_midn.F90 plrs_subs.o cutil.o
|
||||
|
||||
.PHONY : clean
|
||||
clean:
|
||||
${RM} -f *.o *.pyc *.so *~ map65 map65.spec
|
||||
|
||||
distclean: clean
|
||||
${RM} -f config.log config.status Makefile
|
@ -1,121 +0,0 @@
|
||||
CC ?= gcc
|
||||
FFLAGS = -g -O2
|
||||
LDFLAGS = -L/usr/local/lib -lpthread -lasound
|
||||
CPPFLAGS = -I/usr/local/include -I/usr/include/alsa
|
||||
CFLAGS = -Wall -O0 -g -Wall -O0 -g
|
||||
# WSJT specific C flags
|
||||
CFLAGS += -DBIGSYM=1
|
||||
DEFS = -DPACKAGE_NAME=\"wsjt\" -DPACKAGE_TARNAME=\"wsjt\" -DPACKAGE_VERSION=\"5.9.2\" -DPACKAGE_STRING=\"wsjt\ 5.9.2\" -DPACKAGE_BUGREPORT=\"\" -DG95_LIB_PATH=\"/u/g95/g95-install/bin/../lib/gcc-lib/i686-pc-linux-gnu/4.0.1//\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_RESOURCE_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_ERRNO_H=1 -DHAVE_SYS_SYSLOG_H=1 -DHAVE_STDDEF_H=1 -DHAVE_LIBGEN_H=1 -DHAVE_SYS_WAIT_H=1 -DHAVE_WAIT_H=1 -DHAVE_STDIO_H=1 -DHAVE_TERMIOS_H=1 -DHAVE_SYS_RESOURCE_H=1 -DHAVE_LINUX_PPDEV_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_FCNTL_H=1 -DHAVE_SYS_IOCTL_H=1 -DTIME_WITH_SYS_TIME=1 -DSTRING_WITH_STRINGS=1 -DSIZEOF_INT64_T=8 -DSIZEOF_LONG_LONG=8 -DNDEBUG=1 -DPREFIX=\"/usr/local/\" -DUSE_SERIAL=1 -DUSE_ALSA=1 -DHAS_ASOUNDLIB_H=1 -DHAS_SOUNDCARD_H=1 -DHAS_SAMPLERATE_H=1
|
||||
CFLAGS += ${DEFS}
|
||||
CPPFLAGS += ${DEFS}
|
||||
|
||||
# WSJT specific Fortran flags
|
||||
#FFLAGS += -Wall -fbounds-check -fno-second-underscore -ffixed-line-length-none
|
||||
FFLAGS += -Wall -fbounds-check -fno-second-underscore
|
||||
#FFLAGS += -cpp -fno-second-underscore
|
||||
# The default rules
|
||||
.c.o:
|
||||
${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${<:.c=.o} $<
|
||||
|
||||
.f.o:
|
||||
${G95} ${CPPFLAGS} ${FFLAGS} -c -o ${<:.f=.o} $<
|
||||
|
||||
.F90.o:
|
||||
${G95} ${CPPFLAGS} ${FFLAGS} -c -o ${<:.F90=.o} $<
|
||||
|
||||
OS=Linux
|
||||
G95=/usr/X11R6/bin/g95
|
||||
COMPILER=/usr/lib/gcc/i686-pc-linux-gnu/3.4.6//
|
||||
#COMPILER=/u/g95/g95-install/bin/../lib/gcc-lib/i686-pc-linux-gnu/4.0.1//
|
||||
FC=/usr/X11R6/bin/g95
|
||||
|
||||
LDFLAGS += -L${COMPILER}
|
||||
LDFLAGS += -lg2c
|
||||
|
||||
PYTHON ?= /usr/X11R6/bin/python
|
||||
RM ?= /usr/X11R6/bin/rm
|
||||
F2PY = /usr/X11R6/bin/f2py
|
||||
|
||||
|
||||
OBJS1 = JT65code.o nchar.o grid2deg.o packmsg.o packtext.o \
|
||||
packcall.o packgrid.o unpackmsg.o unpacktext.o unpackcall.o \
|
||||
unpackgrid.o deg2grid.o packdxcc.o chkmsg.o getpfx1.o \
|
||||
getpfx2.o k2grid.o grid2k.o interleave63.o graycode.o set.o \
|
||||
igray.o init_rs_int.o encode_rs_int.o decode_rs_int.o \
|
||||
wrapkarn.o
|
||||
|
||||
F2PYONLY = ftn_init ftn_quit audio_init spec getfile azdist0 astro0
|
||||
|
||||
SRCS2F90 = abc441.F90 astro0.F90 audio_init.F90 azdist0.f90 \
|
||||
blanker.f90 decode1.F90 decode2.f90 decode3.F90 ftn_init.F90 \
|
||||
ftn_quit.f90 get_fname.F90 getfile.F90 horizspec.f90 hscroll.f90 \
|
||||
i1tor4.f90 pix2d.f90 pix2d65.f90 rfile.f90 savedata.F90 spec.f90 \
|
||||
wsjtgen.F90 runqqq.F90 fivehz.F90
|
||||
OBJS2F90 = ${SRCS2F90:.f90=.o}
|
||||
|
||||
SRCS2F77 = wsjt1.f astro.f azdist.f coord.f dcoord.f deg2grid.f \
|
||||
dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f moon2.f \
|
||||
MoonDop.f sun.f toxyz.f pfxdump.f \
|
||||
avesp2.f bzap.f spec441.f spec2d.f mtdecode.f stdecode.f \
|
||||
indexx.f s2shape.f flat2.f gen65.f chkmsg.f gen6m.f gentone.f \
|
||||
syncf0.f syncf1.f synct.f decode6m.f avemsg6m.f \
|
||||
set.f flatten.f db.f pctile.f sort.f ssort.f ps.f smooth.f \
|
||||
ping.f longx.f peakup.f sync.f detect.f avemsg65.f decode65.f \
|
||||
demod64a.f encode65.f extract.f flat1.f four2.f rfile2.f \
|
||||
gencw.f getpfx1.f getpfx2.f getsnr.f graycode.f grid2k.f \
|
||||
interleave63.f k2grid.f limit.f lpf1.f deep65.f morse.f \
|
||||
nchar.f packcall.f packgrid.f packmsg.f packtext.f setup65.f \
|
||||
short65.f slope.f spec2d65.f sync65.f unpackcall.f \
|
||||
unpackgrid.f unpackmsg.f unpacktext.f xcor.f xfft.f xfft2.f wsjt65.f
|
||||
OBJS2F77 = ${SRCS2F77:.f=.o}
|
||||
|
||||
SRCS2C = init_rs.c encode_rs.c decode_rs.c
|
||||
OBJS2C = ${SRCS2C:.c=.o}
|
||||
|
||||
# ok, so far for now
|
||||
# Windows start_alsa.c will be a2d.f90 jtaudio.c since it uses portaudio
|
||||
# for *nix start_alsa.c will also be a2d.f90, jtaudio.c
|
||||
# and start_portaudio.c for systems using portaudio
|
||||
# for *nix start_alsa.c will be start_alsa.c for alsa
|
||||
# for *nix start_alsa.c will be start_oss.c for oss
|
||||
#
|
||||
# ptt_unix.c vs. ptt.c I'll sort out later.
|
||||
# ditto for cutil.c (only used on *nix)
|
||||
# --db
|
||||
# jtaudio.c/start_threads.c mess will have to be sorted out later
|
||||
# to minimise #ifdef's
|
||||
# --db
|
||||
# and mostly sorted
|
||||
# --db
|
||||
#
|
||||
SRCS3C = ptt_unix.c igray.c wrapkarn.c cutil.c
|
||||
OBJS3C = ${SRCS3C:.c=.o}
|
||||
AUDIOSRCS = start_alsa.c
|
||||
|
||||
all: wsjt6
|
||||
JT65code: $(OBJS1)
|
||||
$(FC) -o JT65code $(OBJS1)
|
||||
|
||||
wsjt6: Audio.so #wsjt.spec
|
||||
# ${PYTHON} c:\python23\installer\Build.py wsjt.spec
|
||||
# ${RM} wsjt6
|
||||
|
||||
#
|
||||
#
|
||||
Audio.so: $(OBJS2C) $(OBJS3C) $(OBJS2F77) $(SRCS2F90) $(AUDIOSRCS)
|
||||
${F2PY} -c --quiet --opt="-O -D${CFLAGS} \
|
||||
-fno-second-underscore" $(OBJS2C) $(OBJS2F77) -m Audio \
|
||||
--f77exec=${G95} --f90exec=${G95} ${CPPFLAGS} ${LDFLAGS} \
|
||||
only: $(F2PYONLY) \
|
||||
: $(SRCS2F90) \
|
||||
${SRCS3C} ${AUDIOSRCS}
|
||||
|
||||
wsjt.spec: wsjt.py astro.py g.py options.py palettes.py smeter.py specjt.py
|
||||
# ${PYTHON} c:\python23\installer\makespec.py --icon wsjt.ico \
|
||||
# --tk --onefile wsjt.py
|
||||
|
||||
|
||||
.PHONY : clean
|
||||
clean:
|
||||
${RM} -f *.o *.so *~ JT65code wsjt6
|
||||
|
@ -1,120 +0,0 @@
|
||||
CC ?= gcc
|
||||
FFLAGS = -g -O2 -fPIC
|
||||
LDFLAGS = -L/usr/local/lib -lpthread -lasound
|
||||
CPPFLAGS = -I/usr/local/include -I/usr/include/alsa -I.
|
||||
CFLAGS = -Wall -O0 -g -Wall -O0 -g -fPIC
|
||||
# WSJT specific C flags
|
||||
CFLAGS += -DBIGSYM=1
|
||||
DEFS = -DPACKAGE_NAME=\"wsjt\" -DPACKAGE_TARNAME=\"wsjt\" -DPACKAGE_VERSION=\"5.9.2\" -DPACKAGE_STRING=\"wsjt\ 5.9.2\" -DPACKAGE_BUGREPORT=\"\" -DG95_LIB_PATH=\"/usr/lib/gcc/x86_64-linux-gnu/4.0.3/\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_RESOURCE_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_ERRNO_H=1 -DHAVE_SYS_SYSLOG_H=1 -DHAVE_STDDEF_H=1 -DHAVE_LIBGEN_H=1 -DHAVE_SYS_WAIT_H=1 -DHAVE_WAIT_H=1 -DHAVE_STDIO_H=1 -DHAVE_TERMIOS_H=1 -DHAVE_SYS_RESOURCE_H=1 -DHAVE_LINUX_PPDEV_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_FCNTL_H=1 -DHAVE_SYS_IOCTL_H=1 -DTIME_WITH_SYS_TIME=1 -DSTRING_WITH_STRINGS=1 -DSIZEOF_INT64_T=8 -DSIZEOF_LONG_LONG=8 -DNDEBUG=1 -DPREFIX=\"/usr/local/\" -DUSE_SERIAL=1 -DUSE_ALSA=1 -DHAS_ASOUNDLIB_H=1 -DHAS_SOUNDCARD_H=1
|
||||
CFLAGS += ${DEFS}
|
||||
CPPFLAGS += ${DEFS}
|
||||
|
||||
# WSJT specific Fortran flags
|
||||
FFLAGS += -Wall -fbounds-check -fno-second-underscore -ffixed-line-length-none
|
||||
#FFLAGS += -Wall -fbounds-check -fno-second-underscore
|
||||
#FFLAGS += -cpp -fno-second-underscore
|
||||
# The default rules
|
||||
.c.o:
|
||||
${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${<:.c=.o} $<
|
||||
|
||||
.f.o:
|
||||
${G95} ${CPPFLAGS} ${FFLAGS} -c -o ${<:.f=.o} $<
|
||||
|
||||
.F90.o:
|
||||
${G95} ${CPPFLAGS} ${FFLAGS} -c -o ${<:.F90=.o} $<
|
||||
|
||||
OS=Linux
|
||||
G95=/usr/bin/g95
|
||||
COMPILER=/usr/lib/gcc/x86_64-linux-gnu/4.0.3/
|
||||
FC=/usr/bin/g95
|
||||
|
||||
LDFLAGS += -L${COMPILER}
|
||||
LDFLAGS += -lg2c
|
||||
|
||||
PYTHON ?= /usr/bin/python
|
||||
RM ?= /bin/rm
|
||||
F2PY = /usr/bin/f2py
|
||||
|
||||
|
||||
OBJS1 = JT65code.o nchar.o grid2deg.o packmsg.o packtext.o \
|
||||
packcall.o packgrid.o unpackmsg.o unpacktext.o unpackcall.o \
|
||||
unpackgrid.o deg2grid.o packdxcc.o chkmsg.o getpfx1.o \
|
||||
getpfx2.o k2grid.o grid2k.o interleave63.o graycode.o set.o \
|
||||
igray.o init_rs_int.o encode_rs_int.o decode_rs_int.o \
|
||||
wrapkarn.o
|
||||
|
||||
F2PYONLY = ftn_init ftn_quit audio_init spec getfile azdist0 astro0
|
||||
|
||||
SRCS2F90 = abc441.F90 astro0.F90 audio_init.F90 azdist0.f90 \
|
||||
blanker.f90 decode1.F90 decode2.f90 decode3.F90 ftn_init.F90 \
|
||||
ftn_quit.f90 get_fname.F90 getfile.F90 horizspec.f90 hscroll.f90 \
|
||||
i1tor4.f90 pix2d.f90 pix2d65.f90 rfile.f90 savedata.F90 spec.f90 \
|
||||
wsjtgen.F90 runqqq.F90 fivehz.F90
|
||||
OBJS2F90 = ${SRCS2F90:.f90=.o}
|
||||
|
||||
SRCS2F77 = wsjt1.f astro.f azdist.f coord.f dcoord.f deg2grid.f \
|
||||
dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f moon2.f \
|
||||
MoonDop.f sun.f toxyz.f pfxdump.f \
|
||||
avesp2.f bzap.f spec441.f spec2d.f mtdecode.f stdecode.f \
|
||||
indexx.f s2shape.f flat2.f gen65.f chkmsg.f gen6m.f gentone.f \
|
||||
syncf0.f syncf1.f synct.f decode6m.f avemsg6m.f \
|
||||
set.f flatten.f db.f pctile.f sort.f ssort.f ps.f smooth.f \
|
||||
ping.f longx.f peakup.f sync.f detect.f avemsg65.f decode65.f \
|
||||
demod64a.f encode65.f extract.f flat1.f four2.f rfile2.f \
|
||||
gencw.f getpfx1.f getpfx2.f getsnr.f graycode.f grid2k.f \
|
||||
interleave63.f k2grid.f limit.f lpf1.f deep65.f morse.f \
|
||||
nchar.f packcall.f packgrid.f packmsg.f packtext.f setup65.f \
|
||||
short65.f slope.f spec2d65.f sync65.f unpackcall.f \
|
||||
unpackgrid.f unpackmsg.f unpacktext.f xcor.f xfft.f xfft2.f wsjt65.f
|
||||
OBJS2F77 = ${SRCS2F77:.f=.o}
|
||||
|
||||
SRCS2C = init_rs.c encode_rs.c decode_rs.c
|
||||
OBJS2C = ${SRCS2C:.c=.o}
|
||||
|
||||
# ok, so far for now
|
||||
# Windows start_alsa.c will be a2d.f90 jtaudio.c since it uses portaudio
|
||||
# for *nix start_alsa.c will also be a2d.f90, jtaudio.c
|
||||
# and start_portaudio.c for systems using portaudio
|
||||
# for *nix start_alsa.c will be start_alsa.c for alsa
|
||||
# for *nix start_alsa.c will be start_oss.c for oss
|
||||
#
|
||||
# ptt_unix.c vs. ptt.c I'll sort out later.
|
||||
# ditto for cutil.c (only used on *nix)
|
||||
# --db
|
||||
# jtaudio.c/start_threads.c mess will have to be sorted out later
|
||||
# to minimise #ifdef's
|
||||
# --db
|
||||
# and mostly sorted
|
||||
# --db
|
||||
#
|
||||
SRCS3C = ptt_unix.c igray.c wrapkarn.c cutil.c
|
||||
OBJS3C = ${SRCS3C:.c=.o}
|
||||
AUDIOSRCS = start_alsa.c
|
||||
|
||||
all: wsjt6
|
||||
JT65code: $(OBJS1)
|
||||
$(FC) -o JT65code $(OBJS1)
|
||||
|
||||
wsjt6: Audio.so #wsjt.spec
|
||||
# ${PYTHON} c:\python23\installer\Build.py wsjt.spec
|
||||
# ${RM} wsjt6
|
||||
|
||||
#
|
||||
#
|
||||
Audio.so: $(OBJS2C) $(OBJS3C) $(OBJS2F77) $(SRCS2F90) $(AUDIOSRCS)
|
||||
${F2PY} -c --opt="-O ${CFLAGS} -fPIC \
|
||||
-fno-second-underscore" $(OBJS2C) $(OBJS2F77) -m Audio \
|
||||
--f77exec=${G95} --f90exec=${G95} ${CPPFLAGS} ${LDFLAGS} \
|
||||
only: $(F2PYONLY) \
|
||||
: $(SRCS2F90) \
|
||||
${SRCS3C} ${AUDIOSRCS}
|
||||
|
||||
wsjt.spec: wsjt.py astro.py g.py options.py palettes.py smeter.py specjt.py
|
||||
# ${PYTHON} c:\python23\installer\makespec.py --icon wsjt.ico \
|
||||
# --tk --onefile wsjt.py
|
||||
|
||||
|
||||
.PHONY : clean
|
||||
clean:
|
||||
${RM} -f *.o *.so *~ JT65code wsjt6
|
||||
|
643
PmwBlt.py
643
PmwBlt.py
@ -1,643 +0,0 @@
|
||||
# Python interface to some of the commands of the 2.4 version of the
|
||||
# BLT extension to tcl.
|
||||
|
||||
import string
|
||||
import types
|
||||
import Tkinter
|
||||
|
||||
# Supported commands:
|
||||
_busyCommand = '::blt::busy'
|
||||
_vectorCommand = '::blt::vector'
|
||||
_graphCommand = '::blt::graph'
|
||||
_testCommand = '::blt::*'
|
||||
_chartCommand = '::blt::stripchart'
|
||||
_tabsetCommand = '::blt::tabset'
|
||||
|
||||
_haveBlt = None
|
||||
_haveBltBusy = None
|
||||
|
||||
def _checkForBlt(window):
|
||||
global _haveBlt
|
||||
global _haveBltBusy
|
||||
|
||||
# Blt may be a package which has not yet been loaded. Try to load it.
|
||||
try:
|
||||
window.tk.call('package', 'require', 'BLT')
|
||||
except Tkinter.TclError:
|
||||
# Another way to try to dynamically load blt:
|
||||
try:
|
||||
window.tk.call('load', '', 'Blt')
|
||||
except Tkinter.TclError:
|
||||
pass
|
||||
|
||||
_haveBlt= (window.tk.call('info', 'commands', _testCommand) != '')
|
||||
_haveBltBusy = (window.tk.call('info', 'commands', _busyCommand) != '')
|
||||
|
||||
def haveblt(window):
|
||||
if _haveBlt is None:
|
||||
_checkForBlt(window)
|
||||
return _haveBlt
|
||||
|
||||
def havebltbusy(window):
|
||||
if _haveBlt is None:
|
||||
_checkForBlt(window)
|
||||
return _haveBltBusy
|
||||
|
||||
def _loadBlt(window):
|
||||
if _haveBlt is None:
|
||||
if window is None:
|
||||
window = Tkinter._default_root
|
||||
if window is None:
|
||||
window = Tkinter.Tk()
|
||||
_checkForBlt(window)
|
||||
|
||||
def busy_hold(window, cursor = None):
|
||||
_loadBlt(window)
|
||||
if cursor is None:
|
||||
window.tk.call(_busyCommand, 'hold', window._w)
|
||||
else:
|
||||
window.tk.call(_busyCommand, 'hold', window._w, '-cursor', cursor)
|
||||
|
||||
def busy_release(window):
|
||||
_loadBlt(window)
|
||||
window.tk.call(_busyCommand, 'release', window._w)
|
||||
|
||||
def busy_forget(window):
|
||||
_loadBlt(window)
|
||||
window.tk.call(_busyCommand, 'forget', window._w)
|
||||
|
||||
#=============================================================================
|
||||
# Interface to the blt vector command which makes it look like the
|
||||
# builtin python list type.
|
||||
# The -variable, -command, -watchunset creation options are not supported.
|
||||
# The dup, merge, notify, offset, populate, seq and variable methods
|
||||
# and the +, -, * and / operations are not supported.
|
||||
|
||||
# Blt vector functions:
|
||||
def vector_expr(expression):
|
||||
tk = Tkinter._default_root.tk
|
||||
strList = tk.splitlist(tk.call(_vectorCommand, 'expr', expression))
|
||||
return tuple(map(string.atof, strList))
|
||||
|
||||
def vector_names(pattern = None):
|
||||
tk = Tkinter._default_root.tk
|
||||
return tk.splitlist(tk.call(_vectorCommand, 'names', pattern))
|
||||
|
||||
class Vector:
|
||||
_varnum = 0
|
||||
def __init__(self, size=None, master=None):
|
||||
# <size> can be either an integer size, or a string "first:last".
|
||||
_loadBlt(master)
|
||||
if master:
|
||||
self._master = master
|
||||
else:
|
||||
self._master = Tkinter._default_root
|
||||
self.tk = self._master.tk
|
||||
self._name = 'PY_VEC' + str(Vector._varnum)
|
||||
Vector._varnum = Vector._varnum + 1
|
||||
if size is None:
|
||||
self.tk.call(_vectorCommand, 'create', self._name)
|
||||
else:
|
||||
self.tk.call(_vectorCommand, 'create', '%s(%s)' % (self._name, size))
|
||||
def __del__(self):
|
||||
self.tk.call(_vectorCommand, 'destroy', self._name)
|
||||
def __str__(self):
|
||||
return self._name
|
||||
|
||||
def __repr__(self):
|
||||
return '[' + string.join(map(str, self), ', ') + ']'
|
||||
def __cmp__(self, list):
|
||||
return cmp(self[:], list)
|
||||
|
||||
def __len__(self):
|
||||
return self.tk.getint(self.tk.call(self._name, 'length'))
|
||||
def __getitem__(self, key):
|
||||
oldkey = key
|
||||
if key < 0:
|
||||
key = key + len(self)
|
||||
try:
|
||||
return self.tk.getdouble(self.tk.globalgetvar(self._name, str(key)))
|
||||
except Tkinter.TclError:
|
||||
raise IndexError, oldkey
|
||||
def __setitem__(self, key, value):
|
||||
if key < 0:
|
||||
key = key + len(self)
|
||||
return self.tk.globalsetvar(self._name, str(key), float(value))
|
||||
|
||||
def __delitem__(self, key):
|
||||
if key < 0:
|
||||
key = key + len(self)
|
||||
return self.tk.globalunsetvar(self._name, str(key))
|
||||
|
||||
def __getslice__(self, start, end):
|
||||
length = len(self)
|
||||
if start < 0:
|
||||
start = 0
|
||||
if end > length:
|
||||
end = length
|
||||
if start >= end:
|
||||
return []
|
||||
end = end - 1 # Blt vector slices include end point.
|
||||
text = self.tk.globalgetvar(self._name, str(start) + ':' + str(end))
|
||||
return map(self.tk.getdouble, self.tk.splitlist(text))
|
||||
|
||||
def __setslice__(self, start, end, list):
|
||||
if start > end:
|
||||
end = start
|
||||
self.set(self[:start] + list + self[end:])
|
||||
|
||||
def __delslice__(self, start, end):
|
||||
if start < end:
|
||||
self.set(self[:start] + self[end:])
|
||||
|
||||
def __add__(self, list):
|
||||
return self[:] + list
|
||||
def __radd__(self, list):
|
||||
return list + self[:]
|
||||
def __mul__(self, n):
|
||||
return self[:] * n
|
||||
__rmul__ = __mul__
|
||||
|
||||
# Python builtin list methods:
|
||||
def append(self, *args):
|
||||
self.tk.call(self._name, 'append', args)
|
||||
def count(self, obj):
|
||||
return self[:].count(obj)
|
||||
def index(self, value):
|
||||
return self[:].index(value)
|
||||
def insert(self, index, value):
|
||||
self[index:index] = [value]
|
||||
def remove(self, value):
|
||||
del self[self.index(value)]
|
||||
def reverse(self):
|
||||
s = self[:]
|
||||
s.reverse()
|
||||
self.set(s)
|
||||
def sort(self, *args):
|
||||
s = self[:]
|
||||
s.sort()
|
||||
self.set(s)
|
||||
|
||||
# Blt vector instance methods:
|
||||
# append - same as list method above
|
||||
def clear(self):
|
||||
self.tk.call(self._name, 'clear')
|
||||
def delete(self, *args):
|
||||
self.tk.call((self._name, 'delete') + args)
|
||||
def expr(self, expression):
|
||||
self.tk.call(self._name, 'expr', expression)
|
||||
def length(self, newSize=None):
|
||||
return self.tk.getint(self.tk.call(self._name, 'length', newSize))
|
||||
def range(self, first, last=None):
|
||||
# Note that, unlike self[first:last], this includes the last
|
||||
# item in the returned range.
|
||||
text = self.tk.call(self._name, 'range', first, last)
|
||||
return map(self.tk.getdouble, self.tk.splitlist(text))
|
||||
def search(self, start, end=None):
|
||||
return self._master._getints(self.tk.call(
|
||||
self._name, 'search', start, end))
|
||||
def set(self, list):
|
||||
if type(list) != types.TupleType:
|
||||
list = tuple(list)
|
||||
self.tk.call(self._name, 'set', list)
|
||||
|
||||
# The blt vector sort method has different semantics to the python
|
||||
# list sort method. Call these blt_sort:
|
||||
def blt_sort(self, *args):
|
||||
self.tk.call((self._name, 'sort') + args)
|
||||
def blt_sort_reverse(self, *args):
|
||||
self.tk.call((self._name, 'sort', '-reverse') + args)
|
||||
|
||||
# Special blt vector indexes:
|
||||
def min(self):
|
||||
return self.tk.getdouble(self.tk.globalgetvar(self._name, 'min'))
|
||||
def max(self):
|
||||
return self.tk.getdouble(self.tk.globalgetvar(self._name, 'max'))
|
||||
|
||||
# Method borrowed from Tkinter.Var class:
|
||||
def get(self):
|
||||
return self[:]
|
||||
|
||||
#=============================================================================
|
||||
|
||||
# This is a general purpose configure routine which can handle the
|
||||
# configuration of widgets, items within widgets, etc. Supports the
|
||||
# forms configure() and configure('font') for querying and
|
||||
# configure(font = 'fixed', text = 'hello') for setting.
|
||||
|
||||
def _doConfigure(widget, subcommand, option, kw):
|
||||
|
||||
if not option and not kw:
|
||||
# Return a description of all options.
|
||||
ret = {}
|
||||
options = widget.tk.splitlist(widget.tk.call(subcommand))
|
||||
for optionString in options:
|
||||
optionInfo = widget.tk.splitlist(optionString)
|
||||
option = optionInfo[0][1:]
|
||||
ret[option] = (option,) + optionInfo[1:]
|
||||
return ret
|
||||
|
||||
if option:
|
||||
# Return a description of the option given by <option>.
|
||||
if kw:
|
||||
# Having keywords implies setting configuration options.
|
||||
# Can't set and get in one command!
|
||||
raise ValueError, 'cannot have option argument with keywords'
|
||||
option = '-' + option
|
||||
optionInfo = widget.tk.splitlist(widget.tk.call(subcommand + (option,)))
|
||||
return (optionInfo[0][1:],) + optionInfo[1:]
|
||||
|
||||
# Otherwise, set the given configuration options.
|
||||
widget.tk.call(subcommand + widget._options(kw))
|
||||
|
||||
#=============================================================================
|
||||
|
||||
class Graph(Tkinter.Widget):
|
||||
# Wrapper for the blt graph widget, version 2.4.
|
||||
|
||||
def __init__(self, master=None, cnf={}, **kw):
|
||||
_loadBlt(master)
|
||||
Tkinter.Widget.__init__(self, master, _graphCommand, cnf, kw)
|
||||
|
||||
def bar_create(self, name, **kw):
|
||||
self.tk.call((self._w, 'bar', 'create', name) + self._options(kw))
|
||||
|
||||
def line_create(self, name, **kw):
|
||||
self.tk.call((self._w, 'line', 'create', name) + self._options(kw))
|
||||
|
||||
def extents(self, item):
|
||||
return self.tk.getint(self.tk.call(self._w, 'extents', item))
|
||||
|
||||
def invtransform(self, winX, winY):
|
||||
return self._getdoubles(
|
||||
self.tk.call(self._w, 'invtransform', winX, winY))
|
||||
|
||||
def inside(self, x, y):
|
||||
return self.tk.getint(self.tk.call(self._w, 'inside', x, y))
|
||||
|
||||
def snap(self, photoName):
|
||||
self.tk.call(self._w, 'snap', photoName)
|
||||
|
||||
def transform(self, x, y):
|
||||
return self._getdoubles(self.tk.call(self._w, 'transform', x, y))
|
||||
|
||||
def axis_cget(self, axisName, key):
|
||||
return self.tk.call(self._w, 'axis', 'cget', axisName, '-' + key)
|
||||
def axis_configure(self, axes, option=None, **kw):
|
||||
# <axes> may be a list of axisNames.
|
||||
if type(axes) == types.StringType:
|
||||
axes = [axes]
|
||||
subcommand = (self._w, 'axis', 'configure') + tuple(axes)
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
def axis_create(self, axisName, **kw):
|
||||
self.tk.call((self._w, 'axis', 'create', axisName) + self._options(kw))
|
||||
def axis_delete(self, *args):
|
||||
self.tk.call((self._w, 'axis', 'delete') + args)
|
||||
def axis_invtransform(self, axisName, value):
|
||||
return self.tk.getdouble(self.tk.call(
|
||||
self._w, 'axis', 'invtransform', axisName, value))
|
||||
def axis_limits(self, axisName):
|
||||
return self._getdoubles(self.tk.call(
|
||||
self._w, 'axis', 'limits', axisName))
|
||||
def axis_names(self, *args):
|
||||
return self.tk.splitlist(
|
||||
self.tk.call((self._w, 'axis', 'names') + args))
|
||||
def axis_transform(self, axisName, value):
|
||||
return self.tk.getint(self.tk.call(
|
||||
self._w, 'axis', 'transform', axisName, value))
|
||||
|
||||
def xaxis_cget(self, key):
|
||||
return self.tk.call(self._w, 'xaxis', 'cget', '-' + key)
|
||||
def xaxis_configure(self, option=None, **kw):
|
||||
subcommand = (self._w, 'xaxis', 'configure')
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
def xaxis_invtransform(self, value):
|
||||
return self.tk.getdouble(self.tk.call(
|
||||
self._w, 'xaxis', 'invtransform', value))
|
||||
def xaxis_limits(self):
|
||||
return self._getdoubles(self.tk.call(self._w, 'xaxis', 'limits'))
|
||||
def xaxis_transform(self, value):
|
||||
return self.tk.getint(self.tk.call(
|
||||
self._w, 'xaxis', 'transform', value))
|
||||
def xaxis_use(self, axisName = None):
|
||||
return self.tk.call(self._w, 'xaxis', 'use', axisName)
|
||||
|
||||
def x2axis_cget(self, key):
|
||||
return self.tk.call(self._w, 'x2axis', 'cget', '-' + key)
|
||||
def x2axis_configure(self, option=None, **kw):
|
||||
subcommand = (self._w, 'x2axis', 'configure')
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
def x2axis_invtransform(self, value):
|
||||
return self.tk.getdouble(self.tk.call(
|
||||
self._w, 'x2axis', 'invtransform', value))
|
||||
def x2axis_limits(self):
|
||||
return self._getdoubles(self.tk.call(self._w, 'x2axis', 'limits'))
|
||||
def x2axis_transform(self, value):
|
||||
return self.tk.getint(self.tk.call(
|
||||
self._w, 'x2axis', 'transform', value))
|
||||
def x2axis_use(self, axisName = None):
|
||||
return self.tk.call(self._w, 'x2axis', 'use', axisName)
|
||||
|
||||
def yaxis_cget(self, key):
|
||||
return self.tk.call(self._w, 'yaxis', 'cget', '-' + key)
|
||||
def yaxis_configure(self, option=None, **kw):
|
||||
subcommand = (self._w, 'yaxis', 'configure')
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
def yaxis_invtransform(self, value):
|
||||
return self.tk.getdouble(self.tk.call(
|
||||
self._w, 'yaxis', 'invtransform', value))
|
||||
def yaxis_limits(self):
|
||||
return self._getdoubles(self.tk.call(self._w, 'yaxis', 'limits'))
|
||||
def yaxis_transform(self, value):
|
||||
return self.tk.getint(self.tk.call(
|
||||
self._w, 'yaxis', 'transform', value))
|
||||
def yaxis_use(self, axisName = None):
|
||||
return self.tk.call(self._w, 'yaxis', 'use', axisName)
|
||||
|
||||
def y2axis_cget(self, key):
|
||||
return self.tk.call(self._w, 'y2axis', 'cget', '-' + key)
|
||||
def y2axis_configure(self, option=None, **kw):
|
||||
subcommand = (self._w, 'y2axis', 'configure')
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
def y2axis_invtransform(self, value):
|
||||
return self.tk.getdouble(self.tk.call(
|
||||
self._w, 'y2axis', 'invtransform', value))
|
||||
def y2axis_limits(self):
|
||||
return self._getdoubles(self.tk.call(self._w, 'y2axis', 'limits'))
|
||||
def y2axis_transform(self, value):
|
||||
return self.tk.getint(self.tk.call(
|
||||
self._w, 'y2axis', 'transform', value))
|
||||
def y2axis_use(self, axisName = None):
|
||||
return self.tk.call(self._w, 'y2axis', 'use', axisName)
|
||||
|
||||
def crosshairs_cget(self, key):
|
||||
return self.tk.call(self._w, 'crosshairs', 'cget', '-' + key)
|
||||
def crosshairs_configure(self, option=None, **kw):
|
||||
subcommand = (self._w, 'crosshairs', 'configure')
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
def crosshairs_off(self):
|
||||
self.tk.call(self._w, 'crosshairs', 'off')
|
||||
def crosshairs_on(self):
|
||||
self.tk.call(self._w, 'crosshairs', 'on')
|
||||
def crosshairs_toggle(self):
|
||||
self.tk.call(self._w, 'crosshairs', 'toggle')
|
||||
|
||||
def element_activate(self, name, *args):
|
||||
self.tk.call((self._w, 'element', 'activate', name) + args)
|
||||
def element_bind(self, tagName, sequence=None, func=None, add=None):
|
||||
return self._bind((self._w, 'element', 'bind', tagName),
|
||||
sequence, func, add)
|
||||
def element_unbind(self, tagName, sequence, funcid=None):
|
||||
self.tk.call(self._w, 'element', 'bind', tagName, sequence, '')
|
||||
if funcid:
|
||||
self.deletecommand(funcid)
|
||||
|
||||
def element_cget(self, name, key):
|
||||
return self.tk.call(self._w, 'element', 'cget', name, '-' + key)
|
||||
|
||||
def element_closest(self, x, y, *args, **kw):
|
||||
var = 'python_private_1'
|
||||
success = self.tk.getint(self.tk.call(
|
||||
(self._w, 'element', 'closest', x, y, var) +
|
||||
self._options(kw) + args))
|
||||
if success:
|
||||
rtn = {}
|
||||
rtn['dist'] = self.tk.getdouble(self.tk.globalgetvar(var, 'dist'))
|
||||
rtn['x'] = self.tk.getdouble(self.tk.globalgetvar(var, 'x'))
|
||||
rtn['y'] = self.tk.getdouble(self.tk.globalgetvar(var, 'y'))
|
||||
rtn['index'] = self.tk.getint(self.tk.globalgetvar(var, 'index'))
|
||||
rtn['name'] = self.tk.globalgetvar(var, 'name')
|
||||
return rtn
|
||||
else:
|
||||
return None
|
||||
|
||||
def element_configure(self, names, option=None, **kw):
|
||||
# <names> may be a list of elemNames.
|
||||
if type(names) == types.StringType:
|
||||
names = [names]
|
||||
subcommand = (self._w, 'element', 'configure') + tuple(names)
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
|
||||
def element_deactivate(self, *args):
|
||||
self.tk.call((self._w, 'element', 'deactivate') + args)
|
||||
|
||||
def element_delete(self, *args):
|
||||
self.tk.call((self._w, 'element', 'delete') + args)
|
||||
def element_exists(self, name):
|
||||
return self.tk.getboolean(
|
||||
self.tk.call(self._w, 'element', 'exists', name))
|
||||
|
||||
def element_names(self, *args):
|
||||
return self.tk.splitlist(
|
||||
self.tk.call((self._w, 'element', 'names') + args))
|
||||
def element_show(self, nameList=None):
|
||||
if nameList is not None:
|
||||
nameList = tuple(nameList)
|
||||
return self.tk.splitlist(
|
||||
self.tk.call(self._w, 'element', 'show', nameList))
|
||||
def element_type(self, name):
|
||||
return self.tk.call(self._w, 'element', 'type', name)
|
||||
|
||||
def grid_cget(self, key):
|
||||
return self.tk.call(self._w, 'grid', 'cget', '-' + key)
|
||||
def grid_configure(self, option=None, **kw):
|
||||
subcommand = (self._w, 'grid', 'configure')
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
|
||||
def grid_off(self):
|
||||
self.tk.call(self._w, 'grid', 'off')
|
||||
def grid_on(self):
|
||||
self.tk.call(self._w, 'grid', 'on')
|
||||
def grid_toggle(self):
|
||||
self.tk.call(self._w, 'grid', 'toggle')
|
||||
|
||||
def legend_activate(self, *args):
|
||||
self.tk.call((self._w, 'legend', 'activate') + args)
|
||||
def legend_bind(self, tagName, sequence=None, func=None, add=None):
|
||||
return self._bind((self._w, 'legend', 'bind', tagName),
|
||||
sequence, func, add)
|
||||
def legend_unbind(self, tagName, sequence, funcid=None):
|
||||
self.tk.call(self._w, 'legend', 'bind', tagName, sequence, '')
|
||||
if funcid:
|
||||
self.deletecommand(funcid)
|
||||
|
||||
def legend_cget(self, key):
|
||||
return self.tk.call(self._w, 'legend', 'cget', '-' + key)
|
||||
def legend_configure(self, option=None, **kw):
|
||||
subcommand = (self._w, 'legend', 'configure')
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
def legend_deactivate(self, *args):
|
||||
self.tk.call((self._w, 'legend', 'deactivate') + args)
|
||||
def legend_get(self, pos):
|
||||
return self.tk.call(self._w, 'legend', 'get', pos)
|
||||
|
||||
def pen_cget(self, name, key):
|
||||
return self.tk.call(self._w, 'pen', 'cget', name, '-' + key)
|
||||
def pen_configure(self, names, option=None, **kw):
|
||||
# <names> may be a list of penNames.
|
||||
if type(names) == types.StringType:
|
||||
names = [names]
|
||||
subcommand = (self._w, 'pen', 'configure') + tuple(names)
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
def pen_create(self, name, **kw):
|
||||
self.tk.call((self._w, 'pen', 'create', name) + self._options(kw))
|
||||
def pen_delete(self, *args):
|
||||
self.tk.call((self._w, 'pen', 'delete') + args)
|
||||
def pen_names(self, *args):
|
||||
return self.tk.splitlist(self.tk.call((self._w, 'pen', 'names') + args))
|
||||
|
||||
def postscript_cget(self, key):
|
||||
return self.tk.call(self._w, 'postscript', 'cget', '-' + key)
|
||||
def postscript_configure(self, option=None, **kw):
|
||||
subcommand = (self._w, 'postscript', 'configure')
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
def postscript_output(self, fileName=None, **kw):
|
||||
prefix = (self._w, 'postscript', 'output')
|
||||
if fileName is None:
|
||||
return self.tk.call(prefix + self._options(kw))
|
||||
else:
|
||||
self.tk.call(prefix + (fileName,) + self._options(kw))
|
||||
|
||||
def marker_after(self, first, second=None):
|
||||
self.tk.call(self._w, 'marker', 'after', first, second)
|
||||
def marker_before(self, first, second=None):
|
||||
self.tk.call(self._w, 'marker', 'before', first, second)
|
||||
def marker_bind(self, tagName, sequence=None, func=None, add=None):
|
||||
return self._bind((self._w, 'marker', 'bind', tagName),
|
||||
sequence, func, add)
|
||||
def marker_unbind(self, tagName, sequence, funcid=None):
|
||||
self.tk.call(self._w, 'marker', 'bind', tagName, sequence, '')
|
||||
if funcid:
|
||||
self.deletecommand(funcid)
|
||||
|
||||
def marker_cget(self, name, key):
|
||||
return self.tk.call(self._w, 'marker', 'cget', name, '-' + key)
|
||||
def marker_configure(self, names, option=None, **kw):
|
||||
# <names> may be a list of markerIds.
|
||||
if type(names) == types.StringType:
|
||||
names = [names]
|
||||
subcommand = (self._w, 'marker', 'configure') + tuple(names)
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
def marker_create(self, type, **kw):
|
||||
return self.tk.call(
|
||||
(self._w, 'marker', 'create', type) + self._options(kw))
|
||||
|
||||
def marker_delete(self, *args):
|
||||
self.tk.call((self._w, 'marker', 'delete') + args)
|
||||
def marker_exists(self, name):
|
||||
return self.tk.getboolean(
|
||||
self.tk.call(self._w, 'marker', 'exists', name))
|
||||
def marker_names(self, *args):
|
||||
return self.tk.splitlist(
|
||||
self.tk.call((self._w, 'marker', 'names') + args))
|
||||
def marker_type(self, name):
|
||||
type = self.tk.call(self._w, 'marker', 'type', name)
|
||||
if type == '':
|
||||
type = None
|
||||
return type
|
||||
|
||||
#=============================================================================
|
||||
class Stripchart(Graph):
|
||||
# Wrapper for the blt stripchart widget, version 2.4.
|
||||
|
||||
def __init__(self, master=None, cnf={}, **kw):
|
||||
_loadBlt(master)
|
||||
Tkinter.Widget.__init__(self, master, _chartCommand, cnf, kw)
|
||||
|
||||
#=============================================================================
|
||||
class Tabset(Tkinter.Widget):
|
||||
|
||||
# Wrapper for the blt TabSet widget, version 2.4.
|
||||
|
||||
def __init__(self, master=None, cnf={}, **kw):
|
||||
_loadBlt(master)
|
||||
Tkinter.Widget.__init__(self, master, _tabsetCommand, cnf, kw)
|
||||
|
||||
def activate(self, tabIndex):
|
||||
self.tk.call(self._w, 'activate', tabIndex)
|
||||
|
||||
# This is the 'bind' sub-command:
|
||||
def tag_bind(self, tagName, sequence=None, func=None, add=None):
|
||||
return self._bind((self._w, 'bind', tagName), sequence, func, add)
|
||||
|
||||
def tag_unbind(self, tagName, sequence, funcid=None):
|
||||
self.tk.call(self._w, 'bind', tagName, sequence, '')
|
||||
if funcid:
|
||||
self.deletecommand(funcid)
|
||||
|
||||
def delete(self, first, last = None):
|
||||
self.tk.call(self._w, 'delete', first, last)
|
||||
|
||||
# This is the 'focus' sub-command:
|
||||
def tab_focus(self, tabIndex):
|
||||
self.tk.call(self._w, 'focus', tabIndex)
|
||||
|
||||
def get(self, tabIndex):
|
||||
return self.tk.call(self._w, 'get', tabIndex)
|
||||
|
||||
def index(self, tabIndex):
|
||||
index = self.tk.call(self._w, 'index', tabIndex)
|
||||
if index == '':
|
||||
return None
|
||||
else:
|
||||
return self.tk.getint(self.tk.call(self._w, 'index', tabIndex))
|
||||
|
||||
def insert(self, position, name1, *names, **kw):
|
||||
self.tk.call(
|
||||
(self._w, 'insert', position, name1) + names + self._options(kw))
|
||||
|
||||
def invoke(self, tabIndex):
|
||||
return self.tk.call(self._w, 'invoke', tabIndex)
|
||||
|
||||
def move(self, tabIndex1, beforeOrAfter, tabIndex2):
|
||||
self.tk.call(self._w, 'move', tabIndex1, beforeOrAfter, tabIndex2)
|
||||
|
||||
def nearest(self, x, y):
|
||||
return self.tk.call(self._w, 'nearest', x, y)
|
||||
|
||||
def scan_mark(self, x, y):
|
||||
self.tk.call(self._w, 'scan', 'mark', x, y)
|
||||
|
||||
def scan_dragto(self, x, y):
|
||||
self.tk.call(self._w, 'scan', 'dragto', x, y)
|
||||
|
||||
def see(self, index):
|
||||
self.tk.call(self._w, 'see', index)
|
||||
|
||||
def see(self, tabIndex):
|
||||
self.tk.call(self._w,'see',tabIndex)
|
||||
|
||||
def size(self):
|
||||
return self.tk.getint(self.tk.call(self._w, 'size'))
|
||||
|
||||
def tab_cget(self, tabIndex, option):
|
||||
if option[:1] != '-':
|
||||
option = '-' + option
|
||||
if option[-1:] == '_':
|
||||
option = option[:-1]
|
||||
return self.tk.call(self._w, 'tab', 'cget', tabIndex, option)
|
||||
|
||||
def tab_configure(self, tabIndexes, option=None, **kw):
|
||||
# <tabIndexes> may be a list of tabs.
|
||||
if type(tabIndexes) in (types.StringType, types.IntType):
|
||||
tabIndexes = [tabIndexes]
|
||||
subcommand = (self._w, 'tab', 'configure') + tuple(tabIndexes)
|
||||
return _doConfigure(self, subcommand, option, kw)
|
||||
|
||||
def tab_names(self, *args):
|
||||
return self.tk.splitlist(self.tk.call((self._w, 'tab', 'names') + args))
|
||||
|
||||
def tab_tearoff(self, tabIndex, newName = None):
|
||||
if newName is None:
|
||||
name = self.tk.call(self._w, 'tab', 'tearoff', tabIndex)
|
||||
return self.nametowidget(name)
|
||||
else:
|
||||
self.tk.call(self._w, 'tab', 'tearoff', tabIndex, newName)
|
||||
|
||||
def view(self):
|
||||
s = self.tk.call(self._w, 'view')
|
||||
return tuple(map(self.tk.getint, self.tk.splitlist(s)))
|
||||
def view_moveto(self, fraction):
|
||||
self.tk.call(self._w, 'view', 'moveto', fraction)
|
||||
def view_scroll(self, number, what):
|
||||
self.tk.call(self._w, 'view', 'scroll', number, what)
|
361
PmwColor.py
361
PmwColor.py
@ -1,361 +0,0 @@
|
||||
# Functions for converting colors and modifying the color scheme of
|
||||
# an application.
|
||||
|
||||
import math
|
||||
import string
|
||||
import sys
|
||||
import Tkinter
|
||||
|
||||
_PI = math.pi
|
||||
_TWO_PI = _PI * 2
|
||||
_THIRD_PI = _PI / 3
|
||||
_SIXTH_PI = _PI / 6
|
||||
_MAX_RGB = float(256 * 256 - 1) # max size of rgb values returned from Tk
|
||||
|
||||
def setscheme(root, background=None, **kw):
|
||||
root = root._root()
|
||||
palette = apply(_calcPalette, (root, background,), kw)
|
||||
for option, value in palette.items():
|
||||
root.option_add('*' + option, value, 'widgetDefault')
|
||||
|
||||
def getdefaultpalette(root):
|
||||
# Return the default values of all options, using the defaults
|
||||
# from a few widgets.
|
||||
|
||||
ckbtn = Tkinter.Checkbutton(root)
|
||||
entry = Tkinter.Entry(root)
|
||||
scbar = Tkinter.Scrollbar(root)
|
||||
|
||||
orig = {}
|
||||
orig['activeBackground'] = str(ckbtn.configure('activebackground')[4])
|
||||
orig['activeForeground'] = str(ckbtn.configure('activeforeground')[4])
|
||||
orig['background'] = str(ckbtn.configure('background')[4])
|
||||
orig['disabledForeground'] = str(ckbtn.configure('disabledforeground')[4])
|
||||
orig['foreground'] = str(ckbtn.configure('foreground')[4])
|
||||
orig['highlightBackground'] = str(ckbtn.configure('highlightbackground')[4])
|
||||
orig['highlightColor'] = str(ckbtn.configure('highlightcolor')[4])
|
||||
orig['insertBackground'] = str(entry.configure('insertbackground')[4])
|
||||
orig['selectColor'] = str(ckbtn.configure('selectcolor')[4])
|
||||
orig['selectBackground'] = str(entry.configure('selectbackground')[4])
|
||||
orig['selectForeground'] = str(entry.configure('selectforeground')[4])
|
||||
orig['troughColor'] = str(scbar.configure('troughcolor')[4])
|
||||
|
||||
ckbtn.destroy()
|
||||
entry.destroy()
|
||||
scbar.destroy()
|
||||
|
||||
return orig
|
||||
|
||||
#======================================================================
|
||||
|
||||
# Functions dealing with brightness, hue, saturation and intensity of colors.
|
||||
|
||||
def changebrightness(root, colorName, brightness):
|
||||
# Convert the color name into its hue and back into a color of the
|
||||
# required brightness.
|
||||
|
||||
rgb = name2rgb(root, colorName)
|
||||
hue, saturation, intensity = rgb2hsi(rgb)
|
||||
if saturation == 0.0:
|
||||
hue = None
|
||||
return hue2name(hue, brightness)
|
||||
|
||||
def hue2name(hue, brightness = None):
|
||||
# Convert the requested hue and brightness into a color name. If
|
||||
# hue is None, return a grey of the requested brightness.
|
||||
|
||||
if hue is None:
|
||||
rgb = hsi2rgb(0.0, 0.0, brightness)
|
||||
else:
|
||||
while hue < 0:
|
||||
hue = hue + _TWO_PI
|
||||
while hue >= _TWO_PI:
|
||||
hue = hue - _TWO_PI
|
||||
|
||||
rgb = hsi2rgb(hue, 1.0, 1.0)
|
||||
if brightness is not None:
|
||||
b = rgb2brightness(rgb)
|
||||
i = 1.0 - (1.0 - brightness) * b
|
||||
s = bhi2saturation(brightness, hue, i)
|
||||
rgb = hsi2rgb(hue, s, i)
|
||||
|
||||
return rgb2name(rgb)
|
||||
|
||||
def bhi2saturation(brightness, hue, intensity):
|
||||
while hue < 0:
|
||||
hue = hue + _TWO_PI
|
||||
while hue >= _TWO_PI:
|
||||
hue = hue - _TWO_PI
|
||||
hue = hue / _THIRD_PI
|
||||
f = hue - math.floor(hue)
|
||||
|
||||
pp = intensity
|
||||
pq = intensity * f
|
||||
pt = intensity - intensity * f
|
||||
pv = 0
|
||||
|
||||
hue = int(hue)
|
||||
if hue == 0: rgb = (pv, pt, pp)
|
||||
elif hue == 1: rgb = (pq, pv, pp)
|
||||
elif hue == 2: rgb = (pp, pv, pt)
|
||||
elif hue == 3: rgb = (pp, pq, pv)
|
||||
elif hue == 4: rgb = (pt, pp, pv)
|
||||
elif hue == 5: rgb = (pv, pp, pq)
|
||||
|
||||
return (intensity - brightness) / rgb2brightness(rgb)
|
||||
|
||||
def hsi2rgb(hue, saturation, intensity):
|
||||
i = intensity
|
||||
if saturation == 0:
|
||||
rgb = [i, i, i]
|
||||
else:
|
||||
while hue < 0:
|
||||
hue = hue + _TWO_PI
|
||||
while hue >= _TWO_PI:
|
||||
hue = hue - _TWO_PI
|
||||
hue = hue / _THIRD_PI
|
||||
f = hue - math.floor(hue)
|
||||
p = i * (1.0 - saturation)
|
||||
q = i * (1.0 - saturation * f)
|
||||
t = i * (1.0 - saturation * (1.0 - f))
|
||||
|
||||
hue = int(hue)
|
||||
if hue == 0: rgb = [i, t, p]
|
||||
elif hue == 1: rgb = [q, i, p]
|
||||
elif hue == 2: rgb = [p, i, t]
|
||||
elif hue == 3: rgb = [p, q, i]
|
||||
elif hue == 4: rgb = [t, p, i]
|
||||
elif hue == 5: rgb = [i, p, q]
|
||||
|
||||
for index in range(3):
|
||||
val = rgb[index]
|
||||
if val < 0.0:
|
||||
val = 0.0
|
||||
if val > 1.0:
|
||||
val = 1.0
|
||||
rgb[index] = val
|
||||
|
||||
return rgb
|
||||
|
||||
def average(rgb1, rgb2, fraction):
|
||||
return (
|
||||
rgb2[0] * fraction + rgb1[0] * (1.0 - fraction),
|
||||
rgb2[1] * fraction + rgb1[1] * (1.0 - fraction),
|
||||
rgb2[2] * fraction + rgb1[2] * (1.0 - fraction)
|
||||
)
|
||||
|
||||
def rgb2name(rgb):
|
||||
return '#%02x%02x%02x' % \
|
||||
(int(rgb[0] * 255), int(rgb[1] * 255), int(rgb[2] * 255))
|
||||
|
||||
def rgb2brightness(rgb):
|
||||
# Return the perceived grey level of the color
|
||||
# (0.0 == black, 1.0 == white).
|
||||
|
||||
rf = 0.299
|
||||
gf = 0.587
|
||||
bf = 0.114
|
||||
return rf * rgb[0] + gf * rgb[1] + bf * rgb[2]
|
||||
|
||||
def rgb2hsi(rgb):
|
||||
maxc = max(rgb[0], rgb[1], rgb[2])
|
||||
minc = min(rgb[0], rgb[1], rgb[2])
|
||||
|
||||
intensity = maxc
|
||||
if maxc != 0:
|
||||
saturation = (maxc - minc) / maxc
|
||||
else:
|
||||
saturation = 0.0
|
||||
|
||||
hue = 0.0
|
||||
if saturation != 0.0:
|
||||
c = []
|
||||
for index in range(3):
|
||||
c.append((maxc - rgb[index]) / (maxc - minc))
|
||||
|
||||
if rgb[0] == maxc:
|
||||
hue = c[2] - c[1]
|
||||
elif rgb[1] == maxc:
|
||||
hue = 2 + c[0] - c[2]
|
||||
elif rgb[2] == maxc:
|
||||
hue = 4 + c[1] - c[0]
|
||||
|
||||
hue = hue * _THIRD_PI
|
||||
if hue < 0.0:
|
||||
hue = hue + _TWO_PI
|
||||
|
||||
return (hue, saturation, intensity)
|
||||
|
||||
def name2rgb(root, colorName, asInt = 0):
|
||||
if colorName[0] == '#':
|
||||
# Extract rgb information from the color name itself, assuming
|
||||
# it is either #rgb, #rrggbb, #rrrgggbbb, or #rrrrggggbbbb
|
||||
# This is useful, since tk may return incorrect rgb values if
|
||||
# the colormap is full - it will return the rbg values of the
|
||||
# closest color available.
|
||||
colorName = colorName[1:]
|
||||
digits = len(colorName) / 3
|
||||
factor = 16 ** (4 - digits)
|
||||
rgb = (
|
||||
string.atoi(colorName[0:digits], 16) * factor,
|
||||
string.atoi(colorName[digits:digits * 2], 16) * factor,
|
||||
string.atoi(colorName[digits * 2:digits * 3], 16) * factor,
|
||||
)
|
||||
else:
|
||||
# We have no choice but to ask Tk what the rgb values are.
|
||||
rgb = root.winfo_rgb(colorName)
|
||||
|
||||
if not asInt:
|
||||
rgb = (rgb[0] / _MAX_RGB, rgb[1] / _MAX_RGB, rgb[2] / _MAX_RGB)
|
||||
return rgb
|
||||
|
||||
def _calcPalette(root, background=None, **kw):
|
||||
# Create a map that has the complete new palette. If some colors
|
||||
# aren't specified, compute them from other colors that are specified.
|
||||
new = {}
|
||||
for key, value in kw.items():
|
||||
new[key] = value
|
||||
if background is not None:
|
||||
new['background'] = background
|
||||
if not new.has_key('background'):
|
||||
raise ValueError, 'must specify a background color'
|
||||
|
||||
if not new.has_key('foreground'):
|
||||
new['foreground'] = 'black'
|
||||
|
||||
bg = name2rgb(root, new['background'])
|
||||
fg = name2rgb(root, new['foreground'])
|
||||
|
||||
for i in ('activeForeground', 'insertBackground', 'selectForeground',
|
||||
'highlightColor'):
|
||||
if not new.has_key(i):
|
||||
new[i] = new['foreground']
|
||||
|
||||
if not new.has_key('disabledForeground'):
|
||||
newCol = average(bg, fg, 0.3)
|
||||
new['disabledForeground'] = rgb2name(newCol)
|
||||
|
||||
if not new.has_key('highlightBackground'):
|
||||
new['highlightBackground'] = new['background']
|
||||
|
||||
# Set <lighterBg> to a color that is a little lighter that the
|
||||
# normal background. To do this, round each color component up by
|
||||
# 9% or 1/3 of the way to full white, whichever is greater.
|
||||
lighterBg = []
|
||||
for i in range(3):
|
||||
lighterBg.append(bg[i])
|
||||
inc1 = lighterBg[i] * 0.09
|
||||
inc2 = (1.0 - lighterBg[i]) / 3
|
||||
if inc1 > inc2:
|
||||
lighterBg[i] = lighterBg[i] + inc1
|
||||
else:
|
||||
lighterBg[i] = lighterBg[i] + inc2
|
||||
if lighterBg[i] > 1.0:
|
||||
lighterBg[i] = 1.0
|
||||
|
||||
# Set <darkerBg> to a color that is a little darker that the
|
||||
# normal background.
|
||||
darkerBg = (bg[0] * 0.9, bg[1] * 0.9, bg[2] * 0.9)
|
||||
|
||||
if not new.has_key('activeBackground'):
|
||||
# If the foreground is dark, pick a light active background.
|
||||
# If the foreground is light, pick a dark active background.
|
||||
# XXX This has been disabled, since it does not look very
|
||||
# good with dark backgrounds. If this is ever fixed, the
|
||||
# selectBackground and troughColor options should also be fixed.
|
||||
|
||||
if rgb2brightness(fg) < 0.5:
|
||||
new['activeBackground'] = rgb2name(lighterBg)
|
||||
else:
|
||||
new['activeBackground'] = rgb2name(lighterBg)
|
||||
|
||||
if not new.has_key('selectBackground'):
|
||||
new['selectBackground'] = rgb2name(darkerBg)
|
||||
if not new.has_key('troughColor'):
|
||||
new['troughColor'] = rgb2name(darkerBg)
|
||||
if not new.has_key('selectColor'):
|
||||
new['selectColor'] = 'yellow'
|
||||
|
||||
return new
|
||||
|
||||
def spectrum(numColors, correction = 1.0, saturation = 1.0, intensity = 1.0,
|
||||
extraOrange = 1, returnHues = 0):
|
||||
colorList = []
|
||||
division = numColors / 7.0
|
||||
for index in range(numColors):
|
||||
if extraOrange:
|
||||
if index < 2 * division:
|
||||
hue = index / division
|
||||
else:
|
||||
hue = 2 + 2 * (index - 2 * division) / division
|
||||
hue = hue * _SIXTH_PI
|
||||
else:
|
||||
hue = index * _TWO_PI / numColors
|
||||
if returnHues:
|
||||
colorList.append(hue)
|
||||
else:
|
||||
rgb = hsi2rgb(hue, saturation, intensity)
|
||||
if correction != 1.0:
|
||||
rgb = correct(rgb, correction)
|
||||
name = rgb2name(rgb)
|
||||
colorList.append(name)
|
||||
return colorList
|
||||
|
||||
def correct(rgb, correction):
|
||||
correction = float(correction)
|
||||
rtn = []
|
||||
for index in range(3):
|
||||
rtn.append((1 - (1 - rgb[index]) ** correction) ** (1 / correction))
|
||||
return rtn
|
||||
|
||||
#==============================================================================
|
||||
|
||||
def _recolorTree(widget, oldpalette, newcolors):
|
||||
# Change the colors in a widget and its descendants.
|
||||
|
||||
# Change the colors in <widget> and all of its descendants,
|
||||
# according to the <newcolors> dictionary. It only modifies
|
||||
# colors that have their default values as specified by the
|
||||
# <oldpalette> variable. The keys of the <newcolors> dictionary
|
||||
# are named after widget configuration options and the values are
|
||||
# the new value for that option.
|
||||
|
||||
for dbOption in newcolors.keys():
|
||||
option = string.lower(dbOption)
|
||||
try:
|
||||
value = str(widget.cget(option))
|
||||
except:
|
||||
continue
|
||||
if oldpalette is None or value == oldpalette[dbOption]:
|
||||
apply(widget.configure, (), {option : newcolors[dbOption]})
|
||||
|
||||
for child in widget.winfo_children():
|
||||
_recolorTree(child, oldpalette, newcolors)
|
||||
|
||||
def changecolor(widget, background=None, **kw):
|
||||
root = widget._root()
|
||||
if not hasattr(widget, '_Pmw_oldpalette'):
|
||||
widget._Pmw_oldpalette = getdefaultpalette(root)
|
||||
newpalette = apply(_calcPalette, (root, background,), kw)
|
||||
_recolorTree(widget, widget._Pmw_oldpalette, newpalette)
|
||||
widget._Pmw_oldpalette = newpalette
|
||||
|
||||
def bordercolors(root, colorName):
|
||||
# This is the same method that Tk uses for shadows, in TkpGetShadows.
|
||||
|
||||
lightRGB = []
|
||||
darkRGB = []
|
||||
for value in name2rgb(root, colorName, 1):
|
||||
value40pc = (14 * value) / 10
|
||||
if value40pc > _MAX_RGB:
|
||||
value40pc = _MAX_RGB
|
||||
valueHalfWhite = (_MAX_RGB + value) / 2;
|
||||
lightRGB.append(max(value40pc, valueHalfWhite))
|
||||
|
||||
darkValue = (60 * value) / 100
|
||||
darkRGB.append(darkValue)
|
||||
|
||||
return (
|
||||
'#%04x%04x%04x' % (lightRGB[0], lightRGB[1], lightRGB[2]),
|
||||
'#%04x%04x%04x' % (darkRGB[0], darkRGB[1], darkRGB[2])
|
||||
)
|
10
QtSupport.iss
Normal file
10
QtSupport.iss
Normal file
@ -0,0 +1,10 @@
|
||||
[Setup]
|
||||
AppName="QtSupport for MAP65"
|
||||
AppVerName=QtSupport
|
||||
DefaultDirName=C:\MAP65
|
||||
|
||||
[Files]
|
||||
Source: "c:\Users\joe\map65\QtSupport\*.dll"; DestDir: "{app}"; Flags: onlyifdoesntexist
|
||||
|
||||
|
||||
|
Binary file not shown.
35
a2d.f90
35
a2d.f90
@ -1,35 +0,0 @@
|
||||
subroutine a2d(iarg)
|
||||
|
||||
! Start the PortAudio streams for audio input and output.
|
||||
integer nchin(0:20),nchout(0:20)
|
||||
include 'gcom1.f90'
|
||||
include 'gcom2.f90'
|
||||
|
||||
! This call does not normally return, as the background portion of
|
||||
! JTaudio goes into a test-and-sleep loop.
|
||||
|
||||
call cs_lock('a2d')
|
||||
write(*,1000)
|
||||
1000 format('Using Linrad for input, PortAudio for output.')
|
||||
idevout=ndevout
|
||||
call padevsub(numdevs,ndefin,ndefout,nchin,nchout)
|
||||
|
||||
write(*,1002) ndefout
|
||||
1002 format(/'Default Output:',i3)
|
||||
write(*,1004) idevout
|
||||
1004 format('Requested Output:',i3)
|
||||
if(idevout.lt.0 .or. idevout.ge.numdevs) idevout=ndefout
|
||||
if(idevout.eq.0) idevout=ndefout
|
||||
idevin=0
|
||||
call cs_unlock
|
||||
ierr=jtaudio(idevin,idevout,y1,y2,NMAX,iwrite,iwave,nwave, &
|
||||
11025,NSPB,TRPeriod,TxOK,ndebug,Transmitting, &
|
||||
Tsec,ngo,nmode,tbuf,ibuf,ndsec)
|
||||
if(ierr.ne.0) then
|
||||
print*,'Error ',ierr,' in JTaudio, cannot continue.'
|
||||
else
|
||||
write(*,1006)
|
||||
1006 format('Audio output stream terminated normally.')
|
||||
endif
|
||||
return
|
||||
end subroutine a2d
|
23
about.cpp
Normal file
23
about.cpp
Normal file
@ -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 = "<html><h2>" + m_Revision + "</h2>\n\n";
|
||||
m_Str += "MAP65 implements a wideband polarization-matching receiver <br>";
|
||||
m_Str += "for the JT65 protocol, with a matching transmitting facility. <br>";
|
||||
m_Str += "It is primarily intended for amateur radio EME communication. <br><br>";
|
||||
m_Str += "Copyright 2001-2012 by Joe Taylor, K1JT. Additional <br>";
|
||||
m_Str += "acknowledgments are contained in the source code. <br>";
|
||||
ui->labelTxt->setText(m_Str);
|
||||
}
|
||||
|
||||
CAboutDlg::~CAboutDlg()
|
||||
{
|
||||
delete ui;
|
||||
}
|
24
about.h
Normal file
24
about.h
Normal file
@ -0,0 +1,24 @@
|
||||
#ifndef ABOUTDLG_H
|
||||
#define ABOUTDLG_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
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
|
41
about.ui
Normal file
41
about.ui
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>CAboutDlg</class>
|
||||
<widget class="QDialog" name="CAboutDlg">
|
||||
<property name="windowModality">
|
||||
<enum>Qt::NonModal</enum>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>374</width>
|
||||
<height>164</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>About MAP65</string>
|
||||
</property>
|
||||
<widget class="QLabel" name="labelTxt">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>20</x>
|
||||
<y>10</y>
|
||||
<width>331</width>
|
||||
<height>131</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
220
aclocal.m4
vendored
220
aclocal.m4
vendored
@ -1,220 +0,0 @@
|
||||
dnl {{{ ax_check_gfortran
|
||||
AC_DEFUN([AX_CHECK_GFORTRAN],[
|
||||
|
||||
AC_ARG_ENABLE(g95,
|
||||
AC_HELP_STRING([--enable-g95],[Use G95 compiler if available.]),
|
||||
[g95=$enableval], [g95=no])
|
||||
|
||||
AC_ARG_ENABLE(gfortran,
|
||||
AC_HELP_STRING([--enable-gfortran],[Use gfortran compiler if available.]),
|
||||
[gfortran=$enableval], [gfortran=no])
|
||||
|
||||
dnl
|
||||
dnl Pick up FC from the environment if present
|
||||
dnl I'll add a test to confirm this is a gfortran later -db
|
||||
dnl
|
||||
|
||||
FCV=""
|
||||
|
||||
if test -n $[{FC}] ; then
|
||||
gfortran_name_part=`echo $[{FC}] | cut -c 1-8`
|
||||
if test $[{gfortran_name_part}] = "gfortran" ; then
|
||||
gfortran_name=$[{FC}]
|
||||
FC_LIB_PATH=`$[{FC}] -print-file-name=`
|
||||
g95=no
|
||||
gfortran=yes
|
||||
FFLAGS="$[{FFLAGS_GFORTRAN}]"
|
||||
FCV="gnu95"
|
||||
else
|
||||
unset $[{FC}]
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl Note regarding the apparent silliness with FCV.
|
||||
dnl The FCV value for g95 might be system dependent, this is
|
||||
dnl still to be fully explored. If not, then the FCV_G95
|
||||
dnl stuff can go away. -db
|
||||
dnl
|
||||
|
||||
AC_MSG_CHECKING([uname -s])
|
||||
case `uname -s` in
|
||||
CYGWIN*)
|
||||
AC_MSG_RESULT(Cygwin)
|
||||
CYGWIN=yes
|
||||
;;
|
||||
SunOS*)
|
||||
AC_MSG_RESULT(SunOS or Solaris)
|
||||
AC_DEFINE(__EXTENSIONS__, 1, [This is needed to use strtok_r on Solaris.])
|
||||
;;
|
||||
dnl
|
||||
dnl Pick up current gfortran from ports infrastructure for fbsd
|
||||
dnl
|
||||
FreeBSD*)
|
||||
if test -z $[{gfortran_name}] ; then
|
||||
gfortran_name=`grep FC: /usr/ports/Mk/bsd.gcc.mk | head -1 |awk '{print $[2]}'`
|
||||
fi
|
||||
FCV_G95="g95"
|
||||
;;
|
||||
*)
|
||||
FCV_G95="g95"
|
||||
AC_MSG_RESULT(no)
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl
|
||||
dnl look for gfortran if nothing else was given
|
||||
dnl
|
||||
|
||||
if test -z $[gfortran_name] ; then
|
||||
gfortran_name="gfortran"
|
||||
fi
|
||||
|
||||
AC_PATH_PROG(G95, g95)
|
||||
AC_PATH_PROG(GFORTRAN, $[{gfortran_name}])
|
||||
|
||||
if test ! -z $[{GFORTRAN}] ; then
|
||||
echo "*** gfortran compiler found at $[{GFORTRAN}]"
|
||||
if test "$[{gfortran}]" = yes; then
|
||||
FC_LIB_PATH=`$[{GFORTRAN}] -print-file-name=`
|
||||
FC=`basename $[{GFORTRAN}]`
|
||||
g95=no
|
||||
FFLAGS="$[{FFLAGS_GFORTRAN}]"
|
||||
FCV="gnu95"
|
||||
fi
|
||||
else
|
||||
echo "*** No gfortran compiler found"
|
||||
fi
|
||||
|
||||
if test ! -z $[{G95}] ; then
|
||||
echo "*** g95 compiler found at $[{G95}]"
|
||||
if test "$[{g95}]" = yes; then
|
||||
FC_LIB_PATH=`$[{G95}] -print-file-name=`
|
||||
FC=`basename $[{G95}]`
|
||||
gfortran=no
|
||||
FFLAGS="$[{FFLAGS_G95}]"
|
||||
FCV=$[{FCV_G95}]
|
||||
fi
|
||||
else
|
||||
echo "*** No g95 compiler found"
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl if FC is not set by now, pick a compiler for user
|
||||
dnl
|
||||
if test -z $[{FC}] ; then
|
||||
if test ! -z $[{GFORTRAN}] ; then
|
||||
if test "$[{g95}]" = yes; then
|
||||
echo "You enabled g95, but no g95 compiler found, defaulting to gfortran instead"
|
||||
fi
|
||||
FC_LIB_PATH=`$[{GFORTRAN}] -print-file-name=`
|
||||
FC=`basename $[{GFORTRAN}]`
|
||||
g95=no
|
||||
gfortran=yes
|
||||
FFLAGS="$[{FFLAGS_GFORTRAN}]"
|
||||
FCV="gnu95"
|
||||
elif test ! -z $G95 ; then
|
||||
if test "$[{gfortran}]" = yes; then
|
||||
echo "You enabled gfortran, but no gfortran compiler found, defaulting to g95 instead"
|
||||
fi
|
||||
FC_LIB_PATH=`$[{G95}] -print-file-name=`
|
||||
FC=`basename $[{G95}]`
|
||||
g95=yes
|
||||
gfortran=no
|
||||
FFLAGS="$[{FFLAGS_G95}]"
|
||||
FCV=$[{FCV_G95}]
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(FC_LIB_PATH, "${FC_LIB_PATH}", [Path to fortran libs.])
|
||||
AC_SUBST(FC_LIB_PATH, "${FC_LIB_PATH}")
|
||||
AC_DEFINE_UNQUOTED(FC, "${FC}", [Fortran compiler.])
|
||||
AC_SUBST(FC, "${FC}")
|
||||
AC_SUBST(FCV, "${FCV}")
|
||||
|
||||
dnl =========================================
|
||||
dnl pick gfortran or g95
|
||||
|
||||
])dnl }}}
|
||||
|
||||
|
||||
dnl {{{ ax_check_portaudio
|
||||
AC_DEFUN([AX_CHECK_PORTAUDIO],[
|
||||
|
||||
HAS_PORTAUDIO_H=0
|
||||
HAS_PORTAUDIO_LIB=0
|
||||
HAS_PORTAUDIO=0
|
||||
|
||||
AC_MSG_CHECKING([for a v19 portaudio ])
|
||||
|
||||
portaudio_lib_dir="/usr/lib"
|
||||
portaudio_include_dir="/usr/include"
|
||||
|
||||
AC_ARG_WITH([portaudio-include-dir],
|
||||
AC_HELP_STRING([--with-portaudio-include-dir=<path>],
|
||||
[path to portaudio include files]),
|
||||
[portaudio_include_dir=$with_portaudio_include_dir])
|
||||
|
||||
AC_ARG_WITH([portaudio-lib-dir],
|
||||
AC_HELP_STRING([--with-portaudio-lib-dir=<path>],
|
||||
[path to portaudio lib files]),
|
||||
[portaudio_lib_dir=$with_portaudio_lib_dir])
|
||||
|
||||
if test -e $[{portaudio_include_dir}]/portaudio.h; then
|
||||
HAS_PORTAUDIO_H=1
|
||||
fi
|
||||
|
||||
if test -e $[{portaudio_lib_dir}]/libportaudio.so \
|
||||
-o -e $[{portaudio_lib_dir}]/libportaudio.a;then
|
||||
HAS_PORTAUDIO_LIB=1
|
||||
fi
|
||||
|
||||
if test $[{HAS_PORTAUDIO_H}] -eq 1 -a $[{HAS_PORTAUDIO_LIB}] -eq 1; then
|
||||
LDFLAGS="-L$[{portaudio_lib_dir}] $[{LDFLAGS}]"
|
||||
LIBS="$[{LIBS}] -lportaudio"
|
||||
CPPFLAGS="-I$[{portaudio_include_dir}] $[{CPPFLAGS}]"
|
||||
AC_CHECK_LIB(portaudio, Pa_GetVersion, \
|
||||
[HAS_PORTAUDIO_VERSION=1], [HAS_PORTAUDIO_VERSION=0])
|
||||
if test $[{HAS_PORTAUDIO_VERSION}] -eq 0; then
|
||||
AC_MSG_RESULT([This is likely portaudio v18; you need portaudio v19])
|
||||
else
|
||||
HAS_PORTAUDIO=1
|
||||
fi
|
||||
else
|
||||
AC_MSG_RESULT([portaudio not found trying FreeBSD paths ])
|
||||
portaudio_lib_dir="/usr/local/lib/portaudio2"
|
||||
portaudio_include_dir="/usr/local/include/portaudio2"
|
||||
dnl
|
||||
dnl Try again to make sure portaudio dirs are valid
|
||||
dnl
|
||||
AC_MSG_CHECKING([for a v19 portaudio in FreeBSD paths.])
|
||||
HAS_PORTAUDIO_H=0
|
||||
HAS_PORTAUDIO_LIB=0
|
||||
|
||||
if test -e $[{portaudio_include_dir}]/portaudio.h; then
|
||||
HAS_PORTAUDIO_H=1
|
||||
fi
|
||||
|
||||
if test -e $[{portaudio_lib_dir}]/libportaudio.so \
|
||||
-o -e $[{portaudio_lib_dir}]/libportaudio.a;then
|
||||
HAS_PORTAUDIO_LIB=1
|
||||
fi
|
||||
|
||||
if test $[{HAS_PORTAUDIO_H}] -eq 1 -a $[{HAS_PORTAUDIO_LIB}] -eq 1; then
|
||||
AC_MSG_RESULT([found portaudio in FreeBSD paths, double checking it is v19 ])
|
||||
LDFLAGS="-L$[{portaudio_lib_dir}] $[{LDFLAGS}]"
|
||||
LIBS="$[{LIBS}] -lportaudio"
|
||||
CPPFLAGS="-I$[{portaudio_include_dir}] $[{CPPFLAGS}]"
|
||||
AC_CHECK_LIB(portaudio, Pa_GetVersion, \
|
||||
[HAS_PORTAUDIO_VERSION=1], [HAS_PORTAUDIO_VERSION=0])
|
||||
if test $[{HAS_PORTAUDIO_VERSION}] -eq 0; then
|
||||
AC_MSG_RESULT([How did you end up with a portaudio v18 here?])
|
||||
else
|
||||
AC_MSG_RESULT([found v19])
|
||||
HAS_PORTAUDIO=1
|
||||
HAS_PORTAUDIO_H=1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
])dnl }}}
|
257
afmhot.dat
Normal file
257
afmhot.dat
Normal file
@ -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
|
102
astro.cpp
Normal file
102
astro.cpp
Normal file
@ -0,0 +1,102 @@
|
||||
#include "astro.h"
|
||||
#include "ui_astro.h"
|
||||
#include <QDebug>
|
||||
#include <QFile>
|
||||
#include <QMessageBox>
|
||||
#include <stdio.h>
|
||||
#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();
|
||||
}
|
||||
|
||||
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.toAscii(),
|
||||
hisgrid.toAscii(), &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"
|
||||
"Dec: %6.1f\n"
|
||||
"DxAz: %6.1f\n"
|
||||
"DxEl: %6.1f\n"
|
||||
"SunAz: %6.1f\n"
|
||||
"SunEl: %6.1f\n"
|
||||
"Dop: %6d\n"
|
||||
"DXDop: %6d\n"
|
||||
"Tsky: %6d\n"
|
||||
"MNR: %6.1f\n"
|
||||
"Dgrd: %6.1f",
|
||||
azmoon,elmoon,decmoon,azmoondx,elmoondx,azsun,elsun,
|
||||
ndop,ndop00,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)) {
|
||||
QMessageBox mb;
|
||||
mb.setText("Cannot open " + fname);
|
||||
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);
|
||||
}
|
115
astro.f
115
astro.f
@ -1,115 +0,0 @@
|
||||
subroutine astro(AppDir,nyear,month,nday,uth,nfreq,Mygrid,
|
||||
+ NStation,mode,MoonDX,AzSun,ElSun,AzMoon,ElMoon0,
|
||||
+ ntsky,doppler00,doppler,dbMoon,RAMoon,DecMoon,HA,Dgrd,sd,
|
||||
+ poloffset,xnr,auxra,auxdec,azaux,elaux)
|
||||
|
||||
C Computes astronomical quantities for display in JT65, CW, and EME Echo mode.
|
||||
C NB: may want to smooth the Tsky map to 10 degrees or so.
|
||||
|
||||
character*80 AppDir,fname
|
||||
character*6 MyGrid,HisGrid
|
||||
logical first,ltsky
|
||||
real LST
|
||||
real lat,lon
|
||||
real ldeg
|
||||
integer*1 n1sky(129600)
|
||||
integer*2 nsky
|
||||
common/sky/ nsky(360,180)
|
||||
common/echo/xdop(2),techo,ElMoon,mjd
|
||||
equivalence (n1sky,nsky)
|
||||
data first/.true./
|
||||
data rad/57.2957795/
|
||||
save
|
||||
|
||||
if(first) then
|
||||
do i=80,1,-1
|
||||
if(ichar(AppDir(i:i)).ne.0 .and.
|
||||
+ ichar(AppDir(i:i)).ne.32) go to 1
|
||||
enddo
|
||||
1 lenappdir=i
|
||||
call zero(nsky,180*180)
|
||||
fname=Appdir(1:lenappdir)//'/TSKY.DAT'
|
||||
call cs_lock('astro')
|
||||
#ifdef CVF
|
||||
open(13,file=fname,status='old',form='binary',err=10)
|
||||
read(13) nsky
|
||||
close(13)
|
||||
#else
|
||||
open(13,file=fname,status='old',access='stream',err=10)
|
||||
read(13) nsky
|
||||
close(13)
|
||||
#endif
|
||||
ltsky=.true.
|
||||
first=.false.
|
||||
call cs_unlock
|
||||
endif
|
||||
go to 20
|
||||
10 ltsky=.false.
|
||||
call cs_unlock
|
||||
|
||||
20 call grid2deg(MyGrid,elon,lat)
|
||||
lon=-elon
|
||||
call sun(nyear,month,nday,uth,lon,lat,RASun,DecSun,LST,
|
||||
+ AzSun,ElSun,mjd)
|
||||
|
||||
freq=nfreq*1.e6
|
||||
|
||||
call MoonDop(nyear,month,nday,uth,lon,lat,RAMoon,DecMoon,
|
||||
+ LST,HA,AzMoon,ElMoon,ldeg,bdeg,vr,dist)
|
||||
|
||||
C Compute spatial polarization offset
|
||||
xx=sin(lat/rad)*cos(ElMoon/rad) - cos(lat/rad)*
|
||||
+ cos(AzMoon/rad)*sin(ElMoon/rad)
|
||||
yy=cos(lat/rad)*sin(AzMoon/rad)
|
||||
if(NStation.eq.1) poloffset1=rad*atan2(yy,xx)
|
||||
if(NStation.eq.2) poloffset2=rad*atan2(yy,xx)
|
||||
|
||||
techo=2.0 * dist/2.99792458e5 !Echo delay time
|
||||
doppler=-freq*vr/2.99792458e5 !One-way Doppler
|
||||
t408=ftsky(ldeg,bdeg) !Read sky map
|
||||
tsky=t408*(408.0/nfreq)**2.6 !Tsky for obs freq
|
||||
if(ltsky.and.(tsky.lt.3.0)) tsky=3.0 !Minimum = 3 Kelvin
|
||||
|
||||
xdop(NStation)=doppler
|
||||
if(NStation.eq.2) then
|
||||
HisGrid=MyGrid
|
||||
go to 900
|
||||
endif
|
||||
|
||||
doppler00=2.0*xdop(1)
|
||||
if(mode.eq.2 .or. mode.eq.5) doppler=xdop(1)+xdop(2)
|
||||
if(mode.eq.3) doppler=2.0*xdop(1)
|
||||
dBMoon=-40.0*log10(dist/356903.)
|
||||
sd=16.23*370152.0/dist
|
||||
|
||||
! if(NStation.eq.1 .and. MoonDX.ne.0 .and.
|
||||
! + (mode.eq.2 .or. mode.eq.5)) then
|
||||
if(NStation.eq.1 .and. MoonDX.ne.0) then
|
||||
poloffset=mod(poloffset2-poloffset1+720.0,180.0)
|
||||
if(poloffset.gt.90.0) poloffset=poloffset-180.0
|
||||
x1=abs(cos(2*poloffset/rad))
|
||||
if(x1.lt.0.056234) x1=0.056234
|
||||
xnr=-20.0*log10(x1)
|
||||
if(HisGrid(1:1).lt.'A' .or. HisGrid(1:1).gt.'Z') xnr=0
|
||||
endif
|
||||
|
||||
tr=80.0 !Good preamp
|
||||
tskymin=13.0*(408.0/nfreq)**2.6 !Cold sky temperature
|
||||
tsysmin=tskymin+tr
|
||||
tsys=tsky+tr
|
||||
dgrd=-10.0*log10(tsys/tsysmin) + dbMoon
|
||||
|
||||
900 ElMoon0=Elmoon
|
||||
ntsky=nint(tsky)
|
||||
|
||||
auxHA = 15.0*(LST-auxra) !HA in degrees
|
||||
pi=3.14159265
|
||||
pio2=0.5*pi
|
||||
call coord(pi,pio2-lat/rad,0.0,lat/rad,auxha*pi/180.0,
|
||||
+ auxdec/rad,azaux,elaux)
|
||||
AzAux=azaux*rad
|
||||
ElAux=ElAux*rad
|
||||
|
||||
return
|
||||
|
||||
end
|
35
astro.h
Normal file
35
astro.h
Normal file
@ -0,0 +1,35 @@
|
||||
#ifndef ASTRO_H
|
||||
#define ASTRO_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QDateTime>
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
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
|
52
astro.py
52
astro.py
@ -1,52 +0,0 @@
|
||||
#------------------------------------------------------ astro
|
||||
from Tkinter import *
|
||||
import Pmw
|
||||
import g
|
||||
|
||||
def done():
|
||||
g.astro_geom0=root.geometry()
|
||||
root.withdraw()
|
||||
|
||||
root=Toplevel()
|
||||
root.withdraw()
|
||||
root.protocol('WM_DELETE_WINDOW',done)
|
||||
if g.Win32: root.iconbitmap("wsjt.ico")
|
||||
root.title("AstroData")
|
||||
frame=Frame(root)
|
||||
frame.pack()
|
||||
|
||||
def astro2(t):
|
||||
root.geometry(t)
|
||||
root.deiconify()
|
||||
root.focus_set()
|
||||
|
||||
def update():
|
||||
t1= " Az El\n"
|
||||
t2= "Moon: %6.2f %6.2f\n" % (g.AzMoon,g.ElMoon)
|
||||
t3= "Moon/DX: %6.2f %6.2f\n" % (g.AzMoonB,g.ElMoonB)
|
||||
t4= "Sun: %6.2f %6.2f\n" % (g.AzSun,g.ElSun)
|
||||
t4a="Source: %6.2f %6.2f\n\n" % (g.AzAux,g.ElAux)
|
||||
t5= " Doppler df/dt\n"
|
||||
t6= "DX: %7d %7.2f\n" % (g.ndop,g.dfdt)
|
||||
t7= "Self: %7d %7.2f\n\n" % (g.ndop00,g.dfdt0)
|
||||
t7a=" RA DEC\n"
|
||||
irah=int(g.RAMoon)
|
||||
iram=int(60.0*(g.RAMoon-irah))
|
||||
t7b="Moon: %2.2d:%2.2d %6.2f\n" % (irah,iram,g.DecMoon)
|
||||
irah=int(g.RaAux)
|
||||
iram=int(60.0*(g.RaAux-irah))
|
||||
t7c="Source: %2.2d:%2.2d %6.2f\n\n" % (irah,iram,g.DecAux)
|
||||
t8= "Freq: %4d Tsky:%6d\n" % (g.nfreq,g.ntsky)
|
||||
t9= "MNR: %5.1f Dgrd:%6.1f\n" % (g.MaxNR,g.Dgrd)
|
||||
t10="DPol: %4d SD:%8.2f\n" % (g.poloffset,g.sd)
|
||||
t=t1+t2+t3+t4+t4a+t5+t6+t7+t7a+t7b+t7c+t8+t9+t10
|
||||
lab1.configure(text=t)
|
||||
g.astro_geom=root.geometry()
|
||||
frame.after(1000,update)
|
||||
|
||||
g2font=g.g2font
|
||||
lab1=Label(frame,font=g2font,justify=LEFT,bg="#66FFFF",
|
||||
relief=RIDGE,bd=4,anchor=N)
|
||||
lab1.pack(ipadx=4)
|
||||
|
||||
frame.after(1000,update)
|
37
astro.ui
Normal file
37
astro.ui
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Astro</class>
|
||||
<widget class="QWidget" name="Astro">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>262</width>
|
||||
<height>427</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<widget class="QTextBrowser" name="astroTextBrowser">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>10</y>
|
||||
<width>256</width>
|
||||
<height>411</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Courier New</family>
|
||||
<pointsize>20</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
123
astro0.f90
123
astro0.f90
@ -1,123 +0,0 @@
|
||||
subroutine 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)
|
||||
|
||||
!f2py intent(in) nyear,month,nday,uth8,nfreq,grid,cauxra,cauxdec
|
||||
!f2py intent(out) AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8,ntsky,ndop,ndop00,dbMoon8,RAMoon8,DecMoon8,HA8,Dgrd8,sd8,poloffset8,xnr8,dfdt,dfdt0,RaAux8,DecAux8,AzAux8,ElAux8
|
||||
|
||||
character grid*6
|
||||
character*9 cauxra,cauxdec
|
||||
real*8 AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8,AzAux8,ElAux8
|
||||
real*8 dbMoon8,RAMoon8,DecMoon8,HA8,Dgrd8,xnr8,dfdt,dfdt0
|
||||
real*8 sd8,poloffset8
|
||||
include 'gcom2.f90'
|
||||
data uth8z/0.d0/,imin0/-99/
|
||||
save
|
||||
|
||||
call cs_lock('astro0a')
|
||||
auxra=0.
|
||||
i=index(cauxra,':')
|
||||
if(i.eq.0) then
|
||||
read(cauxra,*,err=1,end=1) auxra
|
||||
else
|
||||
read(cauxra(1:i-1),*,err=1,end=1) ih
|
||||
read(cauxra(i+1:i+2),*,err=1,end=1) im
|
||||
read(cauxra(i+4:i+5),*,err=1,end=1) is
|
||||
auxra=ih + im/60.0 + is/3600.0
|
||||
endif
|
||||
1 auxdec=0.
|
||||
i=index(cauxdec,':')
|
||||
if(i.eq.0) then
|
||||
read(cauxdec,*,err=2,end=2) auxdec
|
||||
else
|
||||
read(cauxdec(1:i-1),*,err=2,end=2) id
|
||||
read(cauxdec(i+1:i+2),*,err=2,end=2) im
|
||||
read(cauxdec(i+4:i+5),*,err=2,end=2) is
|
||||
auxdec=abs(id) + im/60.0 + is/3600.0
|
||||
if(cauxdec(1:1).eq.'-') auxdec=-auxdec
|
||||
endif
|
||||
|
||||
2 nmode=1
|
||||
if(mode(1:4).eq.'JT65') then
|
||||
nmode=2
|
||||
if(mode(5:5).eq.'A') mode65=1
|
||||
if(mode(5:5).eq.'B') mode65=2
|
||||
if(mode(5:5).eq.'C') mode65=4
|
||||
endif
|
||||
if(mode.eq.'Echo') nmode=3
|
||||
if(mode.eq.'JT6M') nmode=4
|
||||
uth=uth8
|
||||
|
||||
call cs_unlock
|
||||
call astro(AppDir,nyear,month,nday,uth,nfreq,hisgrid,2,nmode,1, &
|
||||
AzSun,ElSun,AzMoon,ElMoon,ntsky,doppler00,doppler, &
|
||||
dbMoon,RAMoon,DecMoon,HA,Dgrd,sd,poloffset,xnr,auxra,auxdec, &
|
||||
AzAux,ElAux)
|
||||
AzMoonB8=AzMoon
|
||||
ElMoonB8=ElMoon
|
||||
call astro(AppDir,nyear,month,nday,uth,nfreq,grid,1,nmode,1, &
|
||||
AzSun,ElSun,AzMoon,ElMoon,ntsky,doppler00,doppler, &
|
||||
dbMoon,RAMoon,DecMoon,HA,Dgrd,sd,poloffset,xnr,auxra,auxdec, &
|
||||
AzAux,ElAux)
|
||||
|
||||
RaAux8=auxra
|
||||
DecAux8=auxdec
|
||||
AzSun8=AzSun
|
||||
ElSun8=ElSun
|
||||
AzMoon8=AzMoon
|
||||
ElMoon8=ElMoon
|
||||
dbMoon8=dbMoon
|
||||
RAMoon8=RAMoon/15.0
|
||||
DecMoon8=DecMoon
|
||||
HA8=HA
|
||||
Dgrd8=Dgrd
|
||||
sd8=sd
|
||||
poloffset8=poloffset
|
||||
xnr8=xnr
|
||||
AzAux8=AzAux
|
||||
ElAux8=ElAux
|
||||
ndop=nint(doppler)
|
||||
ndop00=nint(doppler00)
|
||||
|
||||
if(uth8z.eq.0.d0) then
|
||||
uth8z=uth8-1.d0/3600.d0
|
||||
dopplerz=doppler
|
||||
doppler00z=doppler00
|
||||
endif
|
||||
|
||||
dt=60.0*(uth8-uth8z)
|
||||
if(dt.le.0) dt=1.d0/60.d0
|
||||
dfdt=(doppler-dopplerz)/dt
|
||||
dfdt0=(doppler00-doppler00z)/dt
|
||||
uth8z=uth8
|
||||
dopplerz=doppler
|
||||
doppler00z=doppler00
|
||||
|
||||
imin=60*uth8
|
||||
isec=3600*uth8
|
||||
|
||||
if(isec.ne.isec0 .and. ndecoding.eq.0) then
|
||||
call cs_lock('astro0b')
|
||||
ih=uth8
|
||||
im=mod(imin,60)
|
||||
is=mod(isec,60)
|
||||
rewind 14
|
||||
write(14,1010) ih,im,is,AzMoon,ElMoon, &
|
||||
ih,im,is,AzSun,ElSun, &
|
||||
ih,im,is,AzAux,ElAux, &
|
||||
nfreq,doppler,dfdt,doppler00,dfdt0, &
|
||||
mousefqso,nsetftx
|
||||
1010 format(i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Moon'/ &
|
||||
i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Sun'/ &
|
||||
i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Source'/ &
|
||||
i4,',',f8.1,',',f8.2,',',f8.1,',',f8.2,',Doppler'/ &
|
||||
i4,',',i1,',fQSO')
|
||||
call flushqqq(14)
|
||||
nsetftx=0
|
||||
isec0=isec
|
||||
call cs_unlock
|
||||
endif
|
||||
|
||||
return
|
||||
end subroutine astro0
|
14
astropak.f
14
astropak.f
@ -1,14 +0,0 @@
|
||||
! include 'astro.f'
|
||||
include 'azdist.f'
|
||||
include 'coord.f'
|
||||
include 'dcoord.f'
|
||||
include 'deg2grid.f'
|
||||
include 'dot.f'
|
||||
include 'ftsky.f'
|
||||
include 'geocentric.f'
|
||||
include 'GeoDist.f'
|
||||
include 'grid2deg.f'
|
||||
include 'moon2.f'
|
||||
include 'MoonDop.f'
|
||||
include 'sun.f'
|
||||
include 'toxyz.f'
|
@ -1,74 +0,0 @@
|
||||
!------------------------------------------------ audio_init
|
||||
subroutine audio_init(ndin,ndout)
|
||||
|
||||
#ifdef CVF
|
||||
use dfmt
|
||||
integer Thread1,Thread2,Thread3
|
||||
external a2d,decode1,recvpkt
|
||||
#endif
|
||||
|
||||
include 'gcom1.f90'
|
||||
include 'gcom2.f90'
|
||||
|
||||
nmode=2
|
||||
if(mode(5:5).eq.'A') mode65=1
|
||||
if(mode(5:5).eq.'B') mode65=2
|
||||
if(mode(5:5).eq.'C') mode65=4
|
||||
ndevout=ndout
|
||||
TxOK=0
|
||||
Transmitting=0
|
||||
nfsample=11025
|
||||
nspb=1024
|
||||
nbufs=2048
|
||||
nmax=nbufs*nspb
|
||||
nwave=60*nfsample
|
||||
ngo=1
|
||||
f0=800.0
|
||||
do i=1,nwave
|
||||
iwave(i)=nint(32767.0*sin(6.283185307*i*f0/nfsample))
|
||||
enddo
|
||||
|
||||
#ifdef CVF
|
||||
! Priority classes (for processes):
|
||||
! IDLE_PRIORITY_CLASS 64
|
||||
! NORMAL_PRIORITY_CLASS 32
|
||||
! HIGH_PRIORITY_CLASS 128
|
||||
|
||||
! Priority definitions (for threads):
|
||||
! THREAD_PRIORITY_IDLE -15
|
||||
! THREAD_PRIORITY_LOWEST -2
|
||||
! THREAD_PRIORITY_BELOW_NORMAL -1
|
||||
! THREAD_PRIORITY_NORMAL 0
|
||||
! THREAD_PRIORITY_ABOVE_NORMAL 1
|
||||
! THREAD_PRIORITY_HIGHEST 2
|
||||
! THREAD_PRIORITY_TIME_CRITICAL 15
|
||||
|
||||
m0=SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS)
|
||||
! m0=SetPriorityClass(GetCurrentProcess(),HIGH_PRIORITY_CLASS)
|
||||
|
||||
! Start a thread for doing A/D and D/A with sound card.
|
||||
! (actually, only D/A is used in MAP65)
|
||||
Thread1=CreateThread(0,0,a2d,0,CREATE_SUSPENDED,id1)
|
||||
m1=SetThreadPriority(Thread1,THREAD_PRIORITY_ABOVE_NORMAL)
|
||||
m2=ResumeThread(Thread1)
|
||||
|
||||
! Start a thread for background decoding.
|
||||
Thread2=CreateThread(0,0,decode1,0,CREATE_SUSPENDED,id2)
|
||||
m3=SetThreadPriority(Thread2,THREAD_PRIORITY_BELOW_NORMAL)
|
||||
m4=ResumeThread(Thread2)
|
||||
|
||||
! Start a thread to receive packets from Linrad
|
||||
Thread3=CreateThread(0,0,recvpkt,0,CREATE_SUSPENDED,id3)
|
||||
m5=SetThreadPriority(Thread3,THREAD_PRIORITY_ABOVE_NORMAL)
|
||||
m6=ResumeThread(Thread3)
|
||||
|
||||
#else
|
||||
! print*,'Audio INIT called.'
|
||||
ierr=start_threads(ndevin,ndevout,y1,y2,nmax,iwrite,iwave,nwave, &
|
||||
11025,NSPB,TRPeriod,TxOK,ndebug,Transmitting, &
|
||||
Tsec,ngo,nmode,tbuf,ibuf,ndsec,PttPort,devin_name,devout_name)
|
||||
|
||||
#endif
|
||||
|
||||
return
|
||||
end subroutine audio_init
|
4
avecom.h
4
avecom.h
@ -1,4 +0,0 @@
|
||||
parameter (MAXAVE=120)
|
||||
common/ave/ppsave(64,63,MAXAVE),nflag(MAXAVE),nsave,
|
||||
+ iseg(MAXAVE)
|
||||
|
64
avemsg65.f
64
avemsg65.f
@ -1,64 +0,0 @@
|
||||
subroutine avemsg65(mseg,mode65,ndepth,decoded,nused,
|
||||
+ nq1,nq2,neme,nsked,mycall,hiscall,hisgrid,qual,
|
||||
+ ns,ncount)
|
||||
|
||||
C Decodes averaged JT65 data for the specified segment (mseg=1 or 2).
|
||||
|
||||
parameter (MAXAVE=120) !Max avg count is 120
|
||||
character decoded*22,deepmsg*22
|
||||
character mycall*12,hiscall*12,hisgrid*6
|
||||
real s3(64,63)
|
||||
logical ltext
|
||||
common/ave/ppsave(64,63,MAXAVE),nflag(MAXAVE),nsave,iseg(MAXAVE)
|
||||
|
||||
C Count the available spectra for this Monitor segment (mseg=1 or 2),
|
||||
C and the number of spectra flagged as good.
|
||||
|
||||
nused=0
|
||||
ns=0
|
||||
nqual=0
|
||||
deepmsg=' '
|
||||
do i=1,nsave
|
||||
if(iseg(i).eq.mseg) then
|
||||
ns=ns+1
|
||||
if(nflag(i).eq.1) nused=nused+1
|
||||
endif
|
||||
enddo
|
||||
if(nused.lt.1) go to 100
|
||||
|
||||
C Compute the average of all flagged spectra for this segment.
|
||||
do j=1,63
|
||||
call zero(s3(1,j),64)
|
||||
do n=1,nsave
|
||||
if(nflag(n).eq.1 .and. iseg(n).eq.mseg) then
|
||||
call add(s3(1,j),ppsave(1,j,n),s3(1,j),64)
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
|
||||
nadd=nused*mode65
|
||||
call extract(s3,nadd,ncount,decoded,ltext) !Extract the message
|
||||
if(ncount.lt.0) decoded=' '
|
||||
|
||||
nqual=0
|
||||
C Possibly should pass nadd=nused, also:
|
||||
if(ndepth.ge.3) then
|
||||
flipx=1.0 !Normal flip not relevant for ave msg
|
||||
call deep65(s3,mode65,neme,nsked,flipx,
|
||||
+ mycall,hiscall,hisgrid,deepmsg,qual)
|
||||
nqual=qual
|
||||
if(nqual.lt.nq1) deepmsg=' '
|
||||
if(nqual.ge.nq1 .and. nqual.lt.nq2) deepmsg(19:19)='?'
|
||||
else
|
||||
deepmsg=' '
|
||||
qual=0.
|
||||
endif
|
||||
if(ncount.lt.0) decoded=deepmsg
|
||||
|
||||
C Suppress "birdie messages":
|
||||
if(decoded(1:7).eq.'000AAA ') decoded=' '
|
||||
if(decoded(1:7).eq.'0L6MWK ') decoded=' '
|
||||
|
||||
100 if(nused.lt.1) decoded=' '
|
||||
return
|
||||
end
|
108
azdist.f
108
azdist.f
@ -1,108 +0,0 @@
|
||||
subroutine azdist(MyGrid,HisGrid,utch,nAz,nEl,nDmiles,nDkm,
|
||||
+ nHotAz,nHotABetter)
|
||||
|
||||
character*6 MyGrid,HisGrid,mygrid0,hisgrid0
|
||||
real*8 utch,utch0
|
||||
logical HotABetter,IamEast
|
||||
real eltab(22),daztab(22)
|
||||
data eltab/18.,15.,13.,11.,9.,8.,7.,6.,5.3,4.7,4.,3.3,2.7,
|
||||
+ 2.,1.5,1.,0.8,0.6,0.4,0.2,0.0,0.0/
|
||||
data daztab/21.,18.,16.,15.,14.,13.,12.,11.,10.7,10.3,10.,
|
||||
+ 10.,10.,10.,10.,10.,10.,9.,9.,9.,8.,8./
|
||||
data mygrid0/" "/,hisgrid0/" "/,utch0/-999.d0/
|
||||
save
|
||||
|
||||
if(MyGrid.eq.HisGrid) then
|
||||
naz=0
|
||||
nel=0
|
||||
ndmiles=0
|
||||
ndkm=0
|
||||
nhotaz=0
|
||||
nhotabetter=1
|
||||
go to 999
|
||||
endif
|
||||
|
||||
if(mygrid.eq.mygrid0 .and. hisgrid.eq.hisgrid0 .and.
|
||||
+ abs(utch-utch0).lt.0.1666667d0) go to 900
|
||||
utch0=utch
|
||||
mygrid0=mygrid
|
||||
hisgrid0=hisgrid
|
||||
utchours=utch
|
||||
|
||||
if(MyGrid(5:5).eq.' ') MyGrid(5:5)='m'
|
||||
if(MyGrid(6:6).eq.' ') MyGrid(6:6)='m'
|
||||
if(HisGrid(5:5).eq.' ') HisGrid(5:5)='m'
|
||||
if(HisGrid(6:6).eq.' ') HisGrid(6:6)='m'
|
||||
|
||||
if(MyGrid.eq.HisGrid) then
|
||||
Az=0.
|
||||
Dmiles=0.
|
||||
Dkm=0.0
|
||||
El=0.
|
||||
HotA=0.
|
||||
HotB=0.
|
||||
HotABetter=.true.
|
||||
go to 900
|
||||
endif
|
||||
|
||||
call grid2deg(MyGrid,dlong1,dlat1)
|
||||
call grid2deg(HisGrid,dlong2,dlat2)
|
||||
call geodist(dlat1,dlong1,dlat2,dlong2,Az,Baz,Dkm)
|
||||
|
||||
ndkm=Dkm/100
|
||||
j=ndkm-4
|
||||
if(j.lt.1) j=1
|
||||
if(j.gt.21)j=21
|
||||
if(Dkm.lt.500.0) then
|
||||
El=18.0
|
||||
else
|
||||
u=(Dkm-100.0*ndkm)/100.0
|
||||
El=(1.0-u)*eltab(j) + u*eltab(j+1)
|
||||
endif
|
||||
|
||||
daz=daztab(j) + u * (daztab(j+1)-daztab(j))
|
||||
Dmiles=Dkm/1.609344
|
||||
|
||||
tmid=mod(UTChours-0.5*(dlong1+dlong2)/15.0+48.0,24.0)
|
||||
IamEast=.false.
|
||||
if(dlong1.lt.dlong2) IamEast=.true.
|
||||
if(dlong1.eq.dlong2 .and. dlat1.gt.dlat2) IamEast=.false.
|
||||
azEast=baz
|
||||
if(IamEast) azEast=az
|
||||
if((azEast.ge.45.0 .and. azEast.lt.135.0) .or.
|
||||
+ (azEast.ge.225.0 .and. azEast.lt.315.0)) then
|
||||
C The path will be taken as "east-west".
|
||||
HotABetter=.true.
|
||||
if(abs(tmid-6.0).lt.6.0) HotABetter=.false.
|
||||
if((dlat1+dlat2)/2.0 .lt. 0.0) HotABetter=.not.HotABetter
|
||||
else
|
||||
C The path will be taken as "north-south".
|
||||
HotABetter=.false.
|
||||
if(abs(tmid-12.0).lt.6.0) HotABetter=.true.
|
||||
endif
|
||||
if(IamEast) then
|
||||
HotA = Az - daz
|
||||
HotB = Az + daz
|
||||
else
|
||||
HotA = Az + daz
|
||||
HotB = Az - daz
|
||||
endif
|
||||
if(HotA.lt.0.0) HotA=HotA+360.0
|
||||
if(HotA.gt.360.0) HotA=HotA-360.0
|
||||
if(HotB.lt.0.0) HotB=HotB+360.0
|
||||
if(HotB.gt.360.0) HotB=HotB-360.0
|
||||
|
||||
900 continue
|
||||
naz=nint(Az)
|
||||
nel=nint(el)
|
||||
nDmiles=nint(Dmiles)
|
||||
nDkm=nint(Dkm)
|
||||
nHotAz=nint(HotB)
|
||||
nHotABetter=0
|
||||
if(HotABetter) then
|
||||
nHotAz=nint(HotA)
|
||||
nHotABetter=1
|
||||
endif
|
||||
|
||||
999 return
|
||||
end
|
14
azdist0.f90
14
azdist0.f90
@ -1,14 +0,0 @@
|
||||
|
||||
!---------------------------------------------------- azdist0
|
||||
|
||||
subroutine azdist0(MyGrid,HisGrid,utch,nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter)
|
||||
character*6 MyGrid,HisGrid
|
||||
real*8 utch
|
||||
!f2py intent(in) MyGrid,HisGrid,utch
|
||||
!f2py intent(out) nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter
|
||||
|
||||
if(hisgrid(5:5).eq.' ' .or. ichar(hisgrid(5:5)).eq.0) hisgrid(5:5)='m'
|
||||
if(hisgrid(6:6).eq.' ' .or. ichar(hisgrid(6:6)).eq.0) hisgrid(6:6)='m'
|
||||
call azdist(MyGrid,HisGrid,utch,nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter)
|
||||
return
|
||||
end subroutine azdist0
|
89
bandmap.cpp
Normal file
89
bandmap.cpp
Normal file
@ -0,0 +1,89 @@
|
||||
#include "bandmap.h"
|
||||
#include "ui_bandmap.h"
|
||||
#include <QDebug>
|
||||
|
||||
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="<html style=\" font-family:'Courier New';"
|
||||
"font-size:9pt; background-color:#000066\">"
|
||||
"<table border=0 cellspacing=7><tr><td>\n";
|
||||
QString tfreq,tspace,tcall;
|
||||
QString s0,s1,s2,s3,bg;
|
||||
bg="<span style=color:"+m_colorBackground+";>.</span>";
|
||||
s0="<span style=color:"+m_color0+";>";
|
||||
s1="<span style=color:"+m_color1+";>";
|
||||
s2="<span style=color:"+m_color2+";>";
|
||||
s3="<span style=color:"+m_color3+";>";
|
||||
|
||||
ui->bmTextBrowser->clear();
|
||||
QStringList lines = t.split( "\n", QString::SkipEmptyParts );
|
||||
int nrows=(lines.length()+ncols-1)/ncols;
|
||||
|
||||
for(int i=0; i<nrows; i++) {
|
||||
tfreq=lines[i].mid(0,3);
|
||||
tspace=lines[i].mid(4,1);
|
||||
if(tspace==" ") tspace=bg;
|
||||
tcall=lines[i].mid(5,7);
|
||||
int n=lines[i].mid(13,1).toInt();
|
||||
if(n==0) t0 += s0;
|
||||
if(n==1) t0 += s1;
|
||||
if(n==2) t0 += s2;
|
||||
if(n>=3) t0 += s3;
|
||||
t0 += (tfreq + tspace + tcall + "</span><br>\n");
|
||||
}
|
||||
|
||||
if(ncols==2) { //2-column display
|
||||
t0 += "<td><br><td>\n";
|
||||
for(int i=nrows; i<lines.length(); i++) {
|
||||
tfreq=lines[i].mid(0,3);
|
||||
tspace=lines[i].mid(4,1);
|
||||
if(tspace==" ") tspace=bg;
|
||||
tcall=lines[i].mid(5,7);
|
||||
int n=lines[i].mid(13,1).toInt();
|
||||
if(n==0) t0 += s0;
|
||||
if(n==1) t0 += s1;
|
||||
if(n==2) t0 += s2;
|
||||
if(n>=3) t0 += s3;
|
||||
t0 += (tfreq + tspace + tcall + "</span><br>\n");
|
||||
}
|
||||
if(2*nrows>lines.length()) t0 += (s0 + "</span><br>\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);
|
||||
}
|
34
bandmap.h
Normal file
34
bandmap.h
Normal file
@ -0,0 +1,34 @@
|
||||
#ifndef BANDMAP_H
|
||||
#define BANDMAP_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
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
|
43
bandmap.ui
Normal file
43
bandmap.ui
Normal file
@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>BandMap</class>
|
||||
<widget class="QWidget" name="BandMap">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>329</width>
|
||||
<height>379</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QTextBrowser" name="bmTextBrowser">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>107</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Courier New</family>
|
||||
<pointsize>9</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
256
blue.dat
Normal file
256
blue.dat
Normal file
@ -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
|
115
ccf65.f
115
ccf65.f
@ -1,115 +0,0 @@
|
||||
subroutine ccf65(ss,nhsym,sync1,ipol1,dt1,flipk,syncshort,
|
||||
+ snr2,ipol2,dt2)
|
||||
|
||||
parameter (NFFT=512,NH=NFFT/2)
|
||||
real ss(4,322)
|
||||
!Input: half-symbol powers, 4 pol'ns
|
||||
real s(NFFT) !CCF = ss*pr
|
||||
complex cs(0:NH) !Complex FT of s
|
||||
real s2(NFFT) !CCF = ss*pr2
|
||||
complex cs2(0:NH) !Complex FT of s2
|
||||
real pr(NFFT) !JT65 pseudo-random sync pattern
|
||||
complex cpr(0:NH) !Complex FT of pr
|
||||
real pr2(NFFT) !JT65 shorthand pattern
|
||||
complex cpr2(0:NH) !Complex FT of pr2
|
||||
real tmp1(322)
|
||||
real tmp2(322)
|
||||
real ccf(-27:27,4)
|
||||
logical first
|
||||
integer npr(126)
|
||||
data first/.true./
|
||||
equivalence (s,cs),(pr,cpr),(s2,cs2),(pr2,cpr2)
|
||||
save
|
||||
|
||||
C The JT65 pseudo-random sync pattern:
|
||||
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/
|
||||
|
||||
if(first) then
|
||||
C Initialize pr, pr2; compute cpr, cpr2.
|
||||
fac=1.0/NFFT
|
||||
do i=1,NFFT
|
||||
pr(i)=0.
|
||||
k=2*mod((i-1)/8,2)-1
|
||||
pr2(i)=fac*k
|
||||
enddo
|
||||
do i=1,126
|
||||
j=2*i
|
||||
pr(j)=fac*(2*npr(i)-1)
|
||||
enddo
|
||||
call four2a(pr,NFFT,1,-1,0)
|
||||
call four2a(pr2,NFFT,1,-1,0)
|
||||
first=.false.
|
||||
endif
|
||||
|
||||
C Look for JT65 sync pattern and shorthand square-wave pattern.
|
||||
ccfbest=0.
|
||||
ccfbest2=0.
|
||||
do ip=1,4 !Do all four pol'ns
|
||||
do i=1,nhsym ! ?? nhsym-1 ??
|
||||
s(i)=min(4.0,ss(ip,i)+ss(ip,i+1))
|
||||
enddo
|
||||
do i=nhsym+1,NFFT ! ?? nhsym ??
|
||||
s(i)=0.
|
||||
enddo
|
||||
call four2a(s,NFFT,1,-1,0) !Real-to-complex FFT
|
||||
do i=0,NH
|
||||
cs2(i)=cs(i)*conjg(cpr2(i)) !Mult by complex FFT of pr2
|
||||
cs(i)=cs(i)*conjg(cpr(i)) !Mult by complex FFT of pr
|
||||
enddo
|
||||
call four2a(cs,NFFT,1,1,-1) !Complex-to-real inv-FFT
|
||||
call four2a(cs2,NFFT,1,1,-1) !Complex-to-real inv-FFT
|
||||
|
||||
do lag=-27,27 !Check for best JT65 sync
|
||||
ccf(lag,ip)=s(lag+28)
|
||||
if(abs(ccf(lag,ip)).gt.ccfbest) then
|
||||
ccfbest=abs(ccf(lag,ip))
|
||||
lagpk=lag
|
||||
ipol1=ip
|
||||
flipk=1.0
|
||||
if(ccf(lag,ip).lt.0.0) flipk=-1.0
|
||||
endif
|
||||
enddo
|
||||
|
||||
do lag=-8,7 !Check for best shorthand
|
||||
ccf2=s2(lag+28)
|
||||
if(ccf2.gt.ccfbest2) then
|
||||
ccfbest2=ccf2
|
||||
lagpk2=lag
|
||||
ipol2=ip
|
||||
endif
|
||||
enddo
|
||||
|
||||
enddo
|
||||
|
||||
C Find rms level on baseline of "ccfblue", for normalization.
|
||||
sum=0.
|
||||
do lag=-26,26
|
||||
if(abs(lag-lagpk).gt.1) sum=sum + ccf(lag,ipol1)
|
||||
enddo
|
||||
base=sum/50.0
|
||||
sq=0.
|
||||
do lag=-26,26
|
||||
if(abs(lag-lagpk).gt.1) sq=sq + (ccf(lag,ipol1)-base)**2
|
||||
enddo
|
||||
rms=sqrt(sq/49.0)
|
||||
sync1=ccfbest/rms - 4.0
|
||||
dt1=2.5 + lagpk*(2048.0/11025.0)
|
||||
|
||||
C Find base level for normalizing snr2.
|
||||
do i=1,nhsym
|
||||
tmp1(i)=ss(ipol2,i)
|
||||
enddo
|
||||
call pctile(tmp1,tmp2,nhsym,40,base)
|
||||
snr2=0.398107*ccfbest2/base !### empirical
|
||||
syncshort=0.5*ccfbest2/rms - 4.0 !### better normalizer than rms?
|
||||
dt2=2.5 + lagpk2*(2048.0/11025.0)
|
||||
|
||||
return
|
||||
end
|
57
char.h
57
char.h
@ -1,57 +0,0 @@
|
||||
/* Include file to configure the RS codec for character symbols
|
||||
*
|
||||
* Copyright 2002, Phil Karn, KA9Q
|
||||
* May be used under the terms of the GNU General Public License (GPL)
|
||||
*/
|
||||
#define DTYPE unsigned char
|
||||
|
||||
/* Reed-Solomon codec control block */
|
||||
struct rs {
|
||||
int mm; /* Bits per symbol */
|
||||
int nn; /* Symbols per block (= (1<<mm)-1) */
|
||||
DTYPE *alpha_to; /* log lookup table */
|
||||
DTYPE *index_of; /* Antilog lookup table */
|
||||
DTYPE *genpoly; /* Generator polynomial */
|
||||
int nroots; /* Number of generator roots = number of parity symbols */
|
||||
int fcr; /* First consecutive root, index form */
|
||||
int prim; /* Primitive element, index form */
|
||||
int iprim; /* prim-th root of 1, index form */
|
||||
int pad; /* Padding bytes in shortened block */
|
||||
};
|
||||
|
||||
static inline int modnn(struct rs *rs,int x){
|
||||
while (x >= 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 PAD (rs->pad)
|
||||
#define A0 (NN)
|
||||
|
||||
#define ENCODE_RS encode_rs_char
|
||||
#define DECODE_RS decode_rs_char
|
||||
#define INIT_RS init_rs_char
|
||||
#define FREE_RS free_rs_char
|
||||
|
||||
void ENCODE_RS(void *p,DTYPE *data,DTYPE *parity);
|
||||
int DECODE_RS(void *p,DTYPE *data,int *eras_pos,int no_eras);
|
||||
void *INIT_RS(int symsize,int gfpoly,int fcr,
|
||||
int prim,int nroots,int pad);
|
||||
void FREE_RS(void *p);
|
||||
|
||||
|
||||
|
||||
|
||||
|
31
chkmsg.f
31
chkmsg.f
@ -1,31 +0,0 @@
|
||||
subroutine chkmsg(message,cok,nspecial,flip)
|
||||
|
||||
character message*22,cok*3
|
||||
|
||||
nspecial=0
|
||||
flip=1.0
|
||||
cok=" "
|
||||
|
||||
do i=22,1,-1
|
||||
if(message(i:i).ne.' ') go to 10
|
||||
enddo
|
||||
i=22
|
||||
|
||||
10 if(i.ge.11 .and. (message(i-3:i).eq.' OOO') .or.
|
||||
+ (message(20:22).eq.' OO')) then
|
||||
cok='OOO'
|
||||
flip=-1.0
|
||||
if(message(20:22).eq.' OO') then
|
||||
message=message(1:19)
|
||||
else
|
||||
message=message(1:i-4)
|
||||
endif
|
||||
endif
|
||||
|
||||
! if(message(1:3).eq.'ATT') nspecial=1
|
||||
if(message(1:2).eq.'RO') nspecial=2
|
||||
if(message(1:3).eq.'RRR') nspecial=3
|
||||
if(message(1:2).eq.'73') nspecial=4
|
||||
|
||||
return
|
||||
end
|
42
commons.h
Normal file
42
commons.h
Normal file
@ -0,0 +1,42 @@
|
||||
#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 mode65; //JT65 sub-mode: A=1, B=2, C=4
|
||||
char mycall[12];
|
||||
char mygrid[6];
|
||||
char hiscall[12];
|
||||
char hisgrid[6];
|
||||
char datetime[20];
|
||||
} datcom_;
|
||||
}
|
||||
|
||||
#endif // COMMONS_H
|
220
configure.ac
220
configure.ac
@ -1,220 +0,0 @@
|
||||
dnl $Id$
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
dnl AC_PREREQ(2.61)
|
||||
|
||||
dnl Sneaky way to get an Id tag into the configure script
|
||||
AC_COPYRIGHT([$Id$])
|
||||
|
||||
AC_INIT([map65],[0.9])
|
||||
|
||||
fail=0
|
||||
|
||||
AC_PREFIX_DEFAULT(/usr/local/)
|
||||
|
||||
OLD_CFLAGS="$CFLAGS"
|
||||
dnl Checks for programs.
|
||||
AC_PROG_CC
|
||||
AC_LANG(C)
|
||||
AC_PROG_F77
|
||||
|
||||
dnl Make sure autoconf doesn't interfere with cflags -jmallett
|
||||
CFLAGS="$OLD_CFLAGS"
|
||||
|
||||
dnl Lets guess at some likely places for extra libs/includes XXX -db
|
||||
CPPFLAGS="-I/usr/local/include ${CPPFLAGS}"
|
||||
LDFLAGS="-L/usr/local/lib ${LDFLAGS}"
|
||||
LIBS=" -lpthread ${LIBS}"
|
||||
FFLAGS_GFORTRAN="${FFLAGS} -fno-range-check -ffixed-line-length-none\
|
||||
-Wall -fbounds-check -fno-second-underscore -fPIC"
|
||||
FFLAGS_G95="${FFLAGS} -Wall -Wno-precision-loss -fbounds-check -fno-second-underscore -fPIC"
|
||||
#-Wall -Wno-precision-loss -fbounds-check -fno-second-underscore -fPIC
|
||||
|
||||
AX_CHECK_GFORTRAN
|
||||
AX_CHECK_PORTAUDIO
|
||||
|
||||
dnl If we support -g, use it!
|
||||
if test "$ac_cv_prog_cc_g" = yes; then
|
||||
CFLAGS="$CFLAGS -g"
|
||||
fi
|
||||
|
||||
dnl jdc -- If CFLAGS is defined, best use it everywhere...
|
||||
dnl NOTE: jv says it must be added to the *END*, because things like
|
||||
dnl "gcc -O9 -O2" will result in -O2 getting preference. How stupid.
|
||||
if test ! -z "$CFLAGS"; then
|
||||
CFLAGS="$CFLAGS $CFLAGS"
|
||||
fi
|
||||
|
||||
|
||||
AC_ISC_POSIX
|
||||
AC_C_INLINE
|
||||
AC_PROG_GCC_TRADITIONAL
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_INSTALL
|
||||
AC_PATH_PROG(RM, rm)
|
||||
AC_PATH_PROG(CP, cp)
|
||||
AC_PATH_PROG(MV, mv)
|
||||
AC_PATH_PROG(LN, ln)
|
||||
AC_PATH_PROG(SED, sed)
|
||||
AC_PATH_PROG(AR, ar)
|
||||
AC_PATH_PROG(LD, ld)
|
||||
AC_PATH_PROG(TEST, [test], [test])
|
||||
AC_PATH_PROG(PYTHON, python)
|
||||
AC_PATH_PROG(F2PY, f2py)
|
||||
AC_MSG_CHECKING([OS])
|
||||
OS=`uname`
|
||||
AC_SUBST(OS, "${OS}")
|
||||
|
||||
dnl Checks for header files.
|
||||
|
||||
AC_HEADER_STDC
|
||||
|
||||
AC_CHECK_HEADERS([inttypes.h stdint.h sys/resource.h sys/param.h errno.h \
|
||||
sys/syslog.h stddef.h libgen.h sys/wait.h wait.h stdio.h termios.h \
|
||||
sys/resource.h linux/ppdev.h dev/ppbus/ppi.h sys/stat.h fcntl.h sys/ioctl.h ])
|
||||
|
||||
AC_HEADER_TIME
|
||||
|
||||
AC_CHECK_HEADER([fftw3.h], [HAS_FFTW3_H=1], [HAS_FFTW3_H=0])
|
||||
AC_CHECK_HEADER([samplerate.h], [HAS_SAMPLERATE_H=1], [HAS_SAMPLERATE_H=0])
|
||||
|
||||
dnl See whether we can include both string.h and strings.h.
|
||||
AC_CACHE_CHECK([whether string.h and strings.h may both be included],
|
||||
gcc_cv_header_string,
|
||||
[
|
||||
AC_COMPILE_IFELSE(
|
||||
[#include <string.h>
|
||||
#include <strings.h>],
|
||||
[gcc_cv_header_string=yes],
|
||||
[gcc_cv_header_string=no])
|
||||
])
|
||||
|
||||
if test "$gcc_cv_header_string" = "yes"; then
|
||||
AC_DEFINE(STRING_WITH_STRINGS, 1, [Define to 1 if string.h may be included along with strings.h])
|
||||
fi
|
||||
|
||||
dnl check for a fortran shim entry point
|
||||
AC_CHECK_LIB(fftw3f, sfftw_destroy_plan_, \
|
||||
[HAS_FFTW3FLIBS=1], [HAS_FFTW3FLIBS=0])
|
||||
|
||||
dnl Check for stdarg.h - if we can't find it, halt configure
|
||||
AC_CHECK_HEADER(stdarg.h, , [AC_MSG_ERROR([** stdarg.h could not be found - wsjt will not compile without it **])])
|
||||
|
||||
dnl Debug-related options
|
||||
dnl =====================
|
||||
|
||||
AC_ARG_ENABLE(clobber,
|
||||
AC_HELP_STRING([--enable-clobber], [Don't preserve old binaries on make install]),
|
||||
[clobber=$enableval], [clobber=no])
|
||||
|
||||
if test "$clobber" = yes; then
|
||||
AC_SUBST(CLOBBER, yes)
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(assert,
|
||||
AC_HELP_STRING([--enable-assert],[Enable assert().]),
|
||||
[assert=$enableval], [assert=no])
|
||||
|
||||
if test "$assert" = no; then
|
||||
AC_DEFINE(NDEBUG, 1, [Define this to disable debugging support.])
|
||||
fi
|
||||
|
||||
if test "$prefix" = "NONE"; then
|
||||
prefix=${ac_default_prefix}
|
||||
else
|
||||
|
||||
dnl Don't get bitten by Cygwin's stupidity if the user specified
|
||||
dnl a custom prefix with a trailing slash
|
||||
|
||||
prefix=`echo ${ac_default_prefix} | sed 's/\/$//'`
|
||||
fi
|
||||
|
||||
dnl sanity tests.
|
||||
dnl =============
|
||||
|
||||
if test -z $FC ; then
|
||||
fail=1
|
||||
echo "You need g95 or gfortran to compile this program!"
|
||||
fi
|
||||
|
||||
if test $HAS_FFTW3_H -eq 0; then
|
||||
fail=1
|
||||
echo "You need to install the fftw3 libraries"
|
||||
fi
|
||||
|
||||
if test $HAS_SAMPLERATE_H -eq 0; then
|
||||
fail=1
|
||||
echo "You need to install the samplerate library"
|
||||
else
|
||||
AC_DEFINE(HAS_SAMPLERATE_H, 1, )
|
||||
LIBS="${LIBS} -lsamplerate"
|
||||
fi
|
||||
|
||||
if test $HAS_PORTAUDIO -eq 1; then
|
||||
AC_DEFINE(HAS_PORTAUDIO, 1, )
|
||||
AC_DEFINE(HAS_PORTAUDIO_H, 1, )
|
||||
AC_DEFINE(HAS_PORTAUDIO_LIB, 1, )
|
||||
else
|
||||
fail=1
|
||||
echo "This program needs portaudio v19 to compile."
|
||||
echo "Please use --with-portaudio-include-dir= and"
|
||||
echo " --with-portaudio-lib-dir= to set the paths."
|
||||
fi
|
||||
|
||||
if test $HAS_FFTW3_H -eq 1; then
|
||||
AC_DEFINE(HAS_FFTW3_H, 1, )
|
||||
else
|
||||
fail=1
|
||||
echo "You are missing the fftw3.h include file"
|
||||
fi
|
||||
|
||||
if test $HAS_FFTW3FLIBS -eq 1; then
|
||||
LIBS="${LIBS} -lfftw3f"
|
||||
AC_DEFINE(HAS_FFTW3FLIBS, 1, )
|
||||
else
|
||||
fail=1
|
||||
echo "You are missing the fortran shim in libfftw3."
|
||||
fi
|
||||
|
||||
if test "$F2PY" = ""; then
|
||||
echo "You are missing f2py, trying local copy."
|
||||
F2PY="python f2py.py";
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl
|
||||
dnl If fail a pre-requisite then fail
|
||||
dnl
|
||||
|
||||
if test $fail -eq 1; then
|
||||
AC_MSG_ERROR([Please check error messages and install missing packages.])
|
||||
fi
|
||||
|
||||
AC_SUBST(PREFIX, "${prefix}")
|
||||
AC_SUBST(CPPFLAGS, "${CPPFLAGS}")
|
||||
AC_SUBST(LDFLAGS, "${LDFLAGS}")
|
||||
AC_SUBST(LIBS, "${LIBS}")
|
||||
AC_SUBST(CFLAGS)
|
||||
AC_SUBST(FFLAGS)
|
||||
AC_SUBST(F2PY, "${F2PY}")
|
||||
AC_CONFIG_FILES(Makefile)
|
||||
AC_OUTPUT
|
||||
|
||||
dnl do summary
|
||||
|
||||
echo
|
||||
echo
|
||||
|
||||
if test $g95 = "yes"; then
|
||||
echo "Using g95 as fortran compiler.";
|
||||
elif test $gfortran = "yes"; then
|
||||
echo "Using gfortran as fortran compiler.";
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Compiling $PACKAGE_NAME $PACKAGE_VERSION"
|
||||
echo
|
||||
|
||||
echo "Installing into: $prefix"
|
||||
|
||||
echo
|
@ -1,5 +0,0 @@
|
||||
parameter (NSMAX=60*96000) !Samples per 60 s file
|
||||
real*4 dd !92 MB: raw data from Linrad timf2
|
||||
character*80 fname80
|
||||
common/datcom/dd(4,NSMAX,2),nutc,newdat2,kbuf,kxp,kk,kkdone,nlost, &
|
||||
nlen,fname80
|
5
db.f
5
db.f
@ -1,5 +0,0 @@
|
||||
real function db(x)
|
||||
db=-99.0
|
||||
if(x.gt.1.259e-10) db=10.0*log10(x)
|
||||
return
|
||||
end
|
87
decode1.f90
87
decode1.f90
@ -1,87 +0,0 @@
|
||||
subroutine decode1(iarg)
|
||||
|
||||
! Get data and parameters from gcom, then call the decoders when needed.
|
||||
! This routine runs in a background thread and will never return.
|
||||
|
||||
#ifdef CVF
|
||||
use dflib
|
||||
#endif
|
||||
|
||||
character sending0*28,mode0*6,cshort*11
|
||||
integer sendingsh0
|
||||
|
||||
include 'datcom.f90'
|
||||
include 'gcom1.f90'
|
||||
include 'gcom2.f90'
|
||||
include 'gcom3.f90'
|
||||
include 'gcom4.f90'
|
||||
data kbuf0/0/,ns00/-999/
|
||||
data sending0/' '/
|
||||
save
|
||||
|
||||
kkdone=-99
|
||||
ns0=999999
|
||||
newdat2=0
|
||||
kbuf=1
|
||||
|
||||
10 continue
|
||||
if(newdat2.gt.0) then
|
||||
call getfile2(fname80,nlen)
|
||||
newdat2=0
|
||||
kbuf=1
|
||||
kk=NSMAX
|
||||
kkdone=0
|
||||
newdat=1
|
||||
endif
|
||||
|
||||
if(kbuf.ne.kbuf0) kkdone=0
|
||||
kbuf0=kbuf
|
||||
kkk=kk
|
||||
if(kbuf.eq.2) kkk=kk-5760000
|
||||
n=Tsec
|
||||
|
||||
if((ndiskdat.eq.1 .or. ndecoding.eq.0) .and. ((kkk-kkdone).gt.32768)) then
|
||||
call symspec(dd,kbuf,kk,kkdone,nutc,newdat)
|
||||
call sleep_msec(10)
|
||||
endif
|
||||
|
||||
if(ndecoding.gt.0 .and. mode(1:4).eq.'JT65') then
|
||||
ndecdone=0
|
||||
call map65a(newdat)
|
||||
if(mousebutton.eq.0) ndecoding0=ndecoding
|
||||
ndecoding=0
|
||||
endif
|
||||
|
||||
if(ns0.lt.0) then
|
||||
rewind 21
|
||||
ns0=999999
|
||||
endif
|
||||
if(n.lt.ns0 .and. utcdate(1:1).eq.'2') then
|
||||
call cs_lock('decode1a')
|
||||
write(21,1001) utcdate(:11)
|
||||
1001 format(/'UTC Date: ',a11/'---------------------')
|
||||
ns0=n
|
||||
call cs_unlock
|
||||
endif
|
||||
|
||||
if(transmitting.eq.1 .and. (sending.ne.sending0 .or. &
|
||||
sendingsh.ne.sendingsh0 .or. mode.ne.mode0)) then
|
||||
ih=n/3600
|
||||
im=mod(n/60,60)
|
||||
is=mod(n,60)
|
||||
cshort=' '
|
||||
if(sendingsh.eq.1) cshort='(Shorthand)'
|
||||
call cs_lock('decode1b')
|
||||
write(21,1010) ih,im,is,mode,sending,cshort
|
||||
1010 format(3i2.2,' Transmitting: ',a6,2x,a28,2x,a11)
|
||||
call flushqqq(21)
|
||||
call cs_unlock
|
||||
sending0=sending
|
||||
sendingsh0=sendingsh
|
||||
mode0=mode
|
||||
endif
|
||||
|
||||
call sleep_msec(100) !### was 100
|
||||
go to 10
|
||||
|
||||
end subroutine decode1
|
110
decode1a.f
110
decode1a.f
@ -1,110 +0,0 @@
|
||||
subroutine decode1a(dd,newdat,freq,nflip,
|
||||
+ mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi,ndphi,
|
||||
+ ipol,sync2,a,dt,pol,nkv,nhist,qual,decoded)
|
||||
|
||||
C Apply AFC corrections to a candidate JT65 signal, and then try
|
||||
C to decode it.
|
||||
|
||||
parameter (NFFT1=77760,NFFT2=2430)
|
||||
parameter (NMAX=60*96000) !Samples per 60 s
|
||||
real*4 dd(4,NMAX) !92 MB: raw data from Linrad timf2
|
||||
complex c2x(NMAX/4), c2y(NMAX/4) !After 1/4 filter and downsample
|
||||
complex c3x(NMAX/16),c3y(NMAX/16) !After 1/16 filter and downsample
|
||||
complex c4x(NMAX/64),c4y(NMAX/64) !After 1/64 filter and downsample
|
||||
complex cx(NMAX/64), cy(NMAX/64) !Data at 1378.125 samples/s
|
||||
complex c5x(NMAX/256),c5y(NMAX/256),c5y0(NMAX/256)
|
||||
complex c5a(256), c5b(256)
|
||||
complex z
|
||||
|
||||
real s2(256,126)
|
||||
real a(5)
|
||||
real*8 samratio
|
||||
logical first
|
||||
character decoded*22
|
||||
character mycall*12,hiscall*12,hisgrid*6
|
||||
data first/.true./,jjjmin/1000/,jjjmax/-1000/
|
||||
save
|
||||
|
||||
C Mix sync tone to baseband, low-pass filter, and decimate by 64
|
||||
dt00=dt
|
||||
C If freq=125.0 kHz, f0=48000 Hz.
|
||||
f0=1000*(freq-77.0) !Freq of sync tone (0-96000 Hz)
|
||||
call filbig(dd,NMAX,f0,newdat,cx,cy,n5)
|
||||
joff=0
|
||||
sqa=0.
|
||||
sqb=0.
|
||||
do i=1,n5
|
||||
sqa=sqa + real(cx(i))**2 + aimag(cx(i))**2
|
||||
sqb=sqb + real(cy(i))**2 + aimag(cy(i))**2
|
||||
enddo
|
||||
sqa=sqa/n5
|
||||
sqb=sqb/n5
|
||||
|
||||
C Find best DF, f1, f2, DT, and pol
|
||||
|
||||
! a(5)=dt00
|
||||
! fsample=1378.125
|
||||
! i0=nint((a(5)+0.5)*fsample)
|
||||
! if(i0.lt.1) i0=1
|
||||
! nz=n5+1-i0
|
||||
! call afc65b(cx(i0),cy(i0),nz,fsample,nflip,ipol,a,dt,
|
||||
! + ccfbest,dtbest)
|
||||
|
||||
call fil6521(cx,n5,c5x,n6)
|
||||
call fil6521(cy,n5,c5y0,n6)
|
||||
|
||||
! Adjust for cable length difference:
|
||||
z=cmplx(cos(dphi),sin(dphi))
|
||||
do i=1,n6
|
||||
c5y(i)=z*c5y0(i)
|
||||
enddo
|
||||
|
||||
fsample=1378.125/4.
|
||||
a(5)=dt00
|
||||
i0=nint((a(5)+0.5)*fsample) - 2
|
||||
if(i0.lt.1) i0=1
|
||||
nz=n6+1-i0
|
||||
|
||||
call afc65b(c5x(i0),c5y(i0),nz,fsample,nflip,ipol,a,dt,
|
||||
+ ccfbest,dtbest)
|
||||
|
||||
pol=a(4)/57.2957795
|
||||
aa=cos(pol)
|
||||
bb=sin(pol)
|
||||
sq0=aa*aa*sqa + bb*bb*sqb
|
||||
sync2=3.7*ccfbest/sq0
|
||||
|
||||
C Apply AFC corrections to the time-domain signal
|
||||
call twkfreq(cx,cy,n5,a)
|
||||
|
||||
C Compute spectrum at best polarization for each half symbol.
|
||||
C Adding or subtracting a small number (e.g., 5) to j may make it decode.
|
||||
nsym=126
|
||||
nfft=256
|
||||
j=(dt00+dtbest+2.685)*1378.125 + joff
|
||||
if(j.lt.0) j=0
|
||||
do k=1,nsym
|
||||
do i=1,nfft
|
||||
j=j+1
|
||||
c5a(i)=aa*cx(j) + bb*cy(j)
|
||||
enddo
|
||||
call four2a(c5a,nfft,1,1,1)
|
||||
do i=1,nfft
|
||||
j=j+1
|
||||
c5b(i)=aa*cx(j) + bb*cy(j)
|
||||
enddo
|
||||
call four2a(c5b,nfft,1,1,1)
|
||||
|
||||
do i=1,256
|
||||
s2(i,k)=real(c5a(i))**2 + aimag(c5a(i))**2 +
|
||||
+ real(c5b(i))**2 + aimag(c5b(i))**2
|
||||
enddo
|
||||
enddo
|
||||
|
||||
flip=nflip
|
||||
call decode65b(s2,flip,mycall,hiscall,hisgrid,neme,ndepth,
|
||||
+ nqd,nkv,nhist,qual,decoded)
|
||||
dt=dt00 + dtbest
|
||||
|
||||
return
|
||||
end
|
186
deep65.f
186
deep65.f
@ -1,186 +0,0 @@
|
||||
subroutine deep65(s3,mode65,neme,flip,mycall,hiscall,
|
||||
+ hisgrid,decoded,qual)
|
||||
|
||||
parameter (MAXCALLS=7000,MAXRPT=63)
|
||||
real s3(64,63)
|
||||
character callsign*12,grid*4,message*22,hisgrid*6,c*1,ceme*3
|
||||
character*12 mycall,hiscall
|
||||
character mycall0*12,hiscall0*12,hisgrid0*6
|
||||
character*22 decoded
|
||||
character*22 testmsg(2*MAXCALLS + 2 + MAXRPT)
|
||||
character*15 callgrid(MAXCALLS)
|
||||
character*180 line
|
||||
character*4 rpt(MAXRPT)
|
||||
integer ncode(63,2*MAXCALLS + 2 + MAXRPT)
|
||||
real pp(2*MAXCALLS + 2 + MAXRPT)
|
||||
common/mrscom/ mrs(63),mrs2(63)
|
||||
common/c3com/ mcall3a
|
||||
|
||||
data neme0/-99/
|
||||
data rpt/'-01','-02','-03','-04','-05',
|
||||
+ '-06','-07','-08','-09','-10',
|
||||
+ '-11','-12','-13','-14','-15',
|
||||
+ '-16','-17','-18','-19','-20',
|
||||
+ '-21','-22','-23','-24','-25',
|
||||
+ '-26','-27','-28','-29','-30',
|
||||
+ 'R-01','R-02','R-03','R-04','R-05',
|
||||
+ 'R-06','R-07','R-08','R-09','R-10',
|
||||
+ 'R-11','R-12','R-13','R-14','R-15',
|
||||
+ 'R-16','R-17','R-18','R-19','R-20',
|
||||
+ 'R-21','R-22','R-23','R-24','R-25',
|
||||
+ 'R-26','R-27','R-28','R-29','R-30',
|
||||
+ 'RO','RRR','73'/
|
||||
save
|
||||
|
||||
if(mycall.eq.mycall0 .and. hiscall.eq.hiscall0 .and.
|
||||
+ hisgrid.eq.hisgrid0 .and. mcall3a.eq.0 .and.
|
||||
+ neme.eq.neme0) go to 30
|
||||
|
||||
mcall3a=0
|
||||
call cs_lock('deep65a')
|
||||
rewind 23
|
||||
k=0
|
||||
icall=0
|
||||
do n=1,MAXCALLS
|
||||
if(n.eq.1) then
|
||||
callsign=hiscall
|
||||
do i=4,12
|
||||
if(ichar(callsign(i:i)).eq.0) callsign(i:i)=' '
|
||||
enddo
|
||||
grid=hisgrid(1:4)
|
||||
if(ichar(grid(3:3)).eq.0) grid(3:3)=' '
|
||||
if(ichar(grid(4:4)).eq.0) grid(4:4)=' '
|
||||
else
|
||||
read(23,1002,end=20) line
|
||||
1002 format (A80)
|
||||
if(line(1:4).eq.'ZZZZ') go to 20
|
||||
if(line(1:2).eq.'//') go to 10
|
||||
i1=index(line,',')
|
||||
if(i1.lt.4) go to 10
|
||||
i2=index(line(i1+1:),',')
|
||||
if(i2.lt.5) go to 10
|
||||
i2=i2+i1
|
||||
i3=index(line(i2+1:),',')
|
||||
if(i3.lt.1) i3=index(line(i2+1:),' ')
|
||||
i3=i2+i3
|
||||
callsign=line(1:i1-1)
|
||||
grid=line(i1+1:i2-1)
|
||||
ceme=line(i2+1:i3-1)
|
||||
if(neme.eq.1 .and. ceme.ne.'EME') go to 10
|
||||
endif
|
||||
|
||||
icall=icall+1
|
||||
j1=index(mycall,' ') - 1
|
||||
if(j1.le.-1) j1=12
|
||||
if(j1.lt.3) j1=6
|
||||
j2=index(callsign,' ') - 1
|
||||
if(j2.le.-1) j2=12
|
||||
if(j2.lt.3) j2=6
|
||||
j3=index(mycall,'/') ! j3>0 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.
|
||||
+ flip.gt.0.0 .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))
|
||||
|
||||
if(n.ge.2) then
|
||||
C 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))
|
||||
endif
|
||||
enddo
|
||||
10 continue
|
||||
enddo
|
||||
|
||||
20 continue
|
||||
call cs_unlock
|
||||
ntot=k
|
||||
neme0=neme
|
||||
|
||||
30 mycall0=mycall
|
||||
hiscall0=hiscall
|
||||
hisgrid0=hisgrid
|
||||
modified0=modified
|
||||
ref0=0.
|
||||
do j=1,63
|
||||
ref0=ref0 + s3(mrs(j),j)
|
||||
enddo
|
||||
|
||||
p1=-1.e30
|
||||
p2=-1.e30
|
||||
do k=1,ntot
|
||||
pp(k)=0.
|
||||
! 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)) then
|
||||
ref=ref - s3(i,j) + s3(mrs2(j),j)
|
||||
endif
|
||||
enddo
|
||||
p=sum/ref
|
||||
pp(k)=p
|
||||
if(p.gt.p1) then
|
||||
p1=p
|
||||
ip1=k
|
||||
endif
|
||||
endif
|
||||
enddo
|
||||
|
||||
do i=1,ntot
|
||||
if(pp(i).gt.p2 .and. pp(i).ne.p1) p2=pp(i)
|
||||
enddo
|
||||
|
||||
C ### DO NOT REMOVE ###
|
||||
call cs_lock('deep65b')
|
||||
rewind 77
|
||||
write(77,*) p1,p2
|
||||
call cs_unlock
|
||||
|
||||
C ### Works OK without it (in both Windows and Linux) if compiled
|
||||
C ### without optimization. However, in Windows this is a colossal
|
||||
C ### pain because of the way McMillan Installer wants to run the
|
||||
C ### compile step.
|
||||
|
||||
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) stop 'Error in deep65'
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
return
|
||||
end
|
29
detect.f
29
detect.f
@ -1,29 +0,0 @@
|
||||
subroutine detect(data,npts,f,y)
|
||||
|
||||
C Compute powers at the tone frequencies using 1-sample steps.
|
||||
|
||||
parameter (NZ=11025,NSPD=25)
|
||||
real data(npts)
|
||||
real y(npts)
|
||||
complex c(NZ)
|
||||
complex csum
|
||||
data twopi/6.283185307/
|
||||
|
||||
dpha=twopi*f/11025.0
|
||||
do i=1,npts
|
||||
c(i)=data(i)*cmplx(cos(dpha*i),-sin(dpha*i))
|
||||
enddo
|
||||
|
||||
csum=0.
|
||||
do i=1,NSPD
|
||||
csum=csum+c(i)
|
||||
enddo
|
||||
|
||||
y(1)=real(csum)**2 + aimag(csum)**2
|
||||
do i=2,npts-(NSPD-1)
|
||||
csum=csum-c(i-1)+c(i+NSPD-1)
|
||||
y(i)=real(csum)**2 + aimag(csum)**2
|
||||
enddo
|
||||
|
||||
return
|
||||
end
|
325
devsetup.cpp
Normal file
325
devsetup.cpp
Normal file
@ -0,0 +1,325 @@
|
||||
#include "devsetup.h"
|
||||
#include "mainwindow.h"
|
||||
#include <QDebug>
|
||||
#include <portaudio.h>
|
||||
|
||||
#define MAXDEVICES 100
|
||||
|
||||
//----------------------------------------------------------- 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<numDevices; id++) {
|
||||
if(96000 >= 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; id<numDevices; id++ ) {
|
||||
pdi=Pa_GetDeviceInfo(id);
|
||||
nchout=pdi->maxOutputChannels;
|
||||
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.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.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.cal570SpinBox->setValue(m_cal570);
|
||||
sscanf(m_colors.toAscii(),"%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_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_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_cal570=ui.cal570SpinBox->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()) {
|
||||
}
|
||||
}
|
83
devsetup.h
Normal file
83
devsetup.h
Normal file
@ -0,0 +1,83 @@
|
||||
#ifndef DEVSETUP_H
|
||||
#define DEVSETUP_H
|
||||
|
||||
#include <QDialog>
|
||||
#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;
|
||||
|
||||
double m_fAdd;
|
||||
double m_cal570;
|
||||
|
||||
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;
|
||||
|
||||
QString m_myCall;
|
||||
QString m_myGrid;
|
||||
QString m_saveDir;
|
||||
QString m_azelDir;
|
||||
QString m_dxccPfx;
|
||||
QString m_colors;
|
||||
|
||||
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();
|
||||
|
||||
private:
|
||||
int r,g,b,r0,g0,b0,r1,g1,b1,r2,g2,b2,r3,g3,b3;
|
||||
Ui::DialogSndCard ui;
|
||||
};
|
||||
|
||||
#endif // DEVSETUP_H
|
1583
devsetup.ui
Normal file
1583
devsetup.ui
Normal file
File diff suppressed because it is too large
Load Diff
15
displaytext.cpp
Normal file
15
displaytext.cpp
Normal file
@ -0,0 +1,15 @@
|
||||
#include "displaytext.h"
|
||||
#include <QDebug>
|
||||
#include <QMouseEvent>
|
||||
|
||||
DisplayText::DisplayText(QWidget *parent) :
|
||||
QTextBrowser(parent)
|
||||
{
|
||||
}
|
||||
|
||||
void DisplayText::mouseDoubleClickEvent(QMouseEvent *e)
|
||||
{
|
||||
bool ctrl = (e->modifiers() & 0x4000000);
|
||||
emit(selectCallsign(ctrl));
|
||||
QTextBrowser::mouseDoubleClickEvent(e);
|
||||
}
|
22
displaytext.h
Normal file
22
displaytext.h
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef DISPLAYTEXT_H
|
||||
#define DISPLAYTEXT_H
|
||||
|
||||
#include <QTextBrowser>
|
||||
|
||||
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
|
4
f2py.py
4
f2py.py
@ -1,4 +0,0 @@
|
||||
#!/usr/bin/env python.exe
|
||||
# See http://cens.ioc.ee/projects/f2py2e/
|
||||
import f2py2e
|
||||
f2py2e.main()
|
69
ffft.f
Normal file
69
ffft.f
Normal file
@ -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
|
BIN
fftw3single.lib
BIN
fftw3single.lib
Binary file not shown.
67
fil651.f
67
fil651.f
@ -1,67 +0,0 @@
|
||||
subroutine fil651(d,n1,c,n2)
|
||||
|
||||
C FIR lowpass mixing filter designed with ScopeFIR. Real in, complex out.
|
||||
|
||||
C fsample = 5512.5 Hz
|
||||
C Ntaps = 31
|
||||
C fc = 1000 Hz
|
||||
C fstop = 1378.125 Hz
|
||||
C Ripple = 0.5 dB
|
||||
C Stop Atten = 50 dB
|
||||
C fmix = 1378.125 Hz
|
||||
C fout = 2706.25 Hz
|
||||
|
||||
parameter (NTAPS=31)
|
||||
parameter (NH=NTAPS/2)
|
||||
parameter (NDOWN=2) !Downsample ratio
|
||||
|
||||
real d(n1)
|
||||
complex c(n2)
|
||||
|
||||
complex ck(-NH:NH)
|
||||
data ck/
|
||||
+ (-0.000000073578,-0.000859869243),
|
||||
+ ( 0.008518289457,-0.000000680308),
|
||||
+ ( 0.000000834309, 0.011250152594),
|
||||
+ (-0.001061705254, 0.000000072679),
|
||||
+ ( 0.000000875897, 0.013958392128),
|
||||
+ (-0.010047338711, 0.000000573160),
|
||||
+ ( 0.000000770320, 0.015003869984),
|
||||
+ (-0.025027880956, 0.000001142192),
|
||||
+ ( 0.000000285583, 0.007151700551),
|
||||
+ (-0.043634723888, 0.000001493512),
|
||||
+ (-0.000000478847,-0.016788108005),
|
||||
+ (-0.061886192046, 0.000001412144),
|
||||
+ (-0.000001258694,-0.073548459509),
|
||||
+ (-0.075261027462, 0.000000858668),
|
||||
+ (-0.000001749252,-0.306638863572),
|
||||
+ ( 0.419826269508, 0.000000000000),
|
||||
+ (-0.000001749252, 0.306638863572),
|
||||
+ (-0.075261027462,-0.000000858668),
|
||||
+ (-0.000001258694, 0.073548459509),
|
||||
+ (-0.061886192046,-0.000001412144),
|
||||
+ (-0.000000478847, 0.016788108005),
|
||||
+ (-0.043634723888,-0.000001493512),
|
||||
+ ( 0.000000285583,-0.007151700551),
|
||||
+ (-0.025027880956,-0.000001142192),
|
||||
+ ( 0.000000770320,-0.015003869984),
|
||||
+ (-0.010047338711,-0.000000573160),
|
||||
+ ( 0.000000875897,-0.013958392128),
|
||||
+ (-0.001061705254,-0.000000072679),
|
||||
+ ( 0.000000834309,-0.011250152594),
|
||||
+ ( 0.008518289457, 0.000000680308),
|
||||
+ (-0.000000073578, 0.000859869243)/
|
||||
|
||||
n2=(n1-NTAPS+NDOWN)/NDOWN
|
||||
k0=NH-NDOWN+1
|
||||
|
||||
do i=1,n2
|
||||
c(i)=0.
|
||||
k=k0 + NDOWN*i
|
||||
do j=-NH,NH
|
||||
c(i)=c(i) + d(j+k)*conjg(ck(j))
|
||||
enddo
|
||||
enddo
|
||||
|
||||
return
|
||||
end
|
44
fil652.f
44
fil652.f
@ -1,44 +0,0 @@
|
||||
subroutine fil652(c1,n1,c2,n2)
|
||||
|
||||
C FIR lowpass filter designed using ScopeFIR
|
||||
|
||||
C fsample = 2756.25 Hz
|
||||
C Ntaps = 31
|
||||
C fc = 500 Hz
|
||||
C fstop = 689.0625 Hz
|
||||
C Ripple = 0.5 dB
|
||||
C Stop Atten = 50 dB
|
||||
C fout = 1378.125 Hz
|
||||
|
||||
parameter (NTAPS=31)
|
||||
parameter (NH=NTAPS/2)
|
||||
parameter (NDOWN=2) !Downsample ratio
|
||||
complex c1(n1)
|
||||
complex c2(n2)
|
||||
|
||||
C Filter coefficients:
|
||||
real a(-NH:NH)
|
||||
data a/
|
||||
+ -0.000859869246,-0.008518289484,-0.011250152625,-0.001061705256,
|
||||
+ 0.013958392156, 0.010047338728,-0.015003870003,-0.025027880982,
|
||||
+ 0.007151700557, 0.043634723913, 0.016788108012,-0.061886192062,
|
||||
+ -0.073548459520, 0.075261027466, 0.306638863577, 0.419826269508,
|
||||
+ 0.306638863577, 0.075261027466,-0.073548459520,-0.061886192062,
|
||||
+ 0.016788108012, 0.043634723913, 0.007151700557,-0.025027880982,
|
||||
+ -0.015003870003, 0.010047338728, 0.013958392156,-0.001061705256,
|
||||
+ -0.011250152625,-0.008518289484,-0.000859869246/
|
||||
|
||||
n2=(n1-NTAPS+NDOWN)/NDOWN
|
||||
k0=NH-NDOWN+1
|
||||
|
||||
C Loop over all output samples
|
||||
do i=1,n2
|
||||
c2(i)=0.
|
||||
k=k0 + NDOWN*i
|
||||
do j=-NH,NH
|
||||
c2(i)=c2(i) + c1(j+k)*a(j)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
return
|
||||
end
|
49
fil653.f
49
fil653.f
@ -1,49 +0,0 @@
|
||||
subroutine fil653(c1,n1,c2,n2)
|
||||
|
||||
C FIR lowpass filter designed using ScopeFIR
|
||||
|
||||
C fsample = 1378.125 Hz
|
||||
C Ntaps = 45
|
||||
C fc = 100 Hz
|
||||
C fstop = 172.265625 Hz
|
||||
C Ripple = 0.5 dB
|
||||
C Stop Atten = 50 dB
|
||||
C fout = 172.265625 Hz
|
||||
C BW = 200 Hz
|
||||
|
||||
parameter (NTAPS=45)
|
||||
parameter (NH=NTAPS/2)
|
||||
parameter (NDOWN=4) !Downsample ratio
|
||||
complex c1(n1)
|
||||
complex c2(n2)
|
||||
|
||||
C Filter coefficients:
|
||||
real a(-NH:NH)
|
||||
data a/
|
||||
+ -0.000005569862,-0.002503777832,-0.004040335617,-0.005717910288,
|
||||
+ -0.006153385485,-0.004446125293,-0.000305215272, 0.005557289511,
|
||||
+ 0.011329120672, 0.014496551280, 0.012703875898, 0.004837591829,
|
||||
+ -0.008060363689,-0.022474422302,-0.032964876083,-0.033575486327,
|
||||
+ -0.019743889907, 0.009895672340, 0.052467109908, 0.101031155027,
|
||||
+ 0.146073001698, 0.177927966814, 0.189427119395, 0.177927966814,
|
||||
+ 0.146073001698, 0.101031155027, 0.052467109908, 0.009895672340,
|
||||
+ -0.019743889907,-0.033575486327,-0.032964876083,-0.022474422302,
|
||||
+ -0.008060363689, 0.004837591829, 0.012703875898, 0.014496551280,
|
||||
+ 0.011329120672, 0.005557289511,-0.000305215272,-0.004446125293,
|
||||
+ -0.006153385485,-0.005717910288,-0.004040335617,-0.002503777832,
|
||||
+ -0.000005569862/
|
||||
|
||||
n2=(n1-NTAPS+NDOWN)/NDOWN
|
||||
k0=NH-NDOWN+1
|
||||
|
||||
C Loop over all output samples
|
||||
do i=1,n2
|
||||
c2(i)=0.
|
||||
k=k0 + NDOWN*i
|
||||
do j=-NH,NH
|
||||
c2(i)=c2(i) + c1(j+k)*a(j)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
return
|
||||
end
|
119
filbig.f
119
filbig.f
@ -1,119 +0,0 @@
|
||||
subroutine filbig(dd,nmax,f0,newdat,c4a,c4b,n4)
|
||||
|
||||
C Filter and downsample complex data for X and Y polarizations,
|
||||
C stored in array dd(4,nmax). Output is downsampled from 96000 Hz
|
||||
C to 1500 Hz, and the low-pass filter has f_cutoff = 375 Hz and
|
||||
C f_stop = 750 Hz.
|
||||
|
||||
parameter (NFFT1=5376000,NFFT2=77175)
|
||||
real*4 dd(4,nmax) !Input data
|
||||
complex c4a(NFFT2),c4b(NFFT2) !Output data
|
||||
complex ca(NFFT1),cb(NFFT1) !FFTs of input
|
||||
real*8 df
|
||||
C Impulse response of filter (one side)
|
||||
real halfpulse(8)
|
||||
complex cfilt(NFFT2)
|
||||
!Filter (complex; imag = 0)
|
||||
real rfilt(NFFT2) !Filter (real)
|
||||
integer plan1,plan2,plan3,plan4,plan5
|
||||
logical first
|
||||
include 'fftw3.f'
|
||||
equivalence (rfilt,cfilt)
|
||||
data first/.true./
|
||||
data halfpulse/114.97547150,36.57879257,-20.93789101,
|
||||
+ 5.89886379,1.59355187,-2.49138308,0.60910773,-0.04248129/
|
||||
save
|
||||
|
||||
if(nmax.lt.0) go to 900
|
||||
if(first) then
|
||||
npatience=1
|
||||
nflags=FFTW_ESTIMATE
|
||||
if(npatience.eq.1) nflags=FFTW_ESTIMATE_PATIENT
|
||||
if(npatience.eq.2) nflags=FFTW_MEASURE
|
||||
if(npatience.eq.3) nflags=FFTW_PATIENT
|
||||
if(npatience.eq.4) nflags=FFTW_EXHAUSTIVE
|
||||
C Plan the FFTs just once
|
||||
call sfftw_plan_dft_1d_(plan1,NFFT1,ca,ca,
|
||||
+ FFTW_BACKWARD,nflags)
|
||||
call sfftw_plan_dft_1d_(plan2,NFFT1,cb,cb,
|
||||
+ FFTW_BACKWARD,nflags)
|
||||
call sfftw_plan_dft_1d_(plan3,NFFT2,c4a,c4a,
|
||||
+ FFTW_FORWARD,nflags)
|
||||
call sfftw_plan_dft_1d_(plan4,NFFT2,c4b,c4b,
|
||||
+ FFTW_FORWARD,nflags)
|
||||
call sfftw_plan_dft_1d_(plan5,NFFT2,cfilt,cfilt,
|
||||
+ FFTW_BACKWARD,nflags)
|
||||
|
||||
C Convert impulse response to filter function
|
||||
do i=1,NFFT2
|
||||
cfilt(i)=0.
|
||||
enddo
|
||||
fac=0.00625/NFFT1
|
||||
cfilt(1)=fac*halfpulse(1)
|
||||
do i=2,8
|
||||
cfilt(i)=fac*halfpulse(i)
|
||||
cfilt(NFFT2+2-i)=fac*halfpulse(i)
|
||||
enddo
|
||||
call sfftw_execute_(plan5)
|
||||
|
||||
base=cfilt(NFFT2/2+1)
|
||||
do i=1,NFFT2
|
||||
rfilt(i)=real(cfilt(i))-base
|
||||
enddo
|
||||
|
||||
df=96000.d0/NFFT1
|
||||
first=.false.
|
||||
endif
|
||||
|
||||
C When new data comes along, we need to compute a new "big FFT"
|
||||
C If we just have a new f0, continue with the existing ca and cb.
|
||||
|
||||
if(newdat.ne.0) then
|
||||
nz=min(nmax,NFFT1)
|
||||
do i=1,nz
|
||||
ca(i)=cmplx(dd(1,i),dd(2,i))
|
||||
cb(i)=cmplx(dd(3,i),dd(4,i))
|
||||
enddo
|
||||
|
||||
if(nmax.lt.NFFT1) then
|
||||
do i=nmax+1,NFFT1
|
||||
ca(i)=0.
|
||||
cb(i)=0.
|
||||
enddo
|
||||
endif
|
||||
call sfftw_execute_(plan1)
|
||||
call sfftw_execute_(plan2)
|
||||
newdat=0
|
||||
endif
|
||||
|
||||
C NB: f0 is the frequency at which we want our filter centered.
|
||||
C i0 is the bin number in ca and cb closest to f0.
|
||||
|
||||
i0=nint(f0/df) + 1
|
||||
nh=NFFT2/2
|
||||
do i=1,nh !Copy data into c4a and c4b,
|
||||
j=i0+i-1 !and apply the filter function
|
||||
c4a(i)=rfilt(i)*ca(j)
|
||||
c4b(i)=rfilt(i)*cb(j)
|
||||
enddo
|
||||
do i=nh+1,NFFT2
|
||||
j=i0+i-1-NFFT2
|
||||
if(j.lt.1) j=j+NFFT1 !NFFT1 was NFFT2
|
||||
c4a(i)=rfilt(i)*ca(j)
|
||||
c4b(i)=rfilt(i)*cb(j)
|
||||
enddo
|
||||
|
||||
C Do the short reverse transform, to go back to time domain.
|
||||
call sfftw_execute_(plan3)
|
||||
call sfftw_execute_(plan4)
|
||||
n4=min(nmax/64,NFFT2)
|
||||
go to 999
|
||||
|
||||
900 call sfftw_destroy_plan_(plan1)
|
||||
call sfftw_destroy_plan_(plan2)
|
||||
call sfftw_destroy_plan_(plan3)
|
||||
call sfftw_destroy_plan_(plan4)
|
||||
call sfftw_destroy_plan_(plan5)
|
||||
|
||||
999 return
|
||||
end
|
36
files.txt
36
files.txt
@ -1,36 +0,0 @@
|
||||
LU fname write read write thread
|
||||
--------------------------------------------------------------------------
|
||||
10 *.tf2 getfile2
|
||||
11 prefixes.txt pfxdump GUI GUI (once only)
|
||||
11 decoded.txt map65a GUI decoder (60 s)
|
||||
12
|
||||
13 tsky.dat astro0.F
|
||||
14 azel.dat astro0.F GUI (1 s)
|
||||
15
|
||||
16
|
||||
17 *.tf2 savetf2 decoder
|
||||
18 TxData wsjtgen
|
||||
19 messages.txt display.txt GUI decoder
|
||||
20 bandmap.txt display.txt GUI decoder
|
||||
21 ALL65.TXT map65a decoder
|
||||
22 kvasd.dat extract KVASD decoder
|
||||
23 CALL3.TXT deep65 decoder
|
||||
24 meas24.txt savetf2 decoder
|
||||
25 meas25.txt savetf2 decoder
|
||||
26 tmp26.txt map65a,display display decoder
|
||||
27 dphi.txt map65a decoder
|
||||
28
|
||||
29 debug.txt
|
||||
77 deep65 decoder
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
So ... the problem may be writing to azel.dat from the GUI thread?
|
||||
(Could put astro data into a common, and write to file from decode1.F90.)
|
||||
|
||||
Also: look at write(line,...) forms ...
|
||||
|
||||
unpackgrid unpackmsg symspec display savetf2 (all in decoder thread)
|
||||
|
||||
read(char,...)
|
||||
|
||||
packcall packgrid astro0 display getfile2
|
250
fivehz.f90
250
fivehz.f90
@ -1,250 +0,0 @@
|
||||
subroutine fivehz
|
||||
|
||||
! Called at interrupt level from the PortAudio callback routine.
|
||||
! For nspb=2048 the callback rate is nfsample/nspb = 5.38 Hz.
|
||||
! Thus, we should be able to control the timing of T/R sequence events
|
||||
! here to within about 0.2 s.
|
||||
|
||||
! Do not do anything very time consuming in this routine!!
|
||||
! Disk I/O is a bad idea. Writing to stdout (for diagnostic purposes)
|
||||
! seems to be OK.
|
||||
|
||||
#ifdef CVF
|
||||
use dflib
|
||||
use dfport
|
||||
#endif
|
||||
|
||||
parameter (NTRING=64)
|
||||
real*8 tt1(0:NTRING-1)
|
||||
logical first,txtime,filled
|
||||
integer ptt
|
||||
integer TxOKz
|
||||
real*8 fs,fsample,tt,u
|
||||
include 'gcom1.f90'
|
||||
include 'gcom2.f90'
|
||||
data first/.true./,nc0/1/,nc1/1/
|
||||
save
|
||||
|
||||
n1=time()
|
||||
n2=mod(n1,86400)
|
||||
tt=n1-n2+tsec-0.1d0*ndsec
|
||||
|
||||
if(first) then
|
||||
rxdelay=0.2
|
||||
txdelay=0.4
|
||||
tlatency=1.0
|
||||
first=.false.
|
||||
iptt=0
|
||||
ntr0=-99
|
||||
rxdone=.false.
|
||||
ibuf00=-99
|
||||
ncall=-1
|
||||
u=0.05d0
|
||||
fsample=11025.d0
|
||||
mfsample=110250
|
||||
filled=.false.
|
||||
endif
|
||||
|
||||
if(txdelay.lt.0.2d0) txdelay=0.2d0
|
||||
|
||||
! Measure average sampling frequency over a recent interval
|
||||
ncall=ncall+1
|
||||
if(ncall.eq.9) then
|
||||
ntt0=0
|
||||
ntt1=0
|
||||
tt1(ntt1)=tt
|
||||
endif
|
||||
! if(ncall.ge.10 .and. mod(ncall,2).eq.1) then
|
||||
if(ncall.ge.10) then
|
||||
ntt1=iand(ntt1+1,NTRING-1)
|
||||
tt1(ntt1)=tt
|
||||
if(ntt1.eq.NTRING-1) filled=.true.
|
||||
if(filled) ntt0=iand(ntt1+1,NTRING-1)
|
||||
if(mod(ncall,2).eq.1) then
|
||||
nd=ntt1-ntt0
|
||||
if(nd.lt.0) nd=nd+NTRING
|
||||
fs=nd*2048.d0/(tt1(ntt1)-tt1(ntt0))
|
||||
fsample=u*fs + (1.d0-u)*fsample
|
||||
mfsample=nint(10.d0*fsample)
|
||||
endif
|
||||
endif
|
||||
|
||||
if(trperiod.le.0) trperiod=30
|
||||
tx1=0.0 !Time to start a TX sequence
|
||||
tx2=trperiod-(tlatency+txdelay) !Time to turn TX off
|
||||
if(mode(1:4).eq.'JT65') then
|
||||
if(nwave.lt.126*4096) nwave=126*4096
|
||||
tx2=txdelay + nwave/11025.0
|
||||
if(tx2.gt.(trperiod-2.0)) tx2=trperiod-tlatency-1.0
|
||||
endif
|
||||
|
||||
if(TxFirst.eq.0) then
|
||||
tx1=tx1+trperiod
|
||||
tx2=tx2+trperiod
|
||||
endif
|
||||
|
||||
t=mod(Tsec,2.d0*trperiod)
|
||||
txtime = t.ge.tx1 .and. t.lt.tx2
|
||||
|
||||
! If we're transmitting, freeze the input buffer pointers where they were.
|
||||
receiving=1
|
||||
if(((txtime .and. (lauto.eq.1)) .or. TxOK.eq.1 .or. transmitting.eq.1) &
|
||||
.and. (mute.eq.0)) then
|
||||
receiving=0
|
||||
ibuf=ibuf000
|
||||
iwrite=iwrite000
|
||||
endif
|
||||
ibuf000=ibuf
|
||||
iwrite000=iwrite
|
||||
nsec=Tsec
|
||||
ntr=mod(nsec/trperiod,2) !ntr=0 in 1st sequence, 1 in 2nd
|
||||
|
||||
if(ntr.ne.ntr0) then
|
||||
ibuf0=ibuf !Start of new sequence, save ibuf
|
||||
! if(mode(1:4).ne.'JT65') then
|
||||
! ibuf0=ibuf0+3 !So we don't copy our own Tx
|
||||
! if(ibuf0.gt.1024) ibuf0=ibuf0-1024
|
||||
! endif
|
||||
ntime=time() !Save start time
|
||||
if(mantx.eq.1 .and. iptt.eq.1) then
|
||||
mantx=0
|
||||
TxOK=0
|
||||
endif
|
||||
endif
|
||||
|
||||
! Switch PTT line and TxOK appropriately
|
||||
if(lauto.eq.1) then
|
||||
if(txtime .and. iptt.eq.0 .and. &
|
||||
mute.eq.0) i1=ptt(nport,pttport,1,iptt) !Raise PTT
|
||||
if(.not.txtime .or. mute.eq.1) TxOK=0 !Lower TxOK
|
||||
else
|
||||
if(mantx.eq.1 .and. iptt.eq.0 .and. &
|
||||
mute.eq.0) i2=ptt(nport,pttport,1,iptt) !Raise PTT
|
||||
if(mantx.eq.0 .or. mute.eq.1) TxOK=0 !Lower TxOK
|
||||
endif
|
||||
|
||||
! Calculate Tx waveform as needed
|
||||
if((iptt.eq.1 .and. iptt0.eq.0) .or. nrestart.eq.1) then
|
||||
call wsjtgen
|
||||
nrestart=0
|
||||
endif
|
||||
|
||||
! If PTT was just raised, start a countdown for raising TxOK:
|
||||
nc1a=txdelay/0.18576
|
||||
if(nc1a.lt.2) nc1a=2
|
||||
if(iptt.eq.1 .and. iptt0.eq.0) nc1=-nc1a-1
|
||||
if(nc1.le.0) nc1=nc1+1
|
||||
if(nc1.eq.0) TxOK=1 ! We are transmitting
|
||||
|
||||
! If TxOK was just lowered, start a countdown for lowering PTT:
|
||||
nc0a=(tlatency+txdelay)/0.18576
|
||||
if(nc0a.lt.5) nc0a=5
|
||||
if(TxOK.eq.0 .and. TxOKz.eq.1 .and. iptt.eq.1) nc0=-nc0a-1
|
||||
if(nc0.le.0) nc0=nc0+1
|
||||
if(nc0.eq.0) i3=ptt(nport,pttport,0,iptt)
|
||||
|
||||
if(iptt.eq.0 .and.TxOK.eq.0) then
|
||||
sending=" "
|
||||
sendingsh=0
|
||||
endif
|
||||
|
||||
nbufs=ibuf-ibuf0
|
||||
if(nbufs.lt.0) nbufs=nbufs+1024
|
||||
tdata=nbufs*2048.0/11025.0
|
||||
if(mode(1:4).eq.'JT65' .and. monitoring.eq.1 .and. tdata.gt.53.0 &
|
||||
.and. ibuf0.ne.ibuf00) then
|
||||
rxdone=.true.
|
||||
ibuf00=ibuf0
|
||||
endif
|
||||
iptt0=iptt
|
||||
TxOKz=TxOK
|
||||
ntr0=ntr
|
||||
|
||||
return
|
||||
end subroutine fivehz
|
||||
|
||||
subroutine fivehztx
|
||||
|
||||
! Called at interrupt level from the PortAudio output callback.
|
||||
|
||||
#ifdef CVF
|
||||
use dflib
|
||||
use dfport
|
||||
#endif
|
||||
|
||||
parameter (NTRING=64)
|
||||
real*8 tt1(0:NTRING-1)
|
||||
logical first,filled
|
||||
real*8 fs,fsample,tt,u
|
||||
include 'gcom1.f90'
|
||||
data first/.true./
|
||||
save
|
||||
|
||||
n1=time()
|
||||
n2=mod(n1,86400)
|
||||
tt=n1-n2+tsec-0.1d0*ndsec
|
||||
|
||||
if(first) then
|
||||
first=.false.
|
||||
ncall=-1
|
||||
fsample=11025.d0
|
||||
u=0.05d0
|
||||
mfsample2=110250
|
||||
filled=.false.
|
||||
endif
|
||||
|
||||
! Measure average sampling frequency over a recent interval
|
||||
ncall=ncall+1
|
||||
if(ncall.eq.9) then
|
||||
ntt0=0
|
||||
ntt1=0
|
||||
tt1(ntt1)=tt
|
||||
endif
|
||||
if(ncall.ge.10) then
|
||||
ntt1=iand(ntt1+1,NTRING-1)
|
||||
tt1(ntt1)=tt
|
||||
if(ntt1.eq.NTRING-1) filled=.true.
|
||||
if(filled) ntt0=iand(ntt1+1,NTRING-1)
|
||||
if(mod(ncall,2).eq.1) then
|
||||
nd=ntt1-ntt0
|
||||
if(nd.lt.0) nd=nd+NTRING
|
||||
fs=nd*2048.d0/(tt1(ntt1)-tt1(ntt0))
|
||||
fsample=u*fs + (1.d0-u)*fsample
|
||||
mfsample2=nint(10.d0*fsample)
|
||||
endif
|
||||
endif
|
||||
|
||||
return
|
||||
end subroutine fivehztx
|
||||
|
||||
subroutine addnoise(n)
|
||||
integer*2 n
|
||||
real*8 txsnrdb0
|
||||
include 'gcom1.f90'
|
||||
data idum/0/
|
||||
save
|
||||
|
||||
if(txsnrdb.gt.40.0) return
|
||||
if(txsnrdb.ne.txsnrdb0) then
|
||||
snr=10.0**(0.05*(txsnrdb-1))
|
||||
fac=3000.0
|
||||
if(snr.gt.1.0) fac=3000.0/snr
|
||||
txsnrdb0=txsnrdb
|
||||
endif
|
||||
i=fac*(gran(idum) + n*snr/32768.0)
|
||||
if(i>32767) i=32767;
|
||||
if(i<-32767) i=-32767;
|
||||
n=i
|
||||
|
||||
return
|
||||
end subroutine addnoise
|
||||
|
||||
real function gran(idum)
|
||||
real r(12)
|
||||
if(idum.lt.0) then
|
||||
call random_seed
|
||||
idum=0
|
||||
endif
|
||||
call random_number(r)
|
||||
gran=sum(r)-6.0
|
||||
end function gran
|
5
fivehz.h
5
fivehz.h
@ -1,5 +0,0 @@
|
||||
#include <inttypes.h>
|
||||
|
||||
void addnoise_(int16_t *n2);
|
||||
void fivehztx_(void);
|
||||
void fivehz_(void);
|
30
flat1.f
30
flat1.f
@ -1,30 +0,0 @@
|
||||
subroutine flat1(psavg,s2,nh,nsteps,nhmax,nsmax)
|
||||
|
||||
real psavg(nh)
|
||||
real s2(nhmax,nsmax)
|
||||
real x(8192),tmp(33)
|
||||
|
||||
nsmo=33
|
||||
ia=nsmo/2 + 1
|
||||
ib=nh - nsmo/2 - 1
|
||||
do i=ia,ib
|
||||
call pctile(psavg(i-nsmo/2),tmp,nsmo,50,x(i))
|
||||
enddo
|
||||
do i=1,ia-1
|
||||
x(i)=x(ia)
|
||||
enddo
|
||||
do i=ib+1,nh
|
||||
x(i)=x(ib)
|
||||
enddo
|
||||
|
||||
do i=1,nh
|
||||
psavg(i)=psavg(i)/x(i)
|
||||
do j=1,nsteps
|
||||
s2(i,j)=s2(i,j)/x(i)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
|
28
flat2.f
28
flat2.f
@ -1,28 +0,0 @@
|
||||
subroutine flat2(ss,n,nsum)
|
||||
|
||||
real ss(2048)
|
||||
real ref(2048)
|
||||
real tmp(2048)
|
||||
|
||||
nsmo=20
|
||||
base=50*(float(nsum)**1.5)
|
||||
ia=nsmo+1
|
||||
ib=n-nsmo-1
|
||||
do i=ia,ib
|
||||
call pctile(ss(i-nsmo),tmp,2*nsmo+1,50,ref(i))
|
||||
enddo
|
||||
call pctile(ref(ia),tmp,ib-ia+1,68,base2)
|
||||
|
||||
C Don't flatten if signal is extremely low (e.g., RX is off).
|
||||
if(base2.gt.0.05*base) then
|
||||
do i=ia,ib
|
||||
ss(i)=base*ss(i)/ref(i)
|
||||
enddo
|
||||
else
|
||||
do i=1,n
|
||||
ss(i)=0.
|
||||
enddo
|
||||
endif
|
||||
|
||||
return
|
||||
end
|
105
flatten.f
105
flatten.f
@ -1,105 +0,0 @@
|
||||
subroutine flatten(s2,nbins,jz,psa,ref,birdie,variance)
|
||||
|
||||
C Examines the 2-d spectrum s2(nbins,jz) and makes a reference spectrum
|
||||
C from the jz/2 spectra below the 50th percentile in total power. Uses
|
||||
C reference spectrum (with birdies removed) to flatten the passband.
|
||||
|
||||
real s2(nbins,jz) !2d spectrum
|
||||
real psa(nbins) !Grand average spectrum
|
||||
real ref(nbins) !Ref spect: smoothed ave of lower half
|
||||
real birdie(nbins) !Spec (with birdies) for plot, in dB
|
||||
real variance(nbins)
|
||||
real ref2(750) !Work array
|
||||
real power(300)
|
||||
|
||||
C Find power in each time block, then get median
|
||||
do j=1,jz
|
||||
s=0.
|
||||
do i=1,nbins
|
||||
s=s+s2(i,j)
|
||||
enddo
|
||||
power(j)=s
|
||||
enddo
|
||||
call pctile(power,ref2,jz,50,xmedian)
|
||||
if(jz.lt.5) go to 900
|
||||
|
||||
C Get variance in each freq channel, using only those spectra with
|
||||
C power below the median.
|
||||
do i=1,nbins
|
||||
s=0.
|
||||
nsum=0
|
||||
do j=1,jz
|
||||
if(power(j).le.xmedian) then
|
||||
s=s+s2(i,j)
|
||||
nsum=nsum+1
|
||||
endif
|
||||
enddo
|
||||
s=s/nsum
|
||||
sq=0.
|
||||
do j=1,jz
|
||||
if(power(j).le.xmedian) sq=sq + (s2(i,j)/s-1.0)**2
|
||||
enddo
|
||||
variance(i)=sq/nsum
|
||||
enddo
|
||||
|
||||
C Get grand average, and average of spectra with power below median.
|
||||
call zero(psa,nbins)
|
||||
call zero(ref,nbins)
|
||||
nsum=0
|
||||
do j=1,jz
|
||||
call add(psa,s2(1,j),psa,nbins)
|
||||
if(power(j).le.xmedian) then
|
||||
call add(ref,s2(1,j),ref,nbins)
|
||||
nsum=nsum+1
|
||||
endif
|
||||
enddo
|
||||
do i=1,nbins !Normalize the averages
|
||||
psa(i)=psa(i)/jz
|
||||
ref(i)=ref(i)/nsum
|
||||
birdie(i)=ref(i) !Copy ref into birdie
|
||||
enddo
|
||||
|
||||
C Compute smoothed reference spectrum with narrow lines (birdies) removed
|
||||
do i=4,nbins-3
|
||||
rmax=-1.e10
|
||||
do k=i-3,i+3 !Get highest point within +/- 3 bins
|
||||
if(ref(k).gt.rmax) then
|
||||
rmax=ref(k)
|
||||
kpk=k
|
||||
endif
|
||||
enddo
|
||||
sum=0.
|
||||
nsum=0
|
||||
do k=i-3,i+3
|
||||
if(abs(k-kpk).gt.1) then
|
||||
sum=sum+ref(k)
|
||||
nsum=nsum+1
|
||||
endif
|
||||
enddo
|
||||
ref2(i)=sum/nsum
|
||||
enddo
|
||||
call move(ref2(4),ref(4),nbins-6) !Copy smoothed ref back into ref
|
||||
|
||||
call pctile(ref(4),ref2,nbins-6,50,xmedian) !Get median in-band level
|
||||
|
||||
C Fix ends of reference spectrum
|
||||
do i=1,3
|
||||
ref(i)=ref(4)
|
||||
ref(nbins+1-i)=ref(nbins-3)
|
||||
enddo
|
||||
|
||||
facmax=30.0/xmedian
|
||||
do i=1,nbins !Flatten the 2d spectrum
|
||||
fac=xmedian/ref(i)
|
||||
fac=min(fac,facmax)
|
||||
do j=1,jz
|
||||
s2(i,j)=fac*s2(i,j)
|
||||
enddo
|
||||
psa(i)=dB(psa(i)) + 25.
|
||||
ref(i)=dB(ref(i)) + 25.
|
||||
birdie(i)=db(birdie(i)) + 25.
|
||||
enddo
|
||||
|
||||
900 continue
|
||||
return
|
||||
end
|
10
flushqqq.f90
10
flushqqq.f90
@ -1,10 +0,0 @@
|
||||
subroutine flushqqq(lu)
|
||||
|
||||
#ifdef CVF
|
||||
use dfport
|
||||
#endif
|
||||
|
||||
call flush(lu)
|
||||
|
||||
return
|
||||
end subroutine flushqqq
|
350
four2.f
350
four2.f
@ -1,350 +0,0 @@
|
||||
SUBROUTINE FOUR2a (DATA,N,NDIM,ISIGN,IFORM)
|
||||
|
||||
C Cooley-Tukey fast Fourier transform in USASI basic Fortran.
|
||||
C multi-dimensional transform, each dimension a power of two,
|
||||
C complex or real data.
|
||||
|
||||
C TRANSFORM(K1,K2,...) = SUM(DATA(J1,J2,...)*EXP(ISIGN*2*PI*SQRT(-1)
|
||||
C *((J1-1)*(K1-1)/N(1)+(J2-1)*(K2-1)/N(2)+...))), summed for all
|
||||
C J1 and K1 from 1 to N(1), J2 and K2 from 1 TO N(2),
|
||||
C etc, for all NDIM subscripts. NDIM must be positive and
|
||||
C each N(IDIM) must be a power of two. ISIGN is +1 or -1.
|
||||
C Let NTOT = N(1)*N(2)*...*N(NDIM). Then a -1 transform
|
||||
C followed by a +1 one (or vice versa) returns NTOT
|
||||
C times the original data.
|
||||
|
||||
C IFORM = 1, 0 or -1, as data is
|
||||
C complex, real, or the first half of a complex array. Transform
|
||||
C values are returned in array DATA. They are complex, real, or
|
||||
C the first half of a complex array, as IFORM = 1, -1 or 0.
|
||||
|
||||
C The transform of a real array (IFORM = 0) dimensioned N(1) by N(2)
|
||||
C by ... will be returned in the same array, now considered to
|
||||
C be complex of dimensions N(1)/2+1 by N(2) by .... Note that if
|
||||
C IFORM = 0 or -1, N(1) must be even, and enough room must be
|
||||
C reserved. The missing values may be obtained by complex conjuga-
|
||||
C tion.
|
||||
|
||||
C The reverse transformation of a half complex array dimensioned
|
||||
C N(1)/2+1 by N(2) by ..., is accomplished by setting IFORM
|
||||
C to -1. In the N array, N(1) must be the true N(1), not N(1)/2+1.
|
||||
C The transform will be real and returned to the input array.
|
||||
|
||||
C Running time is proportional to NTOT*LOG2(NTOT), rather than
|
||||
C the naive NTOT**2. Furthermore, less error is built up.
|
||||
|
||||
C Written by Norman Brenner of MIT Lincoln Laboratory, January 1969.
|
||||
C See IEEE Audio Transactions (June 1967), Special issue on FFT.
|
||||
|
||||
parameter(NMAX=2048*1024)
|
||||
DIMENSION DATA(NMAX), N(1)
|
||||
NTOT=1
|
||||
DO 10 IDIM=1,NDIM
|
||||
10 NTOT=NTOT*N(IDIM)
|
||||
IF (IFORM) 70,20,20
|
||||
20 NREM=NTOT
|
||||
DO 60 IDIM=1,NDIM
|
||||
NREM=NREM/N(IDIM)
|
||||
NPREV=NTOT/(N(IDIM)*NREM)
|
||||
NCURR=N(IDIM)
|
||||
IF (IDIM-1+IFORM) 30,30,40
|
||||
30 NCURR=NCURR/2
|
||||
40 CALL BITRV (DATA,NPREV,NCURR,NREM)
|
||||
CALL COOL2 (DATA,NPREV,NCURR,NREM,ISIGN)
|
||||
IF (IDIM-1+IFORM) 50,50,60
|
||||
50 CALL FIXRL (DATA,N(1),NREM,ISIGN,IFORM)
|
||||
NTOT=(NTOT/N(1))*(N(1)/2+1)
|
||||
60 CONTINUE
|
||||
RETURN
|
||||
70 NTOT=(NTOT/N(1))*(N(1)/2+1)
|
||||
NREM=1
|
||||
DO 100 JDIM=1,NDIM
|
||||
IDIM=NDIM+1-JDIM
|
||||
NCURR=N(IDIM)
|
||||
IF (IDIM-1) 80,80,90
|
||||
80 NCURR=NCURR/2
|
||||
CALL FIXRL (DATA,N(1),NREM,ISIGN,IFORM)
|
||||
NTOT=NTOT/(N(1)/2+1)*N(1)
|
||||
90 NPREV=NTOT/(N(IDIM)*NREM)
|
||||
CALL BITRV (DATA,NPREV,NCURR,NREM)
|
||||
CALL COOL2 (DATA,NPREV,NCURR,NREM,ISIGN)
|
||||
100 NREM=NREM*N(IDIM)
|
||||
RETURN
|
||||
END
|
||||
SUBROUTINE BITRV (DATA,NPREV,N,NREM)
|
||||
C SHUFFLE THE DATA BY BIT REVERSAL.
|
||||
C DIMENSION DATA(NPREV,N,NREM)
|
||||
C COMPLEX DATA
|
||||
C EXCHANGE DATA(J1,J4REV,J5) WITH DATA(J1,J4,J5) FOR ALL J1 FROM 1
|
||||
C TO NPREV, ALL J4 FROM 1 TO N (WHICH MUST BE A POWER OF TWO), AND
|
||||
C ALL J5 FROM 1 TO NREM. J4REV-1 IS THE BIT REVERSAL OF J4-1. E.G.
|
||||
C SUPPOSE N = 32. THEN FOR J4-1 = 10011, J4REV-1 = 11001, ETC.
|
||||
parameter(NMAX=2048*1024)
|
||||
DIMENSION DATA(NMAX)
|
||||
IP0=2
|
||||
IP1=IP0*NPREV
|
||||
IP4=IP1*N
|
||||
IP5=IP4*NREM
|
||||
I4REV=1
|
||||
C I4REV = 1+(J4REV-1)*IP1
|
||||
DO 60 I4=1,IP4,IP1
|
||||
C I4 = 1+(J4-1)*IP1
|
||||
IF (I4-I4REV) 10,30,30
|
||||
10 I1MAX=I4+IP1-IP0
|
||||
DO 20 I1=I4,I1MAX,IP0
|
||||
C I1 = 1+(J1-1)*IP0+(J4-1)*IP1
|
||||
DO 20 I5=I1,IP5,IP4
|
||||
C I5 = 1+(J1-1)*IP0+(J4-1)*IP1+(J5-1)*IP4
|
||||
I5REV=I4REV+I5-I4
|
||||
C I5REV = 1+(J1-1)*IP0+(J4REV-1)*IP1+(J5-1)*IP4
|
||||
TEMPR=DATA(I5)
|
||||
TEMPI=DATA(I5+1)
|
||||
DATA(I5)=DATA(I5REV)
|
||||
DATA(I5+1)=DATA(I5REV+1)
|
||||
DATA(I5REV)=TEMPR
|
||||
20 DATA(I5REV+1)=TEMPI
|
||||
C ADD ONE WITH DOWNWARD CARRY TO THE HIGH ORDER BIT OF J4REV-1.
|
||||
30 IP2=IP4/2
|
||||
40 IF (I4REV-IP2) 60,60,50
|
||||
50 I4REV=I4REV-IP2
|
||||
IP2=IP2/2
|
||||
IF (IP2-IP1) 60,40,40
|
||||
60 I4REV=I4REV+IP2
|
||||
RETURN
|
||||
END
|
||||
SUBROUTINE COOL2 (DATA,NPREV,N,NREM,ISIGN)
|
||||
C DISCRETE FOURIER TRANSFORM OF LENGTH N. IN-PLACE COOLEY-TUKEY
|
||||
C ALGORITHM, BIT-REVERSED TO NORMAL ORDER, SANDE-TUKEY PHASE SHIFTS.
|
||||
C DIMENSION DATA(NPREV,N,NREM)
|
||||
C COMPLEX DATA
|
||||
C DATA(J1,K4,J5) = SUM(DATA(J1,J4,J5)*EXP(ISIGN*2*PI*I*(J4-1)*
|
||||
C (K4-1)/N)), SUMMED OVER J4 = 1 TO N FOR ALL J1 FROM 1 TO NPREV,
|
||||
C K4 FROM 1 TO N AND J5 FROM 1 TO NREM. N MUST BE A POWER OF TWO.
|
||||
C METHOD--LET IPREV TAKE THE VALUES 1, 2 OR 4, 4 OR 8, ..., N/16,
|
||||
C N/4, N. THE CHOICE BETWEEN 2 OR 4, ETC., DEPENDS ON WHETHER N IS
|
||||
C A POWER OF FOUR. DEFINE IFACT = 2 OR 4, THE NEXT FACTOR THAT
|
||||
C IPREV MUST TAKE, AND IREM = N/(IFACT*IPREV). THEN--
|
||||
C DIMENSION DATA(NPREV,IPREV,IFACT,IREM,NREM)
|
||||
C COMPLEX DATA
|
||||
C DATA(J1,J2,K3,J4,J5) = SUM(DATA(J1,J2,J3,J4,J5)*EXP(ISIGN*2*PI*I*
|
||||
C (K3-1)*((J3-1)/IFACT+(J2-1)/(IFACT*IPREV)))), SUMMED OVER J3 = 1
|
||||
C TO IFACT FOR ALL J1 FROM 1 TO NPREV, J2 FROM 1 TO IPREV, K3 FROM
|
||||
C 1 TO IFACT, J4 FROM 1 TO IREM AND J5 FROM 1 TO NREM. THIS IS
|
||||
C A PHASE-SHIFTED DISCRETE FOURIER TRANSFORM OF LENGTH IFACT.
|
||||
C FACTORING N BY FOURS SAVES ABOUT TWENTY FIVE PERCENT OVER FACTOR-
|
||||
C ING BY TWOS. DATA MUST BE BIT-REVERSED INITIALLY.
|
||||
C IT IS NOT NECESSARY TO REWRITE THIS SUBROUTINE INTO COMPLEX
|
||||
C NOTATION SO LONG AS THE FORTRAN COMPILER USED STORES REAL AND
|
||||
C IMAGINARY PARTS IN ADJACENT STORAGE LOCATIONS. IT MUST ALSO
|
||||
C STORE ARRAYS WITH THE FIRST SUBSCRIPT INCREASING FASTEST.
|
||||
parameter(NMAX=2048*1024)
|
||||
DIMENSION DATA(NMAX)
|
||||
|
||||
real*8 twopi,wstpr,wstpi,wr,wi,w2r,w2i,w3r,w3i,wtempr
|
||||
|
||||
TWOPI=6.2831853072*FLOAT(ISIGN)
|
||||
IP0=2
|
||||
IP1=IP0*NPREV
|
||||
IP4=IP1*N
|
||||
IP5=IP4*NREM
|
||||
IP2=IP1
|
||||
C IP2=IP1*IPROD
|
||||
NPART=N
|
||||
10 IF (NPART-2) 60,30,20
|
||||
20 NPART=NPART/4
|
||||
GO TO 10
|
||||
C DO A FOURIER TRANSFORM OF LENGTH TWO
|
||||
30 IF (IP2-IP4) 40,160,160
|
||||
40 IP3=IP2*2
|
||||
C IP3=IP2*IFACT
|
||||
DO 50 I1=1,IP1,IP0
|
||||
C I1 = 1+(J1-1)*IP0
|
||||
DO 50 I5=I1,IP5,IP3
|
||||
C I5 = 1+(J1-1)*IP0+(J4-1)*IP3+(J5-1)*IP4
|
||||
I3A=I5
|
||||
I3B=I3A+IP2
|
||||
C I3 = 1+(J1-1)*IP0+(J2-1)*IP1+(J3-1)*IP2+(J4-1)*IP3+(J5-1)*IP4
|
||||
TEMPR=DATA(I3B)
|
||||
TEMPI=DATA(I3B+1)
|
||||
DATA(I3B)=DATA(I3A)-TEMPR
|
||||
DATA(I3B+1)=DATA(I3A+1)-TEMPI
|
||||
DATA(I3A)=DATA(I3A)+TEMPR
|
||||
50 DATA(I3A+1)=DATA(I3A+1)+TEMPI
|
||||
IP2=IP3
|
||||
C DO A FOURIER TRANSFORM OF LENGTH FOUR (FROM BIT REVERSED ORDER)
|
||||
60 IF (IP2-IP4) 70,160,160
|
||||
70 IP3=IP2*4
|
||||
C IP3=IP2*IFACT
|
||||
C COMPUTE TWOPI THRU WR AND WI IN DOUBLE PRECISION, IF AVAILABLE.
|
||||
THETA=TWOPI/FLOAT(IP3/IP1)
|
||||
SINTH=SIN(THETA/2)
|
||||
WSTPR=-2*SINTH*SINTH
|
||||
WSTPI=SIN(THETA)
|
||||
WR=1.
|
||||
WI=0.
|
||||
DO 150 I2=1,IP2,IP1
|
||||
C I2 = 1+(J2-1)*IP1
|
||||
IF (I2-1) 90,90,80
|
||||
80 W2R=WR*WR-WI*WI
|
||||
W2I=2*WR*WI
|
||||
W3R=W2R*WR-W2I*WI
|
||||
W3I=W2R*WI+W2I*WR
|
||||
90 I1MAX=I2+IP1-IP0
|
||||
DO 140 I1=I2,I1MAX,IP0
|
||||
C I1 = 1+(J1-1)*IP0+(J2-1)*IP1
|
||||
DO 140 I5=I1,IP5,IP3
|
||||
C I5 = 1+(J1-1)*IP0+(J2-1)*IP1+(J4-1)*IP3+(J5-1)*IP4
|
||||
I3A=I5
|
||||
I3B=I3A+IP2
|
||||
I3C=I3B+IP2
|
||||
I3D=I3C+IP2
|
||||
C I3 = 1+(J1-1)*IP0+(J2-1)*IP1+(J3-1)*IP2+(J4-1)*IP3+(J5-1)*IP4
|
||||
IF (I2-1) 110,110,100
|
||||
C APPLY THE PHASE SHIFT FACTORS
|
||||
100 TEMPR=DATA(I3B)
|
||||
DATA(I3B)=W2R*DATA(I3B)-W2I*DATA(I3B+1)
|
||||
DATA(I3B+1)=W2R*DATA(I3B+1)+W2I*TEMPR
|
||||
TEMPR=DATA(I3C)
|
||||
DATA(I3C)=WR*DATA(I3C)-WI*DATA(I3C+1)
|
||||
DATA(I3C+1)=WR*DATA(I3C+1)+WI*TEMPR
|
||||
TEMPR=DATA(I3D)
|
||||
DATA(I3D)=W3R*DATA(I3D)-W3I*DATA(I3D+1)
|
||||
DATA(I3D+1)=W3R*DATA(I3D+1)+W3I*TEMPR
|
||||
110 T0R=DATA(I3A)+DATA(I3B)
|
||||
T0I=DATA(I3A+1)+DATA(I3B+1)
|
||||
T1R=DATA(I3A)-DATA(I3B)
|
||||
T1I=DATA(I3A+1)-DATA(I3B+1)
|
||||
T2R=DATA(I3C)+DATA(I3D)
|
||||
T2I=DATA(I3C+1)+DATA(I3D+1)
|
||||
T3R=DATA(I3C)-DATA(I3D)
|
||||
T3I=DATA(I3C+1)-DATA(I3D+1)
|
||||
DATA(I3A)=T0R+T2R
|
||||
DATA(I3A+1)=T0I+T2I
|
||||
DATA(I3C)=T0R-T2R
|
||||
DATA(I3C+1)=T0I-T2I
|
||||
IF (ISIGN) 120,120,130
|
||||
120 T3R=-T3R
|
||||
T3I=-T3I
|
||||
130 DATA(I3B)=T1R-T3I
|
||||
DATA(I3B+1)=T1I+T3R
|
||||
DATA(I3D)=T1R+T3I
|
||||
140 DATA(I3D+1)=T1I-T3R
|
||||
WTEMPR=WR
|
||||
WR=WSTPR*WTEMPR-WSTPI*WI+WTEMPR
|
||||
150 WI=WSTPR*WI+WSTPI*WTEMPR+WI
|
||||
IP2=IP3
|
||||
GO TO 60
|
||||
160 RETURN
|
||||
END
|
||||
SUBROUTINE FIXRL (DATA,N,NREM,ISIGN,IFORM)
|
||||
C FOR IFORM = 0, CONVERT THE TRANSFORM OF A DOUBLED-UP REAL ARRAY,
|
||||
C CONSIDERED COMPLEX, INTO ITS TRUE TRANSFORM. SUPPLY ONLY THE
|
||||
C FIRST HALF OF THE COMPLEX TRANSFORM, AS THE SECOND HALF HAS
|
||||
C CONJUGATE SYMMETRY. FOR IFORM = -1, CONVERT THE FIRST HALF
|
||||
C OF THE TRUE TRANSFORM INTO THE TRANSFORM OF A DOUBLED-UP REAL
|
||||
C ARRAY. N MUST BE EVEN.
|
||||
C USING COMPLEX NOTATION AND SUBSCRIPTS STARTING AT ZERO, THE
|
||||
C TRANSFORMATION IS--
|
||||
C DIMENSION DATA(N,NREM)
|
||||
C ZSTP = EXP(ISIGN*2*PI*I/N)
|
||||
C DO 10 I2=0,NREM-1
|
||||
C DATA(0,I2) = CONJ(DATA(0,I2))*(1+I)
|
||||
C DO 10 I1=1,N/4
|
||||
C Z = (1+(2*IFORM+1)*I*ZSTP**I1)/2
|
||||
C I1CNJ = N/2-I1
|
||||
C DIF = DATA(I1,I2)-CONJ(DATA(I1CNJ,I2))
|
||||
C TEMP = Z*DIF
|
||||
C DATA(I1,I2) = (DATA(I1,I2)-TEMP)*(1-IFORM)
|
||||
C 10 DATA(I1CNJ,I2) = (DATA(I1CNJ,I2)+CONJ(TEMP))*(1-IFORM)
|
||||
C IF I1=I1CNJ, THE CALCULATION FOR THAT VALUE COLLAPSES INTO
|
||||
C A SIMPLE CONJUGATION OF DATA(I1,I2).
|
||||
parameter(NMAX=2048*1024)
|
||||
DIMENSION DATA(NMAX)
|
||||
TWOPI=6.283185307*FLOAT(ISIGN)
|
||||
IP0=2
|
||||
IP1=IP0*(N/2)
|
||||
IP2=IP1*NREM
|
||||
IF (IFORM) 10,70,70
|
||||
C PACK THE REAL INPUT VALUES (TWO PER COLUMN)
|
||||
10 J1=IP1+1
|
||||
DATA(2)=DATA(J1)
|
||||
IF (NREM-1) 70,70,20
|
||||
20 J1=J1+IP0
|
||||
I2MIN=IP1+1
|
||||
DO 60 I2=I2MIN,IP2,IP1
|
||||
DATA(I2)=DATA(J1)
|
||||
J1=J1+IP0
|
||||
IF (N-2) 50,50,30
|
||||
30 I1MIN=I2+IP0
|
||||
I1MAX=I2+IP1-IP0
|
||||
DO 40 I1=I1MIN,I1MAX,IP0
|
||||
DATA(I1)=DATA(J1)
|
||||
DATA(I1+1)=DATA(J1+1)
|
||||
40 J1=J1+IP0
|
||||
50 DATA(I2+1)=DATA(J1)
|
||||
60 J1=J1+IP0
|
||||
70 DO 80 I2=1,IP2,IP1
|
||||
TEMPR=DATA(I2)
|
||||
DATA(I2)=DATA(I2)+DATA(I2+1)
|
||||
80 DATA(I2+1)=TEMPR-DATA(I2+1)
|
||||
IF (N-2) 200,200,90
|
||||
90 THETA=TWOPI/FLOAT(N)
|
||||
SINTH=SIN(THETA/2.)
|
||||
ZSTPR=-2.*SINTH*SINTH
|
||||
ZSTPI=SIN(THETA)
|
||||
ZR=(1.-ZSTPI)/2.
|
||||
ZI=(1.+ZSTPR)/2.
|
||||
IF (IFORM) 100,110,110
|
||||
100 ZR=1.-ZR
|
||||
ZI=-ZI
|
||||
110 I1MIN=IP0+1
|
||||
I1MAX=IP0*(N/4)+1
|
||||
DO 190 I1=I1MIN,I1MAX,IP0
|
||||
DO 180 I2=I1,IP2,IP1
|
||||
I2CNJ=IP0*(N/2+1)-2*I1+I2
|
||||
IF (I2-I2CNJ) 150,120,120
|
||||
120 IF (ISIGN*(2*IFORM+1)) 130,140,140
|
||||
130 DATA(I2+1)=-DATA(I2+1)
|
||||
140 IF (IFORM) 170,180,180
|
||||
150 DIFR=DATA(I2)-DATA(I2CNJ)
|
||||
DIFI=DATA(I2+1)+DATA(I2CNJ+1)
|
||||
TEMPR=DIFR*ZR-DIFI*ZI
|
||||
TEMPI=DIFR*ZI+DIFI*ZR
|
||||
DATA(I2)=DATA(I2)-TEMPR
|
||||
DATA(I2+1)=DATA(I2+1)-TEMPI
|
||||
DATA(I2CNJ)=DATA(I2CNJ)+TEMPR
|
||||
DATA(I2CNJ+1)=DATA(I2CNJ+1)-TEMPI
|
||||
IF (IFORM) 160,180,180
|
||||
160 DATA(I2CNJ)=DATA(I2CNJ)+DATA(I2CNJ)
|
||||
DATA(I2CNJ+1)=DATA(I2CNJ+1)+DATA(I2CNJ+1)
|
||||
170 DATA(I2)=DATA(I2)+DATA(I2)
|
||||
DATA(I2+1)=DATA(I2+1)+DATA(I2+1)
|
||||
180 CONTINUE
|
||||
TEMPR=ZR-.5
|
||||
ZR=ZSTPR*TEMPR-ZSTPI*ZI+ZR
|
||||
190 ZI=ZSTPR*ZI+ZSTPI*TEMPR+ZI
|
||||
C RECURSION SAVES TIME, AT A SLIGHT LOSS IN ACCURACY. IF AVAILABLE,
|
||||
C USE DOUBLE PRECISION TO COMPUTE ZR AND ZI.
|
||||
200 IF (IFORM) 270,210,210
|
||||
C UNPACK THE REAL TRANSFORM VALUES (TWO PER COLUMN)
|
||||
210 I2=IP2+1
|
||||
I1=I2
|
||||
J1=IP0*(N/2+1)*NREM+1
|
||||
GO TO 250
|
||||
220 DATA(J1)=DATA(I1)
|
||||
DATA(J1+1)=DATA(I1+1)
|
||||
I1=I1-IP0
|
||||
J1=J1-IP0
|
||||
230 IF (I2-I1) 220,240,240
|
||||
240 DATA(J1)=DATA(I1)
|
||||
DATA(J1+1)=0.
|
||||
250 I2=I2-IP1
|
||||
J1=J1-IP0
|
||||
DATA(J1)=DATA(I2+1)
|
||||
DATA(J1+1)=0.
|
||||
I1=I1-IP0
|
||||
J1=J1-IP0
|
||||
IF (I2-1) 260,260,230
|
||||
260 DATA(2)=0.
|
||||
270 RETURN
|
||||
END
|
111
four2a.f
111
four2a.f
@ -1,111 +0,0 @@
|
||||
subroutine four2a(a,nfft,ndim,isign,iform)
|
||||
|
||||
C IFORM = 1, 0 or -1, as data is
|
||||
C complex, real, or the first half of a complex array. Transform
|
||||
C values are returned in array DATA. They are complex, real, or
|
||||
C the first half of a complex array, as IFORM = 1, -1 or 0.
|
||||
|
||||
C The transform of a real array (IFORM = 0) dimensioned N(1) by N(2)
|
||||
C by ... will be returned in the same array, now considered to
|
||||
C be complex of dimensions N(1)/2+1 by N(2) by .... Note that if
|
||||
C IFORM = 0 or -1, N(1) must be even, and enough room must be
|
||||
C reserved. The missing values may be obtained by complex conjuga-
|
||||
C tion.
|
||||
|
||||
C The reverse transformation of a half complex array dimensioned
|
||||
C N(1)/2+1 by N(2) by ..., is accomplished by setting IFORM
|
||||
C to -1. In the N array, N(1) must be the true N(1), not N(1)/2+1.
|
||||
C The transform will be real and returned to the input array.
|
||||
|
||||
parameter (NPMAX=100)
|
||||
parameter (NSMALL=16384)
|
||||
complex a(nfft)
|
||||
complex aa(NSMALL)
|
||||
integer nn(NPMAX),ns(NPMAX),nf(NPMAX),nl(NPMAX)
|
||||
real*8 plan(NPMAX) !Actually should be i*8, but no matter
|
||||
data nplan/0/
|
||||
include 'fftw3.f'
|
||||
save plan,nplan,nn,ns,nf,nl
|
||||
|
||||
if(nfft.lt.0 .or. ndim.lt.0) go to 999
|
||||
|
||||
nloc=loc(a)
|
||||
do i=1,nplan
|
||||
if(nfft.eq.nn(i) .and. isign.eq.ns(i) .and.
|
||||
+ iform.eq.nf(i) .and. nloc.eq.nl(i)) go to 10
|
||||
enddo
|
||||
if(nplan.ge.NPMAX) stop 'Too many FFTW plans requested.'
|
||||
nplan=nplan+1
|
||||
i=nplan
|
||||
nn(i)=nfft
|
||||
ns(i)=isign
|
||||
nf(i)=iform
|
||||
nl(i)=nloc
|
||||
|
||||
C Planning: FFTW_ESTIMATE, FFTW_ESTIMATE_PATIENT, FFTW_MEASURE,
|
||||
C FFTW_PATIENT, FFTW_EXHAUSTIVE
|
||||
npatience=1
|
||||
nflags=FFTW_ESTIMATE
|
||||
if(npatience.eq.1) nflags=FFTW_ESTIMATE_PATIENT
|
||||
if(npatience.eq.2) nflags=FFTW_MEASURE
|
||||
if(npatience.eq.3) nflags=FFTW_PATIENT
|
||||
if(npatience.eq.4) nflags=FFTW_EXHAUSTIVE
|
||||
if(nfft.le.NSMALL) then
|
||||
jz=nfft
|
||||
if(iform.eq.0) jz=nfft/2
|
||||
do j=1,jz
|
||||
aa(j)=a(j)
|
||||
enddo
|
||||
endif
|
||||
call sleep_msec(0)
|
||||
if(isign.eq.-1 .and. iform.eq.1) then
|
||||
#ifdef CVF
|
||||
call sfftw_plan_dft_1d_(plan(i),nfft,a,a,FFTW_FORWARD,nflags)
|
||||
else if(isign.eq.1 .and. iform.eq.1) then
|
||||
call sfftw_plan_dft_1d_(plan(i),nfft,a,a,FFTW_BACKWARD,nflags)
|
||||
else if(isign.eq.-1 .and. iform.eq.0) then
|
||||
call sfftw_plan_dft_r2c_1d_(plan(i),nfft,a,a,nflags)
|
||||
else if(isign.eq.1 .and. iform.eq.-1) then
|
||||
call sfftw_plan_dft_c2r_1d_(plan(i),nfft,a,a,nflags)
|
||||
#else
|
||||
call sfftw_plan_dft_1d(plan(i),nfft,a,a,FFTW_FORWARD,nflags)
|
||||
else if(isign.eq.1 .and. iform.eq.1) then
|
||||
call sfftw_plan_dft_1d(plan(i),nfft,a,a,FFTW_BACKWARD,nflags)
|
||||
else if(isign.eq.-1 .and. iform.eq.0) then
|
||||
call sfftw_plan_dft_r2c_1d(plan(i),nfft,a,a,nflags)
|
||||
else if(isign.eq.1 .and. iform.eq.-1) then
|
||||
call sfftw_plan_dft_c2r_1d(plan(i),nfft,a,a,nflags)
|
||||
#endif
|
||||
else
|
||||
stop 'Unsupported request in four2a'
|
||||
endif
|
||||
call sleep_msec(0)
|
||||
i=nplan
|
||||
if(nfft.le.NSMALL) then
|
||||
jz=nfft
|
||||
if(iform.eq.0) jz=nfft/2
|
||||
do j=1,jz
|
||||
a(j)=aa(j)
|
||||
enddo
|
||||
endif
|
||||
|
||||
10 continue
|
||||
call sleep_msec(0)
|
||||
#ifdef CVF
|
||||
call sfftw_execute_(plan(i))
|
||||
#else
|
||||
call sfftw_execute(plan(i))
|
||||
#endif
|
||||
call sleep_msec(0)
|
||||
return
|
||||
|
||||
999 do i=1,nplan
|
||||
#ifdef CVF
|
||||
call sfftw_destroy_plan_(plan(i))
|
||||
#else
|
||||
call sfftw_destroy_plan(plan(i))
|
||||
#endif
|
||||
enddo
|
||||
|
||||
return
|
||||
end
|
14
fstatqqq.f90
14
fstatqqq.f90
@ -1,14 +0,0 @@
|
||||
subroutine fstatqqq(lu,istat,ierr)
|
||||
|
||||
#ifdef CVF
|
||||
use dfport
|
||||
#endif
|
||||
|
||||
#ifdef CVF
|
||||
ierr=fstat(lu,istat)
|
||||
#else
|
||||
call fstat(lu,istat,ierr)
|
||||
#endif
|
||||
|
||||
return
|
||||
end subroutine fstatqqq
|
74
fthread.c
74
fthread.c
@ -1,74 +0,0 @@
|
||||
/*
|
||||
* fthread.c
|
||||
*
|
||||
* pthread library interface to Fortran, for OSs supporting pthreads
|
||||
*
|
||||
* Adapted from code by V. Ganesh
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
|
||||
// Create a new fortran thread through a subroutine.
|
||||
void fthread_create_(void *(*thread_func)(void *), pthread_t *theThread)
|
||||
{
|
||||
pthread_create(theThread, NULL, thread_func, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
// Yield control to other threads
|
||||
void fthread_yield_()
|
||||
{
|
||||
pthread_yield();
|
||||
}
|
||||
*/
|
||||
|
||||
// Return my own thread ID
|
||||
pthread_t fthread_self_()
|
||||
{
|
||||
return pthread_self();
|
||||
}
|
||||
|
||||
// Lock the execution of all threads until we have the mutex
|
||||
int fthread_mutex_lock_(pthread_mutex_t **theMutex)
|
||||
{
|
||||
return(pthread_mutex_lock(*theMutex));
|
||||
}
|
||||
|
||||
int fthread_mutex_trylock_(pthread_mutex_t **theMutex)
|
||||
{
|
||||
return(pthread_mutex_trylock(*theMutex));
|
||||
}
|
||||
|
||||
// Unlock the execution of all threads that were stopped by this mutex
|
||||
void fthread_mutex_unlock_(pthread_mutex_t **theMutex)
|
||||
{
|
||||
pthread_mutex_unlock(*theMutex);
|
||||
}
|
||||
|
||||
// Get a new mutex object
|
||||
void fthread_mutex_init_(pthread_mutex_t **theMutex)
|
||||
{
|
||||
*theMutex = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t));
|
||||
pthread_mutex_init(*theMutex, NULL);
|
||||
}
|
||||
|
||||
// Release a mutex object
|
||||
void fthread_mutex_destroy_(pthread_mutex_t **theMutex)
|
||||
{
|
||||
pthread_mutex_destroy(*theMutex);
|
||||
free(*theMutex);
|
||||
}
|
||||
|
||||
// Waits for thread ID to join
|
||||
void fthread_join(pthread_t *theThread)
|
||||
{
|
||||
int value = 0;
|
||||
pthread_join(*theThread, (void **)&value);
|
||||
}
|
||||
|
||||
// Exit from a thread
|
||||
void fthread_exit_(void *status)
|
||||
{
|
||||
pthread_exit(status);
|
||||
}
|
||||
|
171
ftn_init.f90
171
ftn_init.f90
@ -1,171 +0,0 @@
|
||||
! Fortran logical units used in WSJT6
|
||||
!
|
||||
! 10 binary input data, *.tf2 files
|
||||
! 11 decoded.txt
|
||||
! 12 decoded.ave
|
||||
! 13 tsky.dat
|
||||
! 14 azel.dat
|
||||
! 15
|
||||
! 16
|
||||
! 17 saved *.tf2 files
|
||||
! 18 test file to be transmitted (wsjtgen.f90)
|
||||
! 19 messages.txt
|
||||
! 20 bandmap.txt
|
||||
! 21 ALL65.TXT
|
||||
! 22 kvasd.dat
|
||||
! 23 CALL3.TXT
|
||||
! 24 meas24.dat
|
||||
! 25 meas25.dat
|
||||
! 26 tmp26.txt
|
||||
! 27 dphi.txt
|
||||
! 28 fftw_wisdom.dat
|
||||
! 29 debug.txt
|
||||
!------------------------------------------------ ftn_init
|
||||
subroutine ftn_init
|
||||
|
||||
character*1 cjunk
|
||||
integer ptt
|
||||
include 'gcom1.f90'
|
||||
include 'gcom2.f90'
|
||||
include 'gcom3.f90'
|
||||
include 'gcom4.f90'
|
||||
|
||||
call cs_init
|
||||
call cs_lock('ftn_init')
|
||||
i=ptt(nport,pttport,0,iptt) !Clear the PTT line
|
||||
addpfx=' '
|
||||
nrw26=0
|
||||
|
||||
do i=80,1,-1
|
||||
if(AppDir(i:i).ne.' ') goto 1
|
||||
enddo
|
||||
1 iz=i
|
||||
lenappdir=iz
|
||||
call pfxdump(appdir(:iz)//'/prefixes.txt')
|
||||
|
||||
do i=80,1,-1
|
||||
if(AzElDir(i:i).ne.' ') goto 2
|
||||
enddo
|
||||
2 iz2=i
|
||||
|
||||
#ifdef CVF
|
||||
open(11,file=appdir(:iz)//'/decoded.txt',status='unknown', &
|
||||
share='denynone',err=910)
|
||||
#else
|
||||
open(11,file=appdir(:iz)//'/decoded.txt',status='unknown', &
|
||||
err=910)
|
||||
#endif
|
||||
endfile 11
|
||||
|
||||
#ifdef CVF
|
||||
open(12,file=appdir(:iz)//'/decoded.ave',status='unknown', &
|
||||
share='denynone',err=920)
|
||||
#else
|
||||
open(12,file=appdir(:iz)//'/decoded.ave',status='unknown', &
|
||||
err=920)
|
||||
#endif
|
||||
endfile 12
|
||||
|
||||
#ifdef CVF
|
||||
open(14,file=azeldir(:iz2)//'/azel.dat',status='unknown', &
|
||||
share='denynone',err=930)
|
||||
#else
|
||||
open(14,file=azeldir(:iz2)//'/azel.dat',status='unknown', &
|
||||
err=930)
|
||||
#endif
|
||||
|
||||
#ifdef CVF
|
||||
open(19,file=appdir(:iz)//'/messages.txt',status='unknown', &
|
||||
share='denynone',err=911)
|
||||
#else
|
||||
open(19,file=appdir(:iz)//'/messages.txt',status='unknown', &
|
||||
err=911)
|
||||
#endif
|
||||
endfile 19
|
||||
|
||||
#ifdef CVF
|
||||
open(20,file=appdir(:iz)//'/bandmap.txt',status='unknown', &
|
||||
share='denynone',err=912)
|
||||
#else
|
||||
open(20,file=appdir(:iz)//'/bandmap.txt',status='unknown', &
|
||||
err=912)
|
||||
#endif
|
||||
endfile 20
|
||||
|
||||
#ifdef CVF
|
||||
open(21,file=appdir(:iz)//'/ALL65.TXT',status='unknown', &
|
||||
access='append',share='denynone',err=950)
|
||||
#else
|
||||
open(21,file=appdir(:iz)//'/ALL65.TXT',status='unknown', &
|
||||
access='append',err=950)
|
||||
do i=1,9999999
|
||||
read(21,*,end=10) cjunk
|
||||
enddo
|
||||
10 continue
|
||||
#endif
|
||||
|
||||
#ifdef CVF
|
||||
open(22,file=appdir(:iz)//'/kvasd.dat',access='direct',recl=1024, &
|
||||
status='unknown',share='denynone')
|
||||
#else
|
||||
open(22,file=appdir(:iz)//'/kvasd.dat',access='direct',recl=1024, &
|
||||
status='unknown')
|
||||
#endif
|
||||
|
||||
#ifdef CVF
|
||||
open(24,file=appdir(:iz)//'/meas24.txt',status='unknown', &
|
||||
share='denynone')
|
||||
#else
|
||||
open(24,file=appdir(:iz)//'/meas24.txt',status='unknown')
|
||||
#endif
|
||||
|
||||
#ifdef CVF
|
||||
open(25,file=appdir(:iz)//'/meas25.txt',status='unknown', &
|
||||
share='denynone')
|
||||
#else
|
||||
open(25,file=appdir(:iz)//'/meas25.txt',status='unknown')
|
||||
#endif
|
||||
|
||||
#ifdef CVF
|
||||
open(26,file=appdir(:iz)//'/tmp26.txt',status='unknown', &
|
||||
share='denynone')
|
||||
#else
|
||||
open(26,file=appdir(:iz)//'/tmp26.txt',status='unknown')
|
||||
#endif
|
||||
|
||||
#ifdef CVF
|
||||
open(27,file=appdir(:iz)//'/dphi.txt',status='unknown', &
|
||||
share='denynone')
|
||||
#else
|
||||
open(27,file=appdir(:iz)//'/dphi.txt',status='unknown')
|
||||
open(28,file='fftw_wisdom.dat',status='unknown')
|
||||
call import_wisdom_from_file(isuccess,28)
|
||||
close(28)
|
||||
if(isuccess.ne.0) write(*,1000)
|
||||
1000 format('Using optimized FFTs.')
|
||||
#endif
|
||||
|
||||
#ifdef CVF
|
||||
open(29,file=appdir(:iz)//'/debug.txt',status='unknown', &
|
||||
share='denynone')
|
||||
#else
|
||||
open(29,file=appdir(:iz)//'/debug.txt',status='unknown')
|
||||
#endif
|
||||
|
||||
call cs_unlock
|
||||
return
|
||||
|
||||
910 print*,'Error opening DECODED.TXT'
|
||||
stop
|
||||
911 print*,'Error opening messages.txt'
|
||||
stop
|
||||
912 print*,'Error opening bandmap.txt'
|
||||
stop
|
||||
920 print*,'Error opening DECODED.AVE'
|
||||
stop
|
||||
930 print*,'Error opening AZEL.DAT'
|
||||
stop
|
||||
950 print*,'Error opening ALL65.TXT'
|
||||
stop
|
||||
|
||||
end subroutine ftn_init
|
@ -1,9 +0,0 @@
|
||||
!------------------------------------------------ ftn_quit
|
||||
subroutine ftn_quit
|
||||
include 'gcom1.f90'
|
||||
ngo=0
|
||||
! Destroy the FFTW plans
|
||||
call four2a(a,-1,1,1,1)
|
||||
call filbig(id,-1,f0,newdat,c4a,c4b,n4)
|
||||
return
|
||||
end subroutine ftn_quit
|
24
ftsky.f
24
ftsky.f
@ -1,24 +0,0 @@
|
||||
real function ftsky(l,b)
|
||||
|
||||
C Returns 408 MHz sky temperature for l,b (in degrees), from
|
||||
C Haslam, et al. survey. Must have already read the entire
|
||||
C file tsky.dat into memory.
|
||||
|
||||
real*4 l,b
|
||||
integer*2 nsky
|
||||
common/sky/ nsky(360,180)
|
||||
save
|
||||
|
||||
j=nint(b+91.0)
|
||||
if(j.gt.180) j=180
|
||||
xl=l
|
||||
if(xl.lt.0.0) xl=xl+360.0
|
||||
i=nint(xl+1.0)
|
||||
if(i.gt.360) i=i-360
|
||||
ftsky=0.0
|
||||
if(i.ge.1 .and. i.le.360 .and. j.ge.1 .and. j.le.180) then
|
||||
ftsky=0.1*nsky(i,j)
|
||||
endif
|
||||
|
||||
return
|
||||
end
|
32
g.py
32
g.py
@ -1,32 +0,0 @@
|
||||
DFreq=0.0
|
||||
Freq=0.0
|
||||
PingTime=0.0
|
||||
PingFile="current"
|
||||
report="26"
|
||||
rms=1.0
|
||||
mode_change=0
|
||||
showspecjt=0
|
||||
g2font='courier 16 bold'
|
||||
|
||||
#------------------------------------------------------ ftnstr
|
||||
def ftnstr(x):
|
||||
y=""
|
||||
xs=x.tostring()
|
||||
for i in range(len(xs)):
|
||||
y=y+xs[i]
|
||||
return y
|
||||
|
||||
#------------------------------------------------------ filetime
|
||||
def filetime(t):
|
||||
# i=t.rfind(".")
|
||||
i=rfnd(t,".")
|
||||
t=t[:i][-6:]
|
||||
t=t[0:2]+":"+t[2:4]+":"+t[4:6]
|
||||
return t
|
||||
|
||||
#------------------------------------------------------ rfnd
|
||||
#Temporary workaround to replace t.rfind(c)
|
||||
def rfnd(t,c):
|
||||
for i in range(len(t)-1,0,-1):
|
||||
if t[i:i+1]==c: return i
|
||||
return -1
|
51
gcom1.f90
51
gcom1.f90
@ -1,51 +0,0 @@
|
||||
! Variable Purpose Set in Thread
|
||||
!---------------------------------------------------------------------------
|
||||
integer NRXMAX !Max length of Rx ring buffers
|
||||
integer NTXMAX !Max length of Tx waveform in samples
|
||||
parameter(NRXMAX=2097152) ! =2048*1024
|
||||
parameter(NTXMAX=1653750) ! =150*11025
|
||||
real*8 tbuf !Tsec at time of input callback SoundIn
|
||||
integer ntrbuf !(obsolete?)
|
||||
real*8 Tsec !Present time SoundIn,SoundOut
|
||||
real*8 rxdelay !Delay between PTT=1 and Tx audio SoundIn
|
||||
real*8 txdelay !Delay from end of Tx Audio and PTT=0 SoundOut
|
||||
real*8 samfacin !(Input sample rate)/11025 GUI
|
||||
real*8 samfacout !(Output sample rate)/11025 GUI
|
||||
real*8 txsnrdb !SNR for simulations GUI
|
||||
integer*2 y1 !Ring buffer for audio channel 0 SoundIn
|
||||
integer*2 y2 !Ring buffer for audio channel 1 SoundIn
|
||||
integer nmax !Actual length of Rx ring buffers GUI
|
||||
integer iwrite !Write pointer to Rx ring buffer SoundIn
|
||||
integer iread !Read pointer to Rx ring buffer GUI
|
||||
integer*2 iwave !Data for audio output SoundIn
|
||||
integer nwave !Number of samples in iwave SoundIn
|
||||
integer TxOK !OK to transmit? SoundIn
|
||||
! NB: TxOK=1 only in SoundIn; TxOK=0 also in GUI
|
||||
integer Receiving !Actually receiving? SoundIn
|
||||
integer Transmitting !Actually transmitting? SoundOut
|
||||
integer TxFirst !Transmit first? GUI
|
||||
integer TRPeriod !Tx or Rx period in seconds GUI
|
||||
integer ibuf !Most recent input buffer# SoundIn
|
||||
integer ibuf0 !Buffer# at start of Rx sequence SoundIn
|
||||
real ave !(why is this here?) GUI
|
||||
real rms !(why is this here?) GUI
|
||||
integer ngo !Set to 0 to terminate audio streams GUI
|
||||
integer level !S-meter level, 0-100 GUI
|
||||
integer mute !True means "don't transmit" GUI
|
||||
integer newdat !New data available for waterfall? GUI
|
||||
integer ndsec !Dsec in units of 0.1 s GUI
|
||||
integer ndevin !Device# for audio input GUI
|
||||
integer ndevout !Device# for audio output GUI
|
||||
integer mfsample !Measured sample rate, input SoundIn
|
||||
integer mfsample2 !Measured sample rate, output SoundOut
|
||||
integer ns0 !Time at last ALL.TXT date entry Decoder
|
||||
character*12 devin_name,devout_name ! GUI
|
||||
|
||||
common/gcom1/Tbuf(1024),ntrbuf(1024),Tsec,rxdelay,txdelay, &
|
||||
samfacin,samfacout,txsnrdb,y1(NRXMAX),y2(NRXMAX), &
|
||||
nmax,iwrite,iread,iwave(NTXMAX),nwave,TxOK,Receiving,Transmitting, &
|
||||
TxFirst,TRPeriod,ibuf,ibuf0,ave,rms,ngo,level,mute,newdat,ndsec, &
|
||||
ndevin,ndevout,mfsample,mfsample2,ns0,devin_name,devout_name
|
||||
|
||||
!### volatile /gcom1/
|
||||
|
124
gcom2.f90
124
gcom2.f90
@ -1,124 +0,0 @@
|
||||
! Variable Purpose Set in Thread
|
||||
!-------------------------------------------------------------------------
|
||||
real*8 fcenter !Linrad center freq, from pkt header recvpkt
|
||||
real*8 forcefcenter !Optional override of fcenter GUI
|
||||
real ps0 !Spectrum of best ping, FSK441/JT6m Decoder
|
||||
real psavg !Average spectrum Decoder
|
||||
real s2 !2d spectrum for horizontal waterfall GUI
|
||||
real ccf !CCF in time (blue curve) Decoder
|
||||
real green !Data for green line GUI
|
||||
real fselect !Specified QSO frequency GUI
|
||||
real pctlost !Percent of lost packets Decoder
|
||||
real pctblank !Percent of blanked blocks/packets Decoder
|
||||
real rxnoise !Rx noise in dB recvpkt
|
||||
real dphi !Phase shift between pol'n channels GUI,Decoder
|
||||
integer ngreen !Length of green GUI
|
||||
real dgain !Digital audio gain setting GUI
|
||||
integer ndecoding !Decoder status (see decode2.f90) GUI,Decoder
|
||||
integer ndecoding0 !Status on previous decode GUI,Decoder
|
||||
integer mcall3 !CALL3.TXT has been modified GUI,Decoder
|
||||
integer mousebutton !Which button was clicked? GUI
|
||||
integer multicast !1 for multicast data, 0 for unicast GUI
|
||||
integer ndecdone !Is decoder finished? GUI,Decoder
|
||||
integer nfloat !Floating-point data from Linrad? recvpkt
|
||||
integer ierr !Error opening *.tf2 file GUI
|
||||
integer lauto !Are we in Auto mode? GUI
|
||||
integer mantx !Manual transmission requested? GUI,SoundIn
|
||||
integer nrestart !True if transmission should restart GUI,SoundIn
|
||||
integer ntr !Are we in 2nd sequence? SoundIn
|
||||
integer nmsg !Length of Tx message SoundIn
|
||||
integer nsave !Which files to save? GUI
|
||||
integer nadd5 !Prepend 5 sec of 0's before decoding? GUI
|
||||
integer dftolerance !DF tolerance (Hz) GUI
|
||||
logical LDecoded !Was a message decoded? Decoder
|
||||
logical rxdone !Has the Rx sequence finished? SoundIn,Decoder
|
||||
integer monitoring !Are we monitoring? GUI
|
||||
integer nzap !Is Zap checked? GUI
|
||||
integer minsigdb !Decoder threshold setting GUI
|
||||
integer nclearave !Set to 1 to clear JT65 avg GUI,Decoder
|
||||
integer nfreeze !Is Freeze checked? GUI
|
||||
integer nafc !Is AFC checked? GUI
|
||||
integer newspec !New spectra in ss(4,322,NSMAX) GUI,Decoder
|
||||
integer nfa !Low end of map65 search (def 100 kHz) GUI
|
||||
integer nfb !High end of map65 search (def 160 kHz) GUI
|
||||
integer nfcal !Calibration offset, Hz GUI
|
||||
integer idphi !Phase offset in Y channel (deg) GUI
|
||||
integer nkeep !Timeout limit for band maps (min) GUI
|
||||
integer nmode !Which WSJT mode? GUI,Decoder
|
||||
integer mode65 !JT65 sub-mode (A/B/C ==> 1/2/4) GUI,SoundIn,Decoder
|
||||
integer nbpp !# FFT Bins/pixel, wideband waterfall Spec
|
||||
integer ndebug !Write debugging info? GUI
|
||||
integer ndphi !Set to 1 to compute dphi GUI,Decoder
|
||||
integer nhispol !Pol angle matching HisCall or HisGrid Decoder
|
||||
integer nt1 !Time to start FFTs GUI
|
||||
integer nxant !Antenna configuration: 0='+', 1='x' GUI
|
||||
integer nblank !Is NB checked? GUI
|
||||
integer nfmid !Center frequency of main display GUI
|
||||
integer nfrange !Frequency range of main display GUI
|
||||
integer nport !Requested COM port number GUI
|
||||
integer mousedf !Mouse-selected freq offset, DF GUI
|
||||
integer mousefqso !Mouse-selected QSO freq GUI
|
||||
integer neme !EME calls only in deep search? GUI
|
||||
integer nrw26 !Request to rewind lu 26 (tmp26.txt) GUI,Decoder
|
||||
integer naggressive !Is "Aggressive decoding" checked? GUI
|
||||
integer ntx2 !Is "No shorthands if Tx1" checked? GUI
|
||||
integer nagain !Decode same file again? GUI
|
||||
integer shok !Shorthand messages OK? GUI
|
||||
integer sendingsh !Sending a shorthand message? SoundIn
|
||||
integer*2 d2a !Rx data, extracted from y1 Decoder
|
||||
integer*2 d2b !Rx data, selected by mouse-pick Decoder
|
||||
integer*2 b !Pixel values for waterfall spectrum GUI
|
||||
integer jza !Length of data in d2a GUI,Decoder
|
||||
integer jzb !(why is this here?)
|
||||
integer ntime !Integer Unix time (now) SoundIn
|
||||
integer idinterval !Interval between CWIDs, minutes GUI
|
||||
integer msmax !(why is this here?)
|
||||
integer lenappdir !Length of Appdir string GUI
|
||||
integer idf !Frequency offset in Hz Decoder
|
||||
integer ndiskdat !1 if data read from disk, 0 otherwise GUI
|
||||
integer nlines !Available lines of waterfall data GUI
|
||||
integer nflat !Is waterfall to be flattened? GUI
|
||||
integer ntxreq !Tx msg# requested GUI
|
||||
integer ntxnow !Tx msg# being sent now GUI
|
||||
integer ndepth !Requested "depth" of JT65 decoding GUI
|
||||
integer nspecial !JT65 shorthand msg#: RO=2 RRR=3 73=4 Decoder
|
||||
integer ndf !Measured DF in Hz Decoder
|
||||
real ss1 !Magenta curve for JT65 shorthand msg Decoder
|
||||
real ss2 !Orange curve for JT65 shorthand msg Decoder
|
||||
character mycall*12 !My call sign GUI
|
||||
character hiscall*12 !His call sign GUI
|
||||
character hisgrid*6 !His grid locator GUI
|
||||
character txmsg*28 !Message to be transmitted GUI
|
||||
character sending*28 !Message being sent SoundIn
|
||||
character mode*6 !WSJT operating mode GUI
|
||||
character utcdate*12 !UTC date GUI
|
||||
character*24 fname0 !Filenames to be recorded, read, ... Decoder
|
||||
character*24 fnamea
|
||||
character*24 fnameb
|
||||
character*6 fnamedate
|
||||
character*24 decodedfile
|
||||
character*80 AppDir !WSJT installation directory GUI
|
||||
character*80 AzElDir !Directory for azel.dat GUI
|
||||
character*80 SaveDir !Directory for saved data files GUI
|
||||
character*80 filetokilla !Filenames (full path) Decoder
|
||||
character*80 filetokillb
|
||||
character*12 pttport
|
||||
character*8 utcdata !HHMM UTC for the processed data Decoder
|
||||
|
||||
common/gcom2/fcenter,forcefcenter,ps0(431),psavg(450),s2(64,3100),ccf(-5:540), &
|
||||
green(500),fselect,pctlost,pctblank,rxnoise,dphi,ngreen,dgain, &
|
||||
ndecoding,ndecoding0,mcall3,mousebutton,multicast,nsetftx,ierr, &
|
||||
ndecdone,nfloat,lauto,mantx,nrestart,ntr,nmsg,nsave,nadd5, &
|
||||
dftolerance,LDecoded,rxdone,monitoring,nzap,minsigdb, &
|
||||
nclearave,nfreeze,nafc,newspec,nfa,nfb,nfcal,idphi,nkeep, &
|
||||
nmode,mode65,nbpp,ndebug,ndphi,nhispol,nt1,nxant, &
|
||||
nblank,nport,mousedf,mousefqso,neme,nrw26,naggressive,ntx2,nagain, &
|
||||
shok,sendingsh,d2a(661500),d2b(661500),b(60000),jza,jzb,ntime, &
|
||||
idinterval,msmax,lenappdir,idf,ndiskdat,nlines,nflat,ntxreq,ntxnow, &
|
||||
ndepth,nspecial,ndf,nfmid,nfrange,ss1(-224:224),ss2(-224:224), &
|
||||
mycall,hiscall,hisgrid,txmsg,sending,mode,fname0,fnamea, &
|
||||
fnameb,fnamedate,decodedfile,AppDir,AzElDir,SaveDir, &
|
||||
filetokilla,filetokillb,utcdate,pttport,utcdata
|
||||
|
||||
!### volatile /gcom2/
|
||||
|
20
gcom3.f90
20
gcom3.f90
@ -1,20 +0,0 @@
|
||||
! Variable Purpose Set in Thread
|
||||
!-------------------------------------------------------------------------
|
||||
integer*2 nfmt2 !Standard header for *.WAV file Decoder
|
||||
integer*2 nchan2
|
||||
integer*2 nbitsam2
|
||||
integer*2 nbytesam2
|
||||
integer*4 nchunk
|
||||
integer*4 lenfmt
|
||||
integer*4 nsamrate
|
||||
integer*4 nbytesec
|
||||
integer*4 ndata
|
||||
character*4 ariff
|
||||
character*4 awave
|
||||
character*4 afmt
|
||||
character*4 adata
|
||||
|
||||
common/gcom3/ariff,nchunk,awave,afmt,lenfmt,nfmt2,nchan2,nsamrate, &
|
||||
nbytesec,nbytesam2,nbitsam2,adata,ndata
|
||||
|
||||
!### volatile /gcom3/
|
10
gcom4.f90
10
gcom4.f90
@ -1,10 +0,0 @@
|
||||
! Variable Purpose Set in Thread
|
||||
!-------------------------------------------------------------------------
|
||||
character addpfx*8 !Add-on prefix, as in ZA/PA2CHR GUI
|
||||
integer*2 d2c !Rx data recovered from recorded file GUI
|
||||
integer jzc !Length of data available in d2c GUI
|
||||
character filename*24 !Name of wave file read from disk GUI
|
||||
|
||||
common/gcom4/addpfx,d2c(661500),jzc,filename
|
||||
|
||||
!### volatile /gcom4/
|
82
gen65.f
82
gen65.f
@ -1,82 +0,0 @@
|
||||
subroutine gen65(message,mode65,samfac,iwave,nwave,sendingsh,
|
||||
+ msgsent)
|
||||
|
||||
C Encodes a JT65 message into a wavefile.
|
||||
|
||||
parameter (NMAX=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'
|
||||
character*6 c1,c2
|
||||
real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,samfac,tsymbol
|
||||
|
||||
integer*2 iwave(NMAX) !Generated wave file
|
||||
integer dgen(12)
|
||||
integer sent(63)
|
||||
integer sendingsh
|
||||
common/c1c2/c1,c2
|
||||
include 'prcom.h'
|
||||
data twopi/6.283185307d0/
|
||||
save
|
||||
|
||||
if(abs(pr(1)).ne.1.0) call setup65
|
||||
|
||||
call chkmsg(message,cok,nspecial,flip)
|
||||
if(nspecial.eq.0) then
|
||||
call packmsg(message,dgen) !Pack message into 72 bits
|
||||
sendingsh=0
|
||||
if(iand(dgen(10),8).ne.0) sendingsh=-1 !Plain text flag
|
||||
call rs_encode(dgen,sent)
|
||||
call interleave63(sent,1) !Apply interleaving
|
||||
call graycode(sent,63,1) !Apply Gray code
|
||||
tsymbol=4096.d0/11025.d0
|
||||
nsym=126 !Symbols per transmission
|
||||
else
|
||||
tsymbol=16384.d0/11025.d0
|
||||
nsym=32
|
||||
sendingsh=1 !Flag for shorthand message
|
||||
endif
|
||||
|
||||
C Set up necessary constants
|
||||
dt=1.0/(samfac*11025.0)
|
||||
f0=118*11025.d0/1024
|
||||
dfgen=mode65*11025.0/4096.0
|
||||
t=0.d0
|
||||
phi=0.d0
|
||||
k=0
|
||||
j0=0
|
||||
ndata=(nsym*11025.d0*samfac*tsymbol)/2
|
||||
ndata=2*ndata
|
||||
do i=1,ndata
|
||||
t=t+dt
|
||||
j=int(t/tsymbol) + 1 !Symbol number, 1-126
|
||||
if(j.ne.j0) 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
|
||||
j0=j
|
||||
endif
|
||||
phi=phi+dphi
|
||||
iwave(i)=32767.0*sin(phi)
|
||||
enddo
|
||||
|
||||
do j=1,5512 !Put another 0.5 sec of silence at end
|
||||
i=i+1
|
||||
iwave(i)=0
|
||||
enddo
|
||||
nwave=i
|
||||
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
|
||||
|
||||
return
|
||||
end
|
||||
|
36
gencwid.f
36
gencwid.f
@ -1,36 +0,0 @@
|
||||
subroutine gencwid(msg,wpm,freqcw,samfac,iwave,nwave)
|
||||
|
||||
parameter (NMAX=10*11025)
|
||||
character msg*22,msg2*22
|
||||
integer*2 iwave(NMAX)
|
||||
|
||||
integer*1 idat(460)
|
||||
real*8 dt,t,twopi,pha,dpha,tdit,samfac
|
||||
data twopi/6.283185307d0/
|
||||
|
||||
do i=1,22
|
||||
if(msg(i:i).eq.' ') go to 10
|
||||
enddo
|
||||
10 iz=i-1
|
||||
msg2=msg(1:iz)//' '
|
||||
call morse(msg2,idat,ndits) !Encode part 1 of msg
|
||||
|
||||
tdit=1.2d0/wpm !Key-down dit time, seconds
|
||||
dt=1.d0/(11025.d0*samfac)
|
||||
nwave=ndits*tdit/dt
|
||||
pha=0.
|
||||
dpha=twopi*freqcw*dt
|
||||
t=0.d0
|
||||
s=0.
|
||||
u=wpm/(11025*0.03)
|
||||
do i=1,nwave
|
||||
t=t+dt
|
||||
pha=pha+dpha
|
||||
j=t/tdit + 1
|
||||
s=s + u*(idat(j)-s)
|
||||
iwave(i)=nint(s*32767.d0*sin(pha))
|
||||
enddo
|
||||
|
||||
return
|
||||
end
|
||||
|
13
gentone.f
13
gentone.f
@ -1,13 +0,0 @@
|
||||
subroutine gentone(x,n,k)
|
||||
|
||||
real*4 x(512)
|
||||
|
||||
dt=1.0/11025.0
|
||||
f=(n+51)*11025.0/512.0
|
||||
do i=1,512
|
||||
x(i)=sin(6.2831853*i*dt*f)
|
||||
enddo
|
||||
k=k+512
|
||||
|
||||
return
|
||||
end
|
259
getdev.cpp
Normal file
259
getdev.cpp
Normal file
@ -0,0 +1,259 @@
|
||||
#include <stdio.h>
|
||||
#define MAXDEVICES 100
|
||||
#include <string.h>
|
||||
#include <portaudio.h>
|
||||
#include <QDebug>
|
||||
|
||||
//------------------------------------------------------- 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<numDevices; id++) {
|
||||
paInputDevice(id,apidev,&minch,&maxch,&minsp,&maxsp);
|
||||
for(i=0; i<50; i++) {
|
||||
hostAPI_DeviceName[id][i]=apidev[i];
|
||||
}
|
||||
hostAPI_DeviceName[id][49]=0;
|
||||
minChan[id]=minch;
|
||||
maxChan[id]=maxch;
|
||||
minSpeed[id]=minsp;
|
||||
maxSpeed[id]=maxsp;
|
||||
}
|
||||
}
|
105
getfile.cpp
Normal file
105
getfile.cpp
Normal file
@ -0,0 +1,105 @@
|
||||
#include "getfile.h"
|
||||
#include <QDir>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
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.toAscii());
|
||||
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; i<npts; i+=2) {
|
||||
datcom_.d4[j++]=fac*((float)id[i] + dgrd*gran());
|
||||
datcom_.d4[j++]=fac*((float)id[i+1] + dgrd*gran());
|
||||
if(!xpol) j+=2; //Skip over d4(3,x) and d4(4,x)
|
||||
}
|
||||
} else {
|
||||
for(int i=0; i<npts; i+=2) {
|
||||
datcom_.d4[j++]=(float)id[i];
|
||||
datcom_.d4[j++]=(float)id[i+1];
|
||||
if(!xpol) j+=2; //Skip over d4(3,x) and d4(4,x)
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
datcom_.ndiskdat=1;
|
||||
int nfreq=(int)datcom_.fcenter;
|
||||
if(nfreq!=144 and nfreq != 432 and nfreq != 1296) datcom_.fcenter=144.125;
|
||||
int i0=fname.indexOf(".tf2");
|
||||
if(i0<0) i0=fname.indexOf(".iq");
|
||||
datcom_.nutc=0;
|
||||
if(i0>0) 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.toAscii());
|
||||
FILE* fp=fopen(name,"wb");
|
||||
|
||||
if(fp != NULL) {
|
||||
fwrite(&datcom_.fcenter,sizeof(datcom_.fcenter),1,fp);
|
||||
int j=0;
|
||||
for(int i=0; i<npts; i+=2) {
|
||||
buf[i]=(qint16)datcom_.d4[j++];
|
||||
buf[i+1]=(qint16)datcom_.d4[j++];
|
||||
if(!xpol) j+=2; //Skip over d4(3,x) and d4(4,x)
|
||||
}
|
||||
fwrite(buf,2,npts,fp);
|
||||
fclose(fp);
|
||||
}
|
||||
free(buf);
|
||||
}
|
||||
|
||||
//#define MAX_RANDOM 0x7fffffff
|
||||
|
||||
/* 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;
|
||||
}
|
14
getfile.f90
14
getfile.f90
@ -1,14 +0,0 @@
|
||||
!----------------------------------------------------- getfile
|
||||
subroutine getfile(fname,len)
|
||||
character*(*) fname
|
||||
|
||||
include 'datcom.f90'
|
||||
include 'gcom2.f90'
|
||||
|
||||
fname80=fname
|
||||
nlen=len
|
||||
newdat2=1
|
||||
ierr=0
|
||||
|
||||
return
|
||||
end subroutine getfile
|
12
getfile.h
Normal file
12
getfile.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef GETFILE_H
|
||||
#define GETFILE_H
|
||||
#include <QString>
|
||||
#include <QFile>
|
||||
#include <QDebug>
|
||||
#include "commons.h"
|
||||
|
||||
void getfile(QString fname, bool xpol, int dbDgrd);
|
||||
void savetf2(QString fname, bool xpol);
|
||||
float gran();
|
||||
|
||||
#endif // GETFILE_H
|
71
getfile2.f90
71
getfile2.f90
@ -1,71 +0,0 @@
|
||||
subroutine getfile2(fname,len)
|
||||
|
||||
#ifdef CVF
|
||||
use dflib
|
||||
#endif
|
||||
|
||||
character*(*) fname
|
||||
real*8 sq
|
||||
|
||||
include 'datcom.f90'
|
||||
include 'gcom1.f90'
|
||||
include 'gcom2.f90'
|
||||
include 'gcom4.f90'
|
||||
integer*2 id(4,NSMAX)
|
||||
|
||||
1 if(ndecoding.eq.0) go to 2
|
||||
#ifdef CVF
|
||||
call sleepqq(100)
|
||||
#else
|
||||
call usleep(100*1000)
|
||||
#endif
|
||||
|
||||
go to 1
|
||||
|
||||
2 do i=len,1,-1
|
||||
if(fname(i:i).eq.'/' .or. fname(i:i).eq.'\\') go to 10
|
||||
enddo
|
||||
i=0
|
||||
10 filename=fname(i+1:)
|
||||
ierr=0
|
||||
|
||||
n=8*NSMAX
|
||||
ndecoding=4
|
||||
monitoring=0
|
||||
kbuf=1
|
||||
|
||||
call cs_lock('getfile2a')
|
||||
!###
|
||||
! NB: not really necessary to read whole file at once. Save memory!
|
||||
call rfile3a(fname,id,n,ierr)
|
||||
do i=1,NSMAX
|
||||
dd(1,i,1)=id(1,i)
|
||||
dd(2,i,1)=id(2,i)
|
||||
enddo
|
||||
!###
|
||||
|
||||
call cs_unlock
|
||||
if(ierr.ne.0) then
|
||||
print*,'Error opening or reading file: ',fname,ierr
|
||||
go to 999
|
||||
endif
|
||||
|
||||
sq=0.
|
||||
ka=0.1*NSMAX
|
||||
kb=0.8*NSMAX
|
||||
do k=ka,kb
|
||||
sq=sq + dd(1,k,1)**2 + dd(2,k,1)**2 + dd(3,k,1)**2 + dd(4,k,1)**2
|
||||
enddo
|
||||
sqave=174*sq/(kb-ka+1)
|
||||
rxnoise=10.0*log10(sqave) - 48.0
|
||||
call cs_lock('getfile2b')
|
||||
read(filename(8:11),*,err=20,end=20) nutc
|
||||
call cs_unlock
|
||||
go to 30
|
||||
20 nutc=0
|
||||
|
||||
30 ndiskdat=1
|
||||
mousebutton=0
|
||||
|
||||
999 return
|
||||
end subroutine getfile2
|
45
getpfx1.f
45
getpfx1.f
@ -1,45 +0,0 @@
|
||||
subroutine getpfx1(callsign,k)
|
||||
|
||||
character callsign*12
|
||||
character*8 c
|
||||
character addpfx*8
|
||||
C Can't 'include' *.f90 in *.f
|
||||
common/gcom4/addpfx
|
||||
include 'pfx.f'
|
||||
|
||||
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) k=-1
|
||||
return
|
||||
end
|
||||
|
35
getsnr.f
35
getsnr.f
@ -1,35 +0,0 @@
|
||||
subroutine getsnr(x,nz,snr)
|
||||
|
||||
real x(nz)
|
||||
|
||||
smax=-1.e30
|
||||
do i=1,nz
|
||||
if(x(i).gt.smax) then
|
||||
ipk=i
|
||||
smax=x(i)
|
||||
endif
|
||||
s=s+x(i)
|
||||
enddo
|
||||
|
||||
s=0.
|
||||
ns=0
|
||||
do i=1,nz
|
||||
if(abs(i-ipk).ge.3) then
|
||||
s=s+x(i)
|
||||
ns=ns+1
|
||||
endif
|
||||
enddo
|
||||
ave=s/ns
|
||||
|
||||
sq=0.
|
||||
do i=1,nz
|
||||
if(abs(i-ipk).ge.3) then
|
||||
sq=sq+(x(i)-ave)**2
|
||||
ns=ns+1
|
||||
endif
|
||||
enddo
|
||||
rms=sqrt(sq/(nz-2))
|
||||
snr=(smax-ave)/rms
|
||||
|
||||
return
|
||||
end
|
2
gp.bat
2
gp.bat
@ -1,2 +0,0 @@
|
||||
gcc -c plrr_subs_win.c
|
||||
g95 -o pulsar -fno-second-underscore -fbounds-check -ftrace=full pulsar.f90 plrr_subs_win.o
|
19
i1tor4.f90
19
i1tor4.f90
@ -1,19 +0,0 @@
|
||||
|
||||
!--------------------------------------------------- i1tor4
|
||||
subroutine i1tor4(d,jz,data)
|
||||
|
||||
! Convert wavefile byte data from to real*4.
|
||||
|
||||
integer*1 d(jz)
|
||||
real data(jz)
|
||||
integer*1 i1
|
||||
equivalence(i1,i4)
|
||||
|
||||
do i=1,jz
|
||||
n=d(i)
|
||||
i4=n-128
|
||||
data(i)=i1
|
||||
enddo
|
||||
|
||||
return
|
||||
end subroutine i1tor4
|
16
in.dat
Normal file
16
in.dat
Normal file
@ -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
|
323
install-sh
323
install-sh
@ -1,323 +0,0 @@
|
||||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2005-05-14.22
|
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||
# following copyright and license.
|
||||
#
|
||||
# Copyright (C) 1994 X Consortium
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# 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
|
||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Except as contained in this notice, the name of the X Consortium shall not
|
||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||
# ings in this Software without prior written authorization from the X Consor-
|
||||
# tium.
|
||||
#
|
||||
#
|
||||
# FSF changes to this file are in the public domain.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# `make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch. It can only install one file at a time, a restriction
|
||||
# shared with many OS's install programs.
|
||||
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit="${DOITPROG-}"
|
||||
|
||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||
|
||||
mvprog="${MVPROG-mv}"
|
||||
cpprog="${CPPROG-cp}"
|
||||
chmodprog="${CHMODPROG-chmod}"
|
||||
chownprog="${CHOWNPROG-chown}"
|
||||
chgrpprog="${CHGRPPROG-chgrp}"
|
||||
stripprog="${STRIPPROG-strip}"
|
||||
rmprog="${RMPROG-rm}"
|
||||
mkdirprog="${MKDIRPROG-mkdir}"
|
||||
|
||||
chmodcmd="$chmodprog 0755"
|
||||
chowncmd=
|
||||
chgrpcmd=
|
||||
stripcmd=
|
||||
rmcmd="$rmprog -f"
|
||||
mvcmd="$mvprog"
|
||||
src=
|
||||
dst=
|
||||
dir_arg=
|
||||
dstarg=
|
||||
no_target_directory=
|
||||
|
||||
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||
or: $0 [OPTION]... -d DIRECTORIES...
|
||||
|
||||
In the 1st form, copy SRCFILE to DSTFILE.
|
||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||
In the 4th, create DIRECTORIES.
|
||||
|
||||
Options:
|
||||
-c (ignored)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
-o USER $chownprog installed files to USER.
|
||||
-s $stripprog installed files.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
--help display this help and exit.
|
||||
--version display version info and exit.
|
||||
|
||||
Environment variables override the default commands:
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
|
||||
"
|
||||
|
||||
while test -n "$1"; do
|
||||
case $1 in
|
||||
-c) shift
|
||||
continue;;
|
||||
|
||||
-d) dir_arg=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
--help) echo "$usage"; exit $?;;
|
||||
|
||||
-m) chmodcmd="$chmodprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-s) stripcmd=$stripprog
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-t) dstarg=$2
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-T) no_target_directory=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
--version) echo "$0 $scriptversion"; exit $?;;
|
||||
|
||||
*) # When -d is used, all remaining arguments are directories to create.
|
||||
# When -t is used, the destination is already specified.
|
||||
test -n "$dir_arg$dstarg" && break
|
||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||
for arg
|
||||
do
|
||||
if test -n "$dstarg"; then
|
||||
# $@ is not empty: it contains at least $arg.
|
||||
set fnord "$@" "$dstarg"
|
||||
shift # fnord
|
||||
fi
|
||||
shift # arg
|
||||
dstarg=$arg
|
||||
done
|
||||
break;;
|
||||
esac
|
||||
done
|
||||
|
||||
if test -z "$1"; then
|
||||
if test -z "$dir_arg"; then
|
||||
echo "$0: no input file specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
# It's OK to call `install-sh -d' without argument.
|
||||
# This can happen when creating conditional directories.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for src
|
||||
do
|
||||
# Protect names starting with `-'.
|
||||
case $src in
|
||||
-*) src=./$src ;;
|
||||
esac
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
dst=$src
|
||||
src=
|
||||
|
||||
if test -d "$dst"; then
|
||||
mkdircmd=:
|
||||
chmodcmd=
|
||||
else
|
||||
mkdircmd=$mkdirprog
|
||||
fi
|
||||
else
|
||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
if test ! -f "$src" && test ! -d "$src"; then
|
||||
echo "$0: $src does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$dstarg"; then
|
||||
echo "$0: no destination specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
dst=$dstarg
|
||||
# Protect names starting with `-'.
|
||||
case $dst in
|
||||
-*) dst=./$dst ;;
|
||||
esac
|
||||
|
||||
# If destination is a directory, append the input filename; won't work
|
||||
# if double slashes aren't ignored.
|
||||
if test -d "$dst"; then
|
||||
if test -n "$no_target_directory"; then
|
||||
echo "$0: $dstarg: Is a directory" >&2
|
||||
exit 1
|
||||
fi
|
||||
dst=$dst/`basename "$src"`
|
||||
fi
|
||||
fi
|
||||
|
||||
# This sed command emulates the dirname command.
|
||||
dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
|
||||
|
||||
# Make sure that the destination directory exists.
|
||||
|
||||
# Skip lots of stat calls in the usual case.
|
||||
if test ! -d "$dstdir"; then
|
||||
defaultIFS='
|
||||
'
|
||||
IFS="${IFS-$defaultIFS}"
|
||||
|
||||
oIFS=$IFS
|
||||
# Some sh's can't handle IFS=/ for some reason.
|
||||
IFS='%'
|
||||
set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||
shift
|
||||
IFS=$oIFS
|
||||
|
||||
pathcomp=
|
||||
|
||||
while test $# -ne 0 ; do
|
||||
pathcomp=$pathcomp$1
|
||||
shift
|
||||
if test ! -d "$pathcomp"; then
|
||||
$mkdirprog "$pathcomp"
|
||||
# mkdir can fail with a `File exist' error in case several
|
||||
# install-sh are creating the directory concurrently. This
|
||||
# is OK.
|
||||
test -d "$pathcomp" || exit
|
||||
fi
|
||||
pathcomp=$pathcomp/
|
||||
done
|
||||
fi
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
$doit $mkdircmd "$dst" \
|
||||
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
|
||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
|
||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
|
||||
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
|
||||
|
||||
else
|
||||
dstfile=`basename "$dst"`
|
||||
|
||||
# Make a couple of temp file names in the proper directory.
|
||||
dsttmp=$dstdir/_inst.$$_
|
||||
rmtmp=$dstdir/_rm.$$_
|
||||
|
||||
# Trap to clean up those temp files at exit.
|
||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||
trap '(exit $?); exit' 1 2 13 15
|
||||
|
||||
# Copy the file name to the temp name.
|
||||
$doit $cpprog "$src" "$dsttmp" &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits.
|
||||
#
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||
#
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
|
||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
|
||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
|
||||
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
|
||||
|| {
|
||||
# The rename failed, perhaps because mv can't rename something else
|
||||
# to itself, or perhaps because mv is so ancient that it does not
|
||||
# support -f.
|
||||
|
||||
# Now remove or move aside any old file at destination location.
|
||||
# We try this two ways since rm can't unlink itself on some
|
||||
# systems and the destination file might be busy for other
|
||||
# reasons. In this case, the final cleanup might fail but the new
|
||||
# file should still install successfully.
|
||||
{
|
||||
if test -f "$dstdir/$dstfile"; then
|
||||
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
|
||||
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
|
||||
|| {
|
||||
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
|
||||
(exit 1); exit 1
|
||||
}
|
||||
else
|
||||
:
|
||||
fi
|
||||
} &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
|
||||
}
|
||||
}
|
||||
fi || { (exit 1); exit 1; }
|
||||
done
|
||||
|
||||
# The final little trick to "correctly" pass the exit status to the exit trap.
|
||||
{
|
||||
(exit 0); exit 0
|
||||
}
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-end: "$"
|
||||
# End:
|
263
jtaudio.c
263
jtaudio.c
@ -1,263 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <portaudio.h>
|
||||
#include <string.h>
|
||||
|
||||
void fivehz_();
|
||||
void fivehztx_();
|
||||
void addnoise_(short int *n);
|
||||
|
||||
// Definition of structure pointing to the audio data
|
||||
typedef struct
|
||||
{
|
||||
double *Tsec;
|
||||
double *tbuf;
|
||||
int *iwrite;
|
||||
int *ibuf;
|
||||
int *TxOK;
|
||||
int *ndebug;
|
||||
int *ndsec;
|
||||
int *Transmitting;
|
||||
int *nwave;
|
||||
int *nmode;
|
||||
int *trperiod;
|
||||
int nbuflen;
|
||||
int nfs;
|
||||
short *y1;
|
||||
short *y2;
|
||||
short *iwave;
|
||||
}
|
||||
paTestData;
|
||||
|
||||
typedef struct _SYSTEMTIME
|
||||
{
|
||||
short Year;
|
||||
short Month;
|
||||
short DayOfWeek;
|
||||
short Day;
|
||||
short Hour;
|
||||
short Minute;
|
||||
short Second;
|
||||
short Millisecond;
|
||||
} SYSTEMTIME;
|
||||
|
||||
#ifdef Win32
|
||||
extern void __stdcall GetSystemTime(SYSTEMTIME *st);
|
||||
#else
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
|
||||
void GetSystemTime(SYSTEMTIME *st){
|
||||
struct timeval tmptimeofday;
|
||||
struct tm tmptmtime;
|
||||
gettimeofday(&tmptimeofday,NULL);
|
||||
gmtime_r((const time_t *)&tmptimeofday.tv_sec,&tmptmtime);
|
||||
st->Year = (short)tmptmtime.tm_year;
|
||||
st->Month = (short)tmptmtime.tm_year;
|
||||
st->DayOfWeek = (short)tmptmtime.tm_wday;
|
||||
st->Day = (short)tmptmtime.tm_mday;
|
||||
st->Hour = (short)tmptmtime.tm_hour;
|
||||
st->Minute = (short)tmptmtime.tm_min;
|
||||
st->Second = (short)tmptmtime.tm_sec;
|
||||
st->Millisecond = (short)(tmptimeofday.tv_usec/1000);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Output callback routine:
|
||||
static int SoundOut( void *inputBuffer, void *outputBuffer,
|
||||
unsigned long framesPerBuffer,
|
||||
const PaStreamCallbackTimeInfo* timeInfo,
|
||||
PaStreamCallbackFlags statusFlags,
|
||||
void *userData )
|
||||
{
|
||||
paTestData *data = (paTestData*)userData;
|
||||
short *wptr = (short*)outputBuffer;
|
||||
unsigned int i,n;
|
||||
static short int n2;
|
||||
static int n0;
|
||||
static int ia=0;
|
||||
static int ib=0;
|
||||
static int ic=0;
|
||||
static int TxOKz=0;
|
||||
static double stime0=86400.0;
|
||||
int nsec;
|
||||
double stime;
|
||||
SYSTEMTIME st;
|
||||
|
||||
// Get System time
|
||||
GetSystemTime(&st);
|
||||
nsec = (int) (st.Hour*3600.0 + st.Minute*60.0 + st.Second);
|
||||
stime = nsec + st.Millisecond*0.001 + *data->ndsec*0.1;
|
||||
*data->Tsec = stime;
|
||||
nsec=(int)stime;
|
||||
|
||||
if(*data->TxOK && (!TxOKz)) {
|
||||
n=nsec/(*data->trperiod);
|
||||
// ic = (int)(stime - *data->trperiod*n) * data->nfs/framesPerBuffer;
|
||||
// ic = framesPerBuffer*ic;
|
||||
ic = (int)(stime - *data->trperiod*n) * data->nfs;
|
||||
ic = ic % *data->nwave;
|
||||
}
|
||||
|
||||
TxOKz=*data->TxOK;
|
||||
*data->Transmitting=*data->TxOK;
|
||||
|
||||
if(*data->TxOK) {
|
||||
for(i=0 ; i<framesPerBuffer; i++ ) {
|
||||
n2=data->iwave[ic];
|
||||
addnoise_(&n2);
|
||||
*wptr++ = n2; //left
|
||||
*wptr++ = n2; //right
|
||||
ic++;
|
||||
if(ic>=*data->nwave) {
|
||||
if(*data->nmode==2) {
|
||||
*data->TxOK=0;
|
||||
ic--;
|
||||
}
|
||||
else
|
||||
ic = ic % *data->nwave; //Wrap buffer pointer if necessary
|
||||
}
|
||||
}
|
||||
} else {
|
||||
memset((void*)outputBuffer, 0, 2*sizeof(short)*framesPerBuffer);
|
||||
}
|
||||
fivehz_(); //Call fortran routine
|
||||
fivehztx_(); //Call fortran routine
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int jtaudio_(int *ndevin, int *ndevout, short y1[], short y2[],
|
||||
int *nbuflen, int *iwrite, short iwave[],
|
||||
int *nwave, int *nfsample, int *nsamperbuf,
|
||||
int *TRPeriod, int *TxOK, int *ndebug,
|
||||
int *Transmitting, double *Tsec, int *ngo, int *nmode,
|
||||
double tbuf[], int *ibuf, int *ndsec)
|
||||
{
|
||||
paTestData data;
|
||||
PaStream *outstream;
|
||||
PaStreamParameters outputParameters;
|
||||
|
||||
int nfs,ndin,ndout;
|
||||
PaError err1,err2,err2a,err3,err3a;
|
||||
double dnfs;
|
||||
|
||||
data.Tsec = Tsec;
|
||||
data.tbuf = tbuf;
|
||||
data.iwrite = iwrite;
|
||||
data.ibuf = ibuf;
|
||||
data.TxOK = TxOK;
|
||||
data.ndebug = ndebug;
|
||||
data.ndsec = ndsec;
|
||||
data.Transmitting = Transmitting;
|
||||
data.y1 = y1;
|
||||
data.y2 = y2;
|
||||
data.nbuflen = *nbuflen;
|
||||
data.nmode = nmode;
|
||||
data.nwave = nwave;
|
||||
data.iwave = iwave;
|
||||
data.nfs = *nfsample;
|
||||
data.trperiod = TRPeriod;
|
||||
|
||||
nfs=*nfsample;
|
||||
err1=Pa_Initialize(); // Initialize PortAudio
|
||||
if(err1) {
|
||||
printf("Error initializing PortAudio.\n");
|
||||
printf("%s\n",Pa_GetErrorText(err1));
|
||||
goto error;
|
||||
}
|
||||
|
||||
ndin=*ndevin;
|
||||
ndout=*ndevout;
|
||||
dnfs=(double)nfs;
|
||||
printf("Opening device %d for output.\n",ndout);
|
||||
|
||||
outputParameters.device=*ndevout;
|
||||
outputParameters.channelCount=2;
|
||||
outputParameters.sampleFormat=paInt16;
|
||||
outputParameters.suggestedLatency=1.0;
|
||||
outputParameters.hostApiSpecificStreamInfo=NULL;
|
||||
err2a=Pa_OpenStream(
|
||||
&outstream, //address of stream
|
||||
NULL,
|
||||
&outputParameters,
|
||||
dnfs, //Sample rate
|
||||
2048, //Frames per buffer
|
||||
paNoFlag,
|
||||
(PaStreamCallback *)SoundOut, //Callback routine
|
||||
(void *)&data); //address of data structure
|
||||
if(err2a) {
|
||||
printf("Error opening Audio stream for output.\n");
|
||||
printf("%s\n",Pa_GetErrorText(err2a));
|
||||
goto error;
|
||||
}
|
||||
|
||||
err3a=Pa_StartStream(outstream); //Start output stream
|
||||
if(err3a) {
|
||||
printf("Error starting output Audio stream\n");
|
||||
printf("%s\n",Pa_GetErrorText(err3a));
|
||||
goto error;
|
||||
}
|
||||
|
||||
printf("Audio output stream running normally.\n******************************************************************\n");
|
||||
|
||||
while(Pa_IsStreamActive(outstream)) {
|
||||
if(*ngo==0) goto StopStream;
|
||||
Pa_Sleep(200);
|
||||
}
|
||||
|
||||
StopStream:
|
||||
Pa_AbortStream(outstream); // Abort stream
|
||||
Pa_CloseStream(outstream); // Close stream, we're done.
|
||||
Pa_Terminate();
|
||||
return(0);
|
||||
|
||||
error:
|
||||
printf("%d %f %d %d %d\n",ndout,dnfs,err1,err2a,err3a);
|
||||
Pa_Terminate();
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int padevsub_(int *numdev, int *ndefin, int *ndefout,
|
||||
int nchin[], int nchout[])
|
||||
{
|
||||
int i;
|
||||
int numDevices;
|
||||
const PaDeviceInfo *pdi;
|
||||
PaError err;
|
||||
// PaHostApiInfo *hostapi;
|
||||
|
||||
Pa_Initialize();
|
||||
|
||||
// numDevices = Pa_CountDevices();
|
||||
numDevices = Pa_GetDeviceCount();
|
||||
|
||||
*numdev=numDevices;
|
||||
if( numDevices < 0 ) {
|
||||
err = numDevices;
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
||||
printf("\nAudio Output Device Name\n");
|
||||
printf("Device Channels\n");
|
||||
printf("----------------------------------------------------------\n");
|
||||
|
||||
for( i=0; i<numDevices; i++ ) {
|
||||
pdi = Pa_GetDeviceInfo( i );
|
||||
if(i == Pa_GetDefaultInputDevice()) *ndefin=i;
|
||||
if(i == Pa_GetDefaultOutputDevice()) *ndefout=i;
|
||||
nchin[i]=pdi->maxInputChannels;
|
||||
nchout[i]=pdi->maxOutputChannels;
|
||||
if(nchout[i]>0)
|
||||
printf(" %2d %2d %s\n",i,nchout[i],pdi->name);
|
||||
}
|
||||
|
||||
Pa_Terminate();
|
||||
return 0;
|
||||
|
||||
error:
|
||||
Pa_Terminate();
|
||||
return err;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user